diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 1273797ad6..fca6f6f678 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -276,6 +276,26 @@ class AccountController extends Controller return view('accounts.show', compact('account', 'what', 'entries', 'subTitleIcon', 'journals', 'subTitle')); } + /** + * @param Account $account + * + * @return View + */ + public function showAll(Account $account) + { + $subTitle = sprintf('%s (%s)', $account->name, strtolower(trans('firefly.everything'))); + $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + + // replace with journal collector: + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setLimit($pageSize)->setPage($page); + $journals = $collector->getPaginatedJournals(); + $journals->setPath('accounts/show/' . $account->id . '/all'); + + return view('accounts.show_with_date', compact('category', 'date', 'account', 'journals', 'subTitle', 'carbon')); + } + /** * @param Account $account * @param string $date diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 594f5f103e..70c9dd7164 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -14,12 +14,14 @@ declare(strict_types = 1); namespace FireflyIII\Http\Controllers; use Carbon\Carbon; -use FireflyIII\Helpers\Collector\JournalCollector; +use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalTaskerInterface; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use Log; +use Navigation; use Preferences; use Response; use View; @@ -56,15 +58,22 @@ class TransactionController extends Controller * * @return View */ - public function index(Request $request, string $what) + public function index(Request $request, JournalRepositoryInterface $repository, string $what) { $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $subTitleIcon = config('firefly.transactionIconsByWhat.' . $what); $types = config('firefly.transactionTypesByWhat.' . $what); $subTitle = trans('firefly.title_' . $what); + $range = Preferences::get('viewRange', '1M')->data; $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); - $collector = new JournalCollector(auth()->user()); + // to make sure we only grab a subset, based on the current date (in session): + $start = session('start', Navigation::startOfPeriod(new Carbon, $range)); + $end = session('end', Navigation::endOfPeriod(new Carbon, $range)); + + + $collector = app(JournalCollectorInterface::class, [auth()->user()]); $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); + $collector->setRange($start, $end); // do not filter transfers if $what = transfer. if (!in_array($what, ['transfer', 'transfers'])) { @@ -75,7 +84,93 @@ class TransactionController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('transactions/' . $what); - return view('transactions.index', compact('subTitle', 'what', 'subTitleIcon', 'journals')); + unset($start, $end); + + // then also show a list of periods where the user can click on, based on the + // user's range and the oldest journal the user has: + $first = $repository->first(); + $blockStart = is_null($first->id) ? new Carbon : $first->date; + $blockStart = Navigation::startOfPeriod($blockStart, $range); + $blockEnd = Navigation::endOfX(new Carbon, $range); + $entries = new Collection; + + while ($blockEnd >= $blockStart) { + Log::debug(sprintf('Now at blockEnd: %s', $blockEnd->format('Y-m-d'))); + $blockEnd = Navigation::startOfPeriod($blockEnd, $range); + $dateStr = $blockEnd->format('Y-m-d'); + $dateName = Navigation::periodShow($blockEnd, $range); + $entries->push([$dateStr, $dateName]); + $blockEnd = Navigation::subtractPeriod($blockEnd, $range, 1); + } + + return view('transactions.index', compact('subTitle', 'what', 'subTitleIcon', 'journals', 'entries')); + + } + + /** + * @param Request $request + * @param string $what + * + * @return View + */ + public function indexAll(Request $request, string $what) + { + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + $subTitleIcon = config('firefly.transactionIconsByWhat.' . $what); + $types = config('firefly.transactionTypesByWhat.' . $what); + $subTitle = sprintf('%s (%s)', trans('firefly.title_' . $what), strtolower(trans('firefly.everything'))); + $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); + + $collector = app(JournalCollectorInterface::class, [auth()->user()]); + $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); + + // do not filter transfers if $what = transfer. + if (!in_array($what, ['transfer', 'transfers'])) { + Log::debug('Also get opposing account info.'); + $collector->withOpposingAccount(); + } + + $journals = $collector->getPaginatedJournals(); + $journals->setPath('transactions/' . $what . '/all'); + + return view('transactions.index-all', compact('subTitle', 'what', 'subTitleIcon', 'journals')); + + } + + /** + * @param Request $request + * @param string $what + * + * @return View + */ + public function indexDate(Request $request, string $what, string $date) + { + $carbon = new Carbon($date); + $range = Preferences::get('viewRange', '1M')->data; + $start = Navigation::startOfPeriod($carbon, $range); + $end = Navigation::endOfPeriod($carbon, $range); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + $subTitleIcon = config('firefly.transactionIconsByWhat.' . $what); + $types = config('firefly.transactionTypesByWhat.' . $what); + $subTitle = trans('firefly.title_' . $what) . ' (' . Navigation::periodShow($carbon, $range) . ')'; + $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); + + Log::debug(sprintf('Transaction index by date will show between %s and %s', $start->format('Y-m-d'), $end->format('Y-m-d'))); + + $collector = app(JournalCollectorInterface::class, [auth()->user()]); + $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); + $collector->setRange($start, $end); + + // do not filter transfers if $what = transfer. + if (!in_array($what, ['transfer', 'transfers'])) { + Log::debug('Also get opposing account info.'); + $collector->withOpposingAccount(); + } + + $journals = $collector->getPaginatedJournals(); + $journals->setPath('transactions/' . $what . '/' . $date); + + return view('transactions.index-date', compact('subTitle', 'what', 'subTitleIcon', 'journals', 'carbon')); } diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index 9de3b720ac..925c0cac99 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -83,6 +83,17 @@ Breadcrumbs::register( } ); +Breadcrumbs::register( + 'accounts.show.all', function (BreadCrumbGenerator $breadcrumbs, Account $account) { + $breadcrumbs->parent('accounts.show', $account); + + $title = sprintf('%s (%s)', $account->name, strtolower(trans('firefly.everything'))); + + $breadcrumbs->push($title, route('accounts.show.all', [$account->id])); +} +); + + Breadcrumbs::register( 'accounts.delete', function (BreadCrumbGenerator $breadcrumbs, Account $account) { $breadcrumbs->parent('accounts.show', $account); @@ -573,6 +584,28 @@ Breadcrumbs::register( $breadcrumbs->push(trans('breadcrumbs.' . $what . '_list'), route('transactions.index', [$what])); } ); + +Breadcrumbs::register( + 'transactions.index.all', function (BreadCrumbGenerator $breadcrumbs, string $what) { + $breadcrumbs->parent('transactions.index', $what); + + $title = sprintf('%s (%s)', trans('breadcrumbs.' . $what . '_list'), strtolower(trans('firefly.everything'))); + + $breadcrumbs->push($title, route('transactions.index.all', [$what])); +} +); + +Breadcrumbs::register( + 'transactions.index.date', function (BreadCrumbGenerator $breadcrumbs, string $what, Carbon $date) { + $breadcrumbs->parent('transactions.index', $what); + + $range = Preferences::get('viewRange', '1M')->data; + $title = trans('breadcrumbs.' . $what . '_list') . ' (' . Navigation::periodShow($date, $range) . ')'; + + $breadcrumbs->push($title, route('transactions.index.date', [$what, $date->format('Y-m-d')])); +} +); + Breadcrumbs::register( 'transactions.create', function (BreadCrumbGenerator $breadcrumbs, string $what) { $breadcrumbs->parent('transactions.index', $what); diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 5935bdfc48..2befbc056f 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -86,6 +86,7 @@ return [ 'field_supports_markdown' => 'This field supports Markdown.', 'need_more_help' => 'If you need more help using Firefly III, please open a ticker on Github.', 'nothing_to_display' => 'There are no transactions to show you', + 'show_all_no_filter' => 'Show all transactions without grouping them by date.', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index b69befe609..280f881978 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -38,6 +38,12 @@
{% include 'list.journals-tasker' with {sorting:true} %} +

+ + + {{ 'show_all_no_filter'|_ }} + +

diff --git a/resources/views/transactions/index-all.twig b/resources/views/transactions/index-all.twig new file mode 100644 index 0000000000..270afeb6d1 --- /dev/null +++ b/resources/views/transactions/index-all.twig @@ -0,0 +1,23 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, what) }} +{% endblock %} + +{% block content %} +
+
+
+
+

