config/modules: show metadata, improve usability
Well... I didn't want to commit this before creating single-button forms for enabling/disabling modules. However part of this accidentally made it through, so let's finish it. Still some work to do, but it already looks far better like this. refs #4095
This commit is contained in:
parent
747083d322
commit
78193137f0
|
@ -27,23 +27,24 @@
|
||||||
*/
|
*/
|
||||||
// {{{ICINGA_LICENSE_HEADER}}}
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
|
||||||
use \Icinga\Web\Controller\BaseConfigController;
|
use Icinga\Web\Controller\BaseConfigController;
|
||||||
use \Icinga\Web\Widget\Tab;
|
use Icinga\Web\Widget\Tab;
|
||||||
use \Icinga\Web\Widget\AlertMessageBox;
|
use Icinga\Web\Widget\AlertMessageBox;
|
||||||
use Icinga\Web\Notification;
|
use Icinga\Web\Notification;
|
||||||
use Icinga\Application\Modules\Module;
|
use Icinga\Application\Modules\Module;
|
||||||
use \Icinga\Web\Url;
|
use Icinga\Web\Url;
|
||||||
use \Icinga\Application\Icinga;
|
use Icinga\Web\Widget;
|
||||||
use \Icinga\Application\Config as IcingaConfig;
|
use Icinga\Application\Icinga;
|
||||||
use \Icinga\Data\ResourceFactory;
|
use Icinga\Application\Config as IcingaConfig;
|
||||||
use \Icinga\Form\Config\GeneralForm;
|
use Icinga\Data\ResourceFactory;
|
||||||
use \Icinga\Form\Config\Authentication\ReorderForm;
|
use Icinga\Form\Config\GeneralForm;
|
||||||
use \Icinga\Form\Config\Authentication\LdapBackendForm;
|
use Icinga\Form\Config\Authentication\ReorderForm;
|
||||||
use \Icinga\Form\Config\Authentication\DbBackendForm;
|
use Icinga\Form\Config\Authentication\LdapBackendForm;
|
||||||
use \Icinga\Form\Config\ResourceForm;
|
use Icinga\Form\Config\Authentication\DbBackendForm;
|
||||||
use \Icinga\Form\Config\LoggingForm;
|
use Icinga\Form\Config\ResourceForm;
|
||||||
use \Icinga\Form\Config\ConfirmRemovalForm;
|
use Icinga\Form\Config\LoggingForm;
|
||||||
use \Icinga\Config\PreservingIniWriter;
|
use Icinga\Form\Config\ConfirmRemovalForm;
|
||||||
|
use Icinga\Config\PreservingIniWriter;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -158,8 +159,7 @@ class ConfigController extends BaseConfigController
|
||||||
$this->view->modules = Icinga::app()->getModuleManager()->select()
|
$this->view->modules = Icinga::app()->getModuleManager()->select()
|
||||||
->from('modules')
|
->from('modules')
|
||||||
->order('enabled', 'desc')
|
->order('enabled', 'desc')
|
||||||
->order('name');
|
->order('name')->paginate();
|
||||||
$this->render('module/overview');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function moduleAction()
|
public function moduleAction()
|
||||||
|
@ -168,11 +168,17 @@ class ConfigController extends BaseConfigController
|
||||||
$app = Icinga::app();
|
$app = Icinga::app();
|
||||||
$manager = $app->getModuleManager();
|
$manager = $app->getModuleManager();
|
||||||
if ($manager->hasInstalled($name)) {
|
if ($manager->hasInstalled($name)) {
|
||||||
|
$this->view->moduleData = Icinga::app()->getModuleManager()->select()
|
||||||
|
->from('modules')->where('name', $name)->fetchRow();
|
||||||
$module = new Module($app, $name, $manager->getModuleDir($name));
|
$module = new Module($app, $name, $manager->getModuleDir($name));
|
||||||
$this->view->module = $module;
|
$this->view->module = $module;
|
||||||
} else {
|
} else {
|
||||||
$this->view->module = false;
|
$this->view->module = false;
|
||||||
}
|
}
|
||||||
|
$this->view->tabs = Widget::create('tabs')->add('info', array(
|
||||||
|
'url' => Url::fromRequest(),
|
||||||
|
'title' => 'Module info'
|
||||||
|
))->activate('info');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -186,7 +192,10 @@ class ConfigController extends BaseConfigController
|
||||||
$manager->enableModule($module);
|
$manager->enableModule($module);
|
||||||
$manager->loadModule($module);
|
$manager->loadModule($module);
|
||||||
Notification::success('Module "' . $module . '" enabled');
|
Notification::success('Module "' . $module . '" enabled');
|
||||||
$this->redirectNow('config/modules_render=layout&_reload=css');
|
$this->redirectNow(Url::fromPath('config/modules', array(
|
||||||
|
'_render' => 'layout',
|
||||||
|
'_reload' => 'css'
|
||||||
|
)));
|
||||||
return;
|
return;
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->view->exceptionMesssage = $e->getMessage();
|
$this->view->exceptionMesssage = $e->getMessage();
|
||||||
|
@ -206,7 +215,10 @@ class ConfigController extends BaseConfigController
|
||||||
try {
|
try {
|
||||||
$manager->disableModule($module);
|
$manager->disableModule($module);
|
||||||
Notification::success('Module "' . $module . '" disabled');
|
Notification::success('Module "' . $module . '" disabled');
|
||||||
$this->redirectNow('config/modules?_render=layout&_reload=css');
|
$this->redirectNow(Url::fromPath('config/modules', array(
|
||||||
|
'_render' => 'layout',
|
||||||
|
'_reload' => 'css'
|
||||||
|
)));
|
||||||
return;
|
return;
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->view->exceptionMessage = $e->getMessage();
|
$this->view->exceptionMessage = $e->getMessage();
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
$dependencies = $module->getDependencies();
|
$dependencies = $module->getDependencies();
|
||||||
$restrictions = $module->getProvidedRestrictions();
|
$restrictions = $module->getProvidedRestrictions();
|
||||||
$permissions = $module->getProvidedPermissions();
|
$permissions = $module->getProvidedPermissions();
|
||||||
|
$state = $moduleData->enabled ? ($moduleData->loaded ? 'enabled' : 'failed') : 'disabled'
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<h1><?= $this->escape($module->getTitle()) ?></h1>
|
<h1><?= $this->escape($module->getTitle()) ?></h1>
|
||||||
|
@ -17,6 +18,19 @@ $permissions = $module->getProvidedPermissions();
|
||||||
<th><?= $this->escape('Name') ?></th>
|
<th><?= $this->escape('Name') ?></th>
|
||||||
<td><?= $this->escape($module->getName()) ?></td>
|
<td><?= $this->escape($module->getName()) ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th><?= $this->translate('State') ?></th>
|
||||||
|
<td><?= $state ?><?php if ($state === 'enabled'): ?>
|
||||||
|
<?= $this->qlink('disable', 'config/moduledisable', array(
|
||||||
|
'name' => $module->getName()
|
||||||
|
)) ?>
|
||||||
|
<?php endif ?>
|
||||||
|
<?php if ($state === 'disabled'): ?>
|
||||||
|
<?= $this->qlink('enable', 'config/moduleenable', array(
|
||||||
|
'name' => $module->getName()
|
||||||
|
)) ?>
|
||||||
|
<?php endif ?>
|
||||||
|
</td>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?= $this->escape('Version') ?></th>
|
<th><?= $this->escape('Version') ?></th>
|
||||||
<td><?= $this->escape($module->getVersion()) ?></td></tr>
|
<td><?= $this->escape($module->getVersion()) ?></td></tr>
|
||||||
|
|
|
@ -1,25 +1,10 @@
|
||||||
<?php
|
|
||||||
use Icinga\Web\Url;
|
|
||||||
|
|
||||||
$this->modules->limit(10);
|
|
||||||
$modules = $this->modules->paginate();
|
|
||||||
|
|
||||||
?>
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<?= $this->tabs->render($this); ?>
|
<?= $this->tabs ?>
|
||||||
|
<h1>Installed Modules</h1>
|
||||||
|
<?= $this->paginationControl($modules) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<h3>Installed Modules</h3>
|
|
||||||
|
|
||||||
<?php if (isset($this->messageBox)): ?>
|
|
||||||
<?= $this->messageBox->render() ?>
|
|
||||||
<?php endif ?>
|
|
||||||
|
|
||||||
<?= $this->paginationControl($modules, null, null, array(
|
|
||||||
'preserve' => $this->preserve
|
|
||||||
));
|
|
||||||
?>
|
|
||||||
<table class="action" data-base-target="_next">
|
<table class="action" data-base-target="_next">
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($modules as $module): ?>
|
<?php foreach ($modules as $module): ?>
|
||||||
|
@ -30,9 +15,12 @@ $modules = $this->modules->paginate();
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<?= $this->icon('remove.png', 'Module is disabled') ?>
|
<?= $this->icon('remove.png', 'Module is disabled') ?>
|
||||||
<? endif ?>
|
<? endif ?>
|
||||||
<a href="<?= $this->url('config/module/', array('name' => $module->name)) ?>"><?= $this->escape($module->name); ?></a>
|
<a href="<?= $this->url(
|
||||||
(<?=
|
'config/module/',
|
||||||
$module->enabled ? ($module->loaded ? 'enabled' : 'failed') : 'disabled' ?>)
|
array('name' => $module->name)
|
||||||
|
) ?>"><?= $this->escape($module->name); ?></a> (<?=
|
||||||
|
$module->enabled ? ($module->loaded ? 'enabled' : 'failed') : 'disabled'
|
||||||
|
?>)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<? endforeach ?>
|
<? endforeach ?>
|
||||||
|
|
|
@ -57,6 +57,15 @@ class ArrayDatasource implements Selectable
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function fetchRow(SimpleQuery $query)
|
||||||
|
{
|
||||||
|
$result = $this->getResult($query);
|
||||||
|
if (empty($result)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $result[0];
|
||||||
|
}
|
||||||
|
|
||||||
public function fetchAll(SimpleQuery $query)
|
public function fetchAll(SimpleQuery $query)
|
||||||
{
|
{
|
||||||
return $this->getResult($query);
|
return $this->getResult($query);
|
||||||
|
|
|
@ -71,7 +71,6 @@
|
||||||
|
|
||||||
icinga.logger.debug('Pushing current state to history');
|
icinga.logger.debug('Pushing current state to history');
|
||||||
var url = '';
|
var url = '';
|
||||||
var blacklist = ['_render', '_reload'];
|
|
||||||
|
|
||||||
// We only store URLs of containers sitting directly under #main:
|
// We only store URLs of containers sitting directly under #main:
|
||||||
$('#main > .container').each(function (idx, container) {
|
$('#main > .container').each(function (idx, container) {
|
||||||
|
@ -90,7 +89,7 @@
|
||||||
|
|
||||||
// Did we find any URL? Then push it!
|
// Did we find any URL? Then push it!
|
||||||
if (url !== '') {
|
if (url !== '') {
|
||||||
window.history.pushState({icinga: true}, null, url);
|
window.history.pushState({icinga: true}, null, this.cleanupUrl(url));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -99,7 +98,13 @@
|
||||||
if (!this.enabled) {
|
if (!this.enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.history.pushState({icinga: true}, null, url);
|
window.history.pushState({icinga: true}, null, this.cleanupUrl(url));
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanupUrl: function(url) {
|
||||||
|
url = url.replace(/_render=[a-z0-9]+&/, '').replace(/&_render=[a-z0-9]+/, '').replace(/\?_render=[a-z0-9]+$/, '');
|
||||||
|
url = url.replace(/_reload=[a-z0-9]+&/, '').replace(/&_reload=[a-z0-9]+/, '').replace(/\?_reload=[a-z0-9]+$/, '');
|
||||||
|
return url;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -343,6 +343,9 @@
|
||||||
delete this.requests[req.$target.attr('id')];
|
delete this.requests[req.$target.attr('id')];
|
||||||
|
|
||||||
req.$target = $('#' + target);
|
req.$target = $('#' + target);
|
||||||
|
|
||||||
|
// We assume target === 'layout' right now. This might not be correct
|
||||||
|
this.icinga.ui.layout1col();
|
||||||
newBody = true;
|
newBody = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue