diff --git a/app/src/components/v-date-picker/v-date-picker.vue b/app/src/components/v-date-picker/v-date-picker.vue index a0cc5042a9..82f96eb749 100644 --- a/app/src/components/v-date-picker/v-date-picker.vue +++ b/app/src/components/v-date-picker/v-date-picker.vue @@ -35,7 +35,7 @@ export default defineComponent({ default: true, }, }, - emits: ['update:modelValue'], + emits: ['update:modelValue', 'close'], setup(props, { emit }) { const { t } = useI18n(); @@ -63,10 +63,7 @@ export default defineComponent({ onBeforeUnmount(() => { if (flatpickr) { - const selectedDate = flatpickr.selectedDates.length > 0 ? flatpickr.selectedDates[0] : null; - emitValue(selectedDate); - - flatpickr.destroy(); + flatpickr.close(); flatpickr = null; } }); @@ -84,6 +81,10 @@ export default defineComponent({ const selectedDate = selectedDates.length > 0 ? selectedDates[0] : null; emitValue(selectedDate); }, + onClose(selectedDates: Date[], _dateStr: string, _instance: Flatpickr.Instance) { + const selectedDate = selectedDates.length > 0 ? selectedDates[0] : null; + emitValue(selectedDate); + }, onReady(_selectedDates: Date[], _dateStr: string, instance: Flatpickr.Instance) { const setToNowButton: HTMLElement = document.createElement('button'); setToNowButton.innerHTML = t('interfaces.datetime.set_to_now'); @@ -91,6 +92,14 @@ export default defineComponent({ setToNowButton.tabIndex = -1; setToNowButton.addEventListener('click', setToNow); instance.calendarContainer.appendChild(setToNowButton); + + if (!props.use24) { + instance.amPM?.addEventListener('keydown', enterToClose); + } else if (props.includeSeconds) { + instance.secondElement?.addEventListener('keydown', enterToClose); + } else { + instance.minuteElement?.addEventListener('keydown', enterToClose); + } }, }; @@ -122,6 +131,12 @@ export default defineComponent({ flatpickr?.setDate(new Date(), true); } + function enterToClose(e: any) { + if (e.key !== 'Enter') return; + flatpickr?.close(); + emit('close'); + } + return { t, wrapper }; }, }); diff --git a/app/src/interfaces/_system/system-filter/input-component.vue b/app/src/interfaces/_system/system-filter/input-component.vue index 700d99a39e..51648348fd 100644 --- a/app/src/interfaces/_system/system-filter/input-component.vue +++ b/app/src/interfaces/_system/system-filter/input-component.vue @@ -36,12 +36,24 @@ placeholder="--" @input="emitValue($event.target.value)" /> - +
- +
@@ -100,6 +112,8 @@ export default defineComponent({ const inputEl = ref(); const { t } = useI18n(); + const dateTimeMenu = ref(); + const displayValue = computed(() => { if (props.value === null) return null; if (props.value === undefined) return null; @@ -134,7 +148,7 @@ export default defineComponent({ if (props.focus) inputEl.value?.focus(); }); - return { displayValue, width, t, emitValue, inputEl, inputPattern }; + return { displayValue, width, t, emitValue, inputEl, inputPattern, dateTimeMenu }; function emitValue(val: unknown) { if (val === '') { diff --git a/app/src/interfaces/datetime/datetime.vue b/app/src/interfaces/datetime/datetime.vue index 3a9425cf84..5e7e99f2ad 100644 --- a/app/src/interfaces/datetime/datetime.vue +++ b/app/src/interfaces/datetime/datetime.vue @@ -1,5 +1,5 @@