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