1
0

feat: use withDefaults in ReminderDetail

This commit is contained in:
Dominik Pschenitschni 2024-06-26 19:22:46 +02:00 committed by konrad
parent 42c458a736
commit a56331d39d
3 changed files with 53 additions and 35 deletions

View File

@ -2,7 +2,7 @@
<div class="datepicker-with-range-container"> <div class="datepicker-with-range-container">
<Popup <Popup
:open="open" :open="open"
@close="() => emit('close')" @update:open="(open) => !open && emit('close')"
> >
<template #content="{isOpen}"> <template #content="{isOpen}">
<div <div

View File

@ -34,7 +34,22 @@ const props = withDefaults(defineProps<{
open: false, open: false,
}) })
const emit = defineEmits(['close']) const emit = defineEmits<{
'update:open': [open: boolean]
}>()
defineSlots<{
trigger(props: {
isOpen: boolean,
toggle: () => boolean,
close: () => void,
}) : void
content(props: {
isOpen: boolean,
toggle: () => boolean,
close: () => void
}): void
}>()
const openValue = ref(props.open) const openValue = ref(props.open)
watchEffect(() => { watchEffect(() => {
@ -43,11 +58,13 @@ watchEffect(() => {
function close() { function close() {
openValue.value = false openValue.value = false
emit('close') emit('update:open', false)
} }
function toggle() { function toggle() {
openValue.value = !openValue.value openValue.value = !openValue.value
emit('update:open', openValue.value)
return openValue.value
} }
const popup = ref<HTMLElement | null>(null) const popup = ref<HTMLElement | null>(null)

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<Popup @close="showFormSwitch = null"> <Popup @update:open="showFormSwitch = null">
<template #trigger="{toggle}"> <template #trigger="{toggle}">
<SimpleButton <SimpleButton
v-tooltip="reminder.reminder && reminder.relativeTo !== null ? formatDateShort(reminder.reminder) : null" v-tooltip="reminder.reminder && reminder.relativeTo !== null ? formatDateShort(reminder.reminder) : null"
@ -50,7 +50,7 @@
/> />
<DatepickerInline <DatepickerInline
v-if="activeForm === 'absolute'" v-else-if="activeForm === 'absolute'"
v-model="reminderDate" v-model="reminderDate"
@update:modelValue="setReminderDateAndClose(close)" @update:modelValue="setReminderDateAndClose(close)"
/> />
@ -88,38 +88,38 @@ import Card from '@/components/misc/Card.vue'
import SimpleButton from '@/components/input/SimpleButton.vue' import SimpleButton from '@/components/input/SimpleButton.vue'
import {useDebounceFn} from '@vueuse/core' import {useDebounceFn} from '@vueuse/core'
const { const props = withDefaults(defineProps<{
modelValue, modelValue: ITaskReminder | undefined,
clearAfterUpdate = false,
defaultRelativeTo = REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE,
} = defineProps<{
modelValue?: ITaskReminder,
clearAfterUpdate?: boolean, clearAfterUpdate?: boolean,
defaultRelativeTo?: null | IReminderPeriodRelativeTo, defaultRelativeTo?: IReminderPeriodRelativeTo | null,
}>() }>(), {
modelValue: new TaskReminderModel() as ITaskReminder,
clearAfterUpdate: false,
defaultRelativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE,
})
const emit = defineEmits(['update:modelValue']) const emit = defineEmits<{
'update:modelValue': [value: ITaskReminder | undefined],
}>()
const {t} = useI18n({useScope: 'global'}) const {t} = useI18n({useScope: 'global'})
const reminder = ref<ITaskReminder>(new TaskReminderModel()) const reminder = ref<ITaskReminder>(new TaskReminderModel())
const presets = computed<TaskReminderModel[]>(() => [ const presets = computed(() => [
{reminder: null, relativePeriod: 0, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: 0, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -2 * SECONDS_A_HOUR, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: -2 * SECONDS_A_HOUR, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 3, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 3, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 7, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 7, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 30, relativeTo: defaultRelativeTo}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 30, relativeTo: props.defaultRelativeTo},
]) ] as ITaskReminder[])
const reminderDate = ref<Date | null>(null) const reminderDate = ref<Date | null>(null)
type availableForms = null | 'relative' | 'absolute' const showFormSwitch = ref<null | 'relative' | 'absolute'>(null)
const showFormSwitch = ref<availableForms>(null) const activeForm = computed(() => {
if (props.defaultRelativeTo === null) {
const activeForm = computed<availableForms>(() => {
if (defaultRelativeTo === null) {
return 'absolute' return 'absolute'
} }
@ -127,7 +127,6 @@ const activeForm = computed<availableForms>(() => {
}) })
const reminderText = computed(() => { const reminderText = computed(() => {
if (reminder.value.relativeTo !== null) { if (reminder.value.relativeTo !== null) {
return formatReminder(reminder.value) return formatReminder(reminder.value)
} }
@ -140,7 +139,7 @@ const reminderText = computed(() => {
}) })
watch( watch(
() => modelValue, () => props.modelValue,
(newReminder) => { (newReminder) => {
if (newReminder) { if (newReminder) {
reminder.value = newReminder reminder.value = newReminder
@ -160,12 +159,12 @@ watch(
function updateData() { function updateData() {
emit('update:modelValue', reminder.value) emit('update:modelValue', reminder.value)
if (clearAfterUpdate) { if (props.clearAfterUpdate) {
reminder.value = new TaskReminderModel() reminder.value = new TaskReminderModel()
} }
} }
function setReminderDateAndClose(close) { function setReminderDateAndClose(close: () => void) {
reminder.value.reminder = reminderDate.value === null reminder.value.reminder = reminderDate.value === null
? null ? null
: new Date(reminderDate.value) : new Date(reminderDate.value)
@ -175,7 +174,7 @@ function setReminderDateAndClose(close) {
} }
function setReminderFromPreset(preset, close) { function setReminderFromPreset(preset: ITaskReminder, close: () => void) {
reminder.value = preset reminder.value = preset
updateData() updateData()
close() close()
@ -183,14 +182,14 @@ function setReminderFromPreset(preset, close) {
const updateDataAndMaybeClose = useDebounceFn(updateDataAndMaybeCloseNow, 500) const updateDataAndMaybeClose = useDebounceFn(updateDataAndMaybeCloseNow, 500)
function updateDataAndMaybeCloseNow(close) { function updateDataAndMaybeCloseNow(close: () => void) {
updateData() updateData()
if (clearAfterUpdate) { if (props.clearAfterUpdate) {
close() close()
} }
} }
function formatReminder(reminder: TaskReminderModel) { function formatReminder(reminder: ITaskReminder) {
const period = secondsToPeriod(reminder.relativePeriod) const period = secondsToPeriod(reminder.relativePeriod)
if (period.amount === 0) { if (period.amount === 0) {
@ -248,6 +247,8 @@ function translateUnit(amount: number, unit: PeriodUnit): string {
return t('time.units.weeks', amount) return t('time.units.weeks', amount)
case 'years': case 'years':
return t('time.units.years', amount) return t('time.units.years', amount)
default:
throw new Error(`Unknown unit: ${unit}`)
} }
} }
</script> </script>