crfSetup.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. var crfSetup={};
  2. crfSetup.print=
  3. function(msg){
  4. console.log(msg);
  5. }
  6. crfSetup.init=
  7. function(cb=null){
  8. let fName="[crfSetup(DORA):init]";
  9. this.print(fName);
  10. let that=this;
  11. let action=function(){that.afterScripts(cb);}
  12. LABKEY.requiresScript(["crfDORA/runQuery.js"],action);
  13. }
  14. crfSetup.afterScripts=
  15. function(cb=null){
  16. if (cb) cb();
  17. }
  18. crfSetup.setContainer=
  19. function(label,container){
  20. if (!(this.hasOwnProperty('container'))){
  21. this.container=new Array();
  22. }
  23. this.container[label]=container;
  24. }
  25. crfSetup.getContainer=
  26. function(label){
  27. return this.container[label];
  28. }
  29. crfSetup.getSettings=
  30. function(variable){
  31. if (variable in this.settings){
  32. return this.settings[variable];
  33. }
  34. return null;
  35. }
  36. crfSetup.getRows=
  37. function(objectName){
  38. if (objectName in this)
  39. return this[objectName].rows;
  40. return new Array();
  41. }
  42. crfSetup.getMaps=
  43. function(){
  44. return this.getObject('maps');
  45. }
  46. crfSetup.getEntryMaps=
  47. function(){
  48. return this.getObject('entryMaps');
  49. }
  50. crfSetup.getMap=
  51. function(queryName){
  52. let maps=this.getMaps();
  53. if (!(queryName in maps))
  54. this.parseMap(queryName);
  55. return maps[queryName];
  56. }
  57. crfSetup.getEntryMap=
  58. function(queryName){
  59. this.print('[getEntryMap]: '+queryName);
  60. let entryMaps=this.getEntryMaps();
  61. this.print('[getEntryMap]: maps '+Object.keys(entryMaps).length);
  62. if (!(queryName in entryMaps))
  63. this.parseEntryMap(queryName);
  64. return entryMaps[queryName];
  65. }
  66. crfSetup.getAdditionalDataObject=
  67. function(){
  68. return this.getObject('additionalData');
  69. }
  70. crfSetup.getAdditionalData=
  71. function(queryName){
  72. let adObject=this.getAdditionalDataObject();
  73. if (queryName in adObject){
  74. this.print(fName+': Returning preset value');
  75. return adObject[queryName];
  76. }
  77. return null;
  78. }
  79. crfSetup.getTargetStatus=
  80. function(action){
  81. return this.getObject('targetStatus')[action];
  82. }
  83. crfSetup.getTargetRecipient=
  84. function(action){
  85. return this.getObject('targetRecipient')[action];
  86. }
  87. crfSetup.getActionSettings=
  88. function(action){
  89. return this.getObject('actionSettings')[action];
  90. }
  91. crfSetup.getObject=
  92. function(name){
  93. if (!(name in this))
  94. this[name]=new Object;
  95. return this[name];
  96. }
  97. crfSetup.addObject=
  98. function(masterObject,objectName,object){
  99. let obj=this.getObject(masterObject);
  100. obj[objectName]=object;
  101. }
  102. crfSetup.invertMap=
  103. function(qMap){
  104. let qInverseMap=new Object();
  105. for (let q in qMap){
  106. qInverseMap[qMap[q]]=q;
  107. }
  108. return qInverseMap;
  109. }
  110. crfSetup.getStudyIdLabel
  111. =function(){
  112. return 'participantStudyId';
  113. }
  114. crfSetup.getLocalIdLabel
  115. =function(){
  116. return 'participantLocalId';
  117. }
  118. crfSetup.getParticipantLabel=
  119. function(entry){
  120. let pid=entry[this.getStudyIdLabel()];
  121. let loc=entry[this.getLocalIdLabel()];
  122. let label='';
  123. if (pid) {
  124. label+=pid;
  125. if (loc) label+=' ';
  126. }
  127. if (loc) label+='(Local: '+loc+')';
  128. if (label.length==0) label="NONE";
  129. return label;
  130. }
  131. crfSetup.getStudyId=
  132. function(label){
  133. this.print('getStudyId: label ['+label+']');
  134. return label.replace(/ ?\([^\)]*\)/,"");
  135. }
  136. crfSetup.getLocalId=
  137. function(label){
  138. return label.replace(/^.*\(Local: ([^\)]*)\)$/,"$1");
  139. }
  140. crfSetup.setContainers=
  141. function(cb=null){
  142. this.setContainer('data',LABKEY.ActionURL.getContainer());
  143. this.setContainer('config',LABKEY.ActionURL.getContainer());
  144. this.setContainer('CRF',LABKEY.ActionURL.getContainer());
  145. let selectRows=new Object();
  146. //this is local data
  147. selectRows.containerPath=this.getContainer('CRF');
  148. selectRows.schemaName='lists';
  149. selectRows.queryName='crfSettings';
  150. //store form related data to this object
  151. let that=this;
  152. selectRows.success=function(data){that.parseSettings(data,cb);};
  153. LABKEY.Query.selectRows(selectRows);
  154. }
  155. crfSetup.parseSettings=
  156. function(data,cb){
  157. let fName="[parseSettings]";
  158. this.settings=new Array();
  159. for (let i=0;i<data.rows.length;i++){
  160. let n=data.rows[i]['name'];
  161. let v=data.rows[i]['value'];
  162. this.settings[n]=v;
  163. }
  164. this.print(fName);
  165. for (let k in this.settings){
  166. this.print(fName+'\t'+k+'='+this.settings[k]);
  167. }
  168. //if ('dataContainer' in st){
  169. // setContainer('data',st['dataContainer']);
  170. //}
  171. let vname='configContainer';
  172. if (vname in this.settings){
  173. this.setContainer('config',this.settings[vname]);
  174. }
  175. this.print(fName+' config: '+this.getContainer('config'));
  176. this.print(fName+' data: '+this.getContainer('data'));
  177. if (cb) cb();
  178. }
  179. crfSetup.parseSetup=
  180. function(cb=null){
  181. //setup queryArray
  182. let queryArray=new Array();
  183. //targetObject
  184. let targetObject=this;
  185. //static variables
  186. queryArray.push(runQuery.makeQuery(targetObject,'data','crfStaticVariables','crfStaticVariables',[]));
  187. //Forms
  188. queryArray.push(runQuery.makeQuery(targetObject,'config','Forms','dataForms',[]));
  189. //also formData
  190. //users
  191. queryArray.push(runQuery.makeQuery(targetObject,'data','users','users',[]));
  192. queryArray[queryArray.length-1].schemaName='core';
  193. //also userData
  194. //inputLists
  195. queryArray.push(runQuery.makeQuery(targetObject,'config','inputLists','inputLists',[]));
  196. //crfEditors
  197. queryArray.push(runQuery.makeQuery(targetObject,'config','crfEditors','crfEditors',[]));
  198. //crfEditorData
  199. //crfMonitors
  200. queryArray.push(runQuery.makeQuery(targetObject,'config','crfMonitors','crfMonitors',[]));
  201. //crfMonitorData
  202. //crfSponsors
  203. queryArray.push(runQuery.makeQuery(targetObject,'config','crfSponsors','crfSponsors',[]));
  204. //crfSponsorData
  205. //crfManagers
  206. queryArray.push(runQuery.makeQuery(targetObject,'config','crfManagers','crfManagers',[]));
  207. //FormStatus
  208. //
  209. queryArray.push(runQuery.makeQuery(targetObject,'config','FormStatus','formStatusAll',[]));
  210. let statusFilter=[];
  211. if ("formStatus" in this)
  212. statusFilter.push(LABKEY.Filter.create('Key',this.formStatus));
  213. queryArray.push(runQuery.makeQuery(targetObject,'config','FormStatus','formStatus',statusFilter));
  214. //crfButtons
  215. let statusButtonFilter=[];
  216. if ("formStatus" in this)
  217. statusButtonFilter.push(LABKEY.Filter.create('sourceFormStatus',this.formStatus));
  218. queryArray.push(
  219. runQuery.makeQuery(targetObject,'config','crfButtons','crfButtons',statusButtonFilter));
  220. //site
  221. queryArray.push(runQuery.makeQuery(targetObject,'config','site','siteData',[]));
  222. //crfEntry
  223. queryArray.push(runQuery.makeQuery(targetObject,'data','crfEntry','crfEntries',[]));
  224. //specialFields
  225. queryArray.push(runQuery.makeQuery(targetObject,'data','specialFields','specialFields',[]));
  226. //FormSetup
  227. queryArray.push(runQuery.makeQuery(targetObject,'config','FormSetup','formSetup',[]));
  228. //generateConfig
  229. queryArray.push(
  230. runQuery.makeQuery(targetObject,'config','generateConfig','generateConfigData',[]));
  231. //parentCrf
  232. if ("parentCrf" in this){
  233. let crfFilter=LABKEY.Filter.create('entryId',this.parentCrf);
  234. queryArray.push(runQuery.makeQuery(targetObject,'data','crfEntry','parentCrfData',[crfFilter]));
  235. }
  236. let that=this;
  237. let action=function(){that.addStudyProperties(cb);};
  238. runQuery.getDataFromQueries(this,queryArray,action);
  239. }
  240. crfSetup.addStudyProperties=
  241. function(cb){
  242. //setup queryArray
  243. let queryArray=new Array();
  244. let targetObject=this;
  245. queryArray.push(runQuery.makeQuery(targetObject,'data','StudyProperties','studyData',[]));
  246. //also studyDataAll1
  247. let e=queryArray[queryArray.length-1];
  248. e.schemaName='study';
  249. let columnModel="";
  250. let varRows=this.getRows('crfStaticVariables');
  251. for (let i=0;i<varRows.length;i++){
  252. if (i>0) columnModel+=',';
  253. columnModel+=varRows[i]['staticVariable'];
  254. }
  255. e.columns=columnModel;
  256. let that=this;
  257. //let action=function(){that.fcontinue();};
  258. //let action=function(){that.parseQueryMap(cb);};
  259. let action=cb;
  260. runQuery.getDataFromQueries(this,queryArray,action);
  261. }
  262. crfSetup.selectFormSetupRows=
  263. function(formId){
  264. let formSetupRows=new Array();
  265. let config=this.config;
  266. let allRows=this.getRows("formSetup");
  267. for (let i=0;i<allRows.length;i++){
  268. let formEntry=allRows[i];
  269. if (formEntry.formName==formId)
  270. formSetupRows.push(formEntry);
  271. }
  272. return formSetupRows;
  273. }
  274. crfSetup.findSetupRow=
  275. function(sectionId){
  276. let key=sectionId.replace('section','');
  277. return this.getEntryMap('formSetup')[key];
  278. }
  279. crfSetup.parseMap=
  280. function(queryName){
  281. let fName='[parseMap/'+queryName+']';
  282. let key="Key";
  283. let value="value";
  284. if (queryName=="inputLists")
  285. value="queryName";
  286. if (queryName=="users"){
  287. key="UserId";
  288. value="DisplayName";
  289. }
  290. if (queryName=='dataForms')
  291. value='formName';
  292. if (queryName=='formStatus')
  293. value='formStatus';
  294. this.print(fName);
  295. let rows=this.getRows(queryName);
  296. this.maps[queryName]=new Object();
  297. let qMap=this.maps[queryName];
  298. for (let i=0;i<rows.length;i++){
  299. let r=rows[i];
  300. qMap[r[key]]=r[value];
  301. //this.print(fName+' ['+r[key]+'] '+r[value]);
  302. }
  303. }
  304. crfSetup.parseEntryMap=
  305. function(queryName){
  306. //queryMap can be a combination of queryName:key where key is an override of standard keys given below
  307. let fName='[parseEntryMap/'+queryName+']';
  308. let tA=queryName.split(':');
  309. let q=tA[0];
  310. let rows=this.getRows(q);
  311. this.entryMaps[queryName]=new Object();
  312. let qMap=this.entryMaps[queryName];
  313. let key='Key';
  314. if (q=='users') key='UserId';
  315. if (q=='siteData') key='siteNumber';
  316. if (tA.length>1) key=tA[1];
  317. for (let i=0;i<rows.length;i++){
  318. let r=rows[i];
  319. qMap[r[key]]=r;
  320. this.print(fName+' ['+r[key]+'] '+r);
  321. }
  322. }
  323. crfSetup.printMap=
  324. function(queryName){
  325. let fName='[printMap]';
  326. let qMap=this.getMap(queryName);
  327. for (let x in qMap){
  328. this.print(fName+' ['+x+'] '+qMap[x]);
  329. }
  330. }
  331. crfSetup.setAdditionalData=
  332. function(crfRef,formId){
  333. let formRows=this.selectFormSetupRows(formId);
  334. for (let i=0;i<formRows.length;i++){
  335. this.setAdditionalDataEntry(crfRef,formRows[i]);
  336. }
  337. }
  338. crfSetup.setAdditionalDataEntry=
  339. function(crfRef,formSetupEntry){
  340. //return information on additional data associated with the form
  341. //additionalData is a sub-list with multiple entries per patient/visit
  342. //argument is the row of the formSetup setup list
  343. let queryName=this.getMap('inputLists')[formSetupEntry['queryName']];
  344. let fName='[getAdditionalData/'+queryName+']';
  345. this.print(fName);
  346. //additionalData holds a reference to all queries already parsed
  347. //this helps in reducing number of calls to the database (I assume)a
  348. let adObject=this.getAdditionalDataObject();
  349. //first time we see this query, so we have to do the setup
  350. this.print(fName+': generating');
  351. adObject[queryName]=new Object();
  352. //takes address, so further changes will be to the newly created object
  353. //in fact, ad is just a short alias of the long variable name on the right
  354. let ad=adObject[queryName];
  355. //no additional data
  356. if (formSetupEntry["showFlag"]==="NONE") {
  357. this.print(fName+": empty");
  358. return ad;
  359. }
  360. //use showFlag to setup report section of the CRF list
  361. if (formSetupEntry["showFlag"]==="REVIEW") {
  362. //abuse additionalData to signal different segment
  363. this.print(fName+": generateReport");
  364. ad.isReview=true;
  365. return ad;
  366. }
  367. //setup the additionalData memory object
  368. this.print(fName+': setting values');
  369. ad.showFlag=formSetupEntry["showFlag"];
  370. ad.showFlagValue=formSetupEntry["showFlagValue"];
  371. ad.queryName=formSetupEntry["showQuery"];
  372. //for data queries, limit to present CRF only
  373. ad.filters=new Object();
  374. ad.filters['crfRef']=crfRef;
  375. //compose a long debug message
  376. let msg=fName+": flag "+ad.showFlag;
  377. msg+=" value "+ad.showFlagValue;
  378. msg+=" query "+ad.queryName;
  379. this.print(msg);
  380. return ad;
  381. }
  382. crfSetup.findTitle=
  383. function(queryId){
  384. let entry=this.getEntryMap('inputLists')[queryId];
  385. if (entry)
  386. return entry['title'];
  387. return "NONE";
  388. }
  389. crfSetup.parseButtons=
  390. function(){
  391. let rows=this.getRows('crfButtons');
  392. for (let i=0; i<rows.length; i++){
  393. let action=rows[i].action;//String
  394. let tstatus=rows[i].targetFormStatus;
  395. let trecip=rows[i].targetRecipient;
  396. this.addTargetStatus(action,tstatus);
  397. this.addTargetRecipient(action,trecip);
  398. //allow for settings to be promoted with each action (and potentially parsed and acted upon)
  399. //config.formConfig.actionSettings[action]=undefined;
  400. let aSet=rows[i].actionSettings;
  401. if (aSet){
  402. this.addActionSettings(action,variableList.parseVariables(aSet));
  403. variableList.printVariables(this,this.getActionSettings(action));
  404. }
  405. }
  406. }
  407. crfSetup.addTargetStatus=
  408. function(action,tstatus){
  409. this.addObject('targetStatus',action,tstatus);
  410. }
  411. crfSetup.addTargetRecipient=
  412. function(action,x){
  413. this.addObject('targetRecipient',action,x);
  414. }
  415. crfSetup.addActionSettings=
  416. function(action,x){
  417. this.addObject('actionSettings',action,x);
  418. }