fix: validate time and date before setting

This commit is contained in:
Shariq Ansari 2025-04-26 16:40:32 +05:30
parent 02da09633d
commit f73fbcafdd

View File

@ -32,28 +32,32 @@
<DurationIcon class="h-4 w-4 text-ink-gray-5" /> <DurationIcon class="h-4 w-4 text-ink-gray-5" />
<DatePicker <DatePicker
class="max-w-28" class="max-w-28"
v-model="_event.fromDate" :value="_event.fromDate"
:formatter="(date) => getFormat(date, 'MMM D, YYYY')" :formatter="(date) => getFormat(date, 'MMM D, YYYY')"
:placeholder="__('Start Date')" :placeholder="__('Start Date')"
@update:modelValue="(date) => updateDate(date, true)"
/> />
<TimePicker <TimePicker
v-if="!_event.isFullDay" v-if="!_event.isFullDay"
class="max-w-20" class="max-w-20"
v-model="_event.fromTime" :value="_event.fromTime"
:placeholder="__('Start Time')" :placeholder="__('Start Time')"
@update:modelValue="(time) => updateTime(time, true)"
/> />
<div class="text-base text-ink-gray-6">-</div> <div class="text-base text-ink-gray-6">-</div>
<TimePicker <TimePicker
v-if="!_event.isFullDay" v-if="!_event.isFullDay"
class="max-w-20" class="max-w-20"
v-model="_event.toTime" :value="_event.toTime"
:placeholder="__('End Time')" :placeholder="__('End Time')"
@update:modelValue="(time) => updateTime(time)"
/> />
<DatePicker <DatePicker
class="max-w-28" class="max-w-28"
v-model="_event.toDate" :value="_event.toDate"
:formatter="(date) => getFormat(date, 'MMM D, YYYY')" :formatter="(date) => getFormat(date, 'MMM D, YYYY')"
:placeholder="__('End Date')" :placeholder="__('End Date')"
@update:modelValue="(date) => updateDate(date)"
/> />
</div> </div>
<Switch <Switch
@ -116,6 +120,7 @@ import {
DatePicker, DatePicker,
ColorPicker, ColorPicker,
TimePicker, TimePicker,
dayjs,
} from 'frappe-ui' } from 'frappe-ui'
import { getFormat } from '@/utils' import { getFormat } from '@/utils'
import { ref, nextTick, watch } from 'vue' import { ref, nextTick, watch } from 'vue'
@ -130,6 +135,62 @@ const title = ref(null)
let _event = ref({}) let _event = ref({})
function updateDate(d, fromDate = false) {
error.value = null
let oldTo = _event.value.toDate || _event.value.fromDate
if (fromDate) {
_event.value.fromDate = d
if (!_event.value.toDate) {
_event.value.toDate = d
}
} else {
_event.value.toDate = d
}
if (_event.value.toDate && _event.value.fromDate) {
const diff = dayjs(_event.value.toDate).diff(
dayjs(_event.value.fromDate),
'day',
)
if (diff < 0) {
_event.value.toDate = oldTo
error.value = __('End date should be after start date')
return
}
}
}
function updateTime(t, fromTime = false) {
error.value = null
let oldTo = _event.value.toTime || _event.value.fromTime
if (fromTime) {
_event.value.fromTime = t
if (!_event.value.toTime) {
const hour = parseInt(t.split(':')[0])
const minute = parseInt(t.split(':')[1])
_event.value.toTime = `${hour + 1}:${minute}`
}
} else {
_event.value.toTime = t
}
if (_event.value.toTime && _event.value.fromTime) {
const diff = dayjs(_event.value.toDate + ' ' + _event.value.toTime).diff(
dayjs(_event.value.fromDate + ' ' + _event.value.fromTime),
'minute',
)
if (diff < 0) {
_event.value.toTime = oldTo
error.value = __('End time should be after start time')
return
}
}
}
function updateEventType() { function updateEventType() {
if (_event.value.eventType == 'Private') { if (_event.value.eventType == 'Private') {
_event.value.eventType = 'Public' _event.value.eventType = 'Public'