Merge "Refine thumbnailing metrics"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 17 Jul 2015 19:03:52 +0000 (19:03 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 17 Jul 2015 19:03:52 +0000 (19:03 +0000)
12 files changed:
autoload.php
includes/OutputPage.php
includes/htmlform/HTMLSelectNamespace.php
includes/installer/MysqlInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/i18n/en.json
includes/installer/i18n/qqq.json
includes/widget/AUTHORS.txt
includes/widget/NamespaceInputWidget.php [new file with mode: 0644]
resources/Resources.php
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js [new file with mode: 0644]

index 2c9dd8f..fd75c8a 100644 (file)
@@ -754,6 +754,7 @@ $wgAutoloadLocalClasses = array(
        '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',
index 30ee19c..e832b82 100644 (file)
@@ -3959,6 +3959,7 @@ class OutputPage extends ContextSource {
                        'oojs-ui.styles.icons',
                        'oojs-ui.styles.indicators',
                        'oojs-ui.styles.textures',
+                       'mediawiki.widgets.styles',
                ) );
        }
 }
index dfab6cf..d6d564e 100644 (file)
@@ -22,21 +22,14 @@ class HTMLSelectNamespace extends HTMLFormField {
        }
 
        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,
                ) );
        }
 }
index 3af08d6..e5c1a1d 100644 (file)
@@ -93,9 +93,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
        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();
@@ -110,12 +108,6 @@ class MysqlInstaller extends DatabaseInstaller {
                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;
                }
index b18fe94..cb40f88 100644 (file)
@@ -83,10 +83,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
        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();
@@ -98,12 +95,6 @@ class PostgresInstaller extends DatabaseInstaller {
                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() ) {
index c19e3ee..1eb8e03 100644 (file)
@@ -97,8 +97,6 @@
        "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.",
index fba5165..89f2dd9 100644 (file)
        "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.",
index 10064b2..a0d7703 100644 (file)
@@ -3,6 +3,7 @@ Authors (alphabetically)
 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>
diff --git a/includes/widget/NamespaceInputWidget.php b/includes/widget/NamespaceInputWidget.php
new file mode 100644 (file)
index 0000000..69427c5
--- /dev/null
@@ -0,0 +1,128 @@
+<?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 );
+       }
+}
index 3217503..0c37ae8 100644 (file)
@@ -1746,13 +1746,17 @@ return array(
        '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',
@@ -1764,6 +1768,15 @@ return array(
                ),
                '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(
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css
new file mode 100644 (file)
index 0000000..3ce92ef
--- /dev/null
@@ -0,0 +1,26 @@
+/*!
+ * 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;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
new file mode 100644 (file)
index 0000000..0558c32
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * 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 ) );