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

Change subject: Implement infinite-scroll style lazy loading
......................................................................

Implement infinite-scroll style lazy loading

Lazily loads query result elements and arranges them in a masonry
layout. Prevents scrolling to elements which have not yet been loaded.

Bug: T166216
Change-Id: Ie078bea5a456fc6b3fb0384c46703a82ebc402c3
---
M index.html
M package.json
M style.less
M wikibase/queryService/ui/resultBrowser/ImageResultBrowser.js
4 files changed, 88 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/gui 
refs/changes/07/400407/1

diff --git a/index.html b/index.html
index 3d744d0..a225c81 100644
--- a/index.html
+++ b/index.html
@@ -253,6 +253,12 @@
                <div class="row">
                        <div id="query-error" class="panel-heading">Test 
error</div>
                </div>
+               <div class="row">
+                       <div id="loading-spinner">
+                               <i class="fa fa-spinner fa-pulse fa-3x 
fa-fw"></i>
+                               <span class="sr-only">Loading...</span>
+                       </div>
+               </div>
 
                <div class="explorer-panel panel panel-default">
                    <div class="panel-heading clearfix">
@@ -362,6 +368,7 @@
        <script src="vendor/bootstrap-tags/js/bootstrap-tags.min.js"></script>
        <script src="vendor/sparqljs/dist/sparqljs-browser-min.js"></script>
        <script 
src="vendor/bootstrapx-clickover/bootstrapx-clickover.js"></script>
+       <script 
src="node_modules/masonry-layout/dist/masonry.pkgd.min.js"></script>
        <!-- endbuild -->
 
        <!-- build:js js/wdqs.min.js -->
@@ -407,12 +414,6 @@
        <script src="wikibase/queryService/api/Tracking.js"></script>
        <script src="wikibase/queryService/RdfNamespaces.js"></script>
        <script src="wikibase/init.js"></script>
-       <!-- endbuild -->
-       <!-- build:js masonry.js -->
-       <script 
src="node_modules/masonry-layout/dist/masonry.pkgd.min.js"></script>
-       <!-- endbuild -->
-       <!-- build:js lazy sizes -->
-       <script src="node_modules/lazysizes/lazysizes.min.js" async=""></script>
        <!-- endbuild -->
 </body>
 </html>
diff --git a/package.json b/package.json
index 8644198..ab75898 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,6 @@
     "jquery.uls": "git+https://github.com/wikimedia/jquery.uls.git";,
     "js-cookie": "^2.2.0",
     "jstree": "^3.3.4",
-    "lazysizes": "^4.0.1",
     "leaflet": "^1.2.0",
     "leaflet-fullscreen": "^1.0.2",
     "leaflet-zoombox": "^0.5.0",
diff --git a/style.less b/style.less
index 6317d0a..ce694b3 100644
--- a/style.less
+++ b/style.less
@@ -412,9 +412,13 @@
        padding: 0;
        font-size: 0.85em;
 }
-.item > a > img {
-       width: 100%;
-       display: inline-block;
+#loading-spinner {
+       display: none;
+       color: #777;
+}
+#loading-spinner>.fa-spinner {
+       margin: 0 auto 20px;
+       display: block;
 }
 .item {
        display: inline-block;
@@ -426,7 +430,12 @@
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        box-shadow: 2px 2px 4px 0 #ccc;
+       visibility: hidden;
 }
+.item>a>img {
+       width: 100%;
+}
+
 @media only screen and ( min-width: 400px ) {
        .item {
                width: ~"calc( 50% - 10px )";
@@ -455,7 +464,6 @@
                width: 1260px;
        }
 }
-
 /*
        ActionBar
 */
