From 962e58f2d34782f4eded43d9b6730e807ca066dc Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Thu, 2 Dec 2021 11:16:06 +0100
Subject: [PATCH] Enable auto initialization for ressource lists

---
 .../nopaque/RessourceLists/CorpusFileList.js  |  1 -
 .../nopaque/RessourceLists/QueryResultList.js |  2 +-
 .../nopaque/RessourceLists/RessourceList.js   | 29 ++++++++++++-------
 app/templates/_scripts.html.j2                | 29 ++++++++++++++++++-
 app/templates/admin/user.html.j2              | 14 ++-------
 app/templates/admin/users.html.j2             |  6 ++--
 app/templates/corpora/corpus.html.j2          |  3 +-
 app/templates/jobs/job.html.j2                |  6 ++--
 app/templates/main/dashboard.html.j2          | 21 ++++----------
 9 files changed, 63 insertions(+), 48 deletions(-)

diff --git a/app/static/js/nopaque/RessourceLists/CorpusFileList.js b/app/static/js/nopaque/RessourceLists/CorpusFileList.js
index ed6a4b49..e49ee8fa 100644
--- a/app/static/js/nopaque/RessourceLists/CorpusFileList.js
+++ b/app/static/js/nopaque/RessourceLists/CorpusFileList.js
@@ -5,7 +5,6 @@ class CorpusFileList extends RessourceList {
   }
 
   init(user) {
-    console.log(user);
     this._init(user.corpora[this.corpusId].files);
   }
 
