formPortal.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. function print(config, msg){
  2. config.document.getElementById(config.debugArea).value+="\n"+msg;
  3. }
  4. function clear(config){
  5. config.document.getElementById(config.debugArea).value="";
  6. }
  7. function getMode(config){
  8. if ("reviewMode" in config){
  9. return config.reviewMode;
  10. }
  11. return "EDIT";
  12. }
  13. function userName(formConfig,id){
  14. for (let i=0;i<formConfig.users.rows.length;i++){
  15. if (formConfig.users.rows[i].UserId!=id)
  16. continue;
  17. return formConfig.users.rows[i].DisplayName;
  18. }
  19. return "NONE";
  20. }
  21. function generateFormArray(config){
  22. print(config,"generateFormArray "+getMode(config));
  23. let formConfig=new Object();
  24. let qconfig=new Object();
  25. qconfig.schemaName="lists";
  26. qconfig.queryName="Forms";
  27. //qconfig.filterArray=[LABKEY.Filter.create('formStatus',1)]
  28. qconfig.success=function(data){afterPopulatingForms(config,formConfig,data)};
  29. LABKEY.Query.selectRows(qconfig);
  30. }
  31. function afterPopulatingForms(config,formConfig,data){
  32. formConfig.dataForms=data;
  33. print(config,"afterPopulatingForms");
  34. print(config,"Number of forms: "+formConfig.dataForms.rows.length);
  35. let qconfig=new Object();
  36. qconfig.schemaName="core";
  37. qconfig.queryName="users";
  38. qconfig.success=function(data){afterPopulatingUsers(config,formConfig,data)};
  39. LABKEY.Query.selectRows(qconfig);
  40. }
  41. function afterPopulatingUsers(config,formConfig,data){
  42. formConfig.users=data;
  43. print(config,"afterPopulatingUsers");
  44. print(config,"Number of users: "+formConfig.users.rows.length);
  45. let qconfig=new Object();
  46. qconfig.schemaName="lists";
  47. qconfig.queryName="inputLists";
  48. qconfig.success=function(data){afterPopulatingLists(config,formConfig,data)};
  49. LABKEY.Query.selectRows(qconfig);
  50. }
  51. function afterPopulatingLists(config,formConfig,data){
  52. formConfig.inputLists=data;
  53. print(config,"afterPopulatingLists");
  54. print(config,"Number of lists: "+formConfig.inputLists.rows.length);
  55. let qconfig=new Object();
  56. qconfig.schemaName="study";
  57. qconfig.queryName="Study";
  58. qconfig.success=function(data){afterPopulatingStudyData(config,formConfig,data)};
  59. LABKEY.Query.selectRows(qconfig);
  60. }
  61. function afterPopulatingStudyData(config,formConfig,data){
  62. formConfig.studyData=data;
  63. print(config,"afterPopulatingStudyData");
  64. print(config,"Number of study data entries: "+formConfig.studyData.rows.length);
  65. let qconfig=new Object();
  66. qconfig.schemaName="study";
  67. let demographicDataId=formConfig.dataForms.rows[0].masterQuery;
  68. let demographicDataQuery="NONE";
  69. for (let i=0;i<formConfig.inputLists.rows.length;i++){
  70. let entry=formConfig.inputLists.rows[i];
  71. print(config,"inputList ["+i+"] ["+entry.Key+"] "+entry.queryName);
  72. if (entry.Key==demographicDataId){
  73. demographicDataQuery=entry.queryName;
  74. break;
  75. }
  76. }
  77. print(config,'Setting demographic query to '+demographicDataQuery);
  78. qconfig.queryName=demographicDataQuery;
  79. //qconfig.queryName="demographicData";
  80. qconfig.success=function(data){afterPopulatingDemographicData(config,formConfig,data)};
  81. LABKEY.Query.selectRows(qconfig);
  82. }
  83. function afterPopulatingDemographicData(config,formConfig,data){
  84. formConfig.demographicData=data;
  85. print(config,"afterPopulatingDemographic");
  86. print(config,"Number of patients: "+formConfig.demographicData.rows.length);
  87. let qconfig=new Object();
  88. qconfig.schemaName="lists";
  89. qconfig.queryName="crfEditors";
  90. qconfig.success=function(data){afterPopulatingCrfEditors(config,formConfig,data)};
  91. LABKEY.Query.selectRows(qconfig);
  92. }
  93. function afterPopulatingCrfEditors(config,formConfig,data){
  94. formConfig.crfEditors=data;
  95. print(config,"afterPopulatingCrfEditors");
  96. print(config,"Number of CRF editors: "+formConfig.crfEditors.rows.length);
  97. let qconfig=new Object();
  98. qconfig.schemaName="lists";
  99. qconfig.queryName="crfReviewers";
  100. qconfig.success=function(data){afterPopulatingCrfReviewers(config,formConfig,data)};
  101. LABKEY.Query.selectRows(qconfig);
  102. }
  103. function afterPopulatingCrfReviewers(config,formConfig,data){
  104. formConfig.crfReviewers=data;
  105. print(config,"afterPopulatingCrfReviewers");
  106. print(config,"Number of CRF reviewerrs: "+formConfig.crfReviewers.rows.length);
  107. let qconfig=new Object();
  108. qconfig.schemaName="lists";
  109. qconfig.queryName="crfManagers";
  110. qconfig.success=function(data){afterPopulatingCrfManagers(config,formConfig,data)};
  111. LABKEY.Query.selectRows(qconfig);
  112. }
  113. function afterPopulatingCrfManagers(config,formConfig,data){
  114. formConfig.crfManagers=data;
  115. print(config,"afterPopulatingCrfManagers");
  116. print(config,"Number of CRF managers: "+formConfig.crfManagers.rows.length);
  117. let qconfig=new Object();
  118. qconfig.schemaName="lists";
  119. qconfig.queryName="FormStatus";
  120. qconfig.success=function(data){afterPopulatingFormStatus(config,formConfig,data)};
  121. LABKEY.Query.selectRows(qconfig);
  122. }
  123. function afterPopulatingFormStatus(config,formConfig,data){
  124. formConfig.formStatus=data;
  125. print(config,"afterPopulatingFormStatus");
  126. print(config,"Number of states in FormStatus: "+formConfig.formStatus.rows.length);
  127. formConfig.table=config.document.createElement("table");
  128. config.document.getElementById(config.div).appendChild(formConfig.table);
  129. let qconfig=new Object();
  130. qconfig.schemaName="lists";
  131. qconfig.queryName="crfEntry";
  132. let visibleLevel="crfEditor";
  133. if ("reviewMode" in config) {
  134. if (config.reviewMode=="REVIEW")
  135. visibleLevel="crfReviewer";
  136. else
  137. visibleLevel="crfManager";
  138. }
  139. let formStatusValue="";
  140. for (let i=0;i<formConfig.formStatus.rows.length;i++){
  141. if (formConfig.formStatus.rows[i].visibleLevel==visibleLevel){
  142. if (formStatusValue.length>0) formStatusValue+=";";
  143. formStatusValue+=String(formConfig.formStatus.rows[i].Key);
  144. }
  145. }
  146. //if ("review" in config) formStatusValue="2";//Submitted
  147. qconfig.filterArray=[LABKEY.Filter.create('formStatus',formStatusValue,LABKEY.Filter.Types.IN)];
  148. let currentUser=LABKEY.Security.currentUser.id;
  149. if ("reviewMode" in config){
  150. let userList=formConfig.crfReviewers;
  151. if (config.reviewMode=="APPROVED")
  152. userList=formConfig.crfManagers;
  153. let reviewer=0;
  154. for (let i=0;i<userList.rows.length;i++){
  155. if (userList.rows[i].User!=currentUser)
  156. continue;
  157. reviewer=1;
  158. break;
  159. }
  160. print(config,"reviewer "+reviewer);
  161. if (reviewer==0) return;
  162. }
  163. else{
  164. //this only allows users to modify forms they have created
  165. //qconfig.filterArray.push(LABKEY.Filter.create('UserId',currentUser));
  166. //sometimes all people from reviewer list are allowed to complete each other's forms interchangeably
  167. let userListX="";
  168. for (let i=0;i<formConfig.crfEditors.rows.length;i++){
  169. userId=formConfig.crfEditors.rows[i]['User'];
  170. if (i>0) userListX+=";";
  171. userListX+=String(userId);
  172. }
  173. qconfig.filterArray.push(
  174. LABKEY.Filter.create('UserId',userListX,LABKEY.Filter.Types.IN));
  175. }
  176. qconfig.success=function(data){afterPopulatingEntries(config,formConfig,data)};
  177. LABKEY.Query.selectRows(qconfig);
  178. }
  179. function afterPopulatingEntries(config,formConfig,data){
  180. formConfig.formData=data;
  181. let dataForms=formConfig.dataForms;
  182. let table=formConfig.table;
  183. print(config,"afterPopulatingEntries");
  184. print(config,"Forms: "+dataForms.rows.length);
  185. print(config,"InProgress: "+data.rows.length);
  186. for (let i=0;i<dataForms.rows.length; i++){
  187. let formKey=dataForms.rows[i].Key;
  188. //print(config,"Key: "+formKey);
  189. //figure out master query name
  190. let masterQuery="NONE";
  191. let mID=dataForms.rows[i].masterQuery;
  192. print(config,"Setting master query: "+mID);
  193. for (let i2=0;i2<formConfig.inputLists.rows.length;i2++){
  194. //queryName
  195. if (formConfig.inputLists.rows[i2].Key!=mID)
  196. continue;
  197. masterQuery=formConfig.inputLists.rows[i2].queryName;
  198. print(config,"Setting master query "+masterQuery);
  199. break;
  200. }
  201. let row=table.insertRow(i);
  202. let formName=dataForms.rows[i].formName;
  203. let k=0;
  204. for (let j=0;j<data.rows.length;j++){
  205. let formId=data.rows[j].Form;
  206. //print(config,"Row["+j+"] formId: "+formId);
  207. if (formId!=formKey)
  208. continue;
  209. //insert form
  210. let fbox=config.document.createElement("div");
  211. fbox.classList.add("box","gold");
  212. let fp=config.document.createElement("p");
  213. let id=data.rows[j].entryId;
  214. fp.innerHTML=id;
  215. //it would be great if this were patientId if available
  216. //fp.classList.add("large","center");
  217. fp.classList.add("center");
  218. fbox.appendChild(fp);
  219. let fp1=config.document.createElement("p");
  220. let user="NONE";
  221. for (let ii=0;ii<formConfig.users.rows.length;ii++){
  222. if (formConfig.users.rows[ii].UserId!=data.rows[j].UserId)
  223. continue;
  224. user=formConfig.users.rows[ii].DisplayName;
  225. break;
  226. }
  227. fp1.innerHTML=user;
  228. fp1.classList.add("center");
  229. fbox.appendChild(fp1);
  230. let fp2=config.document.createElement("p");
  231. fp2.innerHTML=formName;
  232. fp2.classList.add("center");
  233. fbox.appendChild(fp2);
  234. let fp3=config.document.createElement("p");
  235. fp3.id="pid"+id;
  236. fp3.innerHTML="NONE";
  237. if (masterQuery!="NONE"){
  238. let qconfig=new Object();
  239. qconfig.schemaName='lists';
  240. qconfig.queryName=masterQuery;
  241. qconfig.filterArray=[LABKEY.Filter.create('crfRef',id)];
  242. qconfig.success=function(data){setPatientId(config,formConfig,data,fp3.id);}
  243. LABKEY.Query.selectRows(qconfig);
  244. }
  245. fp3.classList.add("center");
  246. fbox.appendChild(fp3);
  247. let cell=row.insertCell(k);
  248. cell.classList.add("stretch");
  249. cell.id="box"+data.rows[j].crfRef;
  250. let button=config.document.createElement("button");
  251. button.appendChild(fbox);
  252. button.onclick=function(){openForm(config,formConfig,id,undefined)};
  253. cell.appendChild(button);
  254. k++;
  255. }
  256. if ("reviewMode" in config) continue;
  257. let fbox=config.document.createElement("div");
  258. fbox.classList.add("box","red");
  259. let fp=config.document.createElement("p");
  260. fp.innerHTML="Create new";
  261. fbox.appendChild(fp);
  262. let fp2=config.document.createElement("p");
  263. fp2.innerHTML=formName;
  264. fp2.classList.add("center");
  265. fbox.appendChild(fp2);
  266. let cell=row.insertCell(k);
  267. cell.classList.add("stretch");
  268. let button=config.document.createElement("button");
  269. button.appendChild(fbox);
  270. button.onclick=function(){createForm(config,formConfig,formKey)};
  271. cell.appendChild(button);
  272. }
  273. }
  274. function setPatientId(config,formConfig,data,id){
  275. if (data.rows.length==0) return;
  276. let participantCode=data.rows[0].participantCode;
  277. for (let i=0;i<formConfig.demographicData.rows.length;i++){
  278. let entry=formConfig.demographicData.rows[i];
  279. let key=entry.lsid;
  280. if (key!=participantCode) continue;
  281. let participantId=entry.ParticipantId;
  282. config.document.getElementById(id).innerHTML=participantId;
  283. break;
  284. }
  285. }
  286. function openForm(config,formConfig,crfRef, crfEntry){
  287. print(config,"Clicked for "+crfRef);
  288. if (crfEntry==undefined){
  289. for (let i=0;i<formConfig.formData.rows.length;i++){
  290. if (formConfig.formData.rows[i].entryId!=crfRef) continue;
  291. print(config,"Setting "+formConfig.formData.rows[i].entryId);
  292. crfEntry=formConfig.formData.rows[i];
  293. break;
  294. }
  295. }
  296. if (crfEntry==undefined) return;
  297. let formEntry=undefined;
  298. let formId=crfEntry.Form;
  299. for (let i=0;i<formConfig.dataForms.rows.length;i++){
  300. if (formConfig.dataForms.rows[i].Key!=formId) continue;
  301. print(config,"Setting form "+formConfig.dataForms.rows[i].formName);
  302. formEntry=formConfig.dataForms.rows[i];
  303. break;
  304. }
  305. if (formEntry==undefined) return;
  306. //select between review and view
  307. //let formUrl=formEntry["formUrl"];
  308. //if ("reviewMode" in config) formUrl=formEntry["reviewFormUrl"];
  309. //print(config,"Setting url "+formUrl);
  310. //direct all to the same html
  311. let formUrl="visit";
  312. reviewMode="EDIT";
  313. if ("reviewMode" in config) reviewMode=config.reviewMode;
  314. let params = {
  315. "name": formUrl,
  316. // The destination wiki page. The name of this parameter is not arbitrary.
  317. "userid": crfEntry.UserId,
  318. "entryId": crfRef,
  319. "registrationQueryId":formEntry["masterQuery"],
  320. "reviewMode":reviewMode,
  321. "formId":formId,
  322. "formName":formEntry["formName"]
  323. };
  324. //"formSetupQuery":formEntry["setupQuery"],
  325. let containerPath= LABKEY.ActionURL.getContainer();
  326. // This changes the page after building the URL.
  327. //Note that the wiki page destination name is set in params.
  328. var wikiURL = LABKEY.ActionURL.buildURL("crf", formUrl , containerPath, params);
  329. print(config,"Redirecting to "+wikiURL);
  330. window.location = wikiURL;
  331. }
  332. function createForm(config,formConfig,formId){
  333. print(config,"Create form w/id "+formId);
  334. let crfEntry=new Object();
  335. crfEntry.entryId=Date.now();
  336. crfEntry["Date"]=new Date();
  337. crfEntry.formStatus=1;//In progress
  338. //set other variables
  339. //requires studyData as part of formConfig
  340. let studyData=formConfig.studyData.rows[0];
  341. crfEntry.EudraCTNumber=studyData.EudraCTNumber;
  342. crfEntry.StudyCoordinator=studyData.StudyCoordinator;
  343. crfEntry.StudySponsor=studyData.StudySponsor;
  344. crfEntry.RegulatoryNumber=studyData.RegulatoryNumber;
  345. crfEntry.UserId=LABKEY.Security.currentUser.id;
  346. //requires crfEditors as part of formConfig
  347. for (let i=0;i<formConfig.crfEditors.rows.length;i++){
  348. print(config,"Checking user "+formConfig.crfEditors.rows[i].User);
  349. if (formConfig.crfEditors.rows[i].User!=crfEntry.UserId) continue;
  350. print(config,"Found user");
  351. crfEntry.Site=formConfig.crfEditors.rows[i].Site;
  352. print(config,"Setting site to id="+crfEntry.Site);
  353. break;
  354. }
  355. //from argument list
  356. crfEntry.Form=formId;
  357. let qconfig=new Object();
  358. qconfig.schemaName='lists';
  359. qconfig.queryName='crfEntry';
  360. qconfig.success=function(data){openForm(config,formConfig,crfEntry.entryId,crfEntry)};
  361. qconfig.rows=[crfEntry];
  362. LABKEY.Query.insertRows(qconfig);
  363. }