feat(reminders): only show relative reminders when there's a date to relate them to
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
kolaente 2023-06-13 12:03:28 +02:00
parent 6407644138
commit 1a792e0667
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
3 changed files with 63 additions and 26 deletions

View File

@ -10,7 +10,7 @@
</template> </template>
<template #content="{isOpen, toggle}"> <template #content="{isOpen, toggle}">
<Card class="reminder-options-popup" :class="{'is-open': isOpen}" :padding="false"> <Card class="reminder-options-popup" :class="{'is-open': isOpen}" :padding="false">
<div class="options" v-if="showFormSwitch === null"> <div class="options" v-if="activeForm === null">
<SimpleButton <SimpleButton
v-for="(p, k) in presets" v-for="(p, k) in presets"
:key="k" :key="k"
@ -37,13 +37,13 @@
</div> </div>
<ReminderPeriod <ReminderPeriod
v-if="showFormSwitch === 'relative'" v-if="activeForm === 'relative'"
v-model="reminder" v-model="reminder"
@update:modelValue="updateDataAndMaybeClose(toggle)" @update:modelValue="updateDataAndMaybeClose(toggle)"
/> />
<DatepickerInline <DatepickerInline
v-if="showFormSwitch === 'absolute'" v-if="activeForm === 'absolute'"
v-model="reminderDate" v-model="reminderDate"
@update:modelValue="setReminderDate" @update:modelValue="setReminderDate"
/> />
@ -63,10 +63,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {computed, ref, watch, type PropType} from 'vue' import {computed, ref, watch} from 'vue'
import {toRef} from '@vueuse/core' import {toRef} from '@vueuse/core'
import {SECONDS_A_DAY} from '@/constants/date' import {SECONDS_A_DAY} from '@/constants/date'
import {REMINDER_PERIOD_RELATIVE_TO_TYPES} from '@/types/IReminderPeriodRelativeTo' import {IReminderPeriodRelativeTo, REMINDER_PERIOD_RELATIVE_TO_TYPES} from '@/types/IReminderPeriodRelativeTo'
import {useI18n} from 'vue-i18n' import {useI18n} from 'vue-i18n'
import {PeriodUnit, secondsToPeriod} from '@/helpers/time/period' import {PeriodUnit, secondsToPeriod} from '@/helpers/time/period'
@ -83,33 +83,40 @@ import SimpleButton from '@/components/input/SimpleButton.vue'
const {t} = useI18n({useScope: 'global'}) const {t} = useI18n({useScope: 'global'})
const props = defineProps({ const props = withDefaults(defineProps<{
modelValue: { modelValue?: ITaskReminder,
type: Object as PropType<ITaskReminder>, disabled?: boolean,
required: false, clearAfterUpdate?: boolean,
}, defaultRelativeTo?: null | IReminderPeriodRelativeTo,
disabled: { }>(), {
default: false, disabled: false,
}, clearAfterUpdate: false,
clearAfterUpdate: { defaultRelativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE,
type: Boolean,
default: false,
},
}) })
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const reminder = ref<ITaskReminder>(new TaskReminderModel()) const reminder = ref<ITaskReminder>(new TaskReminderModel())
const presets: TaskReminderModel[] = [ const presets = computed<TaskReminderModel[]>(() => [
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY, relativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 3, relativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 3, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 7, relativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 7, relativeTo: props.defaultRelativeTo},
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 30, relativeTo: REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE}, {reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 30, relativeTo: props.defaultRelativeTo},
] ])
const reminderDate = ref(null) const reminderDate = ref(null)
const showFormSwitch = ref<null | 'relative' | 'absolute'>(null) type availableForms = null | 'relative' | 'absolute'
const showFormSwitch = ref<availableForms>(null)
const activeForm = computed<availableForms>(() => {
if (props.defaultRelativeTo === null) {
return 'absolute'
}
return showFormSwitch.value
})
const reminderText = computed(() => { const reminderText = computed(() => {

View File

@ -10,7 +10,9 @@
class="reminder-detail" class="reminder-detail"
:disabled="disabled" :disabled="disabled"
v-model="reminders[index]" v-model="reminders[index]"
@update:model-value="updateData"/> @update:model-value="updateData"
:default-relative-to="defaultRelativeTo"
/>
<BaseButton <BaseButton
v-if="!disabled" v-if="!disabled"
@click="removeReminderByIndex(index)" @click="removeReminderByIndex(index)"
@ -24,17 +26,20 @@
:disabled="disabled" :disabled="disabled"
@update:modelValue="addNewReminder" @update:modelValue="addNewReminder"
:clear-after-update="true" :clear-after-update="true"
:default-relative-to="defaultRelativeTo"
/> />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref, watch, type PropType} from 'vue' import {ref, watch, type PropType, computed} from 'vue'
import type {ITaskReminder} from '@/modelTypes/ITaskReminder' import type {ITaskReminder} from '@/modelTypes/ITaskReminder'
import BaseButton from '@/components/base/BaseButton.vue' import BaseButton from '@/components/base/BaseButton.vue'
import ReminderDetail from '@/components/tasks/partials/reminder-detail.vue' import ReminderDetail from '@/components/tasks/partials/reminder-detail.vue'
import type {ITask} from '@/modelTypes/ITask'
import {REMINDER_PERIOD_RELATIVE_TO_TYPES} from '@/types/IReminderPeriodRelativeTo'
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
@ -44,6 +49,10 @@ const props = defineProps({
disabled: { disabled: {
default: false, default: false,
}, },
task: {
type: Object as PropType<ITask>,
required: false,
},
}) })
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
@ -58,6 +67,26 @@ watch(
{immediate: true}, {immediate: true},
) )
const defaultRelativeTo = computed(() => {
if (typeof props.task === 'undefined') {
return null
}
if (props.task?.dueDate) {
return REMINDER_PERIOD_RELATIVE_TO_TYPES.DUEDATE
}
if (props.task.dueDate === null && props.task.startDate !== null) {
return REMINDER_PERIOD_RELATIVE_TO_TYPES.STARTDATE
}
if (props.task.dueDate === null && props.task.startDate === null && props.task.endDate !== null) {
return REMINDER_PERIOD_RELATIVE_TO_TYPES.ENDDATE
}
return null
})
function updateData() { function updateData() {
emit('update:modelValue', reminders.value) emit('update:modelValue', reminders.value)
} }

View File

@ -162,6 +162,7 @@
:ref="e => setFieldRef('reminders', e)" :ref="e => setFieldRef('reminders', e)"
v-model="task.reminders" v-model="task.reminders"
@update:model-value="saveTask" @update:model-value="saveTask"
:task="task"
/> />
</div> </div>
</CustomTransition> </CustomTransition>