UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 29 kB
{"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 } =\n useInputHandler(elementRef, emits, props);\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","inline","_openBlock","_createBlock","ODatepicker","_mergeProps","$attrs","datepicker","_unref","rounded","openOnFocus","position","readonly","expanded","icon","iconRight","iconRightClickable","iconPack","placeholder","disabled","desktopModal","mobileModal","locale","teleport","$emit","_createElementVNode","_createVNode","OTimepicker","$slots","_renderSlot","OInput","Datetimepicker"],"mappings":"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"}