Merge branch 'master' into feature/custom-notification-command-8644
This commit is contained in:
commit
cb28f00c4d
|
@ -23,7 +23,7 @@ class ConfigController extends ActionController
|
|||
/**
|
||||
* The first allowed config action according to the user's permissions
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $firstAllowedAction;
|
||||
|
||||
|
@ -72,7 +72,6 @@ class ConfigController extends ActionController
|
|||
$allowedActions[] = 'roles';
|
||||
}
|
||||
$this->firstAllowedAction = array_shift($allowedActions);
|
||||
$this->getTabs()->setTitle($this->translate('Config Navigation'));
|
||||
}
|
||||
|
||||
public function devtoolsAction()
|
||||
|
|
|
@ -51,7 +51,6 @@ class RolesController extends ActionController
|
|||
'label' => $this->translate('Roles'),
|
||||
'url' => 'roles'
|
||||
));
|
||||
$this->getTabs()->setTitle($this->translate('Role Configuration'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,6 +7,7 @@ use Exception;
|
|||
use Icinga\Web\Form;
|
||||
use Icinga\Data\ConfigObject;
|
||||
use Icinga\Data\ResourceFactory;
|
||||
use Icinga\Protocol\Ldap\Connection;
|
||||
|
||||
/**
|
||||
* Form class for adding/modifying ldap resources
|
||||
|
@ -57,6 +58,40 @@ class LdapResourceForm extends Form
|
|||
'value' => 389
|
||||
)
|
||||
);
|
||||
$this->addElement(
|
||||
'select',
|
||||
'connection',
|
||||
array(
|
||||
'required' => true,
|
||||
'autosubmit' => true,
|
||||
'label' => $this->translate('Connection'),
|
||||
'description' => $this->translate(
|
||||
'The type of connection to use. Unencrypted (Plaintext) or encrypted (SSL, TLS).'
|
||||
),
|
||||
'multiOptions' => array(
|
||||
'plaintext' => $this->translate('Plaintext'),
|
||||
Connection::SSL => 'Secure Sockets Layer (SSL)',
|
||||
Connection::STARTTLS => 'Transport Layer Security (TLS)'
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
if (isset($formData['connection']) && $formData['connection'] !== 'plaintext') {
|
||||
// TODO(jom): Do not show this checkbox unless the connection is actually failing due to certificate errors
|
||||
$this->addElement(
|
||||
'checkbox',
|
||||
'reqcert',
|
||||
array(
|
||||
'required' => true,
|
||||
'label' => $this->translate('Require Certificate'),
|
||||
'description' => $this->translate(
|
||||
'When checked, the LDAP server must provide a valid and known (trusted) certificate.'
|
||||
),
|
||||
'value' => 1
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$this->addElement(
|
||||
'text',
|
||||
'root_dn',
|
||||
|
@ -119,12 +154,15 @@ class LdapResourceForm extends Form
|
|||
$form->getElement('bind_pw')->getValue()
|
||||
)
|
||||
) {
|
||||
throw new Exception();
|
||||
throw new Exception(); // TODO: Get the exact error message
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$form->addError(
|
||||
$form->translate('Connectivity validation failed, connection to the given resource not possible.')
|
||||
);
|
||||
$msg = $form->translate('Connectivity validation failed, connection to the given resource not possible.');
|
||||
if (($error = $e->getMessage())) {
|
||||
$msg .= ' (' . $error . ')';
|
||||
}
|
||||
|
||||
$form->addError($msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ class RoleForm extends ConfigForm
|
|||
/**
|
||||
* Provided permissions by currently loaded modules
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $providedPermissions = array(
|
||||
'*' => '*',
|
||||
|
@ -33,7 +33,7 @@ class RoleForm extends ConfigForm
|
|||
/**
|
||||
* Provided restrictions by currently loaded modules
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $providedRestrictions = array();
|
||||
|
||||
|
@ -46,11 +46,11 @@ class RoleForm extends ConfigForm
|
|||
$helper = new Zend_Form_Element('bogus');
|
||||
foreach (Icinga::app()->getModuleManager()->getLoadedModules() as $module) {
|
||||
foreach ($module->getProvidedPermissions() as $permission) {
|
||||
/** @type object $permission */
|
||||
/** @var object $permission */
|
||||
$this->providedPermissions[$permission->name] = $permission->name . ': ' . $permission->description;
|
||||
}
|
||||
foreach ($module->getProvidedRestrictions() as $restriction) {
|
||||
/** @type object $restriction */
|
||||
/** @var object $restriction */
|
||||
$name = $helper->filterName($restriction->name); // Zend only permits alphanumerics, the underscore,
|
||||
// the circumflex and any ASCII character in range
|
||||
// \x7f to \xff (127 to 255)
|
||||
|
|
|
@ -2,20 +2,9 @@
|
|||
<?= $tabs; ?>
|
||||
</div>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1" id="authentication-configuration">
|
||||
<?= $this->translate('Authentication Configuration'); ?>
|
||||
</h1>
|
||||
<h2 tabindex="-1" id="authentication-new-backend" class="sr-only">
|
||||
<?= t('New Authentication Backend'); ?>
|
||||
</h2>
|
||||
<p>
|
||||
<a href="<?= $this->href('/config/createAuthenticationBackend'); ?>">
|
||||
<?= $this->icon('plus'); ?><?= $this->translate('Create A New Authentication Backend'); ?>
|
||||
</a>
|
||||
</p>
|
||||
<h2 tabindex="-1" id="authentication-reorder" class="sr-only">
|
||||
<?= t('Reorder Authentication Backends'); ?>
|
||||
</h2>
|
||||
<a href="<?= $this->href('/config/createAuthenticationBackend'); ?>">
|
||||
<?= $this->icon('plus'); ?><?= $this->translate('Create A New Authentication Backend'); ?>
|
||||
</a>
|
||||
<div id="authentication-reorder-form">
|
||||
<?= $form; ?>
|
||||
</div>
|
||||
|
|
|
@ -11,9 +11,6 @@
|
|||
$permissions = $module->getProvidedPermissions();
|
||||
$state = $moduleData->enabled ? ($moduleData->loaded ? 'enabled' : 'failed') : 'disabled'
|
||||
?>
|
||||
<h1 tabindex="-1">
|
||||
<?= $this->escape($module->getTitle()) ?>
|
||||
</h1>
|
||||
<table class="avp">
|
||||
<tr>
|
||||
<th><?= $this->escape($this->translate('Name')) ?></th>
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
</div>
|
||||
|
||||
<div class="content">
|
||||
<h1 tabindex="-1"><?= $this->translate('Installed Modules') ?></h1>
|
||||
<table class="action" data-base-target="_next">
|
||||
<tbody>
|
||||
<?php foreach ($modules as $module): ?>
|
||||
|
|
|
@ -2,20 +2,9 @@
|
|||
<?= $tabs; ?>
|
||||
</div>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1" id="resource-index">
|
||||
<?= t('Resource Configuration'); ?>
|
||||
</h1>
|
||||
<h2 tabindex="-1" id="resource-new-resource" class="sr-only">
|
||||
<?= t('Create New Resource'); ?>
|
||||
</h2>
|
||||
<p>
|
||||
<a href="<?= $this->href('/config/createresource'); ?>">
|
||||
<?= $this->icon('plus'); ?> <?= $this->translate('Create A New Resource'); ?>
|
||||
</a>
|
||||
</p>
|
||||
<h2 tabindex="-1" id="resource-edit-resource" class="sr-only">
|
||||
<?= t('Edit Existing Resources'); ?>
|
||||
</h2>
|
||||
<a href="<?= $this->href('/config/createresource'); ?>">
|
||||
<?= $this->icon('plus'); ?> <?= $this->translate('Create A New Resource'); ?>
|
||||
</a>
|
||||
<table class="action" id="resource-edit-table">
|
||||
<thead>
|
||||
<th><?= $this->translate('Resource'); ?></th>
|
||||
|
|
|
@ -2,9 +2,6 @@
|
|||
<?= $tabs ?>
|
||||
</div>
|
||||
<div class="content">
|
||||
<h1 tabindex="-1" id="roles-index">
|
||||
<?= $this->translate('Roles') ?>
|
||||
</h1>
|
||||
<div>
|
||||
<?php /** @var \Icinga\Application\Config $roles */ if ($roles->isEmpty()): ?>
|
||||
<?= $this->translate('No roles found.') ?>
|
||||
|
@ -70,9 +67,6 @@
|
|||
</tbody>
|
||||
</table>
|
||||
<?php endif ?>
|
||||
<h2 tabindex="-1" id="roles-index-new" class="sr-only">
|
||||
<?= $this->translate('Create New Role'); ?>
|
||||
</h2>
|
||||
<a data-base-target="_next" href="<?= $this->href('roles/new') ?>">
|
||||
<?= $this->translate('Create a New Role') ?>
|
||||
</a>
|
||||
|
|
|
@ -115,7 +115,7 @@ abstract class ApplicationBootstrap
|
|||
/**
|
||||
* Whether Icinga Web 2 requires setup
|
||||
*
|
||||
* @type bool
|
||||
* @var bool
|
||||
*/
|
||||
protected $requiresSetup = false;
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ abstract class Command
|
|||
protected $docs;
|
||||
|
||||
/**
|
||||
* @type Params
|
||||
* @var Params
|
||||
*/
|
||||
protected $params;
|
||||
protected $screen;
|
||||
|
|
|
@ -14,14 +14,14 @@ class SimpleTree implements IteratorAggregate
|
|||
/**
|
||||
* Root node
|
||||
*
|
||||
* @type TreeNode
|
||||
* @var TreeNode
|
||||
*/
|
||||
protected $sentinel;
|
||||
|
||||
/**
|
||||
* Nodes
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $nodes = array();
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ class TreeNode implements Identifiable
|
|||
/**
|
||||
* The node's ID
|
||||
*
|
||||
* @type mixed
|
||||
* @var mixed
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
|
@ -24,7 +24,7 @@ class TreeNode implements Identifiable
|
|||
/**
|
||||
* The node's children
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $children = array();
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ class TreeNodeIterator implements RecursiveIterator
|
|||
/**
|
||||
* The node's children
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $children;
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ class FileExtensionFilterIterator extends FilterIterator
|
|||
/**
|
||||
* The extension to filter for
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $extension;
|
||||
|
||||
|
@ -58,7 +58,7 @@ class FileExtensionFilterIterator extends FilterIterator
|
|||
public function accept()
|
||||
{
|
||||
$current = $this->current();
|
||||
/** @type $current \SplFileInfo */
|
||||
/** @var $current \SplFileInfo */
|
||||
if (! $current->isFile()) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ class NonEmptyFileIterator extends FilterIterator
|
|||
public function accept()
|
||||
{
|
||||
$current = $this->current();
|
||||
/** @type $current \SplFileInfo */
|
||||
/** @var $current \SplFileInfo */
|
||||
if (! $current->isFile()
|
||||
|| $current->getSize() === 0
|
||||
) {
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
namespace Icinga\Protocol\Ldap;
|
||||
|
||||
use Exception;
|
||||
use Icinga\Exception\ProgrammingError;
|
||||
use Icinga\Protocol\Ldap\Exception as LdapException;
|
||||
use Icinga\Application\Platform;
|
||||
|
@ -35,6 +34,8 @@ class Connection
|
|||
const LDAP_SIZELIMIT_EXCEEDED = 4;
|
||||
const LDAP_ADMINLIMIT_EXCEEDED = 11;
|
||||
const PAGE_SIZE = 1000;
|
||||
const STARTTLS = 'tls';
|
||||
const SSL = 'ssl';
|
||||
|
||||
protected $ds;
|
||||
protected $hostname;
|
||||
|
@ -43,6 +44,8 @@ class Connection
|
|||
protected $bind_pw;
|
||||
protected $root_dn;
|
||||
protected $count;
|
||||
protected $connectionType;
|
||||
protected $reqCert = true;
|
||||
|
||||
/**
|
||||
* Whether the bind on this connection was already performed
|
||||
|
@ -66,8 +69,6 @@ class Connection
|
|||
/**
|
||||
* Constructor
|
||||
*
|
||||
* TODO: Allow to pass port and SSL options
|
||||
*
|
||||
* @param ConfigObject $config
|
||||
*/
|
||||
public function __construct(ConfigObject $config)
|
||||
|
@ -77,6 +78,8 @@ class Connection
|
|||
$this->bind_pw = $config->bind_pw;
|
||||
$this->root_dn = $config->root_dn;
|
||||
$this->port = $config->get('port', $this->port);
|
||||
$this->connectionType = $config->get('connection');
|
||||
$this->reqCert = (bool) $config->get('reqcert', $this->reqCert);
|
||||
}
|
||||
|
||||
public function getHostname()
|
||||
|
@ -470,59 +473,53 @@ class Connection
|
|||
*/
|
||||
protected function prepareNewConnection()
|
||||
{
|
||||
$use_tls = false;
|
||||
$force_tls = false;
|
||||
|
||||
if ($use_tls) {
|
||||
if ($this->connectionType === static::STARTTLS || $this->connectionType === static::SSL) {
|
||||
$this->prepareTlsEnvironment();
|
||||
}
|
||||
|
||||
$ds = ldap_connect($this->hostname, $this->port);
|
||||
$hostname = $this->hostname;
|
||||
if ($this->connectionType === static::SSL) {
|
||||
$hostname = 'ldaps://' . $hostname;
|
||||
}
|
||||
|
||||
$ds = ldap_connect($hostname, $this->port);
|
||||
try {
|
||||
$this->capabilities = $this->discoverCapabilities($ds);
|
||||
$this->discoverySuccess = true;
|
||||
|
||||
} catch (LdapException $e) {
|
||||
|
||||
// create empty default capabilities
|
||||
Logger::debug($e);
|
||||
Logger::warning('LADP discovery failed, assuming default LDAP settings.');
|
||||
$this->capabilities = new Capability();
|
||||
$this->capabilities = new Capability(); // create empty default capabilities
|
||||
}
|
||||
|
||||
if ($use_tls) {
|
||||
if ($this->connectionType === static::STARTTLS) {
|
||||
$force_tls = false;
|
||||
if ($this->capabilities->hasStartTLS()) {
|
||||
if (@ldap_start_tls($ds)) {
|
||||
Logger::debug('LDAP STARTTLS succeeded');
|
||||
} else {
|
||||
Logger::debug('LDAP STARTTLS failed: %s', ldap_error($ds));
|
||||
throw new LdapException(
|
||||
'LDAP STARTTLS failed: %s',
|
||||
ldap_error($ds)
|
||||
);
|
||||
Logger::error('LDAP STARTTLS failed: %s', ldap_error($ds));
|
||||
throw new LdapException('LDAP STARTTLS failed: %s', ldap_error($ds));
|
||||
}
|
||||
} elseif ($force_tls) {
|
||||
throw new LdapException(
|
||||
'TLS is required but not announced by %s',
|
||||
$this->hostname
|
||||
);
|
||||
throw new LdapException('STARTTLS is required but not announced by %s', $this->hostname);
|
||||
} else {
|
||||
Logger::warning('LDAP TLS enabled but not announced');
|
||||
Logger::warning('LDAP STARTTLS enabled but not announced');
|
||||
}
|
||||
}
|
||||
|
||||
// ldap_rename requires LDAPv3:
|
||||
if ($this->capabilities->hasLdapV3()) {
|
||||
if (! ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
|
||||
throw new LdapException('LDAPv3 is required');
|
||||
}
|
||||
} else {
|
||||
|
||||
// TODO: remove this -> FORCING v3 for now
|
||||
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
Logger::warning('No LDAPv3 support detected');
|
||||
}
|
||||
|
||||
// Not setting this results in "Operations error" on AD when using the
|
||||
// whole domain as search base:
|
||||
// Not setting this results in "Operations error" on AD when using the whole domain as search base
|
||||
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
|
||||
// ldap_set_option($ds, LDAP_OPT_DEREF, LDAP_DEREF_NEVER);
|
||||
return $ds;
|
||||
|
@ -530,17 +527,16 @@ class Connection
|
|||
|
||||
protected function prepareTlsEnvironment()
|
||||
{
|
||||
$strict_tls = true;
|
||||
// TODO: allow variable known CA location (system VS Icinga)
|
||||
if (Platform::isWindows()) {
|
||||
// putenv('LDAP...')
|
||||
putenv('LDAPTLS_REQCERT=never');
|
||||
} else {
|
||||
if ($strict_tls) {
|
||||
if ($this->reqCert) {
|
||||
$ldap_conf = $this->getConfigDir('ldap_ca.conf');
|
||||
} else {
|
||||
$ldap_conf = $this->getConfigDir('ldap_nocert.conf');
|
||||
}
|
||||
putenv('LDAPRC=' . $ldap_conf);
|
||||
putenv('LDAPRC=' . $ldap_conf); // TODO: Does not have any effect
|
||||
if (getenv('LDAPRC') !== $ldap_conf) {
|
||||
throw new LdapException('putenv failed');
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ class ActionController extends Zend_Controller_Action
|
|||
/**
|
||||
* Authentication manager
|
||||
*
|
||||
* @type Manager|null
|
||||
* @var Manager|null
|
||||
*/
|
||||
private $auth;
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ class DomNodeIterator implements RecursiveIterator
|
|||
/**
|
||||
* The node's children
|
||||
*
|
||||
* @type IteratorIterator
|
||||
* @var IteratorIterator
|
||||
*/
|
||||
protected $children;
|
||||
|
||||
|
|
|
@ -145,7 +145,7 @@ class Form extends Zend_Form
|
|||
/**
|
||||
* Authentication manager
|
||||
*
|
||||
* @type Manager|null
|
||||
* @var Manager|null
|
||||
*/
|
||||
private $auth;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ class Menu implements RecursiveIterator
|
|||
/**
|
||||
* The id of this menu
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
|
@ -27,7 +27,7 @@ class Menu implements RecursiveIterator
|
|||
*
|
||||
* Used for sorting when priority is unset or equal to other items
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
|
@ -36,42 +36,42 @@ class Menu implements RecursiveIterator
|
|||
*
|
||||
* Used for sorting
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
protected $priority = 100;
|
||||
|
||||
/**
|
||||
* The url of this menu
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $url;
|
||||
|
||||
/**
|
||||
* The path to the icon of this menu
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $icon;
|
||||
|
||||
/**
|
||||
* The sub menus of this menu
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $subMenus = array();
|
||||
|
||||
/**
|
||||
* A custom item renderer used instead of the default rendering logic
|
||||
*
|
||||
* @type MenuItemRenderer
|
||||
* @var MenuItemRenderer
|
||||
*/
|
||||
protected $itemRenderer = null;
|
||||
|
||||
/*
|
||||
* Parent menu
|
||||
*
|
||||
* @type Menu
|
||||
* @var Menu
|
||||
*/
|
||||
protected $parent;
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ class View extends Zend_View_Abstract
|
|||
/**
|
||||
* Authentication manager
|
||||
*
|
||||
* @type \Icinga\Authentication\Manager|null
|
||||
* @var \Icinga\Authentication\Manager|null
|
||||
*/
|
||||
private $auth;
|
||||
|
||||
|
|
|
@ -678,28 +678,20 @@ class FilterEditor extends AbstractWidget
|
|||
public function render()
|
||||
{
|
||||
if (! $this->preservedUrl()->getParam('modifyFilter')) {
|
||||
$filterEditor = $this->renderSearch() . $this->shorten($this->filter, 50);
|
||||
} else {
|
||||
$filterEditor = $this->renderSearch()
|
||||
. '<form action="'
|
||||
. Url::fromRequest()
|
||||
. '" class="filterEditor" method="POST">'
|
||||
. '<ul class="tree widgetFilter"><li>'
|
||||
. $this->renderFilter($this->filter)
|
||||
. '</li></ul>'
|
||||
. '<div style="float: right">'
|
||||
. '<input type="submit" name="submit" value="Apply" />'
|
||||
. '<input type="submit" name="cancel" value="Cancel" />'
|
||||
. '</div>'
|
||||
. '</form>';
|
||||
return $this->renderSearch() . $this->shorten($this->filter, 50);
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'<div class="filter-editor dontprint">'
|
||||
. '<h2 tabindex="-1" class="sr-only">%s</h2>%s</div>',
|
||||
t('Filters'),
|
||||
$filterEditor
|
||||
);
|
||||
return $this->renderSearch()
|
||||
. '<form action="'
|
||||
. Url::fromRequest()
|
||||
. '" class="filterEditor" method="POST">'
|
||||
. '<ul class="tree widgetFilter"><li>'
|
||||
. $this->renderFilter($this->filter)
|
||||
. '</li></ul>'
|
||||
. '<div style="float: right">'
|
||||
. '<input type="submit" name="submit" value="Apply" />'
|
||||
. '<input type="submit" name="cancel" value="Cancel" />'
|
||||
. '</div>'
|
||||
. '</form>';
|
||||
}
|
||||
|
||||
protected function shorten($string, $length)
|
||||
|
|
|
@ -133,13 +133,6 @@ class SortBox extends AbstractWidget
|
|||
if ($this->request) {
|
||||
$form->populate($this->request->getParams());
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'<div class="sort-box dontprint">'
|
||||
. '<h2 tabindex="-1" class="sr-only">%s</h2>%s%s</div>',
|
||||
t('Sort Criteria'),
|
||||
t('Sort by'),
|
||||
(string) $form
|
||||
);
|
||||
return $form;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ class Tabs extends AbstractWidget implements Countable
|
|||
* @var string
|
||||
*/
|
||||
private $baseTpl = <<< 'EOT'
|
||||
{HEADER}
|
||||
<ul class="tabs">
|
||||
{TABS}
|
||||
{DROPDOWN}
|
||||
|
@ -29,13 +28,6 @@ class Tabs extends AbstractWidget implements Countable
|
|||
</ul>
|
||||
EOT;
|
||||
|
||||
/**
|
||||
* Template used for the header
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
private $headerTpl = '<h2 class="sr-only">{TITLE}</h2>';
|
||||
|
||||
/**
|
||||
* Template used for the tabs dropdown
|
||||
*
|
||||
|
@ -109,13 +101,6 @@ EOT;
|
|||
*/
|
||||
private $closeTab = true;
|
||||
|
||||
/**
|
||||
* Title of the tab navigation
|
||||
*
|
||||
* @type string
|
||||
*/
|
||||
private $title;
|
||||
|
||||
/**
|
||||
* Set whether the current tab is closable
|
||||
*/
|
||||
|
@ -381,15 +366,13 @@ EOT;
|
|||
'{TABS}',
|
||||
'{DROPDOWN}',
|
||||
'{REFRESH}',
|
||||
'{CLOSE}',
|
||||
'{HEADER}'
|
||||
'{CLOSE}'
|
||||
),
|
||||
array(
|
||||
$tabs,
|
||||
$drop,
|
||||
$close,
|
||||
$refresh,
|
||||
$this->renderHeader()
|
||||
$refresh
|
||||
),
|
||||
$this->baseTpl
|
||||
);
|
||||
|
@ -451,30 +434,4 @@ EOT;
|
|||
$tabextension->apply($this);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the title of the tab navigation
|
||||
*
|
||||
* @param string $title
|
||||
* @return self
|
||||
*/
|
||||
public function setTitle($title)
|
||||
{
|
||||
$this->title = $title;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the title into the header template
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function renderHeader()
|
||||
{
|
||||
if (! $this->title) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return str_replace('{TITLE}', $this->title, $this->headerTpl);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<div class="controls">
|
||||
<?= /** @type \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton() ?>
|
||||
<?= /** @var \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton() ?>
|
||||
</div>
|
||||
<div class="content">
|
||||
<?= /** @type \Icinga\Module\Doc\Renderer\DocSectionRenderer $section */ $section ?>
|
||||
<?= /** @var \Icinga\Module\Doc\Renderer\DocSectionRenderer $section */ $section ?>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="controls"></div>
|
||||
<?= /** @type \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton(); ?>
|
||||
<?= /** @var \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton(); ?>
|
||||
<h1><?= $this->translate('Available documentations'); ?></h1>
|
||||
<div class="content">
|
||||
<ul>
|
||||
|
@ -16,4 +16,4 @@
|
|||
array('title' => $this->translate('List all modifications for which documentation is available'))
|
||||
); ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="controls">
|
||||
<?= /** @type \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton(); ?>
|
||||
<?= /** @var \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton(); ?>
|
||||
<h1><?= $this->translate('Module documentations'); ?></h1>
|
||||
</div>
|
||||
<div class="content">
|
||||
|
@ -16,4 +16,4 @@
|
|||
); ?></li>
|
||||
<?php endforeach ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="content">
|
||||
<h1><?= /** @type string $title */ $title ?></h1>
|
||||
<?= /** @type \Icinga\Module\Doc\Renderer\DocTocRenderer $toc */ $toc ?>
|
||||
<?= /** @type \Icinga\Module\Doc\Renderer\DocSectionRenderer $section */ $section ?>
|
||||
<h1><?= /** @var string $title */ $title ?></h1>
|
||||
<?= /** @var \Icinga\Module\Doc\Renderer\DocTocRenderer $toc */ $toc ?>
|
||||
<?= /** @var \Icinga\Module\Doc\Renderer\DocSectionRenderer $section */ $section ?>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<div class="content">
|
||||
<?php foreach (/** @type \Icinga\Module\Doc\Renderer\DocSearchRenderer[] $searches */ $searches as $title => $search): ?>
|
||||
<?php foreach (/** @var \Icinga\Module\Doc\Renderer\DocSearchRenderer[] $searches */ $searches as $title => $search): ?>
|
||||
<?php if (! $search->isEmpty()): ?>
|
||||
<h1><?= $this->escape($title) ?></h1>
|
||||
<?= $search ?>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<div class="controls">
|
||||
<?= /** @type \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton() ?>
|
||||
<h1><?= /** @type string $title */ $title ?></h1>
|
||||
<?= /** @var \Icinga\Web\Widget\Tabs $tabs */ $tabs->showOnlyCloseButton() ?>
|
||||
<h1><?= /** @var string $title */ $title ?></h1>
|
||||
</div>
|
||||
<div class="content">
|
||||
<?= /** @type \Icinga\Module\Doc\Renderer\DocTocRenderer $toc */ $toc ?>
|
||||
<?= /** @var \Icinga\Module\Doc\Renderer\DocTocRenderer $toc */ $toc ?>
|
||||
</div>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
|
||||
|
||||
/** @type $this \Icinga\Application\Modules\Module */
|
||||
/** @var $this \Icinga\Application\Modules\Module */
|
||||
|
||||
$section = $this->menuSection($this->translate('Documentation'), array(
|
||||
'title' => 'Documentation',
|
||||
|
|
|
@ -19,7 +19,7 @@ class DocIterator implements Countable, IteratorAggregate
|
|||
/**
|
||||
* Ordered files
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $fileInfo;
|
||||
|
||||
|
|
|
@ -18,14 +18,14 @@ class DocParser
|
|||
/**
|
||||
* Path to the documentation
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
/**
|
||||
* Iterator over documentation files
|
||||
*
|
||||
* @type DocIterator
|
||||
* @var DocIterator
|
||||
*/
|
||||
protected $docIterator;
|
||||
|
||||
|
@ -130,7 +130,7 @@ class DocParser
|
|||
$tree = new SimpleTree();
|
||||
$stack = new SplStack();
|
||||
foreach ($this->docIterator as $fileInfo) {
|
||||
/** @type $fileInfo \SplFileInfo */
|
||||
/** @var $fileInfo \SplFileInfo */
|
||||
$file = $fileInfo->openFile();
|
||||
$lastLine = null;
|
||||
foreach ($file as $line) {
|
||||
|
@ -143,7 +143,7 @@ class DocParser
|
|||
if ($id === null) {
|
||||
$path = array();
|
||||
foreach ($stack as $section) {
|
||||
/** @type $section DocSection */
|
||||
/** @var $section DocSection */
|
||||
$path[] = $section->getTitle();
|
||||
}
|
||||
$path[] = $title;
|
||||
|
|
|
@ -13,35 +13,35 @@ class DocSection extends TreeNode
|
|||
/**
|
||||
* Chapter the section belongs to
|
||||
*
|
||||
* @type DocSection
|
||||
* @var DocSection
|
||||
*/
|
||||
protected $chapter;
|
||||
|
||||
/**
|
||||
* Content of the section
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $content = array();
|
||||
|
||||
/**
|
||||
* Header level
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
protected $level;
|
||||
|
||||
/**
|
||||
* Whether to instruct search engines to not index the link to the section
|
||||
*
|
||||
* @type bool
|
||||
* @var bool
|
||||
*/
|
||||
protected $noFollow;
|
||||
|
||||
/**
|
||||
* Title of the section
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $title;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ class DocSectionFilterIterator extends RecursiveFilterIterator implements Counta
|
|||
/**
|
||||
* Chapter to filter for
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $chapter;
|
||||
|
||||
|
@ -44,7 +44,7 @@ class DocSectionFilterIterator extends RecursiveFilterIterator implements Counta
|
|||
public function accept()
|
||||
{
|
||||
$section = $this->current();
|
||||
/** @type \Icinga\Module\Doc\DocSection $section */
|
||||
/** @var \Icinga\Module\Doc\DocSection $section */
|
||||
if ($section->getChapter()->getId() === $this->chapter) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -16,21 +16,21 @@ abstract class DocRenderer extends RecursiveIteratorIterator
|
|||
/**
|
||||
* URL to replace links with
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $url;
|
||||
|
||||
/**
|
||||
* Additional URL parameters
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $urlParams = array();
|
||||
|
||||
/**
|
||||
* View
|
||||
*
|
||||
* @type View|null
|
||||
* @var View|null
|
||||
*/
|
||||
protected $view;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ class DocSearchRenderer extends DocRenderer
|
|||
/**
|
||||
* The content to render
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $content = array();
|
||||
|
||||
|
@ -105,7 +105,7 @@ class DocSearchRenderer extends DocRenderer
|
|||
$path,
|
||||
array('highlight-search' => $this->getInnerIterator()->getSearch()->getInput())
|
||||
);
|
||||
/** @type \Icinga\Web\Url $url */
|
||||
/** @var \Icinga\Web\Url $url */
|
||||
$url->setAnchor($this->encodeAnchor($section->getId()));
|
||||
$urlAttributes = array(
|
||||
'data-base-target' => '_next',
|
||||
|
|
|
@ -26,28 +26,28 @@ class DocSectionRenderer extends DocRenderer
|
|||
/**
|
||||
* Content to render
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $content = array();
|
||||
|
||||
/**
|
||||
* Search criteria to highlight
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $highlightSearch;
|
||||
|
||||
/**
|
||||
* Parsedown instance
|
||||
*
|
||||
* @type Parsedown
|
||||
* @var Parsedown
|
||||
*/
|
||||
protected $parsedown;
|
||||
|
||||
/**
|
||||
* Documentation tree
|
||||
*
|
||||
* @type SimpleTree
|
||||
* @var SimpleTree
|
||||
*/
|
||||
protected $tree;
|
||||
|
||||
|
@ -169,7 +169,7 @@ class DocSectionRenderer extends DocRenderer
|
|||
$doc->loadHTML($match[0]);
|
||||
$xpath = new DOMXPath($doc);
|
||||
$blockquote = $xpath->query('//blockquote[1]')->item(0);
|
||||
/** @type \DOMElement $blockquote */
|
||||
/** @var \DOMElement $blockquote */
|
||||
if (strtolower(substr(trim($blockquote->nodeValue), 0, 5)) === 'note:') {
|
||||
$blockquote->setAttribute('class', 'note');
|
||||
}
|
||||
|
@ -189,7 +189,7 @@ class DocSectionRenderer extends DocRenderer
|
|||
$doc->loadHTML($match[0]);
|
||||
$xpath = new DOMXPath($doc);
|
||||
$img = $xpath->query('//img[1]')->item(0);
|
||||
/** @type \DOMElement $img */
|
||||
/** @var \DOMElement $img */
|
||||
$img->setAttribute('src', Url::fromPath($img->getAttribute('src'))->getAbsoluteUrl());
|
||||
return substr_replace($doc->saveXML($img), '', -2, 1); // Replace '/>' with '>'
|
||||
}
|
||||
|
@ -206,7 +206,7 @@ class DocSectionRenderer extends DocRenderer
|
|||
if (($section = $this->tree->getNode($this->decodeAnchor($match['fragment']))) === null) {
|
||||
return $match[0];
|
||||
}
|
||||
/** @type \Icinga\Module\Doc\DocSection $section */
|
||||
/** @var \Icinga\Module\Doc\DocSection $section */
|
||||
$path = $this->getView()->getHelper('Url')->url(
|
||||
array_merge(
|
||||
$this->urlParams,
|
||||
|
@ -219,7 +219,7 @@ class DocSectionRenderer extends DocRenderer
|
|||
false
|
||||
);
|
||||
$url = $this->getView()->url($path);
|
||||
/** @type \Icinga\Web\Url $url */
|
||||
/** @var \Icinga\Web\Url $url */
|
||||
$url->setAnchor($this->encodeAnchor($section->getId()));
|
||||
return sprintf(
|
||||
'<a %s%shref="%s"',
|
||||
|
|
|
@ -19,7 +19,7 @@ class DocTocRenderer extends DocRenderer
|
|||
/**
|
||||
* Content to render
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $content = array();
|
||||
|
||||
|
@ -85,7 +85,7 @@ class DocTocRenderer extends DocRenderer
|
|||
false
|
||||
);
|
||||
$url = $view->url($path);
|
||||
/** @type \Icinga\Web\Url $url */
|
||||
/** @var \Icinga\Web\Url $url */
|
||||
$url->setAnchor($this->encodeAnchor($section->getId()));
|
||||
$urlAttributes = array(
|
||||
'data-base-target' => '_next',
|
||||
|
|
|
@ -11,14 +11,14 @@ class DocSearch
|
|||
/**
|
||||
* Search string
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $input;
|
||||
|
||||
/**
|
||||
* Search criteria
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $search;
|
||||
|
||||
|
|
|
@ -19,14 +19,14 @@ class DocSearchIterator extends RecursiveFilterIterator
|
|||
/**
|
||||
* Search criteria
|
||||
*
|
||||
* @type DocSearch
|
||||
* @var DocSearch
|
||||
*/
|
||||
protected $search;
|
||||
|
||||
/**
|
||||
* Current search matches
|
||||
*
|
||||
* @type DocSearchMatch[]|null
|
||||
* @var DocSearchMatch[]|null
|
||||
*/
|
||||
protected $matches;
|
||||
|
||||
|
@ -51,7 +51,7 @@ class DocSearchIterator extends RecursiveFilterIterator
|
|||
public function accept()
|
||||
{
|
||||
$section = $this->current();
|
||||
/** @type $section \Icinga\Module\Doc\DocSection */
|
||||
/** @var $section \Icinga\Module\Doc\DocSection */
|
||||
$matches = array();
|
||||
if (($match = $this->search->search($section->getTitle())) !== null) {
|
||||
$matches[] = $match->setMatchType(DocSearchMatch::MATCH_HEADER);
|
||||
|
|
|
@ -15,56 +15,56 @@ class DocSearchMatch
|
|||
/**
|
||||
* CSS class for highlighting matches
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
const HIGHLIGHT_CSS_CLASS = 'search-highlight';
|
||||
|
||||
/**
|
||||
* Header match
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
const MATCH_HEADER = 1;
|
||||
|
||||
/**
|
||||
* Content match
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
const MATCH_CONTENT = 2;
|
||||
|
||||
/**
|
||||
* Line
|
||||
*
|
||||
* @type string
|
||||
* @var string
|
||||
*/
|
||||
protected $line;
|
||||
|
||||
/**
|
||||
* Line number
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
protected $lineno;
|
||||
|
||||
/**
|
||||
* Type of the match
|
||||
*
|
||||
* @type int
|
||||
* @var int
|
||||
*/
|
||||
protected $matchType;
|
||||
|
||||
/**
|
||||
* Matches
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $matches = array();
|
||||
|
||||
/**
|
||||
* View
|
||||
*
|
||||
* @type View|null
|
||||
* @var View|null
|
||||
*/
|
||||
protected $view;
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ class Monitoring_AlertsummaryController extends Controller
|
|||
'label' => $this->translate('Alert Summary'),
|
||||
'url' => Url::fromRequest()
|
||||
)
|
||||
)->activate('alertsummary')->setTitle($this->translate('Alertsummary Navigation'));
|
||||
)->activate('alertsummary');
|
||||
$this->view->title = $this->translate('Alert Summary');
|
||||
|
||||
$this->view->intervalBox = $this->createIntervalBox();
|
||||
|
|
|
@ -727,7 +727,6 @@ class Monitoring_ListController extends Controller
|
|||
private function createTabs()
|
||||
{
|
||||
$tabs = $this->getTabs();
|
||||
$tabs->setTitle($this->translate('Monitoring Navigation'));
|
||||
if (in_array($this->_request->getActionName(), array(
|
||||
'hosts',
|
||||
'services',
|
||||
|
|
|
@ -29,7 +29,7 @@ class Monitoring_ProcessController extends Controller
|
|||
'label' => $this->translate('Monitoring Health'),
|
||||
'url' =>'monitoring/process/info'
|
||||
)
|
||||
)->setTitle($this->translate('Process Information'));
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,7 @@ class BackendConfigForm extends ConfigForm
|
|||
/**
|
||||
* The available monitoring backend resources split by type
|
||||
*
|
||||
* @type array
|
||||
* @var array
|
||||
*/
|
||||
protected $resources;
|
||||
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<div style="margin: 1em;" class="dontprint">
|
||||
<h2 tabindex="-1" class="sr-only">
|
||||
<?= $this->translate('Filters'); ?>
|
||||
</h2>
|
||||
<?= $intervalBox; ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter') ?>
|
||||
|
@ -11,33 +8,25 @@
|
|||
</div>
|
||||
|
||||
<div class="content alertsummary">
|
||||
<h1 tabindex="-1">
|
||||
<?= $this->translate('Alert summary'); ?>
|
||||
</h1>
|
||||
<!-- <h1><?= $this->translate('Alert summary'); ?></h1> -->
|
||||
|
||||
<div class="hbox">
|
||||
<div class="hbox-item">
|
||||
<h2 tabindex="-1" id="alertsummary-notifications">
|
||||
<?= $this->translate('Notifications and Problems'); ?>
|
||||
</h2>
|
||||
<h2><?= $this->translate('Notifications and Problems'); ?></h2>
|
||||
<div style="width: 400px; height: 400px;">
|
||||
<?= $defectChart->render(); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hbox-item">
|
||||
<h2 tabindex="-1" id="alertsummary-reaction-time">
|
||||
<?= $this->translate('Time to Reaction (Ack, Recover)'); ?>
|
||||
</h2>
|
||||
<h2><?= $this->translate('Time to Reaction (Ack, Recover)'); ?></h2>
|
||||
<div style="width: 400px; height: 400px;">
|
||||
<?= $healingChart->render(); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 tabindex="-1" id="alertsummary-trend">
|
||||
<?= $this->translate('Trend'); ?>
|
||||
</h2>
|
||||
<h2><?= $this->translate('Trend'); ?></h2>
|
||||
|
||||
<div class="alertsummary-flex-container">
|
||||
<div class="alertsummary-flex">
|
||||
|
@ -64,9 +53,7 @@
|
|||
</div>
|
||||
|
||||
<?php if ($this->recentAlerts): ?>
|
||||
<h2 tabindex="-1" id="alertsummary-top5">
|
||||
<?= $this->translate('Top 5 Recent Alerts'); ?>
|
||||
</h2>
|
||||
<h1><?= $this->translate('Top 5 Recent Alerts'); ?></h1>
|
||||
|
||||
<div class="alertsummary-flex-container">
|
||||
<div class="alertsummary-flex">
|
||||
|
@ -79,9 +66,7 @@
|
|||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<h2 tabindex="-1" id="alertsummary-history">
|
||||
<?= $this->translate('History'); ?>
|
||||
</h2>
|
||||
<h1><?= $this->translate('History'); ?></h1>
|
||||
<div class="alertsummary-flex-container">
|
||||
<div class="alertsummary-flex">
|
||||
<?= $this->partial('list/notifications.phtml', array(
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
<?= $this->render('partials/host/servicesummary.phtml') ?>
|
||||
</div>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1"><?= $this->translate('Host Detail Information') ?></h1>
|
||||
<?= $this->render('show/components/output.phtml') ?>
|
||||
<?= $this->render('show/components/grapher.phtml') ?>
|
||||
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
<?php if (false === $this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl ?>
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $comments->count())); ?>
|
||||
<?= $this->paginationControl($comments, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<?= $this->tabs->render($this); ?>
|
||||
<div style="margin: 1em" class="dontprint">
|
||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $comments->count())); ?>
|
||||
<?= $this->paginationControl($comments, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<div class="content">
|
||||
<h1 tabindex="-1"><?= $this->translate('Comments') ?></h1>
|
||||
<?php if (count($comments) === 0): ?>
|
||||
<?= $this->translate('No comments matching the filter'); ?>
|
||||
</div>
|
||||
|
|
|
@ -4,9 +4,6 @@
|
|||
</div>
|
||||
<?php endif ?>
|
||||
<div class="content">
|
||||
<h1 tabindex="-1">
|
||||
<?= $this->translate('Contact Groups'); ?>
|
||||
</h1>
|
||||
<div class="boxview" data-base-target="_next">
|
||||
|
||||
<?php
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
<?php if (false === $this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl ?>
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $contacts->count())); ?>
|
||||
<?= $this->paginationControl($contacts, null, null, array('preserve' => $this->preserve)); ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<div style="margin: 1em">
|
||||
<?= $this->sortControl->render($this); ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<?= $this->paginationControl($contacts, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
|
||||
<div data-base-target="_next" class="content contacts">
|
||||
<h1 tabindex="-1"><?= $this->translate('Contacts') ?></h1>
|
||||
<?php
|
||||
if (count($contacts) === 0) {
|
||||
echo $this->translate('No contacts matching the filter');
|
||||
|
|
|
@ -4,17 +4,23 @@ use Icinga\Module\Monitoring\Object\Host;
|
|||
use Icinga\Module\Monitoring\Object\Service;
|
||||
|
||||
?>
|
||||
|
||||
<?php if (false === $this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl ?>
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $downtimes->count())); ?>
|
||||
<?= $this->paginationControl($downtimes, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<?= $this->tabs->render($this); ?>
|
||||
<div style="margin: 1em" class="dontprint">
|
||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
||||
<?php if (! $this->filterEditor): ?>
|
||||
<?= $this->filterPreview ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $downtimes->count())); ?>
|
||||
<?= $this->paginationControl($downtimes, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<div class="content">
|
||||
<?= $this->filterEditor ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Downtimes'); ?></h1>
|
||||
<?php if (count($downtimes) === 0): ?>
|
||||
<?= $this->translate('No active downtimes'); ?>
|
||||
</div>
|
||||
|
|
|
@ -2,21 +2,18 @@
|
|||
use Icinga\Data\Filter\Filter;
|
||||
use Icinga\Web\Widget\Chart\HistoryColorGrid;
|
||||
?>
|
||||
<?php if (! $compact): ?>
|
||||
|
||||
|
||||
<? if (! $compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs->render($this); ?>
|
||||
<div class="fake-controls">
|
||||
<h2 tabindex="-1" class="sr-only">
|
||||
<?= $this->translate('Filters'); ?>
|
||||
</h2>
|
||||
<?= $form ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1"><?= $this->translate('Event Grid'); ?></h1>
|
||||
<?php else: ?>
|
||||
<div class="content" data-base-target="_next">
|
||||
<?php endif; ?>
|
||||
<? endif; ?>
|
||||
|
||||
<div class="content" data-base-target="_next">
|
||||
<?php
|
||||
|
||||
$settings = array(
|
||||
|
|
|
@ -4,21 +4,24 @@ use Icinga\Module\Monitoring\Object\Host;
|
|||
use Icinga\Module\Monitoring\Object\Service;
|
||||
|
||||
?>
|
||||
|
||||
<?php if (false === $this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl ?>
|
||||
<div style="margin: 1em" class="dontprint">
|
||||
<div style="float: right">
|
||||
<?= $this->translate('Sort by') ?> <?= $this->sortControl ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?>
|
||||
<?= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
|
||||
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<div class="content">
|
||||
<?= $this->filterEditor ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Event History') ?></h1>
|
||||
<?php else: ?>
|
||||
<div class="content">
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
<?= $this->filterEditor ?>
|
||||
<?php if (empty($history)): ?>
|
||||
<?= $this->translate('No history events matching the filter') ?>
|
||||
</div>
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
<?php else: ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl->render($this); ?>
|
||||
<div style="margin: 1em;" class="dontprint">
|
||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter')->setMaxLimit(count($hostgroups)); ?>
|
||||
<?= $this->paginationControl($hostgroups, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<div class="content">
|
||||
<?= $this->filterEditor; ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Host Groups') ?></h1>
|
||||
<?php endif ?>
|
||||
<?php
|
||||
if (count($hostgroups) === 0) {
|
||||
|
|
|
@ -9,8 +9,9 @@ if ($this->compact): ?>
|
|||
<div style="margin: 1em;" class="dontprint">
|
||||
<?= $this->render('list/components/selectioninfo.phtml') ?>
|
||||
<?= $this->render('list/components/hostssummary.phtml') ?>
|
||||
<?= $this->translate('Sort by') ?> <?= $this->sortControl->render($this) ?>
|
||||
</div>
|
||||
<?= $this->sortControl->render($this) ?>
|
||||
|
||||
<?= $this->widget('limiter')->setMaxLimit($this->hosts->count()) ?>
|
||||
<?= $this->paginationControl($hosts, null, null, array('preserve' => $this->preserve)) ?>
|
||||
<?= $this->selectionToolbar('multi', $this->href('monitoring/hosts/show?' . $this->filter->toQueryString())) ?>
|
||||
|
@ -18,7 +19,6 @@ if ($this->compact): ?>
|
|||
|
||||
<div class="content">
|
||||
<?= $this->filterEditor ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Hosts') ?></h1>
|
||||
<?php
|
||||
|
||||
endif;
|
||||
|
@ -31,6 +31,7 @@ if ($hosts->count() === 0) {
|
|||
return;
|
||||
}
|
||||
?>
|
||||
|
||||
<table
|
||||
data-base-target="_next"
|
||||
class="action multiselect"
|
||||
|
|
|
@ -4,18 +4,19 @@ use Icinga\Module\Monitoring\Object\Host;
|
|||
use Icinga\Module\Monitoring\Object\Service;
|
||||
|
||||
?>
|
||||
|
||||
<?php if (! $this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl->render($this) ?>
|
||||
<div class="dontprint" style="margin: 1em;">
|
||||
<?= $this->translate('Sort by') ?> <?= $this->sortControl->render($this) ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter') ?>
|
||||
<?= $this->paginationControl($notifications, null, null, array('preserve' => $this->preserve)) ?>
|
||||
</div>
|
||||
<div class="content">
|
||||
<h1 tabindex="-1"><?= $this->translate('Notifications'); ?></h1>
|
||||
<?php else: ?>
|
||||
<div class="content">
|
||||
<?php endif ?>
|
||||
|
||||
<div class="content">
|
||||
<?php if (count($notifications) === 0): ?>
|
||||
<?= $this->translate('No notifications matching the filter') ?>
|
||||
<?php return; endif ?>
|
||||
|
|
|
@ -6,11 +6,12 @@ use Icinga\Module\Monitoring\Object\Service;
|
|||
<?php if (!$this->compact): ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs; ?>
|
||||
<?= $this->sortControl; ?>
|
||||
<div style="margin: 1em;" class="dontprint">
|
||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1"><?= $this->translate('Service Grid') ?></h1>
|
||||
<table class="pivot servicestates">
|
||||
<?php
|
||||
$hasHeader = false;
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
<?php else: ?>
|
||||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<?= $this->sortControl->render($this); ?>
|
||||
<div style="margin: 1em;" class="dontprint">
|
||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
||||
</div>
|
||||
<?= $this->widget('limiter')->setMaxLimit(count($servicegroups)); ?>
|
||||
<?= $this->paginationControl($servicegroups, null, null, array('preserve' => $this->preserve)); ?>
|
||||
</div>
|
||||
<div class="content">
|
||||
<?= $this->filterEditor; ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Service Groups') ?></h1>
|
||||
<?php endif ?>
|
||||
<?php
|
||||
if (count($servicegroups) === 0) {
|
||||
|
|
|
@ -10,8 +10,10 @@ if (!$this->compact): ?>
|
|||
<div style="margin: 1em;" class="dontprint">
|
||||
<?= $this->render('list/components/selectioninfo.phtml') ?>
|
||||
<?= $this->render('list/components/servicesummary.phtml') ?>
|
||||
<div style="float: right">
|
||||
<?= $this->translate('Sort by') ?> <?= $this->sortControl ?>
|
||||
</div>
|
||||
</div>
|
||||
<?= $this->sortControl ?>
|
||||
<?php if ($this->limit === 0): ?>
|
||||
<?= $this->widget('limiter') ?>
|
||||
<?php else: ?>
|
||||
|
@ -22,7 +24,6 @@ if (!$this->compact): ?>
|
|||
|
||||
<div class="content">
|
||||
<?= $this->filterEditor ?>
|
||||
<h1 tabindex="-1"><?= $this->translate('Services') ?></h1>
|
||||
<?php else: ?>
|
||||
|
||||
<div class="content">
|
||||
|
|
|
@ -3,9 +3,7 @@
|
|||
<?php endif ?>
|
||||
<?php if (($hostCount = count($objects)) > 0): ?>
|
||||
<div class="hbox-item">
|
||||
<h1 tabindex="-1">
|
||||
<?= sprintf($this->translatePlural('Host (%u)', 'Hosts (%u)', $hostCount), $hostCount); ?>
|
||||
</h1>
|
||||
<strong><?= sprintf($this->translatePlural('Host (%u)', 'Hosts (%u)', $hostCount), $hostCount); ?></strong>
|
||||
</div>
|
||||
<div class="hbox-item">
|
||||
<?= $hostStatesPieChart; ?>
|
||||
|
|
|
@ -4,9 +4,7 @@
|
|||
<?php if (($serviceCount = count($objects)) > 0): ?>
|
||||
<div class="hbox">
|
||||
<div class="hbox-item" style="width: 6em;">
|
||||
<h1 tabindex="-1">
|
||||
<?= sprintf($this->translatePlural('Service (%u)', 'Services (%u)', $serviceCount), $serviceCount); ?>
|
||||
</h1>
|
||||
<strong><?= sprintf($this->translatePlural('Service (%u)', 'Services (%u)', $serviceCount), $serviceCount); ?></strong>
|
||||
</div>
|
||||
<div class="hbox-item">
|
||||
<?= $serviceStatesPieChart; ?>
|
||||
|
|
|
@ -9,10 +9,6 @@ $cp = $this->checkPerformance()->create($this->checkperformance);
|
|||
</div>
|
||||
|
||||
<div class="content processinfo">
|
||||
<h1 tabindex="-1">
|
||||
<?= $this->translate('Monitoring Health'); ?>
|
||||
</h1>
|
||||
|
||||
<div class="boxview">
|
||||
|
||||
<div class="box left">
|
||||
|
@ -20,9 +16,7 @@ $cp = $this->checkPerformance()->create($this->checkperformance);
|
|||
</div>
|
||||
|
||||
<div class="box left">
|
||||
<h2 tabindex="-1" id="process-process-info">
|
||||
<?= $this->translate('Process Info') ?>
|
||||
</h2>
|
||||
<h2><?= $this->translate('Process Info') ?></h2>
|
||||
<table class="avp">
|
||||
<tbody>
|
||||
<tr>
|
||||
|
@ -73,13 +67,9 @@ $cp = $this->checkPerformance()->create($this->checkperformance);
|
|||
</div>
|
||||
|
||||
<div class="box left">
|
||||
<h2 tabindex="-1" id="process-performance-info">
|
||||
<?= $this->translate('Performance Info') ?>
|
||||
</h2>
|
||||
<h2><?= $this->translate('Performance Info') ?></h2>
|
||||
|
||||
<h3 tabindex="-1" id="process-object-summaries">
|
||||
<?= $this->translate('Object summaries') ?>
|
||||
</h3>
|
||||
<h3><?= $this->translate('Object summaries') ?></h3>
|
||||
<table class="avp">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -127,9 +117,7 @@ $cp = $this->checkPerformance()->create($this->checkperformance);
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 tabindex="-1" id="process-active-checks">
|
||||
<?= $this->translate('Active checks') ?>
|
||||
</h3>
|
||||
<h3><?= $this->translate('Active checks') ?></h3>
|
||||
<table class="avp">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -159,9 +147,7 @@ $cp = $this->checkPerformance()->create($this->checkperformance);
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 tabindex="-1" id="process-passive-checks">
|
||||
<?= $this->translate('Passive checks') ?>
|
||||
</h3>
|
||||
<h3><?= $this->translate('Passive checks') ?></h3>
|
||||
<table class="avp">
|
||||
<tbody>
|
||||
<tr>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
/** @type \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
|
||||
if ($object->getType() === $object::TYPE_HOST) {
|
||||
$isService = false;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<th><?= $this->translate('Comments'); ?></th>
|
||||
<td>
|
||||
<?php if ($this->hasPermission('monitoring/command/comment/add')) {
|
||||
/** @type \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
if ($object->getType() === $object::TYPE_HOST) {
|
||||
echo $this->qlink(
|
||||
$this->translate('Add comment'),
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<th><?= $this->translate('Downtimes'); ?></th>
|
||||
<td>
|
||||
<?php if ($this->hasPermission('monitoring/command/downtime/schedule')) {
|
||||
/** @type \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */
|
||||
if ($object->getType() === $object::TYPE_HOST) {
|
||||
echo $this->qlink(
|
||||
$this->translate('Schedule downtime'),
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
</div>
|
||||
<?php endif ?>
|
||||
<div class="content tactical">
|
||||
<h1 tabindex="-1"><?= $this->translate('Tactical Overview') ?></h1>
|
||||
<div class="boxview" data-base-target="_next">
|
||||
<?php if ($this->statusSummary->hosts_down || $this->statusSummary->hosts_unreachable): ?>
|
||||
<?= $this->render('tactical/components/problem_hosts.phtml'); ?>
|
||||
|
|
|
@ -10,9 +10,6 @@ $firstRow = !$beingExtended;
|
|||
<div class="controls">
|
||||
<?= $this->tabs ?>
|
||||
<div style="margin: 1em;" class="dontprint">
|
||||
<h2 tabindex="-1" class="sr-only">
|
||||
<?= $this->translate('Filters') ?>
|
||||
</h2>
|
||||
<?= $intervalBox; ?>
|
||||
</div>
|
||||
<div style="margin: 1em;" class="timeline-legend">
|
||||
|
@ -25,7 +22,6 @@ $firstRow = !$beingExtended;
|
|||
</div>
|
||||
</div>
|
||||
<div class="content" data-base-target="_next">
|
||||
<h1 tabindex="-1"><?= $this->translate('Timeline'); ?></h1>
|
||||
<div class="timeline">
|
||||
<?php endif ?>
|
||||
<?php if ($switchedContext): ?>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
|
||||
|
||||
/** @type $this \Icinga\Application\Modules\Module */
|
||||
/** @var $this \Icinga\Application\Modules\Module */
|
||||
|
||||
$this->providePermission(
|
||||
'monitoring/command/*',
|
||||
|
|
|
@ -120,7 +120,7 @@ abstract class MonitoredObject implements Filterable
|
|||
/**
|
||||
* Filter
|
||||
*
|
||||
* @type Filter
|
||||
* @var Filter
|
||||
*/
|
||||
protected $filter;
|
||||
|
||||
|
|
|
@ -212,8 +212,3 @@ hr.command-separator {
|
|||
border: none;
|
||||
border-bottom: 2px solid @colorPetrol;
|
||||
}
|
||||
|
||||
.sort-box {
|
||||
float: right;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
|
|
@ -93,7 +93,7 @@ class WebWizard extends Wizard implements SetupWizard
|
|||
$this->addPage(new PreferencesPage());
|
||||
$this->addPage(new DbResourcePage());
|
||||
$this->addPage(new LdapDiscoveryPage());
|
||||
$this->addPage(new LdapDiscoveryConfirmPage());
|
||||
//$this->addPage(new LdapDiscoveryConfirmPage());
|
||||
$this->addPage(new LdapResourcePage());
|
||||
$this->addPage(new AuthBackendPage());
|
||||
$this->addPage(new AdminAccountPage());
|
||||
|
@ -132,13 +132,13 @@ class WebWizard extends Wizard implements SetupWizard
|
|||
} elseif ($authData['type'] === 'ldap') {
|
||||
$page->setResourceConfig($this->getPageData('setup_ldap_resource'));
|
||||
|
||||
$suggestions = $this->getPageData('setup_ldap_discovery_confirm');
|
||||
$suggestions = $this->getPageData('setup_ldap_discovery');
|
||||
if (isset($suggestions['backend'])) {
|
||||
$page->populate($suggestions['backend']);
|
||||
}
|
||||
}
|
||||
} elseif ($page->getName() === 'setup_ldap_discovery_confirm') {
|
||||
$page->setResourceConfig($this->getPageData('setup_ldap_discovery'));
|
||||
/*} elseif ($page->getName() === 'setup_ldap_discovery_confirm') {
|
||||
$page->setResourceConfig($this->getPageData('setup_ldap_discovery'));*/
|
||||
} elseif ($page->getName() === 'setup_admin_account') {
|
||||
$page->setBackendConfig($this->getPageData('setup_authentication_backend'));
|
||||
$authData = $this->getPageData('setup_authentication_type');
|
||||
|
@ -169,7 +169,7 @@ class WebWizard extends Wizard implements SetupWizard
|
|||
);
|
||||
}
|
||||
|
||||
$suggestion = $this->getPageData('setup_ldap_discovery_confirm');
|
||||
$suggestion = $this->getPageData('setup_ldap_discovery');
|
||||
if (isset($suggestion['resource'])) {
|
||||
$page->populate($suggestion['resource']);
|
||||
}
|
||||
|
@ -199,8 +199,8 @@ class WebWizard extends Wizard implements SetupWizard
|
|||
} elseif ($newPage->getname() === 'setup_ldap_discovery') {
|
||||
$authData = $this->getPageData('setup_authentication_type');
|
||||
$skip = $authData['type'] !== 'ldap';
|
||||
} elseif ($newPage->getName() === 'setup_ldap_discovery_confirm') {
|
||||
$skip = false === $this->hasPageData('setup_ldap_discovery');
|
||||
/*} elseif ($newPage->getName() === 'setup_ldap_discovery_confirm') {
|
||||
$skip = false === $this->hasPageData('setup_ldap_discovery');*/
|
||||
} elseif ($newPage->getName() === 'setup_ldap_resource') {
|
||||
$authData = $this->getPageData('setup_authentication_type');
|
||||
$skip = $authData['type'] !== 'ldap';
|
||||
|
|
|
@ -270,7 +270,7 @@ a:focus {
|
|||
|
||||
/* Accessibility Skip Links */
|
||||
.skip-links {
|
||||
position: relative;
|
||||
position: absolute;
|
||||
opacity: 1;
|
||||
ul {
|
||||
list-style-type: none;
|
||||
|
@ -286,6 +286,7 @@ a:focus {
|
|||
left: -999em;
|
||||
box-sizing: content-box;
|
||||
width: 10.4em !important;
|
||||
top: 0em;
|
||||
text-align: left !important;
|
||||
padding: 0.8em;
|
||||
background-color: white;
|
||||
|
@ -299,9 +300,3 @@ a:focus {
|
|||
}
|
||||
}
|
||||
}
|
||||
.skip-links-inline {
|
||||
ul > li > a {
|
||||
width: 14em !important;
|
||||
top: -3em;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -356,32 +356,16 @@
|
|||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle anchor, i.e. focus the element which is referenced by the anchor
|
||||
*
|
||||
* @param {string} query jQuery selector
|
||||
*/
|
||||
handleAnchor: function(query) {
|
||||
var $element = $(query);
|
||||
if ($element.length > 0) {
|
||||
// TODO(mh): Some elements are missing to place the right focus
|
||||
// This is a fixed workarround until all header took place
|
||||
|
||||
var $item = $element.find(':header:first').nextUntil(':header:first').next();
|
||||
if ($item.length > 0) {
|
||||
$element = $item;
|
||||
}
|
||||
|
||||
/*
|
||||
var focusQueries = ['h1:first', ':header:first', ':input:first'];
|
||||
$.each(focusQueries, function(index,q) {
|
||||
var $item = $element.find(q);
|
||||
if ($item.length > 0) {
|
||||
$element = $item;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
// If we want to focus an element which has no tabindex
|
||||
// add one that we can focus is
|
||||
if ($element.prop('tabindex') < 0) {
|
||||
$element.prop('tabindex', '-1');
|
||||
if (typeof $element.attr('tabindex') === 'undefined') {
|
||||
$element.attr('tabindex', -1);
|
||||
}
|
||||
$element.focus();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue