diff --git a/src/MobileApp.vue b/src/MobileApp.vue index 723f7a7a..73ed5e26 100644 --- a/src/MobileApp.vue +++ b/src/MobileApp.vue @@ -15,6 +15,7 @@ import { useI18n } from '@/locales/helpers.ts'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; +import { useEnvironmentsStore } from '@/stores/environment.ts'; import { useUserStore } from '@/stores/user.ts'; import { useTokensStore } from '@/stores/token.ts'; import { useExchangeRatesStore } from '@/stores/exchangeRates.ts'; @@ -32,6 +33,7 @@ const { tt, getCurrentLanguageInfo, setLanguage, initLocale } = useI18n(); const rootStore = useRootStore(); const settingsStore = useSettingsStore(); +const environmentsStore = useEnvironmentsStore(); const userStore = useUserStore(); const tokensStore = useTokensStore(); const exchangeRatesStore = useExchangeRatesStore(); @@ -102,7 +104,6 @@ const f7params = ref({ const notification = ref(null); -const isDarkMode = ref(undefined); const hasPushPopupBackdrop = ref(undefined); const hasBackdrop = ref(undefined); const currentNotificationContent = computed(() => rootStore.currentNotification); @@ -145,14 +146,14 @@ function onBackdropChanged(element: { push?: boolean, opened?: boolean }): void hasBackdrop.value = element.opened; } - setThemeColorMeta(isDarkMode.value); + setThemeColorMeta(environmentsStore.framework7DarkMode); } onMounted(() => { setAppFontSize(settingsStore.appSettings.fontSize); f7ready((f7) => { - isDarkMode.value = f7.darkMode; + environmentsStore.framework7DarkMode = f7.darkMode; setThemeColorMeta(f7.darkMode); f7.on('actionsOpen', (actions: Actions.Actions) => onBackdropChanged(actions)); @@ -177,7 +178,7 @@ onMounted(() => { }); f7.on('darkModeChange', (darkMode) => { - isDarkMode.value = darkMode; + environmentsStore.framework7DarkMode = darkMode; setThemeColorMeta(darkMode); }); }); diff --git a/src/components/base/DateRangeSelectionBase.ts b/src/components/base/DateRangeSelectionBase.ts new file mode 100644 index 00000000..1bdbde59 --- /dev/null +++ b/src/components/base/DateRangeSelectionBase.ts @@ -0,0 +1,138 @@ +import { ref, computed } from 'vue'; + +import { type TimeRangeAndDateType, type PresetDateRange, type UnixTimeRange, DateRange } from '@/core/datetime.ts'; +import { arrangeArrayWithNewStartIndex } from '@/lib/common.ts'; +import { + getCurrentUnixTime, + getCurrentYear, + getUnixTime, + getLocalDatetimeFromUnixTime, + getTodayFirstUnixTime, + getDummyUnixTimeForLocalUsage, + getActualUnixTimeForStore, + getTimezoneOffsetMinutes, + getBrowserTimezoneOffsetMinutes, + getDateRangeByDateType +} from '@/lib/datetime.ts'; + +import { useI18n } from '@/locales/helpers.ts'; + +import { useUserStore } from '@/stores/user.ts'; + +export interface CommonDateRangeSelectionProps { + minTime?: number; + maxTime?: number; + title?: string; + hint?: string; + show: boolean; +} + +function getDateRangeFromProps(props: CommonDateRangeSelectionProps): { minDate: number; maxDate: number } { + let minDate = getTodayFirstUnixTime(); + let maxDate = getCurrentUnixTime(); + + if (props.minTime) { + minDate = props.minTime; + } + + if (props.maxTime) { + maxDate = props.maxTime; + } + + return { + minDate, + maxDate + }; +} + +export function useDateRangeSelectionBase(props: CommonDateRangeSelectionProps) { + const { tt, getAllMinWeekdayNames, formatUnixTimeToLongDateTime, isLongDateMonthAfterYear, isLongTime24HourFormat } = useI18n(); + const userStore = useUserStore(); + const { minDate, maxDate } = getDateRangeFromProps(props); + + const yearRange = ref([ + 2000, + getCurrentYear() + 1 + ]); + + const dateRange = ref([ + getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(minDate, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())), + getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(maxDate, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())) + ]); + + const firstDayOfWeek = computed(() => userStore.currentUserFirstDayOfWeek); + const dayNames = computed(() => arrangeArrayWithNewStartIndex(getAllMinWeekdayNames(), firstDayOfWeek.value)); + const isYearFirst = computed(() => isLongDateMonthAfterYear()); + const is24Hour = computed(() => isLongTime24HourFormat()); + const beginDateTime = computed(() => { + const actualBeginUnixTime = getActualUnixTimeForStore(getUnixTime(dateRange.value[0]), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()); + return formatUnixTimeToLongDateTime(actualBeginUnixTime); + }); + const endDateTime = computed(() => { + const actualEndUnixTime = getActualUnixTimeForStore(getUnixTime(dateRange.value[1]), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()); + return formatUnixTimeToLongDateTime(actualEndUnixTime); + }); + const presetRanges = computed(() => { + const presetRanges:PresetDateRange[] = []; + + [ + DateRange.Today, + DateRange.LastSevenDays, + DateRange.LastThirtyDays, + DateRange.ThisWeek, + DateRange.ThisMonth, + DateRange.ThisYear + ].forEach(dateRangeType => { + const dateRange = getDateRangeByDateType(dateRangeType.type, firstDayOfWeek.value) as TimeRangeAndDateType; + + presetRanges.push({ + label: tt(dateRangeType.name), + value: [ + getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dateRange.minTime, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())), + getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dateRange.maxTime, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())) + ] + }); + }); + + return presetRanges; + }); + + function getFinalDateRange(): UnixTimeRange | null { + if (!dateRange.value[0] || !dateRange.value[1]) { + return null; + } + + const currentMinDate = dateRange.value[0]; + const currentMaxDate = dateRange.value[1]; + + let minUnixTime = getUnixTime(currentMinDate); + let maxUnixTime = getUnixTime(currentMaxDate); + + if (minUnixTime < 0 || maxUnixTime < 0) { + throw new Error('Date is too early'); + } + + minUnixTime = getActualUnixTimeForStore(minUnixTime, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()); + maxUnixTime = getActualUnixTimeForStore(maxUnixTime, getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()); + + return { + minUnixTime, + maxUnixTime + }; + } + + return { + // states + yearRange, + dateRange, + // computed states + dayNames, + isYearFirst, + is24Hour, + beginDateTime, + endDateTime, + presetRanges, + // functions + getFinalDateRange + }; +} diff --git a/src/components/desktop/DateRangeSelectionDialog.vue b/src/components/desktop/DateRangeSelectionDialog.vue index a6c976ed..4e3dc209 100644 --- a/src/components/desktop/DateRangeSelectionDialog.vue +++ b/src/components/desktop/DateRangeSelectionDialog.vue @@ -19,7 +19,6 @@
- {{ $t('OK') }} - {{ $t('Cancel') }} + {{ tt('OK') }} + {{ tt('Cancel') }}
-