Merge "Skin: Make skins aware of their registered skin name"
[lhc/web/wiklou.git] / includes / htmlform / fields / HTMLMultiSelectField.php
index 05a2ba6..515166c 100644 (file)
@@ -17,6 +17,11 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        public function __construct( $params ) {
                parent::__construct( $params );
 
+               // If the disabled-options parameter is not provided, use an empty array
+               if ( isset( $this->mParams['disabled-options'] ) === false ) {
+                       $this->mParams['disabled-options'] = [];
+               }
+
                // For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
                if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
                        $this->mClass .= ' mw-htmlform-dropdown';
@@ -75,6 +80,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        'id' => "{$this->mID}-$info",
                                        'value' => $info,
                                ];
+                               if ( in_array( $info, $this->mParams['disabled-options'], true ) ) {
+                                       $thisAttribs['disabled'] = 'disabled';
+                               }
                                $checked = in_array( $info, $value, true );
 
                                $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
@@ -112,6 +120,15 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
+       /**
+        * Get options and make them into arrays suitable for OOUI.
+        * @return array Options for inclusion in a select or whatever.
+        */
+       public function getOptionsOOUI() {
+               // Sections make this difficult. See getInputOOUI().
+               throw new MWException( 'HTMLMultiSelectField#getOptionsOOUI() is not supported' );
+       }
+
        /**
         * Get the OOUI version of this field.
         *
@@ -122,34 +139,68 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        public function getInputOOUI( $value ) {
                $this->mParent->getOutput()->addModules( 'oojs-ui-widgets' );
 
-               $attr = $this->getTooltipAndAccessKey();
-               $attr['id'] = $this->mID;
-               $attr['name'] = "{$this->mName}[]";
+               $optionsOouiSections = [];
+               $options = $this->getOptions();
+               // If the options are supposed to be split into sections, each section becomes a separate
+               // CheckboxMultiselectInputWidget.
+               foreach ( $options as $label => $section ) {
+                       if ( is_array( $section ) ) {
+                               $optionsOouiSections[ $label ] = Xml::listDropDownOptionsOoui( $section );
+                               unset( $options[$label] );
+                       }
+               }
+               // If anything remains in the array, they are sectionless options. Put them in a separate widget
+               // at the beginning.
+               if ( $options ) {
+                       $optionsOouiSections = array_merge(
+                               [ '' => Xml::listDropDownOptionsOoui( $options ) ],
+                               $optionsOouiSections
+                       );
+               }
+
+               $out = '';
+               foreach ( $optionsOouiSections as $sectionLabel => $optionsOoui ) {
+                       $attr = [];
+                       $attr['name'] = "{$this->mName}[]";
 
-               $attr['value'] = $value;
-               $attr['options'] = $this->getOptionsOOUI();
+                       $attr['value'] = $value;
+                       $attr['options'] = $optionsOoui;
 
-               if ( $this->mOptionsLabelsNotFromMessage ) {
                        foreach ( $attr['options'] as &$option ) {
-                               $option['label'] = new OOUI\HtmlSnippet( $option['label'] );
+                               $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true );
+                       }
+                       if ( $this->mOptionsLabelsNotFromMessage ) {
+                               foreach ( $attr['options'] as &$option ) {
+                                       $option['label'] = new OOUI\HtmlSnippet( $option['label'] );
+                               }
                        }
-               }
 
-               $attr += OOUI\Element::configFromHtmlAttributes(
-                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
-               );
+                       $attr += OOUI\Element::configFromHtmlAttributes(
+                               $this->getAttributes( [ 'disabled', 'tabindex' ] )
+                       );
 
-               if ( $this->mClass !== '' ) {
-                       $attr['classes'] = [ $this->mClass ];
+                       if ( $this->mClass !== '' ) {
+                               $attr['classes'] = [ $this->mClass ];
+                       }
+
+                       $widget = new OOUI\CheckboxMultiselectInputWidget( $attr );
+                       if ( $sectionLabel ) {
+                               $out .= new OOUI\FieldsetLayout( [
+                                       'items' => [ $widget ],
+                                       'label' => $sectionLabel,
+                               ] );
+                       } else {
+                               $out .= $widget;
+                       }
                }
 
-               return new OOUI\CheckboxMultiselectInputWidget( $attr );
+               return $out;
        }
 
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return string|array
         */
        public function loadDataFromRequest( $request ) {
                if ( $this->isSubmitAttempt( $request ) ) {