From c804177ca4e0851d510633b46cbce8b34b526f7d Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 20 Dec 2018 10:56:05 +0100 Subject: [PATCH] Also save user defined order of processes nodes while in tree view --- application/controllers/ProcessController.php | 7 +++- .../Businessprocess/Renderer/TreeRenderer.php | 37 ++++++++++++++----- public/js/module.js | 21 +++++++++++ 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/application/controllers/ProcessController.php b/application/controllers/ProcessController.php index 6ba5168..73e0e8d 100644 --- a/application/controllers/ProcessController.php +++ b/application/controllers/ProcessController.php @@ -251,12 +251,17 @@ class ProcessController extends Controller ->setSimulation(Simulation::fromSession($this->session())) ->handleRequest(); } elseif ($action === 'move') { + $url = Url::fromRequest()->without(['action', 'movenode']); + if ($url->getParam('mode') === 'tree') { + $url = $url->without('node'); + } + $form = $this->loadForm('MoveNode') ->setProcess($bp) ->setParentNode($node) ->setSession($this->session()) ->setNode($bp->getNode($this->params->get('movenode'))) - ->setSuccessUrl(Url::fromRequest()->without(['action', 'movenode'])) + ->setSuccessUrl($url) ->handleRequest(); } diff --git a/library/Businessprocess/Renderer/TreeRenderer.php b/library/Businessprocess/Renderer/TreeRenderer.php index 9fc27b8..86594fa 100644 --- a/library/Businessprocess/Renderer/TreeRenderer.php +++ b/library/Businessprocess/Renderer/TreeRenderer.php @@ -5,6 +5,7 @@ namespace Icinga\Module\Businessprocess\Renderer; use Icinga\Module\Businessprocess\BpNode; use Icinga\Module\Businessprocess\BpConfig; use Icinga\Module\Businessprocess\Node; +use Icinga\Module\Businessprocess\Web\Form\CsrfToken; use ipl\Html\BaseHtmlElement; use ipl\Html\Html; @@ -19,8 +20,13 @@ class TreeRenderer extends Renderer $this->add(Html::tag( 'div', [ - 'id' => $bp->getHtmlId(), - 'class' => 'bp' + 'id' => $bp->getHtmlId(), + 'class' => ['bp', 'sortable'], + 'data-sortable-disabled' => $this->isLocked(), + 'data-sortable-data-id-attr' => 'id', + 'data-sortable-direction' => 'vertical', + 'data-csrf-token' => CsrfToken::generate(), + 'data-action-url' => $this->getUrl()->getAbsoluteUrl() ], $this->renderBp($bp) )); @@ -103,11 +109,9 @@ class TreeRenderer extends Renderer $table = Html::tag( 'table', [ - 'id' => $this->getId($node, $path), - 'class' => array( - 'bp', - $node->getObjectClassName() - ) + 'id' => $this->getId($node, $path), + 'class' => ['bp', $node->getObjectClassName()], + 'data-node-name' => $node->getName() ] ); $attributes = $table->getAttributes(); @@ -121,7 +125,17 @@ class TreeRenderer extends Renderer $attributes->add('class', 'node'); } - $tbody = Html::tag('tbody'); + $tbody = Html::tag('tbody', [ + 'class' => 'sortable', + 'data-sortable-disabled' => $this->isLocked(), + 'data-sortable-data-id-attr' => 'id', + 'data-sortable-draggable' => '.movable', + 'data-sortable-direction' => 'vertical', + 'data-csrf-token' => CsrfToken::generate(), + 'data-action-url' => $this->getUrl() + ->overwriteParams(['node' => (string) $node]) + ->getAbsoluteUrl() + ]); $table->add($tbody); $tr = Html::tag('tr'); $tbody->add($tr); @@ -161,10 +175,15 @@ class TreeRenderer extends Renderer $td->add($link); + $path[] = (string) $node; foreach ($node->getChildren() as $name => $child) { $tbody->add(Html::tag( 'tr', - null, + [ + 'class' => 'movable', + 'id' => $this->getId($child, $path), + 'data-node-name' => $name + ], Html::tag( 'td', null, diff --git a/public/js/module.js b/public/js/module.js index 4240811..f3856c9 100644 --- a/public/js/module.js +++ b/public/js/module.js @@ -36,6 +36,7 @@ this.module.on('click', 'div.tiles > div', this.tileClick); this.module.on('click', '.dashboard-tile', this.dashboardTileClick); this.module.on('end', 'div.tiles.sortable', this.tileDropped); + this.module.on('end', 'div.bp.sortable, table.bp tbody.sortable', this.rowDropped); this.module.icinga.logger.debug('BP module initialized'); }, @@ -116,6 +117,26 @@ } }, + rowDropped: function(event) { + var evt = event.originalEvent; + if (evt.oldIndex !== evt.newIndex) { + var $target = $(evt.to); + var actionUrl = icinga.utils.addUrlParams($target.data('actionUrl'), { + action: 'move', + movenode: $(evt.item).data('nodeName') + }); + + var data = { + csrfToken: $target.data('csrfToken'), + movenode: 'movenode', // That's the submit button.. + from: evt.oldIndex, + to: evt.newIndex + }; + + icinga.loader.loadUrl(actionUrl, $target.closest('.container'), data, 'post'); + } + }, + /** * Add 'hovered' class to hovered title elements *