Small update to frontend and associated code.

This commit is contained in:
James Cole
2022-06-05 20:02:43 +02:00
parent 6b2619c5cc
commit 9c08b9f1d3
102 changed files with 974 additions and 519 deletions

View File

@@ -0,0 +1,33 @@
<?php
/*
* BillController.php
* Copyright (c) 2022 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 <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V2\Controllers\Transaction\Sum;
use FireflyIII\Api\V2\Controllers\Controller;
/**
* Class BillController
*/
class BillController extends Controller
{
}

View File

@@ -0,0 +1,65 @@
<?php
/*
* DateRequest.php
* Copyright (c) 2021 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 <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Generic;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest;
/**
* Request class for end points that require date parameters.
*
* Class DateRequest
*/
class DateRequest extends FormRequest
{
use ConvertsDataTypes, ChecksLogin;
/**
* Get all data from the request.
*
* @return array
*/
public function getAll(): array
{
return [
'start' => $this->getCarbonDate('start'),
'end' => $this->getCarbonDate('end'),
];
}
/**
* The rules that the incoming request must be matched against.
*
* @return array
*/
public function rules(): array
{
return [
'start' => 'required|date',
'end' => 'required|date|after:start',
];
}
}

View File

@@ -52,7 +52,7 @@ class RouteServiceProvider extends ServiceProvider
public function boot(): void
{
$this->routes(function () {
Route::prefix('api/v1')
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));

View File

@@ -85,6 +85,27 @@ class BillRepository implements BillRepositoryInterface
return $search->take($limit)->get();
}
/**
* @inheritDoc
* @deprecated
*/
public function collectBillsUnpaidInRange(Carbon $start, Carbon $end): Collection
{
$bills = $this->getActiveBills();
$return = new Collection;
/** @var Bill $bill */
foreach ($bills as $bill) {
$dates = $this->getPayDatesInRange($bill, $start, $end);
$count = $bill->transactionJournals()->after($start)->before($end)->count();
$total = $dates->count() - $count;
if ($total > 0) {
$return->push($bill);
}
}
return $bills;
}
/**
* Correct order of piggies in case of issues.
*/
@@ -255,8 +276,8 @@ class BillRepository implements BillRepositoryInterface
*
* @param Carbon $start
* @param Carbon $end
*
* @return string
* @deprecated
*/
public function getBillsPaidInRange(Carbon $start, Carbon $end): string
{
@@ -291,11 +312,11 @@ class BillRepository implements BillRepositoryInterface
/**
* Get the total amount of money paid for the users active bills in the date range given,
* grouped per currency.
*
* @param Carbon $start
* @param Carbon $end
*
* @return array
* @deprecated
*/
public function getBillsPaidInRangePerCurrency(Carbon $start, Carbon $end): array
{
@@ -323,8 +344,8 @@ class BillRepository implements BillRepositoryInterface
*
* @param Carbon $start
* @param Carbon $end
*
* @return string
* @deprecated
*/
public function getBillsUnpaidInRange(Carbon $start, Carbon $end): string
{
@@ -358,7 +379,6 @@ class BillRepository implements BillRepositoryInterface
* @param Carbon $end
*
* @return Collection
* @throws JsonException
*/
public function getPayDatesInRange(Bill $bill, Carbon $start, Carbon $end): Collection
{
@@ -420,8 +440,8 @@ class BillRepository implements BillRepositoryInterface
*
* @param Carbon $start
* @param Carbon $end
*
* @return array
* @deprecated
*/
public function getBillsUnpaidInRangePerCurrency(Carbon $start, Carbon $end): array
{
@@ -449,6 +469,66 @@ class BillRepository implements BillRepositoryInterface
return $return;
}
/**
* @inheritDoc
*/
public function sumUnpaidInRange(Carbon $start, Carbon $end): array
{
$bills = $this->getActiveBills();
$return = [];
/** @var Bill $bill */
foreach ($bills as $bill) {
$dates = $this->getPayDatesInRange($bill, $start, $end);
$count = $bill->transactionJournals()->after($start)->before($end)->count();
$total = $dates->count() - $count;
if ($total > 0) {
$currency = $bill->transactionCurrency;
$average = bcdiv(bcadd($bill->amount_max, $bill->amount_min), '2');
$return[$currency->id] = $return[$currency->id] ?? [
'id' => (string) $currency->id,
'name' => $currency->name,
'symbol' => $currency->symbol,
'code' => $currency->code,
'decimal_places' => $currency->decimal_places,
'sum' => '0',
];
$return[$currency->id]['sum'] = bcadd($return[$currency->id]['sum'], bcmul($average, (string) $total));
}
}
return $return;
}
/**
* @inheritDoc
*/
public function sumPaidInRange(Carbon $start, Carbon $end): array
{
$bills = $this->getActiveBills();
$return = [];
/** @var Bill $bill */
foreach ($bills as $bill) {
/** @var Collection $set */
$set = $bill->transactionJournals()->after($start)->before($end)->get(['transaction_journals.*']);
$currency = $bill->transactionCurrency;
if ($set->count() > 0) {
$journalIds = $set->pluck('id')->toArray();
$amount = (string) Transaction::whereIn('transaction_journal_id', $journalIds)->where('amount', '<', 0)->sum('amount');
$return[$currency->id] = $return[$currency->id] ?? [
'id' => (string) $currency->id,
'name' => $currency->name,
'symbol' => $currency->symbol,
'code' => $currency->code,
'decimal_places' => $currency->decimal_places,
'sum' => '0',
];
$return[$currency->id]['sum'] = bcadd($return[$currency->id]['sum'], $amount);
}
}
return $return;
}
/**
* Get all bills with these ID's.
*

View File

@@ -43,6 +43,24 @@ interface BillRepositoryInterface
*/
public function billEndsWith(string $query, int $limit): Collection;
/**
* Collect multi-currency of sum of bills yet to pay.
*
* @param Carbon $start
* @param Carbon $end
* @return array
*/
public function sumUnpaidInRange(Carbon $start, Carbon $end): array;
/**
* Collect multi-currency of sum of bills already paid.
*
* @param Carbon $start
* @param Carbon $end
* @return array
*/
public function sumPaidInRange(Carbon $start, Carbon $end): array;
/**
* @param string $query
* @param int $limit
@@ -51,6 +69,16 @@ interface BillRepositoryInterface
*/
public function billStartsWith(string $query, int $limit): Collection;
/**
* Get the total amount of money due for the users active bills in the date range given.
*
* @param Carbon $start
* @param Carbon $end
* @deprecated
* @return Collection
*/
public function collectBillsUnpaidInRange(Carbon $start, Carbon $end): Collection;
/**
* Add correct order to bills.
*/
@@ -126,42 +154,42 @@ interface BillRepositoryInterface
/**
* Get the total amount of money paid for the users active bills in the date range given.
*
* @param Carbon $start
* @param Carbon $end
*
* @return string
* @deprecated
*/
public function getBillsPaidInRange(Carbon $start, Carbon $end): string;
/**
* Get the total amount of money paid for the users active bills in the date range given,
* grouped per currency.
*
* @param Carbon $start
* @param Carbon $end
*
* @return array
* @deprecated
*/
public function getBillsPaidInRangePerCurrency(Carbon $start, Carbon $end): array;
/**
* Get the total amount of money due for the users active bills in the date range given.
*
* @param Carbon $start
* @param Carbon $end
*
* @return string
* @deprecated
*/
public function getBillsUnpaidInRange(Carbon $start, Carbon $end): string;
/**
* Get the total amount of money due for the users active bills in the date range given.
*
* @param Carbon $start
* @param Carbon $end
*
* @return array
* @deprecated
*/
public function getBillsUnpaidInRangePerCurrency(Carbon $start, Carbon $end): array;

38
frontend/src/api/v2/bills/sum.js vendored Normal file
View File

@@ -0,0 +1,38 @@
/*
* list.js
* Copyright (c) 2022 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 <https://www.gnu.org/licenses/>.
*/
import {api} from "boot/axios";
import {format} from "date-fns";
export default class Sum {
unpaid(start, end) {
let url = 'api/v2/bills/sum/unpaid';
let startStr = format(start, 'y-MM-dd');
let endStr = format(end, 'y-MM-dd');
return api.get(url, {params: {start: startStr, end: endStr}});
}
paid(start, end) {
let url = 'api/v2/bills/sum/paid';
let startStr = format(start, 'y-MM-dd');
let endStr = format(end, 'y-MM-dd');
return api.get(url, {params: {start: startStr, end: endStr}});
}
}

View File

@@ -0,0 +1,178 @@
<!--
- BillInsightBox.vue
- Copyright (c) 2022 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 <https://www.gnu.org/licenses/>.
-->
<template>
<!-- TODO most left? q-mr-sm -->
<!-- TODO middle? dan q-mx-sm -->
<!-- TODO right? dan q-ml-sm -->
<div class="q-mr-sm">
<q-card bordered>
<q-item>
<q-item-section>
<q-item-label>{{ $t('firefly.bills_to_pay') }}</q-item-label>
</q-item-section>
</q-item>
<q-separator/>
<q-card-section horizontal>
<q-card-section>
<q-circular-progress
:value="percentage"
size="50px"
:thickness="0.22"
color="green"
track-color="grey-3"
/>
</q-card-section>
<q-separator vertical/>
<q-card-section>
{{ $t('firefly.bills_to_pay') }}:
<span v-for="(bill, index) in unpaid">
{{ formatAmount(bill.code, bill.sum) }}
<span v-if="index+1 !== unpaid.length">, </span>
</span>
<br/>
{{ $t('firefly.bills_paid') }}:
<span v-for="(bill, index) in paid">
{{ formatAmount(bill.code, bill.sum) }}
<span v-if="index+1 !== paid.length">, </span>
</span>
</q-card-section>
</q-card-section>
<!--
<q-card-section class="q-pt-xs">
<div class="text-overline">
<span class="float-right">
<span class="text-grey-4 fas fa-redo-alt" style="cursor: pointer;" @click="triggerForcedUpgrade"></span>
</span>
</div>
</q-card-section>
<q-card-section class="q-pt-xs">
<span v-for="(bill, index) in unpaid">
{{ formatAmount(bill.code, bill.sum) }}
<span v-if="index+1 !== unpaid.length">, </span>
</span>
</q-card-section>
-->
</q-card>
</div>
</template>
<script>
import {useFireflyIIIStore} from "../../stores/fireflyiii";
import Sum from "../../api/v2/bills/sum";
export default {
data() {
return {
store: null,
unpaid: [],
paid: [],
//percentage: 0,
unpaidAmount: 0.0,
paidAmount: 0.0,
range: {
start: null,
end: null,
},
}
},
name: "BillInsightBox",
computed: {
percentage: function () {
if (0 === this.unpaidAmount) {
return 100;
}
const sum = this.unpaidAmount + this.paidAmount;
if (0.0 === this.paidAmount) {
return 0;
}
return (this.paidAmount / sum) * 100;
}
},
mounted() {
this.store = useFireflyIIIStore();
// TODO this code snippet is recycled a lot.
if (null === this.range.start || null === this.range.end) {
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.range = result;
this.triggerUpdate();
}
})
}
)
}
this.triggerUpdate();
},
methods: {
triggerUpdate: function () {
if (null !== this.store.getRange.start && null !== this.store.getRange.end) {
this.unpaid = [];
const start = new Date(this.store.getRange.start);
const end = new Date(this.store.getRange.end);
const sum = new Sum;
sum.unpaid(start, end).then((response) => this.parseUnpaidResponse(response.data));
sum.paid(start, end).then((response) => this.parsePaidResponse(response.data));
}
},
formatAmount: function (currencyCode, amount) {
// TODO not yet internationalized
return Intl.NumberFormat('en-US', {style: 'currency', currency: currencyCode}).format(amount);
},
parseUnpaidResponse: function (data) {
for (let i in data) {
if (data.hasOwnProperty(i)) {
const current = data[i];
this.unpaid.push(
{
sum: current.sum,
code: current.code,
}
);
this.unpaidAmount = this.unpaidAmount + parseFloat(current.sum);
}
}
},
parsePaidResponse: function (data) {
for (let i in data) {
if (data.hasOwnProperty(i)) {
const current = data[i];
this.paid.push(
{
sum: current.sum,
code: current.code,
}
);
this.paidAmount = this.paidAmount + (parseFloat(current.sum) * -1);
}
}
}
}
}
</script>
<style scoped>
</style>

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u041d\u043e\u0432\u043e \u043f\u0440\u0435\u0445\u0432\u044a\u0440\u043b\u044f\u043d\u0435",
"newDeposit": "\u041d\u043e\u0432 \u0434\u0435\u043f\u043e\u0437\u0438\u0442",
"newWithdrawal": "\u041d\u043e\u0432 \u0440\u0430\u0437\u0445\u043e\u0434",
"bills_paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438 \u0441\u043c\u0435\u0442\u043a\u0438",
"rule_trigger_source_account_starts_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0437\u0430\u043f\u043e\u0447\u0432\u0430 \u0441..",
"rule_trigger_source_account_ends_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0437\u0430\u0432\u044a\u0440\u0448\u0432\u0430 \u0441..",
"rule_trigger_source_account_is_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0435..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nov\u00fd p\u0159evod",
"newDeposit": "Nov\u00fd vklad",
"newWithdrawal": "Nov\u00fd v\u00fddaj",
"bills_paid": "Zaplacen\u00e9 \u00fa\u010dty",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Neue Umbuchung",
"newDeposit": "Neue Einnahme",
"newWithdrawal": "Neue Ausgabe",
"bills_paid": "Rechnungen bezahlt",
"rule_trigger_source_account_starts_choice": "Name des Quellkontos beginnt mit..",
"rule_trigger_source_account_ends_choice": "Quellkonto-Name endet mit..",
"rule_trigger_source_account_is_choice": "Quellkonto-Name lautet..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u039d\u03ad\u03b1 \u03bc\u03b5\u03c4\u03b1\u03c6\u03bf\u03c1\u03ac",
"newDeposit": "\u039d\u03ad\u03b1 \u03ba\u03b1\u03c4\u03ac\u03b8\u03b5\u03c3\u03b7",
"newWithdrawal": "\u039d\u03ad\u03b1 \u03b4\u03b1\u03c0\u03ac\u03bd\u03b7",
"bills_paid": "\u03a0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ad\u03bd\u03b1 \u03c0\u03ac\u03b3\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03b1",
"rule_trigger_source_account_starts_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03b1\u03c1\u03c7\u03af\u03b6\u03b5\u03b9 \u03bc\u03b5..",
"rule_trigger_source_account_ends_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 \u03bc\u03b5..",
"rule_trigger_source_account_is_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "New transfer",
"newDeposit": "New deposit",
"newWithdrawal": "New expense",
"bills_paid": "Bills paid",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "New transfer",
"newDeposit": "New deposit",
"newWithdrawal": "New expense",
"bills_paid": "Bills paid",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nueva transferencia",
"newDeposit": "Nuevo deposito",
"newWithdrawal": "Nuevo gasto",
"bills_paid": "Facturas pagadas",
"rule_trigger_source_account_starts_choice": "El nombre de la cuenta de origen comienza con..",
"rule_trigger_source_account_ends_choice": "El nombre de la cuenta de origen termina con..",
"rule_trigger_source_account_is_choice": "El nombre de la cuenta origen es..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Uusi siirto",
"newDeposit": "Uusi talletus",
"newWithdrawal": "Uusi kustannus",
"bills_paid": "Maksetut laskut",
"rule_trigger_source_account_starts_choice": "L\u00e4hdetilin nimi alkaa ...",
"rule_trigger_source_account_ends_choice": "L\u00e4hdetilin nimi p\u00e4\u00e4ttyy..",
"rule_trigger_source_account_is_choice": "L\u00e4hdetilin nimi on..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nouveau transfert",
"newDeposit": "Nouveau d\u00e9p\u00f4t",
"newWithdrawal": "Nouvelle d\u00e9pense",
"bills_paid": "Factures pay\u00e9es",
"rule_trigger_source_account_starts_choice": "Le nom du compte source commence par..",
"rule_trigger_source_account_ends_choice": "Le nom du compte source se termine par..",
"rule_trigger_source_account_is_choice": "Le nom du compte source est..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u00daj \u00e1tvezet\u00e9s",
"newDeposit": "\u00daj bev\u00e9tel",
"newWithdrawal": "\u00daj k\u00f6lts\u00e9g",
"bills_paid": "Befizetett sz\u00e1ml\u00e1k",
"rule_trigger_source_account_starts_choice": "Forr\u00e1ssz\u00e1mla nev\u00e9nek eleje..",
"rule_trigger_source_account_ends_choice": "Forr\u00e1ssz\u00e1mla nev\u00e9nek v\u00e9ge..",
"rule_trigger_source_account_is_choice": "A forr\u00e1ssz\u00e1mla neve..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nuovo trasferimento",
"newDeposit": "Nuova entrata",
"newWithdrawal": "Nuova uscita",
"bills_paid": "Bollette pagate",
"rule_trigger_source_account_starts_choice": "Il nome del conto di origine inizia con..",
"rule_trigger_source_account_ends_choice": "Il nome del conto di origine termina con..",
"rule_trigger_source_account_is_choice": "Il nome del conto di origine \u00e8..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u65b0\u3057\u3044\u9001\u91d1",
"newDeposit": "\u65b0\u3057\u3044\u5165\u91d1",
"newWithdrawal": "\u65b0\u3057\u3044\u652f\u51fa",
"bills_paid": "\u652f\u6255\u3044\u6e08\u307f\u8acb\u6c42",
"rule_trigger_source_account_starts_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c...\u3067\u59cb\u307e\u308b",
"rule_trigger_source_account_ends_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c\u2026\u3067\u7d42\u308f\u308b",
"rule_trigger_source_account_is_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c...",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Ny overf\u00f8ring",
"newDeposit": "Nytt innskudd",
"newWithdrawal": "Ny utgift",
"bills_paid": "Regninger betalt",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nieuwe overschrijving",
"newDeposit": "Nieuwe inkomsten",
"newWithdrawal": "Nieuwe uitgave",
"bills_paid": "Betaalde contracten",
"rule_trigger_source_account_starts_choice": "Bronrekeningnaam begint met..",
"rule_trigger_source_account_ends_choice": "Bronrekeningnaam eindigt op..",
"rule_trigger_source_account_is_choice": "Bronrekeningnaam is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nowy transfer",
"newDeposit": "Nowa wp\u0142ata",
"newWithdrawal": "Nowy wydatek",
"bills_paid": "Zap\u0142acone rachunki",
"rule_trigger_source_account_starts_choice": "Konto \u017ar\u00f3d\u0142owe si\u0119 zaczyna od..",
"rule_trigger_source_account_ends_choice": "Konto \u017ar\u00f3d\u0142owe ko\u0144czy si\u0119 na..",
"rule_trigger_source_account_is_choice": "Kontem \u017ar\u00f3d\u0142owym jest..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nova transfer\u00eancia",
"newDeposit": "Novo dep\u00f3sito",
"newWithdrawal": "Nova despesa",
"bills_paid": "Contas pagas",
"rule_trigger_source_account_starts_choice": "Nome da conta de origem come\u00e7a com..",
"rule_trigger_source_account_ends_choice": "O nome da conta de origem termina com..",
"rule_trigger_source_account_is_choice": "Nome da conta de origem \u00e9..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nova transfer\u00eancia",
"newDeposit": "Novo dep\u00f3sito",
"newWithdrawal": "Nova despesa",
"bills_paid": "Fatura pagas",
"rule_trigger_source_account_starts_choice": "O nome da conta de origem come\u00e7a com..",
"rule_trigger_source_account_ends_choice": "O nome da conta de origem acaba com..",
"rule_trigger_source_account_is_choice": "O nome da conta de origem \u00e9..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Transfer nou",
"newDeposit": "Depozit nou",
"newWithdrawal": "Cheltuieli noi",
"bills_paid": "Facturile pl\u0103tite",
"rule_trigger_source_account_starts_choice": "Numele contului surs\u0103 \u00eencepe cu..",
"rule_trigger_source_account_ends_choice": "Numele contului surs\u0103 se termin\u0103 cu..",
"rule_trigger_source_account_is_choice": "Numele contului surs\u0103 este..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u041d\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434",
"newDeposit": "\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u0445\u043e\u0434",
"newWithdrawal": "\u041d\u043e\u0432\u044b\u0439 \u0440\u0430\u0441\u0445\u043e\u0434",
"bills_paid": "\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0447\u0435\u0442\u0430",
"rule_trigger_source_account_starts_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441..",
"rule_trigger_source_account_ends_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430..",
"rule_trigger_source_account_is_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Nov\u00fd p\u0159evod",
"newDeposit": "Nov\u00fd vklad",
"newWithdrawal": "Nov\u00fd v\u00fddavok",
"bills_paid": "Zaplaten\u00e9 \u00fa\u010dty",
"rule_trigger_source_account_starts_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu za\u010d\u00edna..",
"rule_trigger_source_account_ends_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu kon\u010d\u00ed..",
"rule_trigger_source_account_is_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu je..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Ny \u00f6verf\u00f6ring",
"newDeposit": "Ny ins\u00e4ttning",
"newWithdrawal": "Ny utgift",
"bills_paid": "Notor betalda",
"rule_trigger_source_account_starts_choice": "K\u00e4llkontonamn b\u00f6rjar med..",
"rule_trigger_source_account_ends_choice": "K\u00e4llkontonamn slutar med..",
"rule_trigger_source_account_is_choice": "K\u00e4llkontonamn \u00e4r..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "Chuy\u1ec3n kho\u1ea3n m\u1edbi",
"newDeposit": "Ti\u1ec1n g\u1eedi m\u1edbi",
"newWithdrawal": "Chi ph\u00ed m\u1edbi",
"bills_paid": "H\u00f3a \u0111\u01a1n thanh to\u00e1n",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u65b0\u8f6c\u8d26",
"newDeposit": "\u65b0\u6536\u5165",
"newWithdrawal": "\u65b0\u652f\u51fa",
"bills_paid": "\u5df2\u4ed8\u8d26\u5355",
"rule_trigger_source_account_starts_choice": "\u6765\u6e90\u8d26\u6237\u540d\u79f0\u5f00\u5934\u4e3a...",
"rule_trigger_source_account_ends_choice": "\u6765\u6e90\u8d26\u6237\u7ed3\u5c3e\u4e3a\u2026",
"rule_trigger_source_account_is_choice": "\u6765\u6e90\u8d26\u6237\u540d\u79f0\u4e3a...",

