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)>
<p>You must be an administrator to use this tool.</p>
<p>You must be an administrator to use this tool.</p>
<#else>
<#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>
<#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">
<script type="text/javascript">
var harvestProgressResponse;
var harvestProgressResponse;
function doFunStuff()
{
doHarvest();
}
function doHarvest()
{
document.getElementById("harvestButton").disabled = true;
document.getElementById("harvestButtonHelpText").innerHTML = "Please wait while your data is harvested.";
var request = createRequest();
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()
{
var response = harvestProgressResponse;
var json = eval("(" + response + ")");
function doHarvest()
{
document.getElementById("harvestButton").disabled = true;
document.getElementById("harvestButtonHelpText").innerHTML = "Please wait while your data is harvested.";
var logAppend = json.progressSinceLastCheck;
var progressTextArea = document.getElementById("progressTextArea");
progressTextArea.innerHTML = progressTextArea.innerHTML + logAppend;
progressTextArea.scrollTop = progressTextArea.scrollHeight;
var request = createRequest();
request.onreadystatechange=function() {
if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText;
if(!json.finished) {
var request = createRequest();
request.onreadystatechange=function() {
if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText;
window.setTimeout(continueHarvest, 1000);
}
}
request.open("POST", "${postTo}", true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//request.send("${paramMode}=${modeCheckStatus}&${paramJob}=${job}");
request.send("${paramMode}=${modeCheckStatus}");
} else {
var linkHeader = document.getElementById("linkHeader");
linkHeader.style.display = "inline";
var importedItems = document.getElementById("importedItems")
if(json.newlyAddedUrls.length > 0) {
for(var i = 0; i < json.newlyAddedUrls.length; i++) {
var newLi = document.createElement("li");
newLi.innerHTML = "<a href=\"" + json.newlyAddedUrls[i] + "\" target=\"_blank\">" + json.newlyAddedUris[i] + "</a>";
importedItems.appendChild(newLi);
}
} else {
var newLi = document.createElement("li");
newLi.innerHTML = "${jobSpecificNoNewDataMessage}";
importedItems.appendChild(newLi);
}
document.getElementById("harvestButtonHelpText").innerHTML = "Harvest complete. For another, please refresh the page.";
}
}
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 createRequest() {
var request;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
return request;
}
function continueHarvest()
{
var response = harvestProgressResponse;
var json = eval("(" + response + ")");
var logAppend = json.progressSinceLastCheck;
var progressTextArea = document.getElementById("progressTextArea");
progressTextArea.innerHTML = progressTextArea.innerHTML + logAppend;
progressTextArea.scrollTop = progressTextArea.scrollHeight;
if(!json.finished) {
var request = createRequest();
request.onreadystatechange=function() {
if(request.readyState == 4 && request.status == 200) {
harvestProgressResponse = request.responseText;
window.setTimeout(continueHarvest, 1000);
}
}
request.open("POST", "${postTo}", true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//request.send("${paramMode}=${modeCheckStatus}&${paramJob}=${job}");
request.send("${paramMode}=${modeCheckStatus}");
} else {
// var linkHeader = document.getElementById("linkHeader");
// linkHeader.style.display = "inline";
$('#linkHeader').removeClass('hidden');
var importedItems = document.getElementById("importedItems")
if(json.newlyAddedUrls.length > 0) {
for(var i = 0; i < json.newlyAddedUrls.length; i++) {
var newLi = document.createElement("li");
newLi.innerHTML = "<a href=\"" + json.newlyAddedUrls[i] + "\" target=\"_blank\">" + json.newlyAddedUris[i] + "</a>";
importedItems.appendChild(newLi);
}
} else {
var newLi = document.createElement("li");
newLi.innerHTML = "${jobSpecificNoNewDataMessage}";
importedItems.appendChild(newLi);
}
document.getElementById("harvestButtonHelpText").innerHTML = "Harvest complete. For another, please refresh the page.";
}
}
function toggleCollapsibleDiv(divName)
{
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()
{
toggleCollapsibleDiv("csvHelp-collapsible");
}
function createRequest() {
var request;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
return request;
}
function fileResponse()
{
var response = frames["uploadTarget"].document.getElementsByTagName("body")[0].innerHTML;
var json = eval("(" + response + ")");
var fileListing = document.getElementById("fileListing")
var newLi = document.createElement("li");
if(json.success)
newLi.innerHTML = json.fileName + " <span style=\"color:green\">" + json.errorMessage + "</span>";
else
newLi.innerHTML = json.fileName + " <span style=\"color:red\">upload failed: " + json.errorMessage + "</span>";
fileListing.appendChild(newLi);
document.getElementById("${paramFirstUpload}").value = "false";
//document.getElementById("responseArea").innerHTML = response;
}
function init()
{
document.getElementById("harvestButton").disabled = false;
function fileResponse()
{
var response = frames["uploadTarget"].document.getElementsByTagName("body")[0].innerHTML;
var json = eval("(" + response + ")");
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";
}
}
window.onload = init;
var fileListing = document.getElementById("fileListing")
var newLi = document.createElement("li");
</script>
if(json.success)
newLi.innerHTML = json.fileName + " <span style=\"color:green\">" + json.errorMessage + "</span>";
else
newLi.innerHTML = json.fileName + " <span style=\"color:red\">upload failed: " + json.errorMessage + "</span>";
fileListing.appendChild(newLi);
document.getElementById("${paramFirstUpload}").value = "false";
<style>
h3.testfile-step-header
{
float:left;
padding-right:30px
}
h4.testfile-step-subheader
{
}
div.testfile-step-body
{
overflow:hidden
}
div.clearBothDiv
{
clear:both;
padding-bottom:20px
}
</style>
//document.getElementById("responseArea").innerHTML = response;
}
<h2>${jobSpecificHeader}</h2>
<div id="step1" class="testfile-step">
<h3 class="testfile-step-header">Step 1</h3>
<div id="step1-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Download template</h4>
<form id="downloadTemplateForm" method="post" action=${postTo}>
<input type="hidden" id="${paramMode}" name="${paramMode}" value="${modeDownloadTemplate}" />
<p><input type="submit" name="submit" value="Download" style="margin-right:10px" />${jobSpecificDownloadHelp}</p>
</form>
</div>
<div class="clearBothDiv" />
</div>
<div id="step2" class="testfile-step">
<h3 class="testfile-step-header">Step 2</h3>
<div id="step2-inner" class="testfile-step-body">
<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 id="csvHelp-collapsible" style="display:none">
<div id="csvHelp-indented" style="margin-left:20px;font-size:smaller">
${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>
function init()
{
document.getElementById("harvestButton").disabled = 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";
}
}
window.onload = init;
$(document).ready(function() {
$('a.help').click(function() {
$('#csvHelp-collapsible').toggleClass('hidden');
return false;
});
$('#harvestButton').click(function() {
doHarvest();
return false;
});
});
<div id="step5" class="testfile-step">
<h3 class="testfile-step-header">Step 5</h3>
<div id="step5-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">View results</h4>
<div id="script">
<h5>Script being executed</h5>
<textarea cols="100" rows="20" readonly="readonly" id="scriptTextArea"></textarea>
</div>
<div id="progress">
<h5>Progress</h5>
<textarea cols="100" rows="20" readonly="readonly" id="progressTextArea"></textarea>
</div>
<div id="summary">
<h5 id="linkHeader" style="display:none">${jobSpecificLinkHeader}</h5>
<ul id="importedItems">
</ul>
</div>
</div>
<div class="clearBothDiv" />
</div>
<#-- if job known -->
</#if>
</script>
<h2><a class="ingestMenu" href="${urls.base}/ingest">Ingest Menu</a> > ${jobSpecificHeader}</h2>
<div id="step1" class="testfile-step">
<h3 class="testfile-step-header">Step 1</h3>
<div id="step1-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Download template</h4>
<form id="downloadTemplateForm" method="post" action=${postTo}>
<input type="hidden" id="${paramMode}" name="${paramMode}" value="${modeDownloadTemplate}" />
<p><input id="submit" type="submit" name="submit" value="Download" /> ${jobSpecificDownloadHelp}</p>
</form>
</div>
<div class="clearBothDiv" />
</div>
<div id="step2" class="testfile-step">
<h3 class="testfile-step-header">Step 2</h3>
<div id="step2-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">Fill in data <a class="help" href="#">Help</a></h4>
<div id="csvHelp-collapsible" class="hidden">
<div id="csvHelp-indented">
${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=""></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" 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">
<h3 class="testfile-step-header">Step 5</h3>
<div id="step5-inner" class="testfile-step-body">
<h4 class="testfile-step-subheader">View results</h4>
<div id="script">
<h5>Script being executed</h5>
<textarea cols="100" rows="20" readonly="readonly" id="scriptTextArea"></textarea>
</div>
<div id="progress">
<h5>Progress</h5>
<textarea cols="100" rows="20" readonly="readonly" id="progressTextArea"></textarea>
</div>
<div id="summary">
<h5 id="linkHeader" class="hidden">${jobSpecificLinkHeader}</h5>
<ul id="importedItems">
</ul>
</div>
</div>
<div class="clearBothDiv" />
</div>
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/harvester/fileharvest.css" />')}
<#-- if job known -->
</#if>
<#-- if user is logged-in with site admin access -->
</#if>
</#if>

View file

@ -423,7 +423,7 @@ class CsvFileHarvestJob implements FileHarvestJob {
public String getTemplateFillInHelp() {
String newline = "\n";
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;
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_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_CHECK_STATUS = "checkStatus";