Henning Snater has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/173005

Change subject: Deferred sitelinkviews switching to edit mode
......................................................................

Deferred sitelinkviews switching to edit mode

When starting sitlinklistview's edit mode, instead of switching all 
sitelinkviews to edit mode,
only those sitelinkviews visible in the viewport are switched to edit mode 
initially.

Change-Id: I9e46520f06b738002100639fe7dfdfcab07e1c80
---
M lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgrouplistview.js
M lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgroupview.js
M lib/resources/jquery.wikibase/jquery.wikibase.sitelinklistview.js
M lib/resources/jquery.wikibase/jquery.wikibase.sitelinkview.js
M lib/resources/jquery.wikibase/resources.php
5 files changed, 109 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/05/173005/1

diff --git 
a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgrouplistview.js 
b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgrouplistview.js
index 1f6eeec..0e9ffd5 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgrouplistview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgrouplistview.js
@@ -38,6 +38,11 @@
        $listview: null,
 
        /**
+        * @type {jQuery.util.EventSingletonManager}
+        */
+       _eventSingletonManager: null,
+
+       /**
         * @see jQuery.ui.TemplatedWidget._create
         */
        _create: function() {
@@ -46,6 +51,8 @@
                }
 
                PARENT.prototype._create.call( this );
+
+               this._eventSingletonManager = new 
$.util.EventSingletonManager();
 
                this._createListview();
 
@@ -86,6 +93,7 @@
                                                value: value,
                                                siteLinksChanger: 
self.options.siteLinksChanger,
                                                entityStore: 
self.options.entityStore,
+                                               eventSingletonManager: 
this._eventSingletonManager,
                                                helpMessage: mw.msg( 
'wikibase-sitelinkgroupview-input-help-message' )
                                        };
                                }
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgroupview.js 
b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgroupview.js
index d8f4616..b2e936f 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgroupview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkgroupview.js
@@ -20,6 +20,10 @@
  *
  * @option {wikibase.store.EntityStore} entityStore
  *
+ * @option {jQuery.util.EventSingletonManager} [eventSingletonManager]
+ *         Should be set when the widget instance is part of a 
jQuery.wikibase.sitelinkgrouplistview.
+ *         Default: null (will be constructed automatically)
+ *
  * @option {string} [helpMessage]
  *                  Default: 'Add a site link by specifying a site and a page 
of that site, edit or
  *                  remove existing site links.'
@@ -44,6 +48,7 @@
                value: null,
                entityStore: null,
                siteLinksChanger: null,
+               eventSingletonManager: null,
                helpMessage: 'Add a site link by specifying a site and a page 
of that site, edit or remove '
                        + 'existing site links.'
        },
@@ -52,6 +57,11 @@
         * @type {jQuery}
         */
        $sitelinklistview: null,
+
+       /**
+        * @type {jQuery.util.EventSingletonManager}
+        */
+       _eventSingletonManager: null,
 
        /**
         * @see jQuery.ui.TemplatedWidget._create
@@ -73,6 +83,9 @@
                if( !this.$sitelinklistview.length ) {
                        this.$sitelinklistview = $( '<table/>' ).appendTo( 
this.element );
                }
+
+               this._eventSingletonManager
+                       = this.options.eventSingletonManager || new 
$.util.EventSingletonManager();
 
                this.draw();
        },
@@ -148,6 +161,7 @@
                                : [],
                        entityStore: this.options.entityStore,
                        siteLinksChanger: this.options.siteLinksChanger,
+                       eventSingleton: this._eventSingleton,
                        $counter: this.$counter
                } );
        },
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinklistview.js 
b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinklistview.js
index 3274630..b09525e 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinklistview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinklistview.js
@@ -22,6 +22,10 @@
  *
  * @option {wikibase.store.EntityStore} entityStore
  *
+ * @option {jQuery.util.EventSingletonManager} [eventSingletonManager]
+ *         Should be set when the widget instance is part of a 
sitelinkgroupview.
+ *         Default: null (will be constructed automatically)
+ *
  * @option {jQuery} [$counter]
  *         Node(s) that shall contain information about the number of site 
links.
  *
@@ -52,9 +56,15 @@
                allowedSiteIds: [],
                siteLinksChanger: null,
                entityStore: null,
+               eventSingletonManager: null,
                $counter: null,
                autoInput: true
        },
+
+       /**
+        * @type {jQuery.util.EventSingletonManager}
+        */
+       _eventSingletonManager: null,
 
        /**
         * @see jQuery.ui.TemplatedWidget._create
@@ -71,6 +81,9 @@
                        this.element.tablesorter( { sortList: [{ 1: 'asc' }] } 
);
                }
 
+               this._eventSingletonManager = this.options.eventSingletonManager
+                       || new $.util.EventSingletonManager();
+
                this.draw();
        },
 
@@ -83,6 +96,9 @@
                this.$listview.off( '.' + this.widgetName );
                this.element.removeData( 'tablesorter' );
                this.element.removeClass( 'wikibase-sitelinklistview' );
+
+               this._eventSingletonManager.unregister( this, window, '.' + 
this.widgetName );
+
                PARENT.prototype.destroy.call( this );
        },
 
@@ -442,15 +458,49 @@
 
                this._refreshTablesorter();
 
-               var listview = self.$listview.data( 'listview' ),
-                       lia = listview.listItemAdapter();
+               this._eventSingletonManager.register(
+                       this,
+                       window,
+                       namespaceEventNames( 'scroll touchmove resize', 
this.widgetName ),
+                       function( event, self ) {
+                               self._startEditingInViewport();
+                       },
+                       {
+                               throttle: 150
+                       }
+               );
 
-               listview.items().each( function() {
-                       var sitelinkview = lia.liInstance( $( this ) );
-                       sitelinkview.startEditing();
-               } );
+               self._startEditingInViewport();
 
                return PARENT.prototype.startEditing.call( this );
+       },
+
+       _startEditingInViewport: function() {
+               /**
+                * @param {jQuery} $node
+                * @return {boolean}
+                */
+               function touchesViewport( $node ) {
+                       var rect = $node.get( 0 ).getBoundingClientRect(),
+                               $window = $( window ),
+                               wHeight = $window.height(),
+                               wWidth = $window.width(),
+                               touchesViewportHorizontally = rect.right >= 0 
&& rect.right < wWidth
+                                       || rect.left >= 0 && rect.left < wWidth,
+                               touchesViewportVertically = rect.top >= 0 && 
rect.top < wHeight
+                                       || rect.bottom >= 0 && rect.bottom < 
wHeight;
+                       return touchesViewportHorizontally && 
touchesViewportVertically;
+               }
+
+               var listview = this.$listview.data( 'listview' ),
+                       lia = listview.listItemAdapter();
+
+               listview.items().each( function( i ) {
+                       var sitelinkview = lia.liInstance( $( this ) );
+                       if( i === 0 || touchesViewport( sitelinkview.element ) 
) {
+                               sitelinkview.startEditing();
+                       }
+               } );
        },
 
        /**
@@ -468,6 +518,12 @@
                return PARENT.prototype.stopEditing.call( this, dropValue )
                        .done( function() {
                                self.$listview.data( 'listview' ).value( 
self.value() );
+
+                               self._eventSingletonManager.unregister(
+                                       self,
+                                       window,
+                                       namespaceEventNames( 'scroll touchmove 
resize', self.widgetName )
+                               );
                        } );
        },
 
@@ -891,4 +947,13 @@
 
 } );
 
+/**
+ * @param {string} eventNames
+ * @param {string} namespace
+ * @return {string}
+ */
+function namespaceEventNames( eventNames, namespace ) {
+       return eventNames.split( ' ' ).join( '.' + namespace + ' ' ) + '.' + 
namespace;
+}
+
 }( mediaWiki, wikibase, jQuery ) );
diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkview.js 
b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkview.js
index c8e2a43..a79e6c1 100644
--- a/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkview.js
+++ b/lib/resources/jquery.wikibase/jquery.wikibase.sitelinkview.js
@@ -21,6 +21,10 @@
  *
  * @option {wikibase.store.EntityStore} entityStore
  *
+ * @option {jQuery.util.EventSingletonManager} eventSingletonManager
+ *         Should be set when the widget instance is part of a 
sitelinklistview.
+ *         Default: null (will be constructed automatically)
+ *
  * @option {string} [helpMessage]
  *         Default: mw.msg( 'wikibase-sitelinks-input-help-message' )
  *
@@ -78,6 +82,7 @@
                value: null,
                getAllowedSites: function() { return []; },
                entityStore: null,
+               eventSingletonManager: null,
                helpMessage: mw.msg( 'wikibase-sitelinks-input-help-message' )
        },
 
@@ -108,6 +113,9 @@
                }
 
                this._createBadgeSelector();
+
+               this._eventSingletonManager = this.options.eventSingletonManager
+                       || new $.util.EventSingletonManager();
        },
 
        /**
@@ -321,6 +329,10 @@
                        this._badgeselector.startEditing();
                }
 
+               if( this.option( 'disabled' ) ) {
+                       this._setState( 'disable' );
+               }
+
                this._trigger( 'afterstartediting' );
        },
 
diff --git a/lib/resources/jquery.wikibase/resources.php 
b/lib/resources/jquery.wikibase/resources.php
index b75eca7..3d9c344 100644
--- a/lib/resources/jquery.wikibase/resources.php
+++ b/lib/resources/jquery.wikibase/resources.php
@@ -316,6 +316,7 @@
                        ),
                        'dependencies' => array(
                                'jquery.ui.TemplatedWidget',
+                               'jquery.util.EventSingletonManager',
                                'jquery.wikibase.listview',
                                'jquery.wikibase.sitelinkgroupview',
                        ),
@@ -334,6 +335,7 @@
                        'dependencies' => array(
                                'jquery.sticknode',
                                'jquery.ui.TemplatedWidget',
+                               'jquery.util.EventSingletonManager',
                                'jquery.wikibase.sitelinklistview',
                                'mediawiki.jqueryMsg', // for {{plural}} and 
{{gender}} support in messages
                                'wikibase.sites',
@@ -352,6 +354,7 @@
                                'jquery.sticknode',
                                'jquery.tablesorter',
                                'jquery.ui.EditableTemplatedWidget',
+                               'jquery.util.EventSingletonManager',
                                'jquery.wikibase.addtoolbar',
                                'jquery.wikibase.edittoolbar',
                                'jquery.wikibase.listview',
@@ -387,6 +390,7 @@
                        ),
                        'dependencies' => array(
                                'jquery.ui.TemplatedWidget',
+                               'jquery.util.EventSingletonManager',
                                'jquery.wikibase.badgeselector',
                                'jquery.wikibase.pagesuggester',
                                'jquery.wikibase.siteselector',

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9e46520f06b738002100639fe7dfdfcab07e1c80
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Henning Snater <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to