View File

@@ -51,6 +51,7 @@ export default {
"newTransfer": "\u65b0\u8f49\u5e33",
"newDeposit": "\u65b0\u5b58\u6b3e",
"newWithdrawal": "\u65b0\u652f\u51fa",
"bills_paid": "\u5df2\u7e73\u5e33\u55ae",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",

View File

@@ -1 +1 @@
<!DOCTYPE html><html><head><base href=/v3/ ><title>Firefly III</title><meta charset=utf-8><meta name=description content="Personal finances manager"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/png sizes=32x32 href=favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=favicon-16x16.png><link rel=apple-touch-icon sizes=76x76 href=maskable76.png><link rel=apple-touch-icon sizes=120x120 href=maskable120.png><link rel=apple-touch-icon sizes=152x152 href=maskable152.png><link rel=apple-touch-icon sizes=180x180 href=apple-touch-icon.png><link rel=mask-icon href=safari-pinned-tab.svg color=#3c8dbc><link href=maskable192.png rel=icon sizes=192x192><link href=maskable128.png rel=icon sizes=128x128><link rel=manifest href=manifest.webmanifest><meta name=msapplication-TileColor content=#1e6581><meta name=msapplication-TileImage content=maskable512.png><meta name=msapplication-tap-highlight content=no><meta name=application-name content="Firefly III"><meta name=robots content="noindex, nofollow, noarchive, noodp, NoImageIndex, noydir"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-title content="Firefly III"><meta name=application-name content="Firefly III"><meta name=msapplication-TileColor content=#3c8dbc><meta name=msapplication-TileImage content="mstile-144x144.png?v=3e8AboOwbd"><meta name=theme-color content=#3c8dbc><script defer src=/v3/js/vendor.32c6267c.js></script><script defer src=/v3/js/app.2d290244.js></script><link href=/v3/css/vendor.c9c81b16.css rel=stylesheet><link href=/v3/css/app.50c7ba73.css rel=stylesheet></head><body><div id=q-app></div></body></html>
<!DOCTYPE html><html><head><base href=/v3/ ><title>Firefly III</title><meta charset=utf-8><meta name=description content="Personal finances manager"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/png sizes=32x32 href=favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=favicon-16x16.png><link rel=apple-touch-icon sizes=76x76 href=maskable76.png><link rel=apple-touch-icon sizes=120x120 href=maskable120.png><link rel=apple-touch-icon sizes=152x152 href=maskable152.png><link rel=apple-touch-icon sizes=180x180 href=apple-touch-icon.png><link rel=mask-icon href=safari-pinned-tab.svg color=#3c8dbc><link href=maskable192.png rel=icon sizes=192x192><link href=maskable128.png rel=icon sizes=128x128><link rel=manifest href=manifest.webmanifest><meta name=msapplication-TileColor content=#1e6581><meta name=msapplication-TileImage content=maskable512.png><meta name=msapplication-tap-highlight content=no><meta name=application-name content="Firefly III"><meta name=robots content="noindex, nofollow, noarchive, noodp, NoImageIndex, noydir"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-title content="Firefly III"><meta name=application-name content="Firefly III"><meta name=msapplication-TileColor content=#3c8dbc><meta name=msapplication-TileImage content="mstile-144x144.png?v=3e8AboOwbd"><meta name=theme-color content=#3c8dbc><script defer src=/v3/js/vendor.2040cfd3.js></script><script defer src=/v3/js/app.f3f5e525.js></script><link href=/v3/css/vendor.c9c81b16.css rel=stylesheet><link href=/v3/css/app.50c7ba73.css rel=stylesheet></head><body><div id=q-app></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[2323],{2323:(e,t,s)=>{s.r(t),s.d(t,{default:()=>g});var a=s(9835);function n(e,t,s,n,r,i){const o=(0,a.up)("ApexChart");return(0,a.wg)(),(0,a.iD)("div",null,[(0,a.Wm)(o,{width:"100%",ref:"chart",height:"350",type:"line",options:r.options,series:r.series},null,8,["options","series"])])}s(702);var r=s(1569),i=s(8898);class o{overview(e,t){let s=(0,i.Z)(e.start,"y-MM-dd"),a=(0,i.Z)(e.end,"y-MM-dd");return r.api.get("/api/v1/chart/account/overview",{params:{start:s,end:a,cache:t}})}}var l=s(9302),h=s(3555);const d={name:"HomeChart",computed:{},data(){return{range:{start:null,end:null},loading:!1,currencies:[],options:{theme:{mode:"dark"},dataLabels:{enabled:!1},noData:{text:"Loading..."},chart:{id:"vuechart-home",toolbar:{show:!0,tools:{download:!1,selection:!1,pan:!1}}},yaxis:{labels:{formatter:this.numberFormatter}},labels:[],xaxis:{categories:[]}},series:[],locale:"en-US",dateFormat:"MMMM d, y",store:null}},created(){const e=(0,l.Z)();this.locale=e.lang.getLocale(),this.dateFormat=this.$t("config.month_and_day_fns")},mounted(){this.store=(0,h.S)();const e=(0,l.Z)();this.options.theme.mode=e.dark.isActive?"dark":"light",null!==this.range.start&&null!==this.range.end||this.store.$onAction((({name:e,store:t,args:s,after:a,onError:n})=>{a((t=>{"setRange"===e&&(this.range=t,this.buildChart())}))})),null!==this.store.getRange.start&&null!==this.store.getRange.end&&this.buildChart()},methods:{numberFormatter:function(e,t){var s;let a=null!==(s=this.currencies[t])&&void 0!==s?s:"EUR";return Intl.NumberFormat(this.locale,{style:"currency",currency:a}).format(e)},buildChart:function(){if(null!==this.store.getRange.start&&null!==this.store.getRange.end){let e=this.store.getRange.start,t=this.store.getRange.end;if(!1===this.loading){this.loading=!0;const s=new o;this.generateStaticLabels({start:e,end:t}),s.overview({start:e,end:t},this.getCacheKey).then((e=>{this.generateSeries(e.data)}))}}},generateSeries:function(e){let t;this.series=[];for(let s in e)if(e.hasOwnProperty(s)){t={},t.name=e[s].label,t.data=[],this.currencies.push(e[s].currency_code);for(let a in e[s].entries)t.data.push(e[s].entries[a]);this.series.push(t)}this.loading=!1},generateStaticLabels:function(e){let t,s=new Date(e.start),a=[];while(s<=e.end)a.push((0,i.Z)(s,this.dateFormat)),t=s.setDate(s.getDate()+1),s=new Date(t);this.options={...this.options,labels:a}}},components:{ApexChart:(0,a.RC)((()=>s.e(4736).then(s.t.bind(s,7092,23))))}};var c=s(1639);const u=(0,c.Z)(d,[["render",n]]),g=u}}]);

View File

@@ -1 +1 @@
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[4640],{4640:(e,s,t)=>{t.r(s),t.d(s,{default:()=>Q});var r=t(9835),o=t(6970);const a={class:"row q-mx-md"},i={class:"col-12"},l={class:"row q-mx-md q-mt-md"},n={class:"col-12"},u=(0,r._)("div",{class:"text-h6"},"Info for new budget",-1),d={class:"row"},m={class:"col-12 q-mb-xs"},c={class:"row q-mx-md"},b={class:"col-12"},h={class:"row"},p={class:"col-12 text-right"},f={class:"row"},g={class:"col-12 text-right"},w=(0,r._)("br",null,null,-1);function _(e,s,t,_,v,q){const E=(0,r.up)("q-btn"),k=(0,r.up)("q-banner"),x=(0,r.up)("q-card-section"),C=(0,r.up)("q-input"),R=(0,r.up)("q-card"),I=(0,r.up)("q-checkbox"),S=(0,r.up)("q-page");return(0,r.wg)(),(0,r.j4)(S,null,{default:(0,r.w5)((()=>[(0,r._)("div",a,[(0,r._)("div",i,[""!==v.errorMessage?((0,r.wg)(),(0,r.j4)(k,{key:0,"inline-actions":"",rounded:"",class:"bg-orange text-white"},{action:(0,r.w5)((()=>[(0,r.Wm)(E,{flat:"",onClick:q.dismissBanner,label:"Dismiss"},null,8,["onClick"])])),default:(0,r.w5)((()=>[(0,r.Uk)((0,o.zw)(v.errorMessage)+" ",1)])),_:1})):(0,r.kq)("",!0)])]),(0,r._)("div",l,[(0,r._)("div",n,[(0,r.Wm)(R,{bordered:""},{default:(0,r.w5)((()=>[(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[u])),_:1}),(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[(0,r._)("div",d,[(0,r._)("div",m,[(0,r.Wm)(C,{"error-message":v.submissionErrors.name,error:v.hasSubmissionErrors.name,"bottom-slots":"",disable:q.disabledInput,type:"text",clearable:"",modelValue:v.name,"onUpdate:modelValue":s[0]||(s[0]=e=>v.name=e),label:e.$t("form.name"),outlined:""},null,8,["error-message","error","disable","modelValue","label"])])])])),_:1})])),_:1})])]),(0,r._)("div",c,[(0,r._)("div",b,[(0,r.Wm)(R,{class:"q-mt-xs"},{default:(0,r.w5)((()=>[(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[(0,r._)("div",h,[(0,r._)("div",p,[(0,r.Wm)(E,{disable:q.disabledInput,color:"primary",label:"Submit",onClick:q.submitBudget},null,8,["disable","onClick"])])]),(0,r._)("div",f,[(0,r._)("div",g,[(0,r.Wm)(I,{disable:q.disabledInput,modelValue:v.doReturnHere,"onUpdate:modelValue":s[1]||(s[1]=e=>v.doReturnHere=e),"left-label":"",label:"Return here to create another one"},null,8,["disable","modelValue"]),w,(0,r.Wm)(I,{modelValue:v.doResetForm,"onUpdate:modelValue":s[2]||(s[2]=e=>v.doResetForm=e),"left-label":"",disable:!v.doReturnHere||q.disabledInput,label:"Reset form after submission"},null,8,["modelValue","disable"])])])])),_:1})])),_:1})])])])),_:1})}var v=t(1569);class q{post(e){let s="/api/v1/budgets";return v.api.post(s,e)}}const E={name:"Create",data(){return{submissionErrors:{},hasSubmissionErrors:{},submitting:!1,doReturnHere:!1,doResetForm:!1,errorMessage:"",type:"",name:""}},computed:{disabledInput:function(){return this.submitting}},created(){this.resetForm(),this.type=this.$route.params.type},methods:{resetForm:function(){this.name="",this.resetErrors()},resetErrors:function(){this.submissionErrors={name:""},this.hasSubmissionErrors={name:!1}},submitBudget:function(){this.submitting=!0,this.errorMessage="",this.resetErrors();const e=this.buildBudget();let s=new q;s.post(e).catch(this.processErrors).then(this.processSuccess)},buildBudget:function(){return{name:this.name}},dismissBanner:function(){this.errorMessage=""},processSuccess:function(e){if(!e)return;this.submitting=!1;let s={level:"success",text:"I am new budget",show:!0,action:{show:!0,text:"Go to budget",link:{name:"budgets.show",params:{id:parseInt(e.data.data.id)}}}};this.$q.localStorage.set("flash",s),this.doReturnHere&&window.dispatchEvent(new CustomEvent("flash",{detail:{flash:this.$q.localStorage.getItem("flash")}})),this.doReturnHere||this.$router.go(-1)},processErrors:function(e){if(e.response){let s=e.response.data;this.errorMessage=s.message,console.log(s);for(let e in s.errors)s.errors.hasOwnProperty(e)&&(this.submissionErrors[e]=s.errors[e][0],this.hasSubmissionErrors[e]=!0)}this.submitting=!1}}};var k=t(1639),x=t(9885),C=t(7128),R=t(8879),I=t(4458),S=t(3190),W=t(6611),y=t(1221),V=t(9984),B=t.n(V);const Z=(0,k.Z)(E,[["render",_]]),Q=Z;B()(E,"components",{QPage:x.Z,QBanner:C.Z,QBtn:R.Z,QCard:I.Z,QCardSection:S.Z,QInput:W.Z,QCheckbox:y.Z})}}]);
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[4640],{4343:(e,s,t)=>{t.r(s),t.d(s,{default:()=>Q});var r=t(9835),o=t(6970);const a={class:"row q-mx-md"},i={class:"col-12"},l={class:"row q-mx-md q-mt-md"},n={class:"col-12"},u=(0,r._)("div",{class:"text-h6"},"Info for new budget",-1),d={class:"row"},m={class:"col-12 q-mb-xs"},c={class:"row q-mx-md"},b={class:"col-12"},h={class:"row"},p={class:"col-12 text-right"},f={class:"row"},g={class:"col-12 text-right"},w=(0,r._)("br",null,null,-1);function _(e,s,t,_,v,q){const E=(0,r.up)("q-btn"),k=(0,r.up)("q-banner"),x=(0,r.up)("q-card-section"),C=(0,r.up)("q-input"),R=(0,r.up)("q-card"),I=(0,r.up)("q-checkbox"),S=(0,r.up)("q-page");return(0,r.wg)(),(0,r.j4)(S,null,{default:(0,r.w5)((()=>[(0,r._)("div",a,[(0,r._)("div",i,[""!==v.errorMessage?((0,r.wg)(),(0,r.j4)(k,{key:0,"inline-actions":"",rounded:"",class:"bg-orange text-white"},{action:(0,r.w5)((()=>[(0,r.Wm)(E,{flat:"",onClick:q.dismissBanner,label:"Dismiss"},null,8,["onClick"])])),default:(0,r.w5)((()=>[(0,r.Uk)((0,o.zw)(v.errorMessage)+" ",1)])),_:1})):(0,r.kq)("",!0)])]),(0,r._)("div",l,[(0,r._)("div",n,[(0,r.Wm)(R,{bordered:""},{default:(0,r.w5)((()=>[(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[u])),_:1}),(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[(0,r._)("div",d,[(0,r._)("div",m,[(0,r.Wm)(C,{"error-message":v.submissionErrors.name,error:v.hasSubmissionErrors.name,"bottom-slots":"",disable:q.disabledInput,type:"text",clearable:"",modelValue:v.name,"onUpdate:modelValue":s[0]||(s[0]=e=>v.name=e),label:e.$t("form.name"),outlined:""},null,8,["error-message","error","disable","modelValue","label"])])])])),_:1})])),_:1})])]),(0,r._)("div",c,[(0,r._)("div",b,[(0,r.Wm)(R,{class:"q-mt-xs"},{default:(0,r.w5)((()=>[(0,r.Wm)(x,null,{default:(0,r.w5)((()=>[(0,r._)("div",h,[(0,r._)("div",p,[(0,r.Wm)(E,{disable:q.disabledInput,color:"primary",label:"Submit",onClick:q.submitBudget},null,8,["disable","onClick"])])]),(0,r._)("div",f,[(0,r._)("div",g,[(0,r.Wm)(I,{disable:q.disabledInput,modelValue:v.doReturnHere,"onUpdate:modelValue":s[1]||(s[1]=e=>v.doReturnHere=e),"left-label":"",label:"Return here to create another one"},null,8,["disable","modelValue"]),w,(0,r.Wm)(I,{modelValue:v.doResetForm,"onUpdate:modelValue":s[2]||(s[2]=e=>v.doResetForm=e),"left-label":"",disable:!v.doReturnHere||q.disabledInput,label:"Reset form after submission"},null,8,["modelValue","disable"])])])])),_:1})])),_:1})])])])),_:1})}var v=t(1569);class q{post(e){let s="/api/v1/budgets";return v.api.post(s,e)}}const E={name:"Create",data(){return{submissionErrors:{},hasSubmissionErrors:{},submitting:!1,doReturnHere:!1,doResetForm:!1,errorMessage:"",type:"",name:""}},computed:{disabledInput:function(){return this.submitting}},created(){this.resetForm(),this.type=this.$route.params.type},methods:{resetForm:function(){this.name="",this.resetErrors()},resetErrors:function(){this.submissionErrors={name:""},this.hasSubmissionErrors={name:!1}},submitBudget:function(){this.submitting=!0,this.errorMessage="",this.resetErrors();const e=this.buildBudget();let s=new q;s.post(e).catch(this.processErrors).then(this.processSuccess)},buildBudget:function(){return{name:this.name}},dismissBanner:function(){this.errorMessage=""},processSuccess:function(e){if(!e)return;this.submitting=!1;let s={level:"success",text:"I am new budget",show:!0,action:{show:!0,text:"Go to budget",link:{name:"budgets.show",params:{id:parseInt(e.data.data.id)}}}};this.$q.localStorage.set("flash",s),this.doReturnHere&&window.dispatchEvent(new CustomEvent("flash",{detail:{flash:this.$q.localStorage.getItem("flash")}})),this.doReturnHere||this.$router.go(-1)},processErrors:function(e){if(e.response){let s=e.response.data;this.errorMessage=s.message,console.log(s);for(let e in s.errors)s.errors.hasOwnProperty(e)&&(this.submissionErrors[e]=s.errors[e][0],this.hasSubmissionErrors[e]=!0)}this.submitting=!1}}};var k=t(1639),x=t(9885),C=t(7128),R=t(8879),I=t(4458),S=t(3190),W=t(6611),y=t(1221),V=t(9984),B=t.n(V);const Z=(0,k.Z)(E,[["render",_]]),Q=Z;B()(E,"components",{QPage:x.Z,QBanner:C.Z,QBtn:R.Z,QCard:I.Z,QCardSection:S.Z,QInput:W.Z,QCheckbox:y.Z})}}]);

