2020-02-07 14:21:59 +00:00
|
|
|
{% extends "nopaque.html.j2" %}
|
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
{% set headline = '<i class="left material-icons service" data-service="{service}" style="font-size: inherit;"></i>Job view'.format(service=job.service) %}
|
2019-08-09 09:49:09 +00:00
|
|
|
|
|
|
|
{% block page_content %}
|
2020-05-13 14:36:06 +00:00
|
|
|
<div class="col s12">
|
|
|
|
<div class="card">
|
|
|
|
<div class="card-content">
|
|
|
|
<div class="row">
|
|
|
|
<div class="col s8 m9 l10">
|
|
|
|
<span class="card-title title">{{ job.title }}</span>
|
|
|
|
</div>
|
2019-09-11 12:51:59 +00:00
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
<div class="col s4 m3 l2 right-align">
|
|
|
|
<span class="chip status white-text"></span>
|
|
|
|
<div class="active preloader-wrapper small" id="progress-indicator">
|
|
|
|
<div class="spinner-layer spinner-blue-only">
|
|
|
|
<div class="circle-clipper left">
|
|
|
|
<div class="circle"></div>
|
|
|
|
</div>
|
|
|
|
<div class="gap-patch">
|
|
|
|
<div class="circle"></div>
|
|
|
|
</div>
|
|
|
|
<div class="circle-clipper right">
|
|
|
|
<div class="circle"></div>
|
|
|
|
</div>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12">
|
|
|
|
<p class="description">{{ job.description }}</p>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12"> </div>
|
|
|
|
|
|
|
|
<div class="col s12 m6">
|
|
|
|
<div class="input-field">
|
|
|
|
<input disabled id="creation-date" type="text" value="{{ job.creation_date.strftime('%m/%d/%Y, %H:%M:%S %p') }}">
|
|
|
|
<label for="creation-date">Creation date</label>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
2020-02-12 13:48:29 +00:00
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
<div class="col s12 m6">
|
|
|
|
<div class="input-field">
|
|
|
|
<input class="end-date" disabled id="end-date" type="text" value="">
|
|
|
|
<label for="end-date">End date</label>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12 m4">
|
|
|
|
<div class="input-field">
|
|
|
|
<input disabled id="service" type="text" value="{{ job.service }}">
|
|
|
|
<label for="service">Service</label>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
2020-02-12 13:48:29 +00:00
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
<div class="col s12 m4">
|
|
|
|
<div class="input-field">
|
|
|
|
<input disabled id="service-args" type="text" value="{{ job.service_args|e }}">
|
|
|
|
<label for="service-args">Service arguments</label>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12 m4">
|
|
|
|
<div class="input-field">
|
|
|
|
<input disabled id="service-version" type="text" value="{{ job.service_version }}">
|
|
|
|
<label for="service-version">Service version</label>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="card-action right-align">
|
|
|
|
<a href="#" class="btn disabled waves-effect waves-light"><i class="material-icons left">settings</i>Export Parameters</a>
|
|
|
|
<a data-target="delete-job-modal" class="waves-effect waves-light btn red modal-trigger"><i class="material-icons left">delete</i>Delete</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12">
|
|
|
|
<div class="card">
|
2020-06-10 12:25:57 +00:00
|
|
|
<div class="card-content" id="inputs">
|
2020-05-13 14:36:06 +00:00
|
|
|
<div class="row">
|
|
|
|
<div class="col s12 m2">
|
|
|
|
<span class="card-title"><i class="left material-icons" style="font-size: inherit;">input</i>Inputs</span>
|
|
|
|
<p>Original input files.</p>
|
|
|
|
</div>
|
|
|
|
<div class="col s12 m10">
|
|
|
|
<div class="inputs row">
|
2020-06-10 12:25:57 +00:00
|
|
|
<ul class="pagination paginationTop"></ul>
|
|
|
|
{{ job_input_table }}
|
|
|
|
<ul class="pagination paginationBottom"></ul>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col s12">
|
|
|
|
<div class="card">
|
|
|
|
<div class="card-content">
|
|
|
|
<div class="row">
|
|
|
|
<div class="col s12 m2">
|
|
|
|
<span class="card-title"><i class="left material-icons" style="font-size: inherit;">done</i>Results</span>
|
|
|
|
<p>Processed result files.</p>
|
|
|
|
</div>
|
|
|
|
<div class="col s12 m10">
|
2020-06-10 14:00:33 +00:00
|
|
|
<table class="highlight responsive-table">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th>Result Type</th>
|
|
|
|
<th>Archive Name</th>
|
|
|
|
<th>Download</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody class="results">
|
|
|
|
<tr class="show-if-only-child">
|
|
|
|
<td colspan="3">
|
|
|
|
<span class="card-title">
|
|
|
|
<i class="left material-icons" style="font-size: inherit;">file_download</i>Nothing here...
|
|
|
|
</span>
|
|
|
|
<p>
|
|
|
|
No results available (yet). Is the job already completed?
|
|
|
|
</p>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
2020-02-12 13:48:29 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-05-13 14:36:06 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2019-08-09 09:49:09 +00:00
|
|
|
</div>
|
|
|
|
|
2019-11-15 10:45:04 +00:00
|
|
|
|
2019-11-04 15:58:15 +00:00
|
|
|
<!-- Modals -->
|
|
|
|
<div id="delete-job-modal" class="modal">
|
|
|
|
<div class="modal-content">
|
|
|
|
<h4>Confirm deletion</h4>
|
2020-05-13 14:36:06 +00:00
|
|
|
<p>Do you really want to delete the job {{ job.title }}? All associated files will be permanently deleted.</p>
|
2019-11-04 15:58:15 +00:00
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2020-02-20 14:59:08 +00:00
|
|
|
<a href="#!" class="btn modal-close waves-effect waves-light">Cancel</a>
|
|
|
|
<a class="btn modal-close red waves-effect waves-light" href="{{ url_for('jobs.delete_job', job_id=job.id) }}"><i class="material-icons left">delete</i>Delete</a>
|
2019-11-04 15:58:15 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2019-11-15 10:45:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
<script>
|
2020-06-10 12:25:57 +00:00
|
|
|
// job_input_table code
|
|
|
|
var options = {page: 5,
|
|
|
|
pagination: [
|
|
|
|
{
|
|
|
|
name: "paginationTop",
|
|
|
|
paginationClass: "paginationTop",
|
|
|
|
innerWindow: 8,
|
|
|
|
outerWindow: 1
|
|
|
|
},
|
|
|
|
{
|
|
|
|
paginationClass: "paginationBottom",
|
|
|
|
innerWindow: 8,
|
|
|
|
outerWindow: 1
|
|
|
|
}
|
|
|
|
],
|
|
|
|
valueNames: ['filename']};
|
|
|
|
var jobInputList = new List('inputs', options);
|
|
|
|
|
|
|
|
|
2019-11-15 10:45:04 +00:00
|
|
|
class InformationUpdater {
|
|
|
|
constructor(jobId, foreignJobFlag) {
|
|
|
|
this.jobId = jobId;
|
|
|
|
this.foreignJobFlag = foreignJobFlag;
|
2020-04-15 12:30:41 +00:00
|
|
|
|
2019-11-15 10:45:04 +00:00
|
|
|
if (this.foreignJobFlag) {
|
2020-01-20 08:49:39 +00:00
|
|
|
nopaque.foreignJobsSubscribers.push(this);
|
2019-11-15 10:45:04 +00:00
|
|
|
} else {
|
2020-01-20 08:49:39 +00:00
|
|
|
nopaque.jobsSubscribers.push(this);
|
2019-11-15 10:45:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_init() {
|
2020-01-20 08:49:39 +00:00
|
|
|
let job;
|
|
|
|
|
2020-04-30 09:28:55 +00:00
|
|
|
job = (this.foreignJobFlag ? nopaque.foreignUser.jobs[this.jobId]
|
|
|
|
: nopaque.user.jobs[this.jobId]);
|
2020-05-13 14:36:06 +00:00
|
|
|
// Results
|
|
|
|
this.addResults(job.results);
|
2019-11-15 10:45:04 +00:00
|
|
|
// End date
|
|
|
|
this.setEndDate(job.end_date);
|
|
|
|
// Status
|
|
|
|
this.setStatus(job.status);
|
|
|
|
}
|
|
|
|
|
|
|
|
_update(patch) {
|
2020-01-20 08:49:39 +00:00
|
|
|
let pathArray;
|
2019-11-15 10:45:04 +00:00
|
|
|
|
|
|
|
for (let operation of patch) {
|
2020-04-30 09:28:55 +00:00
|
|
|
/* "/jobs/{jobId}/..." -> ["{jobId}", ...] */
|
|
|
|
pathArray = operation.path.split("/").slice(2);
|
2019-11-15 10:45:04 +00:00
|
|
|
if (pathArray[0] != this.jobId) {continue;}
|
|
|
|
switch(operation.op) {
|
|
|
|
case "add":
|
2020-01-30 10:01:17 +00:00
|
|
|
if (pathArray[1] === "results") {
|
2020-05-13 14:36:06 +00:00
|
|
|
this.addResults([operation.value]);
|
2019-11-15 10:45:04 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "delete":
|
|
|
|
location.reload();
|
|
|
|
break;
|
|
|
|
case "replace":
|
|
|
|
if (pathArray[1] === "end_date") {
|
|
|
|
this.setEndDate(operation.value);
|
|
|
|
} else if (pathArray[1] === "status") {
|
|
|
|
this.setStatus(operation.value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
addResults(results) {
|
|
|
|
let resultsArray, resultsElements, resultsHTML, resultType;
|
|
|
|
resultsArray = Object.values(results);
|
2020-04-30 09:28:55 +00:00
|
|
|
resultsArray.sort(function (a, b) {
|
|
|
|
if (a.filename < b.filename) {return -1;}
|
|
|
|
if (a.filename > b.filename) {return 1;}
|
2020-03-02 10:06:36 +00:00
|
|
|
return 0;
|
|
|
|
});
|
2020-06-10 14:00:33 +00:00
|
|
|
resultsHTML = ``;
|
2020-04-30 09:28:55 +00:00
|
|
|
for (let result of resultsArray) {
|
2020-05-13 14:36:06 +00:00
|
|
|
if (result.filename.endsWith(".pdf.zip")) {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "PDF file with text layer";
|
2020-05-13 14:36:06 +00:00
|
|
|
} else if (result.filename.endsWith(".txt.zip")) {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "Raw text files";
|
2020-05-13 14:36:06 +00:00
|
|
|
} else if (result.filename.endsWith(".vrt.zip")) {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "VRT(XML dialect) files holding the NLP data";
|
2020-05-13 14:36:06 +00:00
|
|
|
} else if (result.filename.endsWith(".xml.zip")) {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "XML files";
|
2020-06-10 12:25:57 +00:00
|
|
|
} else if (result.filename.endsWith(".poco.zip")) {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "HCOR und image files needed for Post correction(PoCo)";
|
2020-05-13 14:36:06 +00:00
|
|
|
} else {
|
2020-06-10 14:00:33 +00:00
|
|
|
resultType = "All result files created during this job";
|
2020-05-13 14:36:06 +00:00
|
|
|
}
|
2020-06-10 14:00:33 +00:00
|
|
|
resultsHTML += `
|
|
|
|
<tr>
|
|
|
|
<td>${resultType}</td>
|
|
|
|
<td>${result.filename}</td>
|
|
|
|
<td>
|
|
|
|
<a class="btn-floating waves-effect waves-light" download href="/jobs/${result.job_id}/results/${result.id}/download">
|
|
|
|
<i class="material-icons left">file_download</i>
|
|
|
|
</a>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
`;
|
|
|
|
};
|
|
|
|
resultsHTML += `
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
`;
|
2020-05-13 14:36:06 +00:00
|
|
|
resultsElements = document.querySelectorAll(".results");
|
|
|
|
for (let resultsElement of resultsElements) {
|
|
|
|
resultsElement.innerHTML += resultsHTML;
|
2020-01-30 10:01:17 +00:00
|
|
|
}
|
2019-11-15 10:45:04 +00:00
|
|
|
}
|
|
|
|
|
2020-05-13 14:36:06 +00:00
|
|
|
setEndDate(timestamp) {
|
|
|
|
let endDate;
|
|
|
|
|
|
|
|
if (timestamp === null) {
|
|
|
|
endDate = "N.a.";
|
|
|
|
} else {
|
|
|
|
endDate = new Date(timestamp * 1000).toLocaleString("en-US");
|
|
|
|
}
|
|
|
|
document.getElementById("end-date").value = endDate;
|
|
|
|
M.updateTextFields();
|
|
|
|
}
|
|
|
|
|
2019-11-15 10:45:04 +00:00
|
|
|
setStatus(status) {
|
2020-05-13 14:36:06 +00:00
|
|
|
let progressIndicator, statusElements;
|
2020-02-12 15:24:56 +00:00
|
|
|
if (status === "complete") {
|
|
|
|
progressIndicator = document.getElementById("progress-indicator");
|
|
|
|
progressIndicator.classList.add("hide");
|
|
|
|
}
|
2020-05-13 14:36:06 +00:00
|
|
|
statusElements = document.querySelectorAll(".status");
|
|
|
|
for (let statusElement of statusElements) {
|
|
|
|
statusElement.dataset.status = status;
|
|
|
|
}
|
2019-11-15 10:45:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{% if job.creator == current_user %}
|
|
|
|
var informationUpdater = new InformationUpdater({{ job.id }}, false);
|
|
|
|
{% else %}
|
|
|
|
var informationUpdater = new InformationUpdater({{ job.id }}, true);
|
2020-03-28 10:57:12 +00:00
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
2020-05-20 08:32:39 +00:00
|
|
|
nopaque.socket.emit("foreign_user_data_stream_init", {{ job.user_id }});
|
2020-03-28 10:57:12 +00:00
|
|
|
});
|
2019-11-15 10:45:04 +00:00
|
|
|
{% endif %}
|
|
|
|
</script>
|
2019-08-09 09:49:09 +00:00
|
|
|
{% endblock %}
|