12033: Simplify loader interface.
authorTom Clegg <tom@curoverse.com>
Fri, 18 Aug 2017 19:28:29 +0000 (15:28 -0400)
committerTom Clegg <tom@curoverse.com>
Fri, 18 Aug 2017 19:28:29 +0000 (15:28 -0400)
items() is ready immediately, and returns [] until the first results
arrive.

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

apps/workbench/app/assets/javascripts/components/collections.js
apps/workbench/app/assets/javascripts/models/loader.js

index 097fda22b4fb802acf17214c69ed68886e9ebd17..a2054c1a03673cebcdef0b4f549e4c9ae8a74f31 100644 (file)
@@ -45,7 +45,7 @@ window.CollectionsTable = {
                 m('th', 'last modified'),
             ])),
             m('tbody', [
-                loader.items() && loader.items().map(function(item) {
+                loader.items().map(function(item) {
                     return m('tr', [
                         m('td', m('a.btn.btn-xs.btn-default', {href: item.session.baseURL.replace('://', '://workbench.')+'collections/'+item.uuid}, 'Show')),
                         m('td.arvados-uuid', item.uuid),
@@ -145,7 +145,7 @@ window.CollectionsSearch = {
                             ? m('span.label.label-xs.label-danger', 'none')
                             : vnode.state.loader.children.map(function(child) {
                                 return [m('span.label.label-xs', {
-                                    className: child.items() ? 'label-success' : 'label-warning',
+                                    className: child.state == child.LOADING ? 'label-warning' : 'label-success',
                                 }, child.sessionKey), ' ']
                             }),
                         ' ',
index c1205bc555d795b249c39c8175dd6497f8a25b15..f9b82ce96e07f36e851044fa7dae9cd8b5b6cd68 100644 (file)
@@ -26,7 +26,7 @@ window.MultipageLoader = function(config) {
         LOADING: 'loading',
         READY: 'ready',
 
-        items: m.stream(),
+        items: m.stream([]),
         thresholdItem: null,
         loadMore: function() {
             if (loader.state == loader.DONE || loader.state == loader.LOADING)
@@ -37,7 +37,7 @@ window.MultipageLoader = function(config) {
             ] : []
             loader.state = loader.LOADING
             loader.loadFunc(filters).then(function(resp) {
-                var items = loader.items() || []
+                var items = loader.items()
                 Array.prototype.push.apply(items, resp.items)
                 if (resp.items.length == 0) {
                     loader.state = loader.DONE
@@ -65,7 +65,7 @@ window.MergingLoader = function(config) {
     var loader = this
     Object.assign(loader, config, {
         // Sorted items ready to display, merged from all children.
-        items: m.stream(),
+        items: m.stream([]),
         state: 'ready',
         DONE: 'done',
         LOADING: 'loading',
@@ -100,14 +100,22 @@ window.MergingLoader = function(config) {
             // cutoff is the topmost (recent) of {bottom (oldest) entry of
             // any child that still has more pages left to fetch}
             var cutoff
+            var cutoffUnknown = false
             loader.children.forEach(function(child) {
+                if (child.state == child.DONE)
+                    return
                 var items = child.items()
-                if (items.length == 0 || child.state == child.DONE)
+                if (items.length == 0) {
+                    // No idea what's coming in the next page.
+                    cutoffUnknown = true
                     return
+                }
                 var last = items[items.length-1].modified_at
                 if (!cutoff || cutoff < last)
                     cutoff = last
             })
+            if (cutoffUnknown)
+                return
             var combined = []
             loader.children.forEach(function(child) {
                 child.itemsDisplayed = 0