mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-10 23:45:48 -06:00
User can now re-order triggers and actions.
This commit is contained in:
parent
b9b0413510
commit
81b9d5da09
@ -18,6 +18,7 @@ use FireflyIII\Models\RuleGroup;
|
||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||
use Input;
|
||||
use Preferences;
|
||||
use Response;
|
||||
use Session;
|
||||
use URL;
|
||||
use View;
|
||||
@ -168,11 +169,11 @@ class RuleController extends Controller
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function destroyRuleGroup(RuleGroup $ruleGroup, RuleRepositoryInterface $repository)
|
||||
public function destroyRuleGroup(RuleRepositoryInterface $repository, RuleGroup $ruleGroup)
|
||||
{
|
||||
|
||||
$title = $ruleGroup->title;
|
||||
$moveTo = Auth::user()->ruleGroups()->find(intval(Input::get('move_rules_before_delete')));
|
||||
$title = $ruleGroup->title;
|
||||
$moveTo = Auth::user()->ruleGroups()->find(intval(Input::get('move_rules_before_delete')));
|
||||
|
||||
$repository->destroyRuleGroup($ruleGroup, $moveTo);
|
||||
|
||||
@ -184,16 +185,61 @@ class RuleController extends Controller
|
||||
return redirect(Session::get('rules.rule-group.delete.url'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param RuleRepositoryInterface $repository
|
||||
* @param Rule $rule
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function reorderRuleTriggers(RuleRepositoryInterface $repository, Rule $rule)
|
||||
{
|
||||
$ids = Input::get('triggers');
|
||||
if (is_array($ids)) {
|
||||
$repository->reorderRuleTriggers($rule, $ids);
|
||||
}
|
||||
|
||||
return Response::json(true);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param RuleRepositoryInterface $repository
|
||||
* @param Rule $rule
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function reorderRuleActions(RuleRepositoryInterface $repository, Rule $rule)
|
||||
{
|
||||
$ids = Input::get('actions');
|
||||
if (is_array($ids)) {
|
||||
$repository->reorderRuleActions($rule, $ids);
|
||||
}
|
||||
|
||||
return Response::json(true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$ruleGroups = Auth::user()->ruleGroups()->orderBy('order','ASC') ->with(['rules' => function ($query) {
|
||||
$query->orderBy('order', 'ASC');
|
||||
$ruleGroups = Auth::user()
|
||||
->ruleGroups()
|
||||
->orderBy('order', 'ASC')
|
||||
->with(
|
||||
[
|
||||
'rules' => function ($query) {
|
||||
$query->orderBy('order', 'ASC');
|
||||
|
||||
}])->get();
|
||||
},
|
||||
'rules.ruleTriggers' => function ($query) {
|
||||
$query->orderBy('order', 'ASC');
|
||||
},
|
||||
'rules.ruleActions' => function ($query) {
|
||||
$query->orderBy('order', 'ASC');
|
||||
},
|
||||
]
|
||||
)->get();
|
||||
|
||||
return view('rules.index', compact('ruleGroups'));
|
||||
}
|
||||
|
@ -242,6 +242,10 @@ Route::group(
|
||||
Route::get('/rules/rules/edit/{rule}', ['uses' => 'RuleController@editRule', 'as' => 'rules.rule.edit']);
|
||||
Route::get('/rules/rules/delete/{rule}', ['uses' => 'RuleController@deleteRule', 'as' => 'rules.rule.delete']);
|
||||
|
||||
Route::post('/rules/rules/trigger/reorder/{rule}', ['uses' => 'RuleController@reorderRuleTriggers']);
|
||||
Route::post('/rules/rules/action/reorder/{rule}', ['uses' => 'RuleController@reorderRuleActions']);
|
||||
|
||||
|
||||
// rule groups:
|
||||
Route::get('/rules/groups/create', ['uses' => 'RuleController@createRuleGroup', 'as' => 'rules.rule-group.create']);
|
||||
Route::get('/rules/groups/edit/{ruleGroup}', ['uses' => 'RuleController@editRuleGroup', 'as' => 'rules.rule-group.edit']);
|
||||
|
@ -12,6 +12,7 @@ namespace FireflyIII\Repositories\Rule;
|
||||
use Auth;
|
||||
use FireflyIII\Models\Rule;
|
||||
use FireflyIII\Models\RuleGroup;
|
||||
use FireflyIII\Models\RuleTrigger;
|
||||
use Illuminate\Support\Collection;
|
||||
use Log;
|
||||
|
||||
@ -76,6 +77,48 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
return $ruleGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Rule $rule
|
||||
* @param array $ids
|
||||
* @return bool
|
||||
*/
|
||||
public function reorderRuleTriggers(Rule $rule, array $ids)
|
||||
{
|
||||
$order = 1;
|
||||
foreach ($ids as $triggerId) {
|
||||
/** @var RuleTrigger $trigger */
|
||||
$trigger = $rule->ruleTriggers()->find($triggerId);
|
||||
if (!is_null($trigger)) {
|
||||
$trigger->order = $order;
|
||||
$trigger->save();
|
||||
$order++;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Rule $rule
|
||||
* @param array $ids
|
||||
* @return bool
|
||||
*/
|
||||
public function reorderRuleActions(Rule $rule, array $ids)
|
||||
{
|
||||
$order = 1;
|
||||
foreach ($ids as $actionId) {
|
||||
/** @var RuleTrigger $trigger */
|
||||
$action = $rule->ruleActions()->find($actionId);
|
||||
if (!is_null($action)) {
|
||||
$action->order = $order;
|
||||
$action->save();
|
||||
$order++;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param RuleGroup $ruleGroup
|
||||
* @param RuleGroup $moveTo
|
||||
|
@ -50,6 +50,20 @@ interface RuleRepositoryInterface
|
||||
*/
|
||||
public function destroyRuleGroup(RuleGroup $ruleGroup, RuleGroup $moveTo = null);
|
||||
|
||||
/**
|
||||
* @param Rule $rule
|
||||
* @param array $ids
|
||||
* @return bool
|
||||
*/
|
||||
public function reorderRuleTriggers(Rule $rule, array $ids);
|
||||
|
||||
/**
|
||||
* @param Rule $rule
|
||||
* @param array $ids
|
||||
* @return bool
|
||||
*/
|
||||
public function reorderRuleActions(Rule $rule, array $ids);
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
|
@ -80,11 +80,6 @@ class ChangesForV370 extends Migration
|
||||
$table->string('trigger_type', 50);
|
||||
$table->string('trigger_value', 255)->nullable();
|
||||
|
||||
|
||||
|
||||
// order must be unique for rule triggers:
|
||||
$table->unique(['rule_id', 'order']);
|
||||
|
||||
// connect rule triggers to rules
|
||||
$table->foreign('rule_id')->references('id')->on('rules')->onDelete('cascade');
|
||||
}
|
||||
@ -103,15 +98,9 @@ class ChangesForV370 extends Migration
|
||||
$table->string('action_type', 50);
|
||||
$table->string('action_value', 255)->nullable();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// connect rule actions to rules
|
||||
$table->foreign('rule_id')->references('id')->on('rules')->onDelete('cascade');
|
||||
|
||||
// order must be unique for rule triggers:
|
||||
$table->unique(['rule_id', 'order']);
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -16,4 +16,8 @@
|
||||
.login-box {width:600px;}
|
||||
.login-logo {width:360px;margin-left:110px;}
|
||||
.login-box-body {width:360px;margin-left:110px;}
|
||||
.register-box-body {width:360px;margin-left:110px;}
|
||||
.register-box-body {width:360px;margin-left:110px;}
|
||||
|
||||
/* cursors */
|
||||
.rule-triggers {cursor:move;}
|
||||
.rule-actions {cursor:move;}
|
@ -2,12 +2,16 @@
|
||||
|
||||
|
||||
// Return a helper with preserved width of cells
|
||||
var fixHelper = function (e, ui) {
|
||||
"use strict";
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
var fixHelper = function(e, tr)
|
||||
{
|
||||
var $originals = tr.children();
|
||||
var $helper = tr.clone();
|
||||
$helper.children().each(function(index)
|
||||
{
|
||||
// Set helper cell sizes to match the original sizes
|
||||
$(this).width($originals.eq(index).width());
|
||||
});
|
||||
return ui;
|
||||
return $helper;
|
||||
};
|
||||
|
||||
$(function () {
|
||||
|
14
public/js/jquery-ui.min.js
vendored
14
public/js/jquery-ui.min.js
vendored
File diff suppressed because one or more lines are too long
64
public/js/rules/index.js
Normal file
64
public/js/rules/index.js
Normal file
@ -0,0 +1,64 @@
|
||||
/* global comboChart,token, billID */
|
||||
|
||||
// Return a helper with preserved width of cells
|
||||
var fixHelper = function (e, tr) {
|
||||
var $originals = tr.children();
|
||||
var $helper = tr.clone();
|
||||
$helper.children().each(function (index) {
|
||||
// Set helper cell sizes to match the original sizes
|
||||
$(this).width($originals.eq(index).width());
|
||||
});
|
||||
return $helper;
|
||||
};
|
||||
|
||||
$(function () {
|
||||
"use strict";
|
||||
console.log("Hello");
|
||||
$('.rule-triggers').sortable({
|
||||
helper: fixHelper,
|
||||
stop: sortStop,
|
||||
cursor: "move"
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
$('.rule-actions').sortable({
|
||||
helper: fixHelper,
|
||||
stop: sortStop,
|
||||
cursor: "move"
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
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?
|
||||
console.log('Rule: #' + current.parent().data('id'));
|
||||
|
||||
$.each(parent.children(), function (i, v) {
|
||||
var trigger = $(v);
|
||||
var id = trigger.data('id');
|
||||
var order = i + 1;
|
||||
entries.push(id);
|
||||
//console.log('Entry #' + id + ' will get order ' + order + ' in rule ' + ruleId + '.');
|
||||
|
||||
});
|
||||
if (parent.hasClass('rule-triggers')) {
|
||||
$.post('rules/rules/trigger/reorder/' + ruleId, {_token: token, triggers: entries}).fail(function () {
|
||||
alert('Could not re-order rule triggers. Please refresh the page.')
|
||||
});
|
||||
} else {
|
||||
$.post('rules/rules/action/reorder/' + ruleId, {_token: token, actions: entries}).fail(function () {
|
||||
alert('Could not re-order rule actions. Please refresh the page.')
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -34,16 +34,22 @@
|
||||
<div class="box-tools pull-right">
|
||||
<button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
|
||||
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i
|
||||
class="fa fa-ellipsis-v"></i></button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="{{ route('rules.rule-group.edit',ruleGroup.id) }}"><i class="fa fa-fw fa-pencil"></i> {{ 'edit'|_ }}</a></li>
|
||||
<li><a href="{{ route('rules.rule-group.delete',ruleGroup.id) }}"><i class="fa fa-fw fa-trash"></i> {{ 'delete'|_ }}</a>
|
||||
{% if ruleGroup.order > 1 %}
|
||||
<li><a href="{{ route('rules.rule-group.up',ruleGroup.id) }}"><i class="fa fa-fw fa-arrow-up"></i> {{ 'move_rule_group_up'|_ }}</a>
|
||||
{% endif %}
|
||||
{% if ruleGroup.order < ruleGroups|length %}
|
||||
<li><a href="{{ route('rules.rule-group.down',ruleGroup.id) }}"><i class="fa fa-fw fa-arrow-down"></i> {{ 'move_rule_group_down'|_ }}</a>
|
||||
{% endif %}
|
||||
<li><a href="{{ route('rules.rule-group.edit',ruleGroup.id) }}"><i
|
||||
class="fa fa-fw fa-pencil"></i> {{ 'edit'|_ }}</a></li>
|
||||
<li><a href="{{ route('rules.rule-group.delete',ruleGroup.id) }}"><i
|
||||
class="fa fa-fw fa-trash"></i> {{ 'delete'|_ }}</a>
|
||||
{% if ruleGroup.order > 1 %}
|
||||
<li><a href="{{ route('rules.rule-group.up',ruleGroup.id) }}"><i
|
||||
class="fa fa-fw fa-arrow-up"></i> {{ 'move_rule_group_up'|_ }}</a>
|
||||
{% endif %}
|
||||
{% if ruleGroup.order < ruleGroups|length %}
|
||||
<li><a href="{{ route('rules.rule-group.down',ruleGroup.id) }}"><i
|
||||
class="fa fa-fw fa-arrow-down"></i> {{ 'move_rule_group_down'|_ }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@ -70,23 +76,30 @@
|
||||
<td>
|
||||
<div class="btn-group btn-group-xs">
|
||||
{% if rule.order > 1 %}
|
||||
<a title="{{ 'rule_priority_up'|_ }}" href="{{ route('rules.rule.up', rule.id) }}" class="btn btn-default"><span
|
||||
class="fa fa-fw fa-arrow-up"></span></a>
|
||||
{% else %}
|
||||
<a href="#" class="btn btn-default"><span
|
||||
class="fa fa-fw"></span></a>
|
||||
{% endif %}
|
||||
{% if rule.order < ruleGroup.rules.count %}
|
||||
<a title="{{ 'rule_priority_down'|_ }}" href="{{ route('rules.rule.down', rule.id) }}"
|
||||
class="btn btn-default"><span class="fa fa-fw fa-arrow-down"></span>
|
||||
</a>
|
||||
<a title="{{ 'rule_priority_up'|_ }}"
|
||||
href="{{ route('rules.rule.up', rule.id) }}"
|
||||
class="btn btn-default"><span
|
||||
class="fa fa-fw fa-arrow-up"></span></a>
|
||||
{% else %}
|
||||
<a href="#" class="btn btn-default"><span
|
||||
class="fa fa-fw"></span></a>
|
||||
{% endif %}
|
||||
<a title="{{ 'edit'|_ }}" href="{{ route('rules.rule.edit', rule.id) }}" class="btn btn-default"><span
|
||||
{% if rule.order < ruleGroup.rules.count %}
|
||||
<a title="{{ 'rule_priority_down'|_ }}"
|
||||
href="{{ route('rules.rule.down', rule.id) }}"
|
||||
class="btn btn-default"><span
|
||||
class="fa fa-fw fa-arrow-down"></span>
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="#" class="btn btn-default"><span
|
||||
class="fa fa-fw"></span></a>
|
||||
{% endif %}
|
||||
<a title="{{ 'edit'|_ }}" href="{{ route('rules.rule.edit', rule.id) }}"
|
||||
class="btn btn-default"><span
|
||||
class="fa fa-fw fa-pencil"></span></a>
|
||||
<a title="{{ 'delete'|_ }}" href="{{ route('rules.rule.delete', rule.id) }}" class="btn btn-danger"><span
|
||||
<a title="{{ 'delete'|_ }}"
|
||||
href="{{ route('rules.rule.delete', rule.id) }}"
|
||||
class="btn btn-danger"><span
|
||||
class="fa fa-fw fa-trash"></span></a>
|
||||
</div>
|
||||
|
||||
@ -98,10 +111,10 @@
|
||||
</td>
|
||||
<td>
|
||||
{% if rule.ruleTriggers.count > 0 %}
|
||||
<ul class="small">
|
||||
<ul class="small rule-triggers" data-id="{{ rule.id }}">
|
||||
{% for trigger in rule.ruleTriggers %}
|
||||
{% if trigger.trigger_type != "user_action" %}
|
||||
<li>{{ trans(('firefly.rule_trigger_' ~ trigger.trigger_type), {trigger_value: trigger.trigger_value}) }}</li>
|
||||
<li data-id="{{ trigger.id }}">{{ trans(('firefly.rule_trigger_' ~ trigger.trigger_type), {trigger_value: trigger.trigger_value}) }}</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
@ -109,9 +122,9 @@
|
||||
</td>
|
||||
<td>
|
||||
{% if rule.ruleActions.count > 0 %}
|
||||
<ul class="small">
|
||||
<ul class="small rule-actions" data-id="{{ rule.id }}">
|
||||
{% for action in rule.ruleActions %}
|
||||
<li>{{ trans(('firefly.rule_action_' ~ action.action_type), {action_value: action.action_value}) }}</li>
|
||||
<li data-id="{{ action.id }}">{{ trans(('firefly.rule_action_' ~ action.action_type), {action_value: action.action_value}) }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
@ -142,3 +155,7 @@
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script src="js/jquery-ui.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="js/rules/index.js"></script>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user