Merge branch 'feature/refine-ui-for-rc1-9361'

This commit is contained in:
Thomas Gelf 2015-06-18 15:19:15 +02:00
commit 8296e2f4c8
39 changed files with 1516 additions and 1396 deletions

View File

@ -27,6 +27,7 @@ $iframeClass = $isIframe ? ' iframe' : '';
<meta content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
<meta name="google" value="notranslate">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="cleartype" content="on">
<title><?= $this->title ? $this->escape($this->title) : 'Icinga Web' ?></title>
<!-- TODO: viewport and scale settings make no sense for us, fix this -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

View File

@ -5,7 +5,7 @@
<a href="<?= $this->href('/config/createresource'); ?>">
<?= $this->icon('plus'); ?> <?= $this->translate('Create A New Resource'); ?>
</a>
<table class="action" id="resource-edit-table">
<table class="action alternating" id="resource-edit-table">
<thead>
<th><?= $this->translate('Resource'); ?></th>
<th style="width: 5em"><?= $this->translate('Remove'); ?></th>

View File

@ -1,5 +1,5 @@
<form id="<?= $form->getId(); ?>" name="<?= $form->getName(); ?>" enctype="<?= $form->getEncType(); ?>" method="<?= $form->getMethod(); ?>" action="<?= $form->getAction(); ?>">
<table class="action">
<table class="action alternating">
<thead>
<th>Backend</th>
<th style="width: 5em"><?= $this->translate('Remove'); ?></th>

View File

@ -27,7 +27,7 @@ if (! isset($backend)) {
}
if (count($groups) > 0): ?>
<table data-base-target="_next" class="action group-list">
<table data-base-target="_next" class="action group-list alternating">
<thead>
<tr>
<th class="group-name"><?= $this->translate('Group'); ?></th>

View File

@ -6,7 +6,7 @@
<?php /** @var \Icinga\Application\Config $roles */ if ($roles->isEmpty()): ?>
<?= $this->translate('No roles found.') ?>
<?php else: ?>
<table class="avp action" data-base-target="_next">
<table class="avp action alternating" data-base-target="_next">
<thead>
<tr>
<th><?= $this->translate('Name') ?></th>

View File

@ -27,7 +27,7 @@ if (! isset($backend)) {
}
if (count($users) > 0): ?>
<table data-base-target="_next" class="action user-list">
<table data-base-target="_next" class="action user-list alternating">
<thead>
<tr>
<th class="user-name"><?= $this->translate('Username'); ?></th>

View File

