formPortalNew.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. var formPortal={};
  2. formPortal.setDebug=
  3. function(debug=null){
  4. if (debug){
  5. this.print=function(msg){debug.print(msg);};
  6. this.clear=function(){debug.clear();}
  7. return;
  8. }
  9. //provide default functions if not debug object is available
  10. this.print=function(msg){console.log(msg);}
  11. this.clear=function(){;}
  12. }
  13. formPortal.setDebug();
  14. formPortal.doNothing=
  15. function(){
  16. this.print('doNothing called');
  17. }
  18. //load runQuery.js
  19. formPortal.printMessage=
  20. function(msg){
  21. crfHTML.createParagraph(msg,'formDiv')
  22. }
  23. formPortal.init=
  24. function(cb=null){
  25. let that=this;
  26. let action=function(){that.scriptsLoaded(cb);};
  27. LABKEY.Utils.requiresScript(["crf/runQuery.js","crf/formGenerator.js","crf/crfRoleSelector.js","crf/crfSetup.js","crf/crfData.js","crf/crfHTML.js"],action);
  28. }
  29. formPortal.scriptsLoaded=
  30. function(cb=null){
  31. crfHTML.init();
  32. crfRoleSelector.set(crfSetup);
  33. crfData.setSetup(crfSetup);
  34. let initGenerator=function(){formGenerator.init(cb);};
  35. let initData=function(){crfData.init(initGenerator);};
  36. crfSetup.init(initData);
  37. }
  38. formPortal.generateFormArray=
  39. function(){
  40. let fName='[generateFormArray]';
  41. this.print(fName);
  42. this.print(fName);
  43. let that=this;
  44. let action=function(){that.afterSetup();};
  45. let parseSetup=function(){crfSetup.parseSetup(action);};
  46. crfSetup.setContainers(parseSetup);
  47. }
  48. formPortal.filterEntry=
  49. function(entry,filter){
  50. let fName="[filterEntry]";
  51. //this.print(fName+' candidate '+entry.entryId);
  52. if (entry.Form!=filter.form)
  53. return false;
  54. //only select forms where status matches the target status
  55. if (entry.FormStatus!=filter.formStatus){
  56. return false;
  57. }
  58. if (crfSetup.getSettings("filterUser") && filter.role=='crfEditor' && entry.UserId!=filter.userId){
  59. //this.print(fName+' skipping identity mismatch: '+entry.UserId+'/'+filter.userId);
  60. return false;
  61. }
  62. if (crfSetup.getSettings("filterSite") && entry.Site!=filter.siteNumber){
  63. //this.print(fName+' skipping site mismatch: '+entry.Site+'/'+filter.siteNumber);
  64. return false;
  65. }
  66. return true;
  67. }
  68. formPortal.afterSetup=
  69. function(){
  70. let fName='[afterSetup]';
  71. this.print(fName);
  72. let that=this;
  73. let cb=function(){that.updateForms();};
  74. crfRoleSelector.makePortal(cb);
  75. this.table=crfHTML.createTable('formDiv');
  76. }
  77. formPortal.updateForms=
  78. function(){
  79. //this is normallz callback on role selector
  80. roleAndSite=crfRoleSelector.getRoleAndSite();
  81. this.drawForms(roleAndSite);
  82. }
  83. formPortal.drawForms=
  84. function(roleAndSite=null){
  85. let fName="[drawForms]";
  86. if (!roleAndSite){
  87. alert("Please set role and site");
  88. return false;
  89. }
  90. //set filter
  91. let ar=roleAndSite.split(":");
  92. let role=ar[0];
  93. let filter=new Object();
  94. filter.role=role;
  95. filter.siteNumber=ar[1];
  96. filter.userId=LABKEY.Security.currentUser.id;
  97. let accessModeColumn=filter.role+'Status';
  98. let formRows=crfSetup.getRows('dataForms');
  99. //browse through forms
  100. let fEntries=crfSetup.getRows('crfEntries');
  101. this.print(fName+' all entries '+fEntries.length);
  102. for (let i=0;i<formRows.length;i++){
  103. //dataForms is Forms
  104. let formEntry=formRows[i];
  105. let formId=formEntry['Key'];
  106. //set the status for form
  107. filter.formStatus=formEntry[accessModeColumn];
  108. this.print(fName+' target formStatus ['+formEntry['formName']+'] '+filter.formStatus);
  109. //add row for each form
  110. let row=this.table.rows[i];
  111. if (!row) row=this.table.insertRow(i);
  112. let labelCell=row.cells[0];
  113. let formName=formEntry['formName'];
  114. if (!labelCell){
  115. labelCell=row.insertCell();
  116. labelCell.innerText=formName;
  117. crfHTML.addStyle(labelCell,'medium');
  118. crfHTML.addStyle(labelCell,'center');
  119. //crfHTML.createParagraph(formName,null,labelCell);
  120. }
  121. let cell=row.cells[1];
  122. if (!cell) {
  123. cell=row.insertCell();
  124. crfHTML.addStyle(cell,'stretch');
  125. }
  126. crfHTML.clear(cell);
  127. //update the filter with form idr
  128. filter.form=formId;
  129. let forms=new Array();
  130. for (let j=0;j<fEntries.length;j++){
  131. let entry=fEntries[j];
  132. if (this.filterEntry(entry,filter))
  133. forms.push(entry);
  134. }
  135. this.displayForms(cell,forms,roleAndSite,formId);
  136. this.print(fName+' finished checking existing forms');
  137. //only those that are allowed to create forms
  138. //print('Status: '+qForm[creatorModeColumn]);
  139. }
  140. if (filter.role=='crfManager')
  141. //need formGenerator.js
  142. formGenerator.showFormGenerator(this);
  143. else
  144. formGenerator.hideFormGenerator();
  145. }
  146. formPortal.displayForms=
  147. function(el,formList,roleAndSite,formId=null,idLabel=null,elError=null){
  148. let fName='[displayForms]';
  149. //formList is a list of crfEntry entries
  150. let table=crfHTML.createTable(null,el);
  151. let row=table.insertRow();
  152. let n=formList.length;
  153. let that=this;
  154. for (let i=0;i<n;i++){
  155. let entry=formList[i];
  156. let cell=row.insertCell(i);
  157. crfHTML.addStyle(cell,'stretch');
  158. let fbox=crfHTML.createBox(null,cell);
  159. //colormap of formStatus to colors
  160. let stat=entry['FormStatus'];
  161. let style=crfSetup.getEntryMap('formStatus')[stat]['color'];
  162. if (!style) style='gold';
  163. crfHTML.addStyle(fbox,style);
  164. this.print(fName+' setting style ['+i+'] '+style);
  165. let user=crfSetup.getMap('users')[entry['UserId']];
  166. let idLabel=crfSetup.getParticipantLabel(entry);
  167. let formStatus=crfSetup.getMap('formStatus')[stat];
  168. let text=[entry['entryId'],user,idLabel,formStatus];
  169. fbox.onclick=function(){that.openForm(entry,roleAndSite,elError);};
  170. for (let j=0;j<text.length;j++){
  171. crfHTML.createParagraph(text[j],null,fbox);
  172. }
  173. }
  174. if (!formId) return table;
  175. let formEntry=crfSetup.getEntryMap('dataForms')[formId];
  176. this.print(fName+' unique '+formEntry['unique']);
  177. if (n>0 && formEntry['unique']=='TRUE') return table;
  178. //add empty forms for absent records and non-unique records
  179. //should not be allowed to create new forms
  180. let regFormId=crfSetup.getSettings('registrationFormId');
  181. if (regFormId==formId) return table;
  182. let cell=row.insertCell(n);
  183. crfHTML.addStyle(cell,'stretch');
  184. let fbox=crfHTML.createBox(null,cell);
  185. crfHTML.addStyle(fbox,'empty');
  186. let cb=function(xdata,xcrfEntry){that.openForm(xcrfEntry,roleAndSite);};
  187. fbox.onclick=function(){that.createForm(formId,roleAndSite,cb,idLabel);};
  188. return table;
  189. }
  190. formPortal.openForm=
  191. function(crfEntry,roleAndSite,elError=null){
  192. let fName="[openForm]";
  193. if (!roleAndSite){
  194. if (elError)
  195. elError.innerText="Set role and site";
  196. this.print(fName+' role and site not specified');
  197. return;
  198. }
  199. let crfRef=crfEntry.entryId;
  200. this.print(fName+" clicked for "+crfRef);
  201. let ar=roleAndSite.split(':');
  202. let role=ar[0];
  203. let siteNumber=ar[1];
  204. //select between review and view
  205. //let formUrl=formEntry["formUrl"];
  206. //if ("reviewMode" in config) formUrl=formEntry["reviewFormUrl"];
  207. //print("Setting url "+formUrl);
  208. //direct all to the same html
  209. let formUrl="visitNew";
  210. reviewMode="EDIT";
  211. let params = {
  212. "name": formUrl,
  213. // The destination wiki page. The name of this parameter is not arbitrary.
  214. "entryId": crfRef,
  215. "role" : role
  216. };
  217. //"formSetupQuery":formEntry["setupQuery"],
  218. let containerPath= LABKEY.ActionURL.getContainer();
  219. // This changes the page after building the URL.
  220. //Note that the wiki page destination name is set in params.
  221. var wikiURL = LABKEY.ActionURL.buildURL("crf", formUrl , containerPath, params);
  222. this.print(fName+" redirecting to "+wikiURL);
  223. window.location = wikiURL;
  224. }
  225. formPortal.createForm=
  226. function(formId,roleAndSite,cb=null,idLabel=null,crfEntryOverload=null){
  227. //cb takes arguments (data,crfEntry)
  228. let fName="[createForm]";
  229. let formRow=crfSetup.getEntryMap('dataForms')[formId];
  230. let creator=formRow['creator'];
  231. if (!creator) {
  232. alert("Creator for form "+formRow['formName']+' not set');
  233. return;
  234. }
  235. let ar=roleAndSite.split(':');
  236. let role=ar[0];
  237. let siteNumber=ar[1];
  238. if (creator!=role){
  239. alert("Can't create form as "+role+' only allowed for '+creator);
  240. return;
  241. }
  242. this.print(fName+" create form w/id "+formId);
  243. let crfEntry=new Object();
  244. crfEntry.entryId=Date.now();
  245. crfEntry["Date"]=new Date();
  246. crfEntry["View"]="[VIEW]";
  247. crfEntry.formStatus=1;//In progress
  248. let fStatus=formRow['initialStatus'];
  249. if (fStatus)
  250. crfEntry.formStatus=fStatus;
  251. //set other variables
  252. //requires studyData as part of formConfig
  253. let studyData=crfSetup.getRows('studyData')[0];
  254. let varRows=crfSetup.getRows('crfStaticVariables');
  255. for (let i=0;i<varRows.length;i++){
  256. let varName=varRows[i].staticVariable;
  257. crfEntry[varName]=studyData[varName];
  258. }
  259. crfEntry.UserId=LABKEY.Security.currentUser.id;
  260. crfEntry.Site=siteNumber;
  261. this.print(fName+" setting site to id="+crfEntry.Site);
  262. //from argument list
  263. crfEntry.Form=formId;
  264. if (idLabel){
  265. crfEntry[crfSetup.getLocalIdLabel()]=crfSetup.getLocalId(idLabel);
  266. crfEntry[crfSetup.getStudyIdLabel()]=crfSetup.getStudyId(idLabel);
  267. }
  268. //overload entries
  269. if (crfEntryOverload){
  270. for (f in crfEntryOverload){
  271. crfEntry[f]=crfEntryOverload[f];
  272. }
  273. }
  274. let crfStatus=crfData.createCrfStatus(crfEntry);
  275. crfStatus.operator=role;
  276. crfStatus.action='createForm';
  277. let that=this;
  278. //let cb=function(data){that.openForm(crfEntry,roleAndSite);}
  279. this.print(fName+' '+cb);
  280. let callback=function(data){cb(data,crfEntry);};
  281. let containerPath=crfSetup.getContainer('data');
  282. let pass=function(data){runQuery.insertRows('lists','crfStatus',[crfStatus],callback,containerPath);};
  283. runQuery.insertRows('lists','crfEntry',[crfEntry],pass,containerPath);
  284. }