diff --git a/app/Http/Controllers/PiggyBankController.php b/app/Http/Controllers/PiggyBankController.php index 12a56e79c6..e5fdce6c0a 100644 --- a/app/Http/Controllers/PiggyBankController.php +++ b/app/Http/Controllers/PiggyBankController.php @@ -30,6 +30,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\PiggyBankTransformer; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; @@ -215,6 +216,7 @@ class PiggyBankController extends Controller */ public function index(Request $request) { + $this->piggyRepos->correctOrder(); $collection = $this->piggyRepos->getPiggyBanks(); $total = $collection->count(); $page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); @@ -261,27 +263,6 @@ class PiggyBankController extends Controller return view('piggy-banks.index', compact('piggyBanks', 'accounts')); } - /** - * @param Request $request - * - * @return \Illuminate\Http\JsonResponse - */ - public function order(Request $request) - { - $data = $request->get('order'); - - // set all users piggy banks to zero: - $this->piggyRepos->reset(); - - if (\is_array($data)) { - foreach ($data as $order => $id) { - $this->piggyRepos->setOrder((int)$id, $order + 1); - } - } - - return response()->json(['result' => 'ok']); - } - /** * @param Request $request * @param PiggyBank $piggyBank @@ -402,6 +383,20 @@ class PiggyBankController extends Controller return view('piggy-banks.remove-mobile', compact('piggyBank', 'repetition', 'currency')); } + /** + * @param Request $request + * @param PiggyBank $piggyBank + * + * @return JsonResponse + */ + public function setOrder(Request $request, PiggyBank $piggyBank): JsonResponse + { + $newOrder = (int)$request->get('order'); + $this->piggyRepos->setOrder($piggyBank, $newOrder); + + return response()->json(['data' => 'OK']); + } + /** * @param PiggyBank $piggyBank * diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 2612cf245c..55b22083ce 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -104,6 +104,22 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface return bccomp($amount, $savedSoFar) <= 0; } + /** + * Correct order of piggies in case of issues. + */ + public function correctOrder(): void + { + $set = $this->user->piggyBanks()->orderBy('order', 'ASC')->get(); + $current = 1; + foreach ($set as $piggyBank) { + if ((int)$piggyBank->order !== $current) { + $piggyBank->order = $current; + $piggyBank->save(); + } + $current++; + } + } + /** * @param PiggyBank $piggyBank * @param string $amount @@ -327,7 +343,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface /** @var PiggyBank $current */ foreach ($piggies as $current) { $repetition = $this->getRepetition($current); - if(null !== $repetition) { + if (null !== $repetition) { $balance = bcsub($balance, $repetition->currentamount); } } @@ -379,14 +395,10 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface * * @return bool */ - public function setOrder(int $piggyBankId, int $order): bool + public function setOrder(PiggyBank $piggyBank, int $order): bool { - $piggyBank = PiggyBank::leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')->where('accounts.user_id', $this->user->id) - ->where('piggy_banks.id', $piggyBankId)->first(['piggy_banks.*']); - if ($piggyBank) { - $piggyBank->order = $order; - $piggyBank->save(); - } + $piggyBank->order = $order; + $piggyBank->save(); return true; } diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index 59e217d2f3..ca9ab5ea38 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -86,6 +86,11 @@ interface PiggyBankRepositoryInterface */ public function createEventWithJournal(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): PiggyBankEvent; + /** + * Correct order of piggies in case of issues. + */ + public function correctOrder(): void; + /** * Destroy piggy bank. * @@ -196,12 +201,12 @@ interface PiggyBankRepositoryInterface /** * Set specific piggy bank to specific order. * - * @param int $piggyBankId + * @param PiggyBank $piggyBank * @param int $order * * @return bool */ - public function setOrder(int $piggyBankId, int $order): bool; + public function setOrder(PiggyBank $piggyBank, int $order): bool; /** * @param User $user diff --git a/public/js/ff/import/status.js b/public/js/ff/import/status.js index 73f621239c..46c176e2da 100644 --- a/public/js/ff/import/status.js +++ b/public/js/ff/import/status.js @@ -63,6 +63,10 @@ function checkJobStatus() { */ function reportFailedJob(jqxhr, textStatus, error) { console.log('In reportFailedJob()'); + + // cancel refresh + clearTimeout(timeOutId); + // hide all possible boxes: $('.statusbox').hide(); @@ -133,6 +137,7 @@ function reportOnJobStatus(data) { $('#import-status-more-info').html(data.finishedText); break; case "error": + clearTimeout(timeOutId); console.log('Job reports ERROR.'); // hide all possible boxes: $('.statusbox').hide(); diff --git a/public/js/ff/piggy-banks/index.js b/public/js/ff/piggy-banks/index.js index 292d7f7f7d..6a67810c38 100644 --- a/public/js/ff/piggy-banks/index.js +++ b/public/js/ff/piggy-banks/index.js @@ -83,13 +83,36 @@ function removeMoney(e) { function stopSorting() { "use strict"; $('.loadSpin').addClass('fa fa-refresh fa-spin'); - var order = []; + $.each($('#sortable-piggy>tbody>tr'), function (i, v) { var holder = $(v); + var position = parseInt(holder.data('position')); + var originalOrder = parseInt(holder.data('order')); var id = holder.data('id'); - order.push(id); - }); - $.post('piggy-banks/sort', {order: order, _token: token}).done(function () { - $('.loadSpin').removeClass('fa fa-refresh fa-spin'); + console.log('Now at row ' + i); + var newOrder; + if (position === i) { + return; + } + if (position < i) { + console.log('Row ' + i + ' has moved up!'); + // update position: + holder.data('position', i); + newOrder = originalOrder + 1; + + + } + if (position > i) { + console.log('Row ' + i + ' has moved down!'); + // update position: + holder.data('position', i); + newOrder = originalOrder - 1; + + + } + + $.post('piggy-banks/set-order/' + id, {order: newOrder, _token: token}) }); + $('.loadSpin').removeClass('fa fa-refresh fa-spin'); + } \ No newline at end of file diff --git a/resources/views/list/piggy-banks.twig b/resources/views/list/piggy-banks.twig index 24387cf7b8..2902d639db 100644 --- a/resources/views/list/piggy-banks.twig +++ b/resources/views/list/piggy-banks.twig @@ -14,7 +14,7 @@
{% for piggy in piggyBanks %} -