diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index 820d4ed711..4a6a204d78 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -27,6 +27,7 @@ use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -35,6 +36,7 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; @@ -342,6 +344,34 @@ class AutoCompleteController extends Controller return response()->json($return); } + /** + * An auto-complete specifically for expense accounts, used when mass updating mostly. + * + * @param Request $request + * + * @return JsonResponse + */ + public function objectGroups(Request $request): JsonResponse + { + $search = $request->get('search'); + + /** @var ObjectGroupRepositoryInterface $repository */ + $repository = app(ObjectGroupRepositoryInterface::class); + + $return = []; + $result = $repository->search((string) $search); + + /** @var ObjectGroup $account */ + foreach ($result as $objectGroup) { + $return[] = [ + 'id' => $objectGroup->id, + 'title' => $objectGroup->title, + ]; + } + + return response()->json($return); + } + /** * @return JsonResponse * @codeCoverageIgnore diff --git a/app/Http/Requests/PiggyBankFormRequest.php b/app/Http/Requests/PiggyBankFormRequest.php index d1eabc9754..afe336b96b 100644 --- a/app/Http/Requests/PiggyBankFormRequest.php +++ b/app/Http/Requests/PiggyBankFormRequest.php @@ -54,6 +54,7 @@ class PiggyBankFormRequest extends Request 'targetamount' => $this->string('targetamount'), 'targetdate' => $this->date('targetdate'), 'notes' => $this->nlString('notes'), + 'object_group' => $this->string('object_group'), ]; } diff --git a/app/Models/ObjectGroup.php b/app/Models/ObjectGroup.php index b88f396b5d..7e6e03cb26 100644 --- a/app/Models/ObjectGroup.php +++ b/app/Models/ObjectGroup.php @@ -10,14 +10,27 @@ use Illuminate\Database\Eloquent\Model; * Class ObjectGroup * * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks - * @property-read int|null $piggy_banks_count + * @property-read int|null $piggy_banks_count * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup newQuery() * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup query() * @mixin \Eloquent + * @property int $id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property string|null $deleted_at + * @property string $title + * @property int $order + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereDeletedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereTitle($value) + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup whereUpdatedAt($value) */ class ObjectGroup extends Model { + protected $fillable = ['title', 'order']; /** * @return \Illuminate\Database\Eloquent\Relations\MorphToMany */ diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 03cfc64384..8417638efc 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -78,9 +78,9 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property-read int|null $notes_count * @property-read int|null $piggy_bank_events_count * @property-read int|null $piggy_bank_repetitions_count - * @property bool $encrypted * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\ObjectGroup[] $objectGroups * @property-read int|null $object_groups_count + * @property bool $encrypted */ class PiggyBank extends Model { diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index e489379798..66a427222a 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -37,6 +37,8 @@ use FireflyIII\Helpers\Report\PopupReport; use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Helpers\Report\ReportHelper; use FireflyIII\Helpers\Report\ReportHelperInterface; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepository; +use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\Telemetry\TelemetryRepository; use FireflyIII\Repositories\Telemetry\TelemetryRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepository; @@ -172,6 +174,7 @@ class FireflyServiceProvider extends ServiceProvider // other generators $this->app->bind(UserRepositoryInterface::class, UserRepository::class); $this->app->bind(TransactionTypeRepositoryInterface::class, TransactionTypeRepository::class); + $this->app->bind(ObjectGroupRepositoryInterface::class,ObjectGroupRepository::class); $this->app->bind(AttachmentHelperInterface::class, AttachmentHelper::class); // more generators: diff --git a/app/Repositories/ObjectGroup/CreatesObjectGroups.php b/app/Repositories/ObjectGroup/CreatesObjectGroups.php new file mode 100644 index 0000000000..24f01ed050 --- /dev/null +++ b/app/Repositories/ObjectGroup/CreatesObjectGroups.php @@ -0,0 +1,61 @@ +first(); + } + + /** + * @param string $title + * + * @return ObjectGroup|null + */ + protected function findOrCreateObjectGroup(string $title): ?ObjectGroup + { + $group = null; + $maxOrder = $this->getObjectGroupMaxOrder(); + if (!$this->hasObjectGroup($title)) { + return ObjectGroup::create( + [ + 'title' => $title, + 'order' => $maxOrder + 1, + ] + ); + } + + return $this->findObjectGroup($title); + } + + /** + * @return int + */ + protected function getObjectGroupMaxOrder(): int + { + return ObjectGroup::max('order'); + } + + /** + * @param string $title + * + * @return bool + */ + protected function hasObjectGroup(string $title): bool + { + return 1 === ObjectGroup::where('title', $title)->count(); + } +} diff --git a/app/Repositories/ObjectGroup/ObjectGroupRepository.php b/app/Repositories/ObjectGroup/ObjectGroupRepository.php new file mode 100644 index 0000000000..dd33a81ca7 --- /dev/null +++ b/app/Repositories/ObjectGroup/ObjectGroupRepository.php @@ -0,0 +1,44 @@ +get(); + } + + /** + * @param string $query + * + * @return Collection + */ + public function search(string $query): Collection + { + $dbQuery = ObjectGroup::orderBy('order'); + if ('' !== $query) { + // split query on spaces just in case: + $parts = explode(' ', $query); + foreach ($parts as $part) { + $search = sprintf('%%%s%%', $part); + $dbQuery->where('title', 'LIKE', $search); + } + + } + + return $dbQuery->get(['object_groups.*']); + } +} diff --git a/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php new file mode 100644 index 0000000000..110c35d359 --- /dev/null +++ b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php @@ -0,0 +1,25 @@ +save(); } + $objectGroupTitle = $data['object_group'] ?? ''; + if ('' !== $objectGroupTitle) { + $objectGroup = $this->findOrCreateObjectGroup($objectGroupTitle); + if (null !== $objectGroup) { + $piggyBank->objectGroups()->sync([$objectGroup->id]); + $piggyBank->save(); + } + } + return $piggyBank; } @@ -313,6 +323,15 @@ trait ModifiesPiggyBanks $repetition->save(); } + $objectGroupTitle = $data['object_group'] ?? ''; + if ('' !== $objectGroupTitle) { + $objectGroup = $this->findOrCreateObjectGroup($objectGroupTitle); + if (null !== $objectGroup) { + $piggyBank->objectGroups()->sync([$objectGroup->id]); + $piggyBank->save(); + } + } + return $piggyBank; } diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 3be16b5c9e..ae93017271 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -265,7 +265,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface */ public function getPiggyBanks(): Collection { - return $this->user->piggyBanks()->with(['account'])->orderBy('order', 'ASC')->get(); + return $this->user->piggyBanks()->with(['account', 'objectGroups'])->orderBy('order', 'ASC')->get(); } diff --git a/app/Transformers/PiggyBankTransformer.php b/app/Transformers/PiggyBankTransformer.php index 15aa4f6fe6..97d9c38dc2 100644 --- a/app/Transformers/PiggyBankTransformer.php +++ b/app/Transformers/PiggyBankTransformer.php @@ -25,6 +25,7 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\Account; +use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\PiggyBank; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; @@ -83,6 +84,17 @@ class PiggyBankTransformer extends AbstractTransformer $notes = $this->piggyRepos->getNoteText($piggyBank); $notes = '' === $notes ? null : $notes; + $objectGroupId = null; + $objectGroupOrder = 0; + $objectGroupTitle = null; + /** @var ObjectGroup $objectGroup */ + $objectGroup = $piggyBank->objectGroups->first(); + if (null !== $objectGroup) { + $objectGroupId = (int) $objectGroup->id; + $objectGroupOrder = (int) $objectGroup->order; + $objectGroupTitle = $objectGroup->title; + } + // get currently saved amount: $currentAmountStr = $this->piggyRepos->getCurrentAmount($piggyBank); $currentAmount = round($currentAmountStr, $currency->decimal_places); @@ -114,9 +126,12 @@ class PiggyBankTransformer extends AbstractTransformer 'save_per_month' => round($this->piggyRepos->getSuggestedMonthlyAmount($piggyBank), $currency->decimal_places), 'start_date' => $startDate, 'target_date' => $targetDate, - 'order' => (int)$piggyBank->order, + 'order' => (int) $piggyBank->order, 'active' => true, 'notes' => $notes, + 'object_group_id' => $objectGroupId, + 'object_group_order' => $objectGroupOrder, + 'object_group_title' => $objectGroupTitle, 'links' => [ [ 'rel' => 'self', diff --git a/app/User.php b/app/User.php index 4a2f39b2b7..ee262ecccf 100644 --- a/app/User.php +++ b/app/User.php @@ -139,6 +139,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property bool $blocked * @property string|null $blocked_code * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Role[] $roles + * @property string|null $provider + * @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\User whereProvider($value) */ class User extends Authenticatable { diff --git a/database/migrations/2020_06_07_063612_changes_for_v530.php b/database/migrations/2020_06_07_063612_changes_for_v530.php new file mode 100644 index 0000000000..fc7d256109 --- /dev/null +++ b/database/migrations/2020_06_07_063612_changes_for_v530.php @@ -0,0 +1,52 @@ +increments('id'); + $table->timestamps(); + $table->softDeletes(); + $table->string('title', 255); + $table->mediumInteger('order', false, true)->default(0); + } + ); + } + + if (!Schema::hasTable('object_groupables')) { + Schema::create( + 'object_groupables', static function (Blueprint $table) { + $table->integer('object_group_id'); + $table->integer('object_groupable_id', false, true); + $table->string('object_groupable_type', 255); + } + ); + } + } +} diff --git a/public/v1/js/ff/object-groups/create-edit.js b/public/v1/js/ff/object-groups/create-edit.js new file mode 100644 index 0000000000..eaff3b35d3 --- /dev/null +++ b/public/v1/js/ff/object-groups/create-edit.js @@ -0,0 +1,52 @@ +/* + * edit.js + * Copyright (c) 2019 james@firefly-iii.org + * + * This file is part of Firefly III (https://github.com/firefly-iii). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** global: Modernizr */ + +$(document).ready(function () { + "use strict"; + + // auto complete for object group. + console.log('Object group auto complete thing.'); + var objectGroupAC = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + prefetch: { + url: 'json/object-groups?uid=' + uid, + filter: function (list) { + return $.map(list, function (obj) { + return obj; + }); + } + }, + remote: { + url: 'json/object-groups?search=%QUERY&uid=' + uid, + wildcard: '%QUERY', + filter: function (list) { + return $.map(list, function (obj) { + return obj; + }); + } + } + }); + objectGroupAC.initialize(); + $('input[name="object_group"]').typeahead({hint: true, highlight: true,}, {source: objectGroupAC, displayKey: 'title', autoSelect: false}); + +}); diff --git a/public/v1/js/ff/piggy-banks/index.js b/public/v1/js/ff/piggy-banks/index.js index 87a4af98d9..8a2f4b156f 100644 --- a/public/v1/js/ff/piggy-banks/index.js +++ b/public/v1/js/ff/piggy-banks/index.js @@ -38,6 +38,7 @@ $(function () { { helper: fixHelper, stop: stopSorting, + items: 'tr.sortable', handle: '.handle', start: function (event, ui) { // Build a placeholder cell that spans all the cells in the row @@ -84,7 +85,7 @@ function stopSorting() { "use strict"; $('.loadSpin').addClass('fa fa-refresh fa-spin'); - $.each($('#sortable-piggy>tbody>tr'), function (i, v) { + $.each($('#sortable-piggy>tbody>tr.sortable'), function (i, v) { var holder = $(v); var position = parseInt(holder.data('position')); var originalOrder = parseInt(holder.data('order')); @@ -110,4 +111,4 @@ function stopSorting() { }); $('.loadSpin').removeClass('fa fa-refresh fa-spin'); -} \ No newline at end of file +} diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 80621a6e17..4be9e16600 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -1502,6 +1502,9 @@ return [ // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', + // object groups + 'default_group_title_name' => '(ungrouped)', + // empty lists? no objects? instructions: 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', diff --git a/resources/views/v1/list/piggy-banks.twig b/resources/views/v1/list/piggy-banks.twig index 7540d17509..5461637f2c 100644 --- a/resources/views/v1/list/piggy-banks.twig +++ b/resources/views/v1/list/piggy-banks.twig @@ -1,6 +1,3 @@ -
- {{ piggyBanks.render|raw }} -
@@ -13,86 +10,92 @@ - - {% for piggy in piggyBanks %} - - - - - - - - - - - - - - - - + {% for objectGroupOrder, objectGroup in piggyBanks %} + + + + {% for piggy in objectGroup.piggy_banks %} + + + + + + + + + + + + + + + + + + {% endfor %} + {% endfor %} - + +
- {{ piggy.name }} - {% if piggy.attachments.count > 0 %} - - {% endif %} - - {{ formatAmountBySymbol(piggy.current_amount,piggy.currency_symbol,piggy.currency_decimal_places) }} -
{{ objectGroup.object_group_title }}
+ {{ piggy.name }} + {% if piggy.attachments.count > 0 %} + + {% endif %} + + + {{ formatAmountBySymbol(piggy.current_amount,piggy.currency_symbol,piggy.currency_decimal_places) }} +
-
- {{ piggyBanks.render|raw }} -
diff --git a/resources/views/v1/piggy-banks/create.twig b/resources/views/v1/piggy-banks/create.twig index c3bc89076a..40043c920e 100644 --- a/resources/views/v1/piggy-banks/create.twig +++ b/resources/views/v1/piggy-banks/create.twig @@ -33,7 +33,7 @@ {{ ExpandedForm.date('targetdate') }} {{ ExpandedForm.textarea('notes', null, {helpText: trans('firefly.field_supports_markdown')} ) }} {{ ExpandedForm.file('attachments[]', {'multiple': 'multiple','helpText': trans('firefly.upload_max_file_size', {'size': uploadSize|filesize}) }) }} - {#{{ ExpandedForm.objectGroup('object_group') }}#} + {{ ExpandedForm.objectGroup() }} @@ -63,6 +63,10 @@ + + {# auto complete for object groups #} + + {% endblock %} {% block styles %} diff --git a/resources/views/v1/piggy-banks/edit.twig b/resources/views/v1/piggy-banks/edit.twig index 397fea13eb..a7c5d0670f 100644 --- a/resources/views/v1/piggy-banks/edit.twig +++ b/resources/views/v1/piggy-banks/edit.twig @@ -36,6 +36,7 @@ {{ ExpandedForm.date('targetdate') }} {{ ExpandedForm.textarea('notes', null, {helpText: trans('firefly.field_supports_markdown')}) }} {{ ExpandedForm.file('attachments[]', {'multiple': 'multiple','helpText': trans('firefly.upload_max_file_size', {'size': uploadSize|filesize}) }) }} + {{ ExpandedForm.objectGroup() }} @@ -65,6 +66,9 @@ + {# auto complete for object groups #} + + {% endblock %} {% block styles %} diff --git a/routes/web.php b/routes/web.php index deae53554a..d4040adb86 100644 --- a/routes/web.php +++ b/routes/web.php @@ -582,6 +582,7 @@ Route::group( Route::get('expense-accounts', ['uses' => 'Json\AutoCompleteController@expenseAccounts', 'as' => 'autocomplete.expense-accounts']); Route::get('asset-accounts', ['uses' => 'Json\AutoCompleteController@assetAccounts', 'as' => 'autocomplete.asset-accounts']); Route::get('budgets', ['uses' => 'Json\AutoCompleteController@budgets', 'as' => 'autocomplete.budgets']); + Route::get('object-groups', ['uses' => 'Json\AutoCompleteController@objectGroups', 'as' => 'autocomplete.object-groups']); Route::get('bills', ['uses' => 'Json\AutoCompleteController@bills', 'as' => 'autocomplete.bills']); Route::get('categories', ['uses' => 'Json\AutoCompleteController@categories', 'as' => 'autocomplete.categories']); Route::get('currencies', ['uses' => 'Json\AutoCompleteController@currencies', 'as' => 'autocomplete.currencies']); @@ -636,22 +637,23 @@ Route::group( Route::group( ['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers', 'prefix' => 'piggy-banks', 'as' => 'piggy-banks.'], static function () { - Route::get('', ['uses' => 'PiggyBankController@index', 'as' => 'index']); - Route::get('add/{piggyBank}', ['uses' => 'PiggyBankController@add', 'as' => 'add-money']); - Route::get('remove/{piggyBank}', ['uses' => 'PiggyBankController@remove', 'as' => 'remove-money']); - Route::get('add-money/{piggyBank}', ['uses' => 'PiggyBankController@addMobile', 'as' => 'add-money-mobile']); - Route::get('remove-money/{piggyBank}', ['uses' => 'PiggyBankController@removeMobile', 'as' => 'remove-money-mobile']); - Route::get('create', ['uses' => 'PiggyBankController@create', 'as' => 'create']); - Route::get('edit/{piggyBank}', ['uses' => 'PiggyBankController@edit', 'as' => 'edit']); - Route::get('delete/{piggyBank}', ['uses' => 'PiggyBankController@delete', 'as' => 'delete']); - Route::get('show/{piggyBank}', ['uses' => 'PiggyBankController@show', 'as' => 'show']); - Route::post('store', ['uses' => 'PiggyBankController@store', 'as' => 'store']); - Route::post('update/{piggyBank}', ['uses' => 'PiggyBankController@update', 'as' => 'update']); - Route::post('destroy/{piggyBank}', ['uses' => 'PiggyBankController@destroy', 'as' => 'destroy']); - Route::post('add/{piggyBank}', ['uses' => 'PiggyBankController@postAdd', 'as' => 'add']); - Route::post('remove/{piggyBank}', ['uses' => 'PiggyBankController@postRemove', 'as' => 'remove']); - Route::post('set-order/{piggyBank}', ['uses' => 'PiggyBankController@setOrder', 'as' => 'set-order']); + Route::get('', ['uses' => 'PiggyBank\IndexController@index', 'as' => 'index']); + Route::get('add/{piggyBank}', ['uses' => 'PiggyBank\AmountController@add', 'as' => 'add-money']); + Route::get('remove/{piggyBank}', ['uses' => 'PiggyBank\AmountController@remove', 'as' => 'remove-money']); + Route::get('add-money/{piggyBank}', ['uses' => 'PiggyBank\AmountController@addMobile', 'as' => 'add-money-mobile']); + Route::get('remove-money/{piggyBank}', ['uses' => 'PiggyBank\AmountController@removeMobile', 'as' => 'remove-money-mobile']); + Route::get('create', ['uses' => 'PiggyBank\CreateController@create', 'as' => 'create']); + Route::get('edit/{piggyBank}', ['uses' => 'PiggyBank\EditController@edit', 'as' => 'edit']); + Route::get('delete/{piggyBank}', ['uses' => 'PiggyBank\DeleteController@delete', 'as' => 'delete']); + Route::get('show/{piggyBank}', ['uses' => 'PiggyBank\ShowController@show', 'as' => 'show']); + Route::post('store', ['uses' => 'PiggyBank\CreateController@store', 'as' => 'store']); + Route::post('update/{piggyBank}', ['uses' => 'PiggyBank\EditController@update', 'as' => 'update']); + Route::post('destroy/{piggyBank}', ['uses' => 'PiggyBank\DeleteController@destroy', 'as' => 'destroy']); + Route::post('add/{piggyBank}', ['uses' => 'PiggyBank\AmountController@postAdd', 'as' => 'add']); + Route::post('remove/{piggyBank}', ['uses' => 'PiggyBank\AmountController@postRemove', 'as' => 'remove']); + + Route::post('set-order/{piggyBank}', ['uses' => 'PiggyBank\IndexController@setOrder', 'as' => 'set-order']); } );