diff --git a/application/controllers/HostController.php b/application/controllers/HostController.php index 60543a91..787930ee 100644 --- a/application/controllers/HostController.php +++ b/application/controllers/HostController.php @@ -15,6 +15,7 @@ use Icinga\Module\Director\Restriction\HostgroupRestriction; use Icinga\Module\Director\Util; use Icinga\Module\Director\Web\Controller\ObjectController; use Icinga\Web\Url; +use ipl\Html\Link; class HostController extends ObjectController { @@ -22,7 +23,7 @@ class HostController extends ObjectController { parent::init(); if ($this->object) { - $tabs = $this->getTabs(); + $tabs = $this->tabs(); $tabs->add('services', array( 'url' => 'director/host/services', 'urlParams' => array('name' => $this->object->object_name), @@ -77,7 +78,7 @@ class HostController extends ObjectController $host = $this->object; $mon = $this->monitoring(); if ($host->isObject() && $mon->isAvailable() && $mon->hasHost($host->object_name)) { - $this->view->actionLinks .= ' ' . $this->view->qlink( + $this->actions()->add(Link::create( $this->translate('Show'), 'monitoring/host/show', array('host' => $host->object_name), @@ -85,7 +86,7 @@ class HostController extends ObjectController 'class' => 'icon-globe critical', 'data-base-target' => '_next' ) - ); + )); } } diff --git a/application/controllers/ServiceController.php b/application/controllers/ServiceController.php index 90466aaa..f1ae787e 100644 --- a/application/controllers/ServiceController.php +++ b/application/controllers/ServiceController.php @@ -113,7 +113,7 @@ class ServiceController extends ObjectController public function editAction() { - $this->getTabs()->activate('modify'); + $this->tabs()->activate('modify'); /** @var IcingaService $object */ $object = $this->object; @@ -127,7 +127,7 @@ class ServiceController extends ObjectController ); } - $this->view->form = $form = $this + $form = $this ->loadForm('icingaService') ->setDb($this->db()); @@ -146,7 +146,7 @@ class ServiceController extends ObjectController $form->setObject($object); } - $this->view->form->handleRequest(); + $form->handleRequest(); $this->view->actionLinks .= $this->createCloneLink(); $this->view->title = $object->object_name; @@ -172,7 +172,8 @@ class ServiceController extends ObjectController // ignore the error, show no apply link } - $this->setViewScript('object/form'); + $this->content()->add($form); + // $this->setViewScript('object/form'); } public function assignAction() diff --git a/application/views/scripts/object/show.phtml b/application/views/scripts/object/show.phtml deleted file mode 100644 index 4fba1d3c..00000000 --- a/application/views/scripts/object/show.phtml +++ /dev/null @@ -1,29 +0,0 @@ -
-tabs ?> -

escape($this->title) ?>

- -actionLinks ?> - -
- -
-object->isDisabled()): ?> -

translate('This object will not be deployed as it has been disabled') ?>

- -isExternal): ?> -

translate( - 'This is an external object. It has been imported from Icinga 2 throught the' - . ' Core API and cannot be managed with the Icinga Director. It is however' - . ' perfectly valid to create objects using this or referring to this object.' - . ' You might also want to define related Fields to make work based on this' - . ' object more enjoyable' -) ?>

- -config->getFiles() as $filename => $file): ?> -isExternal): ?>

escape($filename) ?>

