Skip to content

Commit 6bc3aac

Browse files
committed
-> Search on tables is now keyup timed
1 parent 3cfb4f4 commit 6bc3aac

File tree

2 files changed

+113
-31
lines changed

2 files changed

+113
-31
lines changed

static/js/tables.js

Lines changed: 111 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

templates/idc/explore_data_core.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ <h4 class="panel-title">
944944
</div>
945945
</div>
946946
<div class="tabpanel data-tab-content-panel table-panel">
947-
<div class="panel panel-default">
947+
<div id="studies_panel_container" class="panel panel-default">
948948
<div class="panel-heading clearfix"><h4 class="panel-title">Selected Studies</h4></div>
949949
<div class="panel-body">
950950
<table id="studies_tab" class="table table-striped studies-table">
@@ -972,7 +972,7 @@ <h4 class="panel-title">
972972
</div>
973973
</div>
974974
<div class="tabpanel data-tab-content-panel table-panel">
975-
<div class="panel panel-default">
975+
<div id="series_panel_container" class="panel panel-default">
976976
<div class="panel-heading clearfix"><h4 class="panel-title">Selected Series</h4></div>
977977
<div class="panel-body">
978978

0 commit comments

Comments
 (0)