From 5a03f3395cc45b71ddbb842137eb4451812731fb Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 26 Jun 2020 07:28:25 +0200 Subject: [PATCH] Fix #3440 --- app/Http/Controllers/Rule/IndexController.php | 32 +++-------- app/Repositories/Rule/RuleRepository.php | 14 +++++ .../Rule/RuleRepositoryInterface.php | 9 +++ public/v1/css/firefly.css | 3 + public/v1/js/ff/rules/index.js | 55 ++++++++++--------- resources/views/v1/rules/index.twig | 25 +++++---- routes/web.php | 8 ++- 7 files changed, 83 insertions(+), 63 deletions(-) diff --git a/app/Http/Controllers/Rule/IndexController.php b/app/Http/Controllers/Rule/IndexController.php index 0ed7cfa29c..9c872b1544 100644 --- a/app/Http/Controllers/Rule/IndexController.php +++ b/app/Http/Controllers/Rule/IndexController.php @@ -24,15 +24,14 @@ namespace FireflyIII\Http\Controllers\Rule; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Rule; +use FireflyIII\Models\RuleGroup; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Support\Http\Controllers\RuleManagement; use FireflyIII\User; use Illuminate\Contracts\View\Factory; use Illuminate\Http\JsonResponse; -use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Routing\Redirector; use Illuminate\View\View; /** @@ -66,20 +65,6 @@ class IndexController extends Controller ); } - /** - * Move rule down in list. - * - * @param Rule $rule - * - * @return RedirectResponse|Redirector - */ - public function down(Rule $rule) - { - $this->ruleRepos->moveDown($rule); - - return redirect(route('rules.index')); - } - /** * Index of all rules and groups. * @@ -135,17 +120,18 @@ class IndexController extends Controller /** - * Move rule ip. + * @param Request $request + * @param Rule $rule + * @param RuleGroup $ruleGroup * - * @param Rule $rule - * - * @return RedirectResponse|Redirector + * @return JsonResponse */ - public function up(Rule $rule) + public function moveRule(Request $request, Rule $rule, RuleGroup $ruleGroup): JsonResponse { - $this->ruleRepos->moveUp($rule); + $order = (int) $request->get('order'); + $this->ruleRepos->moveRule($rule, $ruleGroup, (int) $order); - return redirect(route('rules.index')); + return response()->json([]); } } diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 503da28791..cb39e7d1e6 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -483,4 +483,18 @@ class RuleRepository implements RuleRepositoryInterface return $newRule; } + + /** + * @inheritDoc + */ + public function moveRule(Rule $rule, RuleGroup $ruleGroup, int $order): Rule + { + $rule->order = $order; + if ($rule->rule_group_id !== $ruleGroup->id) { + $rule->rule_group_id = $ruleGroup->id; + } + $rule->save(); + + return $rule; + } } diff --git a/app/Repositories/Rule/RuleRepositoryInterface.php b/app/Repositories/Rule/RuleRepositoryInterface.php index dc8e96b9a1..a42e861126 100644 --- a/app/Repositories/Rule/RuleRepositoryInterface.php +++ b/app/Repositories/Rule/RuleRepositoryInterface.php @@ -39,6 +39,15 @@ interface RuleRepositoryInterface */ public function count(): int; + /** + * @param Rule $rule + * @param RuleGroup $ruleGroup + * @param int $order + * + * @return Rule + */ + public function moveRule(Rule $rule, RuleGroup $ruleGroup, int $order): Rule; + /** * @param Rule $rule * diff --git a/public/v1/css/firefly.css b/public/v1/css/firefly.css index c08a5641fa..c4f3ba3cbf 100644 --- a/public/v1/css/firefly.css +++ b/public/v1/css/firefly.css @@ -90,6 +90,9 @@ p.tagcloud .label { .piggy-handle { cursor: move; } +.rule-handle { + cursor: move; +} body.waiting * { cursor: progress; diff --git a/public/v1/js/ff/rules/index.js b/public/v1/js/ff/rules/index.js index ce4c437e46..2b49866b1f 100644 --- a/public/v1/js/ff/rules/index.js +++ b/public/v1/js/ff/rules/index.js @@ -31,18 +31,11 @@ var fixHelper = function (e, tr) { $(function () { "use strict"; - $('.rule-triggers').sortable( - { - helper: fixHelper, - stop: sortStop, - cursor: "move" - } - ); - - $('.rule-actions').sortable( + $('.group-rules').find('tbody').sortable( { helper: fixHelper, stop: sortStop, + handle: '.rule-handle', cursor: "move" } @@ -102,27 +95,35 @@ function disableRuleSpinners() { function sortStop(event, ui) { "use strict"; - var current = $(ui.item); - var parent = current.parent(); - var ruleId = current.parent().data('id'); - var entries = []; - // who am i? - $.each(parent.children(), function (i, v) { - var trigger = $(v); - var id = trigger.data('id'); - entries.push(id); + // resort / move rule + $.each($('.group-rules'), function(i,v) { + $.each($('tr.single-rule', $(v)), function (i, v) { + var holder = $(v); + var position = parseInt(holder.data('position')); + var ruleGroupId = holder.data('group-id'); + var ruleId = holder.data('id'); + var originalOrder = parseInt(holder.data('order')); + var newOrder; + if (position === i) { + // not changed, position is what it should be. + return; + } + if (position < i) { + // position is less. + console.log('Rule #' + ruleId + ' moved down from position ' + originalOrder + ' to ' + (i + 1)); + } + if (position > i) { + console.log('Rule #' + ruleId + ' moved up from position ' + originalOrder + ' to ' + (i + 1)); + } + // update position: + holder.data('position', i); + newOrder = i+1; + + $.post('rules/move-rule/' + ruleId + '/' + ruleGroupId, {order: newOrder, _token: token}); + }); }); - if (parent.hasClass('rule-triggers')) { - $.post('rules/trigger/order/' + ruleId, {triggers: entries, _token: token}).fail(function () { - alert('Could not re-order rule triggers. Please refresh the page.'); - }); - } else { - $.post('rules/action/order/' + ruleId, {actions: entries, _token: token}).fail(function () { - alert('Could not re-order rule actions. Please refresh the page.'); - }); - } } diff --git a/resources/views/v1/rules/index.twig b/resources/views/v1/rules/index.twig index 61c8863a3c..84fc6e67c9 100644 --- a/resources/views/v1/rules/index.twig +++ b/resources/views/v1/rules/index.twig @@ -56,22 +56,23 @@

{% if ruleGroup.rules.count > 0 %} - +
- - - - - - + + + + + + - + {% for rule in ruleGroup.rules %} - +
   {{ 'rule_name'|_ }}   {{ 'rule_name'|_ }}
+ {# {% if rule.order > 1 %} {% endif %} + #} +
@@ -144,7 +147,7 @@