Merge "Special:Preferences: Construct fake tabs to avoid FOUC"
[lhc/web/wiklou.git] / includes / htmlform / OOUIHTMLForm.php
index 9dd37b3..49cbdee 100644 (file)
@@ -145,7 +145,7 @@ class OOUIHTMLForm extends HTMLForm {
                        [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
        }
 
-       protected function wrapFieldSetSection( $legend, $section, $attributes ) {
+       protected function wrapFieldSetSection( $legend, $section, $attributes, $isRoot ) {
                // to get a user visible effect, wrap the fieldset into a framed panel layout
                $layout = new OOUI\PanelLayout( [
                        'expanded' => false,
@@ -176,16 +176,22 @@ class OOUIHTMLForm extends HTMLForm {
         * @return string HTML
         */
        protected function formatSection( array $fieldsHtml, $sectionName, $anyFieldHasLabel ) {
-               $config = [
-                       'items' => $fieldsHtml,
-               ];
-               if ( $sectionName ) {
-                       $config['id'] = Sanitizer::escapeId( $sectionName );
+               if ( !$fieldsHtml ) {
+                       // Do not generate any wrappers for empty sections. Sections may be empty if they only have
+                       // subsections, but no fields. A legend will still be added in wrapFieldSetSection().
+                       return '';
                }
-               if ( is_string( $this->mWrapperLegend ) ) {
-                       $config['label'] = $this->mWrapperLegend;
+
+               $html = implode( '', $fieldsHtml );
+
+               if ( $sectionName ) {
+                       $html = Html::rawElement(
+                               'div',
+                               [ 'id' => Sanitizer::escapeIdForAttribute( $sectionName ) ],
+                               $html
+                       );
                }
-               return new OOUI\FieldsetLayout( $config );
+               return $html;
        }
 
        /**
@@ -243,9 +249,8 @@ class OOUIHTMLForm extends HTMLForm {
        }
 
        public function getBody() {
-               $fieldset = parent::getBody();
-               // FIXME This only works for forms with no subsections
-               if ( $fieldset instanceof OOUI\FieldsetLayout ) {
+               $html = parent::getBody();
+               if ( $this->mHeader || $this->oouiErrors || $this->oouiWarnings ) {
                        $classes = [ 'mw-htmlform-ooui-header' ];
                        if ( $this->oouiErrors ) {
                                $classes[] = 'mw-htmlform-ooui-header-errors';
@@ -253,33 +258,42 @@ class OOUIHTMLForm extends HTMLForm {
                        if ( $this->oouiWarnings ) {
                                $classes[] = 'mw-htmlform-ooui-header-warnings';
                        }
-                       if ( $this->mHeader || $this->oouiErrors || $this->oouiWarnings ) {
-                               // if there's no header, don't create an (empty) LabelWidget, simply use a placeholder
-                               if ( $this->mHeader ) {
-                                       $element = new OOUI\LabelWidget( [ 'label' => new OOUI\HtmlSnippet( $this->mHeader ) ] );
-                               } else {
-                                       $element = new OOUI\Widget( [] );
-                               }
-                               $fieldset->addItems( [
-                                       new OOUI\FieldLayout(
-                                               $element,
-                                               [
-                                                       'align' => 'top',
-                                                       'errors' => $this->oouiErrors,
-                                                       'notices' => $this->oouiWarnings,
-                                                       'classes' => $classes,
-                                               ]
-                                       )
-                               ], 0 );
+                       // if there's no header, don't create an (empty) LabelWidget, simply use a placeholder
+                       if ( $this->mHeader ) {
+                               $element = new OOUI\LabelWidget( [ 'label' => new OOUI\HtmlSnippet( $this->mHeader ) ] );
+                       } else {
+                               $element = new OOUI\Widget( [] );
                        }
+                       $html = new OOUI\FieldLayout(
+                               $element,
+                               [
+                                       'align' => 'top',
+                                       'errors' => $this->oouiErrors,
+                                       'notices' => $this->oouiWarnings,
+                                       'classes' => $classes,
+                               ]
+                       ) . $html;
                }
-               return $fieldset;
+               return $html;
        }
 
        public function wrapForm( $html ) {
+               if ( is_string( $this->mWrapperLegend ) ) {
+                       $content = new OOUI\FieldsetLayout( [
+                               'label' => $this->mWrapperLegend,
+                               'items' => [
+                                       new OOUI\Widget( [
+                                               'content' => new OOUI\HtmlSnippet( $html )
+                                       ] ),
+                               ],
+                       ] );
+               } else {
+                       $content = new OOUI\HtmlSnippet( $html );
+               }
+
                $form = new OOUI\FormLayout( $this->getFormAttributes() + [
                        'classes' => [ 'mw-htmlform', 'mw-htmlform-ooui' ],
-                       'content' => new OOUI\HtmlSnippet( $html ),
+                       'content' => $content,
                ] );
 
                // Include a wrapper for style, if requested.