UNPKG

@opensig/opendesign

Version:

264 lines (263 loc) 10 kB
import { defineComponent, inject, ref, computed, createBlock, openBlock, unref, withCtx, createVNode, normalizeClass, createElementVNode, renderSlot, createTextVNode, toDisplayString, toValue, nextTick } from "vue"; import { until } from "@vueuse/core"; import dayjs from "dayjs"; import { OPopup } from "../../popup/index.mjs"; import ClientOnly from "../../_components/client-only.mjs"; import { OButton } from "../../button/index.mjs"; import { ODivider } from "../../divider/index.mjs"; import { useI18n } from "../../locale/index.mjs"; import { TIME_PREFIX } from "../types.mjs"; import { timePickerInjectKey } from "../provide.mjs"; import { useTimeRangeConstraints, isTimeBefore, isTimeAfter } from "../use-time-range-constraints.mjs"; import { useTimePickerOptions } from "../use-time-picker-options.mjs"; import { findNearestTime } from "../find-nearest-time.mjs"; import _sfc_main$1 from "./TimeColumns.vue.mjs"; const _hoisted_1 = { class: "o-time-range-panel-body" }; const _hoisted_2 = { class: "o-time-range-panel-side o-time-panel-content" }; const _hoisted_3 = { class: "o-time-range-panel-side o-time-panel-content" }; const _hoisted_4 = { class: "o-time-panel-footer" }; const _hoisted_5 = { class: "o-time-panel-shortcut" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "TimeRangePanel", props: { target: {}, optionTitle: {} }, emits: ["change", "confirm"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const emits = __emit; const timePickerCtx = inject(timePickerInjectKey); const { size, transition, popupPosition, popupWrapper, format, hourStep, minuteStep, secondStep, minTime, maxTime, disabledHours, disabledMinutes, disabledSeconds } = timePickerCtx; const defaultOptions = useTimePickerOptions({ hourStep, minuteStep, secondStep, disabledHours, disabledMinutes, disabledSeconds, minTime, maxTime, selectedHour: ref(null), selectedMinute: ref(null) }); const { t } = useI18n(); const visible = ref(false); const startTime = ref(); const endTime = ref(); const startColumnsRef = ref(); const endColumnsRef = ref(); const popupRef = ref(); const hasBothTimes = computed(() => !!startTime.value && !!endTime.value); const { maxStartTime, minEndTime } = useTimeRangeConstraints({ startTime, endTime, format, hourStep, minuteStep, secondStep }); const computeDefaultEnd = (startStr) => { const startDayjs = dayjs(TIME_PREFIX + startStr); const endTarget = startDayjs.add(1, "hour"); return findNearestTime({ hourOptions: defaultOptions.hourOptions.value, minuteOptions: defaultOptions.minuteOptions.value, secondOptions: defaultOptions.secondOptions.value, minTime: startStr, maxTime: toValue(maxTime), disabledHours: toValue(disabledHours), disabledMinutes: toValue(disabledMinutes), disabledSeconds: toValue(disabledSeconds), target: { hour: endTarget.hour(), minute: endTarget.minute(), second: endTarget.second() }, format: format.value }); }; const open = async (start, end) => { var _a, _b, _c, _d; if (visible.value) return; visible.value = true; if (!start && !end) { const now = dayjs(); const defaultStart = findNearestTime({ hourOptions: defaultOptions.hourOptions.value, minuteOptions: defaultOptions.minuteOptions.value, secondOptions: defaultOptions.secondOptions.value, minTime: toValue(minTime), maxTime: toValue(maxTime), disabledHours: toValue(disabledHours), disabledMinutes: toValue(disabledMinutes), disabledSeconds: toValue(disabledSeconds), target: { hour: now.hour(), minute: now.minute(), second: now.second() }, format: format.value }); startTime.value = defaultStart; endTime.value = defaultStart ? computeDefaultEnd(defaultStart) : void 0; } else { startTime.value = start; endTime.value = end; } await until(startColumnsRef).toBeTruthy(); await nextTick(); (_a = startColumnsRef.value) == null ? void 0 : _a.setValue(startTime.value); (_b = startColumnsRef.value) == null ? void 0 : _b.scrollAllToSelected(false); (_c = endColumnsRef.value) == null ? void 0 : _c.setValue(endTime.value); (_d = endColumnsRef.value) == null ? void 0 : _d.scrollAllToSelected(false); }; const close = () => { visible.value = false; }; const handleStartChange = (val) => { var _a, _b; startTime.value = val; if (endTime.value && minEndTime.value && isTimeBefore(endTime.value, minEndTime.value)) { endTime.value = minEndTime.value; (_a = endColumnsRef.value) == null ? void 0 : _a.setValue(endTime.value); (_b = endColumnsRef.value) == null ? void 0 : _b.scrollAllToSelected(true); } emits("change", startTime.value, endTime.value); }; const handleEndChange = (val) => { var _a, _b; endTime.value = val; if (startTime.value && maxStartTime.value && isTimeAfter(startTime.value, maxStartTime.value)) { startTime.value = maxStartTime.value; (_a = startColumnsRef.value) == null ? void 0 : _a.setValue(startTime.value); (_b = startColumnsRef.value) == null ? void 0 : _b.scrollAllToSelected(true); } emits("change", startTime.value, endTime.value); }; const handleConfirm = () => { emits("confirm", startTime.value, endTime.value); close(); }; const shortcutSetValue = (start, end) => { var _a, _b, _c, _d; if (start !== void 0) { startTime.value = start; (_a = startColumnsRef.value) == null ? void 0 : _a.setValue(start); (_b = startColumnsRef.value) == null ? void 0 : _b.scrollAllToSelected(true); } if (end !== void 0) { endTime.value = end; (_c = endColumnsRef.value) == null ? void 0 : _c.setValue(end); (_d = endColumnsRef.value) == null ? void 0 : _d.scrollAllToSelected(true); } }; const shortcutEmitChange = () => emits("change", startTime.value, endTime.value); const setStartValue = (val) => { var _a; startTime.value = val; (_a = startColumnsRef.value) == null ? void 0 : _a.setValue(val); }; const setEndValue = (val) => { var _a; endTime.value = val; (_a = endColumnsRef.value) == null ? void 0 : _a.setValue(val); }; __expose({ getPopupEl: () => popupRef.value, open, close, setStartValue, setEndValue }); return (_ctx, _cache) => { return openBlock(), createBlock(unref(ClientOnly), null, { default: withCtx(() => [ createVNode(unref(OPopup), { visible: visible.value, "onUpdate:visible": _cache[0] || (_cache[0] = ($event) => visible.value = $event), class: normalizeClass(["o-time-panel", `o-time-panel-${unref(size)}`, "o-time-range-panel"]), "hide-close": "", target: props.target, transition: unref(transition), position: unref(popupPosition), wrapper: unref(popupWrapper), trigger: "none", offset: 4, "adjust-min-width": false, "adjust-width": false }, { default: withCtx(() => [ createElementVNode( "div", { ref_key: "popupRef", ref: popupRef }, [ createElementVNode("div", _hoisted_1, [ createElementVNode("div", _hoisted_2, [ createVNode(_sfc_main$1, { ref_key: "startColumnsRef", ref: startColumnsRef, "max-time": unref(maxStartTime), onChange: handleStartChange }, null, 8, ["max-time"]) ]), createElementVNode("div", _hoisted_3, [ createVNode(_sfc_main$1, { ref_key: "endColumnsRef", ref: endColumnsRef, "min-time": unref(minEndTime), onChange: handleEndChange }, null, 8, ["min-time"]) ]) ]), createVNode(unref(ODivider), { class: "o-time-panel-divider" }), createElementVNode("div", _hoisted_4, [ createElementVNode("span", _hoisted_5, [ renderSlot(_ctx.$slots, "shortcut", { setValue: shortcutSetValue, emitChange: shortcutEmitChange }) ]), createVNode(unref(OButton), { round: "pill", disabled: !hasBothTimes.value, onClick: handleConfirm }, { default: withCtx(() => [ createTextVNode( toDisplayString(unref(t)("select.confirm")), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["disabled"]) ]) ], 512 /* NEED_PATCH */ ) ]), _: 3 /* FORWARDED */ }, 8, ["visible", "class", "target", "transition", "position", "wrapper"]) ]), _: 3 /* FORWARDED */ }); }; } }); export { _sfc_main as default };