ソースを参照

Rudimentary updates to allow for form pdf printing

tomcat8 @ merlin 3 年 前
コミット
add7c45cad
3 ファイル変更242 行追加148 行削除
  1. 1 0
      views/visit.html
  2. 4 1
      views/visit.view.xml
  3. 237 147
      web/crf/crfVisit.js

+ 1 - 0
views/visit.html

@@ -68,6 +68,7 @@ function init(){
 	config.masterForm="visitForm";
 	
 	config.document=document;
+	config.window=window;
 	config.debugDiv="debugDiv";
 	config.debugId="formStatus";
 	config.crfRefId="crfRefId";

+ 4 - 1
views/visit.view.xml

@@ -1,6 +1,9 @@
 <view xmlns="http://labkey.org/data/xml/view" title="CRF Form">
 	<dependencies>
 			<dependency path="crf/crfVisit.js"/>
-	</dependencies>
+	 		<dependency path="https://github.com/devongovett/pdfkit/releases/download/v0.10.0/pdfkit.standalone.js" />
+			<dependency path="https://github.com/devongovett/blob-stream/releases/download/v0.1.3/blob-stream.js"/>
+
+ </dependencies>
 </view>
 <!-- need to restart labkey to add new files -->

+ 237 - 147
web/crf/crfVisit.js

@@ -73,54 +73,6 @@ function generateDebugSection(config){
 
 
 
-function populateBasicData(config,data){
-	let debug=false;
-	if (debug)
-		print(config,"crfRef matched entries: "+data.rows.length);
-	if (data.rows.length!=1) { return;}
-	config.document.getElementById('eudraCTNumber').innerHTML=data.rows[0].EudraCTNumber;
-	config.document.getElementById('studyCoordinator').innerHTML=data.rows[0].StudyCoordinator;
-	config.document.getElementById('studySponsor').innerHTML=data.rows[0].StudySponsor;
-	let qconfig=new Object();
-	qconfig.containerPath=config.containerPath;
-	qconfig.schemaName='lists';
-	qconfig.queryName='site';
-	qconfig.filterArray=[LABKEY.Filter.create('siteNumber', data.rows[0].Site)];
-	qconfig.success=function(data){
-		setHTML(config,data,'siteName','siteName');
-		setHTML(config,data,'sitePhone','sitePhone');
-	};
-		
-	LABKEY.Query.selectRows(qconfig);
-
-
-	if (debug)
-		print(config,"set user: "+data.rows[0].UserId);
-	let qconfig1=new Object();
-	qconfig1.containerPath=config.containerPath;
-	qconfig1.schemaName='core';
-	qconfig1.queryName='Users';
-	qconfig1.filterArray= [LABKEY.Filter.create('UserId',data.rows[0].UserId)];
-	qconfig1.success= function(data){setHTML(config,data,'investigatorName','DisplayName')};
-	qconfig1.failure=onFailure;
-	if (debug)
-		print(config,"USER select rows");
-
-	LABKEY.Query.selectRows(qconfig1);
-}
-
-function setHTML(config,data,elementId,varName){
-	print(config,"setHTML "+data.rows.length+" elementId: "+elementId+" varName:"+varName);
-	if (data.rows.length>0){
-		let entry=data.rows[0];
-		let el=config.document.getElementById(elementId);
-		
-		print(config,"setHTML: Entry[" + varName + "]: " + entry[varName]);
-		print(config,"setHTML: Element[" + elementId + "]: " + el);
-		el.innerHTML=entry[varName];
-	}
-
-}
 
 function setAdditionalData(config,additionalData,entry){
 	let debug=true;
@@ -163,84 +115,6 @@ function readonlySetup(config){
 	return setup;
 }
 
-function generateForm(config,data){
-
-	let debug=true;
-	if (debug) print(config,"generateForm ["+data.rows.length+"]");
-	for (let i=0;i<data.rows.length;i++){
-
-		if (debug) print(config,"generateForm ["+i+"/"+data.rows.length+"]");
-
-		let entry=data.rows[i];
-		//this is actually a pointer into another list (==lookup)
-		//another selectRows is needed to actually get the name for the queryName
-		//
-		
-		
-		
-		let fields=data.metaData.fields;
-		if (debug) print(config,"generateForm ["+i+"]: fields: "+fields);
-		let field="NONE";
-		//if (debug) printTableSetup(config,data);
-		for (f in fields){
-			if (fields[f]['name']!='queryName') continue;
-			field=fields[f];
-			break;
-		}
-		if (debug) print(config,"generateForm ["+i+"]: field: "+field);
-		let lookup=field.lookup;
-		if (debug) print(config,"generateForm ["+i+"]: lookup: "+lookup);
-		let qconfig=new Object();
-		qconfig.containerPath=config.containerPath;
-		qconfig.schemaName=lookup.schemaName;
-		qconfig.queryName=lookup.queryName;
-		qconfig.filterArray=[LABKEY.Filter.create(lookup.keyColumn,entry['queryName'])];
-		qconfig.success=function(data){generateFormLookup(config,data,entry)};
-		LABKEY.Query.selectRows(qconfig);
-	}
-}
-
-
-function generateFormLookup(config,data,entry){
-	//id : entry[queryName]
-	//name: dentry[queryName]
-	
-	let debug=true;
-	let queryId=entry['queryName'];
-
-	if (data.rows.length==0){
-		alert("No rows found for listId: "+entry['queryName']);
-		return;
-	}
-	let dentry=data.rows[0];
-	if (debug)
-		for (f in dentry) print(config,"generateFormLookup field: "+f+" value: "+dentry[f]);
-	
-	let queryName=dentry["queryName"];
-
-	if (debug) print(config,"generateFormLookup: ID: "+queryId+" name: "+queryName);
-	
-	//update fields for review
-	if (!(queryName in config.fields))
-		config.fields[queryName]=new Object();
-
-	if (!(queryId in config.queryMap))
-		config.queryMap[queryId]=queryName;
-		
-	let field=config.fields[queryName];
-
-	field.title=entry["title"];
-	field.queryId=queryId;
-
-	if (debug) print(config,"entry[showFlag]: "+entry["showFlag"]);
-
-	let additionalData=new Object();
-	setAdditionalData(config,additionalData,entry);
-	generateSection(config,queryName,entry["title"],queryName, additionalData);
-
-
-}
-
 function generateSection(config, sectionName, sectionTitle, listName, additionalData){
 
 	let formName=config.masterForm;
@@ -1207,6 +1081,7 @@ function setFlag(config,data,flag){
 }
 
 function completeWithFlag(config,data,flag){
+
 	let debug=true;
 
 	if (debug){
@@ -1476,38 +1351,135 @@ function redirect(config){
 
 }
 
+var blob;
+var blobInterval;
+
+function checkBlob(config){
+	print(config,"Blob: "+blob);
+	if (blob) {
+		clearInterval(blobInterval);
+		config.a.href = config.window.URL.createObjectURL(blob);
+		print(config,"HREF: "+config.a.href);
+		config.a.download = 'test.pdf';
+		config.a.click();
+		config.window.URL.revokeObjectURL(config.a.href);
+	}
+	config.count=config.count+1;
+	print(config,"Eval: "+config.count);
+	if (config.count>100){
+		clearInterval(blobInterval);
+	}
+
+}
+
+function printForm(config){
+
+	let doc=new PDFDocument();
+	doc.fontSize(25).text("Some text with standard font Andrej!", 100, 100);
+	doc.end();
+	let stream = doc.pipe(blobStream()).on("finish",function(){
+		blob=stream.toBlob("application/pdf");});
+	
+	print(config,"BLob: "+blob);
+	config.a = config.document.createElement("a");
+	config.document.body.appendChild(config.a);
+	config.a.innerHTML="Download PDF";
+	config.a.style = "display: none";
+	config.count=0;
+	blobInterval=setInterval(checkBlob,1000,config);
+
+	//pick data from crfForm list
+        print(config,"Printing form");
+
+	for (let i=0;i<config.formConfig.formSetup.rows.length;i++){
+		let entry=config.formConfig.formSetup.rows[i];
+		let qName=config.formConfig.queryMap[entry['queryName']];
+		let selectRows=new Object();
+		print(config,'Adding data for '+qName);
+		selectRows.containerPath=config.containerPath;
+		selectRows.schemaName='lists';
+		selectRows.queryName=qName;
+		selectRows.filterArray=[LABKEY.Filter.create('crfRef',config.formConfig.crfEntry['entryId'])];
+		selectRows.success=function(data){collectFormData(config,data)};
+		LABKEY.Query.selectRows(selectRows);
+		//deal with additional data
+	}
+	
+}
+
+function collectFormData(config,data){
+	config.formConfig.fields[data.queryName].data=data;
+	for (f in config.formConfig.fields){
+		let field=config.formConfig.fields[f];
+		if ("data" in field) continue;
+		return;
+	}
+	print(config,"All done");
+	formatFormData(config);
+}
+
+function formatFormData(config){
+	for (queryName in config.formConfig.fields){
+		formatDataset(config,queryName);
+	}
+}
+
+function formatDataset(config,queryName){
+	let data=config.formConfig.fields[queryName].data;
+	let fields=data.metaData.fields;
+	for (let i=0;i<data.rows.length;i++){
+		for (f in fields){
+			let field=fields[f];
+			if (field.hidden) continue;
+			let vName=field.name;
+			let vType=field.type;
+			print(config,'['+vName+'/'+vType+']: '+data.rows[i][vName]);
+		}
+	}
+
+}
+
+
+
+
 function generateMasterForm(config){
 
+
 	generateDebugSection(config);
+	setFormConfig(config);
+}
+
+function afterConfig(config){
 
 	let debug=true;
 
 	if (debug)
 		print(config,"generateMasterForm");	
-	
-	let selectRows=new Object();
-	selectRows.containerPath=config.containerPath;
-	selectRows.schemaName='lists';
-	selectRows.queryName='crfEntry';
-	selectRows.filterArray=[LABKEY.Filter.create('entryId',getCRFref(config))];
-	selectRows.success=function(data){populateBasicData(config,data)};
-	//requires populateBasicData
-	LABKEY.Query.selectRows(selectRows);
 
-	config.fields=new Object();	
-	config.queryMap=new Object();
 
-	let configSelectRows=new Object();
-	configSelectRows.containerPath=config.containerPath;
-	configSelectRows.schemaName='lists';
-	configSelectRows.queryName=config.setupQueryName;
-	//this is new
-	configSelectRows.queryName="FormSetup";
-	configSelectRows.filterArray=[LABKEY.Filter.create("formName",config.formId)];
+	config.document.getElementById('investigatorName').innerHTML=config.formConfig.user['DisplayName'];
+	config.document.getElementById('eudraCTNumber').innerHTML=config.formConfig.crfEntry['EudraCTNumber'];
+	config.document.getElementById('studyCoordinator').innerHTML=config.formConfig.crfEntry['StudyCoordinator'];
+	config.document.getElementById('studySponsor').innerHTML=config.formConfig.crfEntry['StudySponsor'];
+	config.document.getElementById('siteName').innerHTML=config.formConfig.site['siteName'];
+	config.document.getElementById('sitePhone').innerHTML=config.formConfig.site['sitePhone'];
+
+
+	for (let i=0;i<config.formConfig.formSetup.rows.length;i++){
+		let entry=config.formConfig.formSetup.rows[i];
+		let queryName=config.formConfig.queryMap[entry['queryName']];
+		let additionalData=new Object();
+
+		setAdditionalData(config,additionalData,entry);
+
+		generateSection(config,queryName,entry['title'],queryName,additionalData);
+		print(config,'Running this');
+	}
+	//config.fields=new Object();	
+	//config.queryMap=new Object();
+	config.fields=config.formConfig.fields;
+	config.queryMap=config.formConfig.queryMap;
 
-	configSelectRows.success=function(data){generateForm(config,data);};
-	configSelectRows.failure=onFailure;//function(errorTxt){print(config,"generateForm fail" + errorTxt)};
-	LABKEY.Query.selectRows(configSelectRows);
 
 	if (debug)
 		print(config,"Generating buttons");
@@ -1529,7 +1501,125 @@ function generateMasterForm(config){
 		generateButton(config,"submitDiv","Complete submission","Submit",onSubmit,config);
 		generateButton(config,"submitDiv","Remove submission","Remove CRF form",onRemoveCRF,config);
 	}
+	generateButton(config,"submitDiv","Print Form (Experimental)","Print",printForm,config);
 	generateButton(config,"submitDiv","Done","Exit",redirect,config);
 
 }
 
+function setFormConfig(config){
+
+	//generateDebugSection(config);
+
+	let debug=true;
+
+	if (debug)
+		print(config,"generateMasterForm1");	
+	
+	let selectRows=new Object();
+	selectRows.containerPath=config.containerPath;
+	selectRows.schemaName='lists';
+	selectRows.queryName='crfEntry';
+	selectRows.filterArray=[LABKEY.Filter.create('entryId',getCRFref(config))];
+	config.formConfig=new Object();
+	//store form related data to this object
+	selectRows.success=function(data){afterCRFEntry(config,data)};
+	//requires populateBasicData
+	LABKEY.Query.selectRows(selectRows);
+}
+
+function afterCRFEntry(config,data){
+	config.formConfig.crfEntry=data.rows[0];
+	print(config,"Setting crfEntry (x) to "+config.formConfig.crfEntry["entryId"]);
+	
+	let selectRows=new Object();
+	selectRows.containerPath=config.containerPath;
+	selectRows.schemaName='lists';
+	selectRows.queryName='site';
+	selectRows.filterArray=[LABKEY.Filter.create('siteNumber',config.formConfig.crfEntry.Site)];
+	selectRows.success=function(data){afterSite(config,data)};
+	LABKEY.Query.selectRows(selectRows);
+}
+
+function afterSite(config,data){
+	print(config,"afterSite");
+	config.formConfig.site=data.rows[0];
+	print(config,"Setting site name to "+config.formConfig.site["siteName"]+" phone: "+config.formConfig.site["sitePhone"]);
+
+	let selectRows=new Object();
+	selectRows.containerPath=config.containerPath;
+	selectRows.schemaName='core';
+	selectRows.queryName='Users';
+	selectRows.filterArray=[LABKEY.Filter.create('siteNumber',config.formConfig.crfEntry.UserId)];
+	selectRows.success=function(data){afterUser(config,data)};
+	LABKEY.Query.selectRows(selectRows);
+}
+
+function afterUser(config,data){
+	config.formConfig.user=data.rows[0];
+	print(config,"Setting user to "+config.formConfig.user["DisplayName"]);
+
+	let selectRows=new Object();
+	selectRows.containerPath=config.containerPath;
+	selectRows.schemaName='lists';
+	selectRows.queryName='FormSetup';
+	selectRows.filterArray=[LABKEY.Filter.create('formName',config.formId)];
+	selectRows.success=function(data){afterFormSetup(config,data)};
+	LABKEY.Query.selectRows(selectRows);
+
+}
+
+
+function afterFormSetup(config,data){
+	config.formConfig.formSetup=data;
+	print(config,"Number of datasets for form ["+config.formId+"]: "+config.formConfig.formSetup.rows.length);
+
+	let fields=config.formConfig.formSetup.metaData.fields;
+	let formQueryName='queryName';
+	let field="NONE";
+	for (f in fields){
+		if (fields[f]['name']!=formQueryName) continue;
+		field=fields[f];
+		break;
+	}
+	let lookup=field.lookup;
+
+	print(config,"Getting dataset names from :"+lookup.queryName);
+	let selectRows=new Object();
+	selectRows.containerPath=config.containerPath;
+	selectRows.schemaName=lookup.schemaName;
+	selectRows.queryName=lookup.queryName;
+	selectRows.success=function(data){afterFormDatasets(config,data)};
+	LABKEY.Query.selectRows(selectRows);
+
+}
+
+function afterFormDatasets(config,data){
+	config.formConfig.formDatasets=data;
+	config.formConfig.fields=new Object();
+	config.formConfig.queryMap=new Object();
+	for (let i=0;i<config.formConfig.formSetup.rows.length;i++){
+		let entry=config.formConfig.formSetup.rows[i];
+		let queryId=entry['queryName'];
+		for (let j=0;j<config.formConfig.formDatasets.rows.length;j++){
+			if (queryId!=config.formConfig.formDatasets.rows[j]['Key']) continue;
+			let qName=config.formConfig.formDatasets.rows[j]['queryName'];
+			config.formConfig.fields[qName]=new Object();
+			config.formConfig.queryMap[queryId]=qName;
+			let field=config.formConfig.fields[qName];
+			field.title=entry['title'];
+			field.queryId=queryId;
+			//print(config,"     "+config.formConfig.formDatasets.rows[j]['queryName']);
+			break;
+		}
+	}
+	print(config,"List of datasets in form : ");
+	for (f in config.formConfig.fields){
+		let field=config.formConfig.fields[f];
+		print(config,"\t"+f+" ID: "+field.queryId+' title '+field.title);
+	}
+	afterConfig(config);
+
+}
+
+
+