diff --git a/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js b/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js index c49bb4d2f..23cb03ce6 100755 --- a/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js +++ b/shrine-webclient/src/main/html/js-i2b2/cells/CRC/CRC_ctrlr_QryStatus.js @@ -1,735 +1,736 @@ /** * @projectDescription The Asynchronous Query Status controller (GUI-only controller). * @inherits i2b2.CRC.ctrlr * @namespace i2b2.CRC.ctrlr.QueryStatus * @author Nick Benik, Griffin Weber MD PhD * @version 1.0 * ---------------------------------------------------------------------------------------- * updated 8-10-09: Initial Creation [Nick Benik] */ function cgmUtcDateParser(dateString){ //Date format: 2011-02-21T14:35:03.480-05:00 try{ splitDateAndTime = dateString.split("T"); vrDate = splitDateAndTime[0].split("-"); vrTime = splitDateAndTime[1].split(":"); strYear = vrDate[0]; strMonth = vrDate[1] - 1; strDay = vrDate[2]; /* alert("Year: "+ strYear); alert("Month: "+ strMonth); alert("Day: "+ strDay);*/ strHours = vrTime[0]; strMins = vrTime[1]; strSecs = null; strMills = null; vSecs = vrTime[2].split("."); strSecs = vSecs[0]; vMills = vSecs[1].split("-"); strMills = vMills[0]; /* alert("Hours: "+ strHours); alert("Minutes: "+ strMins); alert("Seconds: "+ strSecs); alert("MilliSeconds: "+ strMills);*/ return new Date(strYear, strMonth, strDay, strHours, strMins, strSecs, strMills); } catch(e){ return null; } } i2b2.CRC.ctrlr.QueryStatus = function(dispDIV) { this.dispDIV = dispDIV; }; function trim(sString) { while (sString.substring(0,1) == '\n') { sString = sString.substring(1, sString.length); } while (sString.substring(sString.length-1, sString.length) == '\n') { sString = sString.substring(0,sString.length-1); } return sString; } i2b2.CRC.ctrlr.QueryStatus.prototype = function() { var private_singleton_isRunning = false; var private_startTime = false; var private_refreshInterrupt = false; function private_refresh_status() { // callback processor to check the Query Instance var scopedCallbackQRSI = new i2b2_scopedCallback(); scopedCallbackQRSI.scope = self; scopedCallbackQRSI.callback = function(results) { if (results.error) { alert(results.errorMsg); return; } else { // find our query instance var ri_list = results.refXML.getElementsByTagName('query_result_instance'); var l = ri_list.length; for (var i=0; i<l; i++) { var temp = ri_list[i]; var description = i2b2.h.XPath(temp, 'descendant-or-self::description')[0].firstChild.nodeValue; self.dispDIV.innerHTML += "<div style=\"clear: both; padding-top: 10px; font-weight: bold;\">" + description + "</div>"; } var crc_xml = results.refXML.getElementsByTagName('crc_xml_result'); l = crc_xml.length; for (var i=0; i<l; i++) { var temp = crc_xml[i]; var xml_value = i2b2.h.XPath(temp, 'descendant-or-self::xml_value')[0].firstChild.nodeValue; var xml_v = i2b2.h.parseXml(xml_value); var params = i2b2.h.XPath(xml_v, 'descendant::data[@column]/text()/..'); for (var i2 = 0; i2 < params.length; i2++) { var name = params[i2].getAttribute("name"); if (i2b2.PM.model.isObfuscated) { if ( params[i2].firstChild.nodeValue < 4) { var value = "<3"; } else { var value = params[i2].firstChild.nodeValue + "±3" ; } } else { var value = params[i2].firstChild.nodeValue; } self.dispDIV.innerHTML += "<div style=\"clear: both; margin-left: 20px; float: left; height: 16px; line-height: 16px;\">" + params[i2].getAttribute("column") + ": <font color=\"#0000dd\">" + value + "</font></div>"; } var ri_id = i2b2.h.XPath(temp, 'descendant-or-self::result_instance_id')[0].firstChild.nodeValue; } //self.dispDIV.innerHTML += this.dispMsg; } } var self = i2b2.CRC.ctrlr.currentQueryStatus; // this private function refreshes the display DIV var d = new Date(); var t = Math.floor((d.getTime() - private_startTime)/100)/10; var s = t.toString(); if (s.indexOf('.') < 0) { s += '.0'; } if (private_singleton_isRunning) { self.dispDIV.innerHTML = '<div style="clear:both;"><div style="float:left; font-weight:bold">Running Query: "'+self.QM.name+'"</div>'; // display the current run duration self.dispDIV.innerHTML += '<div style="float:right">['+s+' secs]</div>'; } else { self.dispDIV.innerHTML = '<div style="clear:both;"><div style="float:left; font-weight:bold">Finished Query: "'+self.QM.name+'"</div>'; self.dispDIV.innerHTML += '<div style="float:right">['+s+' secs]</div>'; // self.dispDIV.innerHTML += '<div style="margin-left:20px; clear:both; height:16px; line-height:16px; "><div height:16px; line-height:16px; ">Compute Time: ' + (Math.floor((self.QI.end_date - self.QI.start_date)/100))/10 + ' secs</div></div>'; // self.dispDIV.innerHTML += '</div>'; $('runBoxText').innerHTML = "Run Query"; } self.dispDIV.innerHTML += '</div>'; if ((!private_singleton_isRunning) && (undefined != self.QI.end_date)){ self.dispDIV.innerHTML += '<div style="margin-left:20px; clear:both; line-height:16px; ">Compute Time: '+ (Math.floor((self.QI.end_date - self.QI.start_date)/100))/10 +' secs</div>'; } var foundError = false; for (var i=0; i < self.QRS.length; i++) { var rec = self.QRS[i]; if (rec.QRS_time) { var t = '<font color="'; switch(rec.QRS_Status) { case "ERROR": self.dispDIV.innerHTML += '<div style="clear:both; height:16px; line-height:16px; "><div style="float:left; font-weight:bold; height:16px; line-height:16px; ">'+rec.title+'</div><div style="float:right; height:16px; line-height:16px; "><font color="#dd0000">ERROR</font></div>'; // self.dispDIV.innerHTML += '<div style="float:right; height:16px; line-height:16px; "><font color="#dd0000">ERROR</font></div>'; //['+rec.QRS_time+' secs]</div>'; foundError = true; break; case "COMPLETED": case "FINISHED": foundError = false; //t += '#0000dd">'+rec.QRS_Status; break; case "INCOMPLETE": case "WAITTOPROCESS": case "PROCESSING": self.dispDIV.innerHTML += '<div style="clear:both; height:16px;line-height:16px; "><div style="float:left; font-weight:bold; height:16px; line-height:16px; ">'+rec.title+'</div><div style="float:right; height:16px; line-height:16px; "><font color="#00dd00">PROCESSING</font></div>'; // self.dispDIV.innerHTML += '<div style="float:right; height:16px; line-height:16px; "><font color="#00dd00">PROCESSING</font></div>'; //['+rec.QRS_time+' secs]</div>'; alert('Your query has timed out and has been rescheduled to run in the background. The results will appear in "Previous Queries"'); foundError = true; //t += '#00dd00">'+rec.QRS_Status; break; } t += '</font> '; //self.dispDIV.innerHTML += '<div style="float:right; height:16px; line-height:16px; ">'+t+'['+rec.QRS_time+' secs]</div>'; } self.dispDIV.innerHTML += '</div>'; if (foundError == false) { if (rec.QRS_DisplayType == "CATNUM") { //make call to get QRSI. i2b2.CRC.ajax.getQueryResultInstanceList_fromQueryResultInstanceId("CRC:QueryStatus", {qr_key_value: rec.QRS_ID}, scopedCallbackQRSI); } else if ((rec.QRS_DisplayType == "LIST") && (foundError == false)) { self.dispDIV.innerHTML += "<div style=\"clear: both; padding-top: 10px; font-weight: bold;\">" + rec.QRS_Description + "</div>"; } else if (i2b2.h.isDQ) { self.dispDIV.innerHTML += "<div style=\"margin-left:20px; clear:both; height:16px; line-height:16px; \"><div style=\"float:left; height:16px; line-height:16px; \">" + rec.title + "</div><div style=\"float:right; height:16px; line-height:16px; \"><font color=\"#0000dd\">" + rec.QRS_Status + "</font> [" + rec.QRS_time + " secs]</div></div>"; } if (rec.QRS_Type == "PATIENTSET") { // Check to see if timeline is checked off, if so switch to timeline var t2 = $('dialogQryRun').select('INPUT.chkQueryType'); for (var i=0;i<t2.length; i++) { var curItem = t2[i].nextSibling.data; if (curItem != undefined) { curItem = curItem.toLowerCase(); //curitem = curItem.trim(); } if ((t2[i].checked == true) && (rec.size > 0) && (curItem == " timeline") && !(i2b2.h.isBadObjPath('i2b2.Timeline.cfg.config.plugin')) ) { i2b2.hive.MasterView.setViewMode('Analysis'); i2b2.PLUGINMGR.ctrlr.main.selectPlugin("Timeline"); //Process PatientSet rec.QM_id = self.QM.id; rec.QI_id = self.QI.id; rec.PRS_id = rec.QRS_ID; rec.result_instance_id = rec.PRS_id; var sdxData = {}; sdxData[0] = i2b2.sdx.Master.EncapsulateData('PRS', rec); i2b2.Timeline.prsDropped(sdxData); i2b2.Timeline.setShowMetadataDialog(false); //Process Concepts, put all concepts in one large set sdxData = {}; for (var j2 = 0; j2 < i2b2.CRC.model.queryCurrent.panels.length; j2++) { var panel_list = i2b2.CRC.model.queryCurrent.panels[j2] var panel_cnt = panel_list.length; for (var p2 = 0; p2 < panel_cnt; p2++) { // Concepts for (var i2=0; i2 < panel_list[p2].items.length; i2++) { sdxData[0] = panel_list[p2].items[i2]; i2b2.Timeline.conceptDropped(sdxData); } } } //$('Timeline-pgstart').value = '1'; //$('Timeline-pgsize').value = '10'; //i2b2.Timeline.pgGo(0); i2b2.Timeline.yuiTabs.set('activeIndex', 1); i2b2.Timeline.setShowMetadataDialog(true); } } } } } if ((undefined != self.QI.message) && (foundError == false)) { self.dispDIV.innerHTML += '<div style="clear:both; float:left; padding-top: 10px; font-weight:bold">Status</div>'; var mySplitResult = self.QI.message.split("<?xml"); for(i3 = 1; i3 < mySplitResult.length; i3++){ var xml_v = i2b2.h.parseXml(trim("<?xml " + mySplitResult[i3])); for (var i2 = 0; i2 < xml_v.childNodes.length; i2++) { try { if (i2b2.PM.model.isObfuscated) { if (i2b2.h.XPath(xml_v, 'descendant::total_time_second/text()/..')[i2].firstChild.nodeValue < 4) { var value = "<3"; } else { var value = i2b2.h.XPath(xml_v, 'descendant::total_time_second/text()/..')[i2].firstChild.nodeValue + "±3"; } } else { var value = i2b2.h.XPath(xml_v, 'descendant::total_time_second/text()/..')[i2].firstChild.nodeValue; } self.dispDIV.innerHTML += '<div style="margin-left:20px; clear:both; line-height:16px; ">' + i2b2.h.XPath(xml_v, 'descendant::name/text()/..')[i2].firstChild.nodeValue + '<font color="#0000dd">: ' + value + ' secs</font></div>'; //self.dispDIV.innerHTML += '<div style="float: left; height: 16px; margin-right: 100px; line-height: 16px;"><font color="#0000dd">: ' + i2b2.h.XPath(xml_v, 'descendant::total_time_second/text()/..')[i2].firstChild.nodeValue + ' secs</font></div>'; } catch (e) {} } } } self.dispDIV.style.display = 'none'; self.dispDIV.style.display = 'block'; if (!private_singleton_isRunning && private_refreshInterrupt) { // make sure our refresh interrupt is turned off try { clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; } catch (e) {} } } function private_cancelQuery() { if (private_singleton_isRunning) { try { var self = i2b2.CRC.ctrlr.currentQueryStatus; i2b2.CRC.ctrlr.history.queryDeleteNoPrompt(self.QM.id); clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; private_singleton_isRunning = false; $('runBoxText').innerHTML = "Run Query"; self.dispDIV.innerHTML += '<div style="clear:both; height:16px; line-height:16px; text-align:center; color:r#ff0000;">QUERY CANCELLED</div>'; i2b2.CRC.ctrlr.currentQueryStatus = false; } catch (e) {} } } function private_startQuery() { var self = i2b2.CRC.ctrlr.currentQueryStatus; if (private_singleton_isRunning) { return false; } private_singleton_isRunning = true; self.dispDIV.innerHTML = '<b>Processing Query: "'+this.name+'"</b>'; self.QM.name = this.name; self.QRS = []; self.QI = {}; // callback processor to run the query from definition this.callbackQueryDef = new i2b2_scopedCallback(); this.callbackQueryDef.scope = this; this.callbackQueryDef.callback = function(results) { //if error if (results.error) { var temp = results.refXML.getElementsByTagName('response_header')[0]; if (undefined != temp) { results.errorMsg = i2b2.h.XPath(temp, 'descendant-or-self::result_status/status')[0].firstChild.nodeValue; if (results.errorMsg.substring(0,9) == "LOCKEDOUT") { results.errorMsg = 'As an "obfuscated user" you have exceeded the allowed query repeat and are now LOCKED OUT, please notify your system administrator.'; } } alert(results.errorMsg); private_cancelQuery(); return; } //query was successful so update global settings. clearInterval(private_refreshInterrupt); private_refreshInterrupt = false; private_singleton_isRunning = false; //update the ui var self = i2b2.CRC.ctrlr.currentQueryStatus; // this private function refreshes the display DIV var d = new Date(); var t = Math.floor((d.getTime() - private_startTime)/100)/10; var s = t.toString(); if (s.indexOf('.') < 0) { s += '.0'; } self.dispDIV.innerHTML = '<div style="clear:both;"><div style="float:left; font-weight:bold">Finished Query: "'+self.QM.name+'"</div>'; self.dispDIV.innerHTML += '<div style="float:right">['+s+' secs]</div><br/>'; $('runBoxText').innerHTML = "Run Query"; //------------ QI Logic -------------------// // find our query instance var qi_list = results.refXML.getElementsByTagName('query_instance'); var l = qi_list.length; for (var i=0; i<l; i++) { var qiNode = qi_list[i]; var qi_id = i2b2.h.XPath(qiNode, 'descendant-or-self::query_instance_id')[0].firstChild.nodeValue; this.QI.message = i2b2.h.getXNodeVal(qiNode, 'message'); //start date. this.QI.start_date = i2b2.h.getXNodeVal(qiNode, 'start_date'); if (!Object.isUndefined(this.QI.start_date)) { this.QI.start_date = new Date(this.QI.start_date.substring(0,4), this.QI.start_date.substring(5,7)-1, this.QI.start_date.substring(8,10), this.QI.start_date.substring(11,13),this.QI.start_date.substring(14,16),this.QI.start_date.substring(17,19),this.QI.start_date.substring(20,23)); } //end date. this.QI.end_date = i2b2.h.getXNodeVal(qiNode, 'end_date'); if (!Object.isUndefined(this.QI.end_date)) { this.QI.end_date = new Date(this.QI.end_date.substring(0,4), this.QI.end_date.substring(5,7)-1, this.QI.end_date.substring(8,10), this.QI.end_date.substring(11,13),this.QI.end_date.substring(14,16),this.QI.end_date.substring(17,19),this.QI.end_date.substring(20,23)); } // found the query instance, extract the info this.QI.status = i2b2.h.XPath(qiNode, 'descendant-or-self::query_status_type/name')[0].firstChild.nodeValue; this.QI.statusID = i2b2.h.XPath(qiNode, 'descendant-or-self::query_status_type/status_type_id')[0].firstChild.nodeValue; } //add the compute time. self.dispDIV.innerHTML += '</div>'; self.dispDIV.innerHTML += '<div style="margin-left:20px; clear:both; line-height:16px; ">Compute Time: '+ s +' secs</div>'; // -- query result instance vars -- // - var qriNodeList = results.refXML.getElementsByTagName('query_result_instance'), + var qriNodeList = results.refXML.getElementsByTagName('query_result_instance'), qriIdx, qriNode, qriObj, breakdownType, + errorObjects = []; // -- breakdown vars -- // brdNodeList, brdNode, brdIdx, brdObj; - - var errorObjects = []; //iterate through each query result. for (qriIdx = 0; qriIdx < qriNodeList.length; qriIdx++) { //init qri vars. qriNode = qriNodeList[qriIdx]; qriObj = parseQueryResultInstance(qriNode); breakdownType = ''; //which hospital self.dispDIV.innerHTML += '<div style="clear:both;"><br/><div style="float:left; font-weight:bold; margin-left:20px;">' + qriObj.description + ' "' +self.QM.name+ '"</div>'; - //for testing. - qriObj.statusName = "ERROR" - //if there was an error display it. if((qriObj.statusName == "ERROR") || (qriObj.statusName == "UNAVAILABLE")){ var errorObj = { shortDescription: "Desination site was unable to translate SHRINE query term to local ontology.", stackTrace: "Error mapping query terms from" + " network to local forms. request:" + "RunQueryRequest(I2B2_PROJECT_NAME,180000 milliseconds,"+ "AuthenticationInfo(*****,****,Credential(******,false)),"+ "QUERY_ID,None,Set(PATIENT_COUNT_XML)," + "QueryDefinition(QUERY_NAME,Some(" + "Term(\\PROJECT\\AND\\CONCEPT\\PATH\\OF\\UNMAPPED\\TERM),"+ "Some(ANY),None,None,None,List())))", longDescription: 'The site responding to the query does not understand how to map the SHRINE query term it was given to its own local i2b2 term.)', wikiUrl: 'https://open.med.harvard.edu/wiki/display/SHRINETEAM/Error+Types+for+Improved+Error+Messaging' }; errorObjects.push(errorObj); self.dispDIV.innerHTML += "<span title='" + qriObj.statusDescription +"'> <b><a class='query-error-anchor' href='#' style='color:#ff0000'> <b><span color='#ff0000'>" + errorObj.shortDescription + "</span></b></a></b></span>"; continue; } else if((qriObj.statusName == "PROCESSING")){ self.dispDIV.innerHTML += " - <span><b><font color='#00dd00'>Still Processing Request</font></b></span>"; continue; } else if(["COMPLETED","FINISHED"].indexOf(qriObj.statusName) < 0){ self.dispDIV.innerHTML += " - <span><b><font color='#dd0000'>Results not available</font></b></span>"; continue; } self.dispDIV.innerHTML += "<div style=\"clear: both; margin-left: 30px; float: left; height: 16px; line-height: 16px;\">" + "Patient Count" + ": <font color=\"#0000dd\">" + getObfuscatedResult(qriObj.setSize, 10) + "</font></div>"; //grab breakdown data. brdNodeList = i2b2.h.XPath(qriNode, 'descendant-or-self::breakdown_data/column'); for(brdIdx = 0; brdIdx < brdNodeList.length; brdIdx ++){ //init brd vars. brdNode = brdNodeList[brdIdx]; brdObj = parseBreakdown(brdNode); if(brdObj.parentResultType !== breakdownType){ breakdownType = brdObj.parentResultType; self.dispDIV.innerHTML += "<div style=\"clear: both; margin-left: 30px; float: left; height: 16px; line-height: 16px;\"><br/><font>" + getBreakdownTitle(brdObj.parentResultType) + ":</font></div>"; self.dispDIV.innerHTML += "<div style=\"clear: both; margin-left: 40px; float: left; height: 16px; line-height: 16px;\"></div>"; } self.dispDIV.innerHTML += "<div style=\"clear: both; margin-left: 40px; float: left; height: 16px; line-height: 16px;\">" + brdObj.name + ": <font color=\"#0000dd\">" + getObfuscatedResult(brdObj.value, 10) + "</font></div>"; } } createErrorDialogue(self.dispDIV, errorObjects); i2b2.CRC.ctrlr.history.Refresh(); } /** * Scope for error dialog. */ function createErrorDialogue (container, errorObjects) { + // -- no errors abandon ship! -- // + if(errorObjects.length < 1) { + return; + } + var anchors, btnExpand, btnContract, errObjects = errorObjects, errorData; //this sets up the events. anchors = container.getElementsByClassName('query-error-anchor'); if(anchors.length == 0) { return; } addAnchorEvents(); function expandErrorDetailDiv (ev) { btnExpand.style.display = 'none'; btnContract.style.display = 'inline'; document.getElementById('errorDetailDiv').style.height = '200px'; $('errorDetailDiv').innerHTML = '<span style="font-weight: bold">' +errorData.shortDescription + '<br/><br/>' + errorData.longDescription + '<br/><br/>' + errorData.stackTrace + '<span/><br/><br/><a href="' + errorData.wikiUrl + '"' +' target="_blank">Click here for more information.</a>'; } function retractErrorDetailDiv (ev) { btnExpand.style.display = 'inline'; btnContract.style.display = 'none'; document.getElementById('errorDetailDiv').style.height = '80px'; $('errorDetailDiv').innerHTML = '<span style="font-weight: bold">' +errorData.shortDescription + '<br/><br/>' + errorData.longDescription + '<br/><br/>' } function onClick(event) { event.preventDefault(); errorData = event.currentTarget.__errorData__; btnExpand = document.getElementById('btnExpandErrorDetail'); btnContract = document.getElementById('btnContractErrorDetail'); // -- add event listeners for expand and contract as well --// btnExpand.addEventListener('click', expandErrorDetailDiv, false); btnContract.addEventListener('click', retractErrorDetailDiv, false); showErrorDetail(errorData); } function showErrorDetail(detailObj) { var handleCancel = function() { this.cancel(); removeAllEvents(); retractErrorDetailDiv(); }; var dialogErrorDetail = new YAHOO.widget.SimpleDialog("dialogErrorDetail", { width: "820px", fixedcenter: true, constraintoviewport: true, modal: true, zindex: 700, buttons: [ { text: "Done", handler: handleCancel, isDefault: true }] }); dialogErrorDetail._doClose = function (e) { e.preventDefault(); this.cancel(); removeAllEvents(); retractErrorDetailDiv(); } $('dialogErrorDetail').show(); dialogErrorDetail.validate = function(){ return true; }; dialogErrorDetail.render(document.body); // / display the dialoge dialogErrorDetail.center(); dialogErrorDetail.show(); $('errorDetailDiv').innerHTML = '<span style="font-weight: bold">' + errorData.shortDescription + '<span/>'; } function addAnchorEvents () { var el, length = anchors.length; // -- will need to iterate over these once they are created and add event listeners. for(var i = 0; i < length; i ++) { var el = anchors[i]; el.__errorData__ = errorObjects[i]; el.addEventListener('click', onClick, false); } } function removeAllEvents () { btnExpand.removeEventListener('click', expandErrorDetailDiv); btnContract.removeEventListener('click', retractErrorDetailDiv); } } /** * * @param qriNode * @returns {{qiStatusName: string, qiStatusDescription: string, qiSetSize: string, qiDescription: string, qiResultName: string, qiResultDescription: string}} */ function parseQueryResultInstance(qriNode){ var qriObj = { statusName: grabXmlNodeData(qriNode, 'descendant-or-self::query_status_type/name'), statusDescription: grabXmlNodeData(qriNode, 'descendant-or-self::query_status_type/description'), description: grabXmlNodeData(qriNode, 'descendant-or-self::description') }; if(qriObj.statusName == "ERROR"){ return qriObj; } qriObj.setSize = grabXmlNodeData(qriNode, 'descendant-or-self::set_size'); qriObj.resultName = grabXmlNodeData(qriNode, 'descendant-or-self::query_result_type/name'); qriObj.resultDescription = grabXmlNodeData(qriNode, 'descendant-or-self::query_result_type/description'); //if is obfuscated. /*if (i2b2.PM.model.isObfuscated) { qriObj.setSize = (+qriObj.setSize < 4)? "<3" : qriObj.setSize + "+-3"; }*/ return qriObj; } /** * * @param brdNode */ function parseBreakdown(brdNode){ var brdObj = { name: grabXmlNodeData(brdNode, 'name'), value: grabXmlNodeData(brdNode, 'value'), parentResultType: grabXmlNodeData(brdNode, 'parent::breakdown_data/resultType') } return brdObj; } /** * Return breakdown title based on breakdown type. * @param breakdownType * @returns {*} */ function getBreakdownTitle(breakdownType) { return { 'PATIENT_AGE_COUNT_XML': 'Patient Age Count Breakdown', 'PATIENT_GENDER_COUNT_XML': 'Patient Gender Count Breakdown', 'PATIENT_RACE_COUNT_XML': 'Patient Race Count Breakdown', 'PATIENT_VITALSTATUS_COUNT_XML':'Patient Vital Status Count Breakdown' }[breakdownType]; }; /** * Method for hiding the precise value of a query below a certain result. * @param resultCount - the number of results from a query. * @param obfuscationSetting - do not reveal this number of results */ function getObfuscatedResult(resultCount, obfuscationSetting) { var resultTitle = " - ", name = " patients", offsetText = " +-3", isException = i2b2.PM.model.isObfuscated === false; //default to 10. obfuscationSetting = (arguments.length > 1) ? arguments[1] : 10; //if user role is an exception. return result. if (isException) { return resultTitle += resultCount + name; } resultTitle += ((resultCount >= obfuscationSetting)? resultCount + offsetText + name: obfuscationSetting + name + " or fewer"); return resultTitle; } /** * Grab data for node, return empty string if none. * @param node * @param xPathString * @returns {string} */ function grabXmlNodeData(node, xPathString){ return (i2b2.h.XPath(node, xPathString).length)? i2b2.h.XPath(node, xPathString)[0].firstChild.nodeValue : ''; } // switch to status tab i2b2.CRC.view.status.showDisplay(); // timer and display refresh stuff private_startTime = new Date(); private_refreshInterrupt = setInterval("i2b2.CRC.ctrlr.currentQueryStatus.refreshStatus()", 100); // AJAX call i2b2.CRC.ajax.runQueryInstance_fromQueryDefinition("CRC:QueryTool", this.params, this.callbackQueryDef); } return { name: "", polling_interval: 1000, QM: {id:false, status:""}, QI: {id:false, status:""}, QRS:{}, displayDIV: false, running: false, started: false, startQuery: function(queryName, ajaxParams) { this.name = queryName; this.params = ajaxParams; private_startQuery.call(this); }, cancelQuery: function() { private_cancelQuery(); }, isQueryRunning: function() { return private_singleton_isRunning; }, refreshStatus: function() { private_refresh_status(); } }; }(); i2b2.CRC.ctrlr.currentQueryStatus = false;