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 %}
-
+
- | |
- |
- |
- {{ 'rule_name'|_ }} |
- {{ 'rule_triggers'|_ }} |
- {{ 'rule_actions'|_ }} |
+ |
+ |
+ |
+ {{ 'rule_name'|_ }} |
+ {{ 'rule_triggers'|_ }} |
+ {{ 'rule_actions'|_ }} |
-
+
{% for rule in ruleGroup.rules %}
-
+
|
|
@@ -144,7 +147,7 @@
|
{% if rule.ruleTriggers.count > 0 %}
-
+
{% for trigger in rule.ruleTriggers %}
{% if trigger.trigger_type != "user_action" %}
-
{% if rule.ruleActions.count > 0 %}
-
+
{% for action in rule.ruleActions %}
- 'Rule\IndexController@index', 'as' => 'index']);
- Route::get('up/{rule}', ['uses' => 'Rule\IndexController@up', 'as' => 'up']);
- Route::get('down/{rule}', ['uses' => 'Rule\IndexController@down', 'as' => 'down']);
+
+ //Route::get('up/{rule}', ['uses' => 'Rule\IndexController@up', 'as' => 'up']);
+ //Route::get('down/{rule}', ['uses' => 'Rule\IndexController@down', 'as' => 'down']);
+ Route::post('move-rule/{rule}/{ruleGroup}', ['uses' => 'Rule\IndexController@moveRule', 'as' => 'move-rule']);
+
+
Route::post('trigger/order/{rule}', ['uses' => 'Rule\IndexController@reorderRuleTriggers', 'as' => 'reorder-triggers']);
Route::post('action/order/{rule}', ['uses' => 'Rule\IndexController@reorderRuleActions', 'as' => 'reorder-actions']);
| |