Merge branch 'bugfix/dashboard-rework-7751'

resolves #7751
This commit is contained in:
Marius Hein 2014-11-20 13:24:44 +01:00
commit 8b9d86e409
19 changed files with 255 additions and 261 deletions

View File

@ -5,7 +5,7 @@
use Icinga\Application\Logger;
use Icinga\Exception\ProgrammingError;
use Icinga\Forms\ConfirmRemovalForm;
use Icinga\Forms\Dashboard\ComponentForm;
use Icinga\Forms\Dashboard\DashletForm;
use Icinga\Web\Form;
use Icinga\Web\Notification;
use Icinga\Web\Controller\ActionController;
@ -15,7 +15,7 @@ use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Widget\Tabextension\DashboardSettings;
/**
* Handle creation, removal and displaying of dashboards, panes and components
* Handle creation, removal and displaying of dashboards, panes and dashlets
*
* @see Icinga\Web\Widget\Dashboard for more information about dashboards
*/
@ -33,9 +33,9 @@ class DashboardController extends ActionController
$this->dashboard->load();
}
public function newComponentAction()
public function newDashletAction()
{
$form = new ComponentForm();
$form = new DashletForm();
$this->createTabs();
$dashboard = $this->dashboard;
$form->setDashboard($dashboard);
@ -53,9 +53,9 @@ class DashboardController extends ActionController
$pane->setUserWidget();
$dashboard->addPane($pane);
}
$component = new Dashboard\Component($form->getValue('component'), $form->getValue('url'), $pane);
$component->setUserWidget();
$pane->addComponent($component);
$dashlet = new Dashboard\Dashlet($form->getValue('dashlet'), $form->getValue('url'), $pane);
$dashlet->setUserWidget();
$pane->addDashlet($dashlet);
try {
$dashboard->write();
} catch (\Zend_Config_Exception $e) {
@ -64,7 +64,7 @@ class DashboardController extends ActionController
$action->render('error');
return false;
}
Notification::success(t('Component created'));
Notification::success(t('Dashlet created'));
return true;
});
$form->setRedirectUrl('dashboard');
@ -72,22 +72,22 @@ class DashboardController extends ActionController
$this->view->form = $form;
}
public function updateComponentAction()
public function updateDashletAction()
{
$this->createTabs();
$dashboard = $this->dashboard;
$form = new ComponentForm();
$form = new DashletForm();
$form->setDashboard($dashboard);
$form->setSubmitLabel(t('Update Component'));
$form->setSubmitLabel(t('Update Dashlet'));
if (! $this->_request->getParam('pane')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "pane"',
400
);
}
if (! $this->_request->getParam('component')) {
if (! $this->_request->getParam('dashlet')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "component"',
'Missing parameter "dashlet"',
400
);
}
@ -101,21 +101,21 @@ class DashboardController extends ActionController
$dashboard->addPane($pane);
}
try {
$component = $pane->getComponent($form->getValue('component'));
$component->setUrl($form->getValue('url'));
$dashlet = $pane->getDashlet($form->getValue('dashlet'));
$dashlet->setUrl($form->getValue('url'));
} catch (ProgrammingError $e) {
$component = new Dashboard\Component($form->getValue('component'), $form->getValue('url'), $pane);
$pane->addComponent($component);
$dashlet = new Dashboard\Dashlet($form->getValue('dashlet'), $form->getValue('url'), $pane);
$pane->addDashlet($dashlet);
}
$component->setUserWidget();
// Rename component
if ($form->getValue('org_component') && $form->getValue('org_component') !== $component->getTitle()) {
$pane->removeComponent($form->getValue('org_component'));
$dashlet->setUserWidget();
// Rename dashlet
if ($form->getValue('org_dashlet') && $form->getValue('org_dashlet') !== $dashlet->getTitle()) {
$pane->removeDashlet($form->getValue('org_dashlet'));
}
// Move
if ($form->getValue('org_pane') && $form->getValue('org_pane') !== $pane->getTitle()) {
$oldPane = $dashboard->getPane($form->getValue('org_pane'));
$oldPane->removeComponent($component->getTitle());
$oldPane->removeDashlet($dashlet->getTitle());
}
try {
$dashboard->write();
@ -125,19 +125,19 @@ class DashboardController extends ActionController
$action->render('error');
return false;
}
Notification::success(t('Component updated'));
Notification::success(t('Dashlet updated'));
return true;
});
$form->setRedirectUrl('dashboard/settings');
$form->handleRequest();
$pane = $dashboard->getPane($this->getParam('pane'));
$component = $pane->getComponent($this->getParam('component'));
$form->load($component);
$dashlet = $pane->getDashlet($this->getParam('dashlet'));
$form->load($dashlet);
$this->view->form = $form;
}
public function removeComponentAction()
public function removeDashletAction()
{
$form = new ConfirmRemovalForm();
$this->createTabs();
@ -148,21 +148,21 @@ class DashboardController extends ActionController
400
);
}
if (! $this->_request->getParam('component')) {
if (! $this->_request->getParam('dashlet')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "component"',
'Missing parameter "dashlet"',
400
);
}
$pane = $this->_request->getParam('pane');
$component = $this->_request->getParam('component');
$dashlet = $this->_request->getParam('dashlet');
$action = $this;
$form->setOnSuccess(function (Form $form) use ($dashboard, $component, $pane, $action) {
$form->setOnSuccess(function (Form $form) use ($dashboard, $dashlet, $pane, $action) {
try {
$pane = $dashboard->getPane($pane);
$pane->removeComponent($component);
$pane->removeDashlet($dashlet);
$dashboard->write();
Notification::success(t('Component has been removed from') . ' ' . $pane->getTitle());
Notification::success(t('Dashlet has been removed from') . ' ' . $pane->getTitle());
return true;
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
@ -178,7 +178,7 @@ class DashboardController extends ActionController
$form->setRedirectUrl('dashboard/settings');
$form->handleRequest();
$this->view->pane = $pane;
$this->view->component = $component;
$this->view->dashlet = $dashlet;
$this->view->form = $form;
}
@ -200,7 +200,7 @@ class DashboardController extends ActionController
$pane = $dashboard->getPane($pane);
$dashboard->removePane($pane->getTitle());
$dashboard->write();
Notification::success(t('Pane has been removed') . ': ' . $pane->getTitle());
Notification::success(t('Dashboard has been removed') . ': ' . $pane->getTitle());
return true;
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
@ -240,7 +240,7 @@ class DashboardController extends ActionController
} else {
$this->view->title = $this->dashboard->getActivePane()->getTitle() . ' :: Dashboard';
if ($this->hasParam('remove')) {
$this->dashboard->getActivePane()->removeComponent($this->getParam('remove'));
$this->dashboard->getActivePane()->removeDashlet($this->getParam('remove'));
$this->dashboard->write();
$this->redirectNow(URL::fromRequest()->remove('remove'));
}
@ -248,7 +248,7 @@ class DashboardController extends ActionController
'Add',
array(
'title' => '+',
'url' => Url::fromPath('dashboard/new-component')
'url' => Url::fromPath('dashboard/new-dashlet')
)
);
$this->view->dashboard = $this->dashboard;

View File

@ -7,12 +7,12 @@ namespace Icinga\Forms\Dashboard;
use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Form;
use Icinga\Web\Request;
use Icinga\Web\Widget\Dashboard\Component;
use Icinga\Web\Widget\Dashboard\Dashlet;
/**
* Form to add an url a dashboard pane
*/
class ComponentForm extends Form
class DashletForm extends Form
{
/**
* @var Dashboard
@ -54,7 +54,7 @@ class ComponentForm extends Form
$this->addElement(
'hidden',
'org_component',
'org_dashlet',
array(
'required' => false
)
@ -72,17 +72,23 @@ class ComponentForm extends Form
);
$this->addElement(
'text',
'component',
'dashlet',
array(
'required' => true,
'label' => t('Dashlet Title'),
'description' => t('Enter a title for the dashlet.')
)
);
if (empty($panes) ||
((isset($formData['create_new_pane']) && $formData['create_new_pane'] != false) &&
(false === isset($formData['use_existing_dashboard']) || $formData['use_existing_dashboard'] != true))
) {
$this->addElement(
'note',
'note',
array(
'decorators' => array(
array('HtmlTag', array('tag' => 'hr'))
)
)
);
if (empty($panes) || ((isset($formData['create_new_pane']) && $formData['create_new_pane'] != false))) {
$this->addElement(
'text',
'pane',
@ -93,26 +99,6 @@ class ComponentForm extends Form
t('Enter a title for the new pane.')
)
);
$this->addElement( // Prevent the button from being displayed again on validation errors
'hidden',
'create_new_pane',
array(
'value' => 1
)
);
if (false === empty($panes)) {
$buttonExistingPane = $this->createElement(
'submit',
'use_existing_dashboard',
array(
'ignore' => true,
'label' => t('Use An Existing Dashboard'),
'class' => 'link-like'
)
);
$buttonExistingPane->removeDecorator('Label');
$this->addElement($buttonExistingPane);
}
} else {
$this->addElement(
'select',
@ -125,18 +111,18 @@ class ComponentForm extends Form
t('Select a pane you want to add the dashlet.')
)
);
$buttonNewPane = $this->createElement(
'submit',
}
$this->addElement(
'checkbox',
'create_new_pane',
array(
'ignore' => true,
'label' => t('Create A New Dashboard'),
'class' => 'link-like',
'required' => false,
'label' => t('New dashboard'),
'class' => 'autosubmit',
'description' => t('Check this box if you want to add the dashlet to a new dashboard')
)
);
$buttonNewPane->removeDecorator('Label');
$this->addElement($buttonNewPane);
}
}
/**
@ -156,16 +142,16 @@ class ComponentForm extends Form
}
/**
* @param Component $component
* @param Dashlet $dashlet
*/
public function load(Component $component)
public function load(Dashlet $dashlet)
{
$this->populate(array(
'pane' => $component->getPane()->getName(),
'org_pane' => $component->getPane()->getName(),
'component' => $component->getTitle(),
'org_component' => $component->getTitle(),
'url' => $component->getUrl()
'pane' => $dashlet->getPane()->getName(),
'org_pane' => $dashlet->getPane()->getName(),
'dashlet' => $dashlet->getTitle(),
'org_dashlet' => $dashlet->getTitle(),
'url' => $dashlet->getUrl()
));
}
}

View File

@ -15,7 +15,7 @@ if (! $this->auth()->isAuthenticated()) {
id="menu" data-last-update="<?= (time() - 14) ?>000" data-base-target="_main" class="container" data-icinga-url="<?=$this->href('layout/menu');?>"
data-icinga-refresh="15"
>
<? if (SearchDashboard::search('dummy')->getPane('search')->hasComponents()): ?>
<? if (SearchDashboard::search('dummy')->getPane('search')->hasDashlets()): ?>
<form action="<?= $this->href('search') ?>" method="get" role="search">
<input type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />

View File

@ -1,8 +0,0 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Add URL to Dashboard'); ?></h1>
<?= $this->form; ?>
</div>

View File

@ -2,6 +2,6 @@
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Add Component To Dashboard'); ?></h1>
<h1><?= t('Add Dashlet To Dashboard'); ?></h1>
<?= $this->form; ?>
</div>

View File

@ -3,11 +3,11 @@
</div>
<div class="content">
<h1><?= t('Remove Component From Dashboard'); ?></h1>
<h1><?= t('Remove Dashlet From Dashboard'); ?></h1>
<p>
<?= $this->translate('Please confirm the removal'); ?>:
<?= $this->pane; ?>/<?= $this->component; ?>
<?= $this->pane; ?>/<?= $this->dashlet; ?>
</p>
<?= $this->form; ?>

View File

@ -3,7 +3,7 @@
</div>
<div class="content">
<h1><?= t('Remove Pane'); ?></h1>
<h1><?= t('Remove Dashboard'); ?></h1>
<p>
<?= $this->translate('Please confirm the removal of'); ?>:

View File

@ -6,15 +6,16 @@
<div class="content">
<h1><?= t('Dashboard Settings'); ?></h1>
<table class="avp" data-base-target="_next">
<table class="avp action" data-base-target="_next">
<thead>
<tr>
<th>
<strong><?= t('Component Name') ?></strong>
<th style="width: 18em;">
<strong><?= t('Dashlet Name') ?></strong>
</th>
<th>
<strong><?= t('Url') ?></strong>
</th>
<th style="width: 1.4em;">&nbsp;</th>
</tr>
</thead>
<tbody>
@ -29,27 +30,27 @@
</a>
</th>
</tr>
<?php $components = $pane->getComponents(); ?>
<?php if(empty($components)): ?>
<?php $dashlets = $pane->getDashlets(); ?>
<?php if(empty($dashlets)): ?>
<tr>
<td colspan="3">
<?= $this->translate('No compoments added to dashboard') ?>.
<?= $this->translate('No dashlets added to dashboard') ?>.
</td>
</tr>
<?php else: ?>
<?php foreach ($components as $component): ?>
<?php if ($component->getDisabled() === true) continue; ?>
<?php foreach ($dashlets as $dashlet): ?>
<?php if ($dashlet->getDisabled() === true) continue; ?>
<tr>
<td>
<a href="<?= $this->href('dashboard/update-component', array('pane' => $pane->getName(), 'component' => $component->getTitle())); ?>">
<?= $component->getTitle(); ?>
<a href="<?= $this->href('dashboard/update-dashlet', array('pane' => $pane->getName(), 'dashlet' => $dashlet->getTitle())); ?>">
<?= $dashlet->getTitle(); ?>
</a>
</td>
<td>
<a href="<?= $this->href($component->getUrl()); ?>"><?= $component->getUrl(); ?></a>
<td style="table-layout: fixed; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
<a href="<?= $this->href($dashlet->getUrl()); ?>"><?= $dashlet->getUrl(); ?></a>
</td>
<td>
<a href="<?= $this->href('dashboard/remove-component', array('pane' => $pane->getName(), 'component' => $component->getTitle())); ?>">
<a href="<?= $this->href('dashboard/remove-dashlet', array('pane' => $pane->getName(), 'dashlet' => $dashlet->getTitle())); ?>">
<?= $this->icon('cancel'); ?>
</a>
</td>

View File

@ -3,6 +3,6 @@
</div>
<div class="content">
<h1><?= t('Edit Component'); ?></h1>
<h1><?= t('Edit Dashlet'); ?></h1>
<?= $this->form; ?>
</div>

View File

@ -2,7 +2,7 @@
use Icinga\Web\Widget\SearchDashboard;
?>
<? if (SearchDashboard::search('dummy')->getPane('search')->hasComponents()): ?>
<? if (SearchDashboard::search('dummy')->getPane('search')->hasDashlets()): ?>
<form action="<?= $this->href('search') ?>" method="get" role="search">
<input
type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>"

View File

@ -14,15 +14,15 @@ use Icinga\Exception\SystemPermissionException;
use Icinga\File\Ini\IniWriter;
use Icinga\User;
use Icinga\Web\Widget\Dashboard\Pane;
use Icinga\Web\Widget\Dashboard\Component as DashboardComponent;
use Icinga\Web\Widget\Dashboard\Dashlet as DashboardDashlet;
use Icinga\Web\Url;
/**
* Dashboards display multiple views on a single page
*
* The terminology is as follows:
* - Component: A single view showing a specific url
* - Pane: Aggregates one or more components on one page, displays it's title as a tab
* - Dashlet: A single view showing a specific url
* - Pane: Aggregates one or more dashlets on one page, displays it's title as a tab
* - Dashboard: Shows all panes
*
*/
@ -98,9 +98,9 @@ class Dashboard extends AbstractWidget
if ($pane->isUserWidget() === true) {
$output[$pane->getName()] = $pane->toArray();
}
foreach ($pane->getComponents() as $component) {
if ($component->isUserWidget() === true) {
$output[$pane->getName() . '.' . $component->getTitle()] = $component->toArray();
foreach ($pane->getDashlets() as $dashlet) {
if ($dashlet->isUserWidget() === true) {
$output[$pane->getName() . '.' . $dashlet->getTitle()] = $dashlet->toArray();
}
}
}
@ -132,7 +132,7 @@ class Dashboard extends AbstractWidget
return false;
}
$panes = array();
$components = array();
$dashlets = array();
foreach ($config as $key => $part) {
if (strpos($key, '.') === false) {
if ($this->hasPane($part->title)) {
@ -147,34 +147,34 @@ class Dashboard extends AbstractWidget
}
} else {
list($paneName, $componentName) = explode('.', $key, 2);
list($paneName, $dashletName) = explode('.', $key, 2);
$part->pane = $paneName;
$part->component = $componentName;
$components[] = $part;
$part->dashlet = $dashletName;
$dashlets[] = $part;
}
}
foreach ($components as $componentData) {
foreach ($dashlets as $dashletData) {
$pane = null;
if (array_key_exists($componentData->pane, $panes) === true) {
$pane = $panes[$componentData->pane];
} elseif (array_key_exists($componentData->pane, $this->panes) === true) {
$pane = $this->panes[$componentData->pane];
if (array_key_exists($dashletData->pane, $panes) === true) {
$pane = $panes[$dashletData->pane];
} elseif (array_key_exists($dashletData->pane, $this->panes) === true) {
$pane = $this->panes[$dashletData->pane];
} else {
continue;
}
$component = new DashboardComponent(
$componentData->title,
$componentData->url,
$dashlet = new DashboardDashlet(
$dashletData->title,
$dashletData->url,
$pane
);
if ((bool) $componentData->get('disabled', false) === true) {
$component->setDisabled(true);
if ((bool) $dashletData->get('disabled', false) === true) {
$dashlet->setDisabled(true);
}
$component->setUserWidget();
$pane->addComponent($component);
$dashlet->setUserWidget();
$pane->addDashlet($dashlet);
}
$this->mergePanes($panes);
@ -202,7 +202,7 @@ class Dashboard extends AbstractWidget
if ($this->hasPane($pane->getTitle()) === true) {
/** @var $current Pane */
$current = $this->panes[$pane->getName()];
$current->addComponents($pane->getComponents());
$current->addDashlets($pane->getDashlets());
} else {
$this->panes[$pane->getName()] = $pane;
}

View File

@ -12,28 +12,28 @@ use Icinga\Data\ConfigObject;
use Icinga\Exception\IcingaException;
/**
* A dashboard pane component
* A dashboard pane dashlet
*
* This is the element displaying a specific view in icinga2web
*
*/
class Component extends UserWidget
class Dashlet extends UserWidget
{
/**
* The url of this Component
* The url of this Dashlet
*
* @var \Icinga\Web\Url
*/
private $url;
/**
* The title being displayed on top of the component
* The title being displayed on top of the dashlet
* @var
*/
private $title;
/**
* The pane containing this component, needed for the 'remove button'
* The pane containing this dashlet, needed for the 'remove button'
* @var Pane
*/
private $pane;
@ -61,11 +61,11 @@ class Component extends UserWidget
EOD;
/**
* Create a new component displaying the given url in the provided pane
* Create a new dashlet displaying the given url in the provided pane
*
* @param string $title The title to use for this component
* @param Url|string $url The url this component uses for displaying information
* @param Pane $pane The pane this Component will be added to
* @param string $title The title to use for this dashlet
* @param Url|string $url The url this dashlet uses for displaying information
* @param Pane $pane The pane this Dashlet will be added to
*/
public function __construct($title, $url, Pane $pane)
{
@ -77,14 +77,14 @@ EOD;
$this->url = Url::fromPath($url);
} else {
throw new IcingaException(
'Cannot create dashboard component "%s" without valid URL',
'Cannot create dashboard dashlet "%s" without valid URL',
$title
);
}
}
/**
* Retrieve the components title
* Retrieve the dashlets title
*
* @return string
*/
@ -102,7 +102,7 @@ EOD;
}
/**
* Retrieve the components url
* Retrieve the dashlets url
*
* @return Url
*/
@ -112,7 +112,7 @@ EOD;
}
/**
* Set the components URL
* Set the dashlets URL
*
* @param string|Url $url The url to use, either as an Url object or as a path
*
@ -149,7 +149,7 @@ EOD;
}
/**
* Return this component's structure as array
* Return this dashlet's structure as array
*
* @return array
*/
@ -208,8 +208,8 @@ EOD;
{
return sprintf(
'<a data-base-target="main" href="%s">%s</a>',
Url::fromPath('dashboard/remove-component', array(
'component' => $this->getTitle(),
Url::fromPath('dashboard/remove-dashlet', array(
'dashlet' => $this->getTitle(),
'pane' => $this->pane->getTitle()
)),
t('Remove')
@ -217,13 +217,13 @@ EOD;
}
/**
* Create a @see Component instance from the given Zend config, using the provided title
* Create a @see Dashlet instance from the given Zend config, using the provided title
*
* @param $title The title for this component
* @param $title The title for this dashlet
* @param ConfigObject $config The configuration defining url, parameters, height, width, etc.
* @param Pane $pane The pane this component belongs to
* @param Pane $pane The pane this dashlet belongs to
*
* @return Component A newly created Component for use in the Dashboard
* @return Dashlet A newly created Dashlet for use in the Dashboard
*/
public static function fromIni($title, ConfigObject $config, Pane $pane)
{
@ -233,14 +233,14 @@ EOD;
$parameters = $config->toArray();
unset($parameters['url']); // otherwise there's an url = parameter in the Url
$cmp = new Component($title, Url::fromPath($url, $parameters), $pane);
$cmp = new Dashlet($title, Url::fromPath($url, $parameters), $pane);
return $cmp;
}
/**
* @param \Icinga\Web\Widget\Dashboard\Pane $pane
*/
public function setPane(Panel $pane)
public function setPane(Pane $pane)
{
$this->pane = $pane;
}

View File

@ -10,7 +10,7 @@ use Icinga\Exception\ProgrammingError;
use Icinga\Exception\ConfigurationError;
/**
* A pane, displaying different Dashboard components
* A pane, displaying different Dashboard dashlets
*/
class Pane extends UserWidget
{
@ -30,11 +30,11 @@ class Pane extends UserWidget
private $title;
/**
* An array of @see Components that are displayed in this pane
* An array of @see Dashlets that are displayed in this pane
*
* @var array
*/
private $components = array();
private $dashlets = array();
/**
* Disabled flag of a pane
@ -88,94 +88,94 @@ class Pane extends UserWidget
}
/**
* Return true if a component with the given title exists in this pane
* Return true if a dashlet with the given title exists in this pane
*
* @param string $title The title of the component to check for existence
* @param string $title The title of the dashlet to check for existence
*
* @return bool
*/
public function hasComponent($title)
public function hasDashlet($title)
{
return array_key_exists($title, $this->components);
return array_key_exists($title, $this->dashlets);
}
/**
* Checks if the current pane has any components
* Checks if the current pane has any dashlets
*
* @return bool
*/
public function hasComponents()
public function hasDashlets()
{
return ! empty($this->components);
return ! empty($this->dashlets);
}
/**
* Return a component with the given name if existing
* Return a dashlet with the given name if existing
*
* @param string $title The title of the component to return
* @param string $title The title of the dashlet to return
*
* @return Component The component with the given title
* @throws ProgrammingError If the component doesn't exist
* @return Dashlet The dashlet with the given title
* @throws ProgrammingError If the dashlet doesn't exist
*/
public function getComponent($title)
public function getDashlet($title)
{
if ($this->hasComponent($title)) {
return $this->components[$title];
if ($this->hasDashlet($title)) {
return $this->dashlets[$title];
}
throw new ProgrammingError(
'Trying to access invalid component: %s',
'Trying to access invalid dashlet: %s',
$title
);
}
/**
* Removes the component with the given title if it exists in this pane
* Removes the dashlet with the given title if it exists in this pane
*
* @param string $title The pane
* @return Pane $this
*/
public function removeComponent($title)
public function removeDashlet($title)
{
if ($this->hasComponent($title)) {
$component = $this->getComponent($title);
if ($component->isUserWidget() === true) {
unset($this->components[$title]);
if ($this->hasDashlet($title)) {
$dashlet = $this->getDashlet($title);
if ($dashlet->isUserWidget() === true) {
unset($this->dashlets[$title]);
} else {
$component->setDisabled(true);
$component->setUserWidget();
$dashlet->setDisabled(true);
$dashlet->setUserWidget();
}
} else {
throw new ProgrammingError('Component does not exist: ' . $title);
throw new ProgrammingError('Dashlet does not exist: ' . $title);
}
return $this;
}
/**
* Removes all or a given list of components from this pane
* Removes all or a given list of dashlets from this pane
*
* @param array $components Optional list of component titles
* @param array $dashlets Optional list of dashlet titles
* @return Pane $this
*/
public function removeComponents(array $components = null)
public function removeDashlets(array $dashlets = null)
{
if ($components === null) {
$this->components = array();
if ($dashlets === null) {
$this->dashlets = array();
} else {
foreach ($components as $component) {
$this->removeComponent($component);
foreach ($dashlets as $dashlet) {
$this->removeDashlet($dashlet);
}
}
return $this;
}
/**
* Return all components added at this pane
* Return all dashlets added at this pane
*
* @return array
*/
public function getComponents()
public function getDashlets()
{
return $this->components;
return $this->dashlets;
}
/**
@ -183,56 +183,56 @@ class Pane extends UserWidget
*/
public function render()
{
$components = array_filter(
$this->components,
$dashlets = array_filter(
$this->dashlets,
function ($e) {
return ! $e->getDisabled();
}
);
return implode("\n", $components) . "\n";
return implode("\n", $dashlets) . "\n";
}
/**
* Add a component to this pane, optionally creating it if $component is a string
* Add a dashlet to this pane, optionally creating it if $dashlet is a string
*
* @param string|Component $component The component object or title
* (if a new component will be created)
* @param string|null $url An Url to be used when component is a string
* @param string|Dashlet $dashlet The dashlet object or title
* (if a new dashlet will be created)
* @param string|null $url An Url to be used when dashlet is a string
*
* @return self
* @throws \Icinga\Exception\ConfigurationError
*/
public function addComponent($component, $url = null)
public function addDashlet($dashlet, $url = null)
{
if ($component instanceof Component) {
$this->components[$component->getTitle()] = $component;
} elseif (is_string($component) && $url !== null) {
$this->components[$component] = new Component($component, $url, $this);
if ($dashlet instanceof Dashlet) {
$this->dashlets[$dashlet->getTitle()] = $dashlet;
} elseif (is_string($dashlet) && $url !== null) {
$this->dashlets[$dashlet] = new Dashlet($dashlet, $url, $this);
} else {
throw new ConfigurationError('Invalid component added: %s', $component);
throw new ConfigurationError('Invalid dashlet added: %s', $dashlet);
}
return $this;
}
/**
* Add new components to existing components
* Add new dashlets to existing dashlets
*
* @param array $components
* @param array $dashlets
* @return $this
*/
public function addComponents(array $components)
public function addDashlets(array $dashlets)
{
/* @var $component Component */
foreach ($components as $component) {
if (array_key_exists($component->getTitle(), $this->components)) {
if (preg_match('/_(\d+)$/', $component->getTitle(), $m)) {
$name = preg_replace('/_\d+$/', $m[1]++, $component->getTitle());
/* @var $dashlet Dashlet */
foreach ($dashlets as $dashlet) {
if (array_key_exists($dashlet->getTitle(), $this->dashlets)) {
if (preg_match('/_(\d+)$/', $dashlet->getTitle(), $m)) {
$name = preg_replace('/_\d+$/', $m[1]++, $dashlet->getTitle());
} else {
$name = $component->getTitle() . '_2';
$name = $dashlet->getTitle() . '_2';
}
$this->components[$name] = $component;
$this->dashlets[$name] = $dashlet;
} else {
$this->components[$component->getTitle()] = $component;
$this->dashlets[$dashlet->getTitle()] = $dashlet;
}
}
@ -240,19 +240,19 @@ class Pane extends UserWidget
}
/**
* Add a component to the current pane
* Add a dashlet to the current pane
*
* @param $title
* @param $url
* @return Component
* @return Dashlet
*
* @see addComponent()
* @see addDashlet()
*/
public function add($title, $url = null)
{
$this->addComponent($title, $url);
$this->addDashlet($title, $url);
return $this->components[$title];
return $this->dashlets[$title];
}
/**

View File

@ -48,7 +48,7 @@ class SearchDashboard extends Dashboard
*/
public function render()
{
if (! $this->getPane(self::SEARCH_PANE)->hasComponents()) {
if (! $this->getPane(self::SEARCH_PANE)->hasDashlets()) {
throw new ActionError('Site not found', 404);
}
return parent::render();
@ -70,8 +70,8 @@ class SearchDashboard extends Dashboard
$this->addSearchDashletsFromModule($searchString, $module, $pane);
}
if ($searchString === '' && $pane->hasComponents()) {
$pane->removeComponents();
if ($searchString === '' && $pane->hasDashlets()) {
$pane->removeDashlets();
$pane->add('Ready to search', 'search/hint');
return;
}
@ -91,7 +91,7 @@ class SearchDashboard extends Dashboard
if (! empty($searchUrls)) {
$this->searchUrls[] = $module->getSearchUrls();
foreach ($searchUrls as $search) {
$pane->addComponent(
$pane->addDashlet(
$search->title . ': ' . $searchString,
Url::fromPath($search->url, array('q' => $searchString))
);

View File

@ -26,7 +26,7 @@ class DashboardAction implements Tabextension
array(
'icon' => 'dashboard',
'title' => 'Add To Dashboard',
'url' => Url::fromPath('dashboard/new-component'),
'url' => Url::fromPath('dashboard/new-dashlet'),
'urlParams' => array(
'url' => rawurlencode(Url::fromRequest()->getRelativeUrl())
)

View File

@ -24,7 +24,7 @@ class DashboardSettings implements Tabextension
array(
'icon' => 'img/icons/dashboard.png',
'title' => t('Add To Dashboard'),
'url' => Url::fromPath('dashboard/new-component')
'url' => Url::fromPath('dashboard/new-dashboard')
)
);

View File

@ -186,6 +186,7 @@
*
*/
submitForm: function (event, autosubmit) {
//return false;
var self = event.data.self;
var icinga = self.icinga;
// .closest is not required unless subelements to trigger this
@ -198,9 +199,23 @@
var data;
if ($button.length === 0) {
var $el = $(event.currentTarget);
if ($el.is('input[type=submit]') || $el.is('button[type=submit]')) {
var $el;
if (typeof event.originalEvent !== 'undefined'
&& typeof event.originalEvent.explicitOriginalTarget === 'object') { // Firefox
$el = $(event.originalEvent.explicitOriginalTarget);
icinga.logger.info('events/submitForm: Button is event.originalEvent.explicitOriginalTarget');
} else {
$el = $(event.currentTarget);
icinga.logger.info('events/submitForm: Button is event.currentTarget');
}
if ($el && ($el.is('input[type=submit]') || $el.is('button[type=submit]'))) {
$button = $el;
} else {
icinga.logger.error(
'events/submitForm: Can not determine submit button, using the first one in form'
);
}
}

View File

@ -12,10 +12,10 @@ use Mockery;
use Icinga\Application\Icinga;
use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Widget\Dashboard\Pane;
use Icinga\Web\Widget\Dashboard\Component;
use Icinga\Web\Widget\Dashboard\Dashlet;
use Icinga\Test\BaseTestCase;
class ComponentWithMockedView extends Component
class DashletWithMockedView extends Dashlet
{
public function view()
{
@ -156,14 +156,14 @@ class DashboardTest extends BaseTestCase
/**
* @depends testWhetherGetPaneReturnsAPaneByName
*/
public function testWhetherRenderNotRendersPanesDisabledComponent()
public function testWhetherRenderNotRendersPanesDisabledDashlet()
{
$dashboard = new Dashboard();
$dashboard->createPane('test1');
$pane = $dashboard->getPane('test1');
$component = new ComponentWithMockedView('test', 'test', $pane);
$component->setDisabled(true);
$pane->addComponent($component);
$dashlet = new DashletWithMockedView('test', 'test', $pane);
$dashlet->setDisabled(true);
$pane->addDashlet($dashlet);
$rendered = $dashboard->render();
@ -171,20 +171,20 @@ class DashboardTest extends BaseTestCase
$this->assertFalse(
$greaterThanOne,
'Dashboard::render() disabled component is rendered, but should not'
'Dashboard::render() disabled dashlet is rendered, but should not'
);
}
/**
* @depends testWhetherGetPaneReturnsAPaneByName
*/
public function testWhetherRenderRendersPanesEnabledComponent()
public function testWhetherRenderRendersPanesEnabledDashlet()
{
$dashboard = new Dashboard();
$dashboard->createPane('test1');
$pane = $dashboard->getPane('test1');
$component = new ComponentWithMockedView('test', 'test', $pane);
$pane->addComponent($component);
$dashlet = new DashletWithMockedView('test', 'test', $pane);
$pane->addDashlet($dashlet);
$rendered = $dashboard->render();
@ -192,7 +192,7 @@ class DashboardTest extends BaseTestCase
$this->assertTrue(
$greaterThanOne,
'Dashboard::render() could not render enabled component'
'Dashboard::render() could not render enabled dashlet'
);
}
@ -259,44 +259,44 @@ class DashboardTest extends BaseTestCase
/**
* @depends testWhetherGetPaneReturnsAPaneByName
*/
public function testWhetherRemoveComponentRemovesComponent()
public function testWhetherRemoveDashletRemovesDashlet()
{
$dashboard = new Dashboard();
$dashboard->createPane('test1');
$pane = $dashboard->getPane('test1');
$component = new Component('test', 'test', $pane);
$pane->addComponent($component);
$dashlet = new Dashlet('test', 'test', $pane);
$pane->addDashlet($dashlet);
$component2 = new Component('test2', 'test2', $pane);
$pane->addComponent($component2);
$dashlet2 = new Dashlet('test2', 'test2', $pane);
$pane->addDashlet($dashlet2);
$dashboard->getPane('test1')->removeComponent('test');
$result = $dashboard->getPane('test1')->hasComponent('test');
$dashboard->getPane('test1')->removeDashlet('test');
$result = $dashboard->getPane('test1')->hasDashlet('test');
$this->assertTrue(
$result,
'Dashboard::removeComponent() could not remove component from the pane'
'Dashboard::removeDashlet() could not remove dashlet from the pane'
);
}
/**
* @depends testWhetherGetPaneReturnsAPaneByName
*/
public function testWhetherSetComponentUrlUpdatesTheComponentUrl()
public function testWhetherSetDashletUrlUpdatesTheDashletUrl()
{
$dashboard = new Dashboard();
$dashboard->createPane('test1');
$pane = $dashboard->getPane('test1');
$component = new Component('test', 'test', $pane);
$pane->addComponent($component);
$dashlet = new Dashlet('test', 'test', $pane);
$pane->addDashlet($dashlet);
$dashboard->getPane('test1')->getComponent('test')->setUrl('new');
$dashboard->getPane('test1')->getDashlet('test')->setUrl('new');
$this->assertEquals(
'new',
$component->getUrl()->getPath(),
'Dashboard::setComponentUrl() could not return valid expectation'
$dashlet->getUrl()->getPath(),
'Dashboard::setDashletUrl() could not return valid expectation'
);
}

View File

@ -33,10 +33,10 @@ class SearchDashboardTest extends BaseTestCase
/**
* @expectedException Zend_Controller_Action_Exception
*/
public function testWhetherRenderThrowsAnExceptionWhenHasNoComponents()
public function testWhetherRenderThrowsAnExceptionWhenHasNoDashlets()
{
$dashboard = SearchDashboard::search('pending');
$dashboard->getPane('search')->removeComponents();
$dashboard->getPane('search')->removeDashlets();
$dashboard->render();
}
@ -44,7 +44,7 @@ class SearchDashboardTest extends BaseTestCase
{
$dashboard = SearchDashboard::search('pending');
$result = $dashboard->getPane('search')->hasComponent('Hosts: pending');
$result = $dashboard->getPane('search')->hasDashlet('Hosts: pending');
$this->assertTrue($result, 'Dashboard::search() could not load search dashlets from modules');
}
@ -53,7 +53,7 @@ class SearchDashboardTest extends BaseTestCase
{
$dashboard = SearchDashboard::search();
$result = $dashboard->getPane('search')->hasComponent('Ready to search');
$result = $dashboard->getPane('search')->hasDashlet('Ready to search');
$this->assertTrue($result, 'Dashboard::search() could not get hint for search');
}