NIHVIVO-2997 Merged r3354 from maint-rel-1.3 branch.

This commit is contained in:
cappadona 2011-07-21 12:49:15 +00:00
parent 5485ff82b7
commit 73e299ec79
4 changed files with 252 additions and 238 deletions

View file

@ -0,0 +1,35 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
h3.testfile-step-header {
float: left;
padding-right: 30px;
}
div.testfile-step-body {
overflow: hidden;
}
div.clearBothDiv {
clear: both;
padding-bottom: 20px;
}
a.help {
margin-left: 10px;
font-size: 0.8em;
}
#csvHelp-indented {
margin: 0 1.5em 1em;
padding: .5em;
font-size: 0.8em;
line-height: 1.2em;
background: #efefef;
}
#csvHelp-indented p:last-child {
margin-bottom: 0;
}
#uploadTarget {
width: 0;
height: 0;
border: 0px solid #fff;
}
#harvestButton {
margin-right: 10px;
}

View file

@ -2,261 +2,240 @@
<#if !(user.loggedIn && user.hasSiteAdminAccess)> <#if !(user.loggedIn && user.hasSiteAdminAccess)>
<p>You must be an administrator to use this tool.</p> <p>You must be an administrator to use this tool.</p>
<#else> <#else>
<#if jobKnown == "false"> <#if jobKnown == "false">
<p>Error: No file harvest job was specified, or an unknown job was specified.</p>
<p>The end user should not see this error under normal circumstances, so this is probably a bug and should be reported.</p>
<#else>
<script type="text/javascript"> <p>Error: No file harvest job was specified, or an unknown job was specified.</p>
var harvestProgressResponse; <p>The end user should not see this error under normal circumstances, so this is probably a bug and should be reported.</p>
function doFunStuff()
{
doHarvest();
}
function doHarvest() <#else>
{
document.getElementById("harvestButton").disabled = true;
document.getElementById("harvestButtonHelpText").innerHTML = "Please wait while your data is harvested.";
var request = createRequest(); <script type="text/javascript">
request.onreadystatechange=function() {
if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText;
var json = eval("(" + harvestProgressResponse + ")"); var harvestProgressResponse;
var scriptTextArea = document.getElementById("scriptTextArea");
scriptTextArea.innerHTML = json.scriptText;
window.setTimeout(continueHarvest, 1000); function doHarvest()
} {
} document.getElementById("harvestButton").disabled = true;
request.open("POST", "${postTo}", true); document.getElementById("harvestButtonHelpText").innerHTML = "Please wait while your data is harvested.";
request.setRequestHeader("content-type","application/x-www-form-urlencoded");
//request.send("${paramMode}=${modeHarvest}&${paramJob}=${job}"); var request = createRequest();
request.send("${paramMode}=${modeHarvest}"); request.onreadystatechange=function() {
} if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText;
var json = eval("(" + harvestProgressResponse + ")");
var scriptTextArea = document.getElementById("scriptTextArea");
scriptTextArea.innerHTML = json.scriptText;
window.setTimeout(continueHarvest, 1000);
}
}
request.open("POST", "${postTo}", true);
request.setRequestHeader("content-type","application/x-www-form-urlencoded");
//request.send("${paramMode}=${modeHarvest}&${paramJob}=${job}");
request.send("${paramMode}=${modeHarvest}");
}
function continueHarvest() function continueHarvest()
{ {
var response = harvestProgressResponse; var response = harvestProgressResponse;
var json = eval("(" + response + ")"); var json = eval("(" + response + ")");
var logAppend = json.progressSinceLastCheck; var logAppend = json.progressSinceLastCheck;
var progressTextArea = document.getElementById("progressTextArea"); var progressTextArea = document.getElementById("progressTextArea");
progressTextArea.innerHTML = progressTextArea.innerHTML + logAppend; progressTextArea.innerHTML = progressTextArea.innerHTML + logAppend;
progressTextArea.scrollTop = progressTextArea.scrollHeight; progressTextArea.scrollTop = progressTextArea.scrollHeight;
if(!json.finished) { if(!json.finished) {
var request = createRequest(); var request = createRequest();
request.onreadystatechange=function() { request.onreadystatechange=function() {
if(request.readyState == 4 && request.status == 200) { if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText; harvestProgressResponse = request.responseText;
window.setTimeout(continueHarvest, 1000); window.setTimeout(continueHarvest, 1000);
} }
} }
request.open("POST", "${postTo}", true); request.open("POST", "${postTo}", true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded"); request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//request.send("${paramMode}=${modeCheckStatus}&${paramJob}=${job}"); //request.send("${paramMode}=${modeCheckStatus}&${paramJob}=${job}");
request.send("${paramMode}=${modeCheckStatus}"); request.send("${paramMode}=${modeCheckStatus}");
} else { } else {
var linkHeader = document.getElementById("linkHeader"); // var linkHeader = document.getElementById("linkHeader");
linkHeader.style.display = "inline"; // linkHeader.style.display = "inline";
$('#linkHeader').removeClass('hidden');
var importedItems = document.getElementById("importedItems") var importedItems = document.getElementById("importedItems")
if(json.newlyAddedUrls.length > 0) { if(json.newlyAddedUrls.length > 0) {
for(var i = 0; i < json.newlyAddedUrls.length; i++) { for(var i = 0; i < json.newlyAddedUrls.length; i++) {
var newLi = document.createElement("li"); var newLi = document.createElement("li");
newLi.innerHTML = "<a href=\"" + json.newlyAddedUrls[i] + "\" target=\"_blank\">" + json.newlyAddedUris[i] + "</a>"; newLi.innerHTML = "<a href=\"" + json.newlyAddedUrls[i] + "\" target=\"_blank\">" + json.newlyAddedUris[i] + "</a>";
importedItems.appendChild(newLi); importedItems.appendChild(newLi);
} }
} else { } else {
var newLi = document.createElement("li"); var newLi = document.createElement("li");
newLi.innerHTML = "${jobSpecificNoNewDataMessage}"; newLi.innerHTML = "${jobSpecificNoNewDataMessage}";
importedItems.appendChild(newLi); importedItems.appendChild(newLi);
} }
document.getElementById("harvestButtonHelpText").innerHTML = "Harvest complete. For another, please refresh the page."; document.getElementById("harvestButtonHelpText").innerHTML = "Harvest complete. For another, please refresh the page.";
} }
} }
function createRequest() { function createRequest() {
var request; var request;
if (window.XMLHttpRequest) { if (window.XMLHttpRequest) {
request = new XMLHttpRequest(); request = new XMLHttpRequest();
} else { } else {
request = new ActiveXObject("Microsoft.XMLHTTP"); request = new ActiveXObject("Microsoft.XMLHTTP");
} }
return request; return request;
} }
function fileResponse()
{
var response = frames["uploadTarget"].document.getElementsByTagName("body")[0].innerHTML;
var json = eval("(" + response + ")");
function toggleCollapsibleDiv(divName) var fileListing = document.getElementById("fileListing")
{ var newLi = document.createElement("li");
var display = document.getElementById(divName).style.display;
if(display == "none")
document.getElementById(divName).style.display = "inline";
else
document.getElementById(divName).style.display = "none";
}
function toggleCsvHelp() if(json.success)
{ newLi.innerHTML = json.fileName + " <span style=\"color:green\">" + json.errorMessage + "</span>";
toggleCollapsibleDiv("csvHelp-collapsible"); else
} newLi.innerHTML = json.fileName + " <span style=\"color:red\">upload failed: " + json.errorMessage + "</span>";
fileListing.appendChild(newLi);
function fileResponse() document.getElementById("${paramFirstUpload}").value = "false";
{
var response = frames["uploadTarget"].document.getElementsByTagName("body")[0].innerHTML;
var json = eval("(" + response + ")");
var fileListing = document.getElementById("fileListing") //document.getElementById("responseArea").innerHTML = response;
var newLi = document.createElement("li"); }
if(json.success) function init()
newLi.innerHTML = json.fileName + " <span style=\"color:green\">" + json.errorMessage + "</span>"; {
else document.getElementById("harvestButton").disabled = false;
newLi.innerHTML = json.fileName + " <span style=\"color:red\">upload failed: " + json.errorMessage + "</span>";
fileListing.appendChild(newLi);
document.getElementById("${paramFirstUpload}").value = "false"; document.getElementById("${paramFirstUpload}").value = "true";
document.getElementById("fileUploadForm").onsubmit = function()
{
document.getElementById("fileUploadForm").target = "uploadTarget";
document.getElementById("uploadTarget").onload = fileResponse;
}
document.getElementById("downloadTemplateForm").onsubmit = function()
{
document.getElementById("downloadTemplateForm").target = "uploadTarget";
}
}
//document.getElementById("responseArea").innerHTML = response; window.onload = init;
}
function init() $(document).ready(function() {
{ $('a.help').click(function() {
document.getElementById("harvestButton").disabled = false; $('#csvHelp-collapsible').toggleClass('hidden');
return false;
});
document.getElementById("${paramFirstUpload}").value = "true"; $('#harvestButton').click(function() {
document.getElementById("fileUploadForm").onsubmit = function() doHarvest();
{ return false;
document.getElementById("fileUploadForm").target = "uploadTarget"; });
document.getElementById("uploadTarget").onload = fileResponse; });
}
document.getElementById("downloadTemplateForm").onsubmit = function()
{
document.getElementById("downloadTemplateForm").target = "uploadTarget";
}
}
window.onload = init;
</script> </script>
<h2><a class="ingestMenu" href="${urls.base}/ingest">Ingest Menu</a> > ${jobSpecificHeader}</h2>
<style> <div id="step1" class="testfile-step">
h3.testfile-step-header <h3 class="testfile-step-header">Step 1</h3>
{ <div id="step1-inner" class="testfile-step-body">
float:left; <h4 class="testfile-step-subheader">Download template</h4>
padding-right:30px <form id="downloadTemplateForm" method="post" action=${postTo}>
} <input type="hidden" id="${paramMode}" name="${paramMode}" value="${modeDownloadTemplate}" />
h4.testfile-step-subheader <p><input id="submit" type="submit" name="submit" value="Download" /> ${jobSpecificDownloadHelp}</p>
{ </form>
</div>
<div class="clearBothDiv" />
</div>
} <div id="step2" class="testfile-step">
div.testfile-step-body <h3 class="testfile-step-header">Step 2</h3>
{ <div id="step2-inner" class="testfile-step-body">
overflow:hidden <h4 class="testfile-step-subheader">Fill in data <a class="help" href="#">Help</a></h4>
} <div id="csvHelp-collapsible" class="hidden">
div.clearBothDiv <div id="csvHelp-indented">
{ ${jobSpecificFillInHelp}
clear:both; </div>
padding-bottom:20px </div>
} <p>Fill in the template with your data. You may fill in multiple templates if you wish to harvest multiple files at once.</p>
</style> <div id="csvHelp">
</div>
</div>
<div class="clearBothDiv" />
</div>
<h2>${jobSpecificHeader}</h2> <div id="step3" class="testfile-step">
<div id="step1" class="testfile-step"> <h3 class="testfile-step-header">Step 3</h3>
<h3 class="testfile-step-header">Step 1</h3> <div id="step3-inner" class="testfile-step-body">
<div id="step1-inner" class="testfile-step-body"> <h4 class="testfile-step-subheader">Upload file(s)</h4>
<h4 class="testfile-step-subheader">Download template</h4> <p>Upload your filled-in template(s).</p>
<form id="downloadTemplateForm" method="post" action=${postTo}> <form id="fileUploadForm" method="post" enctype="multipart/form-data" action=${postTo}>
<input type="hidden" id="${paramMode}" name="${paramMode}" value="${modeDownloadTemplate}" /> <input type="hidden" id="${paramFirstUpload}" name="${paramFirstUpload}" value="true" />
<p><input type="submit" name="submit" value="Download" style="margin-right:10px" />${jobSpecificDownloadHelp}</p> <!--<input type="hidden" id="${paramJob}" name="${paramJob}" value="${job}" /> -->
</form> <input type="file" name="${paramUploadedFile}" />
</div> <input type="submit" name="submit" value="Upload" />
<div class="clearBothDiv" /> <iframe id="uploadTarget" name="uploadTarget" src=""></iframe>
</div> </form>
<div id="step2" class="testfile-step"> <h5>Uploaded files</h5>
<h3 class="testfile-step-header">Step 2</h3> <ul id="fileListing">
<div id="step2-inner" class="testfile-step-body"> </ul>
<h4 class="testfile-step-subheader">Fill in data <a style="font-size:smaller;margin-left:10px" onclick="toggleCsvHelp();return false;" href="#">Help</a></h4> </div>
<div id="csvHelp-collapsible" style="display:none"> <div class="clearBothDiv" />
<div id="csvHelp-indented" style="margin-left:20px;font-size:smaller"> </div>
${jobSpecificFillInHelp}
</div>
</div>
<p>Fill in the template with your data. You may fill in multiple templates if you wish to harvest multiple files at once.</p>
<div id="csvHelp">
</div>
</div>
<div class="clearBothDiv" />
</div>
<div id="step3" class="testfile-step">
<h3 class="testfile-step-header">Step 3</h3>
<div id="step3-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Upload file(s)</h4>
<p>Upload your filled-in template(s).</p>
<form id="fileUploadForm" method="post" enctype="multipart/form-data" action=${postTo}>
<input type="hidden" id="${paramFirstUpload}" name="${paramFirstUpload}" value="true" />
<!--<input type="hidden" id="${paramJob}" name="${paramJob}" value="${job}" /> -->
<input type="file" name="${paramUploadedFile}" />
<input type="submit" name="submit" value="Upload" />
<iframe id="uploadTarget" name="uploadTarget" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
<h5>Uploaded files</h5>
<ul id="fileListing">
</ul>
</div>
<div class="clearBothDiv" />
</div>
<div id="step4" class="testfile-step">
<h3 class="testfile-step-header">Step 4</h3>
<div id="step4-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Harvest</h4>
<p><input type="button" name="harvestButton" id="harvestButton" value="Harvest" style="margin-right:10px" onclick="doFunStuff();" /><span id="harvestButtonHelpText">Click the button to harvest your file(s).</span></p>
</div>
<div class="clearBothDiv" />
</div>
<div id="step4" class="testfile-step">
<h3 class="testfile-step-header">Step 4</h3>
<div id="step4-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Harvest</h4>
<p><input type="button" name="harvestButton" id="harvestButton" class="green button" value="Harvest" /><span id="harvestButtonHelpText">Click the button to harvest your file(s).</span></p>
</div>
<div class="clearBothDiv" />
</div>
<div id="step5" class="testfile-step"> <div id="step5" class="testfile-step">
<h3 class="testfile-step-header">Step 5</h3> <h3 class="testfile-step-header">Step 5</h3>
<div id="step5-inner" class="testfile-step-body"> <div id="step5-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">View results</h4> <h4 class="testfile-step-subheader">View results</h4>
<div id="script"> <div id="script">
<h5>Script being executed</h5> <h5>Script being executed</h5>
<textarea cols="100" rows="20" readonly="readonly" id="scriptTextArea"></textarea> <textarea cols="100" rows="20" readonly="readonly" id="scriptTextArea"></textarea>
</div> </div>
<div id="progress"> <div id="progress">
<h5>Progress</h5> <h5>Progress</h5>
<textarea cols="100" rows="20" readonly="readonly" id="progressTextArea"></textarea> <textarea cols="100" rows="20" readonly="readonly" id="progressTextArea"></textarea>
</div> </div>
<div id="summary"> <div id="summary">
<h5 id="linkHeader" style="display:none">${jobSpecificLinkHeader}</h5> <h5 id="linkHeader" class="hidden">${jobSpecificLinkHeader}</h5>
<ul id="importedItems"> <ul id="importedItems">
</ul> </ul>
</div> </div>
</div> </div>
<div class="clearBothDiv" /> <div class="clearBothDiv" />
</div> </div>
<#-- if job known --> ${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/harvester/fileharvest.css" />')}
</#if>
<#-- if job known -->
</#if>
<#-- if user is logged-in with site admin access --> <#-- if user is logged-in with site admin access -->
</#if> </#if>

View file

@ -423,7 +423,7 @@ class CsvFileHarvestJob implements FileHarvestJob {
public String getTemplateFillInHelp() { public String getTemplateFillInHelp() {
String newline = "\n"; String newline = "\n";
String help = ""; String help = "";
help += "<p>A CSV, or <b>C</b>omma-<b>S</b>eparated <b>V</b>alues file, is a method of storing tabular data in plain text. The first line of a CSV file contains header information, while each subsequent line contains a data record.</p>" + newline; help += "<p>A CSV, or <strong>C</strong>omma-<strong>S</strong>eparated </strong>V</strong>alues file, is a method of storing tabular data in plain text. The first line of a CSV file contains header information, while each subsequent line contains a data record.</p>" + newline;
help += "<p>The template we provide contains only the header, which you will then fill in accordingly. For example, if the template contains the text \"firstName,lastName\", then you might add two more lines, \"John,Doe\" and \"Jane,Public\".</p>" + newline; help += "<p>The template we provide contains only the header, which you will then fill in accordingly. For example, if the template contains the text \"firstName,lastName\", then you might add two more lines, \"John,Doe\" and \"Jane,Public\".</p>" + newline;
return help; return help;
} }

View file

@ -57,7 +57,7 @@ public class FileHarvestController extends FreemarkerHttpServlet {
private static final String PARAMETER_MODE = "mode"; private static final String PARAMETER_MODE = "mode";
private static final String PARAMETER_JOB = "job"; private static final String PARAMETER_JOB = "job";
private static final String POST_TO = "/vivo/harvester/harvest"; private static final String POST_TO = UrlBuilder.getUrl("/harvester/harvest");
private static final String MODE_HARVEST = "harvest"; private static final String MODE_HARVEST = "harvest";
private static final String MODE_CHECK_STATUS = "checkStatus"; private static final String MODE_CHECK_STATUS = "checkStatus";