2015-09-07 13:55:19 +02:00
|
|
|
<?php
|
|
|
|
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
|
|
|
|
|
|
|
|
namespace Icinga\Controllers;
|
|
|
|
|
2015-09-07 15:43:06 +02:00
|
|
|
use Exception;
|
2015-09-07 15:01:55 +02:00
|
|
|
use Icinga\Application\Config;
|
2015-09-07 15:21:21 +02:00
|
|
|
use Icinga\Exception\NotFoundError;
|
2015-09-07 16:02:12 +02:00
|
|
|
use Icinga\Forms\ConfirmRemovalForm;
|
2015-09-07 15:43:06 +02:00
|
|
|
use Icinga\Forms\Navigation\NavigationConfigForm;
|
2015-09-07 13:55:19 +02:00
|
|
|
use Icinga\Web\Controller;
|
2015-09-07 15:04:31 +02:00
|
|
|
use Icinga\Web\Form;
|
2015-09-07 16:02:12 +02:00
|
|
|
use Icinga\Web\Notification;
|
2015-09-07 15:04:31 +02:00
|
|
|
use Icinga\Web\Url;
|
2015-09-07 13:55:19 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Navigation configuration
|
|
|
|
*/
|
|
|
|
class NavigationController extends Controller
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Show the current user a list of his/her navigation items
|
|
|
|
*/
|
|
|
|
public function indexAction()
|
|
|
|
{
|
2015-09-07 15:01:55 +02:00
|
|
|
$user = $this->Auth()->getUser();
|
|
|
|
$userConfig = $user->loadNavigationConfig();
|
|
|
|
$sharedConfig = Config::app('navigation');
|
|
|
|
|
|
|
|
$this->view->items = array_merge(
|
|
|
|
$sharedConfig->select()->where('owner', $user->getUsername())->fetchAll(),
|
|
|
|
iterator_to_array($userConfig)
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->getTabs()->add(
|
|
|
|
'navigation',
|
|
|
|
array(
|
|
|
|
'title' => $this->translate('List and configure your own navigation items'),
|
|
|
|
'label' => $this->translate('Navigation'),
|
|
|
|
'url' => 'navigation'
|
|
|
|
)
|
|
|
|
)->activate('navigation');
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* List all shared navigation items
|
|
|
|
*/
|
|
|
|
public function sharedAction()
|
|
|
|
{
|
|
|
|
$this->assertPermission('config/application/navigation');
|
2015-09-07 15:04:31 +02:00
|
|
|
$this->view->items = Config::app('navigation');
|
|
|
|
|
|
|
|
$removeForm = new Form();
|
|
|
|
$removeForm->setUidDisabled();
|
|
|
|
$removeForm->setAction(Url::fromPath('navigation/unshare'));
|
|
|
|
$removeForm->addElement('hidden', 'name', array(
|
|
|
|
'decorators' => array('ViewHelper')
|
|
|
|
));
|
|
|
|
$removeForm->addElement('hidden', 'redirect', array(
|
|
|
|
'value' => Url::fromPath('navigation/shared'),
|
|
|
|
'decorators' => array('ViewHelper')
|
|
|
|
));
|
|
|
|
$removeForm->addElement('button', 'btn_submit', array(
|
|
|
|
'escape' => false,
|
|
|
|
'type' => 'submit',
|
|
|
|
'class' => 'link-like spinner',
|
|
|
|
'value' => 'btn_submit',
|
|
|
|
'decorators' => array('ViewHelper'),
|
|
|
|
'label' => $this->view->icon('trash'),
|
|
|
|
'title' => $this->translate('Unshare this navigation item')
|
|
|
|
));
|
|
|
|
$this->view->removeForm = $removeForm;
|
|
|
|
|
|
|
|
$this->getTabs()->add(
|
|
|
|
'navigation/shared',
|
|
|
|
array(
|
|
|
|
'title' => $this->translate('List and configure shared navigation items'),
|
|
|
|
'label' => $this->translate('Shared Navigation'),
|
|
|
|
'url' => 'navigation/shared'
|
|
|
|
)
|
|
|
|
)->activate('navigation/shared');
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a navigation item
|
|
|
|
*/
|
|
|
|
public function addAction()
|
|
|
|
{
|
2015-09-07 15:50:26 +02:00
|
|
|
$form = new NavigationConfigForm();
|
|
|
|
$form->setRedirectUrl('navigation');
|
|
|
|
$form->setTitle($this->translate('Create New Navigation Item'));
|
|
|
|
$form->addDescription($this->translate('Create a new navigation item, such as a menu entry or dashlet.'));
|
2015-09-15 15:57:03 +02:00
|
|
|
$form->setUser($this->Auth()->getUser());
|
|
|
|
$form->setShareConfig(Config::app('navigation'));
|
2015-09-07 15:50:26 +02:00
|
|
|
$form->setOnSuccess(function (NavigationConfigForm $form) {
|
|
|
|
try {
|
|
|
|
$form->add(array_filter($form->getValues()));
|
|
|
|
} catch (Exception $e) {
|
|
|
|
$form->error($e->getMessage());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($form->save()) {
|
|
|
|
Notification::success(t('Navigation item successfully created'));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
$form->handleRequest();
|
|
|
|
|
|
|
|
$this->view->form = $form;
|
|
|
|
$this->render('form');
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Edit a navigation item
|
|
|
|
*/
|
|
|
|
public function editAction()
|
|
|
|
{
|
2015-09-07 15:43:06 +02:00
|
|
|
$itemName = $this->params->getRequired('name');
|
|
|
|
|
|
|
|
$form = new NavigationConfigForm();
|
|
|
|
$form->setRedirectUrl('navigation');
|
|
|
|
$form->setTitle(sprintf($this->translate('Edit Navigation Item %s'), $itemName));
|
2015-09-15 15:57:03 +02:00
|
|
|
$form->setUser($this->Auth()->getUser());
|
|
|
|
$form->setShareConfig(Config::app('navigation'));
|
2015-09-07 15:43:06 +02:00
|
|
|
$form->setOnSuccess(function (NavigationConfigForm $form) use ($itemName) {
|
|
|
|
try {
|
|
|
|
$form->edit($itemName, array_map(
|
|
|
|
function ($v) {
|
|
|
|
return $v !== '' ? $v : null;
|
|
|
|
},
|
|
|
|
$form->getValues()
|
|
|
|
));
|
|
|
|
} catch (NotFoundError $e) {
|
|
|
|
throw $e;
|
|
|
|
} catch (Exception $e) {
|
|
|
|
$form->error($e->getMessage());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($form->save()) {
|
|
|
|
Notification::success(sprintf(t('Navigation item "%s" successfully updated'), $itemName));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
$form->load($itemName);
|
|
|
|
$form->handleRequest();
|
|
|
|
} catch (NotFoundError $_) {
|
|
|
|
$this->httpNotFound(sprintf($this->translate('Navigation item "%s" not found'), $itemName));
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->view->form = $form;
|
|
|
|
$this->render('form');
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove a navigation item
|
|
|
|
*/
|
|
|
|
public function removeAction()
|
|
|
|
{
|
2015-09-07 16:02:12 +02:00
|
|
|
$itemName = $this->params->getRequired('name');
|
|
|
|
|
|
|
|
$navigationConfigForm = new NavigationConfigForm();
|
2015-09-15 15:57:03 +02:00
|
|
|
$navigationConfigForm->setUser($this->Auth()->getUser());
|
|
|
|
$navigationConfigForm->setShareConfig(Config::app('navigation'));
|
2015-09-07 16:02:12 +02:00
|
|
|
$form = new ConfirmRemovalForm();
|
|
|
|
$form->setRedirectUrl('navigation');
|
|
|
|
$form->setTitle(sprintf($this->translate('Remove Navigation Item %s'), $itemName));
|
|
|
|
$form->setOnSuccess(function (ConfirmRemovalForm $form) use ($itemName, $navigationConfigForm) {
|
|
|
|
try {
|
|
|
|
$navigationConfigForm->delete($itemName);
|
2015-09-15 15:57:03 +02:00
|
|
|
} catch (NotFoundError $e) {
|
|
|
|
Notification::success(sprintf(t('Navigation Item "%s" not found. No action required'), $itemName));
|
|
|
|
return true;
|
2015-09-07 16:02:12 +02:00
|
|
|
} catch (Exception $e) {
|
|
|
|
$form->error($e->getMessage());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($navigationConfigForm->save()) {
|
|
|
|
Notification::success(sprintf(t('Navigation Item "%s" successfully removed'), $itemName));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
$form->handleRequest();
|
|
|
|
|
|
|
|
$this->view->form = $form;
|
|
|
|
$this->render('form');
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|
2015-09-07 15:21:21 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Unshare a navigation item
|
|
|
|
*/
|
|
|
|
public function unshareAction()
|
|
|
|
{
|
|
|
|
$this->assertPermission('config/application/navigation');
|
|
|
|
$this->assertHttpMethod('POST');
|
|
|
|
|
2015-09-07 15:43:06 +02:00
|
|
|
$navigationConfigForm = new NavigationConfigForm();
|
2015-09-15 15:57:03 +02:00
|
|
|
$navigationConfigForm->setUser($this->Auth()->getUser());
|
|
|
|
$navigationConfigForm->setShareConfig(Config::app('navigation'));
|
2015-09-07 15:21:21 +02:00
|
|
|
|
|
|
|
$form = new Form(array(
|
2015-09-07 15:43:06 +02:00
|
|
|
'onSuccess' => function ($form) use ($navigationConfigForm) {
|
2015-09-07 15:21:21 +02:00
|
|
|
try {
|
2015-09-16 10:58:57 +02:00
|
|
|
$navigationConfigForm->unshare($form->getValue('name'));
|
2015-09-07 15:21:21 +02:00
|
|
|
} catch (NotFoundError $e) {
|
|
|
|
throw $e;
|
|
|
|
} catch (Exception $e) {
|
|
|
|
Notification::error($e->getMessage());
|
|
|
|
}
|
|
|
|
|
2015-09-16 10:58:57 +02:00
|
|
|
if ($navigationConfigForm->save()) {
|
|
|
|
Notification::success(sprintf(
|
|
|
|
t('Navigation item "%s" has been unshared'),
|
|
|
|
$form->getValue('name')
|
|
|
|
));
|
|
|
|
} else {
|
|
|
|
// TODO: It failed obviously to write one of the configs, so we're leaving the user in
|
|
|
|
// a inconsistent state. Luckily, it's nothing lost but possibly duplicated...
|
|
|
|
Notification::error(sprintf(
|
|
|
|
t('Failed to unshare navigation item "%s"'),
|
|
|
|
$form->getValue('name')
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2015-09-07 15:21:21 +02:00
|
|
|
$redirect = $form->getValue('redirect');
|
|
|
|
if (! empty($redirect)) {
|
|
|
|
$form->setRedirectUrl(htmlspecialchars_decode($redirect));
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
));
|
|
|
|
$form->setUidDisabled();
|
|
|
|
$form->setSubmitLabel('btn_submit'); // Required to ensure that isSubmitted() is called
|
|
|
|
$form->addElement('hidden', 'name', array('required' => true));
|
|
|
|
$form->addElement('hidden', 'redirect');
|
|
|
|
|
|
|
|
try {
|
|
|
|
$form->handleRequest();
|
|
|
|
} catch (NotFoundError $_) {
|
|
|
|
$this->httpNotFound(sprintf($this->translate('Navigation item "%s" not found'), $form->getValue('name')));
|
|
|
|
}
|
|
|
|
}
|
2015-09-07 13:55:19 +02:00
|
|
|
}
|