1
public/v3/js/5574.f3eca6b9.js vendored Normal file
View File

@@ -0,0 +1 @@
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[5574],{5574:(t,e,n)=>{n.r(e),n.d(e,{default:()=>W});var a=n(9835),i=n(6970);const s={class:"q-mr-sm"},r={key:0},u=(0,a._)("br",null,null,-1),l={key:0};function o(t,e,n,o,d,p){const m=(0,a.up)("q-item-label"),c=(0,a.up)("q-item-section"),h=(0,a.up)("q-item"),g=(0,a.up)("q-separator"),f=(0,a.up)("q-circular-progress"),w=(0,a.up)("q-card-section"),y=(0,a.up)("q-card");return(0,a.wg)(),(0,a.iD)("div",s,[(0,a.Wm)(y,{bordered:""},{default:(0,a.w5)((()=>[(0,a.Wm)(h,null,{default:(0,a.w5)((()=>[(0,a.Wm)(c,null,{default:(0,a.w5)((()=>[(0,a.Wm)(m,null,{default:(0,a.w5)((()=>[(0,a.Uk)((0,i.zw)(t.$t("firefly.bills_to_pay")),1)])),_:1})])),_:1})])),_:1}),(0,a.Wm)(g),(0,a.Wm)(w,{horizontal:""},{default:(0,a.w5)((()=>[(0,a.Wm)(w,null,{default:(0,a.w5)((()=>[(0,a.Wm)(f,{value:p.percentage,size:"50px",thickness:.22,color:"green","track-color":"grey-3"},null,8,["value","thickness"])])),_:1}),(0,a.Wm)(g,{vertical:""}),(0,a.Wm)(w,null,{default:(0,a.w5)((()=>[(0,a.Uk)((0,i.zw)(t.$t("firefly.bills_to_pay"))+": ",1),((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(d.unpaid,((t,e)=>((0,a.wg)(),(0,a.iD)("span",null,[(0,a.Uk)((0,i.zw)(p.formatAmount(t.code,t.sum))+" ",1),e+1!==d.unpaid.length?((0,a.wg)(),(0,a.iD)("span",r,", ")):(0,a.kq)("",!0)])))),256)),u,(0,a.Uk)(" "+(0,i.zw)(t.$t("firefly.bills_paid"))+": ",1),((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(d.paid,((t,e)=>((0,a.wg)(),(0,a.iD)("span",null,[(0,a.Uk)((0,i.zw)(p.formatAmount(t.code,t.sum))+" ",1),e+1!==d.paid.length?((0,a.wg)(),(0,a.iD)("span",l,", ")):(0,a.kq)("",!0)])))),256))])),_:1})])),_:1})])),_:1})])}var d=n(3555),p=n(1569),m=n(8898);class c{unpaid(t,e){let n="api/v2/bills/sum/unpaid",a=(0,m.Z)(t,"y-MM-dd"),i=(0,m.Z)(e,"y-MM-dd");return p.api.get(n,{params:{start:a,end:i}})}paid(t,e){let n="api/v2/bills/sum/paid",a=(0,m.Z)(t,"y-MM-dd"),i=(0,m.Z)(e,"y-MM-dd");return p.api.get(n,{params:{start:a,end:i}})}}const h={data(){return{store:null,unpaid:[],paid:[],unpaidAmount:0,paidAmount:0,range:{start:null,end:null}}},name:"BillInsightBox",computed:{percentage:function(){if(0===this.unpaidAmount)return 100;const t=this.unpaidAmount+this.paidAmount;return 0===this.paidAmount?0:this.paidAmount/t*100}},mounted(){this.store=(0,d.S)(),null!==this.range.start&&null!==this.range.end||this.store.$onAction((({name:t,$store:e,args:n,after:a,onError:i})=>{a((e=>{"setRange"===t&&(this.range=e,this.triggerUpdate())}))})),this.triggerUpdate()},methods:{triggerUpdate:function(){if(null!==this.store.getRange.start&&null!==this.store.getRange.end){this.unpaid=[];const t=new Date(this.store.getRange.start),e=new Date(this.store.getRange.end),n=new c;n.unpaid(t,e).then((t=>this.parseUnpaidResponse(t.data))),n.paid(t,e).then((t=>this.parsePaidResponse(t.data)))}},formatAmount:function(t,e){return Intl.NumberFormat("en-US",{style:"currency",currency:t}).format(e)},parseUnpaidResponse:function(t){for(let e in t)if(t.hasOwnProperty(e)){const n=t[e];this.unpaid.push({sum:n.sum,code:n.code}),this.unpaidAmount=this.unpaidAmount+parseFloat(n.sum)}},parsePaidResponse:function(t){for(let e in t)if(t.hasOwnProperty(e)){const n=t[e];this.paid.push({sum:n.sum,code:n.code}),this.paidAmount=this.paidAmount+-1*parseFloat(n.sum)}}}};var g=n(1639),f=n(4458),w=n(490),y=n(1233),k=n(3115),A=n(926),_=n(3190),b=n(3302),Z=n(9984),U=n.n(Z);const q=(0,g.Z)(h,[["render",o]]),W=q;U()(h,"components",{QCard:f.Z,QItem:w.Z,QItemSection:y.Z,QItemLabel:k.Z,QSeparator:A.Z,QCardSection:_.Z,QCircularProgress:b.Z})}}]);

