crfVisit.js 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549
  1. function clear(config){
  2. let el=config.document.getElementById(config.debugId);
  3. if (el===null) {
  4. //alert("Debug section not initialized");
  5. return;
  6. }
  7. config.document.getElementById(config.debugId).value="";
  8. }
  9. function print(config,msg){
  10. let el=config.document.getElementById(config.debugId);
  11. if (el===null) {
  12. //alert("Debug section not initialized. Message: "+msg);
  13. return;
  14. }
  15. el.value+="\n"+msg;
  16. }
  17. function getCRFref(config){
  18. //'crfRefId'
  19. return config.document.getElementById(config.crfRefId).innerHTML;
  20. }
  21. function onFailure(errorInfo, options, responseObj){
  22. if (errorInfo && errorInfo.exception)
  23. alert("Failure: " + errorInfo.exception);
  24. else
  25. alert("Failure: " + responseObj.statusText);
  26. }
  27. function generateDebugSection(config){
  28. //let debug=true;
  29. //if (debug) print(config,"generateDebugSection "+sectionName);
  30. let formName=config.debugDiv;
  31. let sectionName="debugSection";
  32. let sectionTitle="Debug Messages";
  33. let tb=config.document.createElement('table');
  34. tb.className='t2';
  35. let row=tb.insertRow();
  36. let cell=config.document.createElement('th');
  37. row.appendChild(cell);
  38. cell.setAttribute("colspan","4");
  39. cell.style.fontSize="20px";
  40. cell.style.textAlign="center";
  41. let cellData=config.document.createTextNode(sectionTitle);
  42. cell.appendChild(cellData);
  43. cell=row.insertCell();
  44. let input=config.document.createElement("input");
  45. input.type="button";
  46. input.value="Show";
  47. input.id="toggle"+sectionName+"VisbilityButton";
  48. input.onclick=function(){toggleVisibility(config,sectionName,input.id)};
  49. cell.appendChild(input);
  50. config.document.getElementById(formName).appendChild(tb);
  51. let div=config.document.createElement('div');
  52. div.id=sectionName;
  53. div.style.display="none";
  54. config.document.getElementById(formName).appendChild(div);
  55. let debugArea=config.document.createElement('textarea');
  56. debugArea.rows=10;
  57. debugArea.cols=95;
  58. debugArea.id=config.debugId;
  59. div.appendChild(debugArea);
  60. }
  61. function populateBasicData(config,data){
  62. let debug=false;
  63. if (debug)
  64. print(config,"crfRef matched entries: "+data.rows.length);
  65. if (data.rows.length!=1) { return;}
  66. config.document.getElementById('eudraCTNumber').innerHTML=data.rows[0].EudraCTNumber;
  67. config.document.getElementById('studyCoordinator').innerHTML=data.rows[0].StudyCoordinator;
  68. config.document.getElementById('studySponsor').innerHTML=data.rows[0].StudySponsor;
  69. let qconfig=new Object();
  70. qconfig.containerPath=config.containerPath;
  71. qconfig.schemaName='lists';
  72. qconfig.queryName='site';
  73. qconfig.filterArray=[LABKEY.Filter.create('siteNumber', data.rows[0].Site)];
  74. qconfig.success=function(data){
  75. setHTML(config,data,'siteName','siteName');
  76. setHTML(config,data,'sitePhone','sitePhone');
  77. };
  78. LABKEY.Query.selectRows(qconfig);
  79. if (debug)
  80. print(config,"set user: "+data.rows[0].UserId);
  81. let qconfig1=new Object();
  82. qconfig1.containerPath=config.containerPath;
  83. qconfig1.schemaName='core';
  84. qconfig1.queryName='Users';
  85. qconfig1.filterArray= [LABKEY.Filter.create('UserId',data.rows[0].UserId)];
  86. qconfig1.success= function(data){setHTML(config,data,'investigatorName','DisplayName')};
  87. qconfig1.failure=onFailure;
  88. if (debug)
  89. print(config,"USER select rows");
  90. LABKEY.Query.selectRows(qconfig1);
  91. }
  92. function setHTML(config,data,elementId,varName){
  93. print(config,"setHTML "+data.rows.length+" elementId: "+elementId+" varName:"+varName);
  94. if (data.rows.length>0){
  95. let entry=data.rows[0];
  96. let el=config.document.getElementById(elementId);
  97. print(config,"setHTML: Entry[" + varName + "]: " + entry[varName]);
  98. print(config,"setHTML: Element[" + elementId + "]: " + el);
  99. el.innerHTML=entry[varName];
  100. }
  101. }
  102. function setAdditionalData(config,additionalData,entry){
  103. let debug=true;
  104. if (debug) print(config,"setAdditionalData");
  105. if (entry["showFlag"]==="NONE") {
  106. if (debug) print(config,"Returning empty additionalData");
  107. return additionalData;
  108. }
  109. additionalData.showFlag=entry["showFlag"];
  110. additionalData.showFlagValue=entry["showFlagValue"];
  111. additionalData.queryName=entry["showQuery"];
  112. additionalData.filters=new Object();
  113. additionalData.filters['crfRef']=getCRFref(config);
  114. return additionalData;
  115. }
  116. function fullAccessSetup(config,listName){
  117. let debug=true;
  118. if (debug) print(config,"fullAccessSetup");
  119. let setup=new Object();
  120. setup.readonlyFlag=function(vName){return false};
  121. setup.filters=new Object();
  122. setup.filters['crfRef']=getCRFref(config);
  123. setup.getInputId=function(vName){return listName+"_"+vName;}
  124. setup.addApply="Save";
  125. return setup;
  126. }
  127. function readonlySetup(config){
  128. let debug=true;
  129. if (debug) print(config,"readonlySetup");
  130. let setup=new Object();
  131. setup.readonlyFlag=function(vName){return true};
  132. setup.filters=new Object();
  133. setup.filters['crfRef']=getCRFref(config);
  134. setup.getInputId=function(vName){return vName;}
  135. return setup;
  136. }
  137. function generateForm(config,data){
  138. let debug=true;
  139. if (debug) print(config,"generateForm ["+data.rows.length+"]");
  140. for (let i=0;i<data.rows.length;i++){
  141. if (debug) print(config,"generateForm ["+i+"/"+data.rows.length+"]");
  142. let entry=data.rows[i];
  143. //this is actually a pointer into another list (==lookup)
  144. //another selectRows is needed to actually get the name for the queryName
  145. //
  146. let fields=data.metaData.fields;
  147. if (debug) print(config,"generateForm ["+i+"]: fields: "+fields);
  148. let field="NONE";
  149. //if (debug) printTableSetup(config,data);
  150. for (f in fields){
  151. if (fields[f]['name']!='queryName') continue;
  152. field=fields[f];
  153. break;
  154. }
  155. if (debug) print(config,"generateForm ["+i+"]: field: "+field);
  156. let lookup=field.lookup;
  157. if (debug) print(config,"generateForm ["+i+"]: lookup: "+lookup);
  158. let qconfig=new Object();
  159. qconfig.containerPath=config.containerPath;
  160. qconfig.schemaName=lookup.schemaName;
  161. qconfig.queryName=lookup.queryName;
  162. qconfig.filterArray=[LABKEY.Filter.create(lookup.keyColumn,entry['queryName'])];
  163. qconfig.success=function(data){generateFormLookup(config,data,entry)};
  164. LABKEY.Query.selectRows(qconfig);
  165. }
  166. }
  167. function generateFormLookup(config,data,entry){
  168. //id : entry[queryName]
  169. //name: dentry[queryName]
  170. let debug=true;
  171. let queryId=entry['queryName'];
  172. if (data.rows.length==0){
  173. alert("No rows found for listId: "+entry['queryName']);
  174. return;
  175. }
  176. let dentry=data.rows[0];
  177. if (debug)
  178. for (f in dentry) print(config,"generateFormLookup field: "+f+" value: "+dentry[f]);
  179. let queryName=dentry["queryName"];
  180. if (debug) print(config,"generateFormLookup: ID: "+queryId+" name: "+queryName);
  181. //update fields for review
  182. if (!(queryName in config.fields))
  183. config.fields[queryName]=new Object();
  184. if (!(queryId in config.queryMap))
  185. config.queryMap[queryId]=queryName;
  186. let field=config.fields[queryName];
  187. field.title=entry["title"];
  188. field.queryId=queryId;
  189. if (debug) print(config,"entry[showFlag]: "+entry["showFlag"]);
  190. let additionalData=new Object();
  191. setAdditionalData(config,additionalData,entry);
  192. generateSection(config,queryName,entry["title"],queryName, additionalData);
  193. }
  194. function generateSection(config, sectionName, sectionTitle, listName, additionalData){
  195. let formName=config.masterForm;
  196. let debug=true;
  197. if (debug) print(config,"generateSection "+sectionName);
  198. let tb=config.document.createElement('table');
  199. tb.className='t2';
  200. let row=tb.insertRow();
  201. let cell=config.document.createElement('th');
  202. row.appendChild(cell);
  203. cell.setAttribute("colspan","4");
  204. cell.style.fontSize="20px";
  205. cell.style.textAlign="center";
  206. let cellData=config.document.createTextNode(sectionTitle);
  207. cell.appendChild(cellData);
  208. cell=row.insertCell();
  209. let input=config.document.createElement("input");
  210. input.type="button";
  211. input.value="Show";
  212. input.id="toggle"+sectionName+"VisbilityButton";
  213. input.onclick=function(){toggleVisibility(config,sectionName,input.id)};
  214. cell.appendChild(input);
  215. config.document.getElementById(formName).appendChild(tb);
  216. let div=config.document.createElement('div');
  217. div.id=sectionName;
  218. div.style.display="none";
  219. config.document.getElementById(formName).appendChild(div);
  220. let divTable=config.document.createElement('div');
  221. divTable.id=sectionName+"Table";
  222. div.appendChild(divTable);
  223. if ("showFlag" in additionalData) {
  224. additionalData.divName=sectionName+"SubDiv";
  225. additionalData.divQueryName=sectionName+"SubDivList";
  226. let div1=config.document.createElement('div');
  227. div1.id=additionalData.divName;
  228. div1.style.display="none";
  229. div.appendChild(div1);
  230. let div2=config.document.createElement('div');
  231. div2.id=additionalData.divQueryName;
  232. div1.appendChild(div2);
  233. }
  234. if (debug) print(config,"generate master table");
  235. let setup=fullAccessSetup(config,listName);
  236. if ("reviewMode" in config)
  237. setup=readonlySetup(config);
  238. //master table is unique per visit
  239. setup.unique=true;
  240. generateTable(config,listName,divTable.id,true,additionalData,setup);
  241. if (debug) print(config,"generate master table: done");
  242. let generateSubTable=true;
  243. if ("reviewMode" in config) generateSubTable=false;
  244. if (! ("showFlag" in additionalData) ) generateSubTable=false;
  245. if (generateSubTable){
  246. let qName=additionalData.queryName;
  247. let dName=additionalData.divName;
  248. let setup=fullAccessSetup(config,qName);
  249. if ("reviewMode" in config)
  250. setup=readonlySetup(config);
  251. generateTable(config,qName,dName,false,additionalData,setup);
  252. }
  253. let divReviewList=config.document.createElement('div');
  254. divReviewList.id=sectionName+"ReviewList";
  255. div.appendChild(divReviewList);
  256. let divReview=config.document.createElement('div');
  257. divReview.id=sectionName+"Review";
  258. div.appendChild(divReview);
  259. //assume we already have listId (content of config.setupQueryName is listId)
  260. //we need listName also
  261. let qconfig=new Object();
  262. qconfig.containerPath=config.containerPath;
  263. qconfig.schemaName='lists';
  264. //qconfig.queryName=config.setupQueryName;
  265. qconfig.queryName="FormSetup";
  266. qconfig.filterArray=[LABKEY.Filter.create("formName",config.formId)];
  267. qconfig.success=function(data){
  268. generateReview(config,data,divReview.id,divReviewList.id,listName)};
  269. LABKEY.Query.selectRows(qconfig);
  270. }
  271. function generateReview(config,data,divReviewId,divReviewListId, listName){
  272. let listId=config.fields[listName].queryId;
  273. let debug=true;
  274. if (debug) print(config,"Generate review for: "+listId);
  275. //don't need this
  276. //let listId=-1;
  277. //for (let i=0;i<data.rows.length;i++){
  278. // let entry=data.rows[i];
  279. // if (entry["queryName"]!=listName) continue;
  280. // listId=entry["Key"];
  281. // break;
  282. //}
  283. //if (debug) print(config,"Review: setting listId: "+listId);
  284. let reviewSetup=new Object();
  285. reviewSetup.readonlyFlag=function(vName){
  286. if (vName=="queryName") return true;
  287. if (vName=="queryname") return true;
  288. if (vName=="ModifiedBy") return true;
  289. return false;};
  290. reviewSetup.addApply="Add Review";
  291. let generateTableFlag=true;
  292. if ("reviewMode" in config && config.reviewMode == "APPROVED" ){
  293. delete reviewSetup.addApply;
  294. reviewSetup.readonlyFlag=function(vName){return false;}
  295. generateTableFlag=false;
  296. }
  297. reviewSetup.filters=new Object();
  298. reviewSetup.filters["crfRef"]=getCRFref(config);
  299. reviewSetup.filters["queryName"]=listId;//entry in reviewComments list is queryname, all in small caps
  300. //reviewSetup.filters["ModifiedBy"]=LABKEY.Security.currentUser.id;
  301. //needs listName, in argument
  302. reviewSetup.getInputId=function(vName){return listName+"_add"+vName};
  303. reviewSetup.divReviewListId=divReviewListId;
  304. if (debug) {
  305. let msg="Review: divId: "+divReviewId;
  306. msg+=" inputId: "+reviewSetup.getInputId;
  307. print(config,msg);
  308. }
  309. updateListDisplay(config,divReviewListId,"reviewComments",reviewSetup.filters,true);
  310. if (! generateTableFlag) return;
  311. generateTable(config,"reviewComments",divReviewId,false,new Object(),reviewSetup);
  312. }
  313. function setListVisibility(config,setup,additionalData,readonlyFlag){
  314. let debug=true;
  315. if (debug){
  316. print(config,"Set list visibility ");
  317. for (f in additionalData){
  318. print(config,"AdditionalData["+f+"]: "+additionalData[f]);
  319. }
  320. }
  321. let x = config.document.getElementById(additionalData.divName);
  322. if (debug) print(config,"\n Div: "+x);
  323. x.style.display="none";
  324. let eId=setup.getInputId(additionalData.showFlag);
  325. let e = config.document.getElementById(eId);
  326. let sText;
  327. if (readonlyFlag) sText=e.innerHTML;
  328. else sText=e.options[e.selectedIndex].text;
  329. if (debug) print(config,"\n Selected option text: "+sText);
  330. if (sText == additionalData.showFlagValue){
  331. let filters=new Object();
  332. if ("filters" in additionalData) filters=additionalData.filters;
  333. x.style.display = "block";
  334. updateListDisplay(config,additionalData.divQueryName,additionalData.queryName,filters,readonlyFlag);
  335. }
  336. }
  337. function updateListDisplay(config,divName,queryName,filters,readonlyFlag){
  338. let debug=true;
  339. if (debug) print(config,"UpdateListDisplay: Query - "+queryName+" div - "+divName);
  340. if (divName=="NONE") return;
  341. let crfRef=getCRFref(config);
  342. let div=config.document.getElementById(divName);
  343. if (debug)
  344. print(config,"Enabling display to queryName: "+queryName);
  345. var qconfig=new Object();
  346. qconfig.renderTo=divName;
  347. qconfig.containerPath=config.containerPath;
  348. qconfig.schemaName='lists';
  349. qconfig.queryName=queryName;
  350. qconfig.buttonBarPosition='top';
  351. qconfig.filters=[];
  352. for (f in filters){
  353. qconfig.filters.push(LABKEY.Filter.create(f, filters[f]));
  354. }
  355. qconfig.success=function(data){updateSuccess(config,data)};
  356. qconfig.failure=function(data){updateFailure(config,data)};
  357. //show only print button
  358. if (readonlyFlag){
  359. qconfig.buttonBar=new Object();
  360. qconfig.buttonBar.items=["print"];
  361. }
  362. LABKEY.QueryWebPart(qconfig);
  363. }
  364. function updateSuccess(config,data){
  365. print(config,"Update success");
  366. }
  367. function updateFailure(config,data){
  368. print(config,"Update failed");
  369. }
  370. function toggleVisibility(config, divName,buttonName){
  371. let x = config.document.getElementById(divName);
  372. if (x.style.display === "none") {
  373. x.style.display = "block";
  374. config.document.getElementById(buttonName).value="Hide";
  375. } else {
  376. x.style.display = "none";
  377. config.document.getElementById(buttonName).value="Show";
  378. }
  379. }
  380. function generateButton(config,divName,title,buttonName,callback,callbackParameters){
  381. let debug=true;
  382. if (debug) print(config,"generateButton");
  383. let tb=config.document.createElement('table');
  384. tb.className="t2";
  385. let r1=tb.insertRow();
  386. th=config.document.createElement('th');
  387. r1.appendChild(th);
  388. th.innerHTML=title;
  389. //*!*
  390. let c2=r1.insertCell();
  391. let i1=config.document.createElement("input");
  392. i1.type="button";
  393. i1.value=buttonName;
  394. i1.style.fontSize="20px";
  395. i1.onclick=function(){callback(callbackParameters);}
  396. c2.appendChild(i1);
  397. let c1=r1.insertCell();
  398. c1.setAttribute("colspan","1");
  399. c1.id=callbackParameters.submitReportId;
  400. let el=config.document.getElementById(divName);
  401. if (debug) print(config,"generateButton: element["+divName+"]: "+el);
  402. el.appendChild(tb);
  403. }
  404. function generateTable(config,listName,divName,unique,additionalData,setup){
  405. let debug=true;
  406. if (debug) print(config,"generateTable: "+listName);
  407. //add temp variables
  408. let qconfig=new Object();
  409. qconfig.containerPath=config.containerPath;
  410. qconfig.schemaName='lists';
  411. qconfig.queryName=listName;
  412. //apply filters on data to get right entries
  413. qconfig.filterArray=[];
  414. for (f in setup.filters){
  415. qconfig.filterArray.push(LABKEY.Filter.create(f,setup.filters[f]));
  416. }
  417. qconfig.success=function(data){populateTable(config,data,divName,unique,additionalData,setup)};
  418. LABKEY.Query.selectRows(qconfig);
  419. }
  420. function printTableSetup(config,data){
  421. let obj=data.metaData.fields;
  422. for (f in obj){
  423. print(config,"Data["+f+"]: "+obj[f]);
  424. for (g in obj[f]){
  425. print(config,"Data.metaData.fields["+f+"]["+g+"]: "+obj[f][g]);
  426. }
  427. if ("lookup" in obj[f]){
  428. for (h in obj[f]["lookup"]){
  429. print(config,"Lookup["+h+"]: "+obj[f]["lookup"][h]);
  430. }
  431. }
  432. }
  433. }
  434. function populateTable(config,data,divName,unique,additionalData,setup){
  435. //generate and populate table with the first suitable entry
  436. let debug=true;
  437. if (debug){
  438. print(config,"populateTable Query: "+data.queryName+" divName: "+divName+" setup: "+setup);
  439. if (0) printTableSetup(config,data);
  440. }
  441. let crfRef=getCRFref(config);
  442. let entry=new Object();
  443. if (debug)
  444. print(config,"Data: nrows "+data.rows.length);
  445. if (data.rows.length > 0) entry=data.rows[0];
  446. let tb=config.document.createElement('table');
  447. tb.className="t2";
  448. config.document.getElementById(divName).appendChild(tb);
  449. let fields=data.metaData.fields;
  450. for (f in fields){
  451. let field=fields[f];
  452. if (field.hidden) continue;
  453. let vName=field.name;
  454. if (debug) print(config,"Field ["+vName+"]");
  455. if (vName=="crfRef") continue;
  456. let vType=field.type;
  457. if (debug) print(config,"Field ["+vName+"/"+vType+"]");
  458. let row=tb.insertRow();
  459. let cell=config.document.createElement('th');
  460. row.appendChild(cell);
  461. let text = config.document.createTextNode(fields[f].shortCaption);
  462. cell.appendChild(text);
  463. cell=row.insertCell();
  464. let varValue="UNDEF";
  465. if (vName in setup.filters) varValue=setup.filters[vName];
  466. if (vName in entry) varValue=entry[vName];
  467. if (vType=="date"){
  468. if (varValue==="UNDEF") varValue=new Date();
  469. else varValue=new Date(varValue);
  470. }
  471. if (debug) print(config,"value: "+varValue);
  472. let input;
  473. if (setup.readonlyFlag(vName)){
  474. input=config.document.createTextNode(varValue);
  475. cell.id=setup.getInputId(vName);
  476. }
  477. else{
  478. cell.colSpan="3";
  479. let cellClass="input";
  480. let cellType="text";
  481. if ("lookup" in field){
  482. input = config.document.createElement("select");
  483. }
  484. if (vType=="date"){
  485. input = config.document.createElement("input");
  486. input.type="date";
  487. }
  488. if (vType=="string" && !("lookup" in field)){
  489. if(vName.search("reviewComment")>-1){
  490. input = config.document.createElement("textarea");
  491. input.cols="65";
  492. input.rows="5";
  493. }
  494. else{
  495. input = config.document.createElement("input");
  496. input.type="text";
  497. }
  498. }
  499. if (vType=="float"){
  500. input = config.document.createElement("input");
  501. input.type="text";
  502. }
  503. if (vType=="boolean"){
  504. input = config.document.createElement("input");
  505. input.type="checkbox";
  506. print(config,"Creating checkbox");
  507. }
  508. input.id=setup.getInputId(vName);
  509. if (varValue != "UNDEF"){
  510. if (vType=="string") input.value=varValue;
  511. if (vType=="float") input.value=varValue;
  512. if (vType=="date") input.valueAsDate=varValue;
  513. if (vType=="boolean") input.checked=varValue;
  514. }
  515. }
  516. cell.appendChild(input);
  517. if ("lookup" in field){
  518. let lookup=field["lookup"];
  519. let qconfig=new Object();
  520. if (debug) print(config,"populateTable lookup: Query: "+lookup.queryName);
  521. qconfig.containerPath=config.containerPath;
  522. qconfig.schemaName=lookup.schemaName;
  523. qconfig.queryName=lookup.queryName;
  524. let parameters= new Object();
  525. parameters.elementId=setup.getInputId(vName);
  526. parameters.keyColumn=lookup.keyColumn;
  527. parameters.displayColumn=lookup.displayColumn;
  528. if (vName in setup.filters) parameters.selectedKey=setup.filters[vName];
  529. if (vName in entry) parameters.selectedKey=entry[vName];
  530. if ("showFlag" in additionalData) parameters.additionalData=additionalData;
  531. if (debug) print(config,"Populate select for "+parameters.elementId);
  532. qconfig.success=function(data){
  533. populateSelect(config,data,parameters,setup,setup.readonlyFlag(vName))
  534. };
  535. LABKEY.Query.selectRows(qconfig);
  536. }
  537. }
  538. //add comment field
  539. if (!("addApply" in setup)) {
  540. print(config,"populateTable: done");
  541. return;
  542. }
  543. let row=tb.insertRow();
  544. let th=config.document.createElement('th');
  545. row.appendChild(th);
  546. th.innerHTML=setup.addApply;
  547. let cell=row.insertCell();
  548. //cell.setAttribute("colspan","2");
  549. let input=config.document.createElement("input");
  550. input.type="button";
  551. input.value=setup.addApply;
  552. cell.appendChild(input);
  553. let cell1=row.insertCell();
  554. cell1.setAttribute("colspan","2");
  555. cell1.id=setup.getInputId("rerviewLastSave");
  556. cell1.innerHTML="No recent update";
  557. input.onclick=function(){saveReview(config,data.queryName,cell1.id,setup)};
  558. }
  559. function populateSelect(config,data,parameters,setup,readonlyFlag){
  560. let debug=true;
  561. if (debug)
  562. print(config,"populateSelect on "+data.queryName);
  563. let elementId=parameters.elementId;
  564. let keyColumn=parameters.keyColumn;
  565. let displayColumn=parameters.displayColumn;
  566. if (debug){
  567. print(config,"Query: "+data.queryName);
  568. print(config,"ElementId: "+elementId);
  569. print(config,"keyColumn: "+keyColumn);
  570. print(config,"displayColumn: "+displayColumn);
  571. print(config,"No of options: " +data.rows.length);
  572. if ("selectedKey" in parameters){
  573. print(config,"SelectedKey: "+parameters["selectedKey"]);
  574. }
  575. }
  576. let el = config.document.getElementById(elementId);
  577. if (debug)
  578. print(config,"Element: "+el);
  579. if (!readonlyFlag){
  580. //clear options
  581. for(i = el.options.length; i >= 0; i--) {
  582. el.remove(i);
  583. }
  584. let opt = config.document.createElement("option");
  585. opt.text = "<Select>";
  586. opt.value = -1;
  587. el.options[0] = opt;
  588. if (debug) print(config, "Adding <Select>");
  589. }
  590. for (let i = 0; i < data.rows.length; i++) {
  591. let displayText = data.rows[i][displayColumn];
  592. let keyValue = data.rows[i][keyColumn];
  593. if (!readonlyFlag){
  594. let opt = config.document.createElement("option");
  595. opt.text = displayText;
  596. opt.value = keyValue;
  597. el.options[el.options.length] = opt;
  598. }
  599. if (debug) print(config,"Adding: "+keyValue+" : "+displayText);
  600. let t1=checkVariable(config,el,keyValue,displayText,parameters,"selectedKey",readonlyFlag);
  601. if (t1) setup.keyValue=keyValue;
  602. }
  603. if (!("additionalData" in parameters)) return;
  604. if (debug) print(config,"\n Parsing additional data ");
  605. let additionalData=parameters["additionalData"];
  606. let expId=setup.getInputId(additionalData.showFlag);
  607. if (expId!=elementId) {
  608. print(config,"Element mismatch: got :"+expId+"/"+elementId);
  609. return;
  610. }
  611. if (debug)
  612. print(config,"Setting onChange to "+el.id);
  613. el.onchange=function(){setListVisibility(config,setup,additionalData,readonlyFlag)};
  614. setListVisibility(config,setup,additionalData,readonlyFlag);
  615. }
  616. function checkVariable(config,el,varValue,displayText, parameters,varName,readonlyFlag){
  617. let debug=true;
  618. if (!varName in parameters) return false;
  619. if (debug) print(config,"Comparing: " + varValue + "/" + parameters[varName]);
  620. if (varValue==parameters[varName]){
  621. if (readonlyFlag) el.innerHTML=displayText;
  622. else {
  623. el.selectedIndex=el.options.length-1;
  624. if (debug) print(config,"Equal; "+el.selectedIndex);
  625. }
  626. return true;
  627. }
  628. return false;
  629. }
  630. function failureSelect(config,errorInfo,resp,opt){
  631. print(config,"Error: ");
  632. }
  633. function saveReview(config,queryName,elementId,setup){
  634. let debug=true;
  635. if (debug) print(config,"saveReview: elementId "+elementId+" queryName "+queryName);
  636. let qconfig=new Object();
  637. qconfig.containerPath=config.containerPath;
  638. qconfig.schemaName='lists';//could be made more generic
  639. qconfig.queryName=queryName;
  640. if ("unique" in setup){
  641. qconfig.filterArray=[LABKEY.Filter.create("crfRef",getCRFref(config))];
  642. }
  643. qconfig.success=function(data){saveReviewToList(config,data,elementId,setup);}
  644. //to guess the fields, one must do selectRows first?
  645. LABKEY.Query.selectRows(qconfig);
  646. }
  647. function saveReviewToList(config,data,elementId,setup){
  648. let debug=true;
  649. if (debug) {
  650. let msg="saveReviewToList: "+" elementId "+elementId;
  651. msg+=" nrows "+data.rows.length;
  652. print(config,msg);
  653. }
  654. let useInsert=false;
  655. if (!("unique" in setup)) useInsert=true;
  656. if (data.rows.length==0) useInsert=true;
  657. let entry=new Object();
  658. if (!useInsert){
  659. entry=data.rows[0];
  660. }
  661. entry.crfRef=getCRFref(config);
  662. if (debug) print(config,"Set crfRef="+entry.crfRef);
  663. if ("queryName" in setup.filters) {
  664. entry.queryName=setup.filters["queryName"];
  665. if (debug) print(config,"Setting queryName: "+entry.queryName);
  666. }
  667. if ("queryname" in setup.filters) {
  668. entry.queryname=setup.filters["queryname"];
  669. if (debug) print(config,"Setting queryname: "+entry.queryname);
  670. }
  671. let fields=data.metaData.fields;
  672. for (f in fields){
  673. let field=fields[f];
  674. if (debug) print(config,"saveReview field: "+field.name);
  675. if (field.hidden) continue;
  676. let vName=fields[f].name;
  677. if (vName=="crfRef") continue;
  678. if (vName=="queryName") continue;
  679. if (vName=="queryname") continue;
  680. let eId=setup.getInputId(vName);
  681. let el=config.document.getElementById(eId);
  682. if (!el) {
  683. if (debug) print(config,"saveReview element: "+eId+" not found");
  684. continue;
  685. }
  686. if (debug) print(config,"saveReview element: "+eId);
  687. let vType=fields[f].type;
  688. if (debug) print(config,"vType: "+vType);
  689. if ("lookup" in fields[f]){
  690. if (el.nodeName==="SELECT"){
  691. entry[vName]=el.options[el.selectedIndex].value;
  692. }
  693. if (el.nodeName==="TD"){
  694. entry[vName]=el.innerHTML;
  695. }
  696. print(config,"Setting lookup to "+entry[vName]);
  697. continue;
  698. }
  699. if (vType=="date"){
  700. var date=el.valueAsDate;
  701. if (date==="null") continue;
  702. date.setUTCHours(12);
  703. entry[vName]=date.toString();
  704. print(config,"Setting date to "+entry[vName]);
  705. }
  706. if (vType=="string"){
  707. entry[vName]=el.value;
  708. }
  709. if (vType=="float"){
  710. entry[vName]=el.value;
  711. }
  712. if (vType=="boolean"){
  713. entry[vName]=el.checked;
  714. }
  715. }
  716. let qconfig=new Object();
  717. qconfig.rows=[entry];
  718. qconfig.containerPath=config.containerPath;
  719. qconfig.schemaName=data.schemaName;
  720. qconfig.queryName=data.queryName;
  721. //only update comments
  722. print(config,"modifyRows: useInsert "+useInsert);
  723. qconfig.success=function(data){updateLastSavedFlag(config,data,setup,elementId)};
  724. if (!useInsert){
  725. LABKEY.Query.updateRows(qconfig);
  726. }
  727. else{
  728. LABKEY.Query.insertRows(qconfig);
  729. }
  730. }
  731. function updateLastSavedFlag(config,data,setup,elementId){
  732. let debug=true;
  733. if (debug) print(config,"Update last saved flag to "+elementId);
  734. let el=config.document.getElementById(elementId);
  735. let dt=new Date();
  736. el.innerHTML="Last saved "+dt.toString();
  737. if (data.queryName=="reviewComments"){
  738. updateListDisplay(config,setup.divReviewListId,"reviewComments",setup.filters,true);
  739. }
  740. }
  741. //******************************************upload to database *********************
  742. function onDatabaseUpload(config){
  743. print(config,"Database upload");
  744. configUpload=new Object();
  745. //figure out the participantId
  746. let qconfig=new Object();
  747. qconfig.schemaName="lists";
  748. qconfig.queryName="Forms";
  749. qconfig.filterArray=[LABKEY.Filter.create('Key',config.formId)];
  750. //qconfig.filterArray=[LABKEY.Filter.create('formStatus',1)]
  751. qconfig.success=function(data){afterForms(config,configUpload,data)};
  752. LABKEY.Query.selectRows(qconfig);
  753. }
  754. function afterForms(config,configUpload,data){
  755. let formEntry=data.rows[0];
  756. configUpload.registrationQueryId=formEntry["masterQuery"];
  757. let qconfig=new Object();
  758. qconfig.queryName=config.queryMap[configUpload.registrationQueryId];
  759. //queryMap holds mapping for queries in visit;
  760. //masterQuery should be one of them, so this is safe.
  761. qconfig.schemaName='lists';
  762. qconfig.filterArray=[LABKEY.Filter.create('crfRef',getCRFref(config))];
  763. qconfig.success=function(data){afterRegistration(config,configUpload,data);}
  764. LABKEY.Query.selectRows(qconfig);
  765. //waitForCompleteUpload(config);//
  766. }
  767. function afterRegistration(config,configUpload,data){
  768. print(config,"afterRegistration: rows:"+data.rows.length);
  769. configUpload.registration=data;
  770. let registrationData=configUpload.registration;
  771. clearErr(config);
  772. if (registrationData.rows.length!=1){
  773. let msg="ERROR: Found "+registrationData.rows.length;
  774. msg+=" registration entries for crfrefid "+getCRFref(config);
  775. print(config,msg);
  776. return;
  777. }
  778. configUpload.participantId=
  779. registrationData.rows[0][config.registrationParticipantIdField];
  780. //could be a lookup field
  781. let fields=registrationData.metaData.fields;
  782. let field="NONE";
  783. for (f in fields){
  784. if (fields[f]["name"]==config.registrationParticipantIdField)
  785. field=fields[f];
  786. }
  787. if ("lookup" in field){
  788. let pid=configUpload.participantId;
  789. print(config,"Using lookup for participantId: "+pid);
  790. let lookup=field["lookup"];
  791. print(config,"Lookup: "+lookup);
  792. let qconfig=new Object();
  793. qconfig.containerPath=config.containerPath;
  794. qconfig.schemaName=lookup.schemaName;
  795. qconfig.queryName=lookup.queryName;
  796. qconfig.filterArray=
  797. [LABKEY.Filter.create(lookup.keyColumn,pid)];
  798. qconfig.success=function(data){
  799. afterRegistrationLookup(config,configUpload,data,lookup.displayColumn)};
  800. LABKEY.Query.selectRows(qconfig);
  801. }
  802. else{
  803. afterParticipantId(config,configUpload);
  804. }
  805. }
  806. function afterRegistrationLookup(config,configUpload,data,displayColumn){
  807. print(config,"afterRegistrationLookup");
  808. let entry=data.rows[0];
  809. configUpload.participantId=entry[displayColumn];
  810. afterParticipantId(config,configUpload);
  811. }
  812. function afterParticipantId(config,configUpload){
  813. print(config,"Setting participantId to "+configUpload.participantId);
  814. //another select rows to update all queries from setup
  815. //just use registration for test
  816. let qconfig=new Object();
  817. qconfig.schemaName='lists';
  818. //qconfig.queryName=config.setupQueryName;
  819. qconfig.queryName="FormSetup";
  820. qconfig.filterArray=[LABKEY.Filter.create("formName",config.formId)];
  821. qconfig.success=function(data){afterSetup(config,configUpload,data);}
  822. LABKEY.Query.selectRows(qconfig);
  823. }
  824. function afterSetup(config,configUpload,data){
  825. configUpload.queries=new Array();
  826. for (let i=0;i<data.rows.length;i++){
  827. let entry=data.rows[i];
  828. //use lookup table to convert from id to name
  829. let queryName=config.queryMap[entry.queryName];
  830. configUpload.queries.push({queryName:queryName,queryStatus:"QUEUED"});
  831. if (entry.showQuery=="NONE")
  832. continue
  833. configUpload.queries.push({queryName:entry.showQuery,queryStatus:"QUEUED"});
  834. }
  835. //add reviews
  836. configUpload.queries.push({queryName:"reviewComments",queryStatus:"QUEUED"});
  837. configUpload.queryId=0;
  838. copyToDataset(config,configUpload);
  839. //config.upload["start"]=true;
  840. //for (u in config.upload){
  841. // if (u=="start") continue;
  842. // if (u=="count") continue;
  843. // copyToDataset(config,u,participantId);
  844. //}
  845. //
  846. //print(config,"Database updated");
  847. }
  848. function copyToDataset(config,configUpload){
  849. if (configUpload.queryId==configUpload.queries.length) {
  850. updateFlag(config,3);//Approved
  851. return;
  852. }
  853. let queryName=configUpload.queries[configUpload.queryId].queryName;
  854. print(config,"copyToDataset["+configUpload.queryId+"/"+configUpload.queries.length+"]: "+queryName);
  855. let qconfig=new Object();
  856. qconfig.queryName=queryName;
  857. qconfig.schemaName="lists";
  858. qconfig.filterArray=[LABKEY.Filter.create('crfRef',getCRFref(config))];
  859. qconfig.success=function(data){afterListData(config,configUpload,data)};
  860. LABKEY.Query.selectRows(qconfig);
  861. }
  862. function afterListData(config,configUpload,data){
  863. let queryName=configUpload.queries[configUpload.queryId].queryName;
  864. let msg="["+queryName+"/list]: "+data.rows.length+" entries";
  865. print(config,msg);
  866. configUpload.listData=data;
  867. let qconfig=new Object();
  868. qconfig.queryName=queryName;
  869. qconfig.schemaName="study";
  870. qconfig.filterArray=[LABKEY.Filter.create('crfRef',getCRFref(config))];
  871. qconfig.filterArray.push(LABKEY.Filter.create('ParticipantId',configUpload.participantId));
  872. qconfig.success=function(data){afterStudyData(config,configUpload,data)};
  873. LABKEY.Query.selectRows(qconfig);
  874. }
  875. function afterStudyData(config,configUpload,data){
  876. configUpload.studyData=data;
  877. let queryName=configUpload.queries[configUpload.queryId].queryName;
  878. let msg="["+queryName+"/study]: "+data.rows.length+" entries";
  879. print(config,msg);
  880. let listRows=configUpload.listData.rows;
  881. //skip uploading an empty set
  882. if (listRows.length==0){
  883. printErr(config,"List "+queryName+" empty.");
  884. configUpload.queries[configUpload.queryId].queryStatus="DONE";
  885. configUpload.queryId+=1;
  886. copyToDataset(config,configUpload);
  887. return;
  888. }
  889. let studyRows=configUpload.studyData.rows;
  890. for (let i=0;i<studyRows.length;i++){
  891. let entry=studyRows[i];
  892. if (! (i<listRows.length) ) continue;
  893. let entryList=listRows[i];
  894. //keeps study only variables (ParticipantId, SequenceNum)
  895. for (let f in entryList) {
  896. entry[f]=entryList[f];
  897. print(config,"Copying ["+f+"]: "+entry[f]+"/"+entryList[f]);
  898. }
  899. }
  900. if (studyRows.length>0) {
  901. let qconfig=new Object();
  902. qconfig.queryName=queryName;
  903. qconfig.schemaName="study";
  904. qconfig.rows=studyRows;
  905. qconfig.success=function(data){afterStudyUpload(config,configUpload,data);}
  906. LABKEY.Query.updateRows(qconfig)
  907. }
  908. else{
  909. let data=new Object();
  910. data.rows=new Array();
  911. afterStudyUpload(config,configUpload,data);
  912. }
  913. }
  914. function afterStudyUpload(config,configUpload,data){
  915. let queryName=configUpload.queries[configUpload.queryId].queryName;
  916. printErr(config,"Updated "+data.rows.length+" rows to "+queryName);
  917. let studyRows=configUpload.studyData.rows;
  918. let listRows=configUpload.listData.rows;
  919. let rows=new Array();
  920. //also updating existing rows, if they exist
  921. for (let i=studyRows.length;i<listRows.length;i++){
  922. let entry=listRows[i];
  923. entry.ParticipantId=configUpload.participantId;
  924. entry.crfRef=getCRFref(config);
  925. entry.SequenceNum=getCRFref(config);
  926. entry.SequenceNum=entry.SequenceNum % 1000000000;
  927. if (listRows.length>1){
  928. entry.SequenceNum+=i/100;
  929. }
  930. print(config, "Adding sequence number "+entry.SequenceNum);
  931. rows.push(entry);
  932. }
  933. if (rows.length>0){
  934. let qconfig=new Object();
  935. qconfig.queryName=queryName;
  936. qconfig.schemaName="study";
  937. qconfig.success=function(data){
  938. afterListUpload(config,configUpload,data)};
  939. qconfig.rows=rows;
  940. LABKEY.Query.insertRows(qconfig);
  941. }
  942. else{
  943. let data=new Object();
  944. data.rows=rows;
  945. afterListUpload(config,configUpload,data);
  946. }
  947. }
  948. function afterListUpload(config,configUpload,data){
  949. let queryName=configUpload.queries[configUpload.queryId].queryName;
  950. printErr(config,"Inserted "+data.rows.length+" rows to "+queryName);
  951. configUpload.queries[configUpload.queryId].queryStatus="DONE";
  952. configUpload.queryId+=1;
  953. copyToDataset(config,configUpload);
  954. }
  955. //*************************update for further review *************************
  956. function onUpdateForReview(config){
  957. updateFlag(config,4);//Pending review
  958. }
  959. function updateFlag(config,flag){
  960. if (flag==4)
  961. print(config,"Sent to further review");
  962. let qconfig=new Object();
  963. qconfig.schemaName='lists';
  964. qconfig.queryName='crfEntry';
  965. qconfig.success=function(data){setFlag(config,data,flag);}
  966. qconfig.filterArray=[LABKEY.Filter.create("entryId",getCRFref(config))];
  967. LABKEY.Query.selectRows(qconfig);
  968. }
  969. function setFlag(config,data,flag){
  970. let debug=true;
  971. if (flag==4) print(config,"setFlagToReview");
  972. if (data.rows.length!=1){
  973. let msg="ERROR: Found "+data.rows.length;
  974. msg+=" entries for crfrefid "+getCRFref(config);
  975. print(config,msg);
  976. return;
  977. }
  978. let entry=data.rows[0];
  979. entry.FormStatus=flag;//Pending Review
  980. if (debug)
  981. print(config,"Set form status to "+entry.FormStatus);
  982. let qconfig=new Object();
  983. qconfig.schemaName='lists';
  984. qconfig.queryName='crfEntry';
  985. qconfig.rows=[entry];
  986. qconfig.success=function(data){completeWithFlag(config,data,flag);}
  987. LABKEY.Query.updateRows(qconfig);
  988. }
  989. function completeWithFlag(config,data,flag){
  990. let debug=true;
  991. if (debug){
  992. if (flag==4) print(config,"complete with review");
  993. }
  994. redirect(config);
  995. }
  996. //************************************************ submit *******************************************
  997. function onSubmit(config){
  998. let debug=true;
  999. hideErr(config);
  1000. clearErr(config);
  1001. printErr(config,"onSubmit");
  1002. checkForm(config);
  1003. let cb=new Object();
  1004. cb.success=finalValidation;
  1005. cb.failure=function(config){printErr(config,"waitForCheckForm failed")};
  1006. waitForCheckForm(config,cb);
  1007. }
  1008. function finalValidation(config){
  1009. let debug=true;
  1010. if (debug) print(config,"validate");
  1011. let completed=true;
  1012. for (f in config.fields){
  1013. let field=config.fields[f];
  1014. if (field.status!="DONE") {
  1015. printErr(config,"Missing entry for "+field.title);
  1016. completed=false;
  1017. }
  1018. }
  1019. if (debug) print(config,"valid: "+completed);
  1020. if (completed){
  1021. finalRedirect(config);
  1022. }
  1023. else{
  1024. let el=document.getElementById(config.submitReportId);
  1025. el.innerHTML="Form invalid";
  1026. }
  1027. }
  1028. function finalRedirect(config){
  1029. printErr(config,"Form valid");
  1030. let c1=new Object();
  1031. c1.schemaName='lists';
  1032. c1.queryName='crfEntry';
  1033. c1.filterArray=[LABKEY.Filter.create('entryId',getCRFref(config))];
  1034. c1.success=function(data){uploadData(config,data)};
  1035. LABKEY.Query.selectRows(c1);
  1036. }
  1037. function uploadData(config,data){
  1038. let entry=data.rows[0];
  1039. entry.formStatus=2;//Submitted
  1040. let el=document.getElementById(config.submitReportId);
  1041. el.innerHTML="Submitting form";
  1042. let c1=new Object();
  1043. c1.schemaName=data.schemaName;
  1044. c1.queryName=data.queryName;
  1045. c1.containerPath=config.containerPath;
  1046. c1.rows=[entry];
  1047. //close window upon success
  1048. c1.success=function(data){redirect(config)};
  1049. LABKEY.Query.updateRows(c1);
  1050. }
  1051. function hideErr(config){
  1052. let el=config.document.getElementById("errorDiv");
  1053. el.style.display="none";
  1054. }
  1055. function clearErr(config){
  1056. let el=config.document.getElementById("errorTxt");
  1057. el.value="";
  1058. }
  1059. function showErr(config){
  1060. let el=config.document.getElementById("errorDiv");
  1061. el.style.display="block";
  1062. }
  1063. function printErr(config,msg){
  1064. showErr(config);
  1065. el=config.document.getElementById("errorTxt");
  1066. el.style.color="red";
  1067. el.value+="\n"+msg;
  1068. }
  1069. function checkForm(config){
  1070. let debug=false;
  1071. let crfRef=getCRFref(config)
  1072. config.status="UNKNOWN";
  1073. for (f in config.fields){
  1074. let field=config.fields[f];
  1075. field.status="UNKNOWN";
  1076. if (debug)
  1077. print(config,"Setting status for "+f+" to "+ field.status);
  1078. let selectRows=new Object();
  1079. selectRows.containerPath=config.containerPath;
  1080. selectRows.schemaName="lists";
  1081. selectRows.queryName=f;
  1082. selectRows.filterArray=[LABKEY.Filter.create('crfRef',crfRef)];
  1083. selectRows.success=function(data){checkData(data,config)};
  1084. selectRows.failure=function(errorObj){print(config,"checkData failed.")};
  1085. LABKEY.Query.selectRows(selectRows);
  1086. }
  1087. }
  1088. function waitForCheckForm(config,cb){
  1089. let debug=true;
  1090. if (!("i" in config)) config.i=0;
  1091. if (debug) print(config,"["+config.i+"] checkForm status "+config.status);
  1092. if (config.i>100) {
  1093. if (debug) print(config,"executing failure");
  1094. cb.failure(config);
  1095. return;
  1096. }
  1097. if (config.status=="DONE") {
  1098. if (debug) print(config,"executing success");
  1099. cb.success(config);
  1100. if (debug) print(config,"success executed");
  1101. return;
  1102. }
  1103. config.i+=1;
  1104. setTimeout(function(){waitForCheckForm(config,cb);},1000);
  1105. }
  1106. function checkData(data,config){
  1107. let debug=false;
  1108. if (debug) print(config,"checkData ");
  1109. let field=config.fields[data.queryName];
  1110. field.status="NONE";
  1111. if (debug) print(config,"Setting status for "+data.queryName+" to "+field.status);
  1112. if (data.rows.length>0)
  1113. field.status="DONE";
  1114. if (debug)
  1115. print(config,"checkData set status for "+data.queryName+" to "+field.status);
  1116. for (f in config.fields){
  1117. let subField=config.fields[f];
  1118. if (debug)
  1119. print(config,"checkData status["+f+"]: "+subField.status);
  1120. if (subField.status=="UNKNOWN") {
  1121. if (debug) print(config,"\t Status for "+f+" not set ["+ subField.status+"]");
  1122. return;
  1123. }
  1124. }
  1125. config.status="DONE";
  1126. }
  1127. //**************************************************
  1128. //
  1129. function onRemoveCRF(config){
  1130. let debug=true;
  1131. if (debug){
  1132. print(config,"Removing CRF");
  1133. }
  1134. let selectRows=new Object();
  1135. selectRows.containerPath=config.containerPath;
  1136. selectRows.schemaName="lists";
  1137. selectRows.queryName="inputLists";
  1138. selectRows.success=function(data){afterInputLists(data,config)};
  1139. LABKEY.Query.selectRows(selectRows);
  1140. }
  1141. function afterInputLists(data,config){
  1142. let debug=true;
  1143. if (debug)
  1144. print(config,"After input lists");
  1145. config.inputLists=data;
  1146. config.inputListsIterator=0;
  1147. removeCRFLoop(config);
  1148. }
  1149. function removeCRFLoop(config){
  1150. let debug=true;
  1151. let i=config.inputListsIterator;
  1152. if (debug)
  1153. print(config,"removeCRFLoop ["+i+"/"+config.inputLists.rows.length+"]");
  1154. if (i>config.inputLists.rows.length)
  1155. //return;
  1156. redirect(config);
  1157. let queryName="crfEntry";
  1158. let idVar="entryId";
  1159. if (i<config.inputLists.rows.length){
  1160. queryName=config.inputLists.rows[i].queryName;
  1161. idVar="crfRef";
  1162. }
  1163. if (debug)
  1164. print(config,"["+i+"/"+config.inputLists.rows.length+"] "+queryName+"/"+idVar);
  1165. let selectRows=new Object();
  1166. selectRows.containerPath=config.containerPath;
  1167. selectRows.schemaName="lists";
  1168. selectRows.queryName=queryName;
  1169. selectRows.filterArray=[LABKEY.Filter.create(idVar,getCRFref(config))];
  1170. selectRows.success=function(data){removeListCRF(data,config)};
  1171. LABKEY.Query.selectRows(selectRows);
  1172. }
  1173. function removeListCRF(data,config){
  1174. let debug=true;
  1175. if (debug)
  1176. print(config,data.queryName+": "+data.rows.length);
  1177. config.inputListsIterator+=1;
  1178. if (data.rows.length==0){
  1179. removeCRFLoop(config);
  1180. return;
  1181. }
  1182. let deleteRows=new Object();
  1183. deleteRows.containerPath=config.containerPath;
  1184. deleteRows.schemaName=data.schemaName;
  1185. deleteRows.queryName=data.queryName;
  1186. deleteRows.success=function(data){removeCRFLoop(config)};
  1187. deleteRows.rows=data.rows;
  1188. LABKEY.Query.deleteRows(deleteRows);
  1189. }
  1190. function redirect(config){
  1191. let formUrl="begin";
  1192. var params = {
  1193. "name": formUrl, // The destination wiki page. The name of this parameter is not arbitrary.
  1194. };
  1195. let containerPath= config.containerPath;
  1196. // This changes the page after building the URL.
  1197. //Note that the wiki page destination name is set in params.
  1198. var homeURL = LABKEY.ActionURL.buildURL("project", formUrl , containerPath, params);
  1199. print(config,"Redirecting to "+homeURL);
  1200. window.location = homeURL;
  1201. }
  1202. function generateMasterForm(config){
  1203. generateDebugSection(config);
  1204. let debug=true;
  1205. if (debug)
  1206. print(config,"generateMasterForm");
  1207. let selectRows=new Object();
  1208. selectRows.containerPath=config.containerPath;
  1209. selectRows.schemaName='lists';
  1210. selectRows.queryName='crfEntry';
  1211. selectRows.filterArray=[LABKEY.Filter.create('entryId',getCRFref(config))];
  1212. selectRows.success=function(data){populateBasicData(config,data)};
  1213. //requires populateBasicData
  1214. LABKEY.Query.selectRows(selectRows);
  1215. config.fields=new Object();
  1216. config.queryMap=new Object();
  1217. let configSelectRows=new Object();
  1218. configSelectRows.containerPath=config.containerPath;
  1219. configSelectRows.schemaName='lists';
  1220. configSelectRows.queryName=config.setupQueryName;
  1221. //this is new
  1222. configSelectRows.queryName="FormSetup";
  1223. configSelectRows.filterArray=[LABKEY.Filter.create("formName",config.formId)];
  1224. configSelectRows.success=function(data){generateForm(config,data);};
  1225. configSelectRows.failure=onFailure;//function(errorTxt){print(config,"generateForm fail" + errorTxt)};
  1226. LABKEY.Query.selectRows(configSelectRows);
  1227. if (debug)
  1228. print(config,"Generating buttons");
  1229. //requires onSubmit
  1230. if ("reviewMode" in config){
  1231. if (config.reviewMode=="REVIEW"){
  1232. generateButton(config,"submitDiv","Complete submission","Upload to database",onDatabaseUpload,config);
  1233. generateButton(config,"submitDiv","Review submission","Ask for further review",onUpdateForReview,config);
  1234. generateButton(config,"submitDiv","Remove submission","Remove CRF form",onRemoveCRF,config);
  1235. }
  1236. if (config.reviewMode=="APPROVED"){
  1237. generateButton(config,"submitDiv","Review submission","Restore form for further review",onUpdateForReview,config);
  1238. }
  1239. }
  1240. else{
  1241. generateButton(config,"submitDiv","Complete submission","Submit",onSubmit,config);
  1242. generateButton(config,"submitDiv","Remove submission","Remove CRF form",onRemoveCRF,config);
  1243. }
  1244. generateButton(config,"submitDiv","Done","Exit",redirect,config);
  1245. }