diff --git a/wikibase/queryService/ui/resultBrowser/ImageResultBrowser.js 
b/wikibase/queryService/ui/resultBrowser/ImageResultBrowser.js
index a02101c..670815d 100644
--- a/wikibase/queryService/ui/resultBrowser/ImageResultBrowser.js
+++ b/wikibase/queryService/ui/resultBrowser/ImageResultBrowser.js
@@ -5,7 +5,6 @@
 
 wikibase.queryService.ui.resultBrowser.ImageResultBrowser = ( function( $ ) {
        'use strict';
-
        /**
         * A result browser for images
         *
@@ -30,35 +29,80 @@
         * Draw browser to the given element
         *
         * @param {jQuery} $element to draw at
-        */
+        */     
        SELF.prototype.draw = function( $element ) {
                var self = this;
-               this._grid = $( '<div class="masonry">' );
+               SELF.prototype._grid = $( '<div class="masonry">' );
+               $element.html( this._grid );
+               SELF.prototype._grid.masonry( {
+                       itemSelector: '.item',
+                       columnWidth: '.item',
+                       gutter: 10,
+                       horizontalOrder: true
+               } );
+               
+               var urls=[];
+               var rows=[];
                this._iterateResult( function( field, key, row ) {
                        if ( field && self._isCommonsResource( field.value ) ) {
-                               var url = field.value,
-                                       fileName = 
self._getFormatter().getCommonsResourceFileName( url );
-
-                               var mainImg = self._getThumbnail(
-                                               url, 1000 );
-                               self._grid.append( self._getItem( 
self._getThumbnail( url ), mainImg, fileName, row ) );
+                               urls.push( field.value );
+                               rows.push( row );
                        }
                } );
-
-               $element.html( this._grid );
-               
-               $('.masonry').masonry({
-                       itemSelector: '.item',
-                       columnWidth: '.item',
-                       gutter: 10,
-                       horizontalOrder: true,
-                       
-               });
-               
-               $(document).on('lazyloaded', function(){
-                       $('.masonry').masonry();
-               });
-               
+               SELF.prototype.lazyLoad( urls, rows );
+       };
+       
+       /**
+        * @private
+        */
+       SELF.prototype.lazyLoad = function( urls, rows ) {
+                       var count = 1,
+                               $spinner = $( '#loading-spinner' ),
+                               lazyLoadCheck,
+                               loadMore = function() {
+                                       clearInterval( lazyLoadCheck );
+                                       if( count < urls.length ) {
+                                               var posFromTop = $( '.item' 
).last().offset().top - $( window ).scrollTop();
+                                               if( posFromTop < 
window.innerHeight + 200 ) {
+                                                       $spinner.show();
+                                                       appendItem();
+                                               }
+                                               else {
+                                                       $spinner.hide();
+                                                       setLazyLoad();
+                                               }
+                                       }
+                                       else { $spinner.hide(); }
+                                       },
+                               appendItem = function() {
+                                       var currentItem = 
SELF.prototype.createItem( urls[count], rows[count] );
+                                       count++;
+                                       $( currentItem ).find('img').one( 
'load', function(){
+                                               currentItem.css( 'visibility', 
'visible' );
+                                               SELF.prototype._grid.masonry( 
'appended', currentItem );
+                                               loadMore();
+                                       } );
+                                       SELF.prototype._grid.append( 
currentItem ) ;
+                               },
+                               // simpler than throttling a scroll event
+                               setLazyLoad = function() { lazyLoadCheck = 
setInterval( loadMore, 100 ); },
+                       // need to do 1st item sightly differentlty so masonry 
can learn how wide to make columns
+                               firstItem = SELF.prototype.createItem( urls[0], 
rows[0] );
+                       $(firstItem).find('img').one( 'load', function(){
+                               SELF.prototype._grid.masonry();
+                               loadMore();
+                       } );
+                       firstItem.css( 'visibility', 'visible' );
+                       SELF.prototype._grid.append(firstItem).masonry( 
'appended', firstItem );
+               };
+       
+       /**
+        * @private
+        */
+       SELF.prototype.createItem = function ( url, row ){
+               var fileName = this._getFormatter().getCommonsResourceFileName( 
url ),
+               mainImg = this._getThumbnail( url, 1000 );
+               return( this._getItem( this._getThumbnail( url ), mainImg, 
fileName, row ) );
        };
 
        /**
@@ -68,7 +112,7 @@
                var $image = $( '<a>' )
                                .click( 
this._getFormatter().handleCommonResourceItem )
                                .attr( { href: url, 'data-gallery': 'g', 
'data-title': title } )
-                               .append( $( '<img>' ).attr( 'data-src', 
thumbnailUrl ).addClass("lazyload") ),
+                               .append( $( '<img>' ).attr( { 'src': 
thumbnailUrl } ) ),
                        $summary = this._getFormatter().formatRow( row );
 
                return $( '<div class="item">' ).append( $image, $summary );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie078bea5a456fc6b3fb0384c46703a82ebc402c3
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: StudentSydney <[email protected]>

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

Reply via email to