From 74c863e0f7e10dd8303bf8673b26b05f38b59011 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Mon, 19 Aug 2019 17:09:01 +0200
Subject: [PATCH] Only handle difference of changes to the job list.

---
 app/static/js/jobs.js                | 10 +++-----
 app/static/js/polls.js               |  9 ++++---
 app/templates/main/dashboard.html.j2 | 38 +++++++++++++++++++++++++---
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/app/static/js/jobs.js b/app/static/js/jobs.js
index 97fd1afa..fbdb993e 100644
--- a/app/static/js/jobs.js
+++ b/app/static/js/jobs.js
@@ -14,24 +14,20 @@ const STATUS_COLORS = {"pending": "amber",
 function createJobElement(job) {
   jobElement = document.createElement("a");
   jobElement.classList.add("avatar", "collection-item");
-  jobElement.dataset.key = "id";
-  jobElement.dataset.value = job.id;
+  jobElement.dataset.id = job.id;
   jobElement.href = `/jobs/${job.id}`;
   jobDescriptionElement = document.createElement("p");
-  jobDescriptionElement.dataset.key = "description";
+  jobDescriptionElement.classList.add("description");
   jobDescriptionElement.innerText = job.description;
   jobServiceElement = document.createElement("i");
-  jobServiceElement.classList.add("circle", "material-icons", SERVICE_COLORS[job.service]);
-  jobServiceElement.dataset.key = "service";
+  jobServiceElement.classList.add("circle", "material-icons", "service-icon", SERVICE_COLORS[job.service]);
   jobServiceElement.innerText = SERVICE_ICONS[job.service];
   jobStatusElement = document.createElement("span");
   jobStatusElement.classList.add("badge", "new", "status", STATUS_COLORS[job.status]);
   jobStatusElement.dataset.badgeCaption = "";
-  jobStatusElement.dataset.key = "status";
   jobStatusElement.innerText = job.status;
   jobTitleElement = document.createElement("span");
   jobTitleElement.classList.add("title");
-  jobTitleElement.dataset.key = "title";
   jobTitleElement.innerText = job.title;
 
   jobElement.appendChild(jobServiceElement);
diff --git a/app/static/js/polls.js b/app/static/js/polls.js
index c8e8ce34..a4ae2c00 100644
--- a/app/static/js/polls.js
+++ b/app/static/js/polls.js
@@ -39,11 +39,12 @@ function getJobs() {
   .then(function(response) {
       return response.json();
   })
-  .then(function(data) {
-    if (JSON.stringify(jobs) != JSON.stringify(data)) {
-      jobs = data;
+  .then(function(json) {
+    var delta = jsondiffpatch.diff(jobs, json);
+    if (delta) {
+      jobs = json;
       for (subscriber of subscribers.jobs) {
-        subscriber();
+        subscriber(delta);
       }
     }
   })
diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2
index 94c97662..d77865ff 100644
--- a/app/templates/main/dashboard.html.j2
+++ b/app/templates/main/dashboard.html.j2
@@ -76,14 +76,44 @@
   </div>
 </div>
 <script>
-  var jobList = new List("job-list", {valueNames: ["title"],
+  var template = '<a><span class="title"></span></a>'
+  var jobList = new List("job-list", {item: '<a><span class="title"></span></a>',
                                       page: 4,
-                                      pagination: false});
+                                      pagination: true,
+                                      valueNames: ["description",
+                                                   "title",
+                                                   {data: ["id"]}]});
   jobList.on("filterComplete", updatePagination);
   jobList.on("searchComplete", updatePagination);
   createJobElements(jobList);
-  subscribers.jobs.push(function() {
-    console.log('[Jobs]: Something changed.');
+  subscribers.jobs.push(function(delta) {
+    for (key in delta) {
+      if (key === "_t") {continue;}
+      if (key.startsWith("_")) {
+        jobList.remove("id", delta[key][0].id);
+      } else if (Array.isArray(delta[key])) {
+        jobElement = createJobElement(delta[key][0]);
+        listItem = jobList.add({"description": delta[key][0].description,
+                                "title": delta[key][0].title,
+                                "id": delta[key][0].id})[0];
+        listItem.elm.replaceWith(jobElement);
+        listItem.elm = jobElement;
+      } else {
+        var listItem = jobList.get("id", jobs[parseInt(key)].id)[0];
+        if (delta[key]["status"]) {
+          var jobStatusElement = listItem.elm.querySelector(".status");
+          jobStatusElement.classList.remove(STATUS_COLORS[delta[key]["status"][0]]);
+          jobStatusElement.classList.add(STATUS_COLORS[delta[key]["status"][1]]);
+          jobStatusElement.innerHTML = delta[key]["status"][1];
+        }
+        if (delta[key]["description"]) {
+          listItem.values({"description": delta[key]["description"][1]});
+        }
+        if (delta[key]["title"]) {
+          listItem.values({"title": delta[key]["title"][1]});
+        }
+      }
+    }
   });
 </script>
 
-- 
GitLab