@@ -561,6 +561,7 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
561561 // Updates data structures such as casesCache, which caches case rows to limit calls to the server, and selProjects, which stores information
562562 // across tables about which items are added to the cart, and which chevrons are selected
563563 window . updateCaseTable = function ( rowsAdded , caseID , table_search ) {
564+ let updatePromise = $ . Deferred ( ) ;
564565 viewedProjects = Object . keys ( window . openProjects ) ;
565566 if ( $ ( '#cases_tab_wrapper' ) . find ( '.dataTables_controls' ) . length > 0 ) {
566567 pageRows = parseInt ( $ ( '#cases_tab_wrapper' ) . find ( '.dataTables_length select' ) . val ( ) ) ;
@@ -704,17 +705,20 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
704705 "data" : dataset ,
705706 "recordsTotal" : data [ "cnt" ] ,
706707 "recordsFiltered" : data [ "cnt" ]
707- } )
708+ } ) ;
709+ updatePromise . resolve ( ) ;
708710 } catch ( err ) {
709711 console . log ( 'error processing data' ) ;
710712 alert ( "There was an error processing the server data. Please alert the systems administrator" )
711713 }
714+ updatePromise . reject ( ) ;
712715 } ,
713716 error : function ( ) {
714717 console . log ( "problem getting data" ) ;
715718 alert ( "There was an error fetching server data. Please alert the systems administrator" )
716719 $ ( '#cases_tab' ) . children ( 'thead' ) . children ( 'tr' ) . children ( '.ckbx' ) . addClass ( 'notVis' ) ;
717720 callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } )
721+ updatePromise . reject ( ) ;
718722 }
719723 } ) ;
720724 } else {
@@ -727,13 +731,15 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
727731 "data" : dataset ,
728732 "recordsTotal" : window . casesCache . recordsTotal ,
729733 "recordsFiltered" : window . casesCache . recordsTotal
730- } )
734+ } ) ;
735+ updatePromise . resolve ( ) ;
731736 }
732737 }
733738 }
734739 } ) ;
735740 } catch ( err ) {
736741 alert ( "The following error occurred trying to update the case table:" + err + ". Please alert the systems administrator" ) ;
742+ updatePromise . reject ( ) ;
737743 }
738744
739745 $ ( '#cases_tab' ) . on ( 'draw.dt' , function ( ) {
@@ -745,10 +751,11 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
745751 $ ( '#cases_tab' ) . find ( 'tbody' ) . attr ( 'id' , 'cases_table' ) ;
746752 $ ( '#cases_panel' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_length' ) . after ( '<div class="dataTables_goto_page"><label>Page </label><input class="goto-page-number" type="number"><button onclick="changePage(\'cases_tab_wrapper\')">Go</button></div>' ) ;
747753 $ ( '#cases_panel' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_paginate' ) . after ( '<div class="dataTables_filter"><strong>Find by Case ID:</strong><input class="caseID_inp" type="text-box" value="' + caseID + '"><button onclick="filterTable(\'cases_panel\',\'caseID\')">Go</button></div>' ) ;
754+ return updatePromise ;
748755 }
749756
750-
751757 window . updateStudyTable = function ( rowsAdded , studyID , table_search ) {
758+ let updatePromise = $ . Deferred ( ) ;
752759 let nonViewAbleModality = new Set ( [ "" ] ) ;
753760 var viewCases = [ ] ;
754761 for ( projid in window . openCases ) {
@@ -1002,10 +1009,10 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
10021009 var cols = [ '' , '' , 'PatientID' , 'StudyInstanceUID' , 'StudyDate' , 'StudyDescription' , 'SeriesInstanceUID' ] ;
10031010 var ssCallNeeded = true ;
10041011
1005-
10061012 if ( viewCases . length === 0 ) {
10071013 ssCallNeeded = false ;
10081014 callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } ) ;
1015+ updatePromise . resolve ( ) ;
10091016 } else {
10101017 var ret = checkClientCache ( request , 'studies' ) ;
10111018 ssCallNeeded = ret [ 0 ] ;
@@ -1055,16 +1062,19 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
10551062 "data" : dataset ,
10561063 "recordsTotal" : data [ "cnt" ] ,
10571064 "recordsFiltered" : data [ "cnt" ]
1058- } )
1065+ } ) ;
1066+ updatePromise . resolve ( ) ;
10591067 } catch ( err ) {
10601068 console . log ( 'error processing data' ) ;
1061- alert ( "There was an error processing the server data. Please alert the systems administrator" )
1069+ alert ( "There was an error processing the server data. Please alert the systems administrator" ) ;
1070+ updatePromise . reject ( ) ;
10621071 }
10631072 } ,
10641073 error : function ( ) {
10651074 console . log ( "problem getting data" ) ;
10661075 alert ( "There was an error fetching server data. Please alert the systems administrator" ) ;
1067- callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } )
1076+ callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } ) ;
1077+ updatePromise . reject ( ) ;
10681078 }
10691079 } ) ;
10701080 } else {
@@ -1077,13 +1087,15 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
10771087 "data" : dataset ,
10781088 "recordsTotal" : window . studiesCache . recordsTotal ,
10791089 "recordsFiltered" : window . studiesCache . recordsTotal
1080- } )
1090+ } ) ;
1091+ updatePromise . resolve ( ) ;
10811092 }
10821093 }
10831094 }
10841095 } ) ;
10851096 } catch ( err ) {
1086- alert ( "The following error error was reported when processing server data: " + err + ". Please alert the systems administrator" )
1097+ alert ( "The following error error was reported when processing server data: " + err + ". Please alert the systems administrator" ) ;
1098+ updatePromise . reject ( ) ;
10871099 }
10881100
10891101 $ ( '#studies_tab' ) . on ( 'draw.dt' , function ( ) {
@@ -1096,9 +1108,11 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
10961108 $ ( '#studies_tab' ) . children ( 'tbody' ) . attr ( 'id' , 'studies_table' ) ;
10971109 $ ( '#studies_tab_wrapper' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_length' ) . after ( '<div class="dataTables_goto_page"><label>Page </label><input class="goto-page-number" type="number"><button onclick="changePage(\'studies_tab_wrapper\')">Go</button></div>' ) ;
10981110 $ ( '#studies_tab_wrapper' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_paginate' ) . after ( '<div class="dataTables_filter"><strong>Find by Study Instance UID:</strong><input class="studyID_inp" type="text-box" value="' + studyID + '"><button onclick="filterTable(\'studies_tab_wrapper\',\'studyID\')">Go</button></div>' ) ;
1111+ return updatePromise ;
10991112 }
11001113
11011114 window . updateSeriesTable = function ( rowsAdded , seriesID , table_search ) {
1115+ let updatePromise = $ . Deferred ( ) ;
11021116 var nonViewAbleModality = new Set ( [ "PR" , "SEG" , "RTSTRUCT" , "RTPLAN" , "RWV" , "SR" , "ANN" ] )
11031117 var slimViewAbleModality = new Set ( [ "SM" ] )
11041118 viewStudies = [ ]
@@ -1343,6 +1357,7 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
13431357 ssCallNeeded = false ;
13441358 $ ( '#series_tab' ) . children ( 'thead' ) . children ( 'tr' ) . children ( '.ckbx' ) . addClass ( 'notVis' ) ;
13451359 callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } ) ;
1360+ updatePromise . resolve ( ) ;
13461361 } else {
13471362 var ret = checkClientCache ( request , 'series' ) ;
13481363 ssCallNeeded = ret [ 0 ]
@@ -1394,18 +1409,21 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
13941409 "data" : dataset ,
13951410 "recordsTotal" : data [ "cnt" ] ,
13961411 "recordsFiltered" : data [ "cnt" ]
1397- } )
1412+ } ) ;
1413+ updatePromise . resolve ( ) ;
13981414 }
13991415 catch ( err ) {
1400- console . log ( 'error processing data' ) ;
1401- alert ( "There was an error processing the server data. Please alert the systems administrator" )
1416+ console . log ( 'error processing data' ) ;
1417+ alert ( "There was an error processing the server data. Please alert the systems administrator" ) ;
1418+ updatePromise . reject ( ) ;
14021419 }
14031420 } ,
14041421 error : function ( ) {
14051422 console . log ( "problem getting data" ) ;
14061423 alert ( "There was an error fetching server data. Please alert the systems administrator" )
14071424 $ ( '#series_tab' ) . children ( 'thead' ) . children ( 'tr' ) . children ( '.ckbx' ) . addClass ( 'notVis' ) ;
1408- callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } )
1425+ callback ( { "data" : [ ] , "recordsTotal" : "0" , "recordsFiltered" : "0" } ) ;
1426+ updatePromise . reject ( ) ;
14091427 }
14101428 } ) ;
14111429 } else {
@@ -1418,14 +1436,16 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
14181436 "data" : dataset ,
14191437 "recordsTotal" : window . seriesCache . recordsTotal ,
14201438 "recordsFiltered" : window . seriesCache . recordsTotal
1421- } )
1439+ } ) ;
1440+ updatePromise . resolve ( ) ;
14221441 }
14231442 }
14241443 }
14251444 } ) ;
14261445 }
14271446 catch ( err ) {
14281447 alert ( "The following nerror was reported when processing server data: " + err + ". Please alert the systems administrator" ) ;
1448+ updatePromise . reject ( ) ;
14291449 }
14301450
14311451 $ ( '#series_tab' ) . on ( 'draw.dt' , function ( ) {
@@ -1436,15 +1456,91 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
14361456 $ ( '#series_tab' ) . children ( 'tbody' ) . attr ( 'id' , 'series_table' ) ;
14371457 $ ( '#series_tab_wrapper' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_length' ) . after ( '<div class="dataTables_goto_page"><label>Page </label><input class="goto-page-number" type="number"><button onclick="changePage(\'series_tab_wrapper\')">Go</button></div>' ) ;
14381458 $ ( '#series_tab_wrapper' ) . find ( '.dataTables_controls' ) . find ( '.dataTables_paginate' ) . after ( '<div class="dataTables_filter"><strong>Find by Series Instance UID:</strong><input class="seriesID_inp" type="text-box" value="' + seriesID + '"><button onclick="filterTable(\'series_tab_wrapper\',\'seriesID\')">Go</button></div>' ) ;
1459+ return updatePromise ;
14391460 }
14401461
1462+ let SEARCH_QUEUE = [ ] ;
1463+ let SEARCH_PENDING = false ;
1464+ let update_search_thread = null ;
1465+ let SUBSEQUENT_DELAY = 400 ;
1466+ let update_methods = {
1467+ 'caseID' : window . updateCaseTable ,
1468+ 'seriesID' : window . updateSeriesTable ,
1469+ 'studyID' : window . updateStudyTable
1470+ } ;
1471+ let Last_searches = {
1472+ 'caseID' : null ,
1473+ 'studyID' : null ,
1474+ 'seriesID' : null
1475+ } ;
1476+
1477+ function enqueueSearch ( panel , id , input ) {
1478+ SEARCH_QUEUE . push ( function ( ) {
1479+ filterTable ( panel , id , input )
1480+ } ) ;
1481+ }
1482+
1483+ function dequeueSearch ( ) {
1484+ if ( SEARCH_QUEUE . length > 0 ) {
1485+ SEARCH_QUEUE . shift ( ) ( ) ;
1486+ }
1487+ }
1488+
1489+ // Filter a table based on the case/series/study ID search
1490+ // A call to this method will result in a SUBSEQUENT_DELAY pause before execution begins. Subsequent calls will
1491+ // clear this timeout if they arrive before SUBSEQUENT_DELAY has run down, thus waiting until the triggering event
1492+ // stops long enough for the callback to begin. Any calls sent in after the callback fires will see one call
1493+ // queued and the others ignored, so that only a single call fires once the first one is completed.
1494+ function filterTable ( wrapper , type , input ) {
1495+ if ( SEARCH_PENDING ) {
1496+ if ( SEARCH_QUEUE . length <= 0 ) {
1497+ enqueueSearch ( wrapper , type , input ) ;
1498+ }
1499+ return ;
1500+ }
1501+
1502+ ( update_search_thread !== null ) && clearTimeout ( update_search_thread ) ;
1503+
1504+ update_search_thread = setTimeout ( function ( ) {
1505+ SEARCH_PENDING = true ;
1506+ let varStr = input . val ( ) ;
1507+ if ( Last_searches [ type ] !== varStr ) {
1508+ Last_searches [ type ] = varStr ;
1509+ update_methods [ type ] ( false , varStr , true )
1510+ . then ( function ( ) {
1511+ SEARCH_PENDING = false ;
1512+ dequeueSearch ( ) ;
1513+ } )
1514+ . fail ( function ( ) {
1515+ SEARCH_PENDING = false ;
1516+ dequeueSearch ( ) ;
1517+ } ) ;
1518+ } else {
1519+ SEARCH_PENDING = false ;
1520+ dequeueSearch ( ) ;
1521+ }
1522+ } , SUBSEQUENT_DELAY ) ;
1523+ }
1524+
1525+ $ ( '#cases_panel_container' ) . on ( 'keyup' , '.caseID_inp' , function ( event ) {
1526+ filterTable ( 'cases_panel' , 'caseID' , $ ( this ) ) ;
1527+ } ) ;
1528+
1529+ $ ( '#series_panel_container' ) . on ( 'keyup' , '.seriesID_inp' , function ( event ) {
1530+ filterTable ( 'series_panel' , 'seriesID' , $ ( this ) ) ;
1531+ } ) ;
1532+
1533+ $ ( '#studies_panel_container' ) . on ( 'keyup' , '.studyID_inp' , function ( event ) {
1534+ filterTable ( 'study_panel' , 'studyID' , $ ( this ) ) ;
1535+ } ) ;
1536+
1537+
14411538 window . resetCartInTables = function ( projArr ) {
14421539 for ( var i = 0 ; i < projArr . length ; i ++ ) {
14431540 propagateCartTableStatChanges ( [ projArr [ i ] ] , { } , false , true ) ;
14441541
14451542 }
14461543 clearCartSelectionsInCaches ( ) ;
1447-
14481544 }
14491545
14501546 const propagateCartTableStatChanges = function ( ids , itemChng , addingToCart , purge ) {
@@ -2164,21 +2260,7 @@ define(['cartutils','filterutils','tippy','jquery', 'base'], function(cartutils,
21642260 }
21652261
21662262 }
2167- //filter table based on 'Search' text
2168- window . filterTable = function ( wrapper , type ) {
2169- var elem = $ ( '#' + wrapper ) ;
2170- var varStr = elem . find ( '.dataTables_controls' ) . find ( '.' + type + '_inp' ) . val ( ) ;
2171- if ( type === "seriesID" ) {
2172- window . updateSeriesTable ( false , varStr , true )
2173- }
21742263
2175- else if ( type === "studyID" ) {
2176- window . updateStudyTable ( false , varStr , true )
2177- }
2178- else if ( type === "caseID" ) {
2179- window . updateCaseTable ( false , varStr , true )
2180- }
2181- }
21822264
21832265
21842266 const pretty_print_id = function ( id ) {
0 commit comments