]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add auto-refreshing job tables
authorMarcin Haba <marcin.haba@bacula.pl>
Wed, 20 Nov 2019 19:56:48 +0000 (20:56 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Sat, 14 Dec 2019 15:02:17 +0000 (16:02 +0100)
gui/baculum/protected/Web/JavaScript/misc.js
gui/baculum/protected/Web/Layouts/Main.tpl
gui/baculum/protected/Web/Pages/ClientView.page
gui/baculum/protected/Web/Pages/JobHistoryList.page
gui/baculum/protected/Web/Pages/JobView.page
gui/baculum/protected/Web/Pages/Monitor.php

index d73b25170bd5e48986d3456bb9d576f0cc7205e4..7263cc6ca6023d0adb75ed19369153c81965315a 100644 (file)
@@ -1050,6 +1050,61 @@ function sort_natural(a, b) {
        return a.localeCompare(b, undefined, {numeric: true});
 }
 
+function update_job_table(table_obj, new_data) {
+       var rows = table_obj.rows();
+       var old_jobs = {};
+       table_obj.data().toArray().forEach(function(job) {
+               old_jobs[job.jobid] = job;
+       });
+       var new_jobs = {};
+       new_data.forEach(function(job) {
+               new_jobs[job.jobid] = job;
+       });
+
+       var job_add_mod = {};
+       for (var jobid in new_jobs) {
+               if (!old_jobs.hasOwnProperty(jobid) || new_jobs[jobid].jobstatus != old_jobs[jobid].jobstatus) {
+                       job_add_mod[jobid] = new_jobs[jobid];
+               }
+       }
+       var job_rm = {};
+       for (var jobid in old_jobs) {
+               if (!new_jobs.hasOwnProperty(jobid)) {
+                       job_rm[jobid] = old_jobs[jobid];
+               }
+       }
+
+       var rows_rm_idxs = [];
+       var rows_list = rows.toArray();
+       var jobid;
+       for (var i = 0; i < rows_list[0].length; i++) {
+               row = rows_list[0][i];
+               jobid = table_obj.row(row).data().jobid
+               if (job_add_mod.hasOwnProperty(jobid)) {
+                       // update modified row
+                       table_obj.row(row).data(job_add_mod[jobid]).draw();
+                       // remove modified jobs from table
+                       delete job_add_mod[jobid];
+                       continue;
+               }
+               if (job_rm.hasOwnProperty(jobid)) {
+                       // get rows to remove
+                       rows_rm_idxs.push(row);
+                       continue;
+               }
+       };
+
+       // remove old rows
+       if (rows_rm_idxs.length > 0) {
+               table_obj.rows(rows_rm_idxs).remove().draw();
+       }
+
+       // add new rows
+       for (var jobid in job_add_mod) {
+               table_obj.row.add(job_add_mod[jobid]).draw();
+       }
+}
+
 $(function() {
        W3SideBar.init();
        set_sbbr_compatibility();
index 9f58667b342b78108090089f2bfddbe11870a64c..4617ccb5d7f9ab8a266a1575a70907aae272de38 100644 (file)
@@ -66,6 +66,7 @@ var last_callback_time = 0;
 var callback_time_offset = 0;
 var oData;
 var MonitorCalls = [];
+var MonitorCallsInterval = [];
 $(function() {
        if (is_small) {
                W3SideBar.close();
@@ -110,6 +111,10 @@ $(function() {
                                for (var i = 0; i < calls_len; i++) {
                                        MonitorCalls[i]();
                                }
+                               var calls_interval_len = MonitorCallsInterval.length;
+                               for (var i = 0; i < calls_interval_len; i++) {
+                                       MonitorCallsInterval[i]();
+                               }
                                if (calls_len > 0) {
                                        Formatters.set_formatters();
                                }
index b327b9a1fa89d62228cca33d9a5a912129539c68..8d8522ba2c9211653fc76c655af5dc4653208e95 100644 (file)
@@ -569,19 +569,14 @@ var oJobForClientList = {
                job_list: 'job_for_client_list',
                job_list_body: 'job_for_client_list_body'
        },
-       clientid: 0,
        data: [],
        table: null,
-       init: function(clientid) {
-               this.clientid = clientid;
-               this.prepare_data();
-               this.set_table();
-       },
-       prepare_data: function() {
-               for (var i = 0; i < oData.jobs.length; i++) {
-                       if (oData.jobs[i].clientid == this.clientid) {
-                               this.data.push(oData.jobs[i]);
-                       }
+       init: function() {
+               this.data = oData.jobs;
+               if (this.table) {
+                       update_job_table(this.table, this.data);
+               } else {
+                       this.set_table();
                }
        },
        set_table: function() {
@@ -700,9 +695,13 @@ var oJobForClientList = {
                });
        }
 };
-MonitorParams = {jobs: null};
+MonitorParams = {
+       jobs: {
+               client: ['<%=$this->getClientName()%>']
+       }
+};
 $(function() {
-       MonitorCalls.push(function() { oJobForClientList.init(<%=$this->getClientId()%>); });
+       MonitorCallsInterval.push(function() { oJobForClientList.init(); });
 });
 </script>
        <div class="w3-container tab_item" id="client_config" style="display: none">
index a169027e3df0eea201a3002e2d24c6f81a3c7262..c60a58e5c27d75f2edea727b3a08ecb26d51ac16 100644 (file)
@@ -66,12 +66,19 @@ var oJobList = {
                job_list: 'job_list',
                job_list_body: 'job_list_body'
        },
+       data: [],
+       table: null,
        init: function() {
-               this.set_table();
+               this.data = oData.jobs;
+               if (this.table) {
+                       update_job_table(this.table, this.data);
+               } else {
+                       this.set_table();
+               }
        },
        set_table: function() {
-               var table = $('#' + this.ids.job_list).DataTable({
-                       data: oData.jobs,
+               this.table = $('#' + this.ids.job_list).DataTable({
+                       data: this.data,
                        deferRender: true,
                        columns: [
                                {
@@ -220,7 +227,7 @@ var oJobList = {
 };
 MonitorParams = {jobs: null};
 $(function() {
-       MonitorCalls.push(function() { oJobList.init(); });
+       MonitorCallsInterval.push(function() { oJobList.init(); });
 });
 </script>
 </com:TContent>
index b363c8f2411c0378275dfaab25525f3ba9b0de9e..87c986204f0a97380da6d5ea673bdd5691ad247b 100644 (file)
@@ -115,19 +115,14 @@ var oJobHistoryList = {
                job_list: 'job_history_list',
                job_list_body: 'job_history_list_body'
        },
-       job_name: '',
        data: [],
        table: null,
-       init: function(job_name) {
-               this.job_name = job_name;
-               this.prepare_data();
-               this.set_table();
-       },
-       prepare_data: function() {
-               for (var i = 0; i < oData.jobs.length; i++) {
-                       if (oData.jobs[i].name == this.job_name) {
-                               this.data.push(oData.jobs[i]);
-                       }
+       init: function() {
+               this.data = oData.jobs;
+               if (this.table) {
+                       update_job_table(this.table, this.data);
+               } else {
+                       this.set_table();
                }
        },
        set_table: function() {
@@ -252,7 +247,7 @@ MonitorParams = {
        }
 };
 $(function() {
-       MonitorCalls.push(function() { oJobHistoryList.init('<%=$this->getJobName()%>'); });
+       MonitorCallsInterval.push(function() { oJobHistoryList.init(); });
 });
 </script>
        </div>
index da6d0e8cc446525f4a3cac354dbb1feab24a35e9..7cea73cc2c10a60920682c4ec6269353c9db8ffc 100644 (file)
@@ -49,9 +49,16 @@ class Monitor extends BaculumWebPage {
                if (is_array($params) && key_exists('jobs', $params)) {
                        $job_params = array('jobs');
                        $job_query = array();
-                       if (is_array($params['jobs']) && key_exists('name', $params['jobs']) && is_array($params['jobs']['name'])) {
-                               for ($i = 0; $i < count($params['jobs']['name']); $i++) {
-                                       $job_query['name'] = $params['jobs']['name'][$i];
+                       if (is_array($params['jobs'])) {
+                               if (key_exists('name', $params['jobs']) && is_array($params['jobs']['name'])) {
+                                       for ($i = 0; $i < count($params['jobs']['name']); $i++) {
+                                               $job_query['name'] = $params['jobs']['name'][$i];
+                                       }
+                               }
+                               if (key_exists('client', $params['jobs']) && is_array($params['jobs']['client'])) {
+                                       for ($i = 0; $i < count($params['jobs']['client']); $i++) {
+                                               $job_query['client'] = $params['jobs']['client'][$i];
+                                       }
                                }
                        }
                        if ($this->Request->contains('use_limit') && $this->Request['use_limit'] == 1) {