diff --git a/web/app/static/js/nopaque.InteractionElement.js b/web/app/static/js/nopaque.InteractionElement.js index 5d8c1f05c65d82bd73c91f1bbc082b278e733924..b3f8ec606c3a5cb8837c13306bf2e8eacef573d6 100644 --- a/web/app/static/js/nopaque.InteractionElement.js +++ b/web/app/static/js/nopaque.InteractionElement.js @@ -5,25 +5,22 @@ class InteractionElement { disabledAfter=false, hideBefore=true, hideAfter=false) { - this.htmlId = htmlId; - this.checkStatus = checkStatus; - this.callbacks = {}; - this.disabledBefore = disabledBefore; - this.disabledAfter = disabledAfter; - this.hideBefore = hideBefore; - this.hideAfter = hideAfter; - } - - getElement() { - this.interactionStatusElement = document.getElementById(this.htmlId); - return this.interactionStatusElement; + this.htmlId = htmlId; + this.element = (htmlId) => {this.element = document.getElementById(htmlId);} + this.checkStatus = checkStatus; + this.callbacks = {}; + this.disabledBefore = disabledBefore; + this.disabledAfter = disabledAfter; + this.hideBefore = hideBefore; + this.hideAfter = hideAfter; + this.element(this.htmlId); } setCallback(trigger, callback, bindThis, args=[]) { this.callbacks[trigger] = { - "function": callback, - "bindThis": bindThis, - "args": args + "function": callback, + "bindThis": bindThis, + "args": args }; } diff --git a/web/app/static/js/nopaque.callbacks.js b/web/app/static/js/nopaque.callbacks.js index 9f849735dfc24132d9836f7147db9ec77b04bdd4..a6db9e946eb4639462a25c02d864fe196b3e1e69 100644 --- a/web/app/static/js/nopaque.callbacks.js +++ b/web/app/static/js/nopaque.callbacks.js @@ -18,7 +18,14 @@ function saveSubResultsChoices(response) { subResultsCreateElement.getElementsByClassName("button-icon-spinner")[0].remove(); subResultsCreateElement.getElementsByTagName("i")[0].classList.remove("hide"); subResultsCreateElement.firstElementChild.classList.add("disabled"); - subResultsExportElement.classList.remove("disabled"); + subResultsExportElement.classList.remove("disabled", "btn-flat"); + subResultsExportElement.classList.add("pulse", "btn-small"); + setTimeout(() => { + subResultsExportElement.classList.remove("pulse", "btn-small"); + subResultsExportElement.classList.add("btn-flat"); + clearTimeout(); + }, 3000) + } function querySetup(payload) { diff --git a/web/app/static/js/nopaque.lists.js b/web/app/static/js/nopaque.lists.js index 150c6c781b44e2d3eaacccd6cc535e1a653b9709..64925d77e989ce90fc0327916a17074292bf09e3 100644 --- a/web/app/static/js/nopaque.lists.js +++ b/web/app/static/js/nopaque.lists.js @@ -86,11 +86,11 @@ RessourceList.options = { </span> </td> <td class="right-align"> - <a class="btn-small edit-link waves-effect waves-light"> + <a class="btn-floating edit-link waves-effect waves-light"> <i class="material-icons">edit</i> </a> - <a class="btn-small analyse-link waves-effect waves-light"> - Analyse<i class="material-icons right">search</i> + <a class="btn-floating analyse-link waves-effect waves-light"> + <i class="material-icons right">search</i> </a> </td> </tr>`, @@ -113,8 +113,8 @@ RessourceList.options = { <span class="badge new status" data-badge-caption=""></span> </td> <td class="right-align"> - <a class="btn-small link waves-effect waves-light"> - View<i class="material-icons right">send</i> + <a class="btn-floating link waves-effect waves-light"> + <i class="material-icons right">send</i> </a> </td> </tr>`, @@ -143,8 +143,7 @@ class ResultsList extends List { // get elements to check thier status for (let interaction of interactionElements) { if (interaction.checkStatus) { - let element = interaction.getElement(); - if (element.checked) { + if (interaction.element.checked) { let f_on = interaction.bindThisToCallback("on"); let args_on = interaction.callbacks.on.args; f_on(...args_on); @@ -198,17 +197,31 @@ class ResultsList extends List { addToSubResultsBtn.classList.add("hide"); } } + + helperActivateBtn(btn) { + console.log(btn); + btn.classList.remove("grey"); + btn.classList.add("green"); + btn.innerText = "check"; + } + + helperDeactivateBtn(btn) { + console.log(btn); + btn.classList.remove("green"); + btn.classList.add("grey"); + btn.innerText = "add"; + } + // add match id on click to a List of marked matches for SubSubcorpora // remove match id on click from same list - addToSubResults(dataIndex) { + addToSubResults(dataIndex, tableCall=true) { + console.log(event.target); let textarea = subResultsIdListElement.getElementsByTagName("textarea")[0] if (!this.addToSubResultsStatus[dataIndex] || this.addToSubResultsStatus === undefined) { // add button is activated nopaque.flash(`[Match ${dataIndex + 1}] Marked for Sub-Results!`); - event.target.classList.remove("grey"); - event.target.classList.add("green"); - event.target.innerText = "check"; + this.helperActivateBtn(event.target); this.addToSubResultsStatus[dataIndex] = true; this.addToSubResultsIdsToShow.add(dataIndex + 1); textarea.innerText = [...this.addToSubResultsIdsToShow].sort(function(a, b){return a-b}).join(", "); @@ -216,9 +229,7 @@ class ResultsList extends List { } else if (this.addToSubResultsStatus[dataIndex]) { // add button is deactivated nopaque.flash(`[Match ${dataIndex + 1}] Unmarked for Sub-results!`); - event.target.classList.remove("green"); - event.target.classList.add("grey"); - event.target.innerText = "add"; + this.helperDeactivateBtn(event.target); this.addToSubResultsStatus[dataIndex] = false; this.addToSubResultsIdsToShow.delete(dataIndex + 1); textarea.innerText = [...this.addToSubResultsIdsToShow].sort(function(a, b){return a-b}).join(", "); @@ -230,6 +241,16 @@ class ResultsList extends List { subResultsCreateElement.firstElementChild.classList.add("disabled"); } subResultsExportElement.classList.add("disabled"); + // also activate/deactivate buttons in the table accordingly if btn in inspect was activated/deactivated + if (!tableCall) { + let tableAddBtn = document.getElementById("query-results").querySelectorAll(`[data-index="${dataIndex}"]`)[0].getElementsByClassName('add')[0].firstElementChild; + console.log("TABLECALL", tableAddBtn); + if (this.addToSubResultsStatus[dataIndex]) { + this.helperActivateBtn(tableAddBtn); + } else { + this.helperDeactivateBtn(tableAddBtn); + } + } } // triggers emit to get full match context from server for a number of @@ -274,13 +295,26 @@ class ResultsList extends List { contextResultsElement.innerHTML = ""; // clear it from old inspects this.getMatchWithContext(dataIndex, type); contextModal.open(); - let css = `margin-right: 10px;` + // add a button to add this match to sub results let classes = `btn-floating btn waves-effect` + `waves-light grey right` - addToSubResultsFromInspectElement = document.createElement("a"); - addToSubResultsFromInspectElement.setAttribute("class", classes + `add`); - addToSubResultsFromInspectElement.innerHTML = '<i class="material-icons">add</i>'; - addToSubResultsFromInspectElement.onclick= (event) => {this.addToSubResults(dataIndex)}; + let addToSubResultsIdsBtn = document.createElement("a"); + addToSubResultsIdsBtn.setAttribute("class", classes + ` add`); + addToSubResultsIdsBtn.innerHTML = '<i class="material-icons">add</i>'; + addToSubResultsIdsBtn.onclick= (event) => {this.addToSubResults(dataIndex[0], false)}; + if (addToSubResultsFromInspectElement.children.length > 0) { + addToSubResultsFromInspectElement.firstElementChild.remove(); + } + if (this.addToSubResultsStatus[dataIndex[0]]) { + addToSubResultsIdsBtn.classList.remove("grey"); + addToSubResultsIdsBtn.classList.add("green"); + addToSubResultsIdsBtn.firstElementChild.innerText = "check"; + } else if (!this.addToSubResultsStatus[dataIndex[0]]) { + addToSubResultsIdsBtn.classList.remove("green"); + addToSubResultsIdsBtn.classList.add("grey"); + addToSubResultsIdsBtn.firstElementChild.innerText = "add"; + } + addToSubResultsFromInspectElement.appendChild(addToSubResultsIdsBtn); } // create Element from HTML String helper function @@ -624,6 +658,7 @@ class ResultsList extends List { } createResultRowElement(item, chunk) { + let aCellElement; let addToSubResultsBtn; let c; let cCellElement; @@ -665,8 +700,10 @@ class ResultsList extends List { `<span class="token" data-cpos="${cpos}">${token.word} </span>`); } - // get infos for hit of match + // get infos for hit of match and set actions textTitles = new Set(); + aCellElement = document.createElement("td"); + aCellElement.classList.add("actions"); cCellElement = document.createElement("td"); cCellElement.classList.add("match-hit"); textTitlesCellElement = document.createElement("td"); @@ -674,6 +711,7 @@ class ResultsList extends List { matchNrElement = document.createElement("td"); matchNrElement.classList.add("match-nr"); matchRowElement.appendChild(cCellElement); + matchRowElement.appendChild(aCellElement); for (cpos of c) { token = chunk.cpos_lookup[cpos]; cCellElement.insertAdjacentHTML("beforeend", @@ -683,25 +721,25 @@ class ResultsList extends List { } // add some interaction buttons // # some btn css rules and classes - let css = `margin-right: 10px;` + let css = `margin-right: 5px; margin-bottom: 5px;` let classes = `btn-floating btn waves-effect` + - `waves-light grey right` + `waves-light grey` // # add button to trigger more context to every match td inspectBtn = document.createElement("a"); + inspectBtn.setAttribute("style", css); inspectBtn.setAttribute("class", classes + ` disabled inspect` ); - inspectBtn.setAttribute("style", css) inspectBtn.innerHTML = '<i class="material-icons">search</i>'; inspectBtn.onclick = () => {this.inspect([values.index], "inspect")}; // # add btn to add matches to sub-results. hidden per default addToSubResultsBtn = document.createElement("a"); + addToSubResultsBtn.setAttribute("style", css); addToSubResultsBtn.setAttribute("class", classes + ` hide add` ); - addToSubResultsBtn.setAttribute("style", css) addToSubResultsBtn.innerHTML = '<i class="material-icons">add</i>'; - addToSubResultsBtn.onclick= (event) => {this.addToSubResults(values.index)} - cCellElement.appendChild(inspectBtn); - cCellElement.appendChild(addToSubResultsBtn); + addToSubResultsBtn.onclick = (event) => {this.addToSubResults(values.index)} + aCellElement.appendChild(addToSubResultsBtn); + aCellElement.appendChild(inspectBtn); // add text titles at front as first td of one row textTitlesCellElement.innerText = [...textTitles].join(", "); matchRowElement.insertAdjacentHTML("afterbegin", textTitlesCellElement.outerHTML); diff --git a/web/app/templates/corpora/analyse_corpus.html.j2 b/web/app/templates/corpora/analyse_corpus.html.j2 index 7fa96309cede3bf1448a30abb31d4aff164f6297..341d3a1795f2997d67ee32af550a357a206d63a6 100644 --- a/web/app/templates/corpora/analyse_corpus.html.j2 +++ b/web/app/templates/corpora/analyse_corpus.html.j2 @@ -78,23 +78,23 @@ <h6 style="margin-top: 0px;">Export</h6> <div class="divider" style="margin-bottom: 10px;"></div> <div class="row"> - <div class="col"> + <div class="col s12"> <button id="query-results-export" class="waves-effect waves-light btn-flat disabled" - type="submit">Export Results + type="submit">Results <i class="material-icons left">file_download</i> </button> </div> - <div class="col"> + <div class="col s12"> <button id="sub-results-export" class="waves-effect waves-light btn-flat disabled" - type="submit">Export Sub-Results + type="submit">Sub-Results <i class="material-icons left">file_download</i> </button> </div> @@ -104,7 +104,7 @@ <h6 style="margin-top: 0px;">Create</h6> <div class="divider" style="margin-bottom: 10px;"></div> <div class="row"> - <div class="col"> + <div class="col s12"> <div class="switch"> Sub-Results creation: <label> @@ -117,7 +117,7 @@ </label> </div> </div> - <div class="col hide" id="sub-results-match-ids-div"> + <div class="col s12 hide" id="sub-results-match-ids-div"> <div class="input-field"> <p>Marked matches for Sub-Results:</p> <textarea id="sub-results-match-ids" @@ -126,7 +126,7 @@ </textarea> </div> </div> - <div class="col hide" id="sub-results-create-div"> + <div class="col s12 hide" id="sub-results-create-div"> <button class="waves-effect waves-light btn-flat @@ -141,7 +141,7 @@ <h6 style="margin-top: 0px;">Display</h6> <div class="divider" style="margin-bottom: 10px;"></div> <div class="row"> - <div class="col"> + <div class="col s12"> <form id="display-options-form"> {{ M.render_field(display_options_form.results_per_page, material_icon='format_list_numbered') }} @@ -156,7 +156,7 @@ <h6 style="margin-top: 0px;">Analysis</h6> <div class="divider" style="margin-bottom: 10px;"></div> <div class="row"> - <div class="col"> + <div class="col s12"> <button id="placeholder1" class="waves-effect waves-light @@ -166,7 +166,7 @@ <i class="material-icons left">cloud</i> </button> </div> - <div class="col"> + <div class="col s12"> <button id="placeholder2" class="waves-effect waves-light @@ -190,7 +190,8 @@ <th style="width: 2%">Nr.</th> <th style="width: 3%">Title</th> <th style="width: 25%">Left context</th> - <th style="width: 45%">Match</th> + <th style="width: 35%">Match</th> + <th style="width: 10%">Actions</th> <th style="width: 25%">Right Context</th> </tr> </thead> @@ -567,17 +568,18 @@ }); } + + // checks if a change for every interactionElement happens and executes // the callbacks accordingly for (let interaction of interactionElements) { if (interaction.checkStatus) { - let element = interaction.getElement() - element.addEventListener("change", (event) => { + interaction.element.addEventListener("change", (event) => { if (event.target.checked) { let f_on = interaction.bindThisToCallback("on"); let args_on = interaction.callbacks.on.args; f_on(...args_on); - } else { + } else if (!event.target.checked){ let f_off = interaction.bindThisToCallback("off"); let args_off = interaction.callbacks.off.args; f_off(...args_off);