{{ subTitle }}

+
+
+ {% include 'list.journals-tasker' %} +
+
+
+
+{% endblock %} +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/resources/views/transactions/index-date.twig b/resources/views/transactions/index-date.twig new file mode 100644 index 0000000000..8250e832f7 --- /dev/null +++ b/resources/views/transactions/index-date.twig @@ -0,0 +1,23 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, what, carbon) }} +{% endblock %} + +{% block content %} +
+
+
+
+

{{ subTitle }}

+
+
+ {% include 'list.journals-tasker' %} +
+
+
+
+{% endblock %} +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/resources/views/transactions/index.twig b/resources/views/transactions/index.twig index 3d63c4e0b1..9aa5eb2b73 100644 --- a/resources/views/transactions/index.twig +++ b/resources/views/transactions/index.twig @@ -6,16 +6,38 @@ {% block content %}
-
+

{{ subTitle }}

{% include 'list.journals-tasker' %} +

+ + + {{ 'show_all_no_filter'|_ }} + +

+ +
+ {% for entry in entries %} +
+
+

+ {{ entry[1] }} +

+
+
+   +
+
+ {% endfor %} +
+
{% endblock %} {% block scripts %} diff --git a/routes/web.php b/routes/web.php index 5fa77bcc3b..58f4a070f3 100755 --- a/routes/web.php +++ b/routes/web.php @@ -92,6 +92,7 @@ Route::group( Route::get('/accounts/edit/{account}', ['uses' => 'AccountController@edit', 'as' => 'accounts.edit']); Route::get('/accounts/delete/{account}', ['uses' => 'AccountController@delete', 'as' => 'accounts.delete']); Route::get('/accounts/show/{account}', ['uses' => 'AccountController@show', 'as' => 'accounts.show']); + Route::get('/accounts/show/{account}/all', ['uses' => 'AccountController@showAll', 'as' => 'accounts.show.all']); Route::get('/accounts/show/{account}/{date}', ['uses' => 'AccountController@showWithDate', 'as' => 'accounts.show.date']); @@ -455,10 +456,22 @@ Route::group( * Transaction Controller */ - // normal controller + // normal controller: index for session range Route::get('/transactions/{what}', ['uses' => 'TransactionController@index', 'as' => 'transactions.index'])->where( ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] ); + + // normal controller: index showing ALL: + Route::get('/transactions/{what}/all', ['uses' => 'TransactionController@indexAll', 'as' => 'transactions.index.all'])->where( + ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] + ); + + // normal controller: index for specific date range: + Route::get('/transactions/{what}/{date}', ['uses' => 'TransactionController@indexDate', 'as' => 'transactions.index.date'])->where( + ['what' => 'expenses|revenue|withdrawal|deposit|transfer|transfers'] + ); + + Route::get('/transaction/show/{tj}', ['uses' => 'TransactionController@show', 'as' => 'transactions.show']); Route::post('/transaction/reorder', ['uses' => 'TransactionController@reorder', 'as' => 'transactions.reorder']);