mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-12 15:35:15 +00:00
Fix #3440
This commit is contained in:
@@ -24,15 +24,14 @@ namespace FireflyIII\Http\Controllers\Rule;
|
|||||||
|
|
||||||
use FireflyIII\Http\Controllers\Controller;
|
use FireflyIII\Http\Controllers\Controller;
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
|
use FireflyIII\Models\RuleGroup;
|
||||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||||
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
|
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
|
||||||
use FireflyIII\Support\Http\Controllers\RuleManagement;
|
use FireflyIII\Support\Http\Controllers\RuleManagement;
|
||||||
use FireflyIII\User;
|
use FireflyIII\User;
|
||||||
use Illuminate\Contracts\View\Factory;
|
use Illuminate\Contracts\View\Factory;
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Routing\Redirector;
|
|
||||||
use Illuminate\View\View;
|
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.
|
* 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 JsonResponse
|
||||||
*
|
|
||||||
* @return RedirectResponse|Redirector
|
|
||||||
*/
|
*/
|
||||||
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([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -483,4 +483,18 @@ class RuleRepository implements RuleRepositoryInterface
|
|||||||
|
|
||||||
return $newRule;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,15 @@ interface RuleRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function count(): int;
|
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
|
* @param Rule $rule
|
||||||
*
|
*
|
||||||
|
3
public/v1/css/firefly.css
vendored
3
public/v1/css/firefly.css
vendored
@@ -90,6 +90,9 @@ p.tagcloud .label {
|
|||||||
.piggy-handle {
|
.piggy-handle {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
|
.rule-handle {
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
body.waiting * {
|
body.waiting * {
|
||||||
cursor: progress;
|
cursor: progress;
|
||||||
|
55
public/v1/js/ff/rules/index.js
vendored
55
public/v1/js/ff/rules/index.js
vendored
@@ -31,18 +31,11 @@ var fixHelper = function (e, tr) {
|
|||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
$('.rule-triggers').sortable(
|
$('.group-rules').find('tbody').sortable(
|
||||||
{
|
|
||||||
helper: fixHelper,
|
|
||||||
stop: sortStop,
|
|
||||||
cursor: "move"
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
$('.rule-actions').sortable(
|
|
||||||
{
|
{
|
||||||
helper: fixHelper,
|
helper: fixHelper,
|
||||||
stop: sortStop,
|
stop: sortStop,
|
||||||
|
handle: '.rule-handle',
|
||||||
cursor: "move"
|
cursor: "move"
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -102,27 +95,35 @@ function disableRuleSpinners() {
|
|||||||
|
|
||||||
function sortStop(event, ui) {
|
function sortStop(event, ui) {
|
||||||
"use strict";
|
"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) {
|
// resort / move rule
|
||||||
var trigger = $(v);
|
$.each($('.group-rules'), function(i,v) {
|
||||||
var id = trigger.data('id');
|
$.each($('tr.single-rule', $(v)), function (i, v) {
|
||||||
entries.push(id);
|
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.');
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -56,22 +56,23 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
{% if ruleGroup.rules.count > 0 %}
|
{% if ruleGroup.rules.count > 0 %}
|
||||||
<table class="table table-hover table-striped">
|
<table class="table table-hover table-striped group-rules">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th> </th>
|
<th style="width:5%;"> </th>
|
||||||
<th> </th>
|
<th style="width:10%;"> </th>
|
||||||
<th> </th>
|
<th style="width:10%;"> </th>
|
||||||
<th>{{ 'rule_name'|_ }}</th>
|
<th style="width:25%;">{{ 'rule_name'|_ }}</th>
|
||||||
<th class="hidden-xs">{{ 'rule_triggers'|_ }}</th>
|
<th style="width:25%;" class="hidden-xs">{{ 'rule_triggers'|_ }}</th>
|
||||||
<th class="hidden-xs">{{ 'rule_actions'|_ }}</th>
|
<th style="width:25%;" class="hidden-xs">{{ 'rule_actions'|_ }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody class="rule-connected-list">
|
||||||
{% for rule in ruleGroup.rules %}
|
{% for rule in ruleGroup.rules %}
|
||||||
<tr>
|
<tr class="single-rule" data-order="{{ rule.order }}" data-id="{{ rule.id }}" data-group-id="{{ ruleGroup.id }}" data-position="{{ loop.index0 }}">
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-group btn-group-xs prio_buttons">
|
<div class="btn-group btn-group-xs prio_buttons">
|
||||||
|
{#
|
||||||
{% if rule.order > 1 %}
|
{% if rule.order > 1 %}
|
||||||
<a title="{{ 'rule_priority_up'|_ }}"
|
<a title="{{ 'rule_priority_up'|_ }}"
|
||||||
href="{{ route('rules.up', rule.id) }}"
|
href="{{ route('rules.up', rule.id) }}"
|
||||||
@@ -91,6 +92,8 @@
|
|||||||
<button disabled="disabled" class="btn btn-default"><span
|
<button disabled="disabled" class="btn btn-default"><span
|
||||||
class="fa fa-fw"></span></button>
|
class="fa fa-fw"></span></button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
#}
|
||||||
|
<i class="fa fa-fw fa-bars rule-handle"></i>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -144,7 +147,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="hidden-xs">
|
<td class="hidden-xs">
|
||||||
{% if rule.ruleTriggers.count > 0 %}
|
{% if rule.ruleTriggers.count > 0 %}
|
||||||
<ul class="small rule-triggers" data-id="{{ rule.id }}">
|
<ul class="small" data-id="{{ rule.id }}">
|
||||||
{% for trigger in rule.ruleTriggers %}
|
{% for trigger in rule.ruleTriggers %}
|
||||||
{% if trigger.trigger_type != "user_action" %}
|
{% if trigger.trigger_type != "user_action" %}
|
||||||
<li
|
<li
|
||||||
@@ -164,7 +167,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="hidden-xs">
|
<td class="hidden-xs">
|
||||||
{% if rule.ruleActions.count > 0 %}
|
{% if rule.ruleActions.count > 0 %}
|
||||||
<ul class="small rule-actions" data-id="{{ rule.id }}">
|
<ul class="small" data-id="{{ rule.id }}">
|
||||||
{% for action in rule.ruleActions %}
|
{% for action in rule.ruleActions %}
|
||||||
<li
|
<li
|
||||||
{% if not rule.active %}
|
{% if not rule.active %}
|
||||||
|
@@ -923,8 +923,12 @@ Route::group(
|
|||||||
|
|
||||||
// index controller
|
// index controller
|
||||||
Route::get('', ['uses' => 'Rule\IndexController@index', 'as' => 'index']);
|
Route::get('', ['uses' => '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('trigger/order/{rule}', ['uses' => 'Rule\IndexController@reorderRuleTriggers', 'as' => 'reorder-triggers']);
|
||||||
Route::post('action/order/{rule}', ['uses' => 'Rule\IndexController@reorderRuleActions', 'as' => 'reorder-actions']);
|
Route::post('action/order/{rule}', ['uses' => 'Rule\IndexController@reorderRuleActions', 'as' => 'reorder-actions']);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user