From c33889f61781c3dbfe137ef42cca709214645904 Mon Sep 17 00:00:00 2001
From: Stephan Porada <sporada@uni-bielefeld.de>
Date: Tue, 31 Mar 2020 10:17:04 +0200
Subject: [PATCH] Enhance pj_analyse

---
 app/static/js/nopaque.CorpusAnalysisClient.js | 15 +++-
 app/static/js/nopaque.callbacks.js            | 31 +++++++
 app/templates/corpora/analyse_corpus.html.j2  |  2 +-
 .../corpora/pj_analyse_corpus.html.j2         | 80 +++++++++++--------
 4 files changed, 91 insertions(+), 37 deletions(-)
 create mode 100644 app/static/js/nopaque.callbacks.js

diff --git a/app/static/js/nopaque.CorpusAnalysisClient.js b/app/static/js/nopaque.CorpusAnalysisClient.js
index 1c99c0f7..c14cc3cc 100644
--- a/app/static/js/nopaque.CorpusAnalysisClient.js
+++ b/app/static/js/nopaque.CorpusAnalysisClient.js
@@ -47,13 +47,24 @@ class CorpusAnalysisClient {
     this.socket.emit("pj_corpus_analysis_init", this.corpusId);
   }
 
-  query(query) {
+  query(queryStr) {
     if (this.displays.query.errorContainer != undefined) {this.displays.query.errorContainer.innerHTML == "";}
     if (this.displays.query != undefined) {this.displays.query.setVisibilityByStatus("waiting");}
-    nopaque.socket.emit("pj_corpus_analysis_query", query);
+    nopaque.socket.emit("pj_corpus_analysis_query", queryStr);
+  }
+
+  getQueryStr(queryFormElement) {
+    // gets query
+    let queryFormData;
+    let queryStr;
+    queryFormData = new FormData(queryFormElement);
+    queryStr = queryFormData.get("query-form-query");
+    return queryStr
   }
 
   setCallback(type, callback) {
+    // saves callback functions into an object. Key is function type, callback
+    // is the callback function
     this.callbacks[type] = callback;
   }
 
diff --git a/app/static/js/nopaque.callbacks.js b/app/static/js/nopaque.callbacks.js
new file mode 100644
index 00000000..71875278
--- /dev/null
+++ b/app/static/js/nopaque.callbacks.js
@@ -0,0 +1,31 @@
+function querySetup(payload) {
+  // This is called when a query was successfull
+  console.log("Query setup.");
+  console.log(payload);
+  queryResultsDeterminateElement.style.width = "0%";
+  receivedMatchNumElement.innerText = "0";
+  textLookupNumElement.innerText = "0";
+  matchNumElement.innerText = payload.num_matches;
+  results = {};
+  results["matches"] = [];  // list of all c with lc and rc
+  results["cpos_lookup"] = {};  // object contains all cpos as key value pair
+  results["text_lookup"] = {};  // same as above for all text ids
+  results[]
+}
+
+function queryRenderResults(payload) {
+  // This is called when results are transmitted.
+  console.log("CHUNK:", payload.chunk);
+  console.log("RESULTS:", results);
+  if (payload.progress === 100) {
+    queryResultsProgressElement.classList.add("hide");
+  }
+  queryResultsDeterminateElement.style.width = `${payload.progress}%`;
+  results.matches.push(...payload.chunk.matches);
+  receivedMatchNumElement.innerText = `${results.matches.length}`;
+  // incorporating new chunk results into full results
+  Object.assign(results.cpos_lookup, payload.chunk.cpos_lookup);
+  Object.assign(results.text_lookup, payload.chunk.text_lookup);
+
+  textLookupNumElement.innerText = `${Object.keys(results.text_lookup).length}`;
+}
\ No newline at end of file
diff --git a/app/templates/corpora/analyse_corpus.html.j2 b/app/templates/corpora/analyse_corpus.html.j2
index 7f95bbe9..545111d1 100644
--- a/app/templates/corpora/analyse_corpus.html.j2
+++ b/app/templates/corpora/analyse_corpus.html.j2
@@ -247,7 +247,7 @@ server side -->
   var queryResultsDeterminateElement; // progress bar for recieved query status
   var queryResultsTableElement;  // table element displaying the query results
   var queryLoadingElement;  // shows progress bar until first results are in
-  var queryFormElement;  // the quer form
+  var queryFormElement;  // the query form
   var hitsPerPageInputElement;  // value of hits per page (part of query form)
   var contextPerItemElement;  // value of contex per match (part of query form)
   var paginationElements;  // top and button pagination elements
diff --git a/app/templates/corpora/pj_analyse_corpus.html.j2 b/app/templates/corpora/pj_analyse_corpus.html.j2
index 3c389bbf..c5912fcc 100644
--- a/app/templates/corpora/pj_analyse_corpus.html.j2
+++ b/app/templates/corpora/pj_analyse_corpus.html.j2
@@ -5,11 +5,17 @@
 {% block page_content %}
 <div class="col s12">
   <ul class="collapsible expandable">
-    <li class="active hoverable">
-      <div class="collapsible-header">
-        <i class="material-icons">search</i>Query
-      </div>
-      <div class="collapsible-body">
+    <li class="active">
+      <!-- <div class="collapsible-header">
+        <i class="material-icons">search</i>CQP Query
+      </div> -->
+      <!-- Div element above is part of valid materialize collapsible.
+      Commented out to prevent the user from collapsing it and also to save
+      space -->
+      <div class="collapsible-body" style="padding-top: 10px;
+                                           padding-right: 2rem;
+                                           padding-bottom: 0px;
+                                           padding-left: 2rem;">
         <!-- Query form -->
         <form id="query-form">
           <div class="row">
@@ -104,8 +110,24 @@
 </div>
 
 
-<script src="{{ url_for('static', filename='js/nopaque.CorpusAnalysisClient.js') }}"></script>
+<script src="{{ url_for('static', filename='js/nopaque.CorpusAnalysisClient.js') }}">
+</script>
+<script src="{{ url_for('static', filename='js/nopaque.callbacks.js') }}">
+</script>
 <script>
+  // ###### Defining global variables used in other functions ######
+  var results;  // full JSON object holding match results
+  var queryFormElement;  // the query form
+  var collapsibleElements;  // all collapsibles on site
+  var queryResultsProgressElement;  // Div element holding the progress bar
+  var queryResultsDeterminateElement;  // The progress bar for recieved results
+
+  // ###### Initialize variables ######
+
+
+  // get collapsibles to alter options of those
+  var collapsibleElements = document.querySelector('.collapsible.expandable');
+
   var client = undefined;
   var initDisplay = undefined;
   var queryDisplay = undefined;
@@ -115,53 +137,43 @@
   var queryFormElement = document.getElementById("query-form");
   var queryResultsDeterminateElement = document.getElementById("query-results-determinate");
   var queryResultsProgressElement = document.getElementById("query-results-progress");
-  var receivedMatchNumElement = document.getElementById("received-match-num");
-  var matchNumElement = document.getElementById("match-num");
-  var textLookupNumElement = document.getElementById("text-lookup-num");
+  receivedMatchNumElement = document.getElementById("received-match-num");
+  matchNumElement = document.getElementById("match-num");
+  textLookupNumElement = document.getElementById("text-lookup-num");
 
-  var results = undefined;
 
   document.addEventListener("DOMContentLoaded", () => {
+    //set accordion of collapsibles to false
+    M.Collapsible.init(collapsibleElements, {accordion: false});
+
     var initModal = M.Modal.init(initDisplayElement, {dismissible: false});
     // Init corpus analysis components
     initDisplay = new CorpusAnalysisDisplay(initDisplayElement);
     queryDisplay = new CorpusAnalysisDisplay(queryDisplayElement);
     client = new CorpusAnalysisClient({{ corpus_id }}, nopaque.socket);
     initModal.open();
+    // set displays visibilitys and Callback functions
     client.setDisplay("init", initDisplay);
-    client.setCallback("init", () => {initModal.close();});
+    client.setCallback("init", () => {
+      initModal.close();
+    });
     client.setDisplay("query", queryDisplay);
     client.setCallback("query", (payload) => {
-      // This is called when a query was successfull
-      results = {matches: [], cpos_lookup: {}, text_lookup: {}};
-      queryResultsDeterminateElement.style.width = "0%";
-      receivedMatchNumElement.innerText = "0";
-      textLookupNumElement.innerText = "0";
-      matchNumElement.innerText = payload.num_matches;
+      querySetup(payload);
     });
     client.setCallback("query_results", (payload) => {
-      // This is called when results are transmitted.
-      if (payload.progress === 100) {
-        queryResultsProgressElement.classList.add("hide");
-      }
-      queryResultsDeterminateElement.style.width = `${payload.progress}%`;
-      results.matches.push(...payload.chunk.matches);
-      receivedMatchNumElement.innerText = `${results.matches.length}`;
-      Object.assign(results.cpos_lookup, payload.chunk.cpos_lookup);
-      Object.assign(results.text_lookup, payload.chunk.text_lookup);
-      textLookupNumElement.innerText = `${Object.keys(results.text_lookup).length}`;
+      queryRenderResults(payload);
     });
 
     // Trigger corpus analysis initialization on server side
     client.init();
-    queryFormElement.addEventListener("submit", (e) => {
+    // start a query request on submit
+    queryFormElement.addEventListener("submit", (event) => {
       // Prevent page from reloading on submit
-      e.preventDefault();
-      // Gather query data
-      var queryFormData = new FormData(queryFormElement);
-      var query = queryFormData.get("query-form-query");
-      // Send query to server
-      client.query(query);
+      event.preventDefault();
+      // Get query string and send query to server
+      let queryStr = client.getQueryStr(queryFormElement);
+      client.query(queryStr);
     });
   });
 </script>
-- 
GitLab