crfParticipant.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. function print(config,msg){
  2. let el=config.document.getElementById(config.debugId);
  3. if (el===null) {
  4. //alert("Debug section not initialized. Message: "+msg);
  5. return;
  6. }
  7. el.value+="\n"+msg;
  8. }
  9. function clear(config){
  10. let el=config.document.getElementById(config.debugId);
  11. if (el===null) {
  12. //alert("Debug section not initialized");
  13. return;
  14. }
  15. config.document.getElementById(config.debugId).value="";
  16. }
  17. function createRowSelector(schemaName,queryName){
  18. let selectRows=new Object();
  19. selectRows.schemaName=schemaName;
  20. selectRows.queryName=queryName;
  21. return selectRows;
  22. }
  23. function buildTable(config){
  24. //print(config,'buildTable');
  25. addRow(config,'ParticipantId',[config.id]);
  26. let selectRows=createRowSelector('lists',config.setup);
  27. selectRows.success=function (data){afterSetup(config,data);}
  28. LABKEY.Query.selectRows(selectRows);
  29. }
  30. function afterSetup(config,data){
  31. //print(config,'afterSetup ['+data.rows.length+']');
  32. config.setupRows=data.rows;
  33. let selectRows=createRowSelector('study','DataSets');
  34. selectRows.success=function (data){afterDatasets(config,data);}
  35. LABKEY.Query.selectRows(selectRows);
  36. }
  37. //build a local copy of enum's
  38. function afterDatasets(config,data){
  39. //print(config,'afterDatasets ['+data.rows.length+']');
  40. config.datasets=data.rows;
  41. //debug mode -> jump ahead
  42. //afterEnumValues(config);
  43. let selectRows=createRowSelector('ListManager','ListManager');
  44. selectRows.filterArray=[LABKEY.Filter.create('Name','enum',
  45. LABKEY.Filter.Types.STARTS_WITH)];
  46. selectRows.success=function (data){afterEnums(config,data);}
  47. LABKEY.Query.selectRows(selectRows);
  48. //print(config,'enums');
  49. }
  50. //parse list of lists; get values
  51. function afterEnums(config,data){
  52. //print(config,'afterEnums: '+data.rows.length);
  53. config.enums=data.rows;
  54. config.enumValues=new Object();
  55. for (row of config.enums){
  56. //print(config,'afterEnums: '+row.Name);
  57. config.enumValues[row.Name]=new Object();
  58. }
  59. for (lst in config.enumValues){
  60. let selectRows=createRowSelector('lists',lst);
  61. selectRows.success=function (data){addEnumValues(config,data);}
  62. LABKEY.Query.selectRows(selectRows);
  63. }
  64. }
  65. function addEnumValues(config, data){
  66. //find out the variable name
  67. //
  68. let varName="NONE";
  69. for (field of data.metaData.fields){
  70. if (field.name=="Key")
  71. continue;
  72. varName=field.name;
  73. }
  74. //print(config,'addEnumValues ['+data.queryName+']: '+varName);
  75. config.enumValues[data.queryName].map=new Object();
  76. for (row of data.rows)
  77. config.enumValues[data.queryName].map[row["Key"]]=row[varName];
  78. waitForEnumCompleted(config);
  79. }
  80. function waitForEnumCompleted(config){
  81. for (lst in config.enumValues){
  82. if (!("map" in config.enumValues[lst]))
  83. return;
  84. //print(config,'['+lst+']: '+
  85. // Object.keys(config.enumValues[lst].map).length);
  86. }
  87. //print(config,"Enum completed");
  88. afterEnumValues(config);
  89. }
  90. function datasetName(config,id){
  91. for (let i=0;i<config.datasets.length;i++){
  92. if (config.datasets[i].DataSetId==id)
  93. return config.datasets[i].Name;
  94. }
  95. return "NONE";
  96. }
  97. function afterEnumValues(config){
  98. config.entries=new Object();
  99. for (let i=0;i<config.setupRows.length;i++){
  100. //print(config,'['+i+']: '+config.setupRows[i].dataset);
  101. let queryName=datasetName(config,config.setupRows[i].dataset);
  102. //print(config,"Adding dataset: "+queryName);
  103. config.entries[queryName]=new Object();
  104. config.setupRows[i].datasetName=queryName;
  105. }
  106. for (let ds in config.entries){
  107. //print(config,"Querying dataset: "+ds);
  108. let selectRows=createRowSelector('study',ds);
  109. selectRows.filterArray=[LABKEY.Filter.create('ParticipantId',config.id)];
  110. selectRows.success=function (data){afterQuery(config,data);}
  111. LABKEY.Query.selectRows(selectRows);
  112. }
  113. //print(config,'afterDatasets: Done');
  114. }
  115. function afterQuery(config,data){
  116. //print(config,'afterQuery ['+data.queryName+']: '+data.rows.length);
  117. config.entries[data.queryName].rows=data.rows;
  118. config.entries[data.queryName].metaData=data.metaData;
  119. waitForAll(config);
  120. }
  121. function waitForAll(config){
  122. //print(config,'waitForAll');
  123. for (let ds in config.entries){
  124. if (!("rows" in config.entries[ds]))
  125. return;
  126. //print(config,ds+': '+config.entries[ds].rows.length);
  127. }
  128. //only get here if all rows are set
  129. //print(config,'waitForAll: Done');
  130. updateValues(config);
  131. }
  132. function getField(fields,name){
  133. for (field of fields){
  134. if (field.name==name)
  135. return field;
  136. }
  137. return undefined;
  138. }
  139. function updateValues(config){
  140. //print(config,'updateValues');
  141. for (let row of config.setupRows){
  142. let ds=row.datasetName;
  143. let vars=row.variables.split(';');
  144. //print(config,'Dataset: '+row.datasetName+' Vars: '+vars);
  145. if (config.entries[ds].rows.length==0){
  146. addRow(config,ds,["no events"],config.missingStyle);
  147. continue;
  148. }
  149. addRow(config,ds,vars,config.headerStyle);
  150. let md=config.entries[ds].metaData;
  151. for (let dataRow of config.entries[ds].rows){
  152. let displayRow=new Array();
  153. for (let v of vars){
  154. //print(config,ds+'['+v+']: '+ dataRow[v]);
  155. //check if it is a lookup
  156. let field=getField(md.fields,v);
  157. let value=dataRow[v];
  158. if ("lookup" in field){
  159. //print(config,"Lookup: "+field.lookup.table);
  160. let lut=config.enumValues[field.lookup.table];
  161. value=lut.map[value];
  162. }
  163. displayRow.push(value);
  164. }
  165. addRow(config,'',displayRow);
  166. }
  167. }
  168. E
  169. }
  170. function setStyle(object,style){
  171. if (style!=undefined)
  172. for (attr in style)
  173. object.style[attr]=style[attr];
  174. }
  175. function addRow(config,header,values,style){
  176. //let headerColor="#d0e8f8";
  177. let row=config.table.insertRow();
  178. let cell=config.document.createElement('th');
  179. setStyle(cell,style);
  180. row.appendChild(cell);
  181. let cellData=config.document.createTextNode(header);
  182. //print(config,'Adding header '+header);
  183. cell.appendChild(cellData);
  184. //new cell
  185. for (v of values){
  186. cell=row.insertCell();
  187. setStyle(cell,style);
  188. cellData=config.document.createTextNode(v);
  189. cell.appendChild(cellData);
  190. }
  191. }