From 7a28c62e99a9b935cf8c3c94d367b1b5d8d56223 Mon Sep 17 00:00:00 2001 From: eranroz Date: Wed, 20 Sep 2017 00:29:33 +0300 Subject: [PATCH] Lazy creation for heavy menu Assumptions: * Generally if we have a model we don't need UI * UI can be created lazy if it is not shown to user Bug: T176250 Change-Id: Iba7f889d8610de2eb3056248cd1c664b0cd90940 --- .../mediawiki.rcfilters/mw.rcfilters.init.js | 7 ++++- .../ui/mw.rcfilters.ui.MenuSelectWidget.js | 26 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js index 83e5796353..7f1372cc1e 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js @@ -90,7 +90,12 @@ } }; - $( rcfilters.init ); + // Early execute of init + if ( document.readyState === 'interactive' || document.readyState === 'complete' ) { + rcfilters.init(); + } else { + $( rcfilters.init ); + } module.exports = rcfilters; diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js index 07d4506bcb..5ba42e7fdf 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js @@ -32,6 +32,7 @@ this.views = {}; this.userSelecting = false; + this.menuInitialized = false; this.inputValue = ''; this.$overlay = config.$overlay || this.$element; this.$body = $( '
' ).addClass( 'mw-rcfilters-ui-menuSelectWidget-body' ); @@ -129,13 +130,26 @@ }; /** - * Respond to model initialize event. Populate the menu from the model + * @inheritdoc */ - mw.rcfilters.ui.MenuSelectWidget.prototype.onModelInitialize = function () { + mw.rcfilters.ui.MenuSelectWidget.prototype.toggle = function ( show ) { + this.lazyMenuCreation(); + mw.rcfilters.ui.MenuSelectWidget.parent.prototype.toggle.call( this, show ); + }; + + /** + * lazy creation of the menu + */ + mw.rcfilters.ui.MenuSelectWidget.prototype.lazyMenuCreation = function () { var widget = this, viewGroupCount = {}, groups = this.model.getFilterGroups(); + if ( this.menuInitialized ) { + return; + } + + this.menuInitialized = true; // Reset this.clearItems(); @@ -190,6 +204,13 @@ this.switchView( this.model.getCurrentView() ); }; + /** + * Respond to model initialize event. Populate the menu from the model + */ + mw.rcfilters.ui.MenuSelectWidget.prototype.onModelInitialize = function () { + this.menuInitialized = false; + }; + /** * Switch view * @@ -285,6 +306,7 @@ * @return {mw.rcfilters.ui.ItemMenuOptionWidget} Option widget */ mw.rcfilters.ui.MenuSelectWidget.prototype.getItemFromModel = function ( model ) { + this.lazyMenuCreation(); return this.views[ model.getGroupModel().getView() ].filter( function ( item ) { return item.getName() === model.getName(); } )[ 0 ]; -- 2.20.1