formPortal.js 13 KB

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