View File

@@ -1 +0,0 @@
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[6742],{6742:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var s=a(9835);const n={key:0,class:"q-ma-md"},o={key:1,class:"q-ma-md"},r={key:2,class:"row q-ma-md"},l={class:"col-12"},i=(0,s._)("div",{class:"text-h6"},"Firefly III",-1),c=(0,s._)("div",{class:"text-subtitle2"},"What's playing?",-1);function u(e,t,a,u,m,d){const f=(0,s.up)("NewUser"),p=(0,s.up)("Boxes"),h=(0,s.up)("q-card-section"),w=(0,s.up)("HomeChart"),g=(0,s.up)("q-card"),b=(0,s.up)("q-fab-action"),y=(0,s.up)("q-fab"),C=(0,s.up)("q-page-sticky"),q=(0,s.up)("q-page");return(0,s.wg)(),(0,s.j4)(q,null,{default:(0,s.w5)((()=>[0===e.assetCount?((0,s.wg)(),(0,s.iD)("div",n,[(0,s.Wm)(f,{onCreatedAccounts:e.refreshThenCount},null,8,["onCreatedAccounts"])])):(0,s.kq)("",!0),e.assetCount>0?((0,s.wg)(),(0,s.iD)("div",o,[(0,s.Wm)(p)])):(0,s.kq)("",!0),e.assetCount>0?((0,s.wg)(),(0,s.iD)("div",r,[(0,s._)("div",l,[(0,s.Wm)(g,{bordered:""},{default:(0,s.w5)((()=>[(0,s.Wm)(h,null,{default:(0,s.w5)((()=>[i,c])),_:1}),(0,s.Wm)(h,null,{default:(0,s.w5)((()=>[(0,s.Wm)(w)])),_:1})])),_:1})])])):(0,s.kq)("",!0),e.assetCount>0?((0,s.wg)(),(0,s.j4)(C,{key:3,position:"bottom-right",offset:[18,18]},{default:(0,s.w5)((()=>[(0,s.Wm)(y,{label:"Actions",square:"","vertical-actions-align":"right","label-position":"left",color:"green",icon:"fas fa-chevron-up",direction:"up"},{default:(0,s.w5)((()=>[(0,s.Wm)(b,{color:"primary",square:"",icon:"fas fa-chart-pie",label:"New budget",to:{name:"budgets.create"}},null,8,["to"]),(0,s.Wm)(b,{color:"primary",square:"",icon:"far fa-money-bill-alt",label:"New asset account",to:{name:"accounts.create",params:{type:"asset"}}},null,8,["to"]),(0,s.Wm)(b,{color:"primary",square:"",icon:"fas fa-exchange-alt",label:"New transfer",to:{name:"transactions.create",params:{type:"transfer"}}},null,8,["to"]),(0,s.Wm)(b,{color:"primary",square:"",icon:"fas fa-long-arrow-alt-right",label:"New deposit",to:{name:"transactions.create",params:{type:"deposit"}}},null,8,["to"]),(0,s.Wm)(b,{color:"primary",square:"",icon:"fas fa-long-arrow-alt-left",label:"New withdrawal",to:{name:"transactions.create",params:{type:"withdrawal"}}},null,8,["to"])])),_:1})])),_:1})):(0,s.kq)("",!0)])),_:1})}a(702);var m=a(3836),d=a(3555);const f=(0,s.aZ)({name:"PageIndex",components:{Boxes:(0,s.RC)((()=>Promise.all([a.e(4736),a.e(2195)]).then(a.bind(a,2195)))),HomeChart:(0,s.RC)((()=>Promise.all([a.e(4736),a.e(2323)]).then(a.bind(a,2323)))),NewUser:(0,s.RC)((()=>Promise.all([a.e(4736),a.e(3064),a.e(1543)]).then(a.bind(a,1543))))},data(){return{assetCount:1,$store:null}},computed:{},mounted(){this.countAssetAccounts()},methods:{refreshThenCount:function(){this.$store=(0,d.S)(),this.$store.refreshCacheKey(),this.countAssetAccounts()},countAssetAccounts:function(){let e=new m.Z;e.list("asset",1,this.getCacheKey).then((e=>{this.assetCount=parseInt(e.data.meta.pagination.total)}))}}});var p=a(1639),h=a(9885),w=a(4458),g=a(3190),b=a(3388),y=a(9361),C=a(935),q=a(9984),k=a.n(q);const W=(0,p.Z)(f,[["render",u]]),v=W;k()(f,"components",{QPage:h.Z,QCard:w.Z,QCardSection:g.Z,QPageSticky:b.Z,QFab:y.Z,QFabAction:C.Z})}}]);