diff --git a/app/static/js/nopaque/RessourceLists/QueryResultList.js b/app/static/js/nopaque/RessourceLists/QueryResultList.js
index 832a482d..302967aa 100644
--- a/app/static/js/nopaque/RessourceLists/QueryResultList.js
+++ b/app/static/js/nopaque/RessourceLists/QueryResultList.js
@@ -4,7 +4,7 @@ class QueryResultList extends RessourceList {
   }
 
   init(user) {
-    super.init(user.query_results);
+    super._init(user.query_results);
   }
 
   onclick(event) {
diff --git a/app/static/js/nopaque/RessourceLists/RessourceList.js b/app/static/js/nopaque/RessourceLists/RessourceList.js
index 81b9133d..442f25c9 100644
--- a/app/static/js/nopaque/RessourceLists/RessourceList.js
+++ b/app/static/js/nopaque/RessourceLists/RessourceList.js
@@ -4,8 +4,17 @@ class RessourceList {
    * a base class for concrete ressource list implementations.
    */
   constructor(listElement, options = {}) {
-    this.list = new List(listElement, {...RessourceList.options, ...options});
-    this.list.list.innerHTML = `
+    let i;
+
+    if (!(listElement.hasAttribute('id'))) {
+      for (i = 0; true; i++) {
+        if (document.querySelector(`ressource-list-${i}`)) {continue;}
+        listElement.id = `ressource-list-${i}`;
+        break;
+      }
+    }
+    this.listjs = new List(listElement, {...RessourceList.options, ...options});
+    this.listjs.list.innerHTML = `
       <tr>
         <td class="row" colspan="100%">
           <div class="col s12">&nbsp;</div>
@@ -31,9 +40,9 @@ class RessourceList {
         </td>
       </tr>
     `.trim();
-    this.list.list.style.cursor = 'pointer';
+    this.listjs.list.style.cursor = 'pointer';
     this.userId = listElement.dataset.userId;
-    if (typeof this.onclick === 'function') {this.list.list.addEventListener('click', event => this.onclick(event));}
+    if (typeof this.onclick === 'function') {this.listjs.list.addEventListener('click', event => this.onclick(event));}
     if (this.userId) {
       app.addEventListener('users.patch', patch => this.usersPatchHandler(patch));
       app.getUserById(this.userId).then(
@@ -44,7 +53,7 @@ class RessourceList {
   }
 
   _init(ressources) {
-    this.list.clear();
+    this.listjs.clear();
     this.add(Object.values(ressources));
     let emptyListElementHTML = `
       <tr class="show-if-only-child">
@@ -54,7 +63,7 @@ class RessourceList {
         </td>
       </tr>
     `.trim();
-    this.list.list.insertAdjacentHTML('afterbegin', emptyListElementHTML);
+    this.listjs.list.insertAdjacentHTML('afterbegin', emptyListElementHTML);
   }
 
   init(user) {throw 'Not implemented';}
@@ -66,17 +75,17 @@ class RessourceList {
   add(values) {
     let ressources = Array.isArray(values) ? values : [values];
     ressources = ressources.map(ressource => this.preprocessRessource(ressource));
-    this.list.add(ressources, () => {
-      this.list.sort('id', {order: 'desc'});
+    this.listjs.add(ressources, () => {
+      this.listjs.sort('id', {order: 'desc'});
     });
   }
 
   remove(id) {
-    this.list.remove('id', id);
+    this.listjs.remove('id', id);
   }
 
   replace(id, valueName, newValue) {
-      this.list.get('id', id)[0].values({[valueName]: newValue});
+      this.listjs.get('id', id)[0].values({[valueName]: newValue});
   }
 }
 RessourceList.options = {page: 5, pagination: [{innerWindow: 4, outerWindow: 1}]};
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index a86e3cfb..e030a920 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -16,7 +16,7 @@
           "js/nopaque/RessourceDisplays/JobDisplay.js" %}
 <script src="{{ ASSET_URL }}"></script>
 {% endassets %}
-{% assets output="js/nopaque/RessourceLists.min.bundle.js",
+{% assets filters='rjsmin', output="js/nopaque/RessourceLists.min.bundle.js",
           "js/nopaque/RessourceLists/RessourceList.js",
           "js/nopaque/RessourceLists/CorpusList.js",
           "js/nopaque/RessourceLists/CorpusFileList.js",
@@ -41,5 +41,32 @@
   app.getUserById(currentUserId).then(user => {}, error => {throw JSON.stringify(error)});
   {% endif %}
   nopaque.Forms.init();
+  for (let nopaqueRessourceListElement of document.querySelectorAll('.nopaque-ressource-list[data-ressource-type]:not(.no-autoinit)')) {
+    switch (nopaqueRessourceListElement.dataset.ressourceType) {
+      case 'Corpus':
+        new CorpusList(nopaqueRessourceListElement);
+        break;
+      case 'CorpusFile':
+        new CorpusFileList(nopaqueRessourceListElement);
+        break;
+      case 'Job':
+        new JobList(nopaqueRessourceListElement);
+        break;
+      case 'JobInput':
+        new JobInputList(nopaqueRessourceListElement);
+        break;
+      case 'JobResult':
+        new JobResultList(nopaqueRessourceListElement);
+        break;
+      case 'QueryResult':
+        new QueryResultList(nopaqueRessourceListElement);
+        break;
+      case 'User':
+        new UserList(nopaqueRessourceListElement);
+        break;
+      default:
+        break;
+    }
+  }
   for (let flashedMessage of {{ get_flashed_messages(with_categories=True)|tojson }}) {app.flash(flashedMessage[1], flashedMessage[0]);}
 </script>
diff --git a/app/templates/admin/user.html.j2 b/app/templates/admin/user.html.j2
index 3bc9b1d6..a7dcfe80 100644
--- a/app/templates/admin/user.html.j2
+++ b/app/templates/admin/user.html.j2
@@ -37,7 +37,7 @@
       </div>
     </div>
 
-<div class="col s12 l6" id="corpora" data-user-id="{{ user.hashid }}">
+<div class="col s12 l6 nopaque-ressource-list" data-ressource-type="Job" data-user-id="{{ user.hashid }}">
   <h3>Corpora</h3>
   <div class="card">
     <div class="card-content">
@@ -65,7 +65,7 @@
   </div>
 </div>
 
-<div class="col s12 l6" id="jobs" data-user-id="{{ user.hashid }}">
+<div class="col s12 l6 nopaque-ressource-list" data-ressource-type="Job" data-user-id="{{ user.hashid }}">
   <h3>Jobs</h3>
   <div class="card">
     <div class="card-content">
@@ -74,7 +74,7 @@
         <input id="search-job" class="search" type="search"></input>
         <label for="search-job">Search job</label>
       </div>
-      <table class="highlight ressource-list">
+      <table class="highlight">
         <thead>
           <tr>
             <th><span class="sort" data-sort="service">Service</span></th>
@@ -108,11 +108,3 @@
   </div>
 </div>
 {% endblock modals %}
-
-{% block scripts %}
-{{ super() }}
-<script>
-  let corpusList = new CorpusList(document.querySelector('#corpora'));
-  let jobList = new JobList(document.querySelector('#jobs'));
-</script>
-{% endblock scripts %}
diff --git a/app/templates/admin/users.html.j2 b/app/templates/admin/users.html.j2
index 8c1e09c1..57df8862 100644
--- a/app/templates/admin/users.html.j2
+++ b/app/templates/admin/users.html.j2
@@ -8,7 +8,7 @@
       <h1 id="title">{{ title }}</h1>
     </div>
 
-    <div class="col s12" id="users">
+    <div class="col s12 nopaque-ressource-list no-autoinit" data-ressource-type="User" id="users">
       <div class="card">
         <div class="card-content">
           <div class="input-field">
@@ -16,7 +16,7 @@
             <input id="search-user" class="search" type="text"></input>
             <label for="search-user">Search user</label>
           </div>
-          <table class="highlight ressource-list">
+          <table class="highlight">
             <thead>
               <tr>
                 <th class="sort" data-sort="id">Id</th>
@@ -40,7 +40,7 @@
 {% block scripts %}
 {{ super() }}
 <script>
-  let userList = new UserList(document.querySelector('#users'), {page: 10});
+  let userList = new UserList(document.querySelector('#users'));
   userList.init({{ dict_users|tojson }});
 </script>
 {% endblock scripts %}
diff --git a/app/templates/corpora/corpus.html.j2 b/app/templates/corpora/corpus.html.j2
index 1d455eda..e98e5b06 100644
--- a/app/templates/corpora/corpus.html.j2
+++ b/app/templates/corpora/corpus.html.j2
@@ -72,7 +72,7 @@
       </div>
     </div>
 
-    <div class="col s12" id="corpus-files" data-corpus-id="{{ corpus.hashid }}" data-user-id="{{ corpus.user.hashid }}">
+    <div class="col s12 nopaque-ressource-list" data-corpus-id="{{ corpus.hashid }}" data-ressource-type="CorpusFile" data-user-id="{{ corpus.user.hashid }}">
       <div class="card">
         <div class="card-content">
           <span class="card-title" id="files">Corpus files</span>
@@ -122,6 +122,5 @@
 {{ super() }}
 <script>
   let corpusDisplay = new CorpusDisplay(document.querySelector('#corpus-display'));
-  let corpusFileList = new CorpusFileList(document.querySelector('#corpus-files'));
 </script>
 {% endblock scripts %}
diff --git a/app/templates/jobs/job.html.j2 b/app/templates/jobs/job.html.j2
index 2712b6ac..43796238 100644
--- a/app/templates/jobs/job.html.j2
+++ b/app/templates/jobs/job.html.j2
@@ -87,7 +87,7 @@
       </div>
     </div>
 
-    <div class="col s12" id="job-inputs" data-job-id="{{ job.hashid }}" data-user-id="{{ job.user.hashid }}">
+    <div class="col s12 nopaque-ressource-list" data-job-id="{{ job.hashid }}" data-ressource-type="JobInput" data-user-id="{{ job.user.hashid }}">
       <div class="card">
         <div class="card-content">
           <div class="row">
@@ -112,7 +112,7 @@
       </div>
     </div>
 
-    <div class="col s12" id="job-results" data-job-id="{{ job.hashid }}" data-user-id="{{ job.user.hashid }}">
+    <div class="col s12 nopaque-ressource-list" data-job-id="{{ job.hashid }}" data-ressource-type="JobResult" data-user-id="{{ job.user.hashid }}">
       <div class="card">
         <div class="card-content">
           <div class="row">
@@ -172,7 +172,5 @@
 {{ super() }}
 <script>
   let jobDisplay = new JobDisplay(document.querySelector('#job-display'));
-  let jobInputList = new JobInputList(document.querySelector('#job-inputs'));
-  let jobResultList = new JobResultList(document.querySelector('#job-results'));
 </script>
 {% endblock scripts %}
diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2
index 8872efca..8e5804ad 100644
--- a/app/templates/main/dashboard.html.j2
+++ b/app/templates/main/dashboard.html.j2
@@ -18,7 +18,7 @@
             <li class="tab col s6"><a href="#query-results">Query results</a></li>
           </ul>
         </div>
-        <div class="col s12" data-user-id="{{ current_user.hashid }}" id="corpora">
+        <div class="col s12 nopaque-ressource-list" data-ressource-type="Corpus" data-user-id="{{ current_user.hashid }}" id="corpora">
           <div class="card">
             <div class="card-content">
               <div class="input-field">
@@ -26,7 +26,7 @@
                 <input id="search-corpus" class="search" type="search"></input>
                 <label for="search-corpus">Search corpus</label>
               </div>
-              <table class="highlight ressource-list">
+              <table class="highlight">
                 <thead>
                   <tr>
                     <th></th>
@@ -48,7 +48,7 @@
             </div>
           </div>
         </div>
-        <div class="col s12" id="query-results">
+        <div class="col s12 nopaque-ressource-list" data-ressource-type="QueryResult" data-user-id="{{ current_user.hashid }}" id="query-results">
           <div class="card">
             <div class="card-content">
               <div class="input-field">
@@ -56,7 +56,7 @@
                 <input id="search-query-results" class="search" type="search"></input>
                 <label for="search-query-results">Search query result</label>
               </div>
-              <table class="highlight ressource-list">
+              <table class="highlight">
                 <thead>
                   <tr>
                     <th>
@@ -89,7 +89,7 @@
       </div>
     </div>
 
-    <div class="col s12" data-user-id="{{ current_user.hashid }}" id="jobs">
+    <div class="col s12 nopaque-ressource-list" data-ressource-type="Job" data-user-id="{{ current_user.hashid }}" id="jobs">
       <h3>My Jobs</h3>
       <p>A job is the execution of a service provided by nopaque. You can create any number of jobs and let them be processed simultaneously.</p>
       <div class="card">
@@ -99,7 +99,7 @@
             <input id="search-job" class="search" type="search"></input>
             <label for="search-job">Search job</label>
           </div>
-          <table class="highlight ressource-list">
+          <table class="highlight">
             <thead>
               <tr>
                 <th><span class="sort" data-sort="service">Service</span></th>
@@ -174,12 +174,3 @@
   </div>
 </div>
 {% endblock modals %}
-
-{% block scripts %}
-{{ super() }}
-<script>
-  let corpusList = new CorpusList(document.querySelector('#corpora'));
-  let jobList = new JobList(document.querySelector('#jobs'));
-  //let queryResultList = new QueryResultList(document.querySelector('#query-results'));
-</script>
-{% endblock scripts %}
-- 
GitLab