@@ -87,7 +87,8 @@ var search = (function () {
8787 data : null ,
8888 category : "" ,
8989 filters : { "limit" :null , "arr_entries" :[ ] , "fields" :[ ] , "data" :null } ,
90- view : { "data" : null , "page" : 0 , "page_limit" : null , "fields_filter_index" :{ } , "sort" : { "field" :null , "order" :null , "type" :null } }
90+ view : { "data" : null , "page" : 0 , "page_limit" : null , "fields_filter_index" :{ } , "sort" : { "field" :null , "order" :null , "type" :null } } ,
91+ processed_ext_data : new Set ( )
9192 }
9293
9394 function init_oscar_obj ( ) {
@@ -103,7 +104,8 @@ var search = (function () {
103104 'data' : null ,
104105 'category' : "" ,
105106 'filters' : { "limit" :null , "arr_entries" :[ ] , "fields" :[ ] , "data" :null } ,
106- 'view' : { "data" : null , "page" : 0 , "page_limit" : null , "fields_filter_index" :{ } , "sort" : { "field" :null , "order" :null , "type" :null } }
107+ 'view' : { "data" : null , "page" : 0 , "page_limit" : null , "fields_filter_index" :{ } , "sort" : { "field" :null , "order" :null , "type" :null } } ,
108+ 'processed_ext_data' : new Set ( )
107109 }
108110 }
109111 }
@@ -524,6 +526,10 @@ var search = (function () {
524526 _build_header_sec ( ) ;
525527 _sort_results ( ) ;
526528 htmldom . update_res_table ( table_conf , search_conf_json ) ;
529+
530+ // Load external data for initially visible results
531+ _load_ext_data_for_visible_results ( ) ;
532+
527533 return {
528534 "table_conf" : JSON . parse ( JSON . stringify ( table_conf ) ) ,
529535 "cat_conf" : JSON . parse ( JSON . stringify ( cat_conf ) ) ,
@@ -698,6 +704,73 @@ var search = (function () {
698704 }
699705 }
700706
707+ // Load external data only for visible results
708+ function _load_ext_data_for_visible_results ( ) {
709+ var results = table_conf . view . data [ "results" ] [ "bindings" ] ;
710+ if ( results . length === 0 ) return ;
711+
712+ var i_from = table_conf . view . page * table_conf . view . page_limit ;
713+ var i_to = i_from + table_conf . view . page_limit ;
714+ if ( i_to > results . length ) { i_to = results . length ; }
715+
716+ var category_conf_obj = cat_conf ;
717+ var fields = category_conf_obj . fields ;
718+ var ext_data_fields = [ ] ;
719+
720+ for ( var i = 0 ; i < fields . length ; i ++ ) {
721+ if ( fields [ i ] . value . startsWith ( "ext_data" ) ) {
722+ var all_parts = fields [ i ] . value . split ( "." ) ;
723+ var data_field = "" ;
724+ var sep = "." ;
725+ for ( var j = 2 ; j < all_parts . length ; j ++ ) {
726+ if ( j == all_parts . length - 1 ) {
727+ sep = "" ;
728+ }
729+ data_field = data_field + all_parts [ j ] + sep ;
730+ }
731+ ext_data_fields . push ( {
732+ "full_name" : fields [ i ] . value ,
733+ "func_name" : all_parts [ 1 ] ,
734+ "data_field" : data_field
735+ } ) ;
736+ }
737+ }
738+
739+ for ( var i = i_from ; i < i_to ; i ++ ) {
740+ var result = results [ i ] ;
741+ var result_key = result [ table_conf . data_key ] . value ;
742+
743+ if ( ! table_conf . processed_ext_data . has ( result_key ) ) {
744+ table_conf . processed_ext_data . add ( result_key ) ;
745+
746+ for ( var j = 0 ; j < ext_data_fields . length ; j ++ ) {
747+ var key_full_name = ext_data_fields [ j ] [ "full_name" ] ;
748+ var key_func_name = ext_data_fields [ j ] [ "func_name" ] ;
749+ var func_obj = category_conf_obj [ "ext_data" ] [ key_func_name ] ;
750+
751+ if ( func_obj != undefined ) {
752+ var async_val = true ;
753+ if ( func_obj [ "async" ] != undefined ) {
754+ async_val = func_obj [ "async" ] ;
755+ }
756+
757+ _exec_ext_data (
758+ key_func_name ,
759+ func_obj ,
760+ result [ table_conf . data_key ] . value ,
761+ async_val ,
762+ search . callbk_update_data_entry_val ,
763+ key_full_name ,
764+ func_obj . name ,
765+ result ,
766+ ext_data_fields [ j ] [ "data_field" ]
767+ ) ;
768+ }
769+ }
770+ }
771+ }
772+ }
773+
701774 /*init all the local data*/
702775 function _init_data ( json_data , callbk = null , callbk_query = null , check_and_update = false ) {
703776 table_conf . category = cat_conf . name ;
@@ -776,36 +849,17 @@ var search = (function () {
776849 table_conf . data . head . vars = new_header ;
777850 //console.log(table_conf.data.head.vars);
778851
779- // now the results
852+ // Initialize ext_data fields and make API calls for visible results only
780853 for ( var i = 0 ; i < table_conf . data . results . bindings . length ; i ++ ) {
781-
782854 for ( var j = 0 ; j < ext_data_fields . length ; j ++ ) {
783855 var key_full_name = ext_data_fields [ j ] [ "full_name" ] ;
784856 var key_func_name = ext_data_fields [ j ] [ "func_name" ] ;
785857 var func_obj = category_conf_obj [ "ext_data" ] [ key_func_name ] ;
786858 if ( func_obj != undefined ) {
787- var async_val = true ;
788- if ( func_obj [ "async" ] != undefined ) {
789- async_val = func_obj [ "async" ] ;
790- }
791-
792859 table_conf . data . results . bindings [ i ] [ key_full_name ] = { "value" :"" , "label" :"" } ;
793- var ext_res = _exec_ext_data (
794- key_func_name ,
795- func_obj ,
796- table_conf . data . results . bindings [ i ] [ table_conf . data_key ] . value ,
797- async_val ,
798- search . callbk_update_data_entry_val ,
799- key_full_name ,
800- func_obj . name ,
801- table_conf . data . results . bindings [ i ] ,
802- ext_data_fields [ j ] [ "data_field" ]
803- ) ;
804-
805860 }
806861 }
807862 }
808- //console.log(table_conf.data.results.bindings);
809863
810864 //set all the other table_conf fields
811865 //init all the filtered fields
@@ -1630,6 +1684,9 @@ var search = (function () {
16301684 change_search_data : change_search_data ,
16311685 get_search_data : get_search_data ,
16321686
1687+ //lazy loading function
1688+ _load_ext_data_for_visible_results : _load_ext_data_for_visible_results ,
1689+
16331690 //others
16341691 callbk_update_data_entry_val : callbk_update_data_entry_val
16351692 }
@@ -2998,6 +3055,11 @@ var htmldom = (function () {
29983055 // Initialize touch-friendly controls
29993056 initTouchFriendlyControls ( ) ;
30003057
3058+ // Load external data for visible results only after table is rendered
3059+ if ( typeof search !== 'undefined' && search . _load_ext_data_for_visible_results ) {
3060+ search . _load_ext_data_for_visible_results ( ) ;
3061+ }
3062+
30013063 function __build_page ( ) {
30023064 // create new tables
30033065 var new_tab_res = document . createElement ( "table" ) ;
@@ -3235,4 +3297,4 @@ var htmldom = (function () {
32353297 adv_placeholder : adv_placeholder ,
32363298 initTouchFriendlyControls : initTouchFriendlyControls
32373299 }
3238- } ) ( ) ;
3300+ } ) ( ) ;
0 commit comments