1
public/v3/js/7135.b88c6b37.js vendored Normal file
View File

@@ -0,0 +1 @@
"use strict";(self["webpackChunkfirefly_iii"]=self["webpackChunkfirefly_iii"]||[]).push([[7135],{4640:(e,a,t)=>{t.r(a),t.d(a,{default:()=>D});var s=t(9835);const o={key:0},n={key:1};function i(e,a,t,i,l,r){const c=(0,s.up)("NewUser"),u=(0,s.up)("Dashboard"),d=(0,s.up)("q-page");return(0,s.wg)(),(0,s.j4)(d,null,{default:(0,s.w5)((()=>[0===e.assetCount?((0,s.wg)(),(0,s.iD)("div",o,[(0,s.Wm)(c,{onCreatedAccounts:e.refreshThenCount},null,8,["onCreatedAccounts"])])):(0,s.kq)("",!0),e.assetCount>0?((0,s.wg)(),(0,s.iD)("div",n,[(0,s.Wm)(u)])):(0,s.kq)("",!0)])),_:1})}t(702);var l=t(3836),r=t(3555);const c={class:"q-ma-md"},u={class:"row q-mb-sm"},d={class:"col"},m=(0,s._)("div",{class:"col"}," TODO spend insight ",-1),f=(0,s._)("div",{class:"col"}," TODO net worth insight ",-1),p=(0,s.uE)('<div class="row q-mb-sm"><div class="col"> Account chart box </div></div><div class="row q-mb-sm"><div class="col"> Account transaction list. </div></div><div class="row q-mb-sm"><div class="col"> Budget box </div><div class="col"> Category box </div></div><div class="row q-mb-sm"><div class="col"> Expense Box </div><div class="col"> Revenue Box </div></div><div class="row q-mb-sm"><div class="col"> Piggy box </div><div class="col"> Bill box </div></div>',5);function v(e,a,t,o,n,i){const l=(0,s.up)("BillInsightBox"),r=(0,s.up)("q-fab-action"),v=(0,s.up)("q-fab"),b=(0,s.up)("q-page-sticky");return(0,s.wg)(),(0,s.iD)("div",c,[(0,s._)("div",u,[(0,s._)("div",d,[(0,s.Wm)(l)]),m,f]),p,(0,s.Wm)(b,{position:"bottom-right",offset:[18,18]},{default:(0,s.w5)((()=>[(0,s.Wm)(v,{label:"Actions",square:"","vertical-actions-align":"right","label-position":"left",color:"green",icon:"fas fa-chevron-up",direction:"up"},{default:(0,s.w5)((()=>[(0,s.Wm)(r,{color:"primary",square:"",icon:"fas fa-chart-pie",label:e.$t("firefly.new_budget"),to:{name:"budgets.create"}},null,8,["label","to"]),(0,s.Wm)(r,{color:"primary",square:"",icon:"far fa-money-bill-alt",label:e.$t("firefly.new_asset_account"),to:{name:"accounts.create",params:{type:"asset"}}},null,8,["label","to"]),(0,s.Wm)(r,{color:"primary",square:"",icon:"fas fa-exchange-alt",label:e.$t("firefly.newTransfer"),to:{name:"transactions.create",params:{type:"transfer"}}},null,8,["label","to"]),(0,s.Wm)(r,{color:"primary",square:"",icon:"fas fa-long-arrow-alt-right",label:e.$t("firefly.newDeposit"),to:{name:"transactions.create",params:{type:"deposit"}}},null,8,["label","to"]),(0,s.Wm)(r,{color:"primary",square:"",icon:"fas fa-long-arrow-alt-left",label:e.$t("firefly.newWithdrawal"),to:{name:"transactions.create",params:{type:"withdrawal"}}},null,8,["label","to"])])),_:1})])),_:1})])}const b={name:"Dashboard",components:{BillInsightBox:(0,s.RC)((()=>Promise.all([t.e(4736),t.e(5574)]).then(t.bind(t,5574))))}};var h=t(1639),g=t(3388),w=t(9361),y=t(935),q=t(9984),C=t.n(q);const x=(0,h.Z)(b,[["render",v]]),A=x;C()(b,"components",{QPageSticky:g.Z,QFab:w.Z,QFabAction:y.Z});const _=(0,s.aZ)({name:"PageIndex",components:{Dashboard:A,NewUser:(0,s.RC)((()=>Promise.all([t.e(4736),t.e(3064),t.e(1543)]).then(t.bind(t,1543))))},data(){return{assetCount:1,$store:null}},mounted(){this.countAssetAccounts()},methods:{refreshThenCount:function(){this.$store=(0,r.S)(),this.$store.refreshCacheKey(),this.countAssetAccounts()},countAssetAccounts:function(){let e=new l.Z;e.list("asset",1,this.getCacheKey).then((e=>{this.assetCount=parseInt(e.data.meta.pagination.total)}))}}});var W=t(9885);const k=(0,h.Z)(_,[["render",i]]),D=k;C()(_,"components",{QPage:W.Z})}}]);

File diff suppressed because one or more lines are too long

1
public/v3/js/app.f3f5e525.js vendored Normal file

File diff suppressed because one or more lines are too long

456
public/v3/js/vendor.2040cfd3.js vendored Normal file

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More