From: Marcin Haba Date: Fri, 11 Dec 2015 07:56:58 +0000 (+0100) Subject: baculum: Add run job again button and small improvements X-Git-Tag: Release-7.4.0~153 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=1f0e77421e974e98cc1cd634b171c20158dfa2dc;p=bacula%2Fbacula baculum: Add run job again button and small improvements --- diff --git a/gui/baculum/protected/JavaScript/slide-window.js b/gui/baculum/protected/JavaScript/slide-window.js index e8b1325c71..b857b7392a 100644 --- a/gui/baculum/protected/JavaScript/slide-window.js +++ b/gui/baculum/protected/JavaScript/slide-window.js @@ -12,6 +12,7 @@ var SlideWindowClass = Class.create({ options: null, configurationObj: null, loadRequest : null, + actionsRequest: null, repeaterEl: null, gridEl: null, checked: [], @@ -29,16 +30,19 @@ var SlideWindowClass = Class.create({ }, elements : { - containerSuffix : '-slide-window-container', - configurationWindows : 'div.configuration', + content: 'div.slide-window-content', + containerSuffix: '-slide-window-container', + containerProgressSuffix: '-slide-window-progress', + configurationWindows: 'div.configuration', configurationProgress: 'div.configuration-progress', - contentItems : 'slide-window-element', - contentAlternatingItems : 'slide-window-element-alternating', - toolsButtonSuffix : '-slide-window-tools', - optionsButtonSuffix : '-slide-window-options', - actionsSuffix : '-slide-window-actions', - toolbarSuffix : '-slide-window-toolbar', - titleSuffix : '-slide-window-title' + contentItems: 'slide-window-element', + contentAlternatingItems: 'slide-window-element-alternating', + toolsButtonSuffix: '-slide-window-tools', + optionsButtonSuffix: '-slide-window-options', + actionsSuffix: '-slide-window-actions', + toolbarSuffix: '-slide-window-toolbar', + titleSuffix: '-slide-window-title', + actionsButton : 'actions_btn' }, initialize: function(windowId, data) { @@ -128,8 +132,28 @@ var SlideWindowClass = Class.create({ this.options.observe('click', function() { this.toggleToolbar(); }.bind(this)); + + this.setActionsBtnEvents(); + }, + + setActionsBtnEvents: function() { + var actions_btn_container = this.window.getElementsByClassName(this.elements.actionsButton); + if (actions_btn_container.length === 1) { + var actions_btn = actions_btn_container[0].getElementsByTagName('INPUT'); + if (actions_btn.length === 1) { + actions_btn[0].addEventListener('mouseup', function(e) { + var row = this.getGridRowUnderCursor(e); + var el = $(row).down('input[type=hidden]'); + if(el) { + var val = el.getValue(); + this.actionsRequest.ActiveControl.CallbackParameter = val; + this.actionsRequest.dispatch(); + } + }.bind(this)); + } + } }, - + openWindow : function() { this.hideOtherWindows(); Effect.toggle(this.window, 'slide', { duration: 0.3, afterFinish : function() { @@ -148,7 +172,16 @@ var SlideWindowClass = Class.create({ isWindowOpen: function() { return !(this.window.style.display === 'none'); }, - + + showProgress: function(show) { + var progress = $(this.windowId + this.elements.containerProgressSuffix); + if (show === true) { + progress.setStyle({display: 'block'}); + } else if (show === false) { + progress.hide(); + } + }, + resetSize : function() { if(this.isConfigurationOpen()) { if(this.isFullSize()) { @@ -210,10 +243,14 @@ var SlideWindowClass = Class.create({ this.configurationObj = obj; }, - setWindowElementsEvent: function(repeaterEl, gridEl, requestObj) { - this.repeaterEl = repeaterEl; - this.gridEl = gridEl; - this.loadRequest = requestObj; + setWindowElementsEvent: function(opts) { + this.repeaterEl = opts.repeater_id; + this.gridEl = opts.grid_id; + this.loadRequest = opts.request_obj; + if (opts.hasOwnProperty('actions_obj')) { + this.actionsRequest = opts.actions_obj; + } + this.showProgress(false); this.markAllChecked(false); this.setLoadRequest(); this.postWindowOpen(); @@ -228,6 +265,15 @@ var SlideWindowClass = Class.create({ dataList = $(this.repeaterEl + '_Container').select('div.slide-window-element'); } + var set_callback_parameter = function(element) { + var el = $(element).down('input[type=hidden]') + if(el) { + var val = el.getValue(); + this.loadRequest.ActiveControl.CallbackParameter = val; + this.loadRequest.dispatch(); + this.configurationObj.openConfigurationWindow(this); + } + }.bind(this); dataList.each(function(tr) { $(tr).observe('click', function(index, clickedEl) { var target = clickedEl.target || clickedEl.srcElement; @@ -236,14 +282,7 @@ var SlideWindowClass = Class.create({ if(clicked && clicked.hasAttribute('type') && clicked.readAttribute('type') == 'checkbox') { return; } - - var el = $(tr).down('input[type=hidden]') - if(el) { - var val = el.getValue(); - this.loadRequest.ActiveControl.CallbackParameter = val; - this.loadRequest.dispatch(); - this.configurationObj.openConfigurationWindow(this); - } + set_callback_parameter(tr); }.bind(this, tr)); }.bind(this)); }, @@ -445,6 +484,48 @@ var SlideWindowClass = Class.create({ postWindowOpen: function() { this.setActions(); this.setElementsCount(); + this.setOptionsBtn(); + }, + setOptionsBtn: function() { + var options_btn = this.window.getElementsByClassName(this.elements.actionsButton); + var table_window = $(this.windowId + this.elements.containerSuffix).down(this.elements.content); + if (options_btn.length === 1) { + options_btn = options_btn[0]; + table_window.stopObserving('mouseover'); + table_window.observe('mouseover', function(e) { + var el = this.getGridRowUnderCursor(e); + if (el && (el.className == this.elements.contentItems || el.className == this.elements.contentAlternatingItems)) { + el.style.backgroundColor = '#aeb2b6'; + options_btn.setStyle({display: ''}); + var scroll_y = document.viewport.getScrollOffsets().top; + var y = (el.viewportOffset().top + scroll_y - 57).toString() + 'px'; + options_btn.setStyle({top: y}); + } else { + options_btn.setStyle({display: 'none'}); + } + }.bind(this)); + table_window.stopObserving('mouseout'); + table_window.observe('mouseout', function(e) { + table_window.select('TR').forEach(function(el) { + el.style.backgroundColor = ''; + });; + options_btn.setStyle({display: 'none'}); + }); + } + }, + getGridRowUnderCursor: function(e) { + var x = e.clientX - 100; + var y = e.clientY; + var element_mouse_is_over = document.elementFromPoint(x, y); + var el; + var el_over = $(element_mouse_is_over); + if (el_over && el_over.nodeName != 'TR') { + el = el_over.down('tr'); + if (!el) { + el = el_over.up('tr'); + } + } + return el; } }); @@ -452,7 +533,7 @@ var SlideWindow = new SlideWindowClass() document.observe("dom:loaded", function() { if(Prototype.Browser.IE || Prototype.Browser.Gecko || Prototype.Browser.WebKit) { - $$('input[type=checkbox], input[type=submit], input[type=radio], a').each(function(el) { + $$('input[type=checkbox], input[type=submit], input[type=radio], input[type=image], a').each(function(el) { el.observe('focus', function() { el.blur(); }.bind(el)); diff --git a/gui/baculum/protected/Pages/API/FileSets.php b/gui/baculum/protected/Pages/API/FileSets.php index 5f2ce3f1d0..b5275c140d 100644 --- a/gui/baculum/protected/Pages/API/FileSets.php +++ b/gui/baculum/protected/Pages/API/FileSets.php @@ -43,4 +43,4 @@ class FileSets extends BaculumAPI { } } } -?> \ No newline at end of file +?> diff --git a/gui/baculum/protected/Pages/API/JobRun.php b/gui/baculum/protected/Pages/API/JobRun.php index a9c950faa3..e895bf48c3 100644 --- a/gui/baculum/protected/Pages/API/JobRun.php +++ b/gui/baculum/protected/Pages/API/JobRun.php @@ -48,7 +48,20 @@ class JobRun extends BaculumAPI { if(!is_null($storage)) { if(!is_null($pool)) { $joblevels = $this->getModule('misc')->getJobLevels(); - $run = $this->getModule('bconsole')->bconsoleCommand($this->director, array('run', 'job="' . $job . '"', 'level="' . $joblevels[$level] . '"', 'fileset="' . $fileset . '"', 'client="' . $client->name . '"', 'storage="' . $storage->name . '"', 'pool="' . $pool->name . '"' , 'priority="' . $priority . '"', $jobid , $verifyjob, 'yes'), $this->user); + $command = array( + 'run', + 'job="' . $job . '"', + 'level="' . $joblevels[$level] . '"', + 'fileset="' . $fileset . '"', + 'client="' . $client->name . '"', + 'storage="' . $storage->name . '"', + 'pool="' . $pool->name . '"' , + 'priority="' . $priority . '"', + $jobid, + $verifyjob, + 'yes' + ); + $run = $this->getModule('bconsole')->bconsoleCommand($this->director, $command, $this->user); $this->output = $run->output; $this->error = (integer)$run->exitcode; } else { diff --git a/gui/baculum/protected/Pages/API/JobShow.php b/gui/baculum/protected/Pages/API/JobShow.php new file mode 100644 index 0000000000..fddd516c95 --- /dev/null +++ b/gui/baculum/protected/Pages/API/JobShow.php @@ -0,0 +1,38 @@ +Request['id']); + $job = $this->getModule('job')->getJobById($jobid); + if(!is_null($job)) { + $jobShow = $this->getModule('bconsole')->bconsoleCommand($this->director, array('show', 'job="' . $job->name . '"'), $this->user); + $this->output = $jobShow->output; + $this->error = (integer)$jobShow->exitcode; + } else { + $this->output = JobError::MSG_ERROR_JOB_DOES_NOT_EXISTS; + $this->error = JobError::ERROR_JOB_DOES_NOT_EXISTS; + } + } +} + +?> diff --git a/gui/baculum/protected/Pages/API/JobsShow.php b/gui/baculum/protected/Pages/API/JobsShow.php new file mode 100644 index 0000000000..988067914a --- /dev/null +++ b/gui/baculum/protected/Pages/API/JobsShow.php @@ -0,0 +1,32 @@ +getModule('bconsole')->bconsoleCommand($this->director, array('show', 'jobs'), $this->user); + $this->output = $jobs->output; + $this->error = (integer)$jobs->exitcode; + } +} + +?> diff --git a/gui/baculum/protected/Pages/Home.page b/gui/baculum/protected/Pages/Home.page index 4aef694f0e..f0f5b9880f 100644 --- a/gui/baculum/protected/Pages/Home.page +++ b/gui/baculum/protected/Pages/Home.page @@ -13,15 +13,139 @@
diff --git a/gui/baculum/protected/Portlets/ClientList.tpl b/gui/baculum/protected/Portlets/ClientList.tpl index eb5b85b9af..5ee46995ca 100644 --- a/gui/baculum/protected/Portlets/ClientList.tpl +++ b/gui/baculum/protected/Portlets/ClientList.tpl @@ -17,7 +17,7 @@ AllowSorting="false" OnSortCommand="sortDataGrid" CellPadding="5px" - CssClass="window-section-detail" + CssClass="window-section-detail-smallrow" ItemStyle.CssClass="slide-window-element" AlternatingItemStyle.CssClass="slide-window-element-alternating" > diff --git a/gui/baculum/protected/Portlets/JobConfiguration.php b/gui/baculum/protected/Portlets/JobConfiguration.php index 0be1ad5c71..35c3c0fd09 100644 --- a/gui/baculum/protected/Portlets/JobConfiguration.php +++ b/gui/baculum/protected/Portlets/JobConfiguration.php @@ -28,6 +28,7 @@ class JobConfiguration extends Portlets { const DEFAULT_JOB_PRIORITY = 10; + const RESOURCE_SHOW_PATTERN = '/^\s+--> %resource: name=(.+?(?=\s\S+\=.+)|.+$)/i'; public $jobToVerify = array('C', 'O', 'd'); @@ -100,12 +101,21 @@ class JobConfiguration extends Portlets { $this->Pool->SelectedValue = $jobdata->poolid; $this->Pool->dataBind(); - $storages = $this->Application->getModule('api')->get(array('storages'))->output; + $jobshow = $this->Application->getModule('api')->get(array('jobs', 'show', $jobdata->jobid))->output; + $storageShow = $this->getResourceName('storage', $jobshow); $storagesList = array(); + $selectedStorageId = null; + $storages = $this->Application->getModule('api')->get(array('storages'))->output; foreach($storages as $storage) { + if ($storage->name == $storageShow) { + $selectedStorageId = $storage->storageid; + } $storagesList[$storage->storageid] = $storage->name; } $this->Storage->dataSource = $storagesList; + if (!is_null($selectedStorageId)) { + $this->Storage->SelectedValue = $selectedStorageId; + } $this->Storage->dataBind(); $runningJobStates = $this->Application->getModule('misc')->getRunningJobStates(); @@ -150,26 +160,41 @@ class JobConfiguration extends Portlets { if($this->PriorityValidator->IsValid === false) { return false; } + $params = array(); - $params['id'] = $this->JobID->Text; - $params['level'] = $this->Level->SelectedValue; - $params['fileset'] = $this->FileSet->SelectedValue; - $params['clientid'] = $this->Client->SelectedValue; - $params['storageid'] = $this->Storage->SelectedValue; - $params['poolid'] = $this->Pool->SelectedValue; - $params['priority'] = $this->Priority->Text; - - if (in_array($this->Level->SelectedItem->Value, $this->jobToVerify)) { - $verifyVals = $this->getVerifyVals(); - if ($this->JobToVerifyOptions->SelectedItem->Value == $verifyVals['jobname']) { - $params['verifyjob'] = $this->JobToVerifyJobName->SelectedValue; - } elseif ($this->JobToVerifyOptions->SelectedItem->Value == $verifyVals['jobid']) { - $params['jobid'] = $this->JobToVerifyJobId->Text; + if (is_null($sender) && is_numeric($param)) { + $jobdata = $this->Application->getModule('api')->get(array('jobs', $param))->output; + $jobshow = $this->Application->getModule('api')->get(array('jobs', 'show', $jobdata->jobid))->output; + $params['id'] = $jobdata->jobid; + $params['level'] = $jobdata->level; + $params['fileset'] = $this->getResourceName('fileset', $jobshow); + $params['clientid'] = $jobdata->clientid; + $storage = $this->getResourceName('storage', $jobshow); + $params['storageid'] = $this->getStorageByName($storage)->storageid; + $pool = $this->getResourceName('pool', $jobshow); + $params['poolid'] = $this->getPoolByName($pool)->poolid; + } else { + $params['id'] = $this->JobID->Text; + $params['level'] = $this->Level->SelectedValue; + $params['fileset'] = $this->FileSet->SelectedValue; + $params['clientid'] = $this->Client->SelectedValue; + $params['storageid'] = $this->Storage->SelectedValue; + $params['poolid'] = $this->Pool->SelectedValue; + $params['priority'] = $this->Priority->Text; + + if (in_array($this->Level->SelectedItem->Value, $this->jobToVerify)) { + $verifyVals = $this->getVerifyVals(); + if ($this->JobToVerifyOptions->SelectedItem->Value == $verifyVals['jobname']) { + $params['verifyjob'] = $this->JobToVerifyJobName->SelectedValue; + } elseif ($this->JobToVerifyOptions->SelectedItem->Value == $verifyVals['jobid']) { + $params['jobid'] = $this->JobToVerifyJobId->Text; + } } } - $result = $this->Application->getModule('api')->create(array('jobs', 'run'), $params)->output; - $this->Estimation->Text = implode(PHP_EOL, $result); + if (!is_null($sender) || !is_numeric($param)) { + $this->Estimation->Text = implode(PHP_EOL, $result); + } } public function estimate($sender, $param) { @@ -204,5 +229,41 @@ class JobConfiguration extends Portlets { $verifyVals = array_combine($verifyOpt, $verifyOpt); return $verifyVals; } + + private function getResourceName($resource, $jobshow) { + $resource_name = null; + $pattern = str_replace('%resource', $resource, self::RESOURCE_SHOW_PATTERN); + for ($i = 0; $i < count($jobshow); $i++) { + if (preg_match($pattern, $jobshow[$i], $match) === 1) { + $resource_name = $match[1]; + break; + } + } + return $resource_name; + } + + private function getPoolByName($name) { + $pool = null; + $pools = $this->Application->getModule('api')->get(array('pools'))->output; + for ($i = 0; $i < count($pools); $i++) { + if ($pools[$i]->name == $name) { + $pool = $pools[$i]; + break; + } + } + return $pool; + } + + private function getStorageByName($name) { + $storage = null; + $storages = $this->Application->getModule('api')->get(array('storages'))->output; + for ($i = 0; $i < count($storages); $i++) { + if ($storages[$i]->name == $name) { + $storage = $storages[$i]; + break; + } + } + return $storage; + } } ?> diff --git a/gui/baculum/protected/Portlets/JobList.php b/gui/baculum/protected/Portlets/JobList.php index ded04a7ba1..3e5e7994ac 100644 --- a/gui/baculum/protected/Portlets/JobList.php +++ b/gui/baculum/protected/Portlets/JobList.php @@ -22,7 +22,6 @@ Prado::using('System.Web.UI.ActiveControls.TActiveDataGrid'); Prado::using('System.Web.UI.ActiveControls.TActiveRepeater'); -Prado::using('System.Web.UI.ActiveControls.TActiveLinkButton'); Prado::using('System.Web.UI.ActiveControls.TActivePanel'); Prado::using('System.Web.UI.ActiveControls.TCallback'); Prado::using('Application.Portlets.ISlideWindow'); @@ -35,6 +34,7 @@ class JobList extends Portlets implements ISlideWindow { public $windowTitle; public $jobLevels; public $jobStates; + public $runningJobStates; public $jobTypes; public function setID($id) { @@ -63,15 +63,21 @@ class JobList extends Portlets implements ISlideWindow { public function onLoad($param) { parent::onLoad($param); - $this->prepareData(); + $allowedButtons = array('JobBtn', 'ReloadJobs', 'Run', 'RunJobAgain'); + if($this->Page->IsPostBack || $this->Page->IsCallBack) { + if(in_array($this->getPage()->CallBackEventTarget->ID, $allowedButtons)) { + $this->prepareData(); + } + } $misc = $this->Application->getModule('misc'); $this->jobLevels = $misc->getJobLevels(); $this->jobStates = $misc->getJobState(); $this->jobTypes = $misc->getJobType(); + $this->runningJobStates = $misc->getRunningJobStates(); } public function prepareData($forceReload = false) { - $allowedButtons = array('JobBtn', 'ReloadJobs', 'Run'); + $allowedButtons = array('JobBtn', 'ReloadJobs', 'Run', 'RunJobAgain'); if($this->Page->IsPostBack || $this->Page->IsCallBack || $forceReload) { if(in_array($this->getPage()->CallBackEventTarget->ID, $allowedButtons) || $forceReload) { $params = $this->getUrlParams('jobs', $this->getPage()->JobWindow->ID); @@ -106,6 +112,12 @@ class JobList extends Portlets implements ISlideWindow { } } + public function run_again($sender, $param) { + if($this->Page->IsCallBack) { + $this->getPage()->JobConfiguration->run_again(null, $param->CallbackParameter); + } + } + public function executeAction($action) { $params = explode(';', $this->CheckedValues->Value); $commands = array(); diff --git a/gui/baculum/protected/Portlets/JobList.tpl b/gui/baculum/protected/Portlets/JobList.tpl index 7e20d226e9..54b24f965e 100644 --- a/gui/baculum/protected/Portlets/JobList.tpl +++ b/gui/baculum/protected/Portlets/JobList.tpl @@ -53,11 +53,12 @@
<%=isset($this->getPage()->JobWindow->jobStates[$this->getParent()->Data['jobstatus']]['value']) ? $this->getPage()->JobWindow->jobStates[$this->getParent()->Data['jobstatus']]['value'] : ''%>
- + + + <%=$this->getParent()->Data['endtime']%> + <%=in_array($this->getParent()->Data['jobstatus'], $this->getPage()->JobWindow->runningJobStates) ? '' : ''%> + + @@ -68,4 +69,23 @@ status_callback_func(); + + + var img_btn = $('run_job_again_btn'); + var img_src_path = img_btn.readAttribute('src').replace(/[^\/]+\S$/, ''); + img_btn.writeAttribute('disabled', 'disabled'); + img_btn.writeAttribute('src', img_src_path + 'loader.gif'); + + + var img_btn = $('run_job_again_btn'); + var img_src_path = img_btn.readAttribute('src').replace(/[^\/]+\S$/, ''); + img_btn.writeAttribute('src', img_src_path + 'play.png'); + img_btn.removeAttribute('disabled'); + status_callback_func(); + oMonitor(); + + + diff --git a/gui/baculum/protected/Portlets/JobRunList.tpl b/gui/baculum/protected/Portlets/JobRunList.tpl index ec4255e100..32659d798a 100644 --- a/gui/baculum/protected/Portlets/JobRunList.tpl +++ b/gui/baculum/protected/Portlets/JobRunList.tpl @@ -20,7 +20,7 @@ AllowSorting="false" OnSortCommand="sortDataGrid" CellPadding="5px" - CssClass="window-section-detail" + CssClass="window-section-detail-smallrow" ItemStyle.CssClass="slide-window-element" AlternatingItemStyle.CssClass="slide-window-element-alternating" > diff --git a/gui/baculum/protected/Portlets/PoolList.tpl b/gui/baculum/protected/Portlets/PoolList.tpl index fa147f84d3..d0193a1447 100644 --- a/gui/baculum/protected/Portlets/PoolList.tpl +++ b/gui/baculum/protected/Portlets/PoolList.tpl @@ -18,7 +18,7 @@ AllowSorting="false" OnSortCommand="sortDataGrid" CellPadding="5px" - CssClass="window-section-detail" + CssClass="window-section-detail-smallrow" ItemStyle.CssClass="slide-window-element" AlternatingItemStyle.CssClass="slide-window-element-alternating" > diff --git a/gui/baculum/protected/Portlets/StorageList.tpl b/gui/baculum/protected/Portlets/StorageList.tpl index cf0649bfa2..54a71925a2 100644 --- a/gui/baculum/protected/Portlets/StorageList.tpl +++ b/gui/baculum/protected/Portlets/StorageList.tpl @@ -17,7 +17,7 @@ AllowSorting="false" OnSortCommand="sortDataGrid" CellPadding="5px" - CssClass="window-section-detail" + CssClass="window-section-detail-smallrow" ItemStyle.CssClass="slide-window-element" AlternatingItemStyle.CssClass="slide-window-element-alternating" > diff --git a/gui/baculum/protected/application.xml b/gui/baculum/protected/application.xml index 116597d0f4..99e3f67717 100644 --- a/gui/baculum/protected/application.xml +++ b/gui/baculum/protected/application.xml @@ -63,6 +63,8 @@ + + diff --git a/gui/baculum/themes/Baculum-v1/loader-alter.gif b/gui/baculum/themes/Baculum-v1/loader-alter.gif new file mode 100644 index 0000000000..87dd7fafab Binary files /dev/null and b/gui/baculum/themes/Baculum-v1/loader-alter.gif differ diff --git a/gui/baculum/themes/Baculum-v1/loader.gif b/gui/baculum/themes/Baculum-v1/loader.gif new file mode 100644 index 0000000000..00662c604c Binary files /dev/null and b/gui/baculum/themes/Baculum-v1/loader.gif differ diff --git a/gui/baculum/themes/Baculum-v1/play.png b/gui/baculum/themes/Baculum-v1/play.png new file mode 100644 index 0000000000..91d2059629 Binary files /dev/null and b/gui/baculum/themes/Baculum-v1/play.png differ diff --git a/gui/baculum/themes/Baculum-v1/style.css b/gui/baculum/themes/Baculum-v1/style.css index 1135fc81ed..7c8d41ace8 100644 --- a/gui/baculum/themes/Baculum-v1/style.css +++ b/gui/baculum/themes/Baculum-v1/style.css @@ -191,6 +191,16 @@ div.slide-window-progress { display: none; } +div.actions_btn { + position: absolute; + width: 35px; + height: 35px; + right: 22px; + top: 0px; + margin: 3px 0; + text-align: right; +} + #console { clear: left; min-width: 973px; @@ -385,7 +395,7 @@ input.bbutton { display: inline-block; width: auto; margin: 5px 8px; - padding: 0 18px; + padding: 0 16px; min-width: 65px; border-radius: 4px; border: 1px solid #8f2626; @@ -394,7 +404,7 @@ input.bbutton { } input.bbutton:hover { - padding: 0 18px; + padding: 0 16px; box-shadow: inset 0 0 3px #faeded; background: #ff7474; border: 1px solid #8f2626; @@ -446,27 +456,36 @@ tr.slide-window-element-alternating { tr.slide-window-element td, tr.slide-window-element-alternating td { font-style: italic; word-break: break-all; + line-height: 30px; } + tr.slide-window-element:hover, tr.slide-window-element-alternating:hover { float: none; cursor: pointer; } -tr.slide-window-element:hover td, tr.slide-window-element-alternating:hover td{ +tr.slide-window-element:hover td, tr.slide-window-element-alternating:hover td { background-color: #aeb2b6; } -table.window-section-detail, table.file-browser-detail { +tr.slide-window-element img, tr.slide-window-element-alternating img { + float: right; +} + +table.window-section-detail, table.window-section-detail-smallrow, table.file-browser-detail { background-color: rgba(0,0,0,0.5); width: 100%; font-size: 10px; font-weight: normal; } -table.window-section-detail th, table.file-browser-detail th { +table.window-section-detail th, table.window-section-detail-smallrow th, table.file-browser-detail th { background-color: black; color: white; } +table.window-section-detail-smallrow td { + line-height: 15px; +} table.file-browser-detail { border-spacing: 0; @@ -677,7 +696,7 @@ div.status-bar-detail-append, div.status-bar-detail-full, div.status-bar-detail- div.job-status-C, div.job-status-R, div.job-status-B, div.job-status-T, div.job-status-W, div.job-status-E, div.job-status-e, div.job-status-f, div.job-status-D, div.job-status-A, div.job-status-I, div.job-status-F, div.job-status-S, div.job-status-m, div.job-status-M, div.job-status-s, div.job-status-j, div.job-status-c, div.job-status-d, div.job-status-t, div.job-status-p, div.job-status-i, div.job-status-a, div.job-status-l, div.job-status-L { border: 1px solid black; - min-width: 80px; + min-width: 52px; height: 20px; line-height: 20px; font-size: 9px;