diff --git a/application/controllers/CommentsController.php b/application/controllers/CommentsController.php index 78227003..b1995f63 100644 --- a/application/controllers/CommentsController.php +++ b/application/controllers/CommentsController.php @@ -5,6 +5,7 @@ namespace Icinga\Module\Icingadb\Controllers; use GuzzleHttp\Psr7\ServerRequest; +use Icinga\Module\Icingadb\Common\CommandActions; use Icinga\Module\Icingadb\Common\Links; use Icinga\Module\Icingadb\Forms\Command\Object\DeleteCommentForm; use Icinga\Module\Icingadb\Model\Comment; @@ -13,12 +14,17 @@ use Icinga\Module\Icingadb\Web\Controller; use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher; use Icinga\Module\Icingadb\Widget\ItemList\ObjectList; use Icinga\Module\Icingadb\Widget\ShowMore; +use ipl\Orm\Model; +use ipl\Orm\Query; +use ipl\Stdlib\Filter; use ipl\Web\Control\LimitControl; use ipl\Web\Control\SortControl; use ipl\Web\Url; class CommentsController extends Controller { + use CommandActions; + public function indexAction() { $this->addTitleTab(t('Comments')); @@ -107,34 +113,9 @@ class CommentsController extends Controller public function deleteAction() { + $this->assertIsGrantedOnCommandTargets('icingadb/command/comment/delete'); $this->setTitle(t('Remove Comments')); - - $db = $this->getDb(); - - $comments = Comment::on($db)->with([ - 'host', - 'host.state', - 'service', - 'service.host', - 'service.host.state', - 'service.state' - ]); - - $this->filter($comments); - - $form = (new DeleteCommentForm()) - ->setObjects($comments) - ->setRedirectUrl(Links::comments()->getAbsoluteUrl()) - ->on(DeleteCommentForm::ON_SUCCESS, function ($form) { - // This forces the column to reload nearly instantly after the redirect - // and ensures the effect of the command is visible to the user asap - $this->getResponse()->setAutoRefreshInterval(1); - - $this->redirectNow($form->getRedirectUrl()); - }) - ->handleRequest(ServerRequest::fromGlobals()); - - $this->addContent($form); + $this->handleCommandForm(DeleteCommentForm::class); } public function detailsAction() @@ -202,4 +183,36 @@ class CommentsController extends Controller $this->getDocument()->add($editor); $this->setTitle(t('Adjust Filter')); } + + protected function getCommandTargetsUrl(): Url + { + return Url::fromPath('__CLOSE__'); + } + + protected function fetchCommandTargets(): Query + { + $comments = Comment::on($this->getDb())->with([ + 'host', + 'host.state', + 'service', + 'service.host', + 'service.host.state', + 'service.state' + ]); + + $this->filter($comments); + + return $comments; + } + + public function isGrantedOn(string $permission, Model $object): bool + { + return parent::isGrantedOn($permission, $object->{$object->object_type}); + } + + public function isGrantedOnType(string $permission, string $type, Filter\Rule $filter, bool $cache = true): bool + { + return parent::isGrantedOnType($permission, 'host', $filter, $cache) + || parent::isGrantedOnType($permission, 'service', $filter, $cache); + } } diff --git a/application/forms/Command/Object/DeleteCommentForm.php b/application/forms/Command/Object/DeleteCommentForm.php index a35fc2e5..c6bc7d84 100644 --- a/application/forms/Command/Object/DeleteCommentForm.php +++ b/application/forms/Command/Object/DeleteCommentForm.php @@ -9,15 +9,12 @@ use Icinga\Module\Icingadb\Command\Object\DeleteCommentCommand; use Icinga\Module\Icingadb\Forms\Command\CommandForm; use Icinga\Web\Notification; use ipl\Orm\Model; -use ipl\Web\Common\RedirectOption; use ipl\Web\Widget\Icon; use Iterator; use Traversable; class DeleteCommentForm extends CommandForm { - use RedirectOption; - protected $defaultAttributes = ['class' => 'inline']; public function __construct() @@ -38,7 +35,6 @@ class DeleteCommentForm extends CommandForm protected function assembleElements() { - $this->addElement($this->createRedirectOption()); } protected function assembleSubmitButton() diff --git a/doc/09-Automation.md b/doc/09-Automation.md index f5141882..1c5ac4ac 100644 --- a/doc/09-Automation.md +++ b/doc/09-Automation.md @@ -131,6 +131,16 @@ Please have a look at the [Monitoring Plugins Development Guidelines](https://ww | expire | n | BoolEnum | - | | expire_time | y | DateTime | expire | +### Delete Comments + +#### Routes + +* icingadb/comments/delete + +#### Options + +None. + ### Check Now #### Routes diff --git a/library/Icingadb/Widget/Detail/CommentDetail.php b/library/Icingadb/Widget/Detail/CommentDetail.php index 5b0923e4..4255f61b 100644 --- a/library/Icingadb/Widget/Detail/CommentDetail.php +++ b/library/Icingadb/Widget/Detail/CommentDetail.php @@ -114,7 +114,6 @@ class CommentDetail extends BaseHtmlElement return (new DeleteCommentForm()) ->setObjects([$this->comment]) - ->populate(['redirect' => '__BACK__']) ->setAction($action->getAbsoluteUrl()); }