www/include/scripts/lazy-items.js

Code
Comments
Other
Rev Date Author Line
7768 07 Feb 20 nicklas 1 /* $Id $
7768 07 Feb 20 nicklas 2   ------------------------------------------------------------------
7768 07 Feb 20 nicklas 3   Copyright (C) 2020 Nicklas Nordborg
7768 07 Feb 20 nicklas 4
7768 07 Feb 20 nicklas 5   This file is part of BASE - BioArray Software Environment.
7768 07 Feb 20 nicklas 6   Available at http://base.thep.lu.se/
7768 07 Feb 20 nicklas 7
7768 07 Feb 20 nicklas 8   BASE is free software; you can redistribute it and/or
7768 07 Feb 20 nicklas 9   modify it under the terms of the GNU General Public License
7768 07 Feb 20 nicklas 10   as published by the Free Software Foundation; either version 3
7768 07 Feb 20 nicklas 11   of the License, or (at your option) any later version.
7768 07 Feb 20 nicklas 12
7768 07 Feb 20 nicklas 13   BASE is distributed in the hope that it will be useful,
7768 07 Feb 20 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
7768 07 Feb 20 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7768 07 Feb 20 nicklas 16   GNU General Public License for more details.
7768 07 Feb 20 nicklas 17
7768 07 Feb 20 nicklas 18   You should have received a copy of the GNU General Public License
7768 07 Feb 20 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7768 07 Feb 20 nicklas 20   ------------------------------------------------------------------
7768 07 Feb 20 nicklas 21
7840 31 Aug 20 nicklas 22   JavaScript functions for lazy-loading of information from parent/child
7840 31 Aug 20 nicklas 23   items in tables.
7768 07 Feb 20 nicklas 24
7768 07 Feb 20 nicklas 25   @author Nicklas
7768 07 Feb 20 nicklas 26   @version 3.16
7768 07 Feb 20 nicklas 27 */
7768 07 Feb 20 nicklas 28 'use strict';
7768 07 Feb 20 nicklas 29
7768 07 Feb 20 nicklas 30 var Lazy = function()
7768 07 Feb 20 nicklas 31 {
7768 07 Feb 20 nicklas 32   var lazy = {};
7768 07 Feb 20 nicklas 33   var ITEMS_IN_FIRST_BATCH = 3; // To make the page appear more responsive
7768 07 Feb 20 nicklas 34   var MAX_ITEMS_IN_BATCH = 10;
7768 07 Feb 20 nicklas 35   
7768 07 Feb 20 nicklas 36   var lazyElements;
7768 07 Feb 20 nicklas 37   var lazyNo = 0;
7768 07 Feb 20 nicklas 38   var itemType;
7768 07 Feb 20 nicklas 39   var subContext;
7768 07 Feb 20 nicklas 40   
7840 31 Aug 20 nicklas 41   lazy.initLazyItems = function()
7768 07 Feb 20 nicklas 42   {
8083 20 Oct 22 nicklas 43     lazyElements = document.querySelectorAll('.lazy-item');
7768 07 Feb 20 nicklas 44     if (lazyElements.length > 0)
7768 07 Feb 20 nicklas 45     {
7768 07 Feb 20 nicklas 46       var list = document.getElementsByClassName('itemlist')[0];
7768 07 Feb 20 nicklas 47       itemType = Data.get(list, 'item-type');
7768 07 Feb 20 nicklas 48       subContext = Data.get(list, 'subcontext');
7768 07 Feb 20 nicklas 49       lazy.loadNextBatch(ITEMS_IN_FIRST_BATCH);
7768 07 Feb 20 nicklas 50     }
7768 07 Feb 20 nicklas 51   }
7768 07 Feb 20 nicklas 52   
7768 07 Feb 20 nicklas 53   lazy.loadNextBatch = function(itemsInBatch)
7768 07 Feb 20 nicklas 54   {
7768 07 Feb 20 nicklas 55     var lazyItems = [];
7778 28 Feb 20 nicklas 56     while (lazyNo < lazyElements.length)
7768 07 Feb 20 nicklas 57     {
7768 07 Feb 20 nicklas 58       var e = lazyElements[lazyNo];
7778 28 Feb 20 nicklas 59       var colIndex = Data.int(e, 'index');
7778 28 Feb 20 nicklas 60       if (colIndex == 0)
7768 07 Feb 20 nicklas 61       {
7778 28 Feb 20 nicklas 62         // Collect 'item-id' from the first column until we have 'itemsInBatch' items
7778 28 Feb 20 nicklas 63         if (lazyItems.length == itemsInBatch) break;
7768 07 Feb 20 nicklas 64         lazyItems[lazyItems.length] = Data.get(e, 'item-id');
7768 07 Feb 20 nicklas 65       }
7778 28 Feb 20 nicklas 66       Doc.removeClass(e, 'not-loaded');
7778 28 Feb 20 nicklas 67       Doc.addClass(e, 'loading');
7778 28 Feb 20 nicklas 68       lazyNo++;
7768 07 Feb 20 nicklas 69     }
7768 07 Feb 20 nicklas 70     
7768 07 Feb 20 nicklas 71     // Submit request to load the items
7768 07 Feb 20 nicklas 72     if (lazyItems.length > 0)
7768 07 Feb 20 nicklas 73     {
7768 07 Feb 20 nicklas 74       var request = Ajax.getXmlHttpRequest();
7768 07 Feb 20 nicklas 75       var url = App.getRoot() + 'common/columns/ajax.jsp?ID='+App.getSessionId();
7840 31 Aug 20 nicklas 76       url += '&cmd=GetLazyItemColumns';
7768 07 Feb 20 nicklas 77       url += '&itemType='+encodeURIComponent(itemType);
7768 07 Feb 20 nicklas 78       if (subContext) url += '&subcontext='+encodeURIComponent(subContext);
7768 07 Feb 20 nicklas 79       url += '&items='+lazyItems.join(',');
8083 20 Oct 22 nicklas 80       url += '&remaining='+(lazyElements.length-lazyNo);
7768 07 Feb 20 nicklas 81       request.open("GET", url, true);
7768 07 Feb 20 nicklas 82       request.send(null);
7768 07 Feb 20 nicklas 83       Ajax.setReadyStateHandler(request, lazy.lazyInfoLoaded, lazy.lazyInfoLoaded);
7768 07 Feb 20 nicklas 84     }
7768 07 Feb 20 nicklas 85   }
7768 07 Feb 20 nicklas 86   
7768 07 Feb 20 nicklas 87   lazy.lazyInfoLoaded = function(request)
7768 07 Feb 20 nicklas 88   {
7768 07 Feb 20 nicklas 89     var response;
7768 07 Feb 20 nicklas 90     try
7768 07 Feb 20 nicklas 91     {
7768 07 Feb 20 nicklas 92       response = JSON.parse(request.responseText);
7768 07 Feb 20 nicklas 93       if (response.status != 'ok')
7768 07 Feb 20 nicklas 94       {
7768 07 Feb 20 nicklas 95         App.debug(request.responseText);
7768 07 Feb 20 nicklas 96         return;
7768 07 Feb 20 nicklas 97       }
7768 07 Feb 20 nicklas 98     }
7768 07 Feb 20 nicklas 99     catch (e)
7768 07 Feb 20 nicklas 100     {
7768 07 Feb 20 nicklas 101       App.debug(e);
7768 07 Feb 20 nicklas 102       App.debug(request.responseText);
7768 07 Feb 20 nicklas 103       return;
7768 07 Feb 20 nicklas 104     }
7768 07 Feb 20 nicklas 105     
7768 07 Feb 20 nicklas 106     // Simply inject the returned HTML in the expected place
7768 07 Feb 20 nicklas 107     for (var i = 0; i < response.items.length; i++)
7768 07 Feb 20 nicklas 108     {
7768 07 Feb 20 nicklas 109       var item = response.items[i];
7768 07 Feb 20 nicklas 110       var itemId = item.id;
7768 07 Feb 20 nicklas 111       for (var col = 0; col < item.data.length; col++)
7768 07 Feb 20 nicklas 112       {
8083 20 Oct 22 nicklas 113         var e = Doc.element('lazy-item-'+col+'-'+itemId).parentNode;
7768 07 Feb 20 nicklas 114         if (e)
7768 07 Feb 20 nicklas 115         {
7768 07 Feb 20 nicklas 116           e.innerHTML = item.data[col];
7769 07 Feb 20 nicklas 117           Doc.autoInitElements(e);
7768 07 Feb 20 nicklas 118         }
7768 07 Feb 20 nicklas 119       }
7768 07 Feb 20 nicklas 120     }
7768 07 Feb 20 nicklas 121     
7768 07 Feb 20 nicklas 122     lazy.loadNextBatch(MAX_ITEMS_IN_BATCH);
7768 07 Feb 20 nicklas 123   }
7768 07 Feb 20 nicklas 124
7768 07 Feb 20 nicklas 125   return lazy;
7768 07 Feb 20 nicklas 126 }();
7768 07 Feb 20 nicklas 127
7982 14 Jun 21 nicklas 128 Doc.addFinalizer(Lazy.initLazyItems);
7768 07 Feb 20 nicklas 129