diff --git a/web/app/static/js/modules/nopaque.CorpusAnalysisClient.js b/web/app/static/js/modules/nopaque.CorpusAnalysisClient.js
index a2659b76..7eeb6216 100644
--- a/web/app/static/js/modules/nopaque.CorpusAnalysisClient.js
+++ b/web/app/static/js/modules/nopaque.CorpusAnalysisClient.js
@@ -20,7 +20,7 @@ class CorpusAnalysisClient {
}
}
- loadListeners() {
+ loadSocketEventListeners() {
for (let [type, listener] of Object.entries(this.socketEventListeners)) {
listener(this);
}
@@ -31,16 +31,6 @@ class CorpusAnalysisClient {
this.displays[type] = corpusAnalysisDisplay;
}
- // /**
- // * Initializes the interactive corpus analysis session via socket.io.
- // * This function uses helper functions.
- // */
- // initSession() {
- // let request = this.requestSession();
- // let recvieveSession = this.recvieveSession();
- // console.info('corpus_analysis_init: Client waiting for response'); // this happens inbetween the two functions above
- // }
-
/**
* Requests a corpus analysis session via socket.io.
* Opens a loading modal at the start of the request
@@ -56,17 +46,6 @@ class CorpusAnalysisClient {
this.socket.emit('corpus_analysis_init', this.corpusId);
}
- // /**
- // * Sends a query to the server and handles the response to that query.
- // * This function uses helper functions.
- // */
- // query(queryStr) {
- // let requestQueryData = this.requestQueryData(queryStr);
- // let recieveQueryProcessStatus = this.recieveQueryProcessStatus();
- // let recieveQueryData = this.recieveQueryData();
- // console.info('corpus_analysis_query: Client waiting for query data'); // this happens inbetween the two functions above
- // }
-
/**
* Sends the query string to the server.
* Should be a private method if ES2020 is finalized (Maybe?)
@@ -165,5 +144,5 @@ class SocketEventListener {
}
}
-// export both Classes from this module
+// export Classes from this module
export {CorpusAnalysisClient, CorpusAnalysisDisplay, SocketEventListener};
\ No newline at end of file
diff --git a/web/app/static/js/modules/nopaque.listenerCallbacks.js b/web/app/static/js/modules/nopaque.listenerCallbacks.js
new file mode 100644
index 00000000..b0369c6b
--- /dev/null
+++ b/web/app/static/js/modules/nopaque.listenerCallbacks.js
@@ -0,0 +1,84 @@
+/**
+ * This callback is called when the SocketEventListener 'recieveQueryData'
+ * has been triggered. It takes the incoming chunk and renders the results in a
+ * the results.jsList. It can eiterh hande llive incoming data or imported
+ * results data.
+ */
+function queryRenderResults(payload, client, imported=false) {
+ console.info("Current recieved chunk:", payload.chunk);
+ if (payload.chunk.cpos_ranges == true) {
+ client.results.data["cpos_ranges"] = true;
+ } else {
+ client.results.data["cpos_ranges"] = false;
+ }
+ /**
+ * resultItem is a list where
+ */
+ let resultItems = [];
+ // get infos for full match row
+ for (let [index, match] of payload.chunk.matches.entries()) {
+ resultItems.push({...match, ...{"index": index + client.results.data.matches.length}});
+ }
+ if (!imported) {
+ // update progress bar
+ // queryResultsDeterminateElement.style.width = `${payload.progress}%`;
+ client.results.jsList.add(resultItems, (items) => {
+ for (let item of items) {
+ item.elm = client.results.jsList.createResultRowElement(item, payload.chunk);
+ }
+ });
+ helperQueryRenderResults(payload, client);
+ // if (progress === 100) {
+ // resultsCreateElement.classList.remove("disabled");
+ // queryResultsProgressElement.classList.add("hide");
+ // queryResultsUserFeedbackElement.classList.add("hide");
+ // resultsExportElement.classList.remove("disabled");
+ // addToSubResultsElement.removeAttribute("disabled");
+ // // inital expert mode check and sub results activation
+ // client.results.jsList.activateInspect();
+ // if (addToSubResultsElement.checked) {
+ // client.results.jsList.activateAddToSubResults();
+ // }
+ // if (expertModeSwitchElement.checked) {
+ // client.results.jsList.expertModeOn("query-display");
+ // }
+ // }
+ } else if (imported) {
+ client.results.jsList.add(resultItems, (items) => {
+ for (let item of items) {
+ item.elm = client.results.jsList.createResultRowElement(item, payload.chunk,
+ true);
+ }
+ helperQueryRenderResults(payload, client);
+ progress = 100;
+ client.results.jsList.activateInspect();
+ if (expertModeSwitchElement.checked) {
+ client.results.jsList.expertModeOn("query-display");
+ }
+ });
+ }
+}
+
+function helperQueryRenderResults (payload, client) {
+ // updating table on finished item creation callback via createResultRowElement
+ client.results.jsList.update();
+ client.results.jsList.changeContext(); // sets lr context on first result load
+ // incorporating new chunk results into full results
+ client.results.data.matches.push(...payload.chunk.matches);
+ client.results.data.addData(payload.chunk.cpos_lookup, "cpos_lookup");
+ client.results.data.addData(payload.chunk.text_lookup, "text_lookup");
+ // complete metaData
+ // client.results.metaData.add();
+ // show user current and total match count
+ // receivedMatchCountElement.innerText = `${client.results.data.matches.length}`;
+ // textLookupCountElement.innerText = `${Object.keys(client.results.data.text_lookup).length}`;
+ let titles = new Array();
+ for (let [key, value] of Object.entries(client.results.data.text_lookup)) {
+ titles.push(`${value.title} (${value.publishing_year})`);
+ };
+ // textTitlesElement.innerText = `${titles.join(", ")}`;
+ // upate progress status
+ // progress = payload.progress; // global declaration
+}
+
+export { queryRenderResults }
\ No newline at end of file
diff --git a/web/app/static/js/modules/nopaque.listenerFunctions.js b/web/app/static/js/modules/nopaque.listenerFunctions.js
index ce94ca91..ad63d3ae 100644
--- a/web/app/static/js/modules/nopaque.listenerFunctions.js
+++ b/web/app/static/js/modules/nopaque.listenerFunctions.js
@@ -1,3 +1,5 @@
+import {queryRenderResults} from './nopaque.listenerCallbacks.js'
+
/**
* Recieves a corpus analysis session via socket.io.
* Closes the loading modal that has been opend with requestSession at the
@@ -34,11 +36,13 @@ function recieveSession(client) {
* Recieves the query process status before any actual results are being
* transmitted. So it recieves error codes if a query failed or
* was invalid etc.
+ * Also prepares the result.jsList for the incoming data.
*/
function recieveQueryStatus(client) {
client.socket.on('corpus_analysis_query', (response) => {
console.group('corpus_analysis_query: Client recieving query process',
'status via socket.on');
+ client.results.clearAll();
console.info(response);
console.groupEnd();
});
@@ -51,10 +55,13 @@ function recieveQueryData(client) {
client.socket.on('corpus_analysis_query_results', (response) => {
console.group('corpus_analysis_query_results: Client recieving query',
'data via socket.on');
- console.info(response);
+ console.info('Recieved chunk', response);
+ queryRenderResults(response.payload, client);
+ console.info('Added chunk data to results.data and rendered it with',
+ 'results.jsList')
console.groupEnd();
});
}
// export listeners from this module
-export {recieveSession, recieveQueryStatus, recieveQueryData};
\ No newline at end of file
+export { recieveSession, recieveQueryStatus, recieveQueryData };
\ No newline at end of file
diff --git a/web/app/static/js/nopaque.Results.js b/web/app/static/js/nopaque.Results.js
index 2b3c1caa..c05af727 100644
--- a/web/app/static/js/nopaque.Results.js
+++ b/web/app/static/js/nopaque.Results.js
@@ -22,7 +22,7 @@ class Results {
class Data {
// Sets empty object structure. Also usefull to delete old results.
// matchCount default is 0
- init(matchCount = 0) {
+ init(matchCount = 0, type = "results") {
this["matches"] = []; // list of all c with lc and rc
this["cpos_lookup"] = {}; // object contains all this key value pair
this["text_lookup"] = {}; // same as above for all text ids
@@ -122,4 +122,6 @@ class MetaData {
init(json = {}) {
Object.assign(this, json);
}
-}
\ No newline at end of file
+}
+
+export {Results, Data, MetaData};
\ No newline at end of file
diff --git a/web/app/static/js/nopaque.lists.js b/web/app/static/js/nopaque.lists.js
index 2f577e32..033519ab 100644
--- a/web/app/static/js/nopaque.lists.js
+++ b/web/app/static/js/nopaque.lists.js
@@ -425,15 +425,31 @@ RessourceList.options = {
class ResultsList extends List {
- constructor(idOrElement, options={}) {
- super(idOrElement, options);
- this.eventTokens = {}; // all span tokens which are holdeing events if expert
- // mode is on. Collected here to delete later on
- this.currentExpertTokenElements = {}; // all token elements which have added
- // classes like chip and hoverable for expert view. Collected
- //here to delete later on
- this.addToSubResultsStatus = {}; // holds True/false for check buttons used to add matches tu sub-results. If checked, it is True. If unchecked, it is false. Buttons for this have the class add. Those little round check buttons.
- this.addToSubResultsIdsToShow = new Set(); // If check button is pressed its corresponding data_index is saved in this set. The set is shown to the user.
+ static options = {
+ page: 10,
+ pagination: [{
+ name: "paginationTop",
+ paginationClass: "paginationTop",
+ innerWindow: 8,
+ outerWindow: 1
+ }, {
+ paginationClass: "paginationBottom",
+ innerWindow: 8,
+ outerWindow: 1
+ }],
+ valueNames: ["titles", "lc", "c", "rc", {data: ["index"]}],
+ item: ``
+ };
+ constructor(idOrElement, options) {
+ super(idOrElement, options);
+ this.options = options;
+ this.eventTokens = {}; // all span tokens which are holdeing events if expert
+ // mode is on. Collected here to delete later on
+ this.currentExpertTokenElements = {}; // all token elements which have added
+ // classes like chip and hoverable for expert view. Collected
+ //here to delete later on
+ this.addToSubResultsStatus = {}; // holds True/false for check buttons used to add matches tu sub-results. If checked, it is True. If unchecked, it is false. Buttons for this have the class add. Those little round check buttons.
+ this.addToSubResultsIdsToShow = new Set(); // If check button is pressed its corresponding data_index is saved in this set. The set is shown to the user.
}
helperCreateCpos(cpos_ranges, cpos_values) {
@@ -479,12 +495,11 @@ class ResultsList extends List {
}
// get display options from display options form element
- static getDisplayOptions(displayOptionsFormElement) {
+ static getDisplayOptions(htmlId) {
// gets display options parameters
- let displayOptionsFormData
- let displayOptionsData;
- displayOptionsFormData = new FormData(displayOptionsFormElement);
- displayOptionsData =
+ let displayOptionsFormElement = document.getElementById(htmlId);
+ let displayOptionsFormData = new FormData(displayOptionsFormElement);
+ let displayOptionsData =
{
"resultsPerPage": displayOptionsFormData.get("display-options-form-results_per_page"),
"resultsContex": displayOptionsFormData.get("display-options-form-result_context"),
@@ -1182,5 +1197,6 @@ class ResultsList extends List {
`);
}
}
+};
-}
+export {RessourceList, ResultsList};
diff --git a/web/app/templates/corpora/analyse_corpus.html.j2 b/web/app/templates/corpora/analyse_corpus.html.j2
index d96bdbea..a5845fdb 100644
--- a/web/app/templates/corpora/analyse_corpus.html.j2
+++ b/web/app/templates/corpora/analyse_corpus.html.j2
@@ -75,25 +75,43 @@
CorpusAnalysisDisplay,
SocketEventListener} from '../../static/js/modules/nopaque.CorpusAnalysisClient.js';
import {recieveSession, recieveQueryStatus,
- recieveQueryData} from '../../static/js/modules/nopaque.listenerFunctions.js'
+ recieveQueryData} from '../../static/js/modules/nopaque.listenerFunctions.js';
+ import {Results, Data, MetaData} from '../../static/js/nopaque.Results.js';
+ import {ResultsList} from '../../static/js/nopaque.lists.js';
/**
* Second Phase:
* Asynchronus and event driven code
*/
document.addEventListener("DOMContentLoaded", () => {
- // init some modals
+ // Initialize the CorpusAnalysisClient
+ const client = new CorpusAnalysisClient({{ corpus_id }}, nopaque.socket);
+ console.info("CorpusAnalysisClient created as client:", client);
+ // Initialize modals which are shown depending on events or client status
const initLoadingElement = document.getElementById("init-display");
const initLoadingModal = M.Modal.init(initLoadingElement,
{"dismissible": false});
- // set up display elements
+ // Set up display elements which hare show depending on the client status
const initLoadingDisplay = new CorpusAnalysisDisplay(initLoadingModal);
- // set up CorpusAnalysisClient
- const client = new CorpusAnalysisClient({{ corpus_id }}, nopaque.socket);
- console.info("CorpusAnalysisClient created as client:", client);
- // register display elements to client
+ // Register those display elements to client
client.setDisplay("init", initLoadingDisplay);
- // register listeners and load them
+ /**
+ * Initializing the results object holding all the data of a query.
+ * Also holds the metadata of one query.
+ * resultsListOptions is set to determine how many results per apge are
+ * shown etc.
+ * Lastly it also contains the object ResultsList which is a list.js
+ * subclass which handles the visual reprensetnation of the query data.
+ */
+ let displayOptionsData = ResultsList.getDisplayOptions('display-options-form');
+ ResultsList.options.page = displayOptionsData["resultsPerPage"];
+ let resultsList = new ResultsList("result-list", ResultsList.options);
+ let resultsMetaData = new MetaData();
+ let results = new Results(new Data(), resultsList, resultsMetaData);
+ // make results part of the client
+ client.results = results;
+ console.info('Initialized the Results object.')
+ // register listeners listening to socket.io events and load them
const listenForSession = new SocketEventListener('corpus_analysis_init',
recieveSession);
const listenForQueryStatus = new SocketEventListener('corpus_analysis_query',
@@ -102,10 +120,10 @@
recieveQueryData);
client.setSocketEventListeners([listenForSession, listenForQueryStatus,
listenForQueryData]);
- client.loadListeners();
+ client.loadSocketEventListeners();
// Session initialization
client.requestSession();
- // send a query and recieve its answer data
+ // Send a query and recieve its answer data
let queryFormElement = document.getElementById("query-form");
queryFormElement.addEventListener("submit", (event) => {
try {
@@ -129,8 +147,8 @@
// Prevent page from reloading on submit
event.preventDefault();
// Get query string and send query to server
- // results.data.getQueryStr(queryFormElement);
- client.requestQueryData('"this" []* "that" within 10 words;');
+ results.data.getQueryStr(queryFormElement);
+ client.requestQueryData(results.data.query);
});
});
diff --git a/web/app/templates/nopaque.html.j2 b/web/app/templates/nopaque.html.j2
index 8a9511ca..2e0f1c90 100644
--- a/web/app/templates/nopaque.html.j2
+++ b/web/app/templates/nopaque.html.j2
@@ -47,7 +47,9 @@
-
+