New frontend.

This commit is contained in:
James Cole
2021-01-31 07:26:52 +01:00
parent d4c9f53b10
commit d60c5a26de
62 changed files with 708 additions and 342 deletions

View File

@@ -24,6 +24,7 @@ const lodashClonedeep = require('lodash.clonedeep');
const state = () => ({
transactionType: 'any',
date: new Date,
groupTitle: '',
transactions: [],
allowedOpposingTypes: {},
accountToTransaction: {},
@@ -37,6 +38,22 @@ const state = () => ({
payment_date: false,
invoice_date: false,
},
defaultErrors: {
description: [],
amount: [],
source: [],
destination: [],
currency: [],
foreign_currency: [],
foreign_amount: [],
date: [],
custom_dates: [],
budget: [],
category: [],
bill: [],
tags: [],
piggy_bank: []
},
defaultTransaction: {
// basic
description: '',
@@ -94,9 +111,7 @@ const state = () => ({
attachments: [],
// error handling
errors: {
description: []
},
errors: {},
},
}
)
@@ -110,6 +125,9 @@ const getters = {
date: state => {
return state.date;
},
groupTitle: state => {
return state.groupTitle;
},
transactionType: state => {
return state.transactionType;
},
@@ -185,11 +203,19 @@ const actions = {
const mutations = {
addTransaction(state) {
let newTransaction = lodashClonedeep(state.defaultTransaction);
newTransaction.errors = lodashClonedeep(state.defaultErrors);
state.transactions.push(newTransaction);
},
resetErrors(state, payload) {
console.log('resetErrors for index ' + payload.index);
state.transactions[payload.index].errors = lodashClonedeep(state.defaultErrors);
},
setDate(state, payload) {
state.date = payload.date;
},
setGroupTitle(state, payload) {
state.groupTitle = payload.groupTitle;
},
setCustomDateFields(state, payload) {
state.customDateFields = payload;
},
@@ -208,6 +234,11 @@ const mutations = {
updateField(state, payload) {
state.transactions[payload.index][payload.field] = payload.value;
},
setTransactionError(state, payload) {
console.log('Will set transactions[' + payload.index + '][errors][' + payload.field + '] to ');
console.log(payload.errors);
state.transactions[payload.index].errors[payload.field] = payload.errors;
},
setDestinationAllowedTypes(state, payload) {
// console.log('Destination allowed types was changed!');
state.destinationAllowedTypes = payload;

View File

@@ -20,182 +20,251 @@
<template>
<div>
<div class="row" v-for="(transaction, index) in this.transactions">
<div class="alert alert-danger alert-dismissible" v-if="this.errorMessage.length > 0">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h5><i class="icon fas fa-ban"></i> {{ $t("firefly.flash_error") }}</h5>
{{ errorMessage }}
</div>
<div class="row" v-if="transactions.length > 1">
<div class="col">
<div class="card">
<!-- tabs -->
<ul class="nav nav-pills ml-auto p-2">
<li v-for="(transaction, index) in this.transactions" class="nav-item"><a :class="'nav-link' + (0===index ? ' active' : '')" :href="'#split_' + index"
data-toggle="tab">
<span v-if="'' !== transaction.description">{{ transaction.description }}</span>
<span v-if="'' === transaction.description">Split {{ index + 1 }}</span>
</a></li>
</ul>
</div>
</div>
<div class="tab-content">
<div v-for="(transaction, index) in this.transactions" :class="'tab-pane' + (0===index ? ' active' : '')" :id="'split_' + index">
<div class="row">
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">
{{ $t('firefly.basic_journal_information') }}
<span v-if="transactions.length > 1">({{ index + 1 }} / {{ transactions.length }}) </span>
</h3>
</div>
<div class="card-body">
<!-- start of body -->
<div class="row">
<div class="col">
<TransactionDescription
v-model="transaction.description"
:index="index"
:errors="transaction.errors.description"
></TransactionDescription>
</div>
</div>
<!-- source and destination -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-10 col-sm-12 col-xs-12">
<!-- SOURCE -->
<TransactionAccount
v-model="transaction.source_account"
direction="source"
:index="index"
:errors="transaction.errors.source"
/>
</div>
<!-- switcharoo! -->
<div class="col-xl-2 col-lg-2 col-md-2 col-sm-12 text-center d-none d-sm-block">
<SwitchAccount
:index="index"
/>
</div>
<!-- destination -->
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<!-- DESTINATION -->
<TransactionAccount
v-model="transaction.destination_account"
direction="destination"
:index="index"
:errors="transaction.errors.destination"
/>
</div>
</div>
<!-- amount -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-10 col-sm-12 col-xs-12">
<!-- AMOUNT -->
<TransactionAmount :index="index" :errors="transaction.errors.amount"/>
<!--
-->
</div>
<div class="col-xl-2 col-lg-2 col-md-2 col-sm-12 text-center d-none d-sm-block">
<TransactionForeignCurrency :index="index"/>
</div>
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<TransactionForeignAmount :index="index" :errors="transaction.errors.foreign_amount"/>
</div>
</div>
<!-- dates -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<TransactionDate
:index="index"
:errors="transaction.errors.date"
/>
</div>
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12 offset-xl-2 offset-lg-2">
<TransactionCustomDates :index="index" :enabled-dates="customDateFields" :errors="transaction.errors.custom_dates"/>
</div>
</div>
<!-- end of body -->
</div>
</div>
</div>
</div> <!-- end of basic card -->
<!-- card for meta -->
<div class="row">
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">
{{ $t('firefly.transaction_journal_meta') }}
<span v-if="transactions.length > 1">({{ index + 1 }} / {{ transactions.length }}) </span>
</h3>
</div>
<div class="card-body">
<!-- start of body -->
<!-- meta -->
<div class="row">
<div class="col">
<TransactionBudget
v-model="transaction.budget_id"
:index="index"
:errors="transaction.errors.budget"
/>
<TransactionCategory
v-model="transaction.category"
:index="index"
:errors="transaction.errors.category"
/>
</div>
<div class="col">
<TransactionBill
v-model="transaction.bill_id"
:index="index"
:errors="transaction.errors.bill"
/>
<TransactionTags
:index="index"
v-model="transaction.tags"
:errors="transaction.errors.tags"
/>
<TransactionPiggyBank
:index="index"
v-model="transaction.piggy_bank_id"
:errors="transaction.errors.piggy_bank"
/>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- end card for meta -->
<!-- card for extra -->
<div class="row">
<div class="col">
<div class="card">
<div class="card-header">
<h3 class="card-title">
{{ $t('firefly.transaction_journal_meta') }}
<span v-if="transactions.length > 1">({{ index + 1 }} / {{ transactions.length }}) </span>
</h3>
</div>
<div class="card-body">
<!-- start of body -->
<div class="row">
<div class="col">
<TransactionInternalReference
:index="index"
v-model="transaction.internal_reference"
/>
<TransactionExternalUrl
:index="index"
v-model="transaction.external_url"
/>
<TransactionNotes
:index="index"
v-model="transaction.notes"
/>
</div>
<div class="col">
<TransactionAttachments
:index="index"
v-model="transaction.attachments"
/>
<TransactionLinks :index="index"
v-model="transaction.links"
/>
</div>
</div>
<!-- end of body -->
</div>
</div>
</div>
</div>
<!-- end card for extra -->
<!-- end of card -->
</div>
</div>
<div class="row">
<!-- group title -->
<div class="col">
<div class="card" v-if="transactions.length > 1">
<div class="card-header">
<h3 class="card-title">
<span v-if="1 === transactions.length">{{ $t('firefly.create_new_transaction') }}</span>
<span v-if="transactions.length > 1">{{ $t('firefly.single_split') }} {{ index + 1 }} / {{ transactions.length }}</span>
{{ $t('firefly.split_transaction_title') }}
</h3>
<div v-if="transactions.length > 1" class="card-tools">
<button class="btn btn-xs btn-danger" type="button" v-on:click="removeTransaction(index)"><i
class="fa fa-trash"></i></button>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<h5>{{ $t('firefly.basic_journal_information') }}</h5>
<!-- description etc, 3 rows -->
<div class="row">
<div class="col">
<TransactionDescription
v-model="transaction.description"
:index="index"
></TransactionDescription>
<TransactionGroupTitle v-model="this.groupTitle"/>
</div>
</div>
<!-- source and destination -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-10 col-sm-12 col-xs-12">
<!-- SOURCE -->
<TransactionAccount
v-model="transaction.source_account"
direction="source"
:index="index"
/>
</div>
<!-- switcharoo! -->
<div class="col-xl-2 col-lg-2 col-md-2 col-sm-12 text-center d-none d-sm-block">
<SwitchAccount
:index="index"
/>
</div>
<!-- destination -->
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<!-- DESTINATION -->
<TransactionAccount
v-model="transaction.destination_account"
direction="destination"
:index="index"
/>
</div>
</div>
<!-- amount -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-10 col-sm-12 col-xs-12">
<!-- AMOUNT -->
<TransactionAmount :index="index"/>
<!--
-->
</div>
<div class="col-xl-2 col-lg-2 col-md-2 col-sm-12 text-center d-none d-sm-block">
<TransactionForeignCurrency :index="index"/>
</div>
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<TransactionForeignAmount :index="index"/>
</div>
</div>
<!-- dates -->
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<TransactionDate
:index="index"
/>
</div>
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12 offset-xl-2 offset-lg-2">
<TransactionCustomDates :index="index" :enabled-dates="customDateFields"/>
</div>
</div>
<h4>{{ $t('firefly.transaction_journal_meta') }}</h4>
<!-- meta -->
<div class="row">
<div class="col">
<TransactionBudget
v-model="transaction.budget_id"
:index="index"
/>
<TransactionCategory
v-model="transaction.category"
:index="index"
/>
</div>
<div class="col">
<TransactionBill
v-model="transaction.bill_id"
:index="index"
/>
<TransactionTags
:index="index"
v-model="transaction.tags"
/>
<TransactionPiggyBank
:index="index"
v-model="transaction.piggy_bank_id"
/>
</div>
</div>
<h4>{{ $t('firefly.transaction_journal_extra') }}</h4>
<div class="row">
<div class="col">
<TransactionInternalReference
:index="index"
v-model="transaction.internal_reference"
/>
<TransactionExternalUrl
:index="index"
v-model="transaction.external_url"
/>
<TransactionNotes
:index="index"
v-model="transaction.notes"
/>
</div>
<div class="col">
<TransactionAttachments
:index="index"
v-model="transaction.attachments"
/>
<TransactionLinks :index="index"
v-model="transaction.links"
/>
</div>
</div>
</div>
<!-- /.card-body -->
</div>
</div>
<div class="col">
<div class="row">
<!-- buttons! -->
<div class="col">
<p>
<button @click="addTransaction" class="btn btn-primary"><i class="far fa-clone"></i> {{ $t('firefly.add_another_split') }}</button>
</p>
</div>
<div class="col">
<p class="float-right">
<button @click="submitTransaction" :disabled="isSubmitting" class="btn btn-success"><i class="far fa-save"></i> Store transaction</button>
<br/>
</p>
</div>
</div>
</div>
</div>
<!-- buttons -->
<!-- button -->
<div class="row">
<div class="col">
<button @click="addTransaction" class="btn btn-primary">{{ $t('firefly.add_another_split') }}</button>
</div>
<div class="col">
<p class="float-right">
<button @click="submitTransaction" :disabled="isSubmitting" class="btn btn-success">Store transaction</button>
<br/>
</p>
</div>
</div>
<div class="row">
<div class="col float-right">
<p class="text-right">
<small class="text-muted">Create another another another <input type="checkbox"/></small><br/>
<small class="text-muted">Return here <input type="checkbox"/></small><br/>
</p>
</div>
</div>
</div>
</template>
<script>
@@ -219,17 +288,17 @@ import TransactionExternalUrl from "./TransactionExternalUrl";
import TransactionNotes from "./TransactionNotes";
import TransactionLinks from "./TransactionLinks";
import TransactionAttachments from "./TransactionAttachments";
import TransactionGroupTitle from "./TransactionGroupTitle";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
name: "Create",
components: {
TransactionAttachments,
TransactionNotes,
TransactionExternalUrl,
TransactionGroupTitle,
TransactionInternalReference,
TransactionPiggyBank,
TransactionTags,
@@ -248,10 +317,9 @@ export default {
},
data() {
return {
groupTitle: '',
isSubmitting: false,
linkSearchResults: [],
errorMessage: null,
errorMessage: '',
successMessage: null,
}
},
@@ -260,7 +328,8 @@ export default {
'transactionType', // -> this.someGetter
'transactions', // -> this.someOtherGetter
'customDateFields',
'date'
'date',
'groupTitle'
])
},
methods: {
@@ -270,10 +339,11 @@ export default {
'deleteTransaction',
'setAllowedOpposingTypes',
'setAccountToTransaction',
'setTransactionError',
'resetErrors'
],
),
removeTransaction: function (index) {
// store.commit('addCustomer'
this.$store.commit('transactions/create/deleteTransaction', {index: index});
},
storeCustomDateFields: function () {
@@ -322,17 +392,27 @@ export default {
axios.post(url, data)
.then(response => {
console.log('Axios post OK');
console.log('Axios post OK!');
console.log(response);
})
.catch(error => {
console.log('Error in transaction submission.');
//console.log('Error in transaction submission.');
this.parseErrors(error.response.data);
});
this.isSubmitting = false;
},
parseErrors: function(errors) {
// set the error message:
parseErrors: function (errors) {
console.log('parseErrors()');
console.log(errors.errors);
//this.setTransactionError({index: 0, field: 'date', errors: ['I AM ERRROR']});
// reset errors
for (let i in this.transactions) {
console.log('reset errors for index ' + i);
this.resetErrors({index: i});
}
this.successMessage = null;
this.errorMessage = this.$t('firefly.errors_submission');
if (typeof errors.errors === 'undefined') {
@@ -347,40 +427,63 @@ export default {
for (const key in errors.errors) {
if (errors.errors.hasOwnProperty(key)) {
if (key === 'group_title') {
this.group_title_errors = errors.errors[key];
console.log('cant handle "group_title".');
//this.group_title_errors = errors.errors[key];
}
if (key !== 'group_title') {
// lol dumbest way to explode "transactions.0.something" ever.
transactionIndex = parseInt(key.split('.')[1]);
fieldName = key.split('.')[2];
// set error in this object thing.
console.log('Found an error for transactions[' + transactionIndex + '][' + fieldName + ']');
let payload;
switch (fieldName) {
case 'amount':
case 'date':
case 'budget_id':
case 'bill_id':
case 'description':
case 'date':
case 'tags':
//this.transactions[transactionIndex].errors[fieldName] = errors.errors[key];
payload = {index: transactionIndex, field: fieldName, errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'budget_id':
payload = {index: transactionIndex, field: 'budget', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'bill_id':
payload = {index: transactionIndex, field: 'bill', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'piggy_bank_id':
payload = {index: transactionIndex, field: 'piggy_bank', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'category_name':
payload = {index: transactionIndex, field: 'category', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'source_name':
case 'source_id':
//this.transactions[transactionIndex].errors.source_account = this.transactions[transactionIndex].errors.source_account.concat(errors.errors[key]);
payload = {index: transactionIndex, field: 'source', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'destination_name':
case 'destination_id':
//this.transactions[transactionIndex].errors.destination_account = this.transactions[transactionIndex].errors.destination_account.concat(errors.errors[key]);
payload = {index: transactionIndex, field: 'destination', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
case 'foreign_amount':
case 'foreign_currency_id':
//this.transactions[transactionIndex].errors.foreign_amount = this.transactions[transactionIndex].errors.foreign_amount.concat(errors.errors[key]);
case 'foreign_currency':
payload = {index: transactionIndex, field: 'foreign_amount', errors: errors.errors[key]};
this.setTransactionError(payload);
break;
}
}
// unique some things
if (typeof this.transactions[transactionIndex] !== 'undefined') {
//this.transactions[transactionIndex].errors.source_account = Array.from(new Set(this.transactions[transactionIndex].errors.source_account));
//this.transactions[transactionIndex].errors.destination_account = Array.from(new Set(this.transactions[transactionIndex].errors.destination_account));
// TODO
//this.transactions[transactionIndex].errors.source = Array.from(new Set(this.transactions[transactionIndex].errors.source));
//this.transactions[transactionIndex].errors.destination = Array.from(new Set(this.transactions[transactionIndex].errors.destination));
}
}
@@ -394,9 +497,11 @@ export default {
convertData: function () {
console.log('now in convertData');
let data = {
//'group_title': null,
'transactions': []
};
if (this.groupTitle.length > 0) {
data.group_title = this.groupTitle;
}
for (let key in this.transactions) {
if (this.transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
data.transactions.push(this.convertSplit(key, this.transactions[key]));
@@ -404,18 +509,20 @@ export default {
}
return data;
},
/**
*
* @param key
* @param array
*/
convertSplit: function (key, array) {
console.log('now in convertSplit');
let dateStr = 'invalid';
if (this.date instanceof Date && !isNaN(this.date)) {
dateStr = this.toW3CString(this.date);
}
let currentSplit = {
// basic
description: array.description,
date: this.toW3CString(this.date),
date: dateStr,
type: this.transactionType,
// account
@@ -427,16 +534,11 @@ export default {
// amount:
currency_id: array.currency_id,
amount: array.amount,
foreign_currency_id: array.foreign_currency_id,
foreign_amount: array.foreign_amount,
// meta data
budget_id: array.budget_id,
category_name: array.category,
bill_id: array.bill_id,
tags: array.tags,
piggy_bank_id: array.piggy_bank_id,
// optional date fields (6x):
interest_date: array.interest_date,
@@ -456,6 +558,21 @@ export default {
order: 0,
reconciled: false,
};
// bills and piggy banks
if (0 !== array.piggy_bank_id) {
currentSplit.piggy_bank_id = array.piggy_bank_id;
}
if (0 !== array.bill_id) {
currentSplit.bill_id = array.bill_id;
}
// foreign amount:
if (0 !== array.foreign_currency_id) {
currentSplit.foreign_currency_id = array.foreign_currency_id;
}
if ('' !== array.foreign_amount) {
currentSplit.foreign_amount = array.foreign_amount;
}
// do transaction type
let transactionType;
@@ -463,22 +580,26 @@ export default {
let firstDestination;
// get transaction type from first transaction
transactionType = this.transactionType ? this.transactionType.toLowerCase() : 'invalid';
transactionType = this.transactionType ? this.transactionType.toLowerCase() : 'any';
console.log('Transaction type is now ' + transactionType);
// if the transaction type is invalid, might just be that we can deduce it from
// the presence of a source or destination account
firstSource = this.transactions[0].source_account.type;
firstDestination = this.transactions[0].destination_account.type;
// console.log('Type of first source is ' + firstSource);
console.log(this.transactions[0].source_account);
console.log(this.transactions[0].destination_account);
console.log('Type of first source is ' + firstSource);
console.log('Type of first destination is ' + firstDestination);
if ('invalid' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstSource)) {
if ('any' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstSource)) {
transactionType = 'withdrawal';
}
if ('invalid' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstDestination)) {
if ('any' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstDestination)) {
transactionType = 'deposit';
}
currentSplit.type = transactionType;
console.log('Final type is ' + transactionType);
let links = [];
for (let i in array.links) {
@@ -542,16 +663,6 @@ export default {
offsetSign + offsetHours + ':' + offsetMinutes;
}
// addTransactionToArray: function (e) {
// console.log('Now in addTransactionToArray()');
// this.$store.
//
// this.transactions.push({
// description: '',
// });
// if (e) {
// e.preventDefault();
// }
},
}
</script>

View File

@@ -27,6 +27,7 @@
v-model="value.name"
:data="accounts"
:showOnFocus=true
:inputClass="errors.length > 0 ? 'is-invalid' : ''"
:inputName="direction + '[]'"
:serializer="item => item.name_with_balance"
:minMatchingChars="3"
@@ -39,9 +40,10 @@
<button class="btn btn-outline-secondary" v-on:click="clearAccount" type="button"><i class="far fa-trash-alt"></i></button>
</div>
</template>
</vue-typeahead-bootstrap>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -56,7 +58,7 @@ const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers
export default {
name: "TransactionAccount",
components: {VueTypeaheadBootstrap},
props: ['index', 'direction', 'value'],
props: ['index', 'direction', 'value', 'errors'],
data() {
return {
query: '',

View File

@@ -29,13 +29,16 @@
<input
:title="$t('firefly.amount')"
autocomplete="off"
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
name="amount[]"
type="number"
v-model="amount"
:placeholder="$t('firefly.amount')"
>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -49,7 +52,7 @@ const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers
export default {
name: "TransactionAmount",
props: ['index'],
props: ['index', 'errors'],
data() {
return {
currencySymbol: ''

View File

@@ -28,7 +28,6 @@
type="file"
multiple
name="attachments[]"
:placeholder="$t('firefly.attachment')"
class="form-control"/>
</div>
</div>

View File

@@ -29,7 +29,7 @@
:title="$t('firefly.bill')"
v-model="value"
autocomplete="off"
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
name="bill_id[]"
v-on:submit.prevent
>
@@ -37,6 +37,9 @@
</select>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -47,7 +50,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['value', 'index'],
props: ['value', 'index', 'errors'],
name: "TransactionBill",
data() {
return {
@@ -94,16 +97,16 @@ export default {
},
},
watch: {
value: function(value) {
value: function (value) {
this.updateField({field: 'bill_id', index: this.index, value: value});
}
},
computed: {
...mapGetters(
[
'transactionType',
'transactions',
]
'transactionType',
'transactions',
]
)
}
}

View File

@@ -29,13 +29,16 @@
:title="$t('firefly.budget')"
v-model="value"
autocomplete="off"
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
name="budget_id[]"
v-on:submit.prevent
>
<option v-for="budget in this.budgetList" :value="budget.id" :label="budget.name">{{ budget.name }}</option>
</select>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -46,7 +49,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionBudget",
data() {
return {

View File

@@ -30,6 +30,7 @@
:data="categories"
:placeholder="$t('firefly.category')"
:showOnFocus=true
:inputClass="errors.length > 0 ? 'is-invalid' : ''"
:minMatchingChars="3"
:serializer="item => item.name"
@hit="selectedCategory = $event"
@@ -41,7 +42,9 @@
</div>
</template>
</vue-typeahead-bootstrap>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -54,7 +57,7 @@ import {debounce} from "lodash";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['value', 'index'],
props: ['value', 'index', 'errors'],
components: {VueTypeaheadBootstrap},
name: "TransactionCategory",
data() {

View File

@@ -43,12 +43,13 @@
</template>
<script>
// TODO: error handling
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
name: "TransactionCustomDates",
props: ['enabledDates', 'index'],
props: ['enabledDates', 'index', 'errors'],
methods: {
...mapGetters(
[

View File

@@ -25,7 +25,7 @@
</div>
<div class="input-group">
<input
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
type="date"
ref="date"
:title="$t('firefly.date')"
@@ -34,10 +34,9 @@
autocomplete="off"
name="date[]"
:placeholder="localDate"
v-on:submit.prevent
>
<input
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
type="time"
ref="time"
:title="$t('firefly.time')"
@@ -46,9 +45,11 @@
autocomplete="off"
name="time[]"
:placeholder="localTime"
v-on:submit.prevent
>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -59,8 +60,8 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'errors'],
name: "TransactionDate",
props: ['index'],
methods: {
...mapMutations(
[
@@ -70,13 +71,19 @@ export default {
),
},
computed: {
...mapGetters([
'transactionType',
'date'
]),
...mapGetters(
[
'transactionType',
'date',
'transactions'
]
),
localDate: {
get() {
return this.date.toISOString().split('T')[0];
if (this.date instanceof Date && !isNaN(this.date)) {
return this.date.toISOString().split('T')[0];
}
return '';
},
set(value) {
// bit of a hack but meh.
@@ -90,7 +97,10 @@ export default {
},
localTime: {
get() {
return ('0' + this.date.getHours()).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2) + ':' + ('0' + this.date.getSeconds()).slice(-2);
if (this.date instanceof Date && !isNaN(this.date)) {
return ('0' + this.date.getHours()).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2) + ':' + ('0' + this.date.getSeconds()).slice(-2);
}
return '';
},
set(value) {
// bit of a hack but meh.
@@ -105,7 +115,3 @@ export default {
}
}
</script>
<style scoped>
</style>

View File

@@ -20,9 +20,6 @@
<template>
<div class="form-group">
<div class="text-xs d-none d-lg-block d-xl-block">
{{ $t('firefly.description') }}
</div>
<vue-typeahead-bootstrap
inputName="description[]"
v-model="value"
@@ -30,6 +27,7 @@
:placeholder="$t('firefly.description')"
:showOnFocus=true
autofocus
:inputClass="errors.length > 0 ? 'is-invalid' : ''"
:minMatchingChars="3"
:serializer="item => item.description"
@input="lookupDescription"
@@ -40,13 +38,14 @@
</div>
</template>
</vue-typeahead-bootstrap>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
<script>
import {createNamespacedHelpers} from "vuex";
import VueTypeaheadBootstrap from 'vue-typeahead-bootstrap';
import {debounce} from "lodash";
@@ -54,7 +53,7 @@ import {debounce} from "lodash";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
components: {VueTypeaheadBootstrap},
name: "TransactionDescription",
data() {
@@ -63,7 +62,6 @@ export default {
initialSet: []
}
},
created() {
axios.get(this.getACURL(''))
.then(response => {

View File

@@ -29,7 +29,8 @@
name="external_url[]"
:placeholder="$t('firefly.external_url')"
v-model="value"
class="form-control"/>
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
/>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary"><i class="far fa-trash-alt"></i></button>
</div>
@@ -43,7 +44,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionExternalUrl",
methods: {
...mapMutations(

View File

@@ -27,7 +27,7 @@
<input
:title="$t('form.foreign_amount')"
autocomplete="off"
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
:disabled="0===currencyId"
name="foreign_amount[]"
type="number"
@@ -35,6 +35,9 @@
:placeholder="$t('form.foreign_amount')"
>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -48,7 +51,7 @@ const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers
export default {
name: "TransactionForeignAmount",
props: ['index'],
props: ['index','errors'],
data() {
return {
currencySymbol: '',

View File

@@ -0,0 +1,109 @@
<!--
- TransactionGroupTitle.vue
- 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/>.
-->
<template>
<div class="form-group">
<div class="text-xs d-none d-lg-block d-xl-block">
{{ $t('firefly.split_transaction_title') }}
</div>
<vue-typeahead-bootstrap
inputName="group_title"
v-model="value"
:data="descriptions"
:placeholder="$t('firefly.split_transaction_title')"
:showOnFocus=true
:minMatchingChars="3"
:serializer="item => item.description"
@input="lookupDescription"
:inputClass="errors.length > 0 ? 'is-invalid' : ''"
>
<template slot="append">
<div class="input-group-append">
<button v-on:click="clearDescription" class="btn btn-outline-secondary" type="button"><i class="far fa-trash-alt"></i></button>
</div>
</template>
</vue-typeahead-bootstrap>
</div>
</template>
<script>
import VueTypeaheadBootstrap from 'vue-typeahead-bootstrap';
import {debounce} from "lodash";
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['value', 'errors'],
name: "TransactionGroupTitle",
components: {VueTypeaheadBootstrap},
data() {
return {
descriptions: [],
initialSet: []
}
},
created() {
axios.get(this.getACURL(''))
.then(response => {
this.descriptions = response.data;
this.initialSet = response.data;
});
},
watch: {
value: function (value) {
console.log('set');
this.setGroupTitle({groupTitle: value});
}
},
methods: {
...mapMutations(
[
'setGroupTitle'
],
),
...mapGetters(
[
'groupTitle'
]
),
clearDescription: function () {
console.log('cear');
this.setGroupTitle({groupTitle: ''});
this.value = '';
},
getACURL: function (query) {
// update autocomplete URL:
return document.getElementsByTagName('base')[0].href + 'api/v1/autocomplete/transactions?query=' + query;
},
lookupDescription: debounce(function () {
// update autocomplete URL:
axios.get(this.getACURL(this.value))
.then(response => {
this.descriptions = response.data;
})
}, 300)
}
}
</script>
<style scoped>
</style>

View File

@@ -29,7 +29,8 @@
name="internal_reference[]"
v-model="value"
:placeholder="$t('firefly.internal_reference')"
class="form-control"/>
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
/>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary"><i class="far fa-trash-alt"></i></button>
</div>
@@ -43,7 +44,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionInternalReference",
methods: {
...mapMutations(

View File

@@ -184,8 +184,9 @@
</template>
<script>
// TODO error handling
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionLinks",
data() {
return {

View File

@@ -25,7 +25,11 @@
{{ $t('firefly.notes') }}
</div>
<div class="input-group">
<textarea v-model="value" class="form-control" :placeholder="$t('firefly.notes')"></textarea>
<textarea
v-model="value"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
:placeholder="$t('firefly.notes')"
></textarea>
</div>
</div>
@@ -37,7 +41,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionNotes",
methods: {
...mapMutations(

View File

@@ -29,7 +29,7 @@
:title="$t('firefly.piggy_bank')"
v-model="value"
autocomplete="off"
class="form-control"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
name="piggy_bank_id[]"
v-on:submit.prevent
>
@@ -37,6 +37,9 @@
</select>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -47,7 +50,7 @@ import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value'],
props: ['index', 'value', 'errors'],
name: "TransactionPiggyBank",
data() {
return {

View File

@@ -34,6 +34,9 @@
@tags-changed="newTags => this.tags = newTags"
/>
</div>
<span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
</span>
</div>
</template>
@@ -49,7 +52,7 @@ export default {
components: {
VueTagsInput
},
props: ['value', 'index'],
props: ['value', 'index', 'errors'],
data() {
return {
autocompleteItems: [],

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "\u0422\u0440\u0438\u043c\u0435\u0441\u0435\u0447\u043d\u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u0438",
"half_year_budgets": "\u0428\u0435\u0441\u0442\u043c\u0435\u0441\u0435\u0447\u043d\u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u0438",
"yearly_budgets": "\u0413\u043e\u0434\u0438\u0448\u043d\u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u0438",
"split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f",
"errors_submission": "\u0418\u043c\u0430\u0448\u0435 \u043d\u0435\u0449\u043e \u043d\u0435\u0440\u0435\u0434\u043d\u043e \u0441 \u0432\u0430\u0448\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0438. \u041c\u043e\u043b\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0433\u0440\u0435\u0448\u043a\u0438\u0442\u0435.",
"flash_error": "\u0413\u0440\u0435\u0448\u043a\u0430!",
"other_budgets": "\u0412\u0440\u0435\u043c\u0435\u0432\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u0438",
"journal_links": "\u0412\u0440\u044a\u0437\u043a\u0438 \u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f",
"go_to_withdrawals": "\u0412\u0438\u0436\u0442\u0435 \u0442\u0435\u0433\u043b\u0435\u043d\u0438\u044f\u0442\u0430 \u0441\u0438",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Popis roz\u00fa\u010dtov\u00e1n\u00ed",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Chyba!",
"other_budgets": "Custom timed budgets",
"journal_links": "Transaction links",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quartalsbudgets",
"half_year_budgets": "Halbjahresbudgets",
"yearly_budgets": "Jahresbudgets",
"split_transaction_title": "Beschreibung der Splittbuchung",
"errors_submission": "Ihre \u00dcbermittlung ist fehlgeschlagen. Bitte \u00fcberpr\u00fcfen Sie die Fehler.",
"flash_error": "Fehler!",
"other_budgets": "Zeitlich befristete Budgets",
"journal_links": "Buchungsverkn\u00fcpfungen",
"go_to_withdrawals": "Ausgaben anzeigen",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "\u03a4\u03c1\u03b9\u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03bf\u03b9 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03bf\u03af",
"half_year_budgets": "\u0395\u03be\u03b1\u03bc\u03b7\u03bd\u03b9\u03b1\u03af\u03bf\u03b9 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03bf\u03af",
"yearly_budgets": "\u0395\u03c4\u03ae\u03c3\u03b9\u03bf\u03b9 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03bf\u03af",
"split_transaction_title": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03cc",
"errors_submission": "\u03a5\u03c0\u03ae\u03c1\u03be\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf \u03bb\u03ac\u03b8\u03bf\u03c2 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae \u03c3\u03b1\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03b1.",
"flash_error": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1!",
"other_budgets": "\u03a0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03bf\u03af \u03bc\u03b5 \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03ae \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae",
"journal_links": "\u03a3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03b9\u03c2 \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd",
"go_to_withdrawals": "\u03a0\u03b7\u03b3\u03b1\u03af\u03bd\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b9\u03c2 \u03b1\u03bd\u03b1\u03bb\u03ae\u03c8\u03b5\u03b9\u03c2 \u03c3\u03b1\u03c2",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Description of the split transaction",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Error!",
"other_budgets": "Custom timed budgets",
"journal_links": "Transaction links",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Description of the split transaction",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Error!",
"other_budgets": "Custom timed budgets",
"journal_links": "Transaction links",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Presupuestos trimestrales",
"half_year_budgets": "Presupuestos semestrales",
"yearly_budgets": "Presupuestos anuales",
"split_transaction_title": "Descripci\u00f3n de la transacci\u00f3n dividida",
"errors_submission": "Hubo un problema con su env\u00edo. Por favor, compruebe los errores.",
"flash_error": "\u00a1Error!",
"other_budgets": "Presupuestos de tiempo personalizado",
"journal_links": "Enlaces de transacciones",
"go_to_withdrawals": "Ir a tus retiradas",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Jaetun tapahtuman kuvaus",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Virhe!",
"other_budgets": "Custom timed budgets",
"journal_links": "Tapahtuman linkit",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Budgets trimestriels",
"half_year_budgets": "Budgets semestriels",
"yearly_budgets": "Budgets annuels",
"split_transaction_title": "Description de l'op\u00e9ration ventil\u00e9e",
"errors_submission": "Certaines informations ne sont pas correctes dans votre formulaire. Veuillez v\u00e9rifier les erreurs.",
"flash_error": "Erreur !",
"other_budgets": "Budgets \u00e0 p\u00e9riode personnalis\u00e9e",
"journal_links": "Liens d'op\u00e9ration",
"go_to_withdrawals": "Acc\u00e9der \u00e0 vos retraits",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Felosztott tranzakci\u00f3 le\u00edr\u00e1sa",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Hiba!",
"other_budgets": "Custom timed budgets",
"journal_links": "Tranzakci\u00f3 \u00f6sszekapcsol\u00e1sok",
"go_to_withdrawals": "Ugr\u00e1s a k\u00f6lts\u00e9gekhez",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Bilanci trimestrali",
"half_year_budgets": "Bilanci semestrali",
"yearly_budgets": "Budget annuali",
"split_transaction_title": "Descrizione della transazione suddivisa",
"errors_submission": "Errore durante l'invio. Controlla gli errori segnalati qui sotto.",
"flash_error": "Errore!",
"other_budgets": "Budget a periodi personalizzati",
"journal_links": "Collegamenti della transazione",
"go_to_withdrawals": "Vai ai tuoi prelievi",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Description of the split transaction",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Feil!",
"other_budgets": "Custom timed budgets",
"journal_links": "Transaksjonskoblinger",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Driemaandelijkse budgetten",
"half_year_budgets": "Halfjaarlijkse budgetten",
"yearly_budgets": "Jaarlijkse budgetten",
"split_transaction_title": "Beschrijving van de gesplitste transactie",
"errors_submission": "Er ging iets mis. Check de errors.",
"flash_error": "Fout!",
"other_budgets": "Aangepaste budgetten",
"journal_links": "Transactiekoppelingen",
"go_to_withdrawals": "Ga naar je uitgaven",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Bud\u017cety kwartalne",
"half_year_budgets": "Bud\u017cety p\u00f3\u0142roczne",
"yearly_budgets": "Bud\u017cety roczne",
"split_transaction_title": "Opis podzielonej transakcji",
"errors_submission": "Co\u015b posz\u0142o nie tak w czasie zapisu. Prosz\u0119 sprawd\u017a b\u0142\u0119dy.",
"flash_error": "B\u0142\u0105d!",
"other_budgets": "Bud\u017cety niestandardowe",
"journal_links": "Powi\u0105zane transakcje",
"go_to_withdrawals": "Przejd\u017a do swoich wydatk\u00f3w",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Or\u00e7amentos trimestrais",
"half_year_budgets": "Or\u00e7amentos semestrais",
"yearly_budgets": "Or\u00e7amentos anuais",
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
"errors_submission": "H\u00e1 algo de errado com o seu envio. Por favor, verifique os erros abaixo.",
"flash_error": "Erro!",
"other_budgets": "Custom timed budgets",
"journal_links": "Transa\u00e7\u00f5es ligadas",
"go_to_withdrawals": "V\u00e1 para seus saques",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "Descrierea tranzac\u021biei divizate",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "Eroare!",
"other_budgets": "Custom timed budgets",
"journal_links": "Link-uri de tranzac\u021bii",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "\u0411\u044e\u0434\u0436\u0435\u0442\u044b \u043d\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b",
"half_year_budgets": "\u0411\u044e\u0434\u0436\u0435\u0442\u044b \u043d\u0430 \u043f\u043e\u043b\u0433\u043e\u0434\u0430",
"yearly_budgets": "\u0413\u043e\u0434\u043e\u0432\u044b\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u044b",
"split_transaction_title": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "\u041e\u0448\u0438\u0431\u043a\u0430!",
"other_budgets": "\u0411\u044e\u0434\u0436\u0435\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438",
"journal_links": "\u0421\u0432\u044f\u0437\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
"go_to_withdrawals": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0432\u0430\u0448\u0438\u043c \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "\u0160tvr\u0165ro\u010dn\u00e9 rozpo\u010dty",
"half_year_budgets": "Polro\u010dn\u00e9 rozpo\u010dty",
"yearly_budgets": "Ro\u010dn\u00e9 rozpo\u010dty",
"split_transaction_title": "Popis roz\u00fa\u010dtovania",
"errors_submission": "Pri odosielan\u00ed sa nie\u010do nepodarilo. Skontrolujte pros\u00edm chyby.",
"flash_error": "Chyba!",
"other_budgets": "\u0160pecifick\u00e9 \u010dasovan\u00e9 rozpo\u010dty",
"journal_links": "Prepojenia transakcie",
"go_to_withdrawals": "Zobrazi\u0165 v\u00fdbery",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Kvartalsbudgetar",
"half_year_budgets": "Halv\u00e5rsbudgetar",
"yearly_budgets": "\u00c5rliga budgetar",
"split_transaction_title": "Beskrivning av delad transaktion",
"errors_submission": "N\u00e5got fel uppstod med inskickningen. V\u00e4nligen kontrollera felen nedan.",
"flash_error": "Fel!",
"other_budgets": "Anpassade tidsinst\u00e4llda budgetar",
"journal_links": "Transaktionsl\u00e4nkar",
"go_to_withdrawals": "G\u00e5 till dina uttag",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "M\u00f4 t\u1ea3 giao d\u1ecbch t\u00e1ch",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "L\u1ed7i!",
"other_budgets": "Custom timed budgets",
"journal_links": "Li\u00ean k\u1ebft giao d\u1ecbch",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "\u9519\u8bef\uff01",
"other_budgets": "Custom timed budgets",
"journal_links": "\u4ea4\u6613\u8fde\u7ed3",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -64,6 +64,9 @@
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"flash_error": "\u932f\u8aa4\uff01",
"other_budgets": "Custom timed budgets",
"journal_links": "\u4ea4\u6613\u9023\u7d50",
"go_to_withdrawals": "Go to your withdrawals",

View File

@@ -2385,9 +2385,9 @@ d@1, d@^1.0.1:
type "^1.0.1"
date-fns-tz@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.0.12.tgz#2d680e1099767775cff7a30eac34362d52639fed"
integrity sha512-Ca+9pjGkU90XDHnclfSjz9o7g/ZqyYyYI0aCYmbf65P75oy8gktuaRslO3UPXl3ADgAnF9/KCykQkpU3/xvtWQ==
version "1.1.1"
resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.1.1.tgz#2e0dfcc62cc5b7b5fa7ea620f11a5e7f63a7ed75"
integrity sha512-5PR604TlyvpiNXtvn+PZCcCazsI8fI1am3/aimNFN8CMqHQ0KRl+6hB46y4mDbB7bk3+caEx3qHhS7Ewac/FIg==
date-fns@^2.8.1:
version "2.16.1"
@@ -2636,9 +2636,9 @@ ejs@^2.6.1:
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.634:
version "1.3.648"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.648.tgz#b05926eca1843c04b283e682a1fc6c10af7e9dda"
integrity sha512-4POzwyQ80tkDiBwkxn7IpfzioimrjRSFX1sCQ3pLZsYJ5ERYmwzdq0hZZ3nFP7Z6GtmnSn3xwWDm8FPlMeOoEQ==
version "1.3.649"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz#3aa8be052d4d268ede45d8e98d0cd60ffefad607"
integrity sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==
elliptic@^6.5.3:
version "6.5.3"
@@ -5778,9 +5778,9 @@ regjsgen@^0.5.1:
integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
regjsparser@^0.6.4:
version "0.6.6"
resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.6.tgz#6d8c939d1a654f78859b08ddcc4aa777f3fa800a"
integrity sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==
version "0.6.7"
resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c"
integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==
dependencies:
jsesc "~0.5.0"