Jhernandez has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/326917 )

Change subject: Wire settings dialog to show on SETTINGS_SHOW action
......................................................................

Wire settings dialog to show on SETTINGS_SHOW action

Now when on a hovercard and clicking the cog, it should show the hovercards
settings menu.

Additional changes:
  * Change the changeListener/settings to create and attach the DOM element
    just once to the DOM

Change-Id: Id685ddcda9532528fc62b383539788f785089ef0
---
M resources/ext.popups/boot.js
M resources/ext.popups/changeListeners/settings.js
M tests/qunit/ext.popups/changeListeners/settings.test.js
3 files changed, 22 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Popups 
refs/changes/17/326917/1

diff --git a/resources/ext.popups/boot.js b/resources/ext.popups/boot.js
index 4ed9463..5c8ae30 100644
--- a/resources/ext.popups/boot.js
+++ b/resources/ext.popups/boot.js
@@ -31,8 +31,9 @@
         * @param {Object} actions
         * @param {mw.eventLog.Schema} schema
         * @param {ext.popups.UserSettings} userSettings
+        * @param {Function} settingsDialog
         */
-       function registerChangeListeners( store, actions, schema, userSettings 
) {
+       function registerChangeListeners( store, actions, schema, userSettings, 
settingsDialog ) {
 
                // Sugar.
                var changeListeners = mw.popups.changeListeners,
@@ -43,6 +44,7 @@
                registerChangeListener( store, changeListeners.render( actions 
) );
                registerChangeListener( store, changeListeners.eventLogging( 
actions, schema ) );
                registerChangeListener( store, changeListeners.previewCount( 
userSettings ) );
+               registerChangeListener( store, changeListeners.settings( 
actions, settingsDialog ) );
        }
 
        /**
@@ -85,10 +87,12 @@
                        generateToken = mw.user.generateRandomSessionId,
                        gateway = createGateway(),
                        userSettings,
+                       settingsDialog,
                        isUserInCondition,
                        schema;
 
                userSettings = mw.popups.createUserSettings( mw.storage, 
mw.user );
+               settingsDialog = mw.popups.createSettingsDialogRenderer();
                isUserInCondition = mw.popups.createExperiment( mw.config, 
mw.user, userSettings );
                schema = mw.popups.createSchema( mw.config, window );
 
@@ -104,7 +108,7 @@
                        ) )
                );
                actions = createBoundActions( store );
-               registerChangeListeners( store, actions, schema, userSettings );
+               registerChangeListeners( store, actions, schema, userSettings, 
settingsDialog );
 
                actions.boot(
                        isUserInCondition,
diff --git a/resources/ext.popups/changeListeners/settings.js 
b/resources/ext.popups/changeListeners/settings.js
index 589743d..3265f2b 100644
--- a/resources/ext.popups/changeListeners/settings.js
+++ b/resources/ext.popups/changeListeners/settings.js
@@ -9,14 +9,21 @@
         */
        mw.popups.changeListeners.settings = function ( boundActions, render ) {
                var settings;
+               var shown = false;
 
                return function ( prevState, state ) {
-                       if ( state.settings.shouldShow && !settings ) {
-                               settings = render( boundActions );
+                       if ( state.settings.shouldShow && !shown) {
+                               // Lazily instantiate the settings UI
+                               if (!settings) {
+                                       settings = render( boundActions );
+                                       settings.appendTo(document.body);
+                               }
+
                                settings.show();
+                               shown = true;
                        } else if ( !state.settings.shouldShow && settings ) {
                                settings.hide();
-                               settings = undefined;
+                               shown = false;
                        }
                };
        };
diff --git a/tests/qunit/ext.popups/changeListeners/settings.test.js 
b/tests/qunit/ext.popups/changeListeners/settings.test.js
index 1c06834..2426aea 100644
--- a/tests/qunit/ext.popups/changeListeners/settings.test.js
+++ b/tests/qunit/ext.popups/changeListeners/settings.test.js
@@ -2,11 +2,14 @@
 
        QUnit.module( 'ext.popups/changeListeners/settings', {
                setup: function () {
-                       this.render = this.sandbox.spy();
+                       this.render = this.sandbox.stub();
                        this.rendered = {
+                               appendTo: this.sandbox.spy(),
                                show: this.sandbox.spy(),
                                hide: this.sandbox.spy()
                        };
+                       this.render.withArgs( 'actions' ).returns( 
this.rendered );
+
                        this.defaultState = { settings: { shouldShow: false } };
                        this.showState = { settings: { shouldShow: true } };
                        this.settings =
@@ -27,30 +30,26 @@
        } );
 
        QUnit.test( 'it should create settings when shouldShow becomes true', 
function ( assert ) {
-               this.render.withArgs( 'actions' ).returns( this.rendered );
-
                this.settings( null, this.defaultState );
                this.settings( this.defaultState, this.showState );
 
                assert.ok( this.render.calledWith('actions'), 'The renderer 
should be called with the actions' );
+               assert.ok( this.rendered.appendTo.called, 'The rendered object 
should be in the DOM' );
                assert.ok( this.rendered.show.called, 'The rendered object 
should be showed' );
        } );
 
        QUnit.test( 'it should not create settings when shouldShow keeps being 
true', function ( assert ) {
-               this.render.withArgs( 'actions' ).returns( this.rendered );
-
                this.settings( null, this.defaultState );
                this.settings( this.defaultState, this.showState );
                this.settings( this.showState, this.showState );
 
                assert.ok( this.render.calledOnce, 'The renderer should be 
called only the first time' );
+               assert.ok( this.rendered.appendTo.calledOnce, 'The rendered 
object should be in the DOM' );
                assert.ok( this.rendered.show.calledOnce, 'The rendered object 
should be showed just once' );
                assert.notOk( this.rendered.hide.called, 'The rendered object 
should not be hidden' );
        } );
 
        QUnit.test( 'it should hide settings when shouldShow becomes false', 
function ( assert ) {
-               this.render.withArgs( 'actions' ).returns( this.rendered );
-
                this.settings( null, this.defaultState );
                this.settings( this.defaultState, this.showState );
                this.settings( this.showState, this.defaultState );

-- 
To view, visit https://gerrit.wikimedia.org/r/326917
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id685ddcda9532528fc62b383539788f785089ef0
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Popups
Gerrit-Branch: mpga
Gerrit-Owner: Jhernandez <jhernan...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to