Merge branch 'development' of gitlab.ub.uni-bielefeld.de:sfb1288inf/nopaque into development

This commit is contained in:
Patrick Jentsch 2020-07-16 14:41:05 +02:00
commit d4c6b72761
6 changed files with 130 additions and 70 deletions

View File

@ -21,8 +21,8 @@ main {
/* preloader circle in the size of a button icon */ /* preloader circle in the size of a button icon */
.button-icon-spinner { .button-icon-spinner {
bottom: -8px !important; bottom: -5px !important;
right: -16px !important; right: 0px !important;
margin-right: 12px !important; margin-right: 12px !important;
width: 19.5px !important; width: 19.5px !important;
height: 19.5px !important; height: 19.5px !important;

View File

@ -93,7 +93,8 @@ class CorpusAnalysisClient {
if (this.callbacks.query_match_context != undefined) { if (this.callbacks.query_match_context != undefined) {
this.callbacks.query_match_context(response); this.callbacks.query_match_context(response);
} }
} else if (response.type === "sub-results"){ } else if (response.type === "sub-results"
|| response.type ==="results"){
if (this.callbacks.save_sub_results_choices != undefined) { if (this.callbacks.save_sub_results_choices != undefined) {
this.callbacks.save_sub_results_choices(response); this.callbacks.save_sub_results_choices(response);
} }

View File

@ -3,6 +3,7 @@ class Results {
this.data = data; this.data = data;
this.jsList = jsList; this.jsList = jsList;
this.metaData = metaData this.metaData = metaData
this.resultsData = new Data();
this.subResultsData = new Data(); this.subResultsData = new Data();
} }
@ -89,15 +90,20 @@ class Data {
this.download(downloadElement, dataStr, resultFilename, "text/json", ".json") this.download(downloadElement, dataStr, resultFilename, "text/json", ".json")
} }
// createSubResultsData from subResultsTmpData // create results data either from all results or from al lmarked sub results
createSubResultsData() { createResultsData(type) {
if (type === "sub-results") {
resultsCreateElement.classList.add("disabled"); // cqp server cannot handle more than one request at a time. Thus we deactivate the resultsCreateElement
let tmp = [...results.jsList.addToSubResultsIdsToShow].sort(function(a, b){return a-b}); let tmp = [...results.jsList.addToSubResultsIdsToShow].sort(function(a, b){return a-b});
let dataIndexes = []; let dataIndexes = [];
tmp.forEach((index) => dataIndexes.push(index - 1)); tmp.forEach((index) => dataIndexes.push(index - 1));
console.log(dataIndexes);
results.jsList.getMatchWithContext(dataIndexes, "sub-results"); results.jsList.getMatchWithContext(dataIndexes, "sub-results");
} else if (type === "results") {
subResultsCreateElement.classList.add("disabled"); // cqp server cannot handle more than one request at a time. Thus we deactivate the subResultsCreateElement
let dataIndexes = [...Array(results.data.match_count).keys()];
results.jsList.getMatchWithContext(dataIndexes, "results");
}
} }
} }
class MetaData { class MetaData {

View File

@ -2,34 +2,65 @@
// Handels incoming corpus metadata // Handels incoming corpus metadata
function recvMetaData(payload) { function recvMetaData(payload) {
results.metaData.init(payload) results.metaData.init(payload)
console.log(results.metaData); console.log("Metada recieved:", results.metaData);
} }
// This callback is called in socket.on "corpus_analysis_inspect_match" but // This callback is called in socket.on "corpus_analysis_inspect_match" but
// only if the response.type is "sub-results". // only if the response.type is "sub-results".
// Saves the incoming inspect match results into results.subResultsData. // Saves the incoming inspect match results into results.subResultsData.
function saveSubResultsChoices(response) { function saveSubResultsChoices(response) {
console.log("Recieve match with context"); console.log("Recieving results for export.");
results.subResultsData.init(); if (response.type === "sub-results") {
results.subResultsData.matches.push(...response.payload.matches); results.subResultsData.init();
results.subResultsData.addData(response.payload.cpos_lookup, "cpos_lookup"); results.subResultsData.matches.push(...response.payload.matches);
results.subResultsData.addData(response.payload.text_lookup, "text_lookup"); results.subResultsData.addData(response.payload.cpos_lookup, "cpos_lookup");
results.subResultsData.addData(results.metaData); results.subResultsData.addData(response.payload.text_lookup, "text_lookup");
results.subResultsData.query = results.data.query; results.subResultsData.addData(results.metaData);
results.subResultsData.corpus_type = "sub-results"; results.subResultsData.query = results.data.query;
results.subResultsData.match_count = [...response.payload.matches].length; results.subResultsData.corpus_type = response.type;
results.subResultsData.cpos_ranges = response.payload.cpos_ranges; results.subResultsData.match_count = [...response.payload.matches].length;
console.log(results.subResultsData); results.subResultsData.cpos_ranges = response.payload.cpos_ranges;
subResultsCreateElement.getElementsByClassName("button-icon-spinner")[0].remove(); // hides create element after all results are revieved
subResultsCreateElement.getElementsByTagName("i")[0].classList.remove("hide"); subResultsCreateElement.classList.add("hide");
subResultsCreateElement.firstElementChild.classList.add("disabled"); // shows export element after create element hs been hidden
subResultsExportElement.classList.remove("disabled", "btn-flat"); subResultsExportElement.classList.remove("hide", "btn-flat");
subResultsExportElement.classList.add("pulse", "btn-small"); subResultsExportElement.classList.add("pulse", "btn-small");
setTimeout(() => { setTimeout(() => {
subResultsExportElement.classList.remove("pulse", "btn-small"); subResultsExportElement.classList.remove("pulse", "btn-small");
subResultsExportElement.classList.add("btn-flat"); subResultsExportElement.classList.add("btn-flat");
clearTimeout(); clearTimeout();
}, 3000) }, 3000)
// Resets the subResultsCreateElement (removing spinner with setting innerText)
subResultsCreateElement.innerText = "Create Sub-Results";
subResultsCreateElement.insertAdjacentHTML("beforeend", `<i class="material-icons left">build</i>`);
// reactivate resultsCreateElement
resultsCreateElement.classList.remove("disabled");
} else if (response.type === "results") {
results.resultsData.init();
results.resultsData.matches.push(...response.payload.matches);
results.resultsData.addData(response.payload.cpos_lookup, "cpos_lookup");
results.resultsData.addData(response.payload.text_lookup, "text_lookup");
results.resultsData.addData(results.metaData);
results.resultsData.query = results.data.query;
results.resultsData.corpus_type = response.type;
results.resultsData.match_count = [...response.payload.matches].length;
results.resultsData.cpos_ranges = response.payload.cpos_ranges;
// hides create element after all results are revieved
resultsCreateElement.classList.add("hide");
// shows export element after create element hs been hidden
resultsExportElement.classList.remove("hide", "btn-flat");
resultsExportElement.classList.add("pulse", "btn-small");
setTimeout(() => {
resultsExportElement.classList.remove("pulse", "btn-small");
resultsExportElement.classList.add("btn-flat");
clearTimeout();
}, 3000)
// Resets the resultsCreateElement (removing spinner with setting innerText)
resultsCreateElement.innerText = "Create Sub-Results";
resultsCreateElement.insertAdjacentHTML("beforeend", `<i class="material-icons left">build</i>`);
// reactivate subResultsCreateElement
subResultsCreateElement.classList.remove("disabled");
}
} }
@ -43,7 +74,7 @@ function querySetup(payload) {
nrMarkedMatches.innerText = 0; nrMarkedMatches.innerText = 0;
results.jsList.addToSubResultsStatus = {}; results.jsList.addToSubResultsStatus = {};
results.jsList.addToSubResultsIdsToShow = new Set(); results.jsList.addToSubResultsIdsToShow = new Set();
queryResultsExportElement.classList.add("disabled"); resultsExportElement.classList.add("disabled");
addToSubResultsElement.setAttribute("disabled", ""); addToSubResultsElement.setAttribute("disabled", "");
queryResultsDeterminateElement.style.width = "0%"; queryResultsDeterminateElement.style.width = "0%";
queryResultsProgressElement.classList.remove("hide"); queryResultsProgressElement.classList.remove("hide");
@ -89,7 +120,7 @@ function queryRenderResults(payload, imported=false) {
if (progress === 100) { if (progress === 100) {
queryResultsProgressElement.classList.add("hide"); queryResultsProgressElement.classList.add("hide");
queryResultsUserFeedbackElement.classList.add("hide"); queryResultsUserFeedbackElement.classList.add("hide");
queryResultsExportElement.classList.remove("disabled"); resultsExportElement.classList.remove("disabled");
addToSubResultsElement.removeAttribute("disabled"); addToSubResultsElement.removeAttribute("disabled");
// inital expert mode check and sub results activation // inital expert mode check and sub results activation
results.jsList.activateInspect(); results.jsList.activateInspect();
@ -109,7 +140,6 @@ function queryRenderResults(payload, imported=false) {
} }
helperQueryRenderResults(payload); helperQueryRenderResults(payload);
progress = 100; progress = 100;
console.log(progress);
results.jsList.activateInspect(); results.jsList.activateInspect();
if (expertModeSwitchElement.checked) { if (expertModeSwitchElement.checked) {
results.jsList.expertModeOn("query-display"); results.jsList.expertModeOn("query-display");

View File

@ -368,7 +368,9 @@ class ResultsList extends List {
// activate the add buttons // activate the add buttons
activateAddToSubResults() { activateAddToSubResults() {
subResultsIdListElement.classList.remove("hide"); subResultsIdListElement.classList.remove("hide");
subResultsCreateElement.classList.remove("hide"); if (subResultsExportElement.classList.contains("hide")) {
subResultsCreateElement.classList.remove("hide");
}
let addToSubResultsBtnElements = document.getElementsByClassName("add"); let addToSubResultsBtnElements = document.getElementsByClassName("add");
for (let addToSubResultsBtn of addToSubResultsBtnElements) { for (let addToSubResultsBtn of addToSubResultsBtnElements) {
addToSubResultsBtn.classList.remove("hide"); addToSubResultsBtn.classList.remove("hide");
@ -427,13 +429,14 @@ class ResultsList extends List {
} }
// Toggles the create button accoring to the number of ids in addToSubResultsIdsToShow // Toggles the create button accoring to the number of ids in addToSubResultsIdsToShow
if ([...this.addToSubResultsIdsToShow].length > 0) { if ([...this.addToSubResultsIdsToShow].length > 0) {
subResultsCreateElement.firstElementChild.classList.remove("disabled"); subResultsCreateElement.classList.remove("disabled");
} else if ([...this.addToSubResultsIdsToShow].length === 0) { } else if ([...this.addToSubResultsIdsToShow].length === 0) {
subResultsCreateElement.firstElementChild.classList.add("disabled"); subResultsCreateElement.classList.add("disabled");
} }
// After a match as been added or removed the export button will be // After a match as been added or removed the export button will be
// disabled because the sub-results have been alterd and have to be built //// again. // hidden because the sub-results have been alterd and have to be built //// again. Thus subResultsCreateElement has to be shown again.
subResultsExportElement.classList.add("disabled"); subResultsExportElement.classList.add("hide");
subResultsCreateElement.classList.remove("hide");
// Also activate/deactivate buttons in the table/jsList results accordingly // Also activate/deactivate buttons in the table/jsList results accordingly
//if button in inspect was activated/deactivated. //if button in inspect was activated/deactivated.
// This part only runs if tableCall is false. // This part only runs if tableCall is false.

View File

@ -79,21 +79,37 @@
<div class="divider" style="margin-bottom: 10px;"></div> <div class="divider" style="margin-bottom: 10px;"></div>
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">
<button class="waves-effect
waves-light
btn-flat"
type="submit"
id="results-create">Create Results
<i class="material-icons left">build</i>
</button>
<button id="query-results-export" <button id="query-results-export"
class="waves-effect class="waves-effect
waves-light waves-light
btn-flat btn-flat
disabled" hide"
type="submit">Results type="submit">Results
<i class="material-icons left">file_download</i> <i class="material-icons left">file_download</i>
</button> </button>
</div> </div>
<div class="col s12"> <div class="col s12">
<button class="waves-effect
waves-light
btn-flat
hide
disabled"
type="submit"
id="sub-results-create">Create Sub-Results
<i class="material-icons left">build</i>
</button>
<button id="sub-results-export" <button id="sub-results-export"
class="waves-effect class="waves-effect
waves-light waves-light
btn-flat btn-flat
disabled" hide"
type="submit">Sub-Results type="submit">Sub-Results
<i class="material-icons left">file_download</i> <i class="material-icons left">file_download</i>
</button> </button>
@ -127,15 +143,6 @@
</textarea> </textarea>
</div> </div>
</div> </div>
<div class="col s12 hide" id="sub-results-create-div">
<button class="waves-effect
waves-light
btn-flat
disabled"
type="submit">Create
<i class="material-icons left">build</i>
</button>
</div>
</div> </div>
</div> </div>
<div class="col s12 m3 l3" id="display"> <div class="col s12 m3 l3" id="display">
@ -370,14 +377,15 @@
var queryDisplay; // CorpusAnalysisDisplay object first undfined on DOMContentLoaded defined var queryDisplay; // CorpusAnalysisDisplay object first undfined on DOMContentLoaded defined
var queryFormElement; // the query form var queryFormElement; // the query form
var queryResultsDeterminateElement; // The progress bar for recieved results var queryResultsDeterminateElement; // The progress bar for recieved results
var queryResultsExportElement; // Download button opens download modal var resultsExportElement; // Download button opens download modal
var queryResultsProgressElement; // Div element holding the progress bar var queryResultsProgressElement; // Div element holding the progress bar
var queryResultsUserFeedbackElement; // Element showing match count|total etc var queryResultsUserFeedbackElement; // Element showing match count|total etc
var receivedMatchCountElement; // Nr. of loaded matches will be displayed in this element var receivedMatchCountElement; // Nr. of loaded matches will be displayed in this element
var results; // results object var results; // results object
var resultsList; // resultsList object var resultsList; // resultsList object
var resultsListOptions; // specifies ResultsList options var resultsListOptions; // specifies ResultsList options
var subResultsCreateElement; // if presses sub results will be created from ids var subResultsCreateElement; // if pressed sub results will be created from ids
var resultsCreateElement; // if pressed results will pe created for all matches
var subResultsExportElement; // button to download sub results var subResultsExportElement; // button to download sub results
var subResultsIdListElement; // list showing marked matches for sub corpus creation var subResultsIdListElement; // list showing marked matches for sub corpus creation
var textLookupCountElement // Nr of texts the matches occured in will be shown in this element var textLookupCountElement // Nr of texts the matches occured in will be shown in this element
@ -420,11 +428,12 @@
queryDisplayElement = document.getElementById("query-display"); queryDisplayElement = document.getElementById("query-display");
queryFormElement = document.getElementById("query-form"); queryFormElement = document.getElementById("query-form");
queryResultsDeterminateElement = document.getElementById("query-results-determinate"); queryResultsDeterminateElement = document.getElementById("query-results-determinate");
queryResultsExportElement = document.getElementById("query-results-export"); resultsExportElement = document.getElementById("query-results-export");
queryResultsProgressElement = document.getElementById("query-results-progress"); queryResultsProgressElement = document.getElementById("query-results-progress");
queryResultsUserFeedbackElement = document.getElementById("query-results-user-feedback"); queryResultsUserFeedbackElement = document.getElementById("query-results-user-feedback");
receivedMatchCountElement = document.getElementById("received-match-count"); receivedMatchCountElement = document.getElementById("received-match-count");
subResultsCreateElement = document.getElementById("sub-results-create-div"); subResultsCreateElement = document.getElementById("sub-results-create");
resultsCreateElement = document.getElementById("results-create");
subResultsExportElement = document.getElementById("sub-results-export"); subResultsExportElement = document.getElementById("sub-results-export");
subResultsIdListElement = document.getElementById("sub-results-match-ids-div"); subResultsIdListElement = document.getElementById("sub-results-match-ids-div");
textLookupCountElement = document.getElementById("text-lookup-count"); textLookupCountElement = document.getElementById("text-lookup-count");
@ -580,37 +589,48 @@
}); });
// ### Download events and sub-results creation ### // ### Download events and sub-results creation ###
var loadingSpinnerHTML = `
<div class="preloader-wrapper button-icon-spinner small active">
<div class="spinner-layer spinner-green-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>
</div>
</div>
`
// create results on click from all match ids
resultsCreateElement.onclick = () => {
resultsCreateElement.getElementsByTagName("i")[0].classList.add("hide");
resultsCreateElement.innerText = "Creating...";
resultsCreateElement.insertAdjacentHTML("afterbegin", loadingSpinnerHTML);
results.data.createResultsData("results");
}
// Add onclick to open download modal when Export Results button is pressed // Add onclick to open download modal when Export Results button is pressed
queryResultsExportElement.onclick = () => { resultsExportElement.onclick = () => {
exportModal.open(); exportModal.open();
// add onclick to download JSON button and download the file // add onclick to download JSON button and download the file
downloadResultsJSONElement = document.getElementById("download-results-json") downloadResultsJSONElement = document.getElementById("download-results-json")
downloadResultsJSONElement.onclick = () => { downloadResultsJSONElement.onclick = () => {
let filename = results.data.createDownloadFilename("matches"); let filename = results.data.createDownloadFilename("matches");
results.data.addData(results.metaData); results.data.addData(results.metaData);
results.data.downloadJSONRessource(filename, results.data, results.data.downloadJSONRessource(filename, results.resultsData,
downloadResultsJSONElement downloadResultsJSONElement
)}; )};
} }
// create sub results on click from shown marked match ids // create sub results on click from shown marked match ids
subResultsCreateElement.onclick = () => { subResultsCreateElement.onclick = () => {
subResultsCreateElement.getElementsByTagName("i")[0].classList.add("hide"); subResultsCreateElement.getElementsByTagName("i")[0].remove();
let html = ` subResultsCreateElement.innerText = "Creating...";
<div class="preloader-wrapper button-icon-spinner small active"> subResultsCreateElement.insertAdjacentHTML("afterbegin", loadingSpinnerHTML);
<div class="spinner-layer spinner-green-only"> results.data.createResultsData("sub-results");
<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>
</div>
</div>
`
subResultsCreateElement.insertAdjacentHTML("afterbegin", html);
results.data.createSubResultsData();
} }
// Add onclick to open download modal when sub-results button is pressed // Add onclick to open download modal when sub-results button is pressed