feat(reminders): only show relative reminders when there's a date to relate them to
This commit is contained in:
parent
6407644138
commit
1a792e0667
@ -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(() => {
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user