Rebuild frontend, do not use store in components.

This commit is contained in:
James Cole
2021-02-22 18:43:26 +01:00
parent 6d9acd1dc2
commit 5b5c988aa3
87 changed files with 2887 additions and 2835 deletions

View File

@@ -24,6 +24,7 @@ const lodashClonedeep = require('lodash.clonedeep');
const state = () => ({
transactionType: 'any',
date: new Date,
time: new Date,
groupTitle: '',
transactions: [],
allowedOpposingTypes: {},
@@ -63,6 +64,22 @@ const state = () => ({
description: '',
transaction_journal_id: 0,
// accounts:
source_account_id: null,
source_account_name: null,
source_account_type: null,
source_account_currency_id: null,
source_account_currency_code: null,
source_account_currency_symbol: null,
destination_account_id: null,
destination_account_name: null,
destination_account_type: null,
destination_account_currency_id: null,
destination_account_currency_code: null,
destination_account_currency_symbol: null,
source_account: {
id: 0,
name: "",
@@ -133,12 +150,20 @@ const getters = {
date: state => {
return state.date;
},
time: state => {
return state.time;
},
groupTitle: state => {
return state.groupTitle;
},
transactionType: state => {
return state.transactionType;
},
accountToTransaction: state => {
// TODO better architecture here, does not need the store.
// possible API point!!
return state.accountToTransaction;
},
defaultTransaction: state => {
return state.defaultTransaction;
},
@@ -166,45 +191,7 @@ const getters = {
// actions
const actions = {
calcTransactionType(context) {
let source = context.state.transactions[0].source_account;
let dest = context.state.transactions[0].destination_account;
if (null === source || null === dest) {
// console.log('transactionType any');
context.commit('setTransactionType', 'any');
return;
}
if ('' === source.type || '' === dest.type) {
// console.log('transactionType any');
context.commit('setTransactionType', 'any');
return;
}
// ok so type is set on both:
let expectedDestinationTypes = context.state.accountToTransaction[source.type];
if ('undefined' !== typeof expectedDestinationTypes) {
let transactionType = expectedDestinationTypes[dest.type];
if ('undefined' !== typeof expectedDestinationTypes[dest.type]) {
// console.log('Found a type: ' + transactionType);
context.commit('setTransactionType', transactionType);
return;
}
}
// console.log('Found no type for ' + source.type + ' --> ' + dest.type);
if ('Asset account' !== source.type) {
console.log('Drop ID from source. TODO');
// source.id =null
// context.commit('updateField', {field: 'source_account',index: })
// context.state.transactions[0].source_account.id = null;
}
if ('Asset account' !== dest.type) {
console.log('Drop ID from destination. TODO');
//context.state.transactions[0].destination_account.id = null;
}
context.commit('setTransactionType', 'any');
}
}
// mutations
@@ -224,6 +211,9 @@ const mutations = {
setDate(state, payload) {
state.date = payload.date;
},
setTime(state, payload) {
state.time = payload.time;
},
setGroupTitle(state, payload) {
state.groupTitle = payload.groupTitle;
},

View File

@@ -33,7 +33,36 @@
:custom-fields="customFields"
:submitted-transaction="submittedTransaction"
v-on:uploaded-attachments="uploadedAttachment($event)"
v-on:set-description="storeDescription(index, $event)"
v-on:set-marker-location="storeLocation(index, $event)"
v-on:set-source-account-id="storeAccountValue(index, 'source', 'id', $event)"
v-on:set-source-account-name="storeAccountValue(index, 'source', 'name', $event)"
v-on:set-source-account-type="storeAccountValue(index, 'source', 'type', $event)"
v-on:set-source-account-currency-id="storeAccountValue(index, 'source', 'currency_id', $event)"
v-on:set-source-account-currency-code="storeAccountValue(index, 'source', 'currency_code', $event)"
v-on:set-source-account-currency-symbol="storeAccountValue(index, 'source', 'currency_symbol', $event)"
v-on:set-destination-account-id="storeAccountValue(index, 'destination', 'id', $event)"
v-on:set-destination-account-name="storeAccountValue(index, 'destination', 'name', $event)"
v-on:set-destination-account-type="storeAccountValue(index, 'destination', 'type', $event)"
v-on:set-destination-account-currency-id="storeAccountValue(index, 'destination', 'currency_id', $event)"
v-on:set-destination-account-currency-code="storeAccountValue(index, 'destination', 'currency_code', $event)"
v-on:set-destination-account-currency-symbol="storeAccountValue(index, 'destination', 'currency_symbol', $event)"
v-on:switch-accounts="switchAccounts($event)"
v-on:set-amount="storeAmount(index, $event)"
v-on:set-foreign-currency-id="storeForeignCurrencyId(index, $event)"
v-on:set-foreign-amount="storeForeignAmount(index, $event)"
v-on:set-date="storeDate($event)"
v-on:set-time="storeTime($event)"
v-on:set-custom-date="storeCustomDate(index, $event)"
v-on:set-budget="storeBudget(index, $event)"
v-on:set-category="storeCategory(index, $event)"
v-on:set-bill="storeBill(index, $event)"
v-on:set-tags="storeTags(index, $event)"
v-on:set-piggy-bank="storePiggyBank(index, $event)"
v-on:set-internal-reference="storeInternalReference(index, $event)"
v-on:set-external-url="storeExternalUrl(index, $event)"
v-on:set-notes="storeNotes(index, $event)"
v-on:set-links="storeLinks(index, $event)"
/>
</div>
@@ -154,6 +183,9 @@ export default {
// group ID + title once submitted:
returnedGroupId: 0,
returnedGroupTitle: '',
// meta data:
accountToTransaction: {}
}
},
computed: {
@@ -161,6 +193,7 @@ export default {
'transactionType',
'transactions',
'date',
'time',
'groupTitle'
])
},
@@ -187,11 +220,13 @@ export default {
'addTransaction',
'deleteTransaction',
'setAllowedOpposingTypes',
'setAccountToTransaction',
'setTransactionError',
'setTransactionType',
'resetErrors',
'updateField',
'resetTransactions'
'resetTransactions',
'setDate',
'setTime'
],
),
/**
@@ -279,6 +314,9 @@ export default {
const url = './api/v1/transactions';
const data = this.convertData();
console.log('Will submit:');
console.log(data);
// POST the transaction.
axios.post(url, data)
.then(response => {
@@ -347,7 +385,10 @@ export default {
this.submittedAttachments = true;
}
},
storeLocation: function(index, event) {
/**
* Responds to changed location.
*/
storeLocation: function (index, event) {
let zoomLevel = event.hasMarker ? event.zoomLevel : null;
let lat = event.hasMarker ? event.lat : null;
let lng = event.hasMarker ? event.lng : null;
@@ -355,8 +396,127 @@ export default {
this.updateField({index: index, field: 'latitude', value: lat});
this.updateField({index: index, field: 'longitude', value: lng});
},
/**
* Responds to changed account.
*/
storeAccountValue: function (index, direction, field, value) {
// depending on these account values
let key = direction + '_account_' + field;
//console.log('storeAccountValue(' + index + ', "' + direction + '", "' + field + '", "' + key + '") = "' + value + '"');
this.updateField({index: index, field: key, value: value});
if ('type' === field) {
this.calculateTransactionType(index);
}
},
storeDescription: function (index, value) {
this.updateField({field: 'description', index: index, value: value});
},
storeForeignCurrencyId: function (index, value) {
console.log('storeForeignCurrencyId(' + index + ',' + value + ')');
this.updateField({field: 'foreign_currency_id', index: index, value: value});
},
storeAmount: function (index, value) {
this.updateField({field: 'amount', index: index, value: value});
},
storeForeignAmount: function (index, value) {
this.updateField({field: 'foreign_amount', index: index, value: value});
},
storeDate: function (value) {
this.setDate(value.date)
},
storeTime: function (value) {
this.setTime(value.time)
},
storeCustomDate: function (index, payload) {
this.updateField({field: payload.field, index: index, value: payload.date});
},
storeBudget: function (index, value) {
this.updateField({field: 'budget_id', index: index, value: value});
},
storeCategory: function (index, value) {
this.updateField({field: 'category', index: index, value: value});
},
storeBill: function (index, value) {
this.updateField({field: 'bill_id', index: index, value: value});
},
storeTags: function (index, value) {
this.updateField({field: 'tags', index: index, value: value});
},
storePiggyBank: function (index, value) {
this.updateField({field: 'piggy_bank_id', index: index, value: value});
},
storeInternalReference: function (index, value) {
this.updateField({field: 'internal_reference', index: index, value: value});
},
storeExternalUrl: function (index, value) {
this.updateField({field: 'external_url', index: index, value: value});
},
storeNotes: function (index, value) {
this.updateField({field: 'notes', index: index, value: value});
},
storeLinks: function (index, value) {
this.updateField({field: 'links', index: index, value: value});
},
/**
* Calculate the transaction type based on what's currently in the store.
*/
calculateTransactionType: function (index) {
//console.log('calculateTransactionType(' + index + ')');
if (0 === index) {
let source = this.transactions[0].source_account_type;
let dest = this.transactions[0].destination_account_type;
if (null === source || null === dest) {
//console.log('transactionType any');
this.setTransactionType('any');
//this.$store.commit('setTransactionType', 'any');
//console.log('calculateTransactionType: either type is NULL so no dice.');
return;
}
if ('' === source || '' === dest) {
//console.log('transactionType any');
this.setTransactionType('any');
//this.$store.commit('setTransactionType', 'any');
//console.log('calculateTransactionType: either type is empty so no dice.');
return;
}
// ok so type is set on both:
let expectedDestinationTypes = this.accountToTransaction[source];
if ('undefined' !== typeof expectedDestinationTypes) {
let transactionType = expectedDestinationTypes[dest];
if ('undefined' !== typeof expectedDestinationTypes[dest]) {
//console.log('Found a type: ' + transactionType);
this.setTransactionType(transactionType);
//this.$store.commit('setTransactionType', transactionType);
//console.log('calculateTransactionType: ' + source + ' --> ' + dest + ' = ' + transactionType);
return;
}
}
//console.log('Found no type for ' + source + ' --> ' + dest);
if ('Asset account' !== source) {
//console.log('Drop ID from destination.');
this.updateField({index: 0, field: 'destination_account_id', value: null});
//console.log('calculateTransactionType: drop ID from destination.');
// source.id =null
// context.commit('updateField', {field: 'source_account',index: })
// context.state.transactions[0].source_account.id = null;
}
if ('Asset account' !== dest) {
//console.log('Drop ID from source.');
this.updateField({index: 0, field: 'source_account_id', value: null});
//console.log('calculateTransactionType: drop ID from source.');
//context.state.transactions[0].destination_account.id = null;
}
//console.log('calculateTransactionType: fallback, type to any.');
this.setTransactionType('any');
//this.$store.commit('setTransactionType', 'any');
}
},
/**
* Submit transaction links.
*/
submitTransactionLinks(data, response) {
console.log('submitTransactionLinks()');
//console.log('submitTransactionLinks()');
let promises = [];
let result = response.data.data.attributes.transactions;
let total = 0;
@@ -552,6 +712,26 @@ export default {
},
switchAccounts: function (index) {
console.log('user wants to switch Accounts');
let origSourceId = this.transactions[index].source_account_id;
let origSourceName = this.transactions[index].source_account_name;
let origSourceType = this.transactions[index].source_account_type;
let origDestId = this.transactions[index].destination_account_id;
let origDestName = this.transactions[index].destination_account_name;
let origDestType = this.transactions[index].destination_account_type;
this.updateField({index: 0, field: 'source_account_id', value: origDestId});
this.updateField({index: 0, field: 'source_account_name', value: origDestName});
this.updateField({index: 0, field: 'source_account_type', value: origDestType});
this.updateField({index: 0, field: 'destination_account_id', value: origSourceId});
this.updateField({index: 0, field: 'destination_account_name', value: origSourceName});
this.updateField({index: 0, field: 'destination_account_type', value: origSourceType});
this.calculateTransactionType(0);
},
/**
*
@@ -560,9 +740,18 @@ export default {
*/
convertSplit: function (key, array) {
let dateStr = 'invalid';
if (this.date instanceof Date && !isNaN(this.date)) {
if (
this.time instanceof Date && !isNaN(this.time) &&
this.date instanceof Date && !isNaN(this.date)
) {
let theDate = new Date(this.date);
// update time in date object.
theDate.setHours(this.time.getHours());
theDate.setMinutes(this.time.getMinutes());
theDate.setSeconds(this.time.getSeconds());
dateStr = this.toW3CString(this.date);
}
let currentSplit = {
// basic
description: array.description,
@@ -570,10 +759,10 @@ export default {
type: this.transactionType,
// account
source_id: array.source_account.id ?? null,
source_name: array.source_account.name ?? null,
destination_id: array.destination_account.id ?? null,
destination_name: array.destination_account.name ?? null,
source_id: array.source_account_id ?? null,
source_name: array.source_account_name ?? null,
destination_id: array.destination_account_id ?? null,
destination_name: array.destination_account_name ?? null,
// amount:
currency_id: array.currency_id,
@@ -616,7 +805,7 @@ export default {
}
// foreign amount:
if (0 !== array.foreign_currency_id) {
if (0 !== array.foreign_currency_id && '' !== array.foreign_amount) {
currentSplit.foreign_currency_id = array.foreign_currency_id;
}
if ('' !== array.foreign_amount) {
@@ -633,19 +822,22 @@ export default {
//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;
firstSource = this.transactions[0].source_account_type;
firstDestination = this.transactions[0].destination_account_type;
//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);
// default to source:
currentSplit.currency_id = array.source_account_currency_id;
if ('any' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstSource)) {
transactionType = 'withdrawal';
}
if ('any' === transactionType && ['asset', 'Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstDestination)) {
transactionType = 'deposit';
currentSplit.currency_id = array.destination_account_currency_id;
}
currentSplit.type = transactionType;
//console.log('Final type is ' + transactionType);
@@ -712,10 +904,14 @@ export default {
offsetSign + offsetHours + ':' + offsetMinutes;
},
storeAllowedOpposingTypes: function () {
// take this from API:
this.setAllowedOpposingTypes(window.allowedOpposingTypes);
},
storeAccountToTransaction: function () {
this.setAccountToTransaction(window.accountToTransaction);
axios.get('./api/v1/configuration/static/firefly.account_to_transaction')
.then(response => {
this.accountToTransaction = response.data['firefly.account_to_transaction'];
});
},
},

View File

@@ -34,6 +34,7 @@
<div class="row">
<div class="col">
<TransactionDescription
v-on="$listeners"
v-model="transaction.description"
:index="index"
:errors="transaction.errors.description"
@@ -45,7 +46,8 @@
<div class="col-xl-5 col-lg-5 col-md-10 col-sm-12 col-xs-12">
<!-- SOURCE -->
<TransactionAccount
v-model="transaction.source_account"
v-on="$listeners"
v-model="sourceAccount"
direction="source"
:index="index"
:errors="transaction.errors.source"
@@ -53,8 +55,10 @@
</div>
<!-- switcharoo! -->
<div class="col-xl-2 col-lg-2 col-md-2 col-sm-12 text-center d-none d-sm-block">
<SwitchAccount v-if="0 === index"
:index="index"
<SwitchAccount
v-if="0 === index"
v-on="$listeners"
:index="index"
/>
</div>
@@ -62,7 +66,8 @@
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<!-- DESTINATION -->
<TransactionAccount
v-model="transaction.destination_account"
v-on="$listeners"
v-model="destinationAccount"
direction="destination"
:index="index"
:errors="transaction.errors.destination"
@@ -75,16 +80,42 @@
<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"/>
<!--
-->
<TransactionAmount
:index="index"
:errors="transaction.errors.amount"
:amount="transaction.amount"
:transaction-type="this.transactionType"
:source-currency-symbol="this.transaction.source_account_currency_symbol"
:destination-currency-symbol="this.transaction.destination_account_currency_symbol"
v-on="$listeners"
/>
</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"/>
<TransactionForeignCurrency
v-on="$listeners"
:transaction-type="this.transactionType"
:source-currency-id="this.transaction.source_account_currency_id"
:destination-currency-id="this.transaction.destination_account_currency_id"
:selected-currency-id="this.transaction.foreign_currency_id"
: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"/>
<!--
The reason that TransactionAmount gets the symbols and
TransactionForeignAmount gets the ID's of the currencies is
because ultimately TransactionAmount doesn't decide which
currency id is submitted to Firefly III.
-->
<TransactionForeignAmount
:index="index"
v-on="$listeners"
:errors="transaction.errors.foreign_amount"
:transaction-type="this.transactionType"
:source-currency-id="this.transaction.source_account_currency_id"
:destination-currency-id="this.transaction.destination_account_currency_id"
:selected-currency-id="this.transaction.foreign_currency_id"
/>
</div>
</div>
@@ -93,6 +124,9 @@
<div class="col-xl-5 col-lg-5 col-md-12 col-sm-12 col-xs-12">
<TransactionDate
:index="index"
v-on="$listeners"
:date="splitDate"
:time="splitTime"
:errors="transaction.errors.date"
/>
</div>
@@ -100,8 +134,15 @@
<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"
v-on="$listeners"
:custom-fields.sync="customFields"
:errors="transaction.errors.custom_dates"
:interest-date="transaction.interest_date"
:book-date="transaction.book_date"
:process-date="transaction.process_date"
:due-date="transaction.due_date"
:payment-date="transaction.payment_date"
:invoice-date="transaction.invoice_date"
/>
</div>
</div>
@@ -128,12 +169,14 @@
<div class="row">
<div class="col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12">
<TransactionBudget
v-on="$listeners"
v-model="transaction.budget_id"
:index="index"
:errors="transaction.errors.budget"
v-if="!('Transfer' === transactionType || 'Deposit' === transactionType)"
/>
<TransactionCategory
v-on="$listeners"
v-model="transaction.category"
:index="index"
:errors="transaction.errors.category"
@@ -141,17 +184,20 @@
</div>
<div class="col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12">
<TransactionBill
v-on="$listeners"
v-model="transaction.bill_id"
:index="index"
:errors="transaction.errors.bill"
v-if="!('Transfer' === transactionType || 'Deposit' === transactionType)"
/>
<TransactionTags
v-on="$listeners"
:index="index"
v-model="transaction.tags"
:errors="transaction.errors.tags"
/>
<TransactionPiggyBank
v-on="$listeners"
:index="index"
v-model="transaction.piggy_bank_id"
:errors="transaction.errors.piggy_bank"
@@ -180,6 +226,7 @@
<div class="col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12">
<TransactionInternalReference
v-on="$listeners"
:index="index"
v-model="transaction.internal_reference"
:errors="transaction.errors.internal_reference"
@@ -187,12 +234,14 @@
/>
<TransactionExternalUrl
v-on="$listeners"
:index="index"
v-model="transaction.external_url"
:errors="transaction.errors.external_url"
:custom-fields.sync="customFields"
/>
<TransactionNotes
v-on="$listeners"
:index="index"
v-model="transaction.notes"
:errors="transaction.errors.notes"
@@ -219,6 +268,7 @@
/>
<TransactionLinks
v-on="$listeners"
:index="index"
v-model="transaction.links"
:custom-fields.sync="customFields"
@@ -272,8 +322,29 @@ export default {
'index',
'submittedTransaction' // need to know if transaction is submitted.
],
// TODO get rid of mapped getters.
computed: {
...mapGetters(['transactionType',]),
...mapGetters(['transactionType', 'date', 'time']),
splitDate: function () {
return this.date;
},
splitTime: function () {
return this.time;
},
sourceAccount: function () {
return {
id: this.transaction.source_account_id,
name: this.transaction.source_account_name,
type: this.transaction.source_account_type,
};
},
destinationAccount: function () {
return {
id: this.transaction.destination_account_id,
name: this.transaction.destination_account_name,
type: this.transaction.destination_account_type,
};
},
hasMetaFields: function () {
let requiredFields = [
'internal_reference',

View File

@@ -49,18 +49,11 @@ export default {
),
switchAccounts() {
let source = this.transactions[this.index].source_account;
let dest = this.transactions[this.index].destination_account;
this.updateField({field: 'source_account', index: this.index, value: dest});
this.updateField({field: 'destination_account', index: this.index, value: source});
// trigger other components.
this.$emit('switch-accounts', this.index);
}
},
computed: {
...mapGetters(['transactions', 'transactionType']),
...mapGetters(['transactionType']),
}
}
</script>

View File

@@ -40,6 +40,12 @@
@input="lookupAccount"
@hit="selectedAccount = $event"
>
<template slot="suggestion" slot-scope="{ data, htmlText }">
<div class="d-flex" :title="data.type">
<span v-html="htmlText"></span><br>
</div>
</template>
<template slot="append">
<div class="input-group-append">
<button tabindex="-1" class="btn btn-outline-secondary" v-on:click="clearAccount" type="button"><i class="far fa-trash-alt"></i></button>
@@ -75,7 +81,8 @@ export default {
initialSet: [],
selectedAccount: {},
account: this.value,
accountName: ''
accountName: '',
selectedAccountTrigger: false,
}
},
created() {
@@ -89,20 +96,12 @@ export default {
'setSourceAllowedTypes'
],
),
...mapActions(
[
'calcTransactionType'
]
),
getACURL: function (types, query) {
let URL = './api/v1/autocomplete/accounts?types=' + types.join(',') + '&query=' + query;
//console.log('AC URL is ' + URL);
return URL;
return './api/v1/autocomplete/accounts?types=' + types.join(',') + '&query=' + query;
},
clearAccount: function () {
this.accounts = this.initialSet;
this.account = {name: ''};
this.account = {name: '', type: 'no_type', id: null, currency_id: null, currency_code: null, currency_symbol: null};
this.accountName = '';
},
lookupAccount: debounce(function () {
@@ -136,13 +135,41 @@ export default {
},
watch: {
selectedAccount: function (value) {
//console.log('Now in selectedAccount');
//console.log(value);
//console.log('Emit on selected account');
this.selectedAccountTrigger = true;
this.account = value;
this.$emit(this.emitAccountId, value.id);
this.$emit(this.emitAccountType, value.type);
this.$emit(this.emitAccountName, value.name);
this.$emit(this.emitAccountCurrencyId, value.currency_id);
this.$emit(this.emitAccountCurrencyCode, value.currency_code);
this.$emit(this.emitAccountCurrencySymbol, value.currency_symbol);
//this.$emit(this.emitAccount, value);
this.accountName = this.account.name_with_balance;
// call method to set what the opposing accounts should be.
// and what the
},
accountName: function (value) {
if (false === this.selectedAccountTrigger) {
console.log('Save to change name!');
this.$emit(this.emitAccountId, null);
this.$emit(this.emitAccountType, null);
this.$emit(this.emitAccountName, value);
this.$emit(this.emitAccountCurrencyId, null);
this.$emit(this.emitAccountCurrencyCode, null);
this.$emit(this.emitAccountCurrencySymbol, null);
//this.$emit(this.emitAccount, {name: value, type: null, id: null, currency_id: null, currency_code: null, currency_symbol: null});
// also reset local account thing, but dont be weird about it
this.accountTrigger = false;
this.account = {name: value, type: null, id: null, currency_id: null, currency_code: null, currency_symbol: null};
}
this.selectedAccountTrigger = false;
},
account: function (value) {
this.updateField({field: this.accountKey, index: this.index, value: value});
//this.updateField({field: this.accountKey, index: this.index, value: value});
// set the opposing account allowed set.
let opposingAccounts = [];
let type = value.type ? value.type : 'no_type';
@@ -158,9 +185,13 @@ export default {
if ('destination' === this.direction) {
this.setSourceAllowedTypes(opposingAccounts);
}
this.calcTransactionType();
},
value: function (value) {
console.log(this.direction + ' account overruled by external forces.');
this.account = value;
this.selectedAccountTrigger = true;
this.accountName = value.name;
}
},
computed: {
...mapGetters([
@@ -174,6 +205,42 @@ export default {
return 'source' === this.direction ? 'source_account' : 'destination_account';
}
},
emitAccountId: {
get() {
return 'set-' + this.direction + '-account-id';
}
},
emitAccount: {
get() {
return 'set-' + this.direction + '-account';
}
},
emitAccountName: {
get() {
return 'set-' + this.direction + '-account-name';
}
},
emitAccountType: {
get() {
return 'set-' + this.direction + '-account-type';
}
},
emitAccountCurrencyId: {
get() {
return 'set-' + this.direction + '-account-currency-id';
}
},
emitAccountCurrencyCode: {
get() {
return 'set-' + this.direction + '-account-currency-code';
}
},
emitAccountCurrencySymbol: {
get() {
return 'set-' + this.direction + '-account-currency-symbol';
}
},
visible: {
get() {
// index 0 is always visible:

View File

@@ -22,137 +22,67 @@
<div class="form-group">
<div class="text-xs">{{ $t('firefly.amount') }}</div>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-prepend" v-if="currencySymbol">
<div class="input-group-text">{{ currencySymbol }}</div>
</div>
<input type="hidden" name="currency_id[]" :value="currencyId"/>
<input
:title="$t('firefly.amount')"
autocomplete="off"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
name="amount[]"
type="number"
v-model="amount"
v-model="transactionAmount"
: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>
</div>
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
//const {mapRootState, mapRootGetters, mapRootActions, mapRootMutations} = createHelpers('');
export default {
name: "TransactionAmount",
props: ['index', 'errors'],
props: [
'index', 'errors', 'amount', 'transactionType',
'sourceCurrencySymbol',
'destinationCurrencySymbol',
],
data() {
return {
currencySymbol: ''
transactionAmount: this.amount,
currencySymbol: null,
srcCurrencySymbol: this.sourceCurrencySymbol,
dstCurrencySymbol: this.destinationCurrencySymbol,
}
},
watch: {
transactionType: function (value) {
switch (value) {
case 'Transfer':
case 'Withdrawal':
// take currency from source:
this.currencyId = this.transactions[this.index].source_account.currency_id;
this.currencySymbol = this.transactions[this.index].source_account.currency_symbol;
return;
case 'Deposit':
// take currency from destination:
this.currencyId = this.transactions[this.index].destination_account.currency_id;
this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
return;
}
transactionAmount: function (value) {
this.$emit('set-amount', value);
},
destinationAllowedTypes: function (value) {
// aka source was updated. if source is asset/loan/debt/mortgage use it to set the currency:
if ('undefined' !== typeof this.transactions[this.index].source_account.type) {
if (['Asset account', 'Loan', 'Debt', 'Mortgage'].indexOf(this.transactions[this.index].source_account.type) !== -1) {
// get currency pref from source account
this.currencyId = this.transactions[this.index].source_account.currency_id;
this.currencySymbol = this.transactions[this.index].source_account.currency_symbol;
}
}
amount: function(value) {
this.transactionAmount = value;
},
sourceAllowedTypes: function (value) {
// aka destination was updated. if destination is asset/loan/debt/mortgage use it to set the currency:
// unless its already known to be a transfer
if ('undefined' !== typeof this.transactions[this.index].destination_account.type && 'Transfer' !== this.transactionType) {
if (['Asset account', 'Loan', 'Debt', 'Mortgage'].indexOf(this.transactions[this.index].destination_account.type) !== -1) {
// get currency pref from destination account
this.currencyId = this.transactions[this.index].destination_account.currency_id;
this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
}
}
sourceCurrencySymbol: function (value) {
this.srcCurrencySymbol = value;
},
destinationCurrencySymbol: function (value) {
this.dstCurrencySymbol = value;
},
},
created: function () {
this.updateCurrency();
},
methods: {
...mapMutations(
[
'updateField',
],
),
updateCurrency: function () {
if (0 === this.currencyId) {
// use default currency from store.
this.currencySymbol = this.currencyPreference.symbol;
this.currencyId = this.currencyPreference.id;
}
}
},
computed: {
currencyPreference: {
get() {
return this.$store.state.currencyPreference;
}
transactionType: function(value) {
switch (value) {
case 'Transfer':
case 'Withdrawal':
this.currencySymbol =this.srcCurrencySymbol;
break;
case 'Deposit':
this.currencySymbol =this.dstCurrencySymbol;
}
},
...mapGetters([
'transactionType',
'transactions',
'destinationAllowedTypes',
'sourceAllowedTypes',
]),
amount: {
get() {
return this.transactions[this.index].amount;
},
set(value) {
this.updateField({field: 'amount', index: this.index, value: value});
}
},
currencyId: {
get() {
return this.transactions[this.index].currency_id;
},
set(value) {
this.updateField({field: 'currency_id', index: this.index, value: value});
}
},
selectedTransactionType: {
get() {
return this.transactionType;
},
set(value) {
// console.log('set selectedAccount for ' + this.direction);
// console.log(value);
// this.updateField({field: this.accountKey, index: this.index, value: value});
}
}
}
},
}
</script>

View File

@@ -50,6 +50,8 @@ export default {
},
transaction_journal_id: function (value) {
if (!this.showField) {
console.log('Field is hidden. Emit event!');
this.$emit('uploaded-attachments', value);
return;
}
// console.log('transaction_journal_id changed to ' + value);

View File

@@ -44,11 +44,6 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['value', 'index', 'errors'],
name: "TransactionBill",
@@ -62,11 +57,6 @@ export default {
this.collectData();
},
methods: {
...mapMutations(
[
'updateField',
],
),
collectData() {
this.billList.push(
{
@@ -99,17 +89,9 @@ export default {
},
watch: {
bill: function (value) {
this.updateField({field: 'bill_id', index: this.index, value: value});
this.$emit('set-bill', value);
}
},
computed: {
...mapGetters(
[
'transactionType',
'transactions',
]
)
}
}
</script>

View File

@@ -43,11 +43,6 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors'],
name: "TransactionBudget",
@@ -61,11 +56,6 @@ export default {
this.collectData();
},
methods: {
...mapMutations(
[
'updateField',
],
),
collectData() {
this.budgetList.push(
{
@@ -98,16 +88,8 @@ export default {
},
watch: {
budget: function (value) {
this.updateField({field: 'budget_id', index: this.index, value: value});
this.$emit('set-budget', value);
}
},
computed: {
...mapGetters(
[
'transactionType',
'transactions',
]
)
}
}
</script>

View File

@@ -50,12 +50,9 @@
<script>
import {createNamespacedHelpers} from "vuex";
import VueTypeaheadBootstrap from 'vue-typeahead-bootstrap';
import {debounce} from "lodash";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['value', 'index', 'errors'],
components: {VueTypeaheadBootstrap},
@@ -79,11 +76,6 @@ export default {
},
methods: {
...mapMutations(
[
'updateField',
],
),
clearCategory: function () {
this.category = null;
},
@@ -101,16 +93,10 @@ export default {
},
watch: {
category: function (value) {
this.updateField({field: 'category', index: this.index, value: value});
this.$emit('set-category', value);
}
},
computed: {
...mapGetters(
[
'transactionType',
'transactions',
]
),
selectedCategory: {
get() {
return this.categories[this.index].name;

View File

@@ -43,37 +43,48 @@
</template>
<script>
// TODO: error handling
// TODO dont use store?
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
name: "TransactionCustomDates",
props: ['index', 'errors', 'customFields'],
props: [
'index',
'errors',
'customFields',
'interestDate',
'bookDate',
'processDate',
'dueDate',
'paymentDate',
'invoiceDate'
],
data() {
return {
dateFields: ['interest_date', 'book_date', 'process_date', 'due_date', 'payment_date', 'invoice_date'],
availableFields: this.customFields
availableFields: this.customFields,
dates: {
interest_date: this.interestDate,
book_date: this.bookDate,
process_date: this.processDate,
due_date: this.dueDate,
payment_date: this.paymentDate,
invoice_date: this.invoiceDate,
}
,
}
},
watch: {
customFields: function(value) {
customFields: function (value) {
this.availableFields = value;
}
},
methods: {
...mapGetters(['transactions']),
...mapMutations(['updateField',],
),
isDateField: function (name) {
return this.dateFields.includes(name)
},
getFieldValue(field) {
return this.transactions()[parseInt(this.index)][field] ?? '';
return this.dates[field] ?? '';
},
setFieldValue(event, field) {
this.updateField({index: this.index, field: field, value: event.target.value});
this.$emit('set-custom-date', { field: field, date: event.target.value});
},
}
}

View File

@@ -29,22 +29,22 @@
type="date"
ref="date"
:title="$t('firefly.date')"
v-model="localDate"
v-model="dateStr"
:disabled="index > 0"
autocomplete="off"
name="date[]"
:placeholder="localDate"
:placeholder="dateStr"
>
<input
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
type="time"
ref="time"
:title="$t('firefly.time')"
v-model="localTime"
v-model="timeStr"
:disabled="index > 0"
autocomplete="off"
name="time[]"
:placeholder="localTime"
:placeholder="timeStr"
>
</div>
<span v-if="errors.length > 0">
@@ -55,71 +55,59 @@
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'errors'],
props: ['index', 'errors', 'date', 'time'],
name: "TransactionDate",
methods: {
...mapMutations(
[
'updateField',
'setDate'
],
),
data() {
return {
localDate: this.date,
localTime: this.time
}
},
methods: {},
computed: {
...mapGetters(
[
'transactionType',
'date',
'transactions'
]
),
localDate: {
dateStr: {
get() {
if (this.date instanceof Date && !isNaN(this.date)) {
return this.date.toISOString().split('T')[0];
if (this.localDate instanceof Date && !isNaN(this.localDate)) {
return this.localDate.toISOString().split('T')[0];
}
return '';
},
set(value) {
// bit of a hack but meh.
if('' === value) {
if ('' === value) {
// reset to today
this.localDate = new Date();
this.$emit('set-date', {date: this.localDate});
return;
}
let newDate = new Date(value);
let current = new Date(this.date.getTime());
current.setFullYear(newDate.getFullYear());
current.setMonth(newDate.getMonth());
current.setDate(newDate.getDate());
this.setDate({date: current});
this.localDate = new Date(value);
this.$emit('set-date', {date: this.localDate});
}
},
localTime: {
timeStr: {
get() {
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);
if (this.localTime instanceof Date && !isNaN(this.localTime)) {
return ('0' + this.localTime.getHours()).slice(-2) + ':' + ('0' + this.localTime.getMinutes()).slice(-2) + ':' + ('0' + this.localTime.getSeconds()).slice(-2);
}
return '';
},
set(value) {
if('' === value) {
this.date.setHours(0);
this.date.setMinutes(0);
this.date.setSeconds(0);
this.setDate({date: this.date});
if ('' === value) {
this.localTime.setHours(0);
this.localTime.setMinutes(0);
this.localTime.setSeconds(0);
this.$emit('set-time', {time: this.localTime});
return;
}
// bit of a hack but meh.
let current = new Date(this.date.getTime());
let current = new Date(this.localTime.getTime());
let parts = value.split(':');
current.setHours(parseInt(parts[0]));
current.setMinutes(parseInt(parts[1]));
current.setSeconds(parseInt(parts[2]));
this.setDate({date: current});
this.localTime = current;
this.$emit('set-time', {time: this.localTime});
}
}
}

View File

@@ -46,12 +46,9 @@
<script>
import {createNamespacedHelpers} from "vuex";
import VueTypeaheadBootstrap from 'vue-typeahead-bootstrap';
import {debounce} from "lodash";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors'],
components: {VueTypeaheadBootstrap},
@@ -72,11 +69,6 @@ export default {
},
methods: {
...mapMutations(
[
'updateField',
],
),
clearDescription: function () {
this.description = '';
},
@@ -94,16 +86,9 @@ export default {
},
watch: {
description: function (value) {
this.updateField({field: 'description', index: this.index, value: value});
this.$emit('set-description', value);
//
}
},
computed: {
...mapGetters(
[
'transactionType',
'transactions',
]
)
}
}
</script>

View File

@@ -39,10 +39,6 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors', 'customFields'],
name: "TransactionExternalUrl",
@@ -61,18 +57,13 @@ export default {
}
},
methods: {
...mapMutations(
[
'updateField',
],
),
},
watch: {
customFields: function (value) {
this.availableFields = value;
},
url: function (value) {
this.updateField({field: 'external_url', index: this.index, value: value});
this.$emit('set-external-url', value);
}
}
}

View File

@@ -20,15 +20,13 @@
<template>
<!-- FOREIGN AMOUNT -->
<div class="form-group">
<input type="hidden" name="foreign_currency_id[]" :value="currencyId"/>
<div class="form-group" v-if="isVisible">
<div class="text-xs">{{ $t('form.foreign_amount') }}</div>
<div class="input-group">
<input
:title="$t('form.foreign_amount')"
autocomplete="off"
:class="errors.length > 0 ? 'form-control is-invalid' : 'form-control'"
:disabled="0===currencyId"
name="foreign_amount[]"
type="number"
v-model="amount"
@@ -42,117 +40,34 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
//const {mapRootState, mapRootGetters, mapRootActions, mapRootMutations} = createHelpers('');
export default {
name: "TransactionForeignAmount",
props: ['index','errors'],
props: [
'index',
'errors',
'transactionType',
'sourceCurrencyId',
'destinationCurrencyId'
],
data() {
return {
currencySymbol: '',
allCurrencies: [],
selectableCurrencies: [],
amount: ''
// currencySymbol: '',
// allCurrencies: [],
// selectableCurrencies: [],
}
},
watch: {
transactionType: function (value) {
// switch (value) {
// case 'Transfer':
// case 'Withdrawal':
// // take currency from source:
// //this.currencyId = this.transactions[this.index].source_account.currency_id;
// this.currencySymbol = this.transactions[this.index].source_account.currency_symbol;
// return;
// case 'Deposit':
// // take currency from destination:
// this.currencyId = this.transactions[this.index].destination_account.currency_id;
// this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
// return;
// }
},
destinationAllowedTypes: function (value) {
// // aka source was updated. if source is asset/loan/debt/mortgage use it to set the currency:
// if ('undefined' !== typeof this.transactions[this.index].source_account.type) {
// if (['Asset account', 'Loan', 'Debt', 'Mortgage'].indexOf(this.transactions[this.index].source_account.type) !== -1) {
// // get currency pref from source account
// this.currencyId = this.transactions[this.index].source_account.currency_id;
// this.currencySymbol = this.transactions[this.index].source_account.currency_symbol;
// }
// }
},
sourceAllowedTypes: function (value) {
// // aka destination was updated. if destination is asset/loan/debt/mortgage use it to set the currency:
// // unless its already known to be a transfer
// if ('undefined' !== typeof this.transactions[this.index].destination_account.type && 'Transfer' !== this.transactionType) {
// if (['Asset account', 'Loan', 'Debt', 'Mortgage'].indexOf(this.transactions[this.index].destination_account.type) !== -1) {
// // get currency pref from destination account
// this.currencyId = this.transactions[this.index].destination_account.currency_id;
// this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
// }
// }
},
},
created: function () {
},
methods: {
...mapMutations(
[
'updateField',
],
),
// updateCurrency: function () {
// if (0 === this.currencyId) {
// // use default currency from store.
// this.currencySymbol = this.currencyPreference.symbol;
// this.currencyId = this.currencyPreference.id;
// }
// }
amount: function(value) {
this.$emit('set-foreign-amount', value);
}
},
computed: {
currencyPreference: {
isVisible: {
get() {
return this.$store.state.currencyPreference;
return !('Transfer' === this.transactionType && this.sourceCurrencyId === this.destinationCurrencyId);
}
},
...mapGetters([
'transactionType',
'transactions',
'destinationAllowedTypes',
'sourceAllowedTypes',
]),
amount: {
get() {
return this.transactions[this.index].foreign_amount;
},
set(value) {
this.updateField({field: 'foreign_amount', index: this.index, value: value});
}
},
currencyId: {
get() {
return this.transactions[this.index].foreign_currency_id;
},
set(value) {
this.updateField({field: 'foreign_currency_id', index: this.index, value: value});
}
},
selectedTransactionType: {
get() {
return this.transactionType;
},
set(value) {
// console.log('set selectedAccount for ' + this.direction);
// console.log(value);
// this.updateField({field: this.accountKey, index: this.index, value: value});
}
}
}
}
</script>

View File

@@ -20,10 +20,10 @@
<template>
<!-- FOREIGN Currency -->
<div class="form-group" v-if="selectIsVisible">
<div class="form-group" v-if="isVisible">
<div class="text-xs">&nbsp;</div>
<div class="input-group">
<select name="foreign_currency_id[]" v-model="currencyId" class="form-control">
<select name="foreign_currency_id[]" v-model="selectedCurrency" class="form-control">
<option v-for="currency in selectableCurrencies" :label="currency.name" :value="currency.id">{{ currency.name }}</option>
</select>
</div>
@@ -31,77 +31,48 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
name: "TransactionForeignCurrency",
props: ['index'],
props: [
'index',
'transactionType',
'sourceCurrencyId',
'destinationCurrencyId',
'selectedCurrencyId'
],
data() {
return {
selectedCurrency: 0,
allCurrencies: [],
selectableCurrencies: [],
dstCurrencyId: this.destinationCurrencyId,
srcCurrencyId: this.sourceCurrencyId,
lockedCurrency: 0,
selectIsVisible: true
}
},
watch: {
sourceCurrencyId: function (value) {
this.srcCurrencyId = value;
},
destinationCurrencyId: function (value) {
this.dstCurrencyId = value;
},
selectedCurrency: function(value) {
this.$emit('set-foreign-currency-id', value);
},
transactionType: function (value) {
this.lockedCurrency = 0;
if ('Transfer' === value) {
// take currency from destination:
this.currencyId = this.transactions[this.index].destination_account.currency_id;
this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
this.lockedCurrency = this.currencyId;
this.lockedCurrency = this.dstCurrencyId;
this.selectedCurrency = this.dstCurrencyId;
}
this.filterCurrencies();
this.checkVisibility();
},
destinationAllowedTypes: function (value) {
this.lockedCurrency = 0;
if ('Transfer' === this.transactionType) {
// take currency from destination:
this.currencyId = this.transactions[this.index].destination_account.currency_id;
this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
this.lockedCurrency = this.currencyId;
}
this.filterCurrencies();
this.checkVisibility();
},
sourceAllowedTypes: function (value) {
this.lockedCurrency = 0;
if ('Transfer' === this.transactionType) {
// take currency from destination:
this.currencyId = this.transactions[this.index].destination_account.currency_id;
this.currencySymbol = this.transactions[this.index].destination_account.currency_symbol;
this.lockedCurrency = this.currencyId;
}
this.filterCurrencies();
this.checkVisibility();
},
},
created: function () {
this.getAllCurrencies();
},
methods: {
...mapMutations(
[
'updateField',
],
),
checkVisibility: function () {
// have the same currency ID, but not zero, and is a transfer
let sourceId = this.transactions[this.index].source_account.currency_id;
let destId = this.transactions[this.index].destination_account.currency_id;
this.selectIsVisible = true;
if (sourceId === destId && 0 !== sourceId && 'Transfer' === this.transactionType) {
this.selectIsVisible = false;
this.currencyId = 0;
}
},
getAllCurrencies: function () {
axios.get('./api/v1/autocomplete/currencies')
.then(response => {
@@ -119,14 +90,13 @@ export default {
let current = this.allCurrencies[key];
if (current.id === this.lockedCurrency) {
this.selectableCurrencies = [current];
this.currencyId = current.id;
this.selectedCurrency = current.id;
}
}
}
return;
}
this.selectableCurrencies = [
{
"id": 0,
@@ -136,62 +106,15 @@ export default {
for (let key in this.allCurrencies) {
if (this.allCurrencies.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
let current = this.allCurrencies[key];
// add to array if not "locked" in place:
if (this.transactions[this.index].currency_id !== current.id) {
this.selectableCurrencies.push(current);
}
// deselect impossible currency.
if (this.transactions[this.index].currency_id === current.id && this.currencyId === current.id) {
this.currencyId = 0;
}
this.selectableCurrencies.push(current);
}
}
//currency_id
// always add empty currency:
// this.selectableCurrencies = this.allCurrencies;
// this.selectableCurrencies.reverse();
// this.selectableCurrencies.push(
// ;
// this.selectableCurrencies.reverse();
// remove
}
// updateCurrency: function () {
// if (0 === this.currencyId) {
// // use default currency from store.
// this.currencySymbol = this.currencyPreference.symbol;
// this.currencyId = this.currencyPreference.id;
// }
// }
},
computed: {
currencyPreference: {
get() {
return this.$store.state.currencyPreference;
}
},
...mapGetters([
'transactionType',
'transactions',
'destinationAllowedTypes',
'sourceAllowedTypes',
]),
currencyId: {
get() {
return this.transactions[this.index].foreign_currency_id;
},
set(value) {
this.updateField({field: 'foreign_currency_id', index: this.index, value: value});
}
},
normalCurrencyId: {
get() {
return this.transactions[this.index].currency_id;
},
},
isVisible: function () {
return !('Transfer' === this.transactionType && this.srcCurrencyId === this.dstCurrencyId);
}
}
}
</script>

View File

@@ -39,10 +39,6 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors', 'customFields'],
name: "TransactionInternalReference",
@@ -61,18 +57,13 @@ export default {
}
},
methods: {
...mapMutations(
[
'updateField',
],
),
},
watch: {
customFields: function (value) {
this.availableFields = value;
},
reference: function (value) {
this.updateField({field: 'internal_reference', index: this.index, value: value});
this.$emit('set-internal-reference', value);
}
}
}

View File

@@ -184,10 +184,6 @@
</template>
<script>
import {createNamespacedHelpers} from 'vuex'
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
const lodashClonedeep = require('lodash.clonedeep');
// TODO error handling
export default {
@@ -220,18 +216,15 @@ export default {
},
watch: {
links: function (value) {
this.updateField({index: this.index, field: 'links', value: lodashClonedeep(value)});
// TODO
this.$emit('set-links', lodashClonedeep(value));
//this.updateField({index: this.index, field: 'links', value: lodashClonedeep(value)});
},
customFields: function (value) {
this.availableFields = value;
}
},
methods: {
...mapMutations(
[
'updateField',
],
),
getTextForLinkType: function (linkTypeId) {
let parts = linkTypeId.split('-');
for (let i in this.linkTypes) {

View File

@@ -40,6 +40,7 @@
<button class="btn btn-default btn-xs" @click="clearLocation">{{ $t('firefly.clear_location') }}</button>
</span>
</div>
<p>&nbsp;</p>
</div>
</template>

View File

@@ -36,10 +36,6 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors', 'customFields'],
name: "TransactionNotes",
@@ -57,19 +53,12 @@ export default {
return false;
}
},
methods: {
...mapMutations(
[
'updateField',
],
),
},
watch: {
customFields: function (value) {
this.availableFields = value;
},
notes: function (value) {
this.updateField({field: 'notes', index: this.index, value: value});
this.$emit('set-notes', value);
}
}
}

View File

@@ -45,10 +45,6 @@
<script>
import {createNamespacedHelpers} from "vuex";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
props: ['index', 'value', 'errors'],
name: "TransactionPiggyBank",
@@ -62,11 +58,6 @@ export default {
this.collectData();
},
methods: {
...mapMutations(
[
'updateField',
],
),
collectData() {
this.piggyList.push(
{
@@ -99,14 +90,8 @@ export default {
},
watch: {
piggy_bank_id: function (value) {
this.updateField({field: 'piggy_bank_id', index: this.index, value: value});
this.$emit('set-piggy-bank', value);
}
},
computed: {
...mapGetters([
'transactionType',
'transactions',
])
}
}
</script>

View File

@@ -41,12 +41,9 @@
</template>
<script>
import {createNamespacedHelpers} from "vuex";
import VueTagsInput from "@johmun/vue-tags-input";
import axios from "axios";
const {mapState, mapGetters, mapActions, mapMutations} = createNamespacedHelpers('transactions/create')
export default {
name: "TransactionTags",
components: {
@@ -66,14 +63,12 @@ export default {
watch: {
'currentTag': 'initItems',
tagList: function (value) {
this.updateField({field: 'tags', index: this.index, value: value});
this.$emit('set-tags', value);
this.updateTags = false;
this.tags = value;
},
tags: function (value) {
if (this.updateTags) {
//console.log('watch: tags');
let shortList = [];
for (let key in value) {
if (value.hasOwnProperty(key)) {
@@ -86,11 +81,6 @@ export default {
}
},
methods: {
...mapMutations(
[
'updateField',
],
),
initItems() {
if (this.currentTag.length < 2) {
return;

View File

@@ -73,9 +73,9 @@
"create_another": "Nach dem Speichern hierher zur\u00fcckkehren, um ein weiteres zu erstellen.",
"reset_after": "Formular nach der \u00dcbermittlung zur\u00fccksetzen",
"bill_paid_on": "Bezahlt am {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "Die erste Aufteilung bestimmt den Wert dieses Feldes",
"first_split_overrules_source": "Die erste Aufteilung k\u00f6nnte das Quellkonto \u00fcberschreiben",
"first_split_overrules_destination": "Die erste Aufteilung k\u00f6nnte das Zielkonto \u00fcberschreiben",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Buchung #{ID} (\"{title}\")<\/a> wurde gespeichert.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -73,9 +73,9 @@
"create_another": "Apr\u00e8s enregistrement, revenir ici pour en cr\u00e9er un nouveau.",
"reset_after": "R\u00e9initialiser le formulaire apr\u00e8s soumission",
"bill_paid_on": "Pay\u00e9 le {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "La premi\u00e8re ventilation d\u00e9termine la valeur de ce champ",
"first_split_overrules_source": "La premi\u00e8re ventilation peut remplacer le compte source",
"first_split_overrules_destination": "La premi\u00e8re ventilation peut remplacer le compte de destination",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">L'op\u00e9ration n\u00b0{ID} (\"{title}\")<\/a> a \u00e9t\u00e9 enregistr\u00e9e.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -73,9 +73,9 @@
"create_another": "Dopo il salvataggio, torna qui per crearne un'altra.",
"reset_after": "Resetta il modulo dopo l'invio",
"bill_paid_on": "Pagata il {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "La prima suddivisione determina il valore di questo campo",
"first_split_overrules_source": "La prima suddivisione potrebbe sovrascrivere l'account di origine",
"first_split_overrules_destination": "La prima suddivisione potrebbe sovrascrivere l'account di destinazione",
"transaction_stored_link": "La <a href=\"transactions\/show\/{ID}\">transazione #{ID} (\"{title}\")<\/a> \u00e8 stata salvata.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -73,13 +73,13 @@
"create_another": "Terug naar deze pagina voor een nieuwe transactie.",
"reset_after": "Reset formulier na opslaan",
"bill_paid_on": "Betaald op {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "De eerste split bepaalt wat hier staat",
"first_split_overrules_source": "De eerste split kan de bronrekening overschrijven",
"first_split_overrules_destination": "De eerste split kan de doelrekening overschrijven",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transactie #{ID} (\"{title}\")<\/a> is opgeslagen.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",
"select_period": "Select a period",
"custom_period": "Aangepaste periode",
"reset_to_current": "Reset naar huidige periode",
"select_period": "Selecteer een periode",
"location": "Plaats",
"other_budgets": "Aangepaste budgetten",
"journal_links": "Transactiekoppelingen",

View File

@@ -73,9 +73,9 @@
"create_another": "Po zapisaniu wr\u00f3\u0107 tutaj, aby utworzy\u0107 kolejny.",
"reset_after": "Wyczy\u015b\u0107 formularz po zapisaniu",
"bill_paid_on": "Zap\u0142acone {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "Pierwszy podzia\u0142 okre\u015bla warto\u015b\u0107 tego pola",
"first_split_overrules_source": "Pierwszy podzia\u0142 mo\u017ce nadpisa\u0107 konto \u017ar\u00f3d\u0142owe",
"first_split_overrules_destination": "Pierwszy podzia\u0142 mo\u017ce nadpisa\u0107 konto docelowe",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transakcja #{ID} (\"{title}\")<\/a> zosta\u0142a zapisana.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -16,12 +16,12 @@
"transaction_journal_extra": "Informa\u00e7\u00e3o extra",
"transaction_journal_meta": "Meta-informa\u00e7\u00e3o",
"basic_journal_information": "Informa\u00e7\u00f5es b\u00e1sicas de transa\u00e7\u00e3o",
"bills_to_pay": "Faturas a pagar",
"bills_to_pay": "Contas a pagar",
"left_to_spend": "Restante para gastar",
"attachments": "Anexos",
"net_worth": "Valor L\u00edquido",
"bill": "Fatura",
"no_bill": "(sem fatura)",
"no_bill": "(sem conta)",
"tags": "Tags",
"internal_reference": "Refer\u00eancia interna",
"external_url": "URL externa",
@@ -41,11 +41,11 @@
"categories": "Categorias",
"go_to_budgets": "V\u00e1 para seus or\u00e7amentos",
"income": "Receita \/ Renda",
"go_to_deposits": "Ir para os dep\u00f3sitos",
"go_to_deposits": "Ir para as entradas",
"go_to_categories": "V\u00e1 para suas categorias",
"expense_accounts": "Contas de despesas",
"go_to_expenses": "Ir para despesas",
"go_to_bills": "V\u00e1 para suas faturas",
"go_to_bills": "V\u00e1 para suas contas",
"bills": "Faturas",
"go_to_piggies": "V\u00e1 para sua poupan\u00e7a",
"saved": "Salvo",
@@ -73,15 +73,15 @@
"create_another": "Depois de armazenar, retorne aqui para criar outro.",
"reset_after": "Resetar o formul\u00e1rio ap\u00f3s o envio",
"bill_paid_on": "Pago em {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "A primeira divis\u00e3o determina o valor deste campo",
"first_split_overrules_source": "A primeira divis\u00e3o pode anular a conta de origem",
"first_split_overrules_destination": "A primeira divis\u00e3o pode anular a conta de destino",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",
"select_period": "Select a period",
"location": "Localiza\u00e7\u00e3o",
"other_budgets": "Custom timed budgets",
"other_budgets": "Or\u00e7amentos de per\u00edodos personalizados",
"journal_links": "Transa\u00e7\u00f5es ligadas",
"go_to_withdrawals": "V\u00e1 para seus saques",
"revenue_accounts": "Contas de receitas",

View File

@@ -73,9 +73,9 @@
"create_another": "Depois de guardar, voltar aqui para criar outra.",
"reset_after": "Repor o formul\u00e1rio ap\u00f3s o envio",
"bill_paid_on": "Pago a {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "A primeira divis\u00e3o determina o valor deste campo",
"first_split_overrules_source": "A primeira divis\u00e3o pode anular a conta de origem",
"first_split_overrules_destination": "A primeira divis\u00e3o pode anular a conta de destino",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi guardada.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -73,9 +73,9 @@
"create_another": "\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0441\u044e\u0434\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c.",
"reset_after": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438",
"bill_paid_on": "\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e {date}",
"first_split_decides": "The first split determines the value of this field",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"first_split_decides": "\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",
"first_split_overrules_source": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0447\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430",
"first_split_overrules_destination": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0447\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430.",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",

View File

@@ -3,88 +3,88 @@
"Transfer": "\u8f6c\u5e10",
"Withdrawal": "\u63d0\u6b3e",
"Deposit": "\u5b58\u6b3e",
"date_and_time": "Date and time",
"date_and_time": "\u65e5\u671f\u548c\u65f6\u95f4",
"no_currency": "(\u6ca1\u6709\u8d27\u5e01)",
"date": "\u65e5\u671f",
"time": "Time",
"time": "\u65f6\u95f4",
"no_budget": "(\u65e0\u9884\u7b97)",
"destination_account": "\u76ee\u6807\u5e10\u6237",
"source_account": "\u6765\u6e90\u5e10\u6237",
"single_split": "Split",
"create_new_transaction": "\u65b0\u5efa\u4ea4\u6613",
"destination_account": "\u76ee\u6807\u8d26\u6237",
"source_account": "\u6765\u6e90\u8d26\u6237",
"single_split": "\u62c6\u5206",
"create_new_transaction": "\u521b\u5efa\u65b0\u4ea4\u6613",
"balance": "\u4f59\u989d",
"transaction_journal_extra": "Extra information",
"transaction_journal_meta": "\u540e\u8bbe\u8d44\u8baf",
"basic_journal_information": "Basic transaction information",
"bills_to_pay": "\u5f85\u4ed8\u5e10\u5355",
"transaction_journal_extra": "\u989d\u5916\u4fe1\u606f",
"transaction_journal_meta": "\u5143\u4fe1\u606f",
"basic_journal_information": "\u57fa\u7840\u4ea4\u6613\u4fe1\u606f",
"bills_to_pay": "\u5f85\u4ed8\u8d26\u5355",
"left_to_spend": "\u5269\u4f59\u53ef\u82b1\u8d39",
"attachments": "\u9644\u52a0\u6863\u6848",
"net_worth": "\u51c0\u503c",
"bill": "\u5e10\u5355",
"no_bill": "(no bill)",
"attachments": "\u9644\u4ef6",
"net_worth": "\u51c0\u8d44\u4ea7",
"bill": "\u8d26\u5355",
"no_bill": "(\u65e0\u8d26\u5355)",
"tags": "\u6807\u7b7e",
"internal_reference": "\u5185\u90e8\u53c2\u8003",
"internal_reference": "\u5185\u90e8\u5f15\u7528",
"external_url": "\u5916\u90e8\u94fe\u63a5",
"no_piggy_bank": "\uff08\u65e0\u5b58\u94b1\u7f50\uff09",
"no_piggy_bank": "(\u65e0\u5b58\u94b1\u7f50)",
"paid": "\u5df2\u4ed8\u6b3e",
"notes": "\u6ce8\u91ca",
"yourAccounts": "\u60a8\u7684\u5e10\u6237",
"go_to_asset_accounts": "\u68c0\u89c6\u60a8\u7684\u8d44\u4ea7\u5e10\u6237",
"transaction_table_description": "A table containing your transactions",
"account": "\u5e10\u6237",
"notes": "\u5907\u6ce8",
"yourAccounts": "\u60a8\u7684\u8d26\u6237",
"go_to_asset_accounts": "\u67e5\u770b\u60a8\u7684\u8d44\u4ea7\u8d26\u6237",
"transaction_table_description": "\u5305\u542b\u60a8\u4ea4\u6613\u7684\u8868\u683c",
"account": "\u8d26\u6237",
"description": "\u63cf\u8ff0",
"amount": "\u91d1\u989d",
"budget": "\u9884\u7b97",
"category": "\u5206\u7c7b",
"opposing_account": "Opposing account",
"opposing_account": "\u5bf9\u65b9\u8d26\u6237",
"budgets": "\u9884\u7b97",
"categories": "\u5206\u7c7b",
"go_to_budgets": "\u524d\u5f80\u60a8\u7684\u9884\u7b97",
"income": "\u6536\u5165 \/ \u6240\u5f97",
"go_to_deposits": "Go to deposits",
"income": "\u6536\u76ca \/ \u6536\u5165",
"go_to_deposits": "\u524d\u5f80\u5b58\u6b3e",
"go_to_categories": "\u524d\u5f80\u60a8\u7684\u5206\u7c7b",
"expense_accounts": "\u652f\u51fa\u5e10\u6237",
"go_to_expenses": "Go to expenses",
"go_to_bills": "\u524d\u5f80\u60a8\u7684\u5e10\u5355",
"bills": "\u5e10\u5355",
"expense_accounts": "\u652f\u51fa\u8d26\u6237",
"go_to_expenses": "\u524d\u5f80\u652f\u51fa",
"go_to_bills": "\u524d\u5f80\u8d26\u5355",
"bills": "\u8d26\u5355",
"go_to_piggies": "\u524d\u5f80\u60a8\u7684\u5b58\u94b1\u7f50",
"saved": "\u5df2\u4fdd\u5b58",
"piggy_banks": "\u5b58\u94b1\u7f50",
"piggy_bank": "\u5b58\u94b1\u7f50",
"amounts": "Amounts",
"Default asset account": "\u9884\u8bbe\u8d44\u4ea7\u5e10\u6237",
"account_role_defaultAsset": "\u9884\u8bbe\u8d44\u4ea7\u5e10\u6237",
"account_role_savingAsset": "\u50a8\u84c4\u5e10\u6237",
"account_role_sharedAsset": "\u5171\u7528\u8d44\u4ea7\u5e10\u6237",
"amounts": "\u91d1\u989d",
"Default asset account": "\u9ed8\u8ba4\u8d44\u4ea7\u8d26\u6237",
"account_role_defaultAsset": "\u9ed8\u8ba4\u8d44\u4ea7\u8d26\u6237",
"account_role_savingAsset": "\u50a8\u84c4\u8d26\u6237",
"account_role_sharedAsset": "\u5171\u7528\u8d44\u4ea7\u8d26\u6237",
"clear_location": "\u6e05\u9664\u4f4d\u7f6e",
"account_role_ccAsset": "\u4fe1\u7528\u5361",
"account_role_cashWalletAsset": "\u73b0\u91d1\u94b1\u5305",
"daily_budgets": "Daily budgets",
"weekly_budgets": "Weekly budgets",
"monthly_budgets": "Monthly budgets",
"quarterly_budgets": "Quarterly budgets",
"half_year_budgets": "Half-yearly budgets",
"yearly_budgets": "Yearly budgets",
"daily_budgets": "\u6bcf\u65e5\u9884\u7b97",
"weekly_budgets": "\u6bcf\u5468\u9884\u7b97",
"monthly_budgets": "\u6bcf\u6708\u9884\u7b97",
"quarterly_budgets": "\u6bcf\u5b63\u5ea6\u9884\u7b97",
"half_year_budgets": "\u6bcf\u534a\u5e74\u9884\u7b97",
"yearly_budgets": "\u6bcf\u5e74\u9884\u7b97",
"split_transaction_title": "\u62c6\u5206\u4ea4\u6613\u7684\u63cf\u8ff0",
"errors_submission": "There was something wrong with your submission. Please check out the errors.",
"errors_submission": "\u60a8\u63d0\u4ea4\u7684\u5185\u5bb9\u6709\u8bef\uff0c\u8bf7\u68c0\u67e5\u9519\u8bef\u4fe1\u606f\u3002",
"flash_error": "\u9519\u8bef\uff01",
"store_transaction": "Store transaction",
"store_transaction": "\u4fdd\u5b58\u4ea4\u6613",
"flash_success": "\u6210\u529f\uff01",
"create_another": "\u4fdd\u5b58\u540e\uff0c\u8fd4\u56de\u6b64\u9875\u9762\u521b\u5efa\u53e6\u4e00\u7b14\u8bb0\u5f55\u3002",
"create_another": "\u4fdd\u5b58\u540e\uff0c\u8fd4\u56de\u6b64\u9875\u9762\u4ee5\u521b\u5efa\u65b0\u8bb0\u5f55",
"reset_after": "\u63d0\u4ea4\u540e\u91cd\u7f6e\u8868\u5355",
"bill_paid_on": "Paid on {date}",
"first_split_decides": "The first split determines the value of this field",
"bill_paid_on": "\u652f\u4ed8\u4e8e {date}",
"first_split_decides": "\u9996\u6b21\u62c6\u5206\u51b3\u5b9a\u6b64\u5b57\u6bb5\u7684\u503c",
"first_split_overrules_source": "The first split may overrule the source account",
"first_split_overrules_destination": "The first split may overrule the destination account",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transaction #{ID} (\"{title}\")<\/a> has been stored.",
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">\u4ea4\u6613 #{ID} (\u201c{title}\u201d)<\/a> \u5df2\u4fdd\u5b58\u3002",
"custom_period": "Custom period",
"reset_to_current": "Reset to current period",
"select_period": "Select a period",
"location": "\u4f4d\u7f6e",
"other_budgets": "Custom timed budgets",
"journal_links": "\u4ea4\u6613\u8fde\u7ed3",
"go_to_withdrawals": "Go to your withdrawals",
"revenue_accounts": "\u6536\u5165\u5e10\u6237",
"other_budgets": "\u81ea\u5b9a\u4e49\u533a\u95f4\u9884\u7b97",
"journal_links": "\u4ea4\u6613\u5173\u8054",
"go_to_withdrawals": "\u524d\u5f80\u53d6\u6b3e",
"revenue_accounts": "\u6536\u5165\u8d26\u6237",
"add_another_split": "\u589e\u52a0\u62c6\u5206"
},
"list": {
@@ -93,18 +93,18 @@
"amount": "\u91d1\u989d",
"name": "\u540d\u79f0",
"role": "\u89d2\u8272",
"iban": "\u56fd\u9645\u94f6\u884c\u5e10\u6237\u53f7\u7801 (IBAN)",
"iban": "\u56fd\u9645\u94f6\u884c\u8d26\u6237\u53f7\u7801\uff08IBAN\uff09",
"lastActivity": "\u4e0a\u6b21\u6d3b\u52a8",
"currentBalance": "\u76ee\u524d\u9980\u989d",
"balanceDiff": "\u9980\u989d\u5dee",
"next_expected_match": "\u4e0b\u4e00\u4e2a\u9884\u671f\u7684\u914d\u5bf9"
"currentBalance": "\u76ee\u524d\u4f59\u989d",
"balanceDiff": "\u4f59\u989d\u5dee",
"next_expected_match": "\u4e0b\u4e00\u6b21\u9884\u671f\u5339\u914d"
},
"config": {
"html_language": "zh-cn"
},
"form": {
"foreign_amount": "\u5916\u5e01\u91d1\u989d",
"interest_date": "\u5229\u7387\u65e5\u671f",
"interest_date": "\u5229\u606f\u65e5\u671f",
"book_date": "\u767b\u8bb0\u65e5\u671f",
"process_date": "\u5904\u7406\u65e5\u671f",
"due_date": "\u5230\u671f\u65e5",

View File

@@ -15,18 +15,18 @@
integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==
"@babel/core@^7.0.0-beta.49", "@babel/core@^7.2.0":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.16.tgz#8c6ba456b23b680a6493ddcfcd9d3c3ad51cab7c"
integrity sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2"
integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==
dependencies:
"@babel/code-frame" "^7.12.13"
"@babel/generator" "^7.12.15"
"@babel/helper-module-transforms" "^7.12.13"
"@babel/helpers" "^7.12.13"
"@babel/parser" "^7.12.16"
"@babel/generator" "^7.12.17"
"@babel/helper-module-transforms" "^7.12.17"
"@babel/helpers" "^7.12.17"
"@babel/parser" "^7.12.17"
"@babel/template" "^7.12.13"
"@babel/traverse" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/traverse" "^7.12.17"
"@babel/types" "^7.12.17"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
@@ -35,12 +35,12 @@
semver "^5.4.1"
source-map "^0.5.0"
"@babel/generator@^7.12.13", "@babel/generator@^7.12.15":
version "7.12.15"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f"
integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==
"@babel/generator@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.17.tgz#9ef1dd792d778b32284411df63f4f668a9957287"
integrity sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg==
dependencies:
"@babel/types" "^7.12.13"
"@babel/types" "^7.12.17"
jsesc "^2.5.1"
source-map "^0.5.0"
@@ -59,31 +59,31 @@
"@babel/helper-explode-assignable-expression" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/helper-compilation-targets@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz#6905238b4a5e02ba2d032c1a49dd1820fe8ce61b"
integrity sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg==
"@babel/helper-compilation-targets@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz#91d83fae61ef390d39c3f0507cb83979bab837c7"
integrity sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA==
dependencies:
"@babel/compat-data" "^7.12.13"
"@babel/helper-validator-option" "^7.12.16"
"@babel/helper-validator-option" "^7.12.17"
browserslist "^4.14.5"
semver "^5.5.0"
"@babel/helper-create-class-features-plugin@^7.12.13":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz#955d5099fd093e5afb05542190f8022105082c61"
integrity sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow==
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944"
integrity sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ==
dependencies:
"@babel/helper-function-name" "^7.12.13"
"@babel/helper-member-expression-to-functions" "^7.12.16"
"@babel/helper-member-expression-to-functions" "^7.12.17"
"@babel/helper-optimise-call-expression" "^7.12.13"
"@babel/helper-replace-supers" "^7.12.13"
"@babel/helper-split-export-declaration" "^7.12.13"
"@babel/helper-create-regexp-features-plugin@^7.12.13":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz#3b31d13f39f930fad975e151163b7df7d4ffe9d3"
integrity sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg==
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.12.13"
regexpu-core "^4.7.1"
@@ -118,12 +118,12 @@
dependencies:
"@babel/types" "^7.12.13"
"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz#41e0916b99f8d5f43da4f05d85f4930fa3d62b22"
integrity sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==
"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac"
integrity sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg==
dependencies:
"@babel/types" "^7.12.13"
"@babel/types" "^7.12.17"
"@babel/helper-module-imports@^7.12.13":
version "7.12.13"
@@ -132,10 +132,10 @@
dependencies:
"@babel/types" "^7.12.13"
"@babel/helper-module-transforms@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea"
integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==
"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz#7c75b987d6dfd5b48e575648f81eaac891539509"
integrity sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ==
dependencies:
"@babel/helper-module-imports" "^7.12.13"
"@babel/helper-replace-supers" "^7.12.13"
@@ -143,8 +143,8 @@
"@babel/helper-split-export-declaration" "^7.12.13"
"@babel/helper-validator-identifier" "^7.12.11"
"@babel/template" "^7.12.13"
"@babel/traverse" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/traverse" "^7.12.17"
"@babel/types" "^7.12.17"
lodash "^4.17.19"
"@babel/helper-optimise-call-expression@^7.12.13":
@@ -204,10 +204,10 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
"@babel/helper-validator-option@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz#f73cbd3bbba51915216c5dea908e9b206bb10051"
integrity sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ==
"@babel/helper-validator-option@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
"@babel/helper-wrap-function@^7.12.13":
version "7.12.13"
@@ -219,14 +219,14 @@
"@babel/traverse" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/helpers@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47"
integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==
"@babel/helpers@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc"
integrity sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg==
dependencies:
"@babel/template" "^7.12.13"
"@babel/traverse" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/traverse" "^7.12.17"
"@babel/types" "^7.12.17"
"@babel/highlight@^7.12.13":
version "7.12.13"
@@ -237,10 +237,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/parser@^7.12.13", "@babel/parser@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4"
integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==
"@babel/parser@^7.12.13", "@babel/parser@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848"
integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==
"@babel/plugin-proposal-async-generator-functions@^7.12.13":
version "7.12.13"
@@ -259,10 +259,10 @@
"@babel/helper-create-class-features-plugin" "^7.12.13"
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/plugin-proposal-dynamic-import@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz#b9f33b252e3406d492a15a799c9d45a9a9613473"
integrity sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w==
"@babel/plugin-proposal-dynamic-import@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512"
integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q==
dependencies:
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
@@ -324,10 +324,10 @@
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
"@babel/plugin-proposal-optional-chaining@^7.12.16":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz#600c7531f754186b0f2096e495a92da7d88aa139"
integrity sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg==
"@babel/plugin-proposal-optional-chaining@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c"
integrity sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA==
dependencies:
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
@@ -631,9 +631,9 @@
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/plugin-transform-runtime@^7.2.0":
version "7.12.15"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz#4337b2507288007c2b197059301aa0af8d90c085"
integrity sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow==
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.17.tgz#329cb61d293b7e60a7685b91dda7c300668cee18"
integrity sha512-s+kIJxnaTj+E9Q3XxQZ5jOo+xcogSe3V78/iFQ5RmoT0jROdpcdxhfGdq/VLqW1hFSzw6VjqN8aQqTaAMixWsw==
dependencies:
"@babel/helper-module-imports" "^7.12.13"
"@babel/helper-plugin-utils" "^7.12.13"
@@ -691,18 +691,18 @@
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/preset-env@^7.2.0":
version "7.12.16"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.16.tgz#16710e3490e37764b2f41886de0a33bc4ae91082"
integrity sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg==
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa"
integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==
dependencies:
"@babel/compat-data" "^7.12.13"
"@babel/helper-compilation-targets" "^7.12.16"
"@babel/helper-compilation-targets" "^7.12.17"
"@babel/helper-module-imports" "^7.12.13"
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/helper-validator-option" "^7.12.16"
"@babel/helper-validator-option" "^7.12.17"
"@babel/plugin-proposal-async-generator-functions" "^7.12.13"
"@babel/plugin-proposal-class-properties" "^7.12.13"
"@babel/plugin-proposal-dynamic-import" "^7.12.16"
"@babel/plugin-proposal-dynamic-import" "^7.12.17"
"@babel/plugin-proposal-export-namespace-from" "^7.12.13"
"@babel/plugin-proposal-json-strings" "^7.12.13"
"@babel/plugin-proposal-logical-assignment-operators" "^7.12.13"
@@ -710,7 +710,7 @@
"@babel/plugin-proposal-numeric-separator" "^7.12.13"
"@babel/plugin-proposal-object-rest-spread" "^7.12.13"
"@babel/plugin-proposal-optional-catch-binding" "^7.12.13"
"@babel/plugin-proposal-optional-chaining" "^7.12.16"
"@babel/plugin-proposal-optional-chaining" "^7.12.17"
"@babel/plugin-proposal-private-methods" "^7.12.13"
"@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
"@babel/plugin-syntax-async-generators" "^7.8.0"
@@ -758,7 +758,7 @@
"@babel/plugin-transform-unicode-escapes" "^7.12.13"
"@babel/plugin-transform-unicode-regex" "^7.12.13"
"@babel/preset-modules" "^0.1.3"
"@babel/types" "^7.12.13"
"@babel/types" "^7.12.17"
core-js-compat "^3.8.0"
semver "^5.5.0"
@@ -774,9 +774,9 @@
esutils "^2.0.2"
"@babel/runtime@^7.2.0", "@babel/runtime@^7.8.4":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d"
integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==
version "7.12.18"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b"
integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==
dependencies:
regenerator-runtime "^0.13.4"
@@ -789,25 +789,25 @@
"@babel/parser" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/traverse@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0"
integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==
"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.17.tgz#40ec8c7ffb502c4e54c7f95492dc11b88d718619"
integrity sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ==
dependencies:
"@babel/code-frame" "^7.12.13"
"@babel/generator" "^7.12.13"
"@babel/generator" "^7.12.17"
"@babel/helper-function-name" "^7.12.13"
"@babel/helper-split-export-declaration" "^7.12.13"
"@babel/parser" "^7.12.13"
"@babel/types" "^7.12.13"
"@babel/parser" "^7.12.17"
"@babel/types" "^7.12.17"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.19"
"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.4.4":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611"
integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==
"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.4.4":
version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963"
integrity sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ==
dependencies:
"@babel/helper-validator-identifier" "^7.12.11"
lodash "^4.17.19"
@@ -839,9 +839,9 @@
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@popperjs/core@^2.8.2":
version "2.8.2"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.8.2.tgz#1fd24b99e417176566f8ada718fd16dbc7ef2b7a"
integrity sha512-7PRna6st1As9DBTXO3Lf1lYw7bi+b/6kE2OPjvvdWHLfBxTI01FW1HSqt4akYzKe1Cta3bmhuwct4OAF2EVemA==
version "2.8.3"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.8.3.tgz#8b4eae3d9dd470c022cb9238128db8b1906e7fca"
integrity sha512-olsVs3lo8qKycPoWAUv4bMyoTGVXsEpLR9XxGk3LJR5Qa92a1Eg/Fj1ATdhwtC/6VMaKtsz1nSAeheD2B2Ru9A==
"@types/chart.js@^2.7.55":
version "2.9.30"
@@ -869,9 +869,9 @@
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/node@*":
version "14.14.28"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.28.tgz#cade4b64f8438f588951a6b35843ce536853f25b"
integrity sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==
version "14.14.31"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055"
integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==
"@types/q@^1.5.1":
version "1.5.4"
@@ -1557,7 +1557,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.1:
browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3:
version "4.16.3"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
@@ -1723,9 +1723,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181:
version "1.0.30001187"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438"
integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA==
version "1.0.30001191"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9"
integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw==
chalk@^1.1.3:
version "1.1.3"
@@ -2089,17 +2089,17 @@ copy-descriptor@^0.1.0:
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
core-js-compat@^3.8.0:
version "3.8.3"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f"
integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==
version "3.9.0"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56"
integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==
dependencies:
browserslist "^4.16.1"
browserslist "^4.16.3"
semver "7.0.0"
core-js@^3.6.5:
version "3.8.3"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0"
integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==
version "3.9.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8"
integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ==
core-util-is@~1.0.0:
version "1.0.2"
@@ -2375,9 +2375,9 @@ d@1, d@^1.0.1:
type "^1.0.1"
date-fns-tz@^1.0.12:
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==
version "1.1.2"
resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.1.2.tgz#893c73026e20a8ae1bfb0c565dd2972df723776e"
integrity sha512-QY3KoLy16bERNTEhJV2UJfvQRcPOwneAGwLcKUyHYT1PKydYyEZ7rKJjo6tDvx3bXlQhbnvq7CrvbFlonR00AQ==
date-fns@^2.8.1:
version "2.17.0"
@@ -2626,9 +2626,9 @@ ejs@^2.6.1:
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.649:
version "1.3.666"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.666.tgz#59f3ce1e45b860a0ebe439b72664354efbb8bc62"
integrity sha512-/mP4HFQ0fKIX4sXltG6kfcoGrfNDZwCIyWbH2SIcVaa9u7Rm0HKjambiHNg5OEruicTl9s1EwbERLwxZwk19aw==
version "1.3.671"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0"
integrity sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ==
elliptic@^6.5.3:
version "6.5.4"
@@ -2727,7 +2727,7 @@ es-abstract@^1.17.2:
string.prototype.trimend "^1.0.1"
string.prototype.trimstart "^1.0.1"
es-abstract@^1.18.0-next.1:
es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
version "1.18.0-next.2"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2"
integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==
@@ -4479,22 +4479,17 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
mime-db@1.45.0:
version "1.45.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
"mime-db@>= 1.43.0 < 2":
mime-db@1.46.0, "mime-db@>= 1.43.0 < 2":
version "1.46.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
mime-types@~2.1.17, mime-types@~2.1.24:
version "2.1.28"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==
version "2.1.29"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2"
integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==
dependencies:
mime-db "1.45.0"
mime-db "1.46.0"
mime@1.6.0:
version "1.6.0"
@@ -4502,9 +4497,9 @@ mime@1.6.0:
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1"
integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==
version "2.5.2"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
@@ -4810,11 +4805,11 @@ object-inspect@^1.8.0, object-inspect@^1.9.0:
integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
object-is@^1.0.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068"
integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==
version "1.1.5"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
dependencies:
call-bind "^1.0.0"
call-bind "^1.0.2"
define-properties "^1.1.3"
object-keys@^1.0.12, object-keys@^1.1.1:
@@ -4840,13 +4835,13 @@ object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2:
object-keys "^1.1.1"
object.getownpropertydescriptors@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544"
integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==
version "2.1.2"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
dependencies:
call-bind "^1.0.0"
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.18.0-next.1"
es-abstract "^1.18.0-next.2"
object.omit@^3.0.0:
version "3.0.0"
@@ -6812,9 +6807,9 @@ urix@^0.1.0:
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
url-parse@^1.4.3, url-parse@^1.4.7:
version "1.4.7"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==
version "1.5.1"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b"
integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"