formGenerator.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. function addFormGenerator(){
  2. let fName='[addFormGenerator]';
  3. print(fName);
  4. //layout
  5. let table=config.document.createElement("table");
  6. table.className="t2";
  7. config.document.getElementById(config.div).appendChild(table);
  8. let formGenerator=new Object();
  9. formGenerator.formSelect=addInputRow(table,'Select form',"select");
  10. formGenerator.crfSelect=addInputRow(table,'Select CRF',"select");
  11. formGenerator.comment=addInputRow(table,'Enter comment','text');
  12. formGenerator.details=addInputRow(table,'Details','label');
  13. formGenerator.warnings=addInputRow(table,'Warnings','label');
  14. formGenerator.warnings.innerHTML='formGenerator version 1.1.0';
  15. addOption(formGenerator.formSelect,'<Select>',-1);
  16. let formRows=config.formConfig.generateConfigData.rows;
  17. for (let i=0;i<formRows.length;i++){
  18. let formId=formRows[i]["formId"];
  19. let formName=getFormName(formId);
  20. print(fName+' '+formRows[i]["formId"]+'/'+formName);
  21. addOption(formGenerator.formSelect,formName,formId);
  22. }
  23. formGenerator.formSelect.onchange=function(){updateIdList(formGenerator);};
  24. formGenerator.crfSelect.onchange=function(){updateLabel(formGenerator);};
  25. formGenerator.generateButton=addInputRow(table,'Generate Form','button');
  26. formGenerator.generateButton.value="Generate Form";
  27. formGenerator.generateButton.onclick=function(){createFormWithId(formGenerator);};
  28. }
  29. function fgInsertRow(schemaName,queryName,row,cb=null,containerPath=null){
  30. let fName='[fgInsertRow]';
  31. print(fName);
  32. //cb=function(data){....}
  33. let qconfig=new Object();
  34. if (containerPath)
  35. qconfig.containerPath=containerPath;
  36. qconfig.schemaName=schemaName;
  37. qconfig.queryName=queryName;
  38. qconfig.success=function(data){;};
  39. if (cb) qconfig.success=cb;
  40. qconfig.rows=[row];
  41. print(fName+' qconfig '+qconfig);
  42. LABKEY.Query.insertRows(qconfig);
  43. }
  44. function addInputRow(table,header,type){
  45. let fName='[addInputRow]';
  46. print(fName);
  47. let row=table.insertRow();
  48. let cell=config.document.createElement('th');
  49. let text=config.document.createTextNode(header);
  50. cell.appendChild(text);
  51. row.appendChild(cell);
  52. let input=null;
  53. if (type=="select")
  54. input=config.document.createElement(type);
  55. if (type=="button"){
  56. input=config.document.createElement("input");
  57. input.type="button";
  58. }
  59. if (type=="text"){
  60. input=config.document.createElement('textarea');
  61. input.cols="65";
  62. input.rows="5";
  63. }
  64. if (type=="label")
  65. input=config.document.createElement(type);
  66. let cell1=row.insertCell();
  67. cell1.appendChild(input);
  68. return input;
  69. }
  70. function getFormName(formId){
  71. let rows=config.formConfig.dataForms.rows;
  72. for (let i=0;i<rows.length;i++){
  73. if (rows[i]['Key']==formId){
  74. return rows[i]['formName'];
  75. }
  76. }
  77. return "NONE";
  78. }
  79. function getQueryName(queryId){
  80. let rows=config.formConfig.inputLists.rows;
  81. for (let i=0;i<rows.length;i++){
  82. if (rows[i]['Key']==queryId){
  83. return rows[i]['queryName'];
  84. }
  85. }
  86. return "NONE";
  87. }
  88. function getGCRow(formId){
  89. let formRows=config.formConfig.generateConfigData.rows;
  90. for (let i=0;i<formRows.length;i++){
  91. if (formRows[i]['formId']==formId){
  92. return formRows[i];
  93. }
  94. }
  95. return Object();
  96. }
  97. function getCrfSelectRow(crfRef){
  98. let rows=config.formConfig.crfSelectRows;
  99. for (let i=0;i<rows.length;i++){
  100. if (rows[i]['crfRef']==crfRef)
  101. return rows[i];
  102. }
  103. return Object();
  104. }
  105. function addOption(input,name,value){
  106. let opt=config.document.createElement("option");
  107. opt.text=name;
  108. opt.value=value;
  109. input.options[input.options.length]=opt;
  110. }
  111. function clearOptions(input){
  112. for(let i = input.options.length; i >= 0; i--) {
  113. input.remove(i);
  114. }
  115. }
  116. function createFormWithId(formGenerator){
  117. //get form id and entry id from select and create form as above
  118. let fName='[createFormWithId]';
  119. print(fName);
  120. let formId=formGenerator.formSelect.options[formGenerator.formSelect.selectedIndex].value;
  121. let crfRef=formGenerator.crfSelect.options[formGenerator.crfSelect.selectedIndex].text;
  122. let configRow=getGCRow(formId);
  123. let crfSelectRow=getCrfSelectRow(crfRef);
  124. let formConfig=config.formConfig;
  125. print("Create form w/id "+formId);
  126. let crfEntry=new Object();
  127. crfEntry.entryId=Date.now();
  128. crfEntry["Date"]=new Date();
  129. crfEntry["View"]="[VIEW]";
  130. crfEntry['participantStudyId']=crfSelectRow['participantStudyId'];
  131. crfEntry['participantLocalId']=crfSelectRow['participantLocalId'];
  132. crfEntry.formStatus=configRow['formStatus'];//In progress
  133. //set other variables
  134. //requires studyData as part of formConfig
  135. let studyData=formConfig.studyData.rows[0];
  136. let varRows=formConfig['crfStaticVariables'].rows;
  137. for (let i=0;i<varRows.length;i++){
  138. let varName=varRows[i].staticVariable;
  139. crfEntry[varName]=studyData[varName];
  140. }
  141. crfEntry.UserId=LABKEY.Security.currentUser.id;
  142. crfEntry.Site=config.formConfig.currentSites[0].siteNumber;
  143. print("Setting site to id="+crfEntry.Site);
  144. //from argument list
  145. crfEntry.Form=formId;
  146. crfEntry.parentCrf=crfRef;
  147. //
  148. //compose a reviewComments entry
  149. let reviewComment=new Object();
  150. reviewComment['submissionDate']=crfEntry['Date'];
  151. reviewComment['crfRef']=crfRef;
  152. //comment length
  153. let x=formGenerator.comment.value;
  154. print(fName+' comment length '+x.length);
  155. if (x.length==0){
  156. formGenerator.warnings.innerHTML='Supply a comment';
  157. return;
  158. }
  159. reviewComment['reviewComment']=formGenerator.comment.value;
  160. reviewComment['queryName']=configRow['queryId'];
  161. let crfStatus=new Object();
  162. crfStatus.entryId=crfEntry.entryId;
  163. crfStatus.submissionDate=new Date();
  164. crfStatus.FormStatus=crfEntry.formStatus;
  165. crfStatus.User=crfEntry.UserId;
  166. crfStatus.Form=crfEntry.Form;
  167. crfStatus.operator=config.role;
  168. crfStatus.action='createFormWithId';
  169. let rd=function(data){redirect();};
  170. let pass1=function(data){fgInsertRow('lists','crfStatus',crfStatus,rd,getContainer('data'));}
  171. let pass=function(data){fgInsertRow('lists','reviewComments',reviewComment,pass1,getContainer('data'));}
  172. fgInsertRow('lists','crfEntry',crfEntry,pass,getContainer('data'));
  173. }
  174. function updateIdList(formGenerator){
  175. let fName='[updateIdList]';
  176. let formId=formGenerator.formSelect.options[formGenerator.formSelect.selectedIndex].value;
  177. print(fName+' id '+formId);
  178. //remove old options
  179. clearOptions(formGenerator.crfSelect);
  180. print(fName+' options cleared');
  181. //get query associated with form
  182. let configRow=getGCRow(formId);
  183. let queryId=configRow['queryId'];
  184. print(fName+' queryId '+queryId);
  185. if (!queryId || queryId<0)
  186. return;
  187. let qselect=new Object();
  188. qselect.containerPath=getContainer('data');
  189. qselect.schemaName='lists';
  190. qselect.queryName=getQueryName(queryId);
  191. qselect.success=function(data){updateIdListWithData(formGenerator,data);};
  192. LABKEY.Query.selectRows(qselect);
  193. }
  194. function updateIdListWithData(formGenerator,data){
  195. let rows=data.rows;
  196. config.formConfig.crfSelectRows=data.rows;
  197. for (let i=0;i<rows.length;i++){
  198. addOption(formGenerator.crfSelect,rows[i]['crfRef'],i);
  199. }
  200. let event=new Event('change');
  201. formGenerator.crfSelect.dispatchEvent(event);
  202. }
  203. function updateLabel(formGenerator){
  204. let crfRef=formGenerator.crfSelect.options[formGenerator.crfSelect.selectedIndex].text;
  205. let crfSelectRow=getCrfSelectRow(crfRef);
  206. formGenerator.details.innerHTML='Generating for Study:'+crfSelectRow['participantStudyId']+' / Local:'+crfSelectRow['participantLocalId'];
  207. }
  208. function redirect(){
  209. let debug=false;
  210. let formUrl="begin";
  211. let params=new Object();
  212. params.name=formUrl;
  213. params.pageId="CRF";
  214. //points to crf container
  215. let containerPath=getContainer('data');
  216. // This changes the page after building the URL.
  217. //Note that the wiki page destination name is set in params.
  218. var homeURL = LABKEY.ActionURL.buildURL(
  219. "project", formUrl , containerPath, params);
  220. print("Redirecting to "+homeURL);
  221. if (debug) return;
  222. window.location = homeURL;
  223. }