mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-02 10:22:09 +00:00
135 lines
4.2 KiB
Vue
135 lines
4.2 KiB
Vue
<!--
|
|
- NetWorthInsightBox.vue
|
|
- Copyright (c) 2022 james@firefly-iii.org
|
|
-
|
|
- This file is part of Firefly III (https://github.com/firefly-iii).
|
|
-
|
|
- This program is free software: you can redistribute it and/or modify
|
|
- it under the terms of the GNU Affero General Public License as
|
|
- published by the Free Software Foundation, either version 3 of the
|
|
- License, or (at your option) any later version.
|
|
-
|
|
- This program is distributed in the hope that it will be useful,
|
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- GNU Affero General Public License for more details.
|
|
-
|
|
- You should have received a copy of the GNU Affero General Public License
|
|
- along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
-->
|
|
|
|
<template>
|
|
<!-- TODO most left? q-mr-sm -->
|
|
<!-- TODO middle? dan q-mx-sm -->
|
|
<!-- TODO right? dan q-ml-sm -->
|
|
<div class="q-ml-sm">
|
|
<q-card bordered>
|
|
<q-item>
|
|
<q-item-section>
|
|
<q-item-label><strong>{{ $t('firefly.net_worth') }}</strong></q-item-label>
|
|
</q-item-section>
|
|
</q-item>
|
|
<q-separator/>
|
|
<q-card-section horizontal>
|
|
<q-card-section>
|
|
<q-icon name="fas fa-chart-line" size="50px" :color="primary > 0 ? 'positive' : 'negative'"/>
|
|
</q-card-section>
|
|
<q-separator vertical/>
|
|
<q-card-section>
|
|
<strong>{{ formatAmount(currency, primary) }}</strong><br/>
|
|
<small>
|
|
<span v-for="(item, index) in netWorth">
|
|
<span :title="formatAmount(item.native_code, item.native_sum)">{{ formatAmount(item.code, item.sum) }}</span>
|
|
<span v-if="index+1 !== netWorth.length"> + </span></span>
|
|
</small>
|
|
</q-card-section>
|
|
</q-card-section>
|
|
</q-card>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {useFireflyIIIStore} from "../../stores/fireflyiii";
|
|
import NetWorth from "../../api/v2/net-worth";
|
|
|
|
export default {
|
|
name: "NetWorthInsightBox",
|
|
data() {
|
|
return {
|
|
netWorth: [],
|
|
primary: 0,
|
|
currency: 'EUR',
|
|
store: null,
|
|
}
|
|
},
|
|
mounted() {
|
|
this.store = useFireflyIIIStore();
|
|
// TODO this code snippet is recycled a lot.
|
|
// subscribe, then update:
|
|
this.store.$onAction(
|
|
({name, $store, args, after, onError,}) => {
|
|
after((result) => {
|
|
if (name === 'setRange') {
|
|
this.triggerUpdate();
|
|
}
|
|
})
|
|
}
|
|
)
|
|
this.triggerUpdate();
|
|
},
|
|
methods: {
|
|
triggerUpdate: function () {
|
|
if (null !== this.store.getRange.start && null !== this.store.getRange.end) {
|
|
this.unpaid = [];
|
|
const start = new Date(this.store.getRange.start);
|
|
const end = new Date(this.store.getRange.end);
|
|
const now = new Date;
|
|
let date = end;
|
|
if (now >= start && now <= end) {
|
|
date = now;
|
|
}
|
|
this.currency = this.store.getCurrencyCode;
|
|
(new NetWorth).get(date).then((response) => this.parseResponse(response.data));
|
|
}
|
|
},
|
|
parseResponse(data) {
|
|
for (let i in data) {
|
|
if (data.hasOwnProperty(i)) {
|
|
const current = data[i];
|
|
|
|
if(parseFloat(current.sum) <= 0) {
|
|
continue;
|
|
}
|
|
|
|
const hasNative = current.converted && current.native_id !== current.id && parseFloat(current.native_sum) !== 0.0;
|
|
if (current.converted && (hasNative || current.native_id === current.id)) {
|
|
this.primary = this.primary + parseFloat(current.native_sum);
|
|
}
|
|
if (!current.converted) {
|
|
this.primary = this.primary + parseFloat(current.sum);
|
|
}
|
|
|
|
this.netWorth.push(
|
|
{
|
|
sum: current.sum,
|
|
code: current.code,
|
|
native_sum: current.converted ? current.native_sum : current.sum,
|
|
native_code: current.converted ? current.native_code : current.code,
|
|
native: hasNative,
|
|
}
|
|
);
|
|
}
|
|
}
|
|
},
|
|
// TODO this method is recycled a lot.
|
|
formatAmount: function (currencyCode, amount) {
|
|
return Intl.NumberFormat(this.store?.getLocale ?? 'en-US', {style: 'currency', currency: currencyCode}).format(amount);
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
|
|
</style>
|