Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* jshint
esversion: 5
*/
/**
* CollapseGlobalNavButton.js - For UCX only
* @author Thundercraft5 <https://dev.fandom.com/wiki/User:Thundercraft5>
* @license CC-BY-SA 3.0
*/
(function() {
if (mw.config.get('skin') !== 'fandomdesktop') return console.warn('[CollapseGlobalNavButton] [WARN]: Script was loaded on a skin other than UCX, exiting...');
if ($('.global-navigation__collapse').length) return console.warn('[CollapseGlobalNavButton] [WARN]: Script was double loaded, exiting...');
var $notifs = $('.global-navigation__bottom');
var $nav = $notifs.parent();
var $main = $('.main-container');
var $localNav = $('.fandom-sticky-header');
var collapsed = localStorage.getItem('CGNB-Collapsed') === 'collapsed';
function resizeEditors() {
var aceEditors = document.querySelectorAll('.ace_editor');
if (mw.config.get('wgCodeEditorCurrentLanguage') || aceEditors.length) {
aceEditors.forEach(function(e) {
ace.edit(e).resize();
});
} else if (window.WikiEditorCodeMirror) {
window.WikiEditorCodeMirror.refresh();
}
}
function createInterval(callback, ms) {
var interval;
var $promise = new $.Deferred();
return {
then: $promise.then,
start: function() {
interval = setInterval(callback, ms);
return $promise;
},
end: function() {
clearInterval(interval);
$promise.resolve();
return $promise;
},
};
}
mw.hook('dev.i18n').add(function (i18nJS) { i18nJS.loadMessages('CollapseGlobalNavButton').done(function (i18n) {
$('.global-navigation__bottom').addClass('button-added').prepend($('<div>', {
class: "global-navigation__collapse",
title: i18n.msg('hide').plain(),
data: {
collapsed: false,
},
click: function() {
var $this = $(this);
if ($this.data('collapsed')) {
// Remove collapsed classes
$(document.body).removeClass('global-navigation-collapsed');
// Refresh editors if there are any with animation
var interval = createInterval(function() {
resizeEditors();
}, 0);
// Stage 1 of animation
$notifs.addClass('collapsing')
.removeClass('notifs-in')
.one('animationend', function(e) {
e.stopPropagation(); // To prevent duplicate events with global nav
$notifs.removeClass('collapsing')
.removeClass('open');
$nav.addClass('uncollapsing');
$([ $main[0], $localNav[0] ]).addClass('collapsing');
$this.attr('title', i18n.msg('hide').plain());
// Cache state
localStorage.setItem('CGNB-Collapsed', 'uncollapsed');
// Start refreshing editors
interval.start();
});
// Stage 2 of animation
$nav.one('animationend', function() {
$nav.removeClass('nav-out uncollapsing');
$([ $main[0], $localNav[0] ]).removeClass('collapsing uncollapsed');
// End Refreshing of editors
interval.end();
mw.hook('dev.cgnb.changeend').fire(false);
});
$this.data('collapsed', false);
mw.hook('dev.cgnb.change').fire(false); // Fire event
} else {
// Add collapsing classes
$nav.addClass('collapsing');
$(document.body).addClass('global-navigation-collapsed');
$([ $main[0], $localNav[0] ]).addClass('uncollapsing');
// Refresh editors if there are any with animation
var interval = createInterval(function() {
resizeEditors();
}, 0);
// Start refreshing editors
interval.start();
// On stage 1 of animation
$nav.one('animationend', function() {
$nav.removeClass('collapsing')
.addClass('nav-out');
$([ $main[0], $localNav[0] ]).removeClass('uncollapsing').addClass('uncollapsed');
$notifs.addClass('uncollapsing open');
$this.attr('title', i18n.msg('show').plain());
localStorage.setItem('CGNB-Collapsed', 'collapsed'); // Cache state
// End Refreshing of editors
interval.end();
mw.hook('dev.cgnb.changeend').fire(true);
});
// On Stage 2 of animation
$notifs.one('animationend', function() {
$notifs.removeClass('uncollapsing')
.addClass('notifs-in');
});
$this.data('collapsed', true);
mw.hook('dev.cgnb.change').fire(true); // Fire event
}
},
html: '<svg class="wds-icon wds-icon-tiny" style="transform: rotate(90deg);"><use xlink:href="#wds-icons-menu-control-tiny"></use></svg>'
}));
if (collapsed) $('.global-navigation__collapse').click();
mw.hook('dev.cgnb.loaded').fire();
})});
// Import CSS/I18n
importArticles({
type: 'style',
articles: [
'u:dev:MediaWiki:CollapseGlobalNavButton.css',
'u:dev:MediaWiki:I18n-js/code.js',
],
});
}());