-object->isDisabled()): ?> class="disabled"isExternal): ?> class="logfile"> -escape($file->getContent()) ?> - - - -
diff --git a/library/Director/Web/Controller/ActionController.php b/library/Director/Web/Controller/ActionController.php index 65718d72..6c9bc166 100644 --- a/library/Director/Web/Controller/ActionController.php +++ b/library/Director/Web/Controller/ActionController.php @@ -12,7 +12,7 @@ use Icinga\Module\Director\Web\Controller\Extension\CoreApi; use Icinga\Module\Director\Web\Controller\Extension\DirectorDb; use Icinga\Module\Director\Web\Controller\Extension\RestApi; use Icinga\Module\Director\Web\Form\FormLoader; -use Icinga\Module\Director\Web\Form\QuickBaseForm; +use Icinga\Module\Director\Web\Form\QuickForm; use Icinga\Module\Director\Web\Table\QuickTable; use Icinga\Module\Director\Web\Table\TableLoader; use Icinga\Security\SecurityException; @@ -99,7 +99,7 @@ abstract class ActionController extends Controller implements ControlsAndContent /** * @param string $name * - * @return QuickBaseForm + * @return QuickForm */ public function loadForm($name) { diff --git a/library/Director/Web/Controller/ObjectController.php b/library/Director/Web/Controller/ObjectController.php index d4212078..0150673c 100644 --- a/library/Director/Web/Controller/ObjectController.php +++ b/library/Director/Web/Controller/ObjectController.php @@ -11,6 +11,9 @@ use Icinga\Module\Director\Exception\NestingError; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Web\Controller\Extension\ObjectRestrictions; use Icinga\Module\Director\Web\Form\DirectorObjectForm; +use Icinga\Module\Director\Web\Tabs\ObjectTabs; +use ipl\Html\Html; +use ipl\Html\Link; abstract class ObjectController extends ActionController { @@ -51,54 +54,10 @@ abstract class ObjectController extends ActionController } $type = strtolower($this->getType()); - - if ($object = $this->loadObject()) { - $this->beforeTabs(); - $params = $object->getUrlParams(); - - if ($object->isExternal() - && ! in_array($object->getShortTableName(), $this->allowedExternals) - ) { - $tabs = $this->getTabs(); - } else { - $tabs = $this->getTabs()->add('modify', array( - 'url' => sprintf('director/%s', $type), - 'urlParams' => $params, - 'label' => $this->translate(ucfirst($type)) - )); - } - - if ($this->hasPermission('director/showconfig')) { - $tabs->add('render', array( - 'url' => sprintf('director/%s/render', $type), - 'urlParams' => $params, - 'label' => $this->translate('Preview'), - )); - } - - if ($this->hasPermission('director/audit')) { - $tabs->add('history', array( - 'url' => sprintf('director/%s/history', $type), - 'urlParams' => $params, - 'label' => $this->translate('History') - )); - } - - - if ($this->hasPermission('director/admin') && $this->hasFields()) { - $tabs->add('fields', array( - 'url' => sprintf('director/%s/fields', $type), - 'urlParams' => $params, - 'label' => $this->translate('Fields') - )); - } - } else { - $this->beforeTabs(); - $this->getTabs()->add('add', array( - 'url' => sprintf('director/%s/add', $type), - 'label' => sprintf($this->translate('Add %s'), ucfirst($type)), - )); + if ($name = $this->params->get('name')) { + $this->loadObject(); } + $this->tabs(new ObjectTabs($type, $this->getAuth(), $this->object)); } public function indexAction() @@ -122,10 +81,12 @@ abstract class ObjectController extends ActionController public function renderAction() { $this->assertPermission('director/showconfig'); - $type = $this->getType(); - $this->getTabs()->activate('render'); + $this->tabs()->activate('render'); $object = $this->object; - $this->view->isExternal = $object->isExternal(); + $this->addTitle( + $this->translate('Config preview: %s'), + $object->object_name + ); if ($this->params->shift('resolved')) { $object = $object::fromPlainObject( @@ -133,62 +94,84 @@ abstract class ObjectController extends ActionController $object->getConnection() ); - $this->view->actionLinks = $this->view->qlink( + $this->actions()->add(Link::create( $this->translate('Show normal'), $this->getRequest()->getUrl()->without('resolved'), null, - array('class' => 'icon-resize-small state-warning') - ); + ['class' => 'icon-resize-small state-warning'] + )); } else { try { if ($object->supportsImports() && $object->imports()->count() > 0) { - $this->view->actionLinks = $this->view->qlink( + $this->actions()->add(Link::create( $this->translate('Show resolved'), $this->getRequest()->getUrl()->with('resolved', true), null, - array('class' => 'icon-resize-full') - ); + ['class' => 'icon-resize-full'] + )); } } catch (NestingError $e) { // No resolve link with nesting errors } } - $this->view->object = $object; - $this->view->config = $object->toSingleIcingaConfig(); + $content = $this->content(); + if ($object->isDisabled()) { + $content->add(Html::p( + ['class' => 'error'], + $this->translate('This object will not be deployed as it has been disabled') + )); + } + if ($object->isExternal()) { + $content->add(Html::p($this->translate(( + 'This is an external object. It has been imported from Icinga 2 throught the' + . ' Core API and cannot be managed with the Icinga Director. It is however' + . ' perfectly valid to create objects using this or referring to this object.' + . ' You might also want to define related Fields to make work based on this' + . ' object more enjoyable' + )))); + } + $config = $object->toSingleIcingaConfig(); - $this->view->title = sprintf( - $this->translate('Config preview: %s'), - $object->object_name - ); - $this->setViewScript('object/show'); + foreach ($config->getFiles() as $filename => $file) { + if (! $object->isExternal()) { + $content->add(Html::h2($filename)); + } + + $classes = array(); + if ($object->isDisabled()) { + $classes[] = 'disabled'; + } elseif ($object->isExternal()) { + $classes[] = 'logfile'; + } + + $content->add(Html::pre(['class' => $classes], $file->getContent())); + } } public function editAction() { $object = $this->object; - $this->getTabs()->activate('modify'); - $ltype = $this->getType(); - $type = ucfirst($ltype); + $this->addTitle($object->object_name); + $this->tabs()->activate('modify'); - $formName = 'icinga' . $type; - $this->view->form = $form = $this->loadForm($formName) + $formName = 'icinga' . ucfirst($this->getType()); + $this->content()->add($form = $this->loadForm($formName) ->setDb($this->db()) - ->setApi($this->getApiIfAvailable()); - /** @var DirectorObjectForm */ - $form->setObject($object); - $form->setAuth($this->Auth()); + ->setAuth($this->Auth()) + ->setApi($this->getApiIfAvailable()) + ->setObject($object) + ->setAuth($this->Auth()) + ->handleRequest() - $this->view->title = $object->object_name; - $this->view->form->handleRequest(); + ); - $this->view->actionLinks = $this->createCloneLink(); - $this->setViewScript('object/form'); + $this->actions()->add($this->createCloneLink()); } protected function createCloneLink() { - return $this->view->qlink( + return Link::create( $this->translate('Clone'), 'director/' . $this->getType() .'/clone', $this->object->getUrlParams(), @@ -198,7 +181,7 @@ abstract class ObjectController extends ActionController public function addAction() { - $this->getTabs()->activate('add'); + $this->tabs()->activate('add'); $type = $this->getType(); $ltype = strtolower($type); @@ -206,30 +189,32 @@ abstract class ObjectController extends ActionController /** @var DirectorObjectForm $form */ $form = $this->view->form = $this->loadForm('icinga' . ucfirst($type)) ->setDb($this->db()) + ->setAuth($this->Auth()) ->presetImports($this->params->shift('imports')) ->setApi($this->getApiIfAvailable()) ->setSuccessUrl($url); - if ($type = $this->params->shift('type')) { - $form->setPreferredObjectType($type); + if ($oType = $this->params->shift('type')) { + $form->setPreferredObjectType($oType); } - if ($type === 'template') { - $this->view->title = sprintf( + if ($oType === 'template') { + $this->assertPermission('director/admin'); + $this->addTitle( $this->translate('Add new Icinga %s template'), ucfirst($ltype) ); } else { - $this->view->title = sprintf( + $this->assertPermission('director/' . $ltype); + $this->addTitle( $this->translate('Add new Icinga %s'), ucfirst($ltype) ); } $this->beforeHandlingAddRequest($form); - $form->handleRequest(); - $this->setViewScript('object/form'); + $this->content()->add($form); } protected function beforeHandlingAddRequest($form) @@ -240,26 +225,18 @@ abstract class ObjectController extends ActionController { $type = $this->getType(); $ltype = strtolower($type); - $this->getTabs()->activate('modify'); - - $this->view->form = $form = $this->loadForm( - 'icingaCloneObject' - )->setObject($this->object); - - $this->view->title = sprintf( - $this->translate('Clone Icinga %s'), - ucfirst($type) - ); - $this->view->form->handleRequest(); - - $this->view->actionLinks = $this->view->qlink( + $this->assertPermission('director/' . $ltype); + $this->tabs()->activate('modify'); + $this->addTitle($this->translate('Clone Icinga %s'), ucfirst($type)); + $form = $this->loadForm('icingaCloneObject')->setObject($this->object); + $form->handleRequest(); + $this->content()->add($form); + $this->actions()->add(Link::create( $this->translate('back'), 'director/' . $ltype, array('name' => $this->object->object_name), array('class' => 'icon-left-big') - ); - - $this->setViewScript('object/form'); + )); } public function fieldsAction() @@ -268,7 +245,7 @@ abstract class ObjectController extends ActionController $object = $this->object; $type = $this->getType(); - $this->getTabs()->activate('fields'); + $this->tabs()->activate('fields'); $this->view->title = sprintf( $this->translate('Custom fields: %s'), @@ -309,7 +286,7 @@ abstract class ObjectController extends ActionController $this->setAutorefreshInterval(10); $db = $this->db(); $type = $this->getType(); - $this->getTabs()->activate('history'); + $this->tabs()->activate('history'); $this->view->title = sprintf( $this->translate('Activity Log: %s'), $this->object->object_name diff --git a/library/Director/Web/Tabs/ObjectTabs.php b/library/Director/Web/Tabs/ObjectTabs.php new file mode 100644 index 00000000..cae40010 --- /dev/null +++ b/library/Director/Web/Tabs/ObjectTabs.php @@ -0,0 +1,107 @@ +type = $type; + $this->auth = $auth; + $this->object = $object; + // We are not a BaseElement, not yet + $this->assemble(); + } + + protected function assemble() + { + if (null === $this->object) { + $this->addTabsForNewObject(); + } else { + $this->addTabsForExistingObject(); + } + } + + protected function addTabsForNewObject() + { + $type = $this->type; + $this->add('add', array( + 'url' => sprintf('director/%s/add', $type), + 'label' => sprintf($this->translate('Add %s'), ucfirst($type)), + )); + } + + protected function addTabsForExistingObject() + { + $type = $this->type; + $auth = $this->auth; + $object = $this->object; + $params = $object->getUrlParams(); + + if (! $object->isExternal() + || in_array($object->getShortTableName(), $this->allowedExternals) + ) { + $this->add('modify', array( + 'url' => sprintf('director/%s', $type), + 'urlParams' => $params, + 'label' => $this->translate(ucfirst($type)) + )); + } + + if ($auth->hasPermission('director/showconfig')) { + $this->add('render', array( + 'url' => sprintf('director/%s/render', $type), + 'urlParams' => $params, + 'label' => $this->translate('Preview'), + )); + } + + if ($auth->hasPermission('director/audit')) { + $this->add('history', array( + 'url' => sprintf('director/%s/history', $type), + 'urlParams' => $params, + 'label' => $this->translate('History') + )); + } + + if ($auth->hasPermission('director/admin') && $this->hasFields()) { + $this->add('fields', array( + 'url' => sprintf('director/%s/fields', $type), + 'urlParams' => $params, + 'label' => $this->translate('Fields') + )); + } + } + + protected function hasFields() + { + if (! ($object = $this->object)) { + return false; + } + + return $object->hasBeenLoadedFromDb() + && $object->supportsFields() + && ($object->isTemplate() || $this->type === 'command'); + } +}