From b517409229f409fb7c74244aa954eadd61316634 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 12 Jan 2025 00:48:03 +0800 Subject: [PATCH] migrate schedule frequency select / selection sheet to composition API and typescript --- .../base/ScheduleFrequencySelectionBase.ts | 64 ++++++ .../desktop/ScheduleFrequencySelect.vue | 201 ++++++++---------- .../mobile/ScheduleFrequencySheet.vue | 201 +++++++----------- src/core/account.ts | 8 +- src/locales/helpers.ts | 48 ++++- 5 files changed, 283 insertions(+), 239 deletions(-) create mode 100644 src/components/base/ScheduleFrequencySelectionBase.ts diff --git a/src/components/base/ScheduleFrequencySelectionBase.ts b/src/components/base/ScheduleFrequencySelectionBase.ts new file mode 100644 index 00000000..1227c22b --- /dev/null +++ b/src/components/base/ScheduleFrequencySelectionBase.ts @@ -0,0 +1,64 @@ +import { computed } from 'vue'; + +import { useI18n } from '@/locales/helpers.ts'; + +import { useUserStore } from '@/stores/user.ts'; + +import type { TypeAndDisplayName } from '@/core/base.ts'; +import { sortNumbersArray } from '@/lib/common.ts'; + +export interface CommonScheduleFrequencySelectionProps { + type: number; + modelValue: string; + disabled?: boolean; + readonly?: boolean; + label?: string; +} + +export interface AvailableMonthDay { + day: number; + displayName: string; +} + +export function useScheduleFrequencySelectionBase() { + const { getAllWeekDays, getAllTransactionScheduledFrequencyTypes, getMonthdayShortName } = useI18n(); + const userStore = useUserStore(); + + const allTransactionScheduledFrequencyTypes = computed(() => getAllTransactionScheduledFrequencyTypes()); + const allWeekDays = computed(() => getAllWeekDays(userStore.currentUserFirstDayOfWeek)); + + const allAvailableMonthDays = computed(() => { + const allAvailableDays = []; + + for (let i = 1; i <= 28; i++) { + allAvailableDays.push({ + day: i, + displayName: getMonthdayShortName(i), + }); + } + + return allAvailableDays; + }); + + function getFrequencyValues(value: string): number[] { + const values = value.split(','); + const ret: number[] = []; + + for (let i = 0; i < values.length; i++) { + if (values[i]) { + ret.push(parseInt(values[i])); + } + } + + return sortNumbersArray(ret); + } + + return { + // computed states + allTransactionScheduledFrequencyTypes, + allWeekDays, + allAvailableMonthDays, + // functions + getFrequencyValues + }; +} diff --git a/src/components/desktop/ScheduleFrequencySelect.vue b/src/components/desktop/ScheduleFrequencySelect.vue index 55c8f0e1..558dd616 100644 --- a/src/components/desktop/ScheduleFrequencySelect.vue +++ b/src/components/desktop/ScheduleFrequencySelect.vue @@ -25,11 +25,11 @@
- - + + + v-else-if="frequencyType === ScheduledTemplateFrequencyType.Weekly.type"> @@ -39,7 +39,7 @@ + v-else-if="frequencyType === ScheduledTemplateFrequencyType.Monthly.type"> @@ -54,137 +54,102 @@ - diff --git a/src/components/mobile/ScheduleFrequencySheet.vue b/src/components/mobile/ScheduleFrequencySheet.vue index 2f3b8fd1..98cf6ec5 100644 --- a/src/components/mobile/ScheduleFrequencySheet.vue +++ b/src/components/mobile/ScheduleFrequencySheet.vue @@ -4,10 +4,10 @@
- +
- +
@@ -30,11 +30,11 @@
- + v-if="currentFrequencyType === ScheduledTemplateFrequencyType.Disabled.type"> + + v-if="currentFrequencyType === ScheduledTemplateFrequencyType.Weekly.type"> + v-if="currentFrequencyType === ScheduledTemplateFrequencyType.Monthly.type"> -