diff --git a/app/Http/Controllers/ExchangeRates/IndexController.php b/app/Http/Controllers/ExchangeRates/IndexController.php
index 0fa0180c24..bea8bf4a2d 100644
--- a/app/Http/Controllers/ExchangeRates/IndexController.php
+++ b/app/Http/Controllers/ExchangeRates/IndexController.php
@@ -24,6 +24,9 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\ExchangeRates;
use FireflyIII\Http\Controllers\Controller;
+use FireflyIII\Models\TransactionCurrency;
+use Illuminate\View\Factory;
+use Illuminate\View\View;
class IndexController extends Controller
{
@@ -44,9 +47,14 @@ class IndexController extends Controller
);
}
- public function index()
+ public function index(): View
{
return view('exchange-rates.index');
}
+ public function rates(TransactionCurrency $from, TransactionCurrency $to): View
+ {
+ return view('exchange-rates.rates', compact('from', 'to'));
+ }
+
}
diff --git a/resources/assets/v1/mix-manifest.json b/resources/assets/v1/mix-manifest.json
index 563436036e..56b2171215 100644
--- a/resources/assets/v1/mix-manifest.json
+++ b/resources/assets/v1/mix-manifest.json
@@ -9,6 +9,7 @@
"/build/webhooks/edit.js": "/build/webhooks/edit.js",
"/build/webhooks/show.js": "/build/webhooks/show.js",
"/build/exchange-rates/index.js": "/build/exchange-rates/index.js",
+ "/build/exchange-rates/rates.js": "/build/exchange-rates/rates.js",
"/public/v1/js/app.js": "/public/v1/js/app.js",
"/public/v1/js/app.js.LICENSE.txt": "/public/v1/js/app.js.LICENSE.txt",
"/public/v1/js/app_vue.js": "/public/v1/js/app_vue.js",
@@ -23,6 +24,7 @@
"/public/v1/js/edit_transaction.js.LICENSE.txt": "/public/v1/js/edit_transaction.js.LICENSE.txt",
"/public/v1/js/exchange-rates/index.js": "/public/v1/js/exchange-rates/index.js",
"/public/v1/js/exchange-rates/index.js.LICENSE.txt": "/public/v1/js/exchange-rates/index.js.LICENSE.txt",
+ "/public/v1/js/exchange-rates/rates.js": "/public/v1/js/exchange-rates/rates.js",
"/public/v1/js/ff/accounts/create.js": "/public/v1/js/ff/accounts/create.js",
"/public/v1/js/ff/accounts/edit-reconciliation.js": "/public/v1/js/ff/accounts/edit-reconciliation.js",
"/public/v1/js/ff/accounts/edit.js": "/public/v1/js/ff/accounts/edit.js",
diff --git a/resources/assets/v1/src/components/exchange-rates/Rates.vue b/resources/assets/v1/src/components/exchange-rates/Rates.vue
new file mode 100644
index 0000000000..e3f65d9419
--- /dev/null
+++ b/resources/assets/v1/src/components/exchange-rates/Rates.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/v1/src/exchange-rates/rates.js b/resources/assets/v1/src/exchange-rates/rates.js
new file mode 100644
index 0000000000..1711ca5997
--- /dev/null
+++ b/resources/assets/v1/src/exchange-rates/rates.js
@@ -0,0 +1,39 @@
+/*
+ * edit_transactions.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 .
+ */
+
+import Index from "../components/exchange-rates/Index";
+
+/**
+ * First we will load Axios via bootstrap.js
+ * jquery and bootstrap-sass preloaded in app.js
+ * vue, uiv and vuei18n are in app_vue.js
+ */
+
+require('../bootstrap');
+const i18n = require('../i18n');
+
+let props = {};
+const app = new Vue({
+ i18n,
+ el: "#exchange_rates_rates",
+ render: (createElement) => {
+ return createElement(Index, {props: props})
+ },
+});
diff --git a/resources/assets/v1/webpack.mix.js b/resources/assets/v1/webpack.mix.js
index ae305aa76d..04ce6319dc 100644
--- a/resources/assets/v1/webpack.mix.js
+++ b/resources/assets/v1/webpack.mix.js
@@ -49,3 +49,4 @@ mix.js('src/webhooks/show.js', 'build/webhooks').vue({version: 2}).copy('build',
// exchange rates
mix.js('src/exchange-rates/index.js', 'build/exchange-rates').vue({version: 2});
+mix.js('src/exchange-rates/rates.js', 'build/exchange-rates').vue({version: 2});
diff --git a/resources/lang/en_US/breadcrumbs.php b/resources/lang/en_US/breadcrumbs.php
index 9dba742c88..be09962d9a 100644
--- a/resources/lang/en_US/breadcrumbs.php
+++ b/resources/lang/en_US/breadcrumbs.php
@@ -92,4 +92,6 @@ return [
// exchange rates
'exchange_rates_index' => 'Exchange rates',
+ 'exchange_rates_rates' => 'Exchange rates between :from and :to (and the other way around)',
+
];
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index 616b6124d1..bd0d71ebca 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -1398,7 +1398,7 @@ return [
'menu_exchange_rates_index' => 'Exchange rates',
'header_exchange_rates' => 'Exchange rates',
'exchange_rates_intro' =>'Firefly III supports downloading and using exchange rates. Read more about this in the documentation.',
- 'exchange_rates_from_to' => 'Between {from} and {to}',
+ 'exchange_rates_from_to' => 'Between {from} and {to} (and the other way around)',
// Financial administrations
'administration_index' => 'Financial administration',
diff --git a/resources/views/exchange-rates/rates.twig b/resources/views/exchange-rates/rates.twig
new file mode 100644
index 0000000000..7be137ebfb
--- /dev/null
+++ b/resources/views/exchange-rates/rates.twig
@@ -0,0 +1,12 @@
+{% set VUE_SCRIPT_NAME = 'exchange-rates/rates' %}
+{% extends './layout/default' %}
+{% block breadcrumbs %}
+ {{ Breadcrumbs.render(Route.getCurrentRoute.getName, from, to) }}
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
+{% block scripts %}
+
+{% endblock %}
diff --git a/resources/views/webhooks/index.twig b/resources/views/webhooks/index.twig
index 09a66a2002..ec3ee10e96 100644
--- a/resources/views/webhooks/index.twig
+++ b/resources/views/webhooks/index.twig
@@ -1,7 +1,7 @@
{% set VUE_SCRIPT_NAME = 'webhooks/index' %}
{% extends './layout/default' %}
{% block breadcrumbs %}
- {{ Breadcrumbs.render(Route.getCurrentRoute.getName, objectType) }}
+ {{ Breadcrumbs.render(Route.getCurrentRoute.getName) }}
{% endblock %}
{% block content %}
diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php
index 37d8a7ca4e..6d3c3b8bee 100644
--- a/routes/breadcrumbs.php
+++ b/routes/breadcrumbs.php
@@ -762,6 +762,13 @@ Breadcrumbs::for(
}
);
+Breadcrumbs::for(
+ 'exchange-rates.rates',
+ static function (Generator $breadcrumbs, TransactionCurrency $from, TransactionCurrency $to): void {
+ $breadcrumbs->parent('exchange-rates.index');
+ $breadcrumbs->push(trans('breadcrumbs.exchange_rates_rates', ['from' => $from->name, 'to' => $to->name]), route('exchange-rates.rates', [$from->code, $to->code]));
+ }
+);
// PROFILE
diff --git a/routes/web.php b/routes/web.php
index 31cfa511c8..c581fd4f03 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -365,6 +365,7 @@ Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\ExchangeRates', 'prefix' => 'exchange-rates', 'as' => 'exchange-rates.'],
static function (): void {
Route::get('', ['uses' => 'IndexController@index', 'as' => 'index']);
+ Route::get('{fromCurrencyCode}/{toCurrencyCode}', ['uses' => 'IndexController@rates', 'as' => 'rates']);
// Route::get('create', ['uses' => 'CreateController@create', 'as' => 'create']);
// Route::get('edit/{currency}', ['uses' => 'EditController@edit', 'as' => 'edit']);
// Route::get('delete/{currency}', ['uses' => 'DeleteController@delete', 'as' => 'delete']);