formPortal.js 14 KB

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