@oruga-ui/oruga-next
Version:
UI components for Vue.js and CSS framework agnostic
1 lines • 26.8 kB
Source Map (JSON)
{"version":3,"file":"datetimepicker.mjs","sources":["../../src/components/datetimepicker/useDatetimepickerMixin.ts","../../src/components/datetimepicker/Datetimepicker.vue","../../src/components/datetimepicker/index.ts"],"sourcesContent":["import { computed } from \"vue\";\nimport { matchWithGroups } from \"../datepicker/utils\";\nimport type { DatetimepickerProps } from \"./props\";\n\nconst AM = \"AM\" as const;\nconst PM = \"PM\" as const;\nconst HOUR_FORMAT_24 = \"24\" as const;\n\n/** Time Format Feature */\nexport function useDateimepickerMixins(props: DatetimepickerProps) {\n const localeOptions = computed(\n () =>\n new Intl.DateTimeFormat(props.locale, {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: props.timepicker?.enableSeconds ? \"numeric\" : undefined,\n }).resolvedOptions() as Intl.DateTimeFormatOptions,\n );\n\n const isHourFormat24 = computed(\n () =>\n (props.timepicker?.hourFormat &&\n props.timepicker.hourFormat === HOUR_FORMAT_24) ||\n (!props.timepicker?.hourFormat && !localeOptions.value.hour12),\n );\n\n const dtf = computed(\n () =>\n new Intl.DateTimeFormat(props.locale, {\n year: localeOptions.value.year || \"numeric\",\n month: localeOptions.value.month || \"numeric\",\n day: localeOptions.value.day || \"numeric\",\n hour: localeOptions.value.hour || \"numeric\",\n minute: localeOptions.value.minute || \"numeric\",\n second: props.timepicker?.enableSeconds\n ? localeOptions.value.second || \"numeric\"\n : undefined,\n hourCycle: !isHourFormat24.value ? \"h12\" : \"h23\",\n }),\n );\n\n const amString = computed(() => {\n if (\n dtf.value.formatToParts &&\n typeof dtf.value.formatToParts === \"function\"\n ) {\n const d = datetimeCreator();\n d.setHours(10);\n const dayPeriod = dtf.value\n .formatToParts(d)\n .find((part) => part.type === \"dayPeriod\");\n if (dayPeriod) return dayPeriod.value;\n }\n return AM;\n });\n\n const pmString = computed(() => {\n if (\n dtf.value.formatToParts &&\n typeof dtf.value.formatToParts === \"function\"\n ) {\n const d = datetimeCreator();\n d.setHours(20);\n const dayPeriod = dtf.value\n .formatToParts(d)\n .find((part) => part.type === \"dayPeriod\");\n if (dayPeriod) return dayPeriod.value;\n }\n return PM;\n });\n\n function datetimeCreator(): Date {\n return typeof props.creator === \"function\"\n ? props.creator()\n : new Date();\n }\n\n function datetimeFormatter(date: Date): string {\n if (typeof props.formatter === \"function\") return props.formatter(date);\n\n if (!date) return \"\";\n return dtf.value.format(date);\n }\n\n function datetimeParser(date: string): Date | undefined {\n if (typeof props.parser === \"function\") return props.parser(date);\n\n if (!date) return undefined;\n if (\n dtf.value.formatToParts &&\n typeof dtf.value.formatToParts === \"function\"\n ) {\n const dayPeriods = [\n AM,\n PM,\n AM.toLowerCase(),\n PM.toLowerCase(),\n amString.value,\n pmString.value,\n ];\n const parts = dtf.value.formatToParts(new Date());\n const formatRegex = parts\n .map((part, idx) => {\n if (part.type === \"literal\") {\n if (\n idx + 1 < parts.length &&\n parts[idx + 1].type === \"hour\"\n ) {\n return `[^\\\\d]+`;\n }\n return part.value.replace(/ /g, \"\\\\s?\");\n } else if (part.type === \"dayPeriod\") {\n return `((?!=<${part.type}>)(${dayPeriods.join(\n \"|\",\n )})?)`;\n }\n return `((?!=<${part.type}>)\\\\d+)`;\n })\n .join(\"\");\n const datetimeGroups = matchWithGroups(formatRegex, date);\n\n // We do a simple validation for the group.\n // If it is not valid, it will fallback to Date.parse below\n if (\n datetimeGroups.year &&\n datetimeGroups.year.length === 4 &&\n datetimeGroups.month &&\n datetimeGroups.month <= 12 &&\n datetimeGroups.day &&\n datetimeGroups.day <= 31 &&\n datetimeGroups.hour &&\n datetimeGroups.hour >= 0 &&\n datetimeGroups.hour < 24 &&\n datetimeGroups.minute &&\n datetimeGroups.minute >= 0 &&\n datetimeGroups.minute <= 59\n ) {\n return new Date(\n datetimeGroups.year,\n datetimeGroups.month - 1,\n datetimeGroups.day,\n datetimeGroups.hour,\n datetimeGroups.minute,\n datetimeGroups.second || 0,\n );\n }\n }\n\n // Fallback if formatToParts is not supported or if we were not able to parse a valid date\n return new Date(Date.parse(date));\n }\n\n return {\n dtf,\n datetimeCreator,\n datetimeFormatter,\n datetimeParser,\n };\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport ODatepicker from \"../datepicker/Datepicker.vue\";\nimport OTimepicker from \"../timepicker/Timepicker.vue\";\nimport OInput from \"../input/Input.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDate, isMobileAgent, pad } from \"@/utils/helpers\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { useDateimepickerMixins } from \"./useDatetimepickerMixin\";\n\nimport type { DatepickerProps } from \"../datepicker/props\";\nimport type { TimepickerProps } from \"../timepicker/props\";\nimport type { DatetimepickerProps } from \"./props\";\n\n/**\n * An input with a simple dropdown/modal for selecting a date and time, uses native datetimepicker for mobile.\n * @displayName Datetimepicker\n * @style _datetimepicker.scss\n */\ndefineOptions({\n isOruga: true,\n name: \"ODatetimepicker\",\n configField: \"datetimepicker\",\n inheritAttrs: false,\n});\n\ntype ModelValue = DatetimepickerProps[\"modelValue\"];\n\nconst props = withDefaults(defineProps<DatetimepickerProps>(), {\n override: undefined,\n modelValue: undefined,\n active: false,\n datepicker: undefined,\n timepicker: undefined,\n minDatetime: undefined,\n maxDatetime: undefined,\n size: () => getDefault(\"datetimepicker.size\"),\n expanded: () => getDefault(\"datetimepicker.expanded\", false),\n rounded: false,\n placeholder: undefined,\n readonly: false,\n disabled: false,\n inline: false,\n openOnFocus: () => getDefault(\"datetimepicker.openOnFocus\", true),\n locale: () => getDefault(\"locale\"),\n formatter: getDefault(\"datetimepicker.dateFormatter\"),\n parser: getDefault(\"datetimepicker.dateParser\"),\n creator: getDefault(\"datetimepicker.datetimeCreator\"),\n position: undefined,\n iconPack: () => getDefault(\"datetimepicker.iconPack\"),\n icon: () => getDefault(\"datetimepicker.icon\"),\n iconRight: () => getDefault(\"datetimepicker.iconRight\"),\n iconRightClickable: false,\n desktopModal: () => getDefault(\"datetimepicker.desktopModal\", false),\n mobileModal: () => getDefault(\"datetimepicker.mobileModal\", true),\n mobileNative: () => getDefault(\"datetimepicker.mobileNative\", true),\n teleport: () => getDefault(\"datetimepicker.teleport\", false),\n useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n /**\n * modelValue prop two-way binding\n * @param value {Date} updated modelValue prop\n */\n \"update:model-value\": [value: Date];\n /**\n * active prop two-way binding\n * @param value {boolean} updated active prop\n */\n \"update:active\": [value: boolean];\n /**\n * on range start is selected event\n * @param value {Date} range start date\n */\n \"range-start\": [value: Date];\n /**\n * on range end is selected event\n * @param value {Date} range end date\n */\n \"range-end\": [value: Date];\n /**\n * on month change event\n * @param value {number} month number\n */\n \"change-month\": [value: number];\n /**\n * on year change event\n * @param value {number} year number\n */\n \"change-year\": [value: number];\n /**\n * on input focus event\n * @param event {Event} native event\n */\n focus: [event: Event];\n /**\n * on input blur event\n * @param event {Event} native event\n */\n blur: [event: Event];\n /**\n * on input invalid event\n * @param event {Event} native event\n */\n invalid: [event: Event];\n /**\n * on icon click event\n * @param event {Event} native event\n */\n \"icon-click\": [event: Event];\n /**\n * on icon right click event\n * @param event {Event} native event\n */\n \"icon-right-click\": [event: Event];\n}>();\n\nconst datepickerRef = useTemplateRef(\"datepickerComponent\");\nconst nativeInputRef = useTemplateRef(\"nativeInputComponent\");\n\nconst timepickerProps = ref<TimepickerProps | undefined>(props.timepicker);\nwatch(\n () => props.timepicker,\n (value) => (timepickerProps.value = value),\n { deep: true },\n);\nconst datepickerProps = ref<DatepickerProps | undefined>(props.datepicker);\nwatch(\n () => props.datepicker,\n (value) => (datepickerProps.value = value),\n { deep: true },\n);\n\nconst isMobileNative = computed(\n () => props.mobileNative && isMobileAgent.any(),\n);\n\nconst elementRef = computed(() =>\n isMobileNative.value ? nativeInputRef.value : datepickerRef.value,\n);\n\n// use form input functionality for native input\nconst { checkHtml5Validity, setFocus, onBlur, onFocus, onInvalid } = useInputHandler(\n elementRef,\n emits,\n props,\n);\n\nconst { datetimeFormatter, datetimeParser } = useDateimepickerMixins(props);\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nfunction updateVModel(value: Date | Date[] | undefined): void {\n if (Array.isArray(value)) return updateVModel(value[0]);\n if (!value) {\n vmodel.value = undefined;\n return;\n }\n\n let date = new Date(value.getTime());\n if (props.modelValue) {\n // restore time part\n if (\n (value.getDate() !== props.modelValue.getDate() ||\n value.getMonth() !== props.modelValue.getMonth() ||\n value.getFullYear() !== props.modelValue.getFullYear()) &&\n value.getHours() === 0 &&\n value.getMinutes() === 0 &&\n value.getSeconds() === 0\n ) {\n date.setHours(\n props.modelValue.getHours(),\n props.modelValue.getMinutes(),\n props.modelValue.getSeconds(),\n 0,\n );\n }\n }\n // check min and max range\n if (props.minDatetime && date < props.minDatetime) {\n date = props.minDatetime;\n } else if (props.maxDatetime && date > props.maxDatetime) {\n date = props.maxDatetime;\n }\n vmodel.value = new Date(date.getTime());\n}\n\nconst minDate = computed(() => {\n if (!props.minDatetime) return datepickerProps.value?.minDate;\n return new Date(\n props.minDatetime.getFullYear(),\n props.minDatetime.getMonth(),\n props.minDatetime.getDate(),\n 0,\n 0,\n 0,\n 0,\n );\n});\n\nconst maxDate = computed(() => {\n if (!props.maxDatetime) return datepickerProps.value?.maxDate;\n return new Date(\n props.maxDatetime.getFullYear(),\n props.maxDatetime.getMonth(),\n props.maxDatetime.getDate(),\n 0,\n 0,\n 0,\n 0,\n );\n});\n\n// Only enable min/max time if local (not necessarily UTC) date portion matches\nconst minTime = computed(() => {\n if (\n !props.minDatetime ||\n vmodel.value === null ||\n typeof vmodel.value === \"undefined\" ||\n vmodel.value.getFullYear() != props.minDatetime.getFullYear() ||\n vmodel.value.getMonth() != props.minDatetime.getMonth() ||\n vmodel.value.getDate() != props.minDatetime.getDate()\n ) {\n return timepickerProps.value?.minTime;\n }\n return props.minDatetime;\n});\n\nconst maxTime = computed(() => {\n if (\n !props.maxDatetime ||\n vmodel.value === null ||\n typeof vmodel.value === \"undefined\" ||\n vmodel.value.getFullYear() != props.maxDatetime.getFullYear() ||\n vmodel.value.getMonth() != props.maxDatetime.getMonth() ||\n vmodel.value.getDate() != props.maxDatetime.getDate()\n ) {\n return timepickerProps.value?.maxTime;\n }\n return props.maxDatetime;\n});\n\nconst datepickerSize = computed(\n () => datepickerProps.value?.size || props.size,\n);\n\nconst timepickerSize = computed(\n () => timepickerProps.value?.size || props.size,\n);\n\nconst timepickerDisabled = computed(\n () => timepickerProps.value?.disabled || props.disabled,\n);\n\n// --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date): string {\n return datetimeFormatter(value);\n}\n\n/** Parse string into date */\nfunction parse(value: string): Date | undefined {\n const date = datetimeParser(value);\n\n return isDate(date) ? date : undefined;\n}\n\nfunction formatNative(value: ModelValue): string {\n const date = value ? new Date(value) : undefined;\n if (date && isDate(date)) {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n return (\n year +\n \"-\" +\n pad(month) +\n \"-\" +\n pad(day) +\n \"T\" +\n pad(hours) +\n \":\" +\n pad(minutes) +\n \":\" +\n pad(seconds)\n );\n }\n return \"\";\n}\n\n// --- Event Handler ---\n\n/** Parse date from string */\nfunction onChangeNativePicker(event: Event): void {\n const date = (event.target as HTMLInputElement).value;\n const s = date ? date.split(/\\D/) : [];\n if (s.length >= 5) {\n const year = parseInt(s[0], 10);\n const month = parseInt(s[1], 10) - 1;\n const day = parseInt(s[2], 10);\n const hours = parseInt(s[3], 10);\n const minutes = parseInt(s[4], 10);\n // Seconds are omitted intentionally; they are unsupported by input\n // type=datetime-local and cause the control to fail native validation\n updateVModel(new Date(year, month, day, hours, minutes));\n } else {\n updateVModel(undefined);\n }\n}\n\n// --- Computed Component Classes ---\n\nconst datepickerWrapperClasses = defineClasses([\n \"datepickerWrapperClass\",\n \"o-datetimepicker__date\",\n]);\n\nconst timepickerWrapperClasses = defineClasses([\n \"timepickerWrapperClass\",\n \"o-datetimepicker__time\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n <o-datepicker\n v-if=\"!isMobileNative || inline\"\n ref=\"datepickerComponent\"\n v-bind=\"{ ...$attrs, ...datepicker }\"\n v-model:active=\"isActive\"\n :model-value=\"vmodel\"\n data-oruga=\"datetimepicker\"\n :class=\"datepickerWrapperClasses\"\n :rounded=\"rounded\"\n :open-on-focus=\"openOnFocus\"\n :position=\"position\"\n :inline=\"inline\"\n :readonly=\"readonly\"\n :expanded=\"expanded\"\n :close-on-click=\"false\"\n :formatter=\"format\"\n :parser=\"parse\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :icon=\"icon\"\n :icon-right=\"iconRight\"\n :icon-right-clickable=\"iconRightClickable\"\n :icon-pack=\"iconPack\"\n :size=\"datepickerSize\"\n :placeholder=\"placeholder\"\n :range=\"false\"\n :multiple=\"false\"\n :disabled=\"disabled\"\n :desktop-modal=\"desktopModal\"\n :mobile-modal=\"mobileModal\"\n :mobile-native=\"isMobileNative\"\n :locale=\"locale\"\n :teleport=\"teleport\"\n :use-html5-validation=\"false\"\n @update:model-value=\"updateVModel\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @invalid=\"onInvalid\"\n @change-month=\"$emit('change-month', $event)\"\n @change-year=\"$emit('change-year', $event)\"\n @icon-click=\"$emit('icon-click', $event)\"\n @icon-right-click=\"$emit('icon-right-click', $event)\">\n <template #footer>\n <div :class=\"timepickerWrapperClasses\">\n <o-timepicker\n v-bind=\"timepicker\"\n v-model=\"vmodel\"\n inline\n :readonly=\"readonly\"\n :min-time=\"minTime\"\n :max-time=\"maxTime\"\n :size=\"timepickerSize\"\n :disabled=\"timepickerDisabled\"\n :mobile-native=\"isMobileNative\"\n :locale=\"locale\" />\n </div>\n\n <template v-if=\"$slots.footer\">\n <!--\n @slot Define an additional footer\n -->\n <slot name=\"footer\" />\n </template>\n </template>\n </o-datepicker>\n\n <!-- Native Picker -->\n <o-input\n v-else\n v-bind=\"$attrs\"\n ref=\"nativeInputComponent\"\n type=\"datetime-local\"\n autocomplete=\"off\"\n :value=\"formatNative(vmodel)\"\n :max=\"formatNative(maxDate)\"\n :min=\"formatNative(minDate)\"\n :placeholder=\"placeholder\"\n :size=\"datepickerSize\"\n :icon-pack=\"iconPack\"\n :icon=\"icon\"\n :rounded=\"rounded\"\n :disabled=\"disabled\"\n :readonly=\"false\"\n :use-html5-validation=\"false\"\n @change=\"onChangeNativePicker\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @invalid=\"onInvalid\" />\n</template>\n","import type { App, Plugin } from \"vue\";\n\nimport Datetimepicker from \"./Datetimepicker.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\n\n/** export datetimepicker plugin */\nexport default {\n install(app: App) {\n registerComponent(app, Datetimepicker);\n },\n} as Plugin;\n\n/** export datetimepicker components */\nexport { Datetimepicker as ODatetimepicker };\n"],"names":["_useModel","Datetimepicker"],"mappings":"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"}