TheDJ has uploaded a new change for review.
https://gerrit.wikimedia.org/r/250287
Change subject: Rework the Preferences to prevent FOUC
......................................................................
Rework the Preferences to prevent FOUC
New styles modules that is always added. Reworked the HTML to generate
the preftoc (hidden when user has no JS).
Also requires changes to the skinstyles of Vector preferences, which
is an a separate patch.
Bug: T115692
Change-Id: I24d9b16ed6729fdf0d59adcc2f0ba16f4f621b44
---
M includes/Preferences.php
M includes/specials/SpecialPreferences.php
M resources/Resources.php
M resources/src/mediawiki.special/mediawiki.special.preferences.css
M resources/src/mediawiki.special/mediawiki.special.preferences.js
5 files changed, 70 insertions(+), 39 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/87/250287/1
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 0f8dcc3..85026aa 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -1655,4 +1655,18 @@
Hooks::run( 'PreferencesGetLegend', array( $this, $key,
&$legend ) );
return $legend;
}
+
+ /**
+ * Get the "<legend>" for a given section key. Normally this is the
+ * @return array of section keys
+ */
+ function getPreferenceSections() {
+ $sectionMap = array();
+ foreach ( $this->mFieldTree as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $sectionMap[] = $key;
+ }
+ }
+ return $sectionMap;
+ }
}
diff --git a/includes/specials/SpecialPreferences.php
b/includes/specials/SpecialPreferences.php
index 4b75e5f..f70d9db 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -47,6 +47,7 @@
}
$out->addModules( 'mediawiki.special.preferences' );
+ $out->addModuleStyles( 'mediawiki.special.preferences.styles' );
if ( $this->getRequest()->getCheck( 'success' ) ) {
$out->wrapWikiMsg(
@@ -66,7 +67,37 @@
$htmlForm = Preferences::getFormObject( $this->getUser(),
$this->getContext() );
$htmlForm->setSubmitCallback( array( 'Preferences',
'tryUISubmit' ) );
+ $sectionTitles = $htmlForm->getPreferenceSections();
+ $prefTabs = '';
+ foreach( $sectionTitles as $key ) {
+ $prefTabs .= Html::rawElement( 'li',
+ array(
+ 'role' => 'presentation',
+ 'class' => ( $key === 'personal' ) ?
'selected' : null
+ ),
+ Html::rawElement( 'a',
+ array(
+ 'id' => 'preftab-' . $key,
+ 'role' => 'tab',
+ 'href' => '#mw-prefsection-' .
$key,
+ 'aria-controls' =>
'mw-prefsection-' . $key,
+ 'aria-selected' => ( $key ===
'personal' ) ? 'true' : 'false',
+ 'tabIndex' => ( $key ===
'personal' ) ? 0 : -1,
+ ),
+ $htmlForm->getLegend( $key )
+ )
+ );
+ }
+
+ $out->addHTML(
+ Html::rawElement( 'ul',
+ array(
+ 'id' => 'preftoc',
+ 'role' => 'tablist'
+ ),
+ $prefTabs )
+ );
$htmlForm->show();
}
diff --git a/resources/Resources.php b/resources/Resources.php
index b1b1541..e3f9d71 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -1727,6 +1727,10 @@
'mediawiki.notification',
),
),
+ 'mediawiki.special.preferences.styles' => array(
+ 'styles' =>
'resources/src/mediawiki.special/mediawiki.special.preferences.css',
+ 'position' => 'top',
+ ),
'mediawiki.special.recentchanges' => array(
'scripts' =>
'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
'dependencies' => 'mediawiki.special',
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.css
b/resources/src/mediawiki.special/mediawiki.special.preferences.css
index 9e5efd3..a79f9fc 100644
--- a/resources/src/mediawiki.special/mediawiki.special.preferences.css
+++ b/resources/src/mediawiki.special/mediawiki.special.preferences.css
@@ -25,6 +25,18 @@
display: none;
}
+.client-nojs #preftoc {
+ display: none;
+}
+
+.client-js #preferences > fieldset {
+ display: none;
+}
+
+.client-js #preferences #mw-prefsection-personal {
+ display: block;
+}
+
.prefsection td.mw-label {
width: 20%;
}
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.js
b/resources/src/mediawiki.special/mediawiki.special.preferences.js
index 0fda3dc..15c6723 100644
--- a/resources/src/mediawiki.special/mediawiki.special.preferences.js
+++ b/resources/src/mediawiki.special/mediawiki.special.preferences.js
@@ -3,7 +3,7 @@
*/
( function ( mw, $ ) {
$( function () {
- var $preftoc, $preferences, $fieldsets, $legends,
+ var $preftoc, $preferences, $fieldsets,
hash, labelFunc,
$tzSelect, $tzTextbox, $localtimeHolder, servertime,
$checkBoxes, allowCloseWindow,
@@ -14,25 +14,21 @@
};
$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
- $preftoc = $( '<ul>' )
- .attr( {
- id: 'preftoc',
- role: 'tablist'
- } );
+ $preftoc = $( '#preftoc' );
$preferences = $( '#preferences' )
- .addClass( 'jsprefs' )
- .before( $preftoc );
+ .addClass( 'jsprefs' ); // TODO do we still need this
class ?
+
$fieldsets = $preferences.children( 'fieldset' )
- .hide()
.attr( {
role: 'tabpanel',
- 'aria-hidden': 'true',
'aria-labelledby': labelFunc
} )
- .addClass( 'prefsection' );
- $legends = $fieldsets
+ .addClass( 'prefsection' ); // TODO do we still need
this class ?
+ $fieldsets
.children( 'legend' )
- .addClass( 'mainLegend' );
+ .addClass( 'mainLegend' ); // TODO do we still need
this class ?
+
+ $fieldsets.not( '#mw-prefsection-personal' ).hide().attr(
'aria-hidden', 'true' );
// Make sure the accessibility tip is selectable so that screen
reader users take notice,
// but hide it per default to reduce interface clutter. Also
make sure it becomes visible
@@ -105,32 +101,6 @@
}
}
}
-
- // Populate the prefToc
- $legends.each( function ( i, legend ) {
- var $legend = $( legend ),
- ident, $li, $a;
- if ( i === 0 ) {
- $legend.parent().show();
- }
- ident = $legend.parent().attr( 'id' );
-
- $li = $( '<li>' )
- .attr( 'role', 'presentation' )
- .addClass( i === 0 ? 'selected' : '' );
- $a = $( '<a>' )
- .attr( {
- id: ident.replace( 'mw-prefsection',
'preftab' ),
- href: '#' + ident,
- role: 'tab',
- tabIndex: i === 0 ? 0 : -1,
- 'aria-selected': i === 0 ? 'true' :
'false',
- 'aria-controls': ident
- } )
- .text( $legend.text() );
- $li.append( $a );
- $preftoc.append( $li );
- } );
// Disable the button to save preferences unless preferences
have changed
$( '#prefcontrol' ).prop( 'disabled', true );
--
To view, visit https://gerrit.wikimedia.org/r/250287
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I24d9b16ed6729fdf0d59adcc2f0ba16f4f621b44
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: TheDJ <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits