From 9d2990a23b60d139f8774b41d7f89f146c7cf114 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 8 Sep 2022 00:25:10 +0200 Subject: [PATCH 01/17] feat: allow saving a default reminder amount --- src/helpers/defaultReminder.ts | 42 ++++++++++++++++++++++ src/i18n/lang/en.json | 6 +++- src/modelTypes/IUserSettings.ts | 2 ++ src/models/userSettings.ts | 2 ++ src/styles/theme/form.scss | 4 +++ src/views/user/settings/General.vue | 54 +++++++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/helpers/defaultReminder.ts diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts new file mode 100644 index 000000000..53b389b10 --- /dev/null +++ b/src/helpers/defaultReminder.ts @@ -0,0 +1,42 @@ +const DEFAULT_REMINDER_KEY = 'defaultReminder' + +interface DefaultReminderSettings { + enabled: boolean, + amount: number, +} + +function calculateDefaultReminderSeconds(type: string, amount: number): number { + switch (type) { + case 'minutes': + return amount * 60 + case 'hours': + return amount * 60 * 60 + case 'days': + return amount * 60 * 60 * 24 + case 'months': + return amount * 60 * 60 * 24 * 30 + } + + return 0 +} + +export function saveDefaultReminder(enabled: boolean, type: string, amount: number) { + const defaultReminderSeconds = calculateDefaultReminderSeconds(type, amount) + localStorage.setItem(DEFAULT_REMINDER_KEY, JSON.stringify({ + enabled, + amount: defaultReminderSeconds, + })) +} + +export function getDefaultReminderAmount(): number | null { + const s: string | null = localStorage.getItem(DEFAULT_REMINDER_KEY) + if (s === null) { + return null + } + + const settings: DefaultReminderSettings = JSON.parse(s) + + return settings.enabled + ? settings.amount + : null +} diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 4674f6e80..4b1fc8f25 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -87,7 +87,11 @@ "language": "Language", "defaultList": "Default List", "timezone": "Time Zone", - "overdueTasksRemindersTime": "Overdue tasks reminder email time" + "overdueTasksRemindersTime": "Overdue tasks reminder email time", + "defaultReminder": "Set a default task reminder", + "defaultReminderHint": "If enabled, Vikunja will automatically create a reminder for a task if you set a due date and the task does not have any reminders yet.", + "defaultReminderAmount": "Default task reminder amount", + "defaultReminderAmountHint": "The time difference the reminder will be set to before the due date." }, "totp": { "title": "Two Factor Authentication", diff --git a/src/modelTypes/IUserSettings.ts b/src/modelTypes/IUserSettings.ts index 31e921e0e..9ba54a55e 100644 --- a/src/modelTypes/IUserSettings.ts +++ b/src/modelTypes/IUserSettings.ts @@ -12,4 +12,6 @@ export interface IUserSettings extends IAbstract { weekStart: 0 | 1 | 2 | 3 | 4 | 5 | 6 timezone: string language: string + defaultReminder: boolean + defaultReminderAmount: number // The amount of seconds a reminder should be set before a given due date } \ No newline at end of file diff --git a/src/models/userSettings.ts b/src/models/userSettings.ts index ddb6f0296..fbe02b73d 100644 --- a/src/models/userSettings.ts +++ b/src/models/userSettings.ts @@ -13,6 +13,8 @@ export default class UserSettingsModel extends AbstractModel impl weekStart = 0 as IUserSettings['weekStart'] timezone = '' language = getCurrentLanguage() + defaultReminder = false + defaultReminderAmount = 0 constructor(data: Partial = {}) { super() diff --git a/src/styles/theme/form.scss b/src/styles/theme/form.scss index 86c78f2fd..7ac5aa236 100644 --- a/src/styles/theme/form.scss +++ b/src/styles/theme/form.scss @@ -56,6 +56,10 @@ } } +.field.has-addons .select select { + height: 100%; +} + .field.has-addons .control .select select { height: 100%; } diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index 2664fe019..3ab31ccf0 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -18,6 +18,55 @@ +
+ +

+ {{ $t('user.settings.general.defaultReminderHint') }} +

+
+
+ +

+ {{ $t('user.settings.general.defaultReminderAmountHint') }} +

+
+ +
+ +
+
+ +
+
+
diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index cf5b4550d..0dd088dbc 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -551,19 +551,16 @@ "fromto": "{from} to {to}", "ranges": { "today": "Today", - "thisWeek": "This Week", "restOfThisWeek": "The Rest of This Week", "nextWeek": "Next Week", "next7Days": "Next 7 Days", "lastWeek": "Last Week", - "thisMonth": "This Month", "restOfThisMonth": "The Rest of This Month", "nextMonth": "Next Month", "next30Days": "Next 30 Days", "lastMonth": "Last Month", - "thisYear": "This Year", "restOfThisYear": "The Rest of This Year" } @@ -580,15 +577,6 @@ "roundDay": "Round down to the nearest day", "supportedUnits": "Supported time units are:", "someExamples": "Some examples of time expressions:", - "units": { - "seconds": "Seconds", - "minutes": "Minutes", - "hours": "Hours", - "days": "Days", - "weeks": "Weeks", - "months": "Months", - "years": "Years" - }, "examples": { "now": "Right now", "in24h": "In 24h", @@ -600,6 +588,22 @@ } } }, + "time": { + "seconds": "Seconds", + "second": "Second", + "minutes": "Minutes", + "minute": "Minute", + "hours": "Hours", + "hour": "Hour", + "days": "Days", + "day": "Day", + "weeks": "Weeks", + "week": "Week", + "months": "Months", + "month": "Month", + "years": "Years", + "year": "Year" + }, "task": { "task": "Task", "new": "Create a new task", diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index 34f0adb9b..ef86589bd 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -43,21 +43,17 @@
-- 2.40.1 From 80cc58a45dc6bd125288294cba3bfc42e1cde45d Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 8 Sep 2022 16:38:12 +0200 Subject: [PATCH 04/17] feat: automatically add a reminder to a task with due date but no reminders --- src/services/task.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/services/task.ts b/src/services/task.ts index bb41b6853..f0f098edc 100644 --- a/src/services/task.ts +++ b/src/services/task.ts @@ -6,6 +6,7 @@ import LabelService from './label' import {formatISO} from 'date-fns' import {colorFromHex} from '@/helpers/color/colorFromHex' +import {getDefaultReminderAmount} from '@/helpers/defaultReminder' const parseDate = date => { if (date) { @@ -39,7 +40,7 @@ export default class TaskService extends AbstractService { } processModel(updatedModel) { - const model = { ...updatedModel } + const model = {...updatedModel} model.title = model.title?.trim() @@ -68,6 +69,15 @@ export default class TaskService extends AbstractService { }) } + if (model.dueDate !== null && model.reminderDates.length === 0) { + const defaultReminder = getDefaultReminderAmount() + if (defaultReminder !== null) { + const dueDate = +new Date(model.dueDate) + const reminderDate = new Date(dueDate - (defaultReminder * 1000)) + model.reminderDates.push(formatISO(reminderDate)) + } + } + // Make the repeating amount to seconds let repeatAfterSeconds = 0 if (model.repeatAfter !== null && (model.repeatAfter.amount !== null || model.repeatAfter.amount !== 0)) { -- 2.40.1 From 8baafab4561c2a2b7688ae52c2903a627081d47f Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 8 Sep 2022 16:40:46 +0200 Subject: [PATCH 05/17] fix: show reminder field when changing a due date and a reminder was set --- src/views/tasks/TaskDetailView.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index ea67956e1..bbe26dc58 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -697,6 +697,9 @@ export default defineComponent({ } this.task = await this.$store.dispatch('tasks/update', task) + + // Activate new fields which may have been set from the api + this.$nextTick(() => this.setActiveFields()) if (!showNotification) { return -- 2.40.1 From 28312081ae3bf4a78ba6f18cae95ec444eb67df3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 8 Sep 2022 16:47:12 +0200 Subject: [PATCH 06/17] feat: re-populate default reminder enabled state when loading settings --- src/helpers/defaultReminder.ts | 18 +++++++++++------- src/views/user/settings/General.vue | 12 ++++++++---- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index 53b389b10..b24399b00 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -16,7 +16,7 @@ function calculateDefaultReminderSeconds(type: string, amount: number): number { case 'months': return amount * 60 * 60 * 24 * 30 } - + return 0 } @@ -29,14 +29,18 @@ export function saveDefaultReminder(enabled: boolean, type: string, amount: numb } export function getDefaultReminderAmount(): number | null { + const settings = getDefaultReminderSettings() + + return settings?.enabled + ? settings.amount + : null +} + +export function getDefaultReminderSettings(): DefaultReminderSettings | null { const s: string | null = localStorage.getItem(DEFAULT_REMINDER_KEY) if (s === null) { return null } - - const settings: DefaultReminderSettings = JSON.parse(s) - - return settings.enabled - ? settings.amount - : null + + return JSON.parse(s) } diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index ef86589bd..4a16c06f9 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -20,14 +20,14 @@

{{ $t('user.settings.general.defaultReminderHint') }}

-
+
@@ -219,7 +219,7 @@ import {AuthenticatedHTTPFactory} from '@/http-common' import {useColorScheme} from '@/composables/useColorScheme' import {useTitle} from '@/composables/useTitle' import {objectIsEmpty} from '@/helpers/objectIsEmpty' -import {saveDefaultReminder} from '@/helpers/defaultReminder' +import {getDefaultReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' const {t} = useI18n({useScope: 'global'}) useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`) @@ -311,13 +311,17 @@ watch( async function updateSettings() { localStorage.setItem(playSoundWhenDoneKey, playSoundWhenDone.value ? 'true' : 'false') setQuickAddMagicMode(quickAddMagicMode.value) - saveDefaultReminder(settings.value.defaultReminder, defaultReminderAmountType.value, defaultReminderAmount.value) + saveDefaultReminder(defaultReminderEnabled.value, defaultReminderAmountType.value, defaultReminderAmount.value) await authStore.saveUserSettings({ settings: {...settings.value}, }) } +const reminderSettings = getDefaultReminderSettings() + +const defaultReminderEnabled = ref(reminderSettings?.enabled || false) +// TODO: re-populate amount and type const defaultReminderAmount = ref(1) const defaultReminderAmountType = ref('days') -- 2.40.1 From 5aafbd9a72cd73079dffdad0e41ccb78f42b1923 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 13 Sep 2022 23:23:34 +0200 Subject: [PATCH 07/17] feat: re-populate default reminder from saved settings --- src/helpers/defaultReminder.test.ts | 62 +++++++++++++++++++++++++++++ src/helpers/defaultReminder.ts | 45 ++++++++++++++++++++- src/views/user/settings/General.vue | 8 ++-- vite.config.ts | 1 + 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 src/helpers/defaultReminder.test.ts diff --git a/src/helpers/defaultReminder.test.ts b/src/helpers/defaultReminder.test.ts new file mode 100644 index 000000000..6fbc117b3 --- /dev/null +++ b/src/helpers/defaultReminder.test.ts @@ -0,0 +1,62 @@ +import {describe, it, expect, vi, afterEach, beforeEach} from 'vitest' +import { + getDefaultReminderSettings, + getSavedReminderSettings, + parseSavedReminderAmount, + saveDefaultReminder, +} from '@/helpers/defaultReminder' +import * as exports from '@/helpers/defaultReminder' + +describe('Default Reminder Save', () => { + it('Should save a default reminder with minutes', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'minutes', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":300}') + }) + it('Should save a default reminder with hours', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'hours', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":18000}') + }) + it('Should save a default reminder with days', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'days', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":432000}') + }) + it('Should save a default reminder with months', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'months', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":12960000}') + }) +}) + +describe('Default Reminder Load', () => { + it('Should parse minutes', () => { + const settings = parseSavedReminderAmount(5 * 60) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('minutes') + }) + it('Should parse hours', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('hours') + }) + it('Should parse days', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60 * 24) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('days') + }) + it('Should parse months', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60 * 24 * 30) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('months') + }) +}) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index b24399b00..fb567d7bb 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -5,6 +5,12 @@ interface DefaultReminderSettings { amount: number, } +interface SavedReminderSettings { + enabled: boolean, + amount?: number, + type?: 'minutes' | 'hours' | 'days' | 'months', +} + function calculateDefaultReminderSeconds(type: string, amount: number): number { switch (type) { case 'minutes': @@ -37,10 +43,47 @@ export function getDefaultReminderAmount(): number | null { } export function getDefaultReminderSettings(): DefaultReminderSettings | null { - const s: string | null = localStorage.getItem(DEFAULT_REMINDER_KEY) + const s: string | null = window.localStorage.getItem(DEFAULT_REMINDER_KEY) if (s === null) { return null } return JSON.parse(s) } + +export function parseSavedReminderAmount(amountSeconds: number): SavedReminderSettings { + const amountMinutes = amountSeconds / 60 + const settings: SavedReminderSettings = { + enabled: true, // We're assuming the caller to have checked this properly + amount: amountMinutes, + type: 'minutes', + } + + if ((amountMinutes / 60 / 24) % 30 === 0) { + settings.amount = amountMinutes / 60 / 24 / 30 + settings.type = 'months' + } else if ((amountMinutes / 60) % 24 === 0) { + settings.amount = amountMinutes / 60 / 24 + settings.type = 'days' + } else if (amountMinutes % 60 === 0) { + settings.amount = amountMinutes / 60 + settings.type = 'hours' + } + + return settings +} + +export function getSavedReminderSettings(): SavedReminderSettings | null { + const s = getDefaultReminderSettings() + if (s === null) { + return null + } + + if (!s.enabled) { + return { + enabled: false, + } + } + + return parseSavedReminderAmount(s.amount) +} diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index 4a16c06f9..28b84b8cd 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -219,7 +219,7 @@ import {AuthenticatedHTTPFactory} from '@/http-common' import {useColorScheme} from '@/composables/useColorScheme' import {useTitle} from '@/composables/useTitle' import {objectIsEmpty} from '@/helpers/objectIsEmpty' -import {getDefaultReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' +import {getDefaultReminderSettings, getSavedReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' const {t} = useI18n({useScope: 'global'}) useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`) @@ -318,10 +318,10 @@ async function updateSettings() { }) } -const reminderSettings = getDefaultReminderSettings() +const reminderSettings = getSavedReminderSettings() const defaultReminderEnabled = ref(reminderSettings?.enabled || false) // TODO: re-populate amount and type -const defaultReminderAmount = ref(1) -const defaultReminderAmountType = ref('days') +const defaultReminderAmount = ref(reminderSettings?.amount || 1) +const defaultReminderAmountType = ref(reminderSettings?.type || 'days') diff --git a/vite.config.ts b/vite.config.ts index 2ddc30dda..39daacd26 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -32,6 +32,7 @@ export default defineConfig({ // https://vitest.dev/config/ test: { environment: 'happy-dom', + mockReset: true, }, css: { preprocessorOptions: { -- 2.40.1 From e65c2867304a001750660d7062dbcb2ce3660bb6 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 15 Sep 2022 13:35:19 +0200 Subject: [PATCH 08/17] fix: lint --- src/views/user/settings/General.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index 28b84b8cd..c6305a81a 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -219,7 +219,7 @@ import {AuthenticatedHTTPFactory} from '@/http-common' import {useColorScheme} from '@/composables/useColorScheme' import {useTitle} from '@/composables/useTitle' import {objectIsEmpty} from '@/helpers/objectIsEmpty' -import {getDefaultReminderSettings, getSavedReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' +import {getSavedReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' const {t} = useI18n({useScope: 'global'}) useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`) -- 2.40.1 From 7725de7483ada3f7f90713e5d60250c3eba7b870 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 29 Sep 2022 18:20:43 +0200 Subject: [PATCH 09/17] feat: move amount second calculation to mapping const --- src/helpers/defaultReminder.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index fb567d7bb..66e604ae6 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -1,5 +1,12 @@ const DEFAULT_REMINDER_KEY = 'defaultReminder' +const AMOUNTS_IN_SECONDS: { [key: string]: number } = { + minutes: 60, + hours: 60 * 60, + days: 60 * 60 * 24, + months: 60 * 60 * 24 * 30, +} + interface DefaultReminderSettings { enabled: boolean, amount: number, @@ -12,18 +19,7 @@ interface SavedReminderSettings { } function calculateDefaultReminderSeconds(type: string, amount: number): number { - switch (type) { - case 'minutes': - return amount * 60 - case 'hours': - return amount * 60 * 60 - case 'days': - return amount * 60 * 60 * 24 - case 'months': - return amount * 60 * 60 * 24 * 30 - } - - return 0 + return amount * (AMOUNTS_IN_SECONDS[type] || 0) } export function saveDefaultReminder(enabled: boolean, type: string, amount: number) { @@ -84,6 +80,6 @@ export function getSavedReminderSettings(): SavedReminderSettings | null { enabled: false, } } - + return parseSavedReminderAmount(s.amount) } -- 2.40.1 From 429b8a1ec48bff67d7dec0988e7b8ab5e325f3b0 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 29 Sep 2022 18:23:07 +0200 Subject: [PATCH 10/17] chore: use amount const in tests --- src/helpers/defaultReminder.test.ts | 9 +++++---- src/helpers/defaultReminder.ts | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/helpers/defaultReminder.test.ts b/src/helpers/defaultReminder.test.ts index 6fbc117b3..d6f4793ec 100644 --- a/src/helpers/defaultReminder.test.ts +++ b/src/helpers/defaultReminder.test.ts @@ -1,5 +1,6 @@ import {describe, it, expect, vi, afterEach, beforeEach} from 'vitest' import { + AMOUNTS_IN_SECONDS, getDefaultReminderSettings, getSavedReminderSettings, parseSavedReminderAmount, @@ -36,25 +37,25 @@ describe('Default Reminder Save', () => { describe('Default Reminder Load', () => { it('Should parse minutes', () => { - const settings = parseSavedReminderAmount(5 * 60) + const settings = parseSavedReminderAmount(5 * AMOUNTS_IN_SECONDS.minutes) expect(settings.amount).toBe(5) expect(settings.type).toBe('minutes') }) it('Should parse hours', () => { - const settings = parseSavedReminderAmount(5 * 60 * 60) + const settings = parseSavedReminderAmount(5 * AMOUNTS_IN_SECONDS.hours) expect(settings.amount).toBe(5) expect(settings.type).toBe('hours') }) it('Should parse days', () => { - const settings = parseSavedReminderAmount(5 * 60 * 60 * 24) + const settings = parseSavedReminderAmount(5 * AMOUNTS_IN_SECONDS.days) expect(settings.amount).toBe(5) expect(settings.type).toBe('days') }) it('Should parse months', () => { - const settings = parseSavedReminderAmount(5 * 60 * 60 * 24 * 30) + const settings = parseSavedReminderAmount(5 * AMOUNTS_IN_SECONDS.months) expect(settings.amount).toBe(5) expect(settings.type).toBe('months') diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index 66e604ae6..98a2de845 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -1,6 +1,11 @@ const DEFAULT_REMINDER_KEY = 'defaultReminder' -const AMOUNTS_IN_SECONDS: { [key: string]: number } = { +export const AMOUNTS_IN_SECONDS: { + minutes: number, + hours: number, + days: number, + months: number, +} = { minutes: 60, hours: 60 * 60, days: 60 * 60 * 24, -- 2.40.1 From 2aee048f6109ee85587017243fcc2ee33a931851 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 29 Sep 2022 18:30:40 +0200 Subject: [PATCH 11/17] fix: use vue-i18n pluralization --- src/components/date/datemathHelp.vue | 16 +++++++------- src/components/tasks/partials/repeatAfter.vue | 10 ++++----- src/i18n/lang/en.json | 21 +++++++------------ src/views/user/settings/General.vue | 8 +++---- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/components/date/datemathHelp.vue b/src/components/date/datemathHelp.vue index eeda712f9..89e20a065 100644 --- a/src/components/date/datemathHelp.vue +++ b/src/components/date/datemathHelp.vue @@ -36,35 +36,35 @@ s - {{ $t('time.seconds') }} + {{ $tc('time.seconds', 2) }} m - {{ $t('time.minutes') }} + {{ $tc('time.minutes', 2) }} h - {{ $t('time.hours') }} + {{ $tc('time.hours', 2) }} H - {{ $t('time.hours') }} + {{ $tc('time.hours', 2) }} d - {{ $t('time.days') }} + {{ $tc('time.days', 2) }} w - {{ $t('time.weeks') }} + {{ $tc('time.weeks', 2) }} M - {{ $t('time.months') }} + {{ $tc('time.months', 2) }} y - {{ $t('time.years') }} + {{ $tc('time.years', 2) }} diff --git a/src/components/tasks/partials/repeatAfter.vue b/src/components/tasks/partials/repeatAfter.vue index e0e7b2009..147441555 100644 --- a/src/components/tasks/partials/repeatAfter.vue +++ b/src/components/tasks/partials/repeatAfter.vue @@ -48,11 +48,11 @@ @change="updateData" :disabled="disabled || undefined" > - - - - - + + + + +
diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 0dd088dbc..43206c594 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -589,20 +589,13 @@ } }, "time": { - "seconds": "Seconds", - "second": "Second", - "minutes": "Minutes", - "minute": "Minute", - "hours": "Hours", - "hour": "Hour", - "days": "Days", - "day": "Day", - "weeks": "Weeks", - "week": "Week", - "months": "Months", - "month": "Month", - "years": "Years", - "year": "Year" + "seconds": "Second | Seconds", + "minutes": "Minute | Minutes", + "hours": "Hour | Hours", + "days": "Day | Days", + "weeks": "Week | Weeks", + "months": "Month | Months", + "years": "Year | Years" }, "task": { "task": "Task", diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index c6305a81a..bc3cffb8c 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -44,16 +44,16 @@
-- 2.40.1 From 5c6864389236cfa73110eae842d8d6a93380cc61 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 29 Sep 2022 18:31:56 +0200 Subject: [PATCH 12/17] fix: directly populate user settings with default reminder amount --- src/models/userSettings.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/models/userSettings.ts b/src/models/userSettings.ts index fbe02b73d..50dbb3be7 100644 --- a/src/models/userSettings.ts +++ b/src/models/userSettings.ts @@ -2,6 +2,7 @@ import AbstractModel from './abstractModel' import type {IUserSettings} from '@/modelTypes/IUserSettings' import {getCurrentLanguage} from '@/i18n' +import {getDefaultReminderAmount} from '@/helpers/defaultReminder' export default class UserSettingsModel extends AbstractModel implements IUserSettings { name = '' @@ -14,7 +15,7 @@ export default class UserSettingsModel extends AbstractModel impl timezone = '' language = getCurrentLanguage() defaultReminder = false - defaultReminderAmount = 0 + defaultReminderAmount = getDefaultReminderAmount() || 0 constructor(data: Partial = {}) { super() -- 2.40.1 From a341dbd5d238f4480a626ca2e70ab4e30b8fa52d Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 29 Sep 2022 18:32:51 +0200 Subject: [PATCH 13/17] fix: combine related css classes --- src/styles/theme/form.scss | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/styles/theme/form.scss b/src/styles/theme/form.scss index 7ac5aa236..e790d5523 100644 --- a/src/styles/theme/form.scss +++ b/src/styles/theme/form.scss @@ -56,10 +56,7 @@ } } -.field.has-addons .select select { - height: 100%; -} - +.field.has-addons .select select, .field.has-addons .control .select select { height: 100%; } -- 2.40.1 From d5bc1cd1d69b0304eaf9868d576e61058ba12323 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 30 Sep 2022 13:22:46 +0200 Subject: [PATCH 14/17] chore: make amounts const --- src/helpers/defaultReminder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index 98a2de845..3df722fb5 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -10,7 +10,7 @@ export const AMOUNTS_IN_SECONDS: { hours: 60 * 60, days: 60 * 60 * 24, months: 60 * 60 * 24 * 30, -} +} as const interface DefaultReminderSettings { enabled: boolean, -- 2.40.1 From e62395435166b132c75c4c13309b9498f19f1ece Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 30 Sep 2022 13:27:14 +0200 Subject: [PATCH 15/17] chore: better typing --- src/helpers/defaultReminder.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index 3df722fb5..03504611a 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -1,10 +1,7 @@ const DEFAULT_REMINDER_KEY = 'defaultReminder' export const AMOUNTS_IN_SECONDS: { - minutes: number, - hours: number, - days: number, - months: number, + [type in SavedReminderSettings['type']]: number } = { minutes: 60, hours: 60 * 60, @@ -19,15 +16,15 @@ interface DefaultReminderSettings { interface SavedReminderSettings { enabled: boolean, - amount?: number, - type?: 'minutes' | 'hours' | 'days' | 'months', + amount: number, + type: 'minutes' | 'hours' | 'days' | 'months', } -function calculateDefaultReminderSeconds(type: string, amount: number): number { +function calculateDefaultReminderSeconds(type: SavedReminderSettings['type'], amount: number): number { return amount * (AMOUNTS_IN_SECONDS[type] || 0) } -export function saveDefaultReminder(enabled: boolean, type: string, amount: number) { +export function saveDefaultReminder(enabled: boolean, type: SavedReminderSettings['type'], amount: number) { const defaultReminderSeconds = calculateDefaultReminderSeconds(type, amount) localStorage.setItem(DEFAULT_REMINDER_KEY, JSON.stringify({ enabled, @@ -83,6 +80,8 @@ export function getSavedReminderSettings(): SavedReminderSettings | null { if (!s.enabled) { return { enabled: false, + type: 'minutes', + amount: 0, } } -- 2.40.1 From aacd0a1331e7634a2d66582957e93a6d8b05efc6 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 30 Sep 2022 13:31:04 +0200 Subject: [PATCH 16/17] chore: clarify comment --- src/views/tasks/TaskDetailView.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index bbe26dc58..35a624c3c 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -698,7 +698,7 @@ export default defineComponent({ this.task = await this.$store.dispatch('tasks/update', task) - // Activate new fields which may have been set from the api + // Show new fields set from the api or a newly set default reminder this.$nextTick(() => this.setActiveFields()) if (!showNotification) { -- 2.40.1 From ad2644edf8e3c064ba20bdec4ad94aa1675480bb Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 30 Sep 2022 13:32:01 +0200 Subject: [PATCH 17/17] chore: remove unused comment --- src/views/user/settings/General.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index bc3cffb8c..97323f517 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -321,7 +321,6 @@ async function updateSettings() { const reminderSettings = getSavedReminderSettings() const defaultReminderEnabled = ref(reminderSettings?.enabled || false) -// TODO: re-populate amount and type const defaultReminderAmount = ref(reminderSettings?.amount || 1) const defaultReminderAmountType = ref(reminderSettings?.type || 'days') -- 2.40.1