Files
ezbookkeeping/src/views/mobile/settings/PageSettingsPage.vue
T
2026-01-21 23:59:12 +08:00

283 lines
12 KiB
Vue

<template>
<f7-page>
<f7-navbar :title="tt('Page Settings')" :back-link="tt('Back')"></f7-navbar>
<f7-block-title class="margin-top">{{ tt('Overview Page') }}</f7-block-title>
<f7-list strong inset dividers class="settings-list">
<f7-list-item>
<template #after-title>
{{ tt('Show Amount') }}
</template>
<template #after>
<f7-toggle :checked="showAmountInHomePage" @toggle:change="showAmountInHomePage = $event"></f7-toggle>
</template>
</f7-list-item>
<f7-list-item
class="item-truncate-after-text"
link="#"
@click="showTimezoneUsedForStatisticsInHomePagePopup = true"
>
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Timezone Used for Statistics') }}</span>
</div>
</template>
<template #after>
{{ findDisplayNameByType(allTimezoneTypesUsedForStatistics, timezoneUsedForStatisticsInHomePage) }}
</template>
<list-item-selection-popup value-type="item"
key-field="type" value-field="type"
title-field="displayName"
:title="tt('Timezone Used for Statistics')"
:enable-filter="true"
:filter-placeholder="tt('Timezone Type')"
:filter-no-items-text="tt('No results')"
:items="allTimezoneTypesUsedForStatistics"
v-model:show="showTimezoneUsedForStatisticsInHomePagePopup"
v-model="timezoneUsedForStatisticsInHomePage">
</list-item-selection-popup>
</f7-list-item>
<f7-list-item
class="item-truncate-after-text"
link="/settings/filter/account?type=homePageOverview"
:disabled="!hasAnyAccount">
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Accounts Included in Overview Statistics') }}</span>
</div>
</template>
<template #after>
<f7-preloader v-if="loadingAccounts" />
<div v-else-if="!loadingAccounts">{{ accountsIncludedInHomePageOverviewDisplayContent }}</div>
</template>
</f7-list-item>
<f7-list-item
class="item-truncate-after-text"
:disabled="!hasAnyTransactionCategory"
:link="`/settings/filter/category?type=homePageOverview&allowCategoryTypes=${CategoryType.Income},${CategoryType.Expense}`">
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Transaction Categories Included in Overview Statistics') }}</span>
</div>
</template>
<template #after>
<f7-preloader v-if="loadingTransactionCategories" />
<div v-else-if="!loadingTransactionCategories">{{ transactionCategoriesIncludedInHomePageOverviewDisplayContent }}</div>
</template>
</f7-list-item>
</f7-list>
<f7-block-title>{{ tt('Transaction List Page') }}</f7-block-title>
<f7-list strong inset dividers>
<f7-list-item>
<template #after-title>
{{ tt('Show Monthly Total Amount') }}
</template>
<template #after>
<f7-toggle :checked="showTotalAmountInTransactionListPage" @toggle:change="showTotalAmountInTransactionListPage = $event"></f7-toggle>
</template>
</f7-list-item>
<f7-list-item>
<template #after-title>
{{ tt('Show Transaction Tags') }}
</template>
<template #after>
<f7-toggle :checked="showTagInTransactionListPage" @toggle:change="showTagInTransactionListPage = $event"></f7-toggle>
</template>
</f7-list-item>
</f7-list>
<f7-block-title>{{ tt('Transaction Edit Page') }}</f7-block-title>
<f7-list strong inset dividers>
<f7-list-item
class="item-truncate-after-text"
link="#"
@click="showAutoSaveTransactionDraftPopup = true"
>
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Automatically Save Draft') }}</span>
</div>
</template>
<template #after>
{{ findNameByValue(allAutoSaveTransactionDraftTypes, autoSaveTransactionDraft) }}
</template>
<list-item-selection-popup value-type="item"
key-field="value" value-field="value"
title-field="name"
:title="tt('Automatically Save Draft')"
:enable-filter="true"
:filter-placeholder="tt('Automatically Save Draft')"
:filter-no-items-text="tt('No results')"
:items="allAutoSaveTransactionDraftTypes"
v-model:show="showAutoSaveTransactionDraftPopup"
v-model="autoSaveTransactionDraft">
</list-item-selection-popup>
</f7-list-item>
<f7-list-item>
<template #after-title>
{{ tt('Automatically Add Geolocation') }}
</template>
<template #after>
<f7-toggle :checked="isAutoGetCurrentGeoLocation" @toggle:change="isAutoGetCurrentGeoLocation = $event"></f7-toggle>
</template>
</f7-list-item>
<f7-list-item>
<template #after-title>
{{ tt('Always Show Transaction Pictures') }}
</template>
<template #after>
<f7-toggle :checked="alwaysShowTransactionPicturesInMobileTransactionEditPage" @toggle:change="alwaysShowTransactionPicturesInMobileTransactionEditPage = $event"></f7-toggle>
</template>
</f7-list-item>
</f7-list>
<f7-block-title>{{ tt('Account List Page') }}</f7-block-title>
<f7-list strong inset dividers>
<f7-list-item
class="item-truncate-after-text"
link="/settings/filter/account?type=accountListTotalAmount"
:disabled="!hasAnyVisibleAccount">
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Accounts Included in Total') }}</span>
</div>
</template>
<template #after>
<f7-preloader v-if="loadingAccounts" />
<div v-else-if="!loadingAccounts">{{ accountsIncludedInTotalDisplayContent }}</div>
</template>
</f7-list-item>
<f7-list-item
class="item-truncate-after-text"
link="/settings/account_category_display_order">
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Account Category Order') }}</span>
</div>
</template>
<template #after>
<div>{{ accountCategorysDisplayOrderContent }}</div>
</template>
</f7-list-item>
</f7-list>
<f7-block-title>{{ tt('Exchange Rates Data Page') }}</f7-block-title>
<f7-list strong inset dividers>
<f7-list-item
class="item-truncate-after-text"
link="#"
@click="showCurrencySortByInExchangeRatesPagePopup = true"
>
<template #after-title>
<div class="item-actual-title">
<span>{{ tt('Sort by') }}</span>
</div>
</template>
<template #after>
{{ findDisplayNameByType(allCurrencySortingTypes, currencySortByInExchangeRatesPage) }}
</template>
<list-item-selection-popup value-type="item"
key-field="type" value-field="type"
title-field="displayName"
:title="tt('Sort by')"
:enable-filter="true"
:filter-placeholder="tt('Sort by')"
:filter-no-items-text="tt('No results')"
:items="allCurrencySortingTypes"
v-model:show="showCurrencySortByInExchangeRatesPagePopup"
v-model="currencySortByInExchangeRatesPage">
</list-item-selection-popup>
</f7-list-item>
</f7-list>
</f7-page>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { useI18nUIComponents } from '@/lib/ui/mobile.ts';
import { useAppSettingPageBase } from '@/views/base/settings/AppSettingsPageBase.ts';
import { useSettingsStore } from '@/stores/setting.ts';
import { useAccountsStore } from '@/stores/account.ts';
import { useTransactionCategoriesStore } from '@/stores/transactionCategory.ts';
import { CategoryType } from '@/core/category.ts';
import { findNameByValue, findDisplayNameByType } from '@/lib/common.ts';
const { tt } = useI18n();
const { showToast } = useI18nUIComponents();
const {
loadingAccounts,
loadingTransactionCategories,
hasAnyAccount,
hasAnyVisibleAccount,
hasAnyTransactionCategory,
allTimezoneTypesUsedForStatistics,
allCurrencySortingTypes,
allAutoSaveTransactionDraftTypes,
showAmountInHomePage,
timezoneUsedForStatisticsInHomePage,
showTotalAmountInTransactionListPage,
showTagInTransactionListPage,
autoSaveTransactionDraft,
isAutoGetCurrentGeoLocation,
currencySortByInExchangeRatesPage,
accountsIncludedInHomePageOverviewDisplayContent,
accountsIncludedInTotalDisplayContent,
accountCategorysDisplayOrderContent,
transactionCategoriesIncludedInHomePageOverviewDisplayContent
} = useAppSettingPageBase();
const settingsStore = useSettingsStore();
const accountsStore = useAccountsStore();
const transactionCategoriesStore = useTransactionCategoriesStore();
const showTimezoneUsedForStatisticsInHomePagePopup = ref<boolean>(false);
const showAutoSaveTransactionDraftPopup = ref<boolean>(false);
const showCurrencySortByInExchangeRatesPagePopup = ref<boolean>(false);
const alwaysShowTransactionPicturesInMobileTransactionEditPage = computed<boolean>({
get: () => settingsStore.appSettings.alwaysShowTransactionPicturesInMobileTransactionEditPage,
set: (value) => settingsStore.setAlwaysShowTransactionPicturesInMobileTransactionEditPage(value)
});
function init(): void {
loadingAccounts.value = true;
accountsStore.loadAllAccounts({
force: false
}).then(() => {
loadingAccounts.value = false;
}).catch(error => {
loadingAccounts.value = false;
if (!error.processed) {
showToast(error.message || error);
}
});
transactionCategoriesStore.loadAllCategories({
force: false
}).then(() => {
loadingTransactionCategories.value = false;
}).catch(error => {
loadingTransactionCategories.value = false;
if (!error.processed) {
showToast(error.message || error);
}
});
}
init();
</script>