@ -5,7 +5,7 @@ use Icinga\Data\Reducible;
use Icinga\Data\Selectable;
$editLink = null;
if ($this->hasPermission('config/authentication/users/edit') && $backend instanceof Updatable) {
if (true || $this->hasPermission('config/authentication/users/edit') && $backend instanceof Updatable) {
$editLink = $this->qlink(
null,
'user/edit',
@ -24,25 +24,35 @@ if ($this->hasPermission('config/authentication/users/edit') && $backend instanc
?>
<div class="controls">
<?php if (! $this->compact): ?>
<?= $tabs; ?>
<?= $tabs ?>
<?php endif ?>
<div class="user-header">
<p class="user-name"><strong><?= $this->escape($user->user_name); ?></strong></p> <?= $editLink; ?>
<p class="user-state"><strong><?= $this->translate('State'); ?>:</strong> <?= $user->is_active === null ? '-' : ($user->is_active ? $this->translate('Active') : $this->translate('Inactive')); ?></p>
<p class="user-created"><strong><?= $this->translate('Created at'); ?>:</strong> <?= $user->created_at === null ? '-' : $this->formatDateTime($user->created_at); ?></p>
<p class="user-modified"><strong><?= $this->translate('Last modified'); ?>:</strong> <?= $user->last_modified === null ? '-' : $this->formatDateTime($user->last_modified); ?></p>
<h3><?= $this->translate('Group Memberships'); ?></h3>
<?php if (! $this->compact): ?>
<?= $this->sortBox; ?>
<?php endif ?>
<?= $this->limiter; ?>
<?= $this->paginator; ?>
<?php if (! $this->compact): ?>
<?= $this->filterEditor; ?>
<?php endif ?>
</div>
<h1><?= $this->escape($user->user_name); ?><span class="pull-right"><?= $editLink ?></span></h1>
</div>
<div class="content memberships" data-base-target="_next">
<div class="content">
<table class="avp">
<tr>
<th><?= $this->translate('State'); ?>:</th>
<td><?= $user->is_active === null ? '-' : ($user->is_active ? $this->translate('Active') : $this->translate('Inactive')); ?></td>
</tr>
<tr>
<th><?= $this->translate('Created at'); ?>:</th>
<td><?= $user->created_at === null ? '-' : $this->formatDateTime($user->created_at); ?></td>
</tr>
<tr>
<th><?= $this->translate('Last modified'); ?>:</th>
<td><?= $user->last_modified === null ? '-' : $this->formatDateTime($user->last_modified); ?></td>
</tr>
</table>
<h3><?= $this->translate('Group Memberships'); ?></h3>
<?php if (! $this->compact): ?>
<?= $this->sortBox ?>
<?php endif ?>
<?= $this->limiter ?>
<?= $this->paginator ?>
<?php if (! $this->compact): ?>
<?= $this->filterEditor ?>
<?php endif ?>
<?php if (count($memberships) > 0): ?>
<table data-base-target="_next" class="action membership-list">
<thead>
@ -84,13 +94,18 @@ if ($this->hasPermission('config/authentication/users/edit') && $backend instanc
<p><?= $this->translate('No memberships found matching the filter'); ?></p>
<?php endif ?>
<?php if ($showCreateMembershipLink): ?>
<?= $this->qlink($this->translate('Create new membership'), 'user/createmembership', array(
'backend' => $backend->getName(),
'user' => $user->user_name
), array(
'icon' => 'plus',
'data-base-target' => '_next',
'class' => 'membership-create'
)); ?>
<?= $this->qlink(
$this->translate('Create new membership'),
'user/createmembership',
array(
'backend' => $backend->getName(),
'user' => $user->user_name
),
array(
'icon' => 'plus',
'data-base-target' => '_next',
'class' => 'membership-create'
)
) ?>
<?php endif ?>
</div>
</div>

View File

@ -11,7 +11,7 @@
)
); ?>
<?php if (count($backendNames) > 0): ?>
<table class="action usergroupbackend-list">
<table class="action usergroupbackend-list alternating">
<thead>
<tr>
<th class="backend-name"><?= $this->translate('Backend'); ?></th>

View File

@ -25,7 +25,6 @@ class StyleSheet
'css/icinga/setup.less',
'css/icinga/widgets.less',
'css/icinga/pagination.less',
'css/icinga/monitoring-colors.less',
'css/icinga/selection-toolbar.less',
'css/icinga/login.less',
'css/icinga/controls.less'

View File

@ -1,13 +1,37 @@
<div class="controls">
<?= $this->tabs ?>
<h1>Style Guide</h1>
</div>
<div class="content">
<h1>H1 - header</h1>
<h2>H2 - header</h2>
<h3>H3 - header</h3>
<h4>H4 - header</h4>
<h5>H5 - header</h5>
<h6>H6 - header</h6>
<h1>Header h1</h1>
<h2>Header h2</h2>
<h3>Header h3</h3>
<h4>Header h4</h4>
<h5>Header h5</h5>
<h6>Header h6</h6>
<p>This is a paragraph. This is a paragraph. This is a paragraph. This is a paragraph. This is a paragraph. This is a paragraph. A <a href="#">link pointing somewhere</a>. This is a paragraph. This is a paragraph. This is a paragraph. This is a paragraph. This is a paragraph.</p>
<table class="avp">
<thead>
<tr>
<th>Table Head - th in thead</th>
<td>td in thead<td>
</tr>
</thead>
<tbody>
<tr>
<th>Tbody - th</th>
<td>Tbody - td</td>
</tr>
<tr>
<th>Tbody - th</th>
<td>Tbody - td</td>
</tr>
<tr>
<th>Tbody - th</th>
<td>Tbody - td</td>
</tr>
</tbody>
</table>
</div>

View File

@ -35,7 +35,7 @@ class CheckNowCommandForm extends ObjectsCommandForm
'ignore' => true,
'type' => 'submit',
'value' => $this->translate('Check now'),
'label' => '<i aria-hidden="true" class="icon-reschedule"></i> '
'label' => '<i aria-hidden="true" class="icon-reschedule"></i>'
. $this->translate('Check now'),
'decorators' => array('ViewHelper'),
'escape' => false,

View File

@ -72,7 +72,7 @@ class DeleteCommentCommandForm extends CommandForm
'escape' => false,
'type' => 'submit',
'class' => 'link-like',
'label' => $this->getView()->icon('trash'),
'label' => $this->getView()->icon('cancel'),
'title' => $this->translate('Delete this comment'),
'decorators' => array('ViewHelper')
)

View File

@ -21,7 +21,7 @@ class ToggleObjectFeaturesCommandForm extends ObjectsCommandForm
$this->setUseFormAutosubmit();
$this->setTitle('Feature Commands');
$this->setAttrib('class', 'inline object-features');
$this->loadDefaultDecorators()->getDecorator('description')->setTag('h4');
$this->loadDefaultDecorators()->getDecorator('description')->setTag('h2');
}
/**

View File

@ -51,7 +51,8 @@ class Zend_View_Helper_Link extends Zend_View_Helper_Abstract
public function service($service, $serviceLinkText, $host, $hostLinkText)
{
return sprintf(
$this->view->translate('%s on %s', 'Service running on host'),
'%s: %s',
$this->host($host, $hostLinkText),
$this->view->qlink(
$serviceLinkText,
'monitoring/service/show',
@ -61,8 +62,7 @@ class Zend_View_Helper_Link extends Zend_View_Helper_Abstract
$service,
$host
))
),
$this->host($host, $hostLinkText)
)
);
}
}

View File

@ -1,4 +1,4 @@
<div class="controls">
<div class="controls separated">
<?php if (! $this->compact): ?>
<?= $this->tabs; ?>
<?php endif ?>

View File

@ -4,9 +4,7 @@
<div class="dontprint">
<?= $this->render('list/components/selectioninfo.phtml'); ?>
</div>
<div class="tinystatesummary">
<?= count($comments) ?> <?= $this->translate('Comments') ?>:
</div>
<h1><?= count($comments) ?> <?= $this->translate('Comments') ?></h1>
<?= $this->sortBox; ?>
<?= $this->limiter; ?>
<?= $this->paginator; ?>
@ -39,9 +37,9 @@ if (count($comments) === 0) {
<?= $this->qlink(
sprintf(
$this->translate('%s on %s', 'Service running on host'),
$comment->service_display_name,
$comment->host_display_name
'%s: %s',
$comment->host_display_name,
$comment->service_display_name
),
'monitoring/comment/show',
array('comment_id' => $comment->id),

View File

@ -14,7 +14,7 @@ function urlAddFilterOptional($url, $filter, $optional) {
$this->baseFilter = isset($this->baseFilter) ? $this->baseFilter : null;
$selfUrl = 'monitoring/list/hosts';
$currentUrl = Url::fromRequest()->getRelativeUrl();
?><div class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
?><h1 class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
<?= $this->qlink(
sprintf($this->translatePlural('%u Host', '%u Hosts', $this->stats->hosts_total), $this->stats->hosts_total),
$selfUrl,
@ -164,4 +164,4 @@ $currentUrl = Url::fromRequest()->getRelativeUrl();
</span>
<?php endif; ?>
</span>
</div>
</h1>

View File

@ -16,7 +16,7 @@ $this->baseFilter = isset($this->baseFilter) ? $this->baseFilter : null;
$selfUrl = 'monitoring/list/services';
$currentUrl = Url::fromRequest()->getRelativeUrl();
?><div class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
?><h1 class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
<?= $this->qlink(
sprintf($this->translatePlural(
'%u Service', '%u Services', $this->stats->services_total),
@ -143,4 +143,4 @@ foreach (array(2 => 'critical', 3 => 'unknown', 1 => 'warning') as $stateId => $
</span>
<?php endif ?>
</span>
</div>
</h1>

View File

@ -8,9 +8,7 @@ if (! $this->compact): ?>
<div class="dontprint">
<?= $this->render('list/components/selectioninfo.phtml'); ?>
</div>
<div class="tinystatesummary">
<?= count($downtimes) ?> <?= $this->translate('Downtimes') ?>
</div>
<h1><?= count($downtimes) ?> <?= $this->translate('Downtimes') ?></h1>
<?= $this->sortBox; ?>
<?= $this->limiter; ?>
<?= $this->paginator; ?>
@ -56,7 +54,7 @@ if (count($downtimes) === 0) {
}
?>
<?= $this->qlink(
sprintf($this->translate('%s on %s', 'Service running on host'), $downtime->service_display_name, $downtime->host_display_name),
sprintf('%s: %s', $downtime->host_display_name, $downtime->service_display_name),
'monitoring/downtime/show',
array('downtime_id' => $downtime->id),
array('title' => sprintf(

View File

@ -2,7 +2,7 @@
use Icinga\Module\Monitoring\Object\Host;
if (! $this->compact): ?>
<div class="controls">
<div class="controls separated">
<?= $this->tabs; ?>
<div class="dontprint">
<?= $this->render('list/components/selectioninfo.phtml'); ?>
@ -54,7 +54,7 @@ if (count($hosts) === 0) {
<!-- Host / Status / Output -->
<td>
<?= $this->iconImage()->host($host) ?>
<?= implode(' ', $this->hostFlags($host)) ?>
<span="objectflags"><?= implode(' ', $this->hostFlags($host)) ?></span>
<?= $this->qlink(
$host->host_display_name,
$hostLink,

View File

@ -5,16 +5,16 @@ use Icinga\Module\Monitoring\Object\Service;
$selfUrl = 'monitoring/list/services';
if (! $this->compact): ?>
<div class="controls">
<?= $this->tabs; ?>
<div class="controls separated">
<?= $this->tabs ?>
<div class="dontprint">
<?= $this->render('list/components/selectioninfo.phtml'); ?>
<?= $this->render('list/components/servicesummary.phtml'); ?>
<?= $this->render('list/components/selectioninfo.phtml') ?>
<?= $this->render('list/components/servicesummary.phtml') ?>
</div>
<?= $this->sortBox; ?>
<?= $this->limiter; ?>
<?= $this->paginator; ?>
<?= $this->filterEditor; ?>
<?= $this->sortBox ?>
<?= $this->limiter ?>
<?= $this->paginator ?>
<?= $this->filterEditor ?>
</div>
<?php endif ?>
<div class="content">
@ -48,7 +48,7 @@ if (count($services) === 0) {
?>
<tr class="state <?= $serviceStateName ?><?= $service->service_handled ? ' handled' : '' ?>">
<td class="state">
<strong><?= Service::getStateText($service->service_state, true); ?></strong>
<strong><?= Service::getStateText($service->service_state, true) ?></strong>
<?php if ((int) $service->service_state !== 99): ?>
<br />
<?= $this->timeSince($service->service_last_state_change, $this->compact) ?>
@ -60,25 +60,29 @@ if (count($services) === 0) {
</td>
<td>
<div class="sparkline-box"><?= $this->perfdata($service->service_perfdata, true, 5) ?> </div>
<?= $this->iconImage()->service($service) ?>
<?= implode(' ', $this->serviceFlags($service)); ?>
<?= $this->qlink(
$service->service_display_name,
$serviceLink,
null,
array('title' => sprintf(
$this->translate('Show detailed information for service %s on host %s'),
$service->service_display_name,
$service->host_display_name
))
); ?><?php if ($this->showHost): ?> on <?= $this->qlink(
<span class="objectflags"><?= implode(' ', $this->serviceFlags($service)) ?></span>
<?php if ($this->showHost): ?><?= $this->qlink(
$service->host_display_name . ($service->host_state != 0 ? ' (' . Host::getStateText($service->host_state, true) . ')' : ''),
$hostLink,
null,
array('title' => sprintf($this->translate('Show detailed information for host %s'), $service->host_display_name))
); ?><?php endif ?><br>
<p class="pluginoutput"><?= $this->escape($this->ellipsis($service->service_output, 10000)); ?></p>
) ?>:
<?php endif ?><?= $this->qlink(
$service->service_display_name,
$serviceLink,
null,
array(
'title' => sprintf(
$this->translate('Show detailed information for service %s on host %s'),
$service->service_display_name,
$service->host_display_name
),
'class' => 'rowaction'
)
) ?><br />
<div class="sparkline-box"><?= $this->perfdata($service->service_perfdata, true, 5) ?> </div>
<p class="pluginoutput"><?= $this->escape($this->ellipsis($service->service_output, 10000)) ?></p>
</td>
<?php foreach($this->addColumns as $col): ?>
<td><?= $this->escape($service->$col) ?></td>

View File

@ -1,9 +1,9 @@
<?php if ($comment->objecttype === 'service'): ?>
<?= $this->icon('service', $this->translate('Service')); ?>
<?= sprintf(
$this->translate('%s on %s', 'Service running on host'),
$comment->service_display_name,
$comment->host_display_name
'%s: %s',
$comment->host_display_name,
$comment->service_display_name
) ?>
<?php else: ?>
<?= $this->icon('host', $this->translate('Host')); ?>

View File

@ -13,7 +13,7 @@ function urlAddFilterOptional($url, $filter, $optional) {
}
$selfUrl = Url::fromPath('monitoring/list/services', array('host' => $object->host_name));
?><div class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
?><h2 class="tinystatesummary" <?= $this->compact ? ' data-base-target="col1"' : ''; ?>>
<?php if ($object->stats->services_total): ?>
<?= $this->qlink(
sprintf(
@ -147,4 +147,4 @@ foreach (array(2 => 'critical', 3 => 'unknown', 1 => 'warning') as $stateId => $
</span>
<?php endif ?>
</span>
</div>
</h2>

View File

@ -18,9 +18,8 @@ $i = 0;
<?= $this->iconImage()->service($service) ?>
<?= implode(' ', $this->serviceFlags($service)) ?>
<b>
<?= $this->escape($service->getName()); ?>
<?= $this->translate('on') ?>
<?= $this->escape($service->getHost()->getName()); ?><br>
<?= $this->escape($service->getHost()->getName()); ?>:
<?= $this->escape($service->getName()); ?> <br>
</b>
<?= $this->escape($service->service_output) ?>
</td>

View File

@ -1,4 +1,4 @@
<div class="controls">
<div class="controls separated">
<?php if (! $this->compact): ?>
<?= $this->tabs; ?>
<?php endif ?>

View File

@ -1,62 +1,90 @@
<tr>
<th><?= $this->translate('Comments'); ?></th>
<td>
<?php if ($this->hasPermission('monitoring/command/comment/add')) {
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
if ($object->getType() === $object::TYPE_HOST) {
echo $this->qlink(
$this->translate('Add comment'),
'monitoring/host/add-comment',
array('host' => $object->getName()),
array(
'icon' => 'comment',
'data-base-target' => '_self',
'title' => $this->translate('Add a new comment to this host')
)
);
} else {
echo $this->qlink(
$this->translate('Add comment'),
'monitoring/service/add-comment',
array('host' => $object->getHost()->getName(), 'service' => $object->getName()),
array(
'icon' => 'comment',
'data-base-target' => '_self',
'title' => $this->translate('Add a new comment to this service')
)
);
}
} else {
echo '&#45;';
} ?>
</td>
</tr>
<?php
foreach ($object->comments as $comment) {
// Ticket hook sample
$commentText = $this->tickets ? preg_replace_callback(
$this->tickets->getPattern(),
array($this->tickets, 'createLink'),
$this->escape($comment->comment)
) : $this->escape($comment->comment);
$addLink = '';
?>
<tr>
<th><?= $this->escape($comment->author); ?> (<?= $this->timeAgo($comment->timestamp); ?>)</th>
<td data-base-target="_self">
<?php if (isset($delCommentForm)) { // Form is unset if the current user lacks the respective permission
$delCommentForm = clone $delCommentForm;
$delCommentForm->populate(
array(
'comment_id' => $comment->id,
'comment_is_service' => isset($comment->service_description)
)
);
echo $delCommentForm;
} ?>
<span class="sr-only">(<?= $this->translate('Comment'); ?>): </span><?= str_replace(array('\r\n', '\n'), '<br>', $commentText); ?>
</td>
</tr>
<?php } // endforeach ?>
if ($this->hasPermission('monitoring/command/comment/add')) {
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
if ($object->getType() === $object::TYPE_HOST) {
$addLink = $this->qlink(
$this->translate('Add comment'),
'monitoring/host/add-comment',
array('host' => $object->getName()),
array(
'icon' => 'comment',
'data-base-target' => '_self',
'title' => $this->translate('Add a new comment to this host')
)
);
} else {
$addLink = $this->qlink(
$this->translate('Add comment'),
'monitoring/service/add-comment',
array('host' => $object->getHost()->getName(), 'service' => $object->getName()),
array(
'icon' => 'comment',
'data-base-target' => '_self',
'title' => $this->translate('Add a new comment to this service')
)
);
}
}
if (empty($object->comments) && ! $addLink) {
return;
}
?>
<tr>
<th><?php
echo $this->translate('Comments');
if (! empty($object->comments) && $addLink) {
echo '<br />' . $addLink;
}
?></th>
<td data-base-target="_self">
<?php if (empty($object->comments)): ?>
<?= $addLink ?>
<?php else: ?>
<ul class="inline-comments">
<?php foreach ($object->comments as $comment): ?>
<?php
// Ticket hook sample
$commentText = $this->tickets ? preg_replace_callback(
$this->tickets->getPattern(),
array($this->tickets, 'createLink'),
$this->escape($comment->comment)
) : $this->escape($comment->comment);
// Form is unset if the current user lacks the respective permission
if (isset($delCommentForm)) {
$deleteButton = clone($delCommentForm);
$deleteButton->populate(
array(
'comment_id' => $comment->id,
'comment_is_service' => isset($comment->service_description)
)
);
} else {
$deleteButton = '';
}
?>
<li class="comment-item">
<h3>
<span class="author"><?= $this->escape($comment->author) ?></span>
<?= $this->timeAgo($comment->timestamp) ?>
<?= $deleteButton ?>
</h3>
<p><span class="sr-only">(<?= $this->translate('Comment'); ?>): </span><?= str_replace(array('\r\n', '\n'), '<br>', $commentText) ?></p>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>
</td>
</tr>

View File

@ -13,9 +13,8 @@ if (! empty($object->contacts)) {
}
printf(
"<tr><th>%s</th><td>%s %s</td></tr>\n",
"<tr><th>%s</th><td class=\"go-ahead\">%s</td></tr>\n",
$this->translate('Contacts'),
$this->icon('user'),
implode(', ', $list)
);
@ -33,9 +32,8 @@ if (! empty($object->contactgroups)) {
}
printf(
"<tr><th>%s</th><td>%s %s</td></tr>\n",
"<tr><th>%s</th><td class=\"go-ahead\">%s</td></tr>\n",
$this->translate('Contactgroups'),
$this->icon('users'),
implode(', ', $list)
);

View File

@ -1,6 +1,7 @@
<?php if (empty($object->customvars)) return; ?>
<tr class="newsection">
<td colspan="2">
<h4 class="customvar"><?= $this->translate('Custom variables') ?></h4>
<h2 class="customvar"><?= $this->translate('Custom variables') ?></h2>
</td>
</tr>
<?php

View File

@ -1,44 +1,63 @@
<tr>
<th><?= $this->translate('Downtimes'); ?></th>
<td>
<?php if ($this->hasPermission('monitoring/command/downtime/schedule')) {
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
if ($object->getType() === $object::TYPE_HOST) {
echo $this->qlink(
$this->translate('Schedule downtime'),
'monitoring/host/schedule-downtime',
array('host' => $object->getName()),
array(
'icon' => 'plug',
'data-base-target' => '_self',
'title' => $this->translate(
'Schedule a downtime to suppress all problem notifications within a specific period of time'
)
)
);
} else {
echo $this->qlink(
$this->translate('Schedule downtime'),
'monitoring/service/schedule-downtime',
array('host' => $object->getHost()->getName(), 'service' => $object->getName()),
array(
'icon' => 'plug',
'data-base-target' => '_self',
'title' => $this->translate(
'Schedule a downtime to suppress all problem notifications within a specific period of time'
)
)
);
}
} else {
echo '&#45;';
} ?>
</td>
</tr>
<?php
foreach ($object->downtimes as $downtime) {
$addLink = '';
if ($this->hasPermission('monitoring/command/downtime/schedule')) {
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
if ($object->getType() === $object::TYPE_HOST) {
$addLink = $this->qlink(
$this->translate('Schedule downtime'),
'monitoring/host/schedule-downtime',
array('host' => $object->getName()),
array(
'icon' => 'plug',
'data-base-target' => '_self',
'title' => $this->translate(
'Schedule a downtime to suppress all problem notifications within a specific period of time'
)
)
);
} else {
$addLink = $this->qlink(
$this->translate('Schedule downtime'),
'monitoring/service/schedule-downtime',
array('host' => $object->getHost()->getName(), 'service' => $object->getName()),
array(
'icon' => 'plug',
'data-base-target' => '_self',
'title' => $this->translate(
'Schedule a downtime to suppress all problem notifications within a specific period of time'
)
)
);
}
}
if (empty($object->comments) && ! $addLink) {
return;
}
?>
<tr>
<th><?php
echo $this->translate('Downtimes');
if (! empty($object->downtimes) && $addLink) {
echo '<br />' . $addLink;
}
?></th>
<td data-base-target="_self">
<?php if (empty($object->downtimes)): ?>
<?= $addLink ?>
<?php else: ?>
<ul class="inline-comments">
<?php foreach ($object->downtimes as $downtime): ?>
<?php
// Ticket hook sample
$commentText = $this->tickets ? preg_replace_callback(
$this->tickets->getPattern(),
@ -65,21 +84,33 @@ foreach ($object->downtimes as $downtime) {
}
}
?>
<tr>
<th><?= $this->escape($downtime->author_name); ?> (<?= $this->timeAgo($downtime->entry_time); ?>)</th>
<td data-base-target="_self">
<?php if (isset($delDowntimeForm)) { // Form is unset if the current user lacks the respective permission
$delDowntimeForm = clone $delDowntimeForm;
$delDowntimeForm->populate(
array(
'downtime_id' => $downtime->id,
'downtime_is_service' => $object->getType() === $object::TYPE_SERVICE
)
);
echo $delDowntimeForm;
} ?>
<span class="sr-only"><?= $this->translate('Downtime'); ?></span><?= $state; ?> - <?= str_replace(array('\r\n', '\n'), '<br>', $commentText); ?>
</td>
</tr>
<?php } // endforeach ?>
// Form is unset if the current user lacks the respective permission
if (isset($delDowntimeForm)) {
$deleteButton = clone($delDowntimeForm);
$deleteButton->populate(
array(
'downtime_id' => $downtime->id,
'downtime_is_service' => $object->getType() === $object::TYPE_SERVICE
)
);
} else {
$deleteButton = '';
}
?>
<li class="comment-item">
<h3>
<span class="author"><?= $this->escape($downtime->author_name) ?></span>
<?= $this->timeAgo($downtime->entry_time) ?>
<?= $deleteButton ?>
</h3>
<p> <span class="sr-only"><?= $this->translate('Downtime'); ?></span><?= $state; ?> - <?= str_replace(array('\r\n', '\n'), '<br>', $commentText); ?></p>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>
</td>
</tr>

View File

@ -1,5 +1,5 @@
<div class="pluginoutput">
<h4><?= $this->translate('Plugin Output') ?></h4>
<h2><?= $this->translate('Plugin Output') ?></h2>
<?= $this->pluginOutput($object->output) ?>
<?= $this->pluginOutput($object->long_output) ?>
</div>

View File

@ -1,7 +1,11 @@
<?php if (! $object->perfdata) return ?>
<tr>
<th><?= $this->translate('Performance data') ?></th>
<td>
<?= $this->perfdata($object->perfdata) ?>
</td>
<tr class="newsection">
<td colspan="2">
<h2><?= $this->translate('Performance data') ?></h2>
</td>
</tr>
<tr>
<td colspan="2" class="performance-data">
<?= $this->perfdata($object->perfdata) ?>
</td>
</tr>

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,22 @@
/*! Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
/* Color definitions */
@colorMainLayout: #049baf;
@colorMainBackground: #fff;
@colorMainForeground: #666;
@colorMainLink: #222;
@colorSecondary: #f9f9f9;
@colorGray: #f9f9f9;
@colorLinkDefault: #049baf;
@colorTextDefault: #666;
@colorTextDefault: @colorMainForeground;
@colorTextDarkDefault: #555;
@colorPetrol: #049baf;
@colorOk: #44bb77;
@colorWarning: #ffaa44;
@colorWarningHandled: #ffcc66;
@colorCritical: #ff5566;
@colorCriticalHandled: #ff99aa;
/*
@colorUnknown: #dd66ff;
@colorUnknownHandled: #ee99ff;
@colorUnreachable: #dd66ff;
@colorUnreachableHandled: #ee99ff;
*/
@colorUnknown: #aa44ff;
@colorUnknownHandled: #cc77ff;
@colorUnreachable: #aa44ff;
@ -27,20 +27,8 @@
@colorFormNotificationWarning: #ffaa44;
@colorFormNotificationError: #ff5566;
/* Mixins */
.page-header(@borderSize: 2px; @fontSize: 2em; @textColor: @colorTextDarkDefault) {
font-size: @fontSize;
color: @textColor;
border-bottom: @borderSize solid @colorPetrol;
a {
text-decoration: none;
color: inherit;
&:hover {
text-decoration: underline;
}
}
}
/* deprecated */
@colorPetrol: @colorMainLayout;
/*** Base rules ***/
* {
@ -81,44 +69,21 @@ body {
}
a {
color: #333;
text-decoration: underline;
}
@colorMainLink;
text-decoration: none;
a:hover {
color: black;
text-decoration: underline;
}
/* W3C Recommendation <http://www.w3.org/TR/CSS21/sample.html> (except h4) */
h1 {
.page-header();
}
h2 {
font-size: 1.5em;
color: @colorPetrol;
}
h3 {
.page-header(1px, 1.17em);
}
h4 {
font-size: 1em;
color: @colorPetrol;
}
h5 {
.page-header(1px, .83em);
}
h6 {
font-size: .75em;
color: @colorPetrol;
:hover {
text-decoration: underline;
}
}
h1, h2, h3, h4, h5, h6 {
font-size: 1em;
padding: 0.3em 0em;
margin: 0.7em 0 0.5em 0;
color: @textColor;
border-bottom: 1px dotted #aaa;
a {
text-decoration: none;
color: inherit;
@ -129,6 +94,31 @@ h1, h2, h3, h4, h5, h6 {
}
}
h5 {
font-size: 0.83em;
}
h6 {
font-size: 0.75em;
}
h1 {
border-bottom: 3px solid #666;
font-variant: small-caps;
font-weight: bold;
}
h2 {
border-bottom: 1px solid #888;
font-variant: small-caps;
font-weight: normal;
}
h3 {
font-weight: normal;
border-bottom: 1px solid #aaa;
}
button {
font-family: inherit;
}
@ -141,4 +131,4 @@ button {
position: absolute;
top: -2em;
}
/*** END of Base rules */
/*** END of Base rules */

View File

@ -260,9 +260,3 @@ form ul.descriptions {
}
}
}
form > div.header {
h1, h2, h3, h4, h5, h6 {
display: inline-block;
}
}

View File

@ -1,12 +1,5 @@
/*! Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
#header div.user {
font-size: 1.1em;
margin-top: 0.8em;
margin-right: 2em;
float: right;
}
#logo {
height: 3.6em;
width: 13em;

View File

@ -112,6 +112,7 @@ html {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
font-size: 0.875em;
width: 100%;
height: 100%;
overflow: auto;
@ -139,6 +140,11 @@ html {
z-index: 100;
}
.container .controls.separated {
box-shadow: 0 3px 4px -4px rgba(0, 0, 0, 0.2);
padding-bottom: 0.5em;
}
.container .fake-controls {
padding: 1em 1em 0;
}
@ -152,7 +158,6 @@ html {
}
.dashboard > div.container {
font-size: 0.9em;
vertical-align: top;
width: 48.5%;
display: inline-block;
@ -161,10 +166,6 @@ html {
margin-left: 1%;
}
.content h3 {
font-size: 0.9em;
}
.container .controls .pagination {
margin-left: 1.2em;
}

View File

@ -36,7 +36,6 @@ table.avp {
color: @colorTextDarkDefault;
table-layout: auto;
width: 100%;
font-size: 0.9em;
}
table.avp a {
@ -62,7 +61,7 @@ table.avp > tbody > tr > td {
}
table.avp.newsection, table.avp tr.newsection {
border-top: 1px solid #d9d9d9;
margin-top: 1em;
}
.content table.avp dd, .content table.avp dd {
@ -70,10 +69,6 @@ table.avp.newsection, table.avp tr.newsection {
padding: 0;
}
table.avp {
font-size: 0.8em;
}
table.avp a {
color: @colorLinkDefault;
text-decoration: none;
@ -83,76 +78,12 @@ table.avp a:hover {
text-decoration: underline;
}
/* Definitively monitoring-only: */
table.objectstate {
border-collapse: separate;
border-spacing: 1px;
}
table.objectstate td {
font-size: 1.2em;
line-height: 1.5em;
padding-left: 1em;
}
table.objectstate tr.state td.state {
font-size: 1em;
width: 9em;
text-align: center;
padding-left: 0;
border-radius: 0;
}
table.objectstate tr.state.handled td.state {
}
table.perfdata {
min-width: 24em;
font-size: 0.9em;
}
table.perfdata.perfdata-piecharts {
left: -2.6em;
position: relative;
}
table.perfdata th {
padding: 0;
text-align: left;
padding-right: 0.5em;
}
table.perfdata td {
white-space: nowrap;
padding-right: 0.5em;
}
table.objectlist {
min-width: 28em;
th {
text-align: left;
}
}
table.benchmark {
margin: 1em 1% 1em 1%;
font-family: monospace;
font-size: 1em;
width: 96%;
}
.dashboard h1 {
font-size: 1em;
}
.dashboard h2 {
font-size: 1em;
}
.dashboard h3 {
font-size: 1em;
}
.dashboard table.benchmark {
font-size: 0.9em;
}
@ -167,6 +98,7 @@ table.benchmark {
[class^="icon-"]:before, [class*=" icon-"]:before {
text-decoration: none;
margin-left: 0;
}
.info-box {
@ -175,6 +107,86 @@ table.benchmark {
background-color: #fbfcc5;
}
/* Action table */
table.action {
border-collapse: separate;
border-spacing: 1px;
width: 100%;
table-layout: fixed !important;
margin: 0;
color: @colorTextDefault;
}
table.action th {
text-align: left;
overflow: hidden;
}
table.action.wide td {
line-height: 2.5em;
}
table.action td {
padding: 0.3em 0.5em 0.3em 0.5em;
line-height: 1.5em;
overflow: hidden;
}
.dashboard table.action td {
line-height: 1.2em;
padding: 0.2 0.4em 0.2em 0.5em;
}
table.action td a {
color: inherit;
text-decoration: none;
}
table.action td a:hover {
text-decoration: underline;
}
/* END of Action table */
/* Table behaviour */
tr[href] {
cursor: pointer;
}
tr[href].active {
background-color: #eee;
color: black;
}
table.alternating {
tr[href].active:nth-child(even), tr[href].active:nth-child(odd) {
background-color: #E5E5E5;
color: black;
}
tr[href]:nth-child(even) {
background-color: #FDFDFD;
}
tr[href]:nth-child(odd) {
background-color: #f5f5f5;
}
tr[href]:hover {
color: black;
background-color: #DDDDDD;
}
}
/* End of table behaviour */
/* HOVER colors */
tr[href]:hover {
color: black;
background-color: #DDDDDD;
}
/* END of HOVER colors */
/* TODO: get rid of most if not all styles below this line */
div.content.users {
table.user-list {
th.user-remove {
@ -198,19 +210,6 @@ div.content.users {
}
}
div.controls div.user-header {
.user-name {
display: inline-block;
margin: 0 0 0.3em;
font-size: 2em;
}
.user-state, .user-created, .user-modified {
margin: 0 0 0.2em;
font-size: 0.8em;
}
}
div.content.memberships {
table.membership-list {
th.membership-cancel {

View File

@ -1,964 +0,0 @@
/*! Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
/* Special tables and states */
table.colors {
font-size: 0.8em;
width: 98%;
margin: 0 1%;
}
table.colors td {
text-align: center;
vertical-align: middle;
width: 10%;
height: 1.6em;
font-weight: normal;
border: 0.079em solid white;
}
/* Action table */
table.action {
font-size: 0.9em;
border-collapse: separate;
border-spacing: 1px;
width: 100%;
table-layout: fixed !important;
margin: 0;
color: @colorTextDefault;
}
table.action th {
text-align: left;
overflow: hidden;
}
table.action.wide td {
line-height: 2.5em;
}
table.action td {
padding: 0.3em 0.5em 0.3em 0.5em;
line-height: 1.5em;
overflow: hidden;
}
.dashboard table.action td {
line-height: 1.2em;
padding: 0.2 0.4em 0.2em 0.5em;
}
table.action td .pluginoutput {
font-size: 0.8em;
line-height: 1.2em;
padding: 0;
margin: 0;
}
table.action td a {
color: inherit;
text-decoration: none;
}
table.action td a:hover {
text-decoration: underline;
}
/* END of Action table */
/* Table behaviour */
tr[href] {
cursor: pointer;
}
/* End of table behaviour */
table.action td.state {
font-size: 0.7em;
text-align: center;
}
table.action td.timesince {
width: 3.5em;
}
/* State row behaviour */
tr.state img.icon {
margin-right: 2px;
}
tr.state a {
font-weight: bold;
}
tr.state a.active {
}
tr.state.new td.state {
font-weight: bold;
}
tr.state td.state strong {
font-size: 1.2em;
}
tr.state td.state {
width: 9em;
color: white;
border-bottom: none;
}
tr.state.handled td.state, tr.state.ok td.state, tr.state.up td.state, tr.state.pending td.state {
border-left-style: solid;
border-left-width: 1.5em;
padding-left: 0em;
padding-right: 0.5em;
color: black;
background-color: transparent;
}
tr[href].active {
background-color: #eee;
color: black;
}
tr.state.ok td.state, tr.state.up td.state {
border-left-color: @colorOk;
}
tr.state.warning td.state {
background-color: @colorWarning;
}
tr.state.warning.handled td.state {
border-left-color: @colorWarningHandled;
}
tr.state.critical td.state, tr.state.down td.state {
background-color: @colorCritical;
}
tr.state.critical.handled td.state, tr.state.down.handled td.state {
border-left-color: @colorCriticalHandled;
}
tr.state.unreachable td.state {
background-color: @colorUnreachable;
}
tr.state.unreachable.handled td.state {
border-left-color: @colorUnreachableHandled;
}
tr.state.unknown td.state {
background-color: @colorUnknown;
}
tr.state.unknown.handled td.state {
border-left-color: @colorUnknownHandled;
}
tr.state.pending td.state {
border-left-color: @colorPending;
}
tr.state.invalid td.state {
background-color: @colorInvalid;
}
tr.state.unreachable td.state {
background-color: @colorUnreachable;
}
tr.state.unreachable.handled td.state {
border-left-color: @colorUnreachableHandled;
}
tr.state.handled td.state {
color: inherit;
background-color: transparent !important;
}
/* HOVER colors */
tr[href]:hover {
color: black;
background-color: #eee;
}
tr.state[href]:hover td.state {
background-color: #eee;
}
tr.state.ok[href]:hover, tr.state.up[href]:hover {
background-color: @colorOk;
}
tr.state.handled[href]:hover, tr.state.handled[href]:hover td.state {
color: #121212 !important;
}
tr.state.warning[href]:hover {
background-color: @colorWarning;
}
tr.state.warning.handled[href]:hover {
background-color: @colorWarningHandled;
}
tr.state.critical[href]:hover, tr.state.down[href]:hover {
background-color: @colorCritical;
}
tr.state.critical.handled[href]:hover, tr.state.down.handled[href]:hover {
background-color: @colorCriticalHandled;
color: #333;
}
tr.state.unknown[href]:hover {
background-color: @colorUnknown;
}
tr.state.unknown.handled[href]:hover {
background-color: @colorUnknownHandled;
}
tr.state.pending[href]:hover {
background-color: @colorPending;
}
tr.state.invalid[href]:hover {
background-color: @colorInvalid;
}
tr.state.unreachable[href]:hover {
background-color: @colorUnreachable;
}
tr.state.unreachable.handled[href]:hover {
background-color: @colorUnreachableHandled;
}
tr.state[href]:hover td.state {
background-color: inherit !important;
}
/* END of HOVER colors */
/* END of special tables and states */
/* Generic colors */
a.critical {
color: @colorCritical;
}
/* END of Generic colors */
/* Generic box element */
.boxview a {
text-decoration: none;
}
.boxview > div.box {
text-align: center;
vertical-align: top;
display: inline-block;
padding: 0.4em;
margin: 0.4em;
border: 1px solid #d9d9d9;
background: #eee;
}
/* Box caption */
.boxview div.box h2 {
margin-top: 0;
margin-bottom: 0.6em;
font-size: 0.8em;
color: @colorTextDefault;
}
.boxview div.box h2:first-child {
margin-top: 0.2em;
padding-bottom: 0.5em;
font-size: inherit;
color: @colorTextDefault;
border-bottom: 1px solid #d9d9d9;
}
.boxview div.box h2 > a {
color: inherit;
margin-bottom: 0.2em;
}
.boxview div.box h2 > a:hover {
text-decoration: underline;
}
.boxview div.box h2:first-child > a:hover {
}
.boxview div.box h3 {
line-height: 1.5em;
font-size: 0.9em;
color: #555;
border-bottom: 1px solid #d9d9d9;
}
/* Box body of contents */
.boxview div.box.contents {
padding: 0.2em;
}
.boxview div.box.contents table {
width: 100%;
}
.boxview div.box.contents td {
width: 13em;
vertical-align: top;
}
/* Box separator */
.boxview div.box-separator:first-child {
border-top-width: 0;
}
.boxview div.box-separator {
font-size: 0.8em;
padding: 0.4em 0 0.4em;
border: 1px solid #d9d9d9;
font-weight: bold;
letter-spacing: 0.1em;
}
/* Box entry */
.boxview div.box.entry {
min-height: 2.7em;
margin: 0.2em;
font-size: 0.9em;
white-space: nowrap;
color: @colorTextDefault;
}
/* Any line of a box entry */
.boxview div.box.entry a {
display: block;
color: inherit;
}
.boxview div.box.entry a:hover {
color: @colorTextDefault;
}
/* First line of a box entry */
.boxview div.box.entry a:first-child {
font-size: 1em;
}
/* End of generic box element */
/* Monitoring box element styles */
/* Host- and Servicegroup element styles */
div.box.entry.state_up, div.box.entry.state_ok {
border: 1px solid @colorOk;
border-left: 1em solid @colorOk;
}
div.box.entry.state_pending {
border: 1px solid @colorPending;
border-left: 1em solid @colorPending;
}
div.box.entry.state_down, div.box.entry.state_critical {
border: 1px solid @colorCritical;
border-left: 1em solid @colorCritical;
background-color: @colorCritical;
color: white;
}
div.box.entry.state_down a:hover, div.box.entry.state_critical a:hover {
color: #dcdcdc;
}
div.box.entry.state_warning {
border: 1px solid @colorWarning;
border-left: 1em solid @colorWarning;
background-color: @colorWarning;
color: white;
}
div.box.entry.state_warning a:hover {
color: #dcdcdc;
}
div.box.entry.state_unreachable, div.box.entry.state_unknown {
border: 1px solid @colorUnknown;
border-left: 1em solid @colorUnknown;
background-color: @colorUnknown;
color: white;
}
div.box.entry.state_unreachable a:hover, div.box.entry.state_unknown a:hover {
color: #dcdcdc;
}
div.box.entry.handled {
background-color: transparent;
color: inherit;
}
div.box.entry.handled a:hover {
color: @colorTextDefault;
}
/* Tactical overview element styles */
.tactical > .boxview > div.box {
min-height: 20em;
min-width: 12.1em;
}
.tactical div.box.contents {
min-height: 14.5em;
}
div.box.contents.zero {
min-width: 11.1em;
background-color: transparent;
}
div.box.contents.zero span {
font-weight: bold;
line-height: 2em;
color: #666;
}
div.box.contents.zero h3 {
margin: 0;
font-size: 12em;
line-height: 1em;
color: #666;
}
div.box.ok_hosts.state_up {
border: 5px solid @colorOk;
}
div.box.ok_hosts.state_pending {
background-color: @colorPending;
}
div.box.problem_hosts.state_down {
border: 5px solid @colorCritical;
}
div.box.problem_hosts.state_down.handled {
background-color: @colorCriticalHandled;
}
div.box.problem_hosts.state_unreachable {
background-color: @colorUnreachable;
}
div.box.problem_hosts.state_unreachable.handled {
background-color: @colorUnreachableHandled;
}
div.box.ok_hosts div.box.entry, div.box.problem_hosts div.box.entry {
min-width: 11.1em;
}
div.box.monitoringfeatures div.box.contents {
padding: 0 2 0em;
}
div.box.monitoringfeatures {
border: 5px solid #d9d9d9;
}
div.box.monitoringfeatures div.box-separator {
color: white;
background-color: @colorOk;
}
div.box.monitoringfeatures div.feature-highlight {
background-color: @colorCritical;
}
div.box.monitoringfeatures a.feature-highlight {
font-weight: bold;
}
div.box.hostservicechecks {
border: 5px solid #d9d9d9;
}
/* Contactgroup element styles */
div.box.contactgroup {
width: 18em;
padding: 0.8em;
}
div.box.contactgroup div.box.contents {
padding: 0.6em;
}
div.box.contactgroup div.box.entry {
overflow: hidden;
clear: left;
}
div.box.contactgroup div.box.entry img {
width: 80px;
height: 80px;
float: left;
}
div.box.contactgroup div.box.entry a {
margin-top: 0.4em;
font-weight: bold;
}
div.box.contactgroup div.box.entry p {
margin: 0.4em 0 0;
}
div.circular {
margin-top: 0.5em;
margin-left: 2em;
margin-right: 1em;
width: 80px;
height: 80px;
float: left;
background-size: 100% 100%;
}
/* End of monitoring box element styles */
/* Monitoring pivot table styles */
div.pivot-pagination {
margin: 1em;
table {
table-layout: fixed;
border-spacing: 1px;
border-collapse: separate;
border: 1px solid LightGrey;
border-radius: 0.3em;
td {
width: 16px;
height: 16px;
padding: 0;
background-color: #fbfbfb;
&:hover, &.active {
background-color: #e5e5e5;
}
a {
width: 16px;
height: 16px;
display: block;
}
}
}
}
table.joystick-pagination {
margin-top: -1.5em;
td {
width: 1.25em;
height: 1.3em;
}
}
table.pivot {
a {
text-decoration: none;
color: black;
&:hover {
color: @colorTextDefault;
}
}
& > thead {
th {
height: 6em;
div {
margin-right: -1.5em;
padding-left: 1.3em;
span {
width: 1.5em;
margin-right: 0.25em;
margin-top: 4em;
line-height: 2em;
white-space: nowrap;
display: block;
float: left;
transform: rotate(-45deg);
transform-origin: bottom left;
-o-transform: rotate(-45deg);
-o-transform-origin: bottom left;
-ms-transform: rotate(-45deg);
-ms-transform-origin: bottom left;
-moz-transform: rotate(-45deg);
-moz-transform-origin: bottom left;
-webkit-transform: rotate(-45deg);
-webkit-transform-origin: bottom left;
//filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
abbr {
border: 0; // Remove highlighting in firefox
font-size: 0.8em;
}
}
}
}
}
& > tbody {
th {
padding: 0 14px 0 0;
white-space: nowrap;
a {
font-size: 0.8em;
}
}
td {
padding: 2px;
min-width: 1.5em;
line-height: 1.5em;
text-align: center;
a {
width: 1.5em;
height: 1.5em;
display: block;
border-radius: 0.5em;
&.state_ok {
background-color: @colorOk;
}
&.state_pending {
background-color: @colorPending;
}
&.state_warning {
background-color: @colorWarning;
&.handled {
background-color: @colorWarningHandled;
}
}
&.state_critical {
background-color: @colorCritical;
&.handled {
background-color: @colorCriticalHandled;
}
}
&.state_unknown {
background-color: @colorUnknown;
&.handled {
background-color: @colorUnknownHandled;
}
}
}
}
}
}
/* End of monitoring pivot table styles */
/* Monitoring timeline styles */
div.timeline-legend {
float: left;
padding: 0.5em;
border: 1px solid #d9d9d9;
background-color: #eee;
h2 {
margin: 0;
margin-left: 0.5em;
line-height: 1.1em;
}
& > span {
display: inline-block;
padding: 0.5em;
margin: 0.5em;
span {
color: white;
font-size: 0.8em;
font-weight: bold;
white-space: nowrap;
}
}
}
div.timeline {
div.timeframe {
height: 7em;
margin-bottom: 1em;
clear: left;
span {
width: 8em;
margin-top: 2.3em;
margin-right: 1.5em;
display: block;
float: left;
text-align: center;
a {
color: @colorTextDefault;
font-size: 0.8em;
font-weight: bold;
text-decoration: none;
white-space: nowrap;
&:hover {
color: @colorTextDefault;
text-decoration: underline;
}
}
}
div.circle-box {
// width: inline-style;
height: 100%;
margin-right: 0.5em;
position: relative;
float: left;
div.outer-circle {
// width: inline-style;
// height: inline-style;
position: absolute;
top: 50%;
// margin-top: inline-style;
&.extrapolated {
border-width: 2px;
border-style: dotted;
//border-color: inline-style;
border-radius: 100%;
// background-color: inline-style;
}
a.inner-circle {
// width: inline-style;
// height: inline-style;
display: block;
position: absolute;
top: 50%;
left: 50%;
// margin-top: inline-style;
// margin-left: inline-style;
border-radius: 100%;
// background-color: inline-style;
}
}
}
}
hr {
border: 0;
height: 1px;
background-image: linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.3), rgba(0,0,0,0));
background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.3), rgba(0,0,0,0));
background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.3), rgba(0,0,0,0));
background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.3), rgba(0,0,0,0));
background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.3), rgba(0,0,0,0));
}
}
/* End of monitoring timeline styles */
/* Monitoring groupsummary styles */
.dashboard table.groupview {
margin-top: 0;
}
table.groupview {
width: 100%;
margin-top: 1em;
border-collapse: separate;
border-spacing: 0.1em;
th {
font-size: 0.9em;
text-align: left;
white-space: nowrap;
}
td {
&.groupname {
width: 60%;
a {
color: inherit;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
&.total {
width: 10%;
}
&.state {
width: 20%;
white-space: nowrap;
&.change {
width: 10%;
text-align: center;
border-left-width: 1.5em;
border-left-style: solid;
padding: 0.3em 0.5em 0.3em 0.5em;
strong {
font-size: 0.8em;
}
span.timesince {
font-size: 0.8em;
}
&.ok {
border-color: @colorOk;
}
&.pending {
border-color: @colorPending;
}
&.warning {
border-color: @colorWarningHandled;
&.unhandled {
color: white;
border-left-width: 0;
background-color: @colorWarning;
}
}
&.unknown {
border-color: @colorUnknownHandled;
&.unhandled {
color: white;
border-left-width: 0;
background-color: @colorUnknown;
}
}
&.critical {
border-color: @colorCriticalHandled;
&.unhandled {
color: white;
border-left-width: 0;
background-color: @colorCritical;
}
}
}
span.state {
&.handled {
margin-right: 2px;
}
a {
font-size: 0.9em;
color: white;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
}
}
}
/* End of monitoring groupsummary styles */
/* compact table */
table.statesummary {
text-align: left;
width: auto;
border-collapse: separate;
tr.state td.state {
width: auto;
font-weight: bold;
}
td {
font-size: 0.9em;
line-height: 1.2em;
padding-left: 0.2em;
margin: 0;
}
td.state {
padding: 0.2em;
min-width: 75px;
font-size: 0.75em;
text-align: center;
}
td.name {
font-weight: bold;
}
td a {
color: inherit;
text-decoration: none;
}
}

View File

@ -42,10 +42,15 @@
// Set first links href in a action table tr as row href:
$('table.action tr', el).each(function(idx, el) {
var $a = $('a[href]', el).first();
var $a = $('a[href].rowaction', el).first();
if ($a.length) {
// TODO: Find out whether we leak memory on IE with this:
$(el).attr('href', $a.attr('href'));
return;
}
$a = $('a[href]', el).first();
if ($a.length) {
$(el).attr('href', $a.attr('href'));
}
});