'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
+ 'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
'oojs-ui.styles.icons',
'oojs-ui.styles.indicators',
'oojs-ui.styles.textures',
+ 'mediawiki.widgets.styles',
) );
}
}
}
public function getInputOOUI( $value ) {
- $namespaceOptions = Html::namespaceSelectorOptions( array( 'all' => $this->mAllValue ) );
-
- $options = array();
- foreach( $namespaceOptions as $id => $name ) {
- $options[] = array(
- 'data' => (string)$id,
- 'label' => $name,
- );
- };
-
- return new OOUI\DropdownInputWidget( array(
- 'options' => $options,
- 'value' => $value,
- 'name' => $this->mName,
+ return new MediaWiki\Widget\NamespaceInputWidget( array(
+ 'valueNamespace' => $value,
+ 'nameNamespace' => $this->mName,
'id' => $this->mID,
+ 'includeAllValue' => $this->mAllValue,
+ // Disable additional checkboxes
+ 'nameInvert' => null,
+ 'nameAssociated' => null,
) );
}
}
public function submitConnectForm() {
// Get variables from the request.
- $newValues = $this->setVarsFromRequest( array(
- 'wgDBserver', 'wgDBname', 'wgDBprefix', '_InstallUser', '_InstallPassword'
- ) );
+ $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBprefix' ) );
// Validate them.
$status = Status::newGood();
if ( !preg_match( '/^[a-z0-9_-]*$/i', $newValues['wgDBprefix'] ) ) {
$status->fatal( 'config-invalid-db-prefix', $newValues['wgDBprefix'] );
}
- if ( !strlen( $newValues['_InstallUser'] ) ) {
- $status->fatal( 'config-db-username-empty' );
- }
- if ( !strlen( $newValues['_InstallPassword'] ) ) {
- $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
- }
if ( !$status->isOK() ) {
return $status;
}
function submitConnectForm() {
// Get variables from the request
- $newValues = $this->setVarsFromRequest( array(
- 'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema',
- '_InstallUser', '_InstallPassword'
- ) );
+ $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema' ) );
// Validate them
$status = Status::newGood();
if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
$status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
}
- if ( !strlen( $newValues['_InstallUser'] ) ) {
- $status->fatal( 'config-db-username-empty' );
- }
- if ( !strlen( $newValues['_InstallPassword'] ) ) {
- $status->fatal( 'config-db-password-empty', $newValues['_InstallUser'] );
- }
// Submit user box
if ( $status->isOK() ) {
"config-db-install-account": "User account for installation",
"config-db-username": "Database username:",
"config-db-password": "Database password:",
- "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
- "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\".",
"config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
"config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
"config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
"config-db-name-oracle": "Field label in the MediaWiki installer where an Oracle database schema can be specified.",
"config-db-account-oracle-warn": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
"config-db-install-account": "Legend in the MediaWiki installer for the section where database username and password have to be provided.",
- "config-db-username": "Used as label.\n\nAlso used in {{msg-mw|Config-db-username-empty}}.",
+ "config-db-username": "Used as label.",
"config-db-password": "Field label in the MediaWiki installer where database password has to be provided.",
- "config-db-password-empty": "Used as error message. Parameters:\n* $1 - database username",
- "config-db-username-empty": "Used as error message. Shown when the database username is not entered by the user.\n\nRefers to {{msg-mw|Config-db-username}}.",
"config-db-install-username": "Help box text in the MediaWiki installer clarifying the requirement for database username.",
"config-db-install-password": "Help box text in the MediaWiki installer clarifying the requirement for database password.",
"config-db-install-help": "Help text in MediaWiki installer.",
Alex Monk <krenair@wikimedia.org>
Bartosz Dziewoński <bdziewonski@wikimedia.org>
Ed Sanders <esanders@wikimedia.org>
+Florian Schmidt <florian.schmidt.welzow@t-online.de>
James D. Forrester <jforrester@wikimedia.org>
Roan Kattouw <roan@wikimedia.org>
Sucheta Ghoshal <sghoshal@wikimedia.org>
--- /dev/null
+<?php
+/**
+ * MediaWiki Widgets – NamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
+ * checkboxes to include associated namespace or to invert selection.
+ */
+class NamespaceInputWidget extends \OOUI\Widget {
+
+ protected $namespace = null;
+ protected $associated = null;
+ protected $invert = null;
+ protected $allValue = null;
+
+ /**
+ * @param array $config Configuration options
+ * @param string $config['nameNamespace'] HTML input name for the namespace dropdown box (default:
+ * 'namespace')
+ * @param string $config['nameInvert'] HTML input name for the "invert selection" checkbox. If
+ * null, the checkbox will not be generated. (default: 'invert')
+ * @param string $config['nameAssociated'] HTML input name for the "include associated namespace"
+ * checkbox. If null, the checkbox will not be generated. (default: 'associated')
+ * @param string $config['includeAllValue'] If specified, add a "all namespaces" option to the
+ * namespace dropdown, and use this as the input value for it
+ * @param int|string $config['valueNamespace'] Input value of the namespace dropdown box. May be a
+ * string only if 'includeAllValue' is set.
+ * @param boolean $config['valueInvert'] Input value of the "invert selection" checkbox (default:
+ * false)
+ * @param boolean $config['valueAssociated'] Input value of the "include associated namespace"
+ * checkbox (default: false)
+ * @param string $config['labelInvert'] Text of label to use for "invert selection" checkbox
+ * @param string $config['labelAssociated'] Text of label to use for "include associated
+ * namespace" checkbox
+ */
+ public function __construct( array $config = array() ) {
+ // Configuration initialization
+
+ $config = array_merge(
+ array(
+ 'nameNamespace' => 'namespace',
+ 'nameInvert' => 'invert',
+ 'nameAssociated' => 'associated',
+ // Choose first available: either main namespace or the "all namespaces" option
+ 'valueNamespace' => null,
+ 'valueInvert' => false,
+ 'valueAssociated' => false,
+ ),
+ $config
+ );
+
+ // Parent constructor
+ parent::__construct( $config );
+
+ // Properties
+ $this->allValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
+ $this->namespace = new \OOUI\DropdownInputWidget( array(
+ 'name' => $config['nameNamespace'],
+ 'value' => $config['valueNamespace'],
+ 'options' => $this->getNamespaceDropdownOptions( $config ),
+ ) );
+ if ( $config['nameAssociated'] !== null ) {
+ // FIXME Should use a LabelWidget? But they don't work like HTML <label>s yet
+ $this->associated = new \OOUI\FieldLayout(
+ new \OOUI\CheckboxInputWidget( array(
+ 'name' => $config['nameAssociated'],
+ 'selected' => $config['valueAssociated'],
+ 'value' => '1',
+ ) ),
+ array(
+ 'align' => 'inline',
+ 'label' => $config['labelAssociated'],
+ )
+ );
+ }
+ if ( $config['nameInvert'] !== null ) {
+ $this->invert = new \OOUI\FieldLayout(
+ new \OOUI\CheckboxInputWidget( array(
+ 'name' => $config['nameInvert'],
+ 'selected' => $config['valueInvert'],
+ 'value' => '1',
+ ) ),
+ array(
+ 'align' => 'inline',
+ 'label' => $config['labelInvert'],
+ )
+ );
+ }
+
+ // Initialization
+ $this
+ ->addClasses( array( 'mw-widget-namespaceInputWidget' ) )
+ ->appendContent( $this->namespace, $this->associated, $this->invert );
+ }
+
+ protected function getNamespaceDropdownOptions( array $config ) {
+ $namespaceOptionsParams = isset( $config['includeAllValue'] ) ?
+ array( 'all' => $config['includeAllValue'] ) : array();
+ $namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
+
+ $options = array();
+ foreach( $namespaceOptions as $id => $name ) {
+ $options[] = array(
+ 'data' => (string)$id,
+ 'label' => $name,
+ );
+ }
+
+ return $options;
+ }
+
+ protected function getJavaScriptClassName() {
+ return 'mw.widgets.NamespaceInputWidget';
+ }
+
+ public function getConfig( &$config ) {
+ $config['namespace'] = $this->namespace;
+ $config['associated'] = $this->associated;
+ $config['invert'] = $this->invert;
+ $config['allValue'] = $this->allValue;
+ return parent::getConfig( $config );
+ }
+}
'mediawiki.widgets' => array(
'scripts' => array(
'resources/src/mediawiki.widgets/mw.widgets.js',
+ 'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
),
'skinStyles' => array(
- 'default' => 'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+ 'default' => array(
+ 'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+ ),
),
'dependencies' => array(
+ 'mediawiki.widgets.styles',
'jquery.autoEllipsis',
'mediawiki.Title',
'mediawiki.api',
),
'targets' => array( 'desktop', 'mobile' ),
),
+ 'mediawiki.widgets.styles' => array(
+ 'skinStyles' => array(
+ 'default' => array(
+ 'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css',
+ ),
+ ),
+ 'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
/* es5-shim */
'es5-shim' => array(
--- /dev/null
+/*!
+ * MediaWiki Widgets - base NamespaceInputWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget,
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
+ display: inline-block;
+ margin-right: 1em;
+}
+
+/* FIXME FieldLayout is not supposed to be used the way we use it here */
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
+ vertical-align: middle;
+ margin-bottom: 0;
+}
+
+.mw-widget-namespaceInputWidget .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+ padding-left: 0.5em;
+}
+
+.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget {
+ width: 20em;
+}
--- /dev/null
+/*!
+ * MediaWiki Widgets - NamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+ /**
+ * Creates a mw.widgets.NamespaceInputWidget object.
+ *
+ * This is not a complete implementation and is not intended for public usage. It only exists
+ * because of HTMLForm shenanigans.
+ *
+ * @class
+ * @private
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.DropdownInputWidget} namespace Widget to include
+ * @cfg {OO.ui.CheckboxInputWidget|null} invert Widget to include
+ * @cfg {OO.ui.CheckboxInputWidget|null} associated Widget to include
+ * @cfg {string|null} allValue Value for "all namespaces" option, if any
+ */
+ mw.widgets.NamespaceInputWidget = function MwWidgetsNamespaceInputWidget( config ) {
+ // Parent constructor
+ OO.ui.Widget.call( this, config );
+
+ // Properties
+ this.namespace = config.namespace;
+ this.invert = config.invert;
+ this.associated = config.associated;
+ this.allValue = config.allValue;
+
+ // Events
+ config.namespace.connect( this, { change: 'updateCheckboxesState' } );
+
+ // Initialization
+ this.$element
+ .addClass( 'mw-widget-namespaceInputWidget' )
+ .append(
+ config.namespace.$element,
+ config.invert ? config.invert.$element : '',
+ config.associated ? config.associated.$element : ''
+ );
+ this.updateCheckboxesState();
+ };
+
+ /* Inheritance */
+
+ OO.inheritClass( mw.widgets.NamespaceInputWidget, OO.ui.Widget );
+
+ /* Methods */
+
+ /**
+ * Update the disabled state of checkboxes when the value of namespace dropdown changes.
+ */
+ mw.widgets.NamespaceInputWidget.prototype.updateCheckboxesState = function () {
+ if ( this.invert ) {
+ this.invert.getField().setDisabled( this.namespace.getValue() === this.allValue );
+ }
+ if ( this.associated ) {
+ this.associated.getField().setDisabled( this.namespace.getValue() === this.allValue );
+ }
+ };
+
+}( jQuery, mediaWiki ) );