diff --git a/app/Http/Controllers/RuleController.php b/app/Http/Controllers/RuleController.php index abe2bf9dc4..0d0caa2ca1 100644 --- a/app/Http/Controllers/RuleController.php +++ b/app/Http/Controllers/RuleController.php @@ -184,16 +184,38 @@ class RuleController extends Controller */ public function index() { - $ruleGroups = Auth::user()->ruleGroups()->with('rules')->get(); + $ruleGroups = Auth::user()->ruleGroups()->with(['rules' => function($query) { + $query->orderBy('order','ASC'); + + }])->get(); return view('rules.index', compact('ruleGroups')); } + /** - * @param Rule $rule + * @param RuleRepositoryInterface $repository + * @param Rule $rule + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function upRule(Rule $rule) + public function upRule(RuleRepositoryInterface $repository, Rule $rule) { + $repository->moveRuleUp($rule); + + return redirect(route('rules.index')); + + } + + /** + * @param RuleRepositoryInterface $repository + * @param Rule $rule + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function downRule(RuleRepositoryInterface $repository, Rule $rule) + { + $repository->moveRuleDown($rule); + + return redirect(route('rules.index')); } diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 3a7bfb1c2d..f29681fba6 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -12,6 +12,7 @@ namespace FireflyIII\Repositories\Rule; use Auth; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; +use Log; /** * Class RuleRepository @@ -112,4 +113,66 @@ class RuleRepository implements RuleRepositoryInterface return true; } + + /** + * @param Rule $rule + * @return bool + */ + public function moveRuleUp(Rule $rule) + { + $order = $rule->order; + + // find the rule with order-1 and give it order+1 + $other = $rule->ruleGroup->rules()->where('order', ($order - 1))->first(); + if ($other) { + $other->order = ($other->order + 1); + $other->save(); + } + + $rule->order = ($rule->order - 1); + $rule->save(); + $this->resetRulesInGroupOrder($rule->ruleGroup); + } + + /** + * @param Rule $rule + * @return bool + */ + public function moveRuleDown(Rule $rule) + { + $order = $rule->order; + + // find the rule with order+1 and give it order-1 + $other = $rule->ruleGroup->rules()->where('order', ($order + 1))->first(); + if ($other) { + $other->order = $other->order - 1; + $other->save(); + } + + + $rule->order = ($rule->order + 1); + $rule->save(); + $this->resetRulesInGroupOrder($rule->ruleGroup); + } + + /** + * @return bool + */ + public function resetRulesInGroupOrder(RuleGroup $ruleGroup) + { + $ruleGroup->rules()->whereNotNull('deleted_at')->update(['order' => 0]); + + $set = $ruleGroup->rules() + ->orderBy('order', 'ASC') + ->orderBy('updated_at', 'DESC') + ->get(); + $count = 1; + /** @var Rule $entry */ + foreach ($set as $entry) { + $entry->order = $count; + $entry->save(); + $count++; + } + + } } \ No newline at end of file diff --git a/app/Repositories/Rule/RuleRepositoryInterface.php b/app/Repositories/Rule/RuleRepositoryInterface.php index ea4e2e1b5f..9406ef9140 100644 --- a/app/Repositories/Rule/RuleRepositoryInterface.php +++ b/app/Repositories/Rule/RuleRepositoryInterface.php @@ -9,6 +9,7 @@ namespace FireflyIII\Repositories\Rule; +use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; /** @@ -52,4 +53,21 @@ interface RuleRepositoryInterface */ public function resetRuleGroupOrder(); + /** + * @return bool + */ + public function resetRulesInGroupOrder(RuleGroup $ruleGroup); + + /** + * @param Rule $rule + * @return bool + */ + public function moveRuleUp(Rule $rule); + + /** + * @param Rule $rule + * @return bool + */ + public function moveRuleDown(Rule $rule); + } \ No newline at end of file