From 864c93a2eb296b4f158249c51b770283f4fdd501 Mon Sep 17 00:00:00 2001 From: Frank Bergkemper Date: Thu, 20 Oct 2016 15:42:05 +0100 Subject: [PATCH] Clickable jobnames This commit makes jobnames clickable in the dashboard-, job- and client module. Therefore some methods have been extended with a new parameter called jobname. Existing links, query parameters and method calls have been adjusted to fit those changes. Also a new form element, labeled as job name, has been added to the job view, to be able to filter for jobnames. --- .../Client/view/client/client/details.phtml | 18 ++++-- .../Controller/DashboardController.php | 40 ++++++------- .../view/dashboard/dashboard/index.phtml | 11 +++- .../Job/src/Job/Controller/JobController.php | 59 +++++++++++-------- module/Job/src/Job/Form/JobForm.php | 35 ++++++++++- module/Job/src/Job/Model/JobModel.php | 21 +++++-- module/Job/view/job/job/actions.phtml | 4 +- module/Job/view/job/job/details.phtml | 6 ++ module/Job/view/job/job/index.phtml | 21 ++++++- 9 files changed, 154 insertions(+), 61 deletions(-) diff --git a/module/Client/view/client/client/details.phtml b/module/Client/view/client/client/details.phtml index ab9f4226..d0376c1a 100644 --- a/module/Client/view/client/client/details.phtml +++ b/module/Client/view/client/client/details.phtml @@ -74,6 +74,7 @@ $this->headTitle($title); + @@ -164,12 +165,13 @@ $(document).ready(function() { }, "columns" : [ { "data": "jobid" }, + { "data": "name" }, { "data": "starttime" }, { "data": null }, { "data": "level" }, { "data": "jobfiles" }, { "data": "jobbytes", "type": "file-size" }, - { "data": null } + { "data": null }, ], "paging": true, "ordering": true, @@ -185,25 +187,31 @@ $(document).ready(function() { } }, { - "targets": 2, + "targets": 1, "render": function(data, type, full, meta) { - return ''+data.fileset+''; + return ''+data+''; } }, { "targets": 3, + "render": function(data, type, full, meta) { + return ''+data.fileset+''; + } + }, + { + "targets": 4, "render": function(data, type, full, meta) { return formatJobLevel(data); } }, { - "targets": 5, + "targets": 6, "render": function(data, type, full, meta) { return formatBytes(data); } }, { - "targets": 6, + "targets": 7, "render": function(data, type, full, meta) { return '" id="btn-1">'; } diff --git a/module/Dashboard/src/Dashboard/Controller/DashboardController.php b/module/Dashboard/src/Dashboard/Controller/DashboardController.php index c490bb8e..45d076f2 100644 --- a/module/Dashboard/src/Dashboard/Controller/DashboardController.php +++ b/module/Dashboard/src/Dashboard/Controller/DashboardController.php @@ -88,23 +88,23 @@ private function getJobs($status=null, $days=1, $hours=null) if($status != null) { if($status == "running") { - $jobs_R = $this->getJobModel()->getJobsByStatus($this->bsock, 'R', $days, $hours); - $jobs_l = $this->getJobModel()->getJobsByStatus($this->bsock, 'l', $days, $hours); + $jobs_R = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'R', $days, $hours); + $jobs_l = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'l', $days, $hours); $num = count($jobs_R) + count($jobs_l); } elseif($status == "waiting") { - $jobs_F = $this->getJobModel()->getJobsByStatus($this->bsock, 'F', $days, $hours); - $jobs_S = $this->getJobModel()->getJobsByStatus($this->bsock, 'S', $days, $hours); - $jobs_s = $this->getJobModel()->getJobsByStatus($this->bsock, 's', $days, $hours); - $jobs_m = $this->getJobModel()->getJobsByStatus($this->bsock, 'm', $days, $hours); - $jobs_M = $this->getJobModel()->getJobsByStatus($this->bsock, 'M', $days, $hours); - $jobs_j = $this->getJobModel()->getJobsByStatus($this->bsock, 'j', $days, $hours); - $jobs_c = $this->getJobModel()->getJobsByStatus($this->bsock, 'c', $days, $hours); - $jobs_C = $this->getJobModel()->getJobsByStatus($this->bsock, 'C', $days, $hours); - $jobs_d = $this->getJobModel()->getJobsByStatus($this->bsock, 'd', $days, $hours); - $jobs_t = $this->getJobModel()->getJobsByStatus($this->bsock, 't', $days, $hours); - $jobs_p = $this->getJobModel()->getJobsByStatus($this->bsock, 'p', $days, $hours); - $jobs_q = $this->getJobModel()->getJobsByStatus($this->bsock, 'q', $days, $hours); + $jobs_F = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'F', $days, $hours); + $jobs_S = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'S', $days, $hours); + $jobs_s = $this->getJobModel()->getJobsByStatus($this->bsock, null, 's', $days, $hours); + $jobs_m = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'm', $days, $hours); + $jobs_M = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'M', $days, $hours); + $jobs_j = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'j', $days, $hours); + $jobs_c = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'c', $days, $hours); + $jobs_C = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'C', $days, $hours); + $jobs_d = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'd', $days, $hours); + $jobs_t = $this->getJobModel()->getJobsByStatus($this->bsock, null, 't', $days, $hours); + $jobs_p = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'p', $days, $hours); + $jobs_q = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'q', $days, $hours); $num = count($jobs_F) + count($jobs_S) + count($jobs_s) + count($jobs_m) + count($jobs_M) + count($jobs_j) + @@ -113,15 +113,15 @@ private function getJobs($status=null, $days=1, $hours=null) count($jobs_p) + count($jobs_q); } elseif($status == "successful") { - $jobs_T = $this->getJobModel()->getJobsByStatus($this->bsock, 'T', $days, $hours); - $jobs_W = $this->getJobModel()->getJobsByStatus($this->bsock, 'W', $days, $hours); + $jobs_T = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'T', $days, $hours); + $jobs_W = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'W', $days, $hours); $num = count($jobs_T) + count($jobs_W); } elseif($status == "unsuccessful") { - $jobs_A = $this->getJobModel()->getJobsByStatus($this->bsock, 'A', $days, $hours); - $jobs_E = $this->getJobModel()->getJobsByStatus($this->bsock, 'E', $days, $hours); - $jobs_e = $this->getJobModel()->getJobsByStatus($this->bsock, 'e', $days, $hours); - $jobs_f = $this->getJobModel()->getJobsByStatus($this->bsock, 'f', $days, $hours); + $jobs_A = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'A', $days, $hours); + $jobs_E = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'E', $days, $hours); + $jobs_e = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'e', $days, $hours); + $jobs_f = $this->getJobModel()->getJobsByStatus($this->bsock, null, 'f', $days, $hours); $num = count($jobs_A) + count($jobs_E) + count($jobs_e) + count($jobs_f); } } diff --git a/module/Dashboard/view/dashboard/dashboard/index.phtml b/module/Dashboard/view/dashboard/dashboard/index.phtml index 42c06de7..870a1b8e 100644 --- a/module/Dashboard/view/dashboard/dashboard/index.phtml +++ b/module/Dashboard/view/dashboard/dashboard/index.phtml @@ -7,7 +7,6 @@ * @link https://github.com/bareos/bareos-webui for the canonical source repository * @copyright Copyright (c) 2013-2016 Bareos GmbH & Co. KG (http://www.bareos.org/) * @license GNU Affero General Public License (http://www.gnu.org/licenses/) - * @author Frank Bergkemper * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -156,9 +155,9 @@ $this->headTitle($title); "order": [[2, 'desc']], "columnDefs": [ { - "targets": 2, + "targets": 0, "render": function(data, type, full, meta) { - return ''+data+''; + return ''+data+''; } }, { @@ -167,6 +166,12 @@ $this->headTitle($title); return formatJobStatus(data); } }, + { + "targets": 2, + "render": function(data, type, full, meta) { + return ''+data+''; + } + }, { "targets": 3, "render": function(data, type, full, meta) { diff --git a/module/Job/src/Job/Controller/JobController.php b/module/Job/src/Job/Controller/JobController.php index 96256a77..4538d8b0 100644 --- a/module/Job/src/Job/Controller/JobController.php +++ b/module/Job/src/Job/Controller/JobController.php @@ -68,8 +68,18 @@ public function indexAction() $period = $this->params()->fromQuery('period') ? $this->params()->fromQuery('period') : '7'; $status = $this->params()->fromQuery('status') ? $this->params()->fromQUery('status') : 'all'; + $jobname = $this->params()->fromQuery('jobname') ? $this->params()->fromQUery('jobname') : 'all'; - $form = new JobForm($period, $status); + try { + $this->bsock = $this->getServiceLocator()->get('director'); + $jobs = $this->getJobModel()->getJobsByType($this->bsock, null); + array_push($jobs, array('name' => 'all')); + } + catch(Exception $e) { + echo $e->getMessage(); + } + + $form = new JobForm($jobs, $jobname, $period, $status); $action = $this->params()->fromQuery('action'); if(empty($action)) { @@ -77,7 +87,8 @@ public function indexAction() array( 'form' => $form, 'status' => $status, - 'period' => $period + 'period' => $period, + 'jobname' => $jobname ) ); } @@ -113,6 +124,7 @@ public function indexAction() 'form' => $form, 'status' => $status, 'period' => $period, + 'jobname' => $jobname, 'result' => $result ) ); @@ -272,6 +284,7 @@ public function getDataAction() $data = $this->params()->fromQuery('data'); $jobid = $this->params()->fromQuery('jobid'); + $jobname = $this->params()->fromQuery('jobname'); $status = $this->params()->fromQuery('status'); $period = $this->params()->fromQuery('period'); @@ -284,7 +297,7 @@ public function getDataAction() if($data == "jobs" && $status == "all") { try { - $result = $this->getJobModel()->getJobs($this->bsock, $period); + $result = $this->getJobModel()->getJobs($this->bsock, $jobname, $period); } catch(Exception $e) { echo $e->getMessage(); @@ -292,8 +305,8 @@ public function getDataAction() } elseif($data == "jobs" && $status == "successful") { try { - $jobs_T = $this->getJobModel()->getJobsByStatus($this->bsock, 'T', $period, null); // Terminated - $jobs_W = $this->getJobModel()->getJobsByStatus($this->bsock, 'W', $period, null); // Terminated with warnings + $jobs_T = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'T', $period, null); // Terminated + $jobs_W = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'W', $period, null); // Terminated with warnings $result = array_merge($jobs_T, $jobs_W); } catch(Exception $e) { @@ -302,10 +315,10 @@ public function getDataAction() } elseif($data == "jobs" && $status == "unsuccessful") { try { - $jobs_A = $this->getJobModel()->getJobsByStatus($this->bsock, 'A', $period, null); // Canceled jobs - $jobs_E = $this->getJobModel()->getJobsByStatus($this->bsock, 'E', $period, null); // - $jobs_e = $this->getJobModel()->getJobsByStatus($this->bsock, 'e', $period, null); // - $jobs_f = $this->getJobModel()->getJobsByStatus($this->bsock, 'f', $period, null); // + $jobs_A = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'A', $period, null); // Canceled jobs + $jobs_E = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'E', $period, null); // + $jobs_e = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'e', $period, null); // + $jobs_f = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'f', $period, null); // $result = array_merge($jobs_A, $jobs_E, $jobs_e, $jobs_f); } catch(Exception $e) { @@ -314,8 +327,8 @@ public function getDataAction() } elseif($data == "jobs" && $status == "running") { try { - $jobs_R = $this->getJobModel()->getJobsByStatus($this->bsock, 'R', $period, null); - $jobs_l = $this->getJobModel()->getJobsByStatus($this->bsock, 'l', $period, null); + $jobs_R = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'R', $period, null); + $jobs_l = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'l', $period, null); $result = array_merge($jobs_R, $jobs_l); } catch(Exception $e) { @@ -324,18 +337,18 @@ public function getDataAction() } elseif($data == "jobs" && $status == "waiting") { try { - $jobs_F = $this->getJobModel()->getJobsByStatus($this->bsock, 'F', $period, null); - $jobs_S = $this->getJobModel()->getJobsByStatus($this->bsock, 'S', $period, null); - $jobs_m = $this->getJobModel()->getJobsByStatus($this->bsock, 'm', $period, null); - $jobs_M = $this->getJobModel()->getJobsByStatus($this->bsock, 'M', $period, null); - $jobs_s = $this->getJobModel()->getJobsByStatus($this->bsock, 's', $period, null); - $jobs_j = $this->getJobModel()->getJobsByStatus($this->bsock, 'j', $period, null); - $jobs_c = $this->getJobModel()->getJobsByStatus($this->bsock, 'c', $period, null); - $jobs_d = $this->getJobModel()->getJobsByStatus($this->bsock, 'd', $period, null); - $jobs_t = $this->getJobModel()->getJobsByStatus($this->bsock, 't', $period, null); - $jobs_p = $this->getJobModel()->getJobsByStatus($this->bsock, 'p', $period, null); - $jobs_q = $this->getJobModel()->getJobsByStatus($this->bsock, 'q', $period, null); - $jobs_C = $this->getJobModel()->getJobsByStatus($this->bsock, 'C', $period, null); + $jobs_F = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'F', $period, null); + $jobs_S = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'S', $period, null); + $jobs_m = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'm', $period, null); + $jobs_M = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'M', $period, null); + $jobs_s = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 's', $period, null); + $jobs_j = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'j', $period, null); + $jobs_c = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'c', $period, null); + $jobs_d = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'd', $period, null); + $jobs_t = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 't', $period, null); + $jobs_p = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'p', $period, null); + $jobs_q = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'q', $period, null); + $jobs_C = $this->getJobModel()->getJobsByStatus($this->bsock, $jobname, 'C', $period, null); $result = array_merge( $jobs_F,$jobs_S,$jobs_m,$jobs_M, $jobs_s,$jobs_j,$jobs_c,$jobs_d, diff --git a/module/Job/src/Job/Form/JobForm.php b/module/Job/src/Job/Form/JobForm.php index 94874476..8bd526b5 100644 --- a/module/Job/src/Job/Form/JobForm.php +++ b/module/Job/src/Job/Form/JobForm.php @@ -31,16 +31,38 @@ class JobForm extends Form { + protected $jobs; protected $period; protected $status; + protected $jobname; - public function __construct($period=null, $status=null) + public function __construct($jobs=null, $jobname=null, $period=null, $status=null) { parent::__construct('job'); + $this->jobs = $jobs; + $this->jobname = $jobname; $this->period = $period; $this->status = $status; + if(isset($jobname)) { + $this->add(array( + 'name' => 'jobname', + 'type' => 'select', + 'options' => array( + 'label' => _('Job name'), + 'value_options' => $this->getJobnames(), + ), + 'attributes' => array( + 'class' => 'form-control selectpicker show-tick', + 'data-live-search' => 'true', + 'data-size' => '6', + 'id' => _('jobname'), + 'value' => $jobname + ) + )); + } + if(isset($period)) { $this->add(array( 'name' => 'period', @@ -90,4 +112,15 @@ public function __construct($period=null, $status=null) } + private function getJobnames() + { + $selectData = array(); + if(!empty($this->jobs)) { + foreach($this->jobs as $job) { + $selectData[$job['name']] = $job['name']; + } + } + return $selectData; + } + } diff --git a/module/Job/src/Job/Model/JobModel.php b/module/Job/src/Job/Model/JobModel.php index 1324af07..1825aa5a 100644 --- a/module/Job/src/Job/Model/JobModel.php +++ b/module/Job/src/Job/Model/JobModel.php @@ -27,14 +27,24 @@ class JobModel { - public function getJobs(&$bsock=null, $days=null) + public function getJobs(&$bsock=null, $jobname=null, $days=null) { if(isset($bsock)) { if($days == "all") { - $cmd = 'llist jobs'; + if($jobname == "all") { + $cmd = 'llist jobs'; + } + else { + $cmd = 'llist jobs jobname="'.$jobname.'"'; + } } else { - $cmd = 'llist jobs days='.$days; + if($jobname == "all") { + $cmd = 'llist jobs days='.$days; + } + else { + $cmd = 'llist jobs jobname="'.$jobname.'" days='.$days; + } } $result = $bsock->send_command($cmd, 2, null); if(preg_match('/Failed to send result as json. Maybe result message to long?/', $result)) { @@ -52,7 +62,7 @@ public function getJobs(&$bsock=null, $days=null) } } - public function getJobsByStatus(&$bsock=null, $status=null, $days=null, $hours=null) + public function getJobsByStatus(&$bsock=null, $jobname=null, $status=null, $days=null, $hours=null) { if(isset($bsock, $status)) { if(isset($days)) { @@ -74,6 +84,9 @@ public function getJobsByStatus(&$bsock=null, $status=null, $days=null, $hours=n else { $cmd = 'llist jobs jobstatus='.$status.''; } + if($jobname != "all") { + $cmd .= ' jobname="'.$jobname.'"'; + } $result = $bsock->send_command($cmd, 2, null); $jobs = \Zend\Json\Json::decode($result, \Zend\Json\Json::TYPE_ARRAY); return array_reverse($jobs['result']['jobs']); diff --git a/module/Job/view/job/job/actions.phtml b/module/Job/view/job/job/actions.phtml index 87fb1a4c..a2342415 100644 --- a/module/Job/view/job/job/actions.phtml +++ b/module/Job/view/job/job/actions.phtml @@ -109,7 +109,7 @@ $this->headTitle($title); "url": "basePath() . '/js/dataTables/language/'; ?>" + getLocale('') }, "columns" : [ - { "data": null }, + { "data": "name" }, { "data": "enabled", "orderable": true }, { "data": null, "orderable": false } ], @@ -125,7 +125,7 @@ $this->headTitle($title); { "targets": 0, "render": function(data, type, full, meta) { - return data.name; + return ''+data+''; } }, { diff --git a/module/Job/view/job/job/details.phtml b/module/Job/view/job/job/details.phtml index 9001b642..cdea7776 100644 --- a/module/Job/view/job/job/details.phtml +++ b/module/Job/view/job/job/details.phtml @@ -186,6 +186,12 @@ $(document).ready(function() { "info": false, "bFilter": false, "columnDefs": [ + { + "targets": 2, + "render": function(data, type, full, meta) { + return ''+data+''; + } + }, { "targets": 3, "render": function(data, type, full, meta) { diff --git a/module/Job/view/job/job/index.phtml b/module/Job/view/job/job/index.phtml index d3a36280..94d4922f 100644 --- a/module/Job/view/job/job/index.phtml +++ b/module/Job/view/job/job/index.phtml @@ -39,11 +39,15 @@ $this->headTitle($title);
-
+
+ formRow($form->get('jobname')); ?> +
+ +
formRow($form->get('period')); ?>
-
+
formRow($form->get('status')); ?>
@@ -183,6 +187,7 @@ function updateQueryParams(k, v) var p = []; var params = []; + p['jobname'] = 'jobname; ?>'; p['status'] = 'status; ?>'; p['period'] = 'period; ?>'; @@ -215,7 +220,7 @@ $(document).ready(function() { var table = $('#jobtable').DataTable( { "ajax": { - "url": "url('job', array('action' => 'getData'), null) . '?data=jobs&status='.$this->status.'&period='.$this->period; ?>", + "url": "url('job', array('action' => 'getData'), null) . '?data=jobs&jobname='.$this->jobname.'&status='.$this->status.'&period='.$this->period; ?>", "dataSrc": "" }, "language": { @@ -249,6 +254,12 @@ $(document).ready(function() { return ''+data+''; } }, + { + "targets": 2, + "render": function(data, type, full, meta) { + return ''+data+''; + } + }, { "targets": 3, "render": function(data, type, full, meta) { @@ -356,6 +367,10 @@ $(document).ready(function() { $('[data-toggle="tooltip"]').tooltip(); }); + $('#jobname').change(function(event) { + window.location.href = window.location.pathname + '?' + updateQueryParams('jobname', this.value); + }); + $('#period').change(function(event) { window.location.href = window.location.pathname + '?' + updateQueryParams('period', this.value); });
translate("Job ID"); ?>translate("Job name"); ?> translate("Timestamp"); ?> translate("Fileset"); ?> translate("Level"); ?>