@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
672 lines (671 loc) • 24.2 kB
JavaScript
import { defineComponent as bt, useSlots as ht, toRef as M, ref as k, computed as v, watch as h, reactive as oe, nextTick as Ie, openBlock as m, createElementBlock as b, unref as t, normalizeClass as d, createElementVNode as F, withKeys as we, withModifiers as U, normalizeStyle as Ee, renderSlot as re, createVNode as f, withCtx as I, createCommentVNode as w, Fragment as Te, mergeProps as se, Transition as gt, normalizeProps as Ct, guardReactiveProps as Vt, renderList as xt, toDisplayString as ie, createBlock as kt, createTextVNode as Fe } from "vue";
import "../button/index.mjs";
import "../icon/index.mjs";
import "../popper/index.mjs";
import "../form/index.mjs";
import "../renderer/index.mjs";
import "./time-wheel.vue.mjs";
import "./time-control.vue.mjs";
import { useNameHelper as yt, useProps as St, createSizeProp as $t, createStateProp as Pt, createIconProp as ue, useLocale as At, useIcons as It, useWordSpace as wt, makeSentence as Ue, emitEvent as u } from "@vexip-ui/config";
import { placementWhileList as Et, useSetTimeout as Tt, useClickOutside as Ft, usePopper as Ut, useHover as zt } from "@vexip-ui/hooks";
import { USE_TOUCH as Bt, doubleDigits as Nt, boundRange as Rt, callIfFunc as Ht, toAttrValue as ze } from "@vexip-ui/utils";
import { timePickerProps as Mt } from "./props.mjs";
import { useTimeBound as Lt, useColumn as Ot } from "./helper.mjs";
import { TIME_REG as Dt } from "./symbol.mjs";
import { useFieldStore as jt } from "../form/helper.mjs";
import ce from "../renderer/renderer.mjs";
import L from "../icon/icon.mjs";
import Be from "./time-control.vue2.mjs";
import Wt from "../popper/popper.vue.mjs";
import Ne from "./time-wheel.vue2.mjs";
import Re from "../button/button.mjs";
const Kt = ["id", "aria-disabled", "aria-expanded", "aria-labelledby"], qt = ["onKeydown"], Gt = ["aria-label"], Jt = ["aria-labelledby"], Qt = ["title", "onClick"], Cn = /* @__PURE__ */ bt({
name: "TimePicker",
__name: "time-picker",
props: Mt,
emits: ["update:value", "update:visible"],
setup(He, { expose: Me, emit: Le }) {
const {
idFor: de,
labelId: O,
state: Oe,
disabled: De,
loading: je,
size: We,
validateField: Ke,
clearField: qe,
getFieldValue: Ge,
setFieldValue: Je
} = jt(() => {
var e;
return (e = $.value) == null ? void 0 : e.focus();
}), o = yt("time-picker"), n = St("timePicker", He, {
size: $t(We),
state: Pt(Oe),
locale: null,
visible: !1,
placement: {
default: "bottom-start",
validator: (e) => Et.includes(e)
},
transfer: !1,
format: "HH:mm:ss",
separator: ":",
value: {
default: () => Ge(),
static: !0
},
filler: {
default: "-",
validator: (e) => e.length === 1
},
clearable: !1,
noAction: !1,
noArrow: !1,
pointer: Bt,
candidate: {
default: 3,
validator: (e) => [0, 1, 2, 3].includes(e)
},
steps: () => [1, 1, 1],
labels: () => ({}),
shortcuts: () => [],
range: null,
disabled: () => De.value,
transitionName: () => o.ns("drop"),
confirmText: null,
cancelText: null,
ctrlSteps: () => [5, 5, 5],
prefix: ue(),
prefixColor: "",
suffix: ue(),
suffixColor: "",
noSuffix: !1,
exchange: !1,
loading: () => je.value,
loadingIcon: ue(),
loadingLock: !1,
loadingEffect: null,
min: null,
max: null,
outsideClose: !0,
outsideCancel: !1,
placeholder: null,
unitReadonly: !1,
popperAlive: null,
shortcutsPlacement: "left",
slots: () => ({})
}), Y = Le, Qe = ht(), y = At("timePicker", M(n, "locale")), S = It(), fe = wt(), Xe = M(n, "placement"), Ye = M(n, "transfer"), c = k(n.visible), C = k(!1), z = k(""), r = ge(), i = ge(), p = k("start"), E = k(!1), { timer: me } = Tt(), B = Ft(ft), Z = k(), { reference: $, transferTo: pe, updatePopper: ve } = Ut({
placement: Xe,
transfer: Ye,
wrapper: B,
popper: v(() => {
var e;
return (e = Z.value) == null ? void 0 : e.wrapper;
}),
isDrop: !0
}), { isHover: be } = zt($), { isTimeDisabled: V } = Lt(M(n, "min"), M(n, "max")), D = k(), j = k(), Ze = v(() => {
if (n.placeholder)
return Array.isArray(n.placeholder) ? n.placeholder[0] : n.placeholder;
const { select: e, start: l, time: a } = y.value.placeholder;
return Ue(n.range ? `${l} ${a}` : `${e} ${a}`, fe.value);
}), _e = v(() => {
if (n.placeholder)
return Array.isArray(n.placeholder) ? n.placeholder[1] || n.placeholder[0] : n.placeholder;
const { end: e, time: l } = y.value.placeholder;
return Ue(`${e} ${l}`, fe.value);
}), et = v(() => [
o.b(),
o.ns("input-vars"),
o.bs("vars"),
{
[o.bm("inherit")]: n.inherit,
[o.bm("disabled")]: n.disabled,
[o.bm(n.size)]: n.size !== "default",
[o.bm("no-hour")]: !r.enabled.hour,
[o.bm("no-minute")]: !r.enabled.minute,
[o.bm("no-second")]: !r.enabled.second,
[o.bm("visible")]: c.value,
[o.bm(n.state)]: n.state !== "default",
[o.bm("is-range")]: n.range
}
]), N = v(() => n.loading && n.loadingLock), tt = v(() => {
const e = o.be("selector");
return {
[e]: !0,
[`${e}--disabled`]: n.disabled,
[`${e}--readonly`]: N.value,
[`${e}--loading`]: n.loading,
[`${e}--${n.size}`]: n.size !== "default",
[`${e}--focused`]: C.value,
[`${e}--${n.state}`]: n.state !== "default"
};
}), nt = v(() => !!(Qe.prefix || n.prefix || n.slots.prefix)), P = v(() => {
const e = [r, i].map((l) => Object.values(l.timeValue).map(Nt).join(":"));
return n.range ? e : e[0];
}), he = v(() => !n.disabled && !N.value && n.clearable && be.value && !!z.value), W = v(() => {
const { hour: e, minute: l, second: a } = r.timeValue;
return V.hour(e) || V.minute(e, l) || V.second(e, l, a);
}), K = v(() => {
if (!n.range) return !1;
const { hour: e, minute: l, second: a } = i.timeValue;
return V.hour(e) || V.minute(e, l) || V.second(e, l, a);
});
h(
() => n.value,
(e) => {
R(e), z.value = (Array.isArray(e) ? e[0] || e[1] : e) ? _() : "";
},
{ immediate: !0 }
), h(() => n.format, lt, { immediate: !0 }), h(
() => n.visible,
(e) => {
c.value = e;
}
), h(c, (e) => {
e && ve();
}), h(C, (e) => {
e ? u(n.onFocus) : u(n.onBlur);
}), h(p, (e) => {
!n.unitReadonly && c.value && u(n.onChangeCol, g().column, e);
}), h(
() => r.column,
(e) => {
!n.unitReadonly && c.value && p.value === "start" && u(n.onChangeCol, e, "start");
}
), h(
() => i.column,
(e) => {
!n.unitReadonly && c.value && p.value === "end" && u(n.onChangeCol, e, "end");
}
), h(
() => n.disabled,
(e) => {
e && (G(!1), J());
}
), h(N, (e) => {
e && G(!1);
}), Me({
idFor: de,
isHover: be,
currentVisible: c,
focused: C,
startState: r,
endState: i,
currentState: p,
currentValue: P,
startError: W,
endError: K,
wrapper: B,
reference: $,
popper: Z,
start: D,
end: j,
updatePopper: ve,
focus: (e) => {
var l;
return (l = $.value) == null ? void 0 : l.focus(e);
},
blur: () => {
var e;
return (e = $.value) == null ? void 0 : e.blur();
}
});
function ge() {
const { currentColumn: e, enabled: l, resetColumn: a, enterColumn: s } = Ot([
"hour",
"minute",
"second"
]), A = oe({
hour: 0,
minute: 0,
second: 0
}), x = oe({
hour: !1,
minute: !1,
second: !1
});
return oe({
column: e,
enabled: l,
activated: x,
timeValue: A,
resetColumn: a,
enterColumn: s
});
}
function g() {
return p.value === "start" ? r : i;
}
function R(e) {
Array.isArray(e) || (e = [e, e]);
const l = /* @__PURE__ */ new Date();
for (let a = 0; a < 2; ++a) {
const s = Dt.exec(e[a] || ""), A = a === 0 ? r : i, { timeValue: x } = A;
if (s) {
q(!0, a === 0 ? "start" : "end");
const mt = parseInt(s[1]), pt = s[2] ? parseInt(s[2].slice(1)) : 0, vt = s[3] ? parseInt(s[3].slice(1)) : 0, ae = new Date(2e3, 1, 1, mt, pt, vt);
x.hour = ae.getHours(), x.minute = ae.getMinutes(), x.second = ae.getSeconds();
} else
x.hour = l.getHours(), x.minute = l.getMinutes(), x.second = l.getSeconds(), q(!1, a === 0 ? "start" : "end");
if (!n.range) break;
}
}
function lt() {
[r, i].forEach((e) => {
e.enabled.hour = n.format.includes("H"), e.enabled.minute = n.format.includes("m"), e.enabled.second = n.format.includes("s");
});
}
function q(e, l) {
(l ? l === "start" ? [r] : [i] : [r, i]).forEach((s) => {
Object.keys(s.activated).forEach((A) => {
s.activated[A] = e;
});
});
}
function _() {
return Array.isArray(P.value) ? P.value.join("|") : P.value;
}
function at() {
(W.value || n.range && K.value) && R(n.value);
}
function G(e) {
c.value !== e && (c.value = e, Y("update:visible", e), u(n.onToggle, e));
}
function ot() {
at(), z.value !== _() && (z.value = _(), q(!0), Y("update:value", P.value), Je(P.value), u(n.onChange, P.value), Ke());
}
function Ce() {
n.disabled || (C.value = !0, me.focus = setTimeout(() => {
var e, l;
C.value && (p.value === "start" ? (e = D.value) == null || e.focus() : (l = j.value) == null || l.focus());
}, 120));
}
function J() {
var e, l;
clearTimeout(me.focus), C.value = !1, (e = D.value) == null || e.blur(), (l = j.value) == null || l.blur();
}
function Ve(e) {
if (n.disabled || N.value) return;
const l = e.target;
G(!0), Ce(), B.value && l && (Array.from(B.value.querySelectorAll(`.${o.be("unit")}`)).some((s) => s === l || s.contains(l)) || (r.column = null, i.column = null));
}
function H(e = !0) {
G(!1), e && ot(), r.resetColumn(), i.resetColumn();
}
function xe(e = !0) {
n.disabled || N.value || n.clearable && Ie(() => {
const l = n.range ? [] : "";
R(null), e && H(!1), Y("update:value", l), u(n.onChange, l), u(n.onClear), qe(l), e && J(), z.value = "", Ie(() => {
q(!1);
});
});
}
function ke(e) {
c.value && (g().activated[e] = !0);
}
function ye(e) {
g().column = e;
}
function Se(e) {
const l = g(), a = l.column;
a && (rt(a, e), l.column !== "second" && l.timeValue[a] >= 10 && l.enterColumn("next", !1));
}
function rt(e, l) {
const a = g(), s = a.timeValue[e];
a.activated[e] && s > 0 && s < 10 ? a.timeValue[e] = s * 10 + l : a.timeValue[e] = l, ee(e), a.activated[e] = !0, u(n.onInput, e, a.timeValue[e]);
}
function ee(e) {
const l = g().timeValue;
l[e] = Rt(l[e], 0, e === "hour" ? 23 : 59), l[e] = Math.round(l[e] / Q(e)) * Q(e);
}
function $e(e) {
const l = g(), a = l.column;
a && l.enabled[a] && (l.timeValue[a] += e ? Ae(a) : Q(a), ee(a), u(n.onPlus, a, l.timeValue[a]));
}
function Pe(e) {
const l = g(), a = l.column;
a && l.enabled[a] && (l.timeValue[a] -= e ? Ae(a) : Q(a), ee(a), u(n.onMinus, a, l.timeValue[a]));
}
function Q(e) {
return n.steps[e === "hour" ? 0 : e === "minute" ? 1 : 2] || 1;
}
function Ae(e) {
return n.ctrlSteps[e === "hour" ? 0 : e === "minute" ? 1 : 2] || 1;
}
function te() {
requestAnimationFrame(() => {
var e;
J(), (e = $.value) == null || e.focus();
});
}
function ne() {
te(), H(), u(n.onEnter);
}
function le() {
te(), R(n.value), H(!1), u(n.onCancel);
}
function st(e) {
const { value: l, name: a } = n.shortcuts[e], s = Ht(l);
te(), R(s), u(n.onShortcut, a, s), H();
}
function T(e) {
p.value = e;
}
function X(e) {
if (n.range) {
e === "prev" && p.value === "start" && !r.column && T("end");
const l = g(), a = l.column;
if (l.enterColumn(e, !a), a === l.column) {
const s = p.value === "start";
(s ? i : r).resetColumn(e === "prev" ? "second" : "hour", e === "prev"), T(s ? "end" : "start");
}
} else
r.enterColumn(e);
}
function it(e) {
T("start"), ye(e);
}
function ut(e) {
T("end"), ye(e);
}
function ct() {
Object.keys(r.timeValue).forEach((e) => {
const l = i.timeValue[e];
i.timeValue[e] = r.timeValue[e], r.timeValue[e] = l;
});
}
function dt(e) {
n.exchange && (!c.value && e.stopPropagation(), ct());
}
function ft() {
u(n.onClickOutside), n.outsideClose && c.value && (H(!n.outsideCancel), J(), u(n.onOutsideClose));
}
return (e, l) => (m(), b("div", {
id: t(de),
ref_key: "wrapper",
ref: B,
class: d(et.value),
role: "group",
"aria-disabled": t(ze)(t(n).disabled),
"aria-expanded": t(ze)(c.value),
"aria-haspopup": "dialog",
"aria-labelledby": t(O),
onClick: Ve
}, [
F("div", {
ref_key: "reference",
ref: $,
class: d(tt.value),
tabindex: "0",
onKeydown: [
we(U(Ve, ["prevent"]), ["space"]),
l[7] || (l[7] = we(U((a) => xe(!1), ["prevent"]), ["backspace"]))
]
}, [
nt.value ? (m(), b("div", {
key: 0,
class: d([t(o).be("icon"), t(o).be("prefix")]),
style: Ee({ color: t(n).prefixColor })
}, [
re(e.$slots, "prefix", {}, () => [
f(t(ce), {
renderer: t(n).slots.prefix
}, {
default: I(() => [
f(t(L), {
icon: t(n).prefix
}, null, 8, ["icon"])
]),
_: 1
}, 8, ["renderer"])
])
], 6)) : w("", !0),
F("div", {
class: d(t(o).be("control"))
}, [
f(Be, {
ref_key: "startInput",
ref: D,
"unit-type": p.value === "start" ? t(r).column : "",
enabled: t(r).enabled,
activated: t(r).activated,
"time-value": t(r).timeValue,
steps: t(n).steps,
"ctrl-steps": t(n).ctrlSteps,
focused: C.value,
visible: c.value,
separator: t(n).separator,
filler: t(n).filler,
labels: t(n).labels,
"has-error": W.value,
placeholder: Ze.value,
readonly: t(n).unitReadonly,
"labeled-by": t(O),
locale: t(y),
onInput: Se,
onPlus: $e,
onMinus: Pe,
onEnter: ne,
onCancel: le,
onUnitFocus: it,
onPrevUnit: l[0] || (l[0] = (a) => X("prev")),
onNextUnit: l[1] || (l[1] = (a) => X("next")),
onBlur: l[2] || (l[2] = (a) => t(r).column = null)
}, null, 8, ["unit-type", "enabled", "activated", "time-value", "steps", "ctrl-steps", "focused", "visible", "separator", "filler", "labels", "has-error", "placeholder", "readonly", "labeled-by", "locale"]),
t(n).range ? (m(), b(Te, { key: 0 }, [
F("div", {
class: d([t(o).be("exchange"), t(n).exchange ? t(o).bem("exchange", "enabled") : ""]),
onClick: dt
}, [
re(e.$slots, "exchange", {}, () => [
f(t(ce), {
renderer: t(n).slots.exchange
}, {
default: I(() => [
f(t(L), se(t(S).exchange, { style: { "padding-top": "1px" } }), null, 16)
]),
_: 1
}, 8, ["renderer"])
])
], 2),
f(Be, {
ref_key: "endInput",
ref: j,
"unit-type": p.value === "end" ? t(i).column : "",
enabled: t(i).enabled,
activated: t(i).activated,
"time-value": t(i).timeValue,
steps: t(n).steps,
"ctrl-steps": t(n).ctrlSteps,
focused: C.value,
visible: c.value,
separator: t(n).separator,
filler: t(n).filler,
labels: t(n).labels,
"has-error": K.value,
placeholder: _e.value,
readonly: t(n).unitReadonly,
"labeled-by": t(O),
locale: t(y),
onInput: Se,
onPlus: $e,
onMinus: Pe,
onEnter: ne,
onCancel: le,
onUnitFocus: ut,
onPrevUnit: l[3] || (l[3] = (a) => X("prev")),
onNextUnit: l[4] || (l[4] = (a) => X("next")),
onBlur: l[5] || (l[5] = (a) => t(i).column = null)
}, null, 8, ["unit-type", "enabled", "activated", "time-value", "steps", "ctrl-steps", "focused", "visible", "separator", "filler", "labels", "has-error", "placeholder", "readonly", "labeled-by", "locale"])
], 64)) : w("", !0)
], 2),
t(n).noSuffix ? t(n).clearable || t(n).loading ? (m(), b("div", {
key: 2,
class: d([t(o).be("icon"), t(o).bem("icon", "placeholder"), t(o).be("suffix")])
}, null, 2)) : w("", !0) : (m(), b("div", {
key: 1,
class: d([t(o).be("icon"), t(o).be("suffix")]),
style: Ee({
color: t(n).suffixColor,
opacity: he.value || t(n).loading ? "0%" : ""
})
}, [
re(e.$slots, "suffix", {}, () => [
f(t(ce), {
renderer: t(n).slots.suffix
}, {
default: I(() => [
f(t(L), se(t(S).clock, {
icon: t(n).suffix || t(S).clock.icon
}), null, 16, ["icon"])
]),
_: 1
}, 8, ["renderer"])
])
], 6)),
f(gt, {
name: t(o).ns("fade"),
appear: ""
}, {
default: I(() => [
he.value ? (m(), b("button", {
key: 0,
class: d([t(o).be("icon"), t(o).be("clear")]),
type: "button",
tabindex: "-1",
"aria-label": t(y).ariaLabel.clear,
onClick: l[6] || (l[6] = U((a) => xe(), ["stop"]))
}, [
f(t(L), Ct(Vt(t(S).clear)), null, 16)
], 10, Gt)) : t(n).loading ? (m(), b("div", {
key: 1,
class: d([t(o).be("icon"), t(o).be("loading")])
}, [
f(t(L), se(t(S).loading, {
effect: t(n).loadingEffect || t(S).loading.effect,
icon: t(n).loadingIcon || t(S).loading.icon
}), null, 16, ["effect", "icon"])
], 2)) : w("", !0)
]),
_: 1
}, 8, ["name"])
], 42, qt),
f(t(Wt), {
ref_key: "popper",
ref: Z,
class: d([t(o).be("popper"), t(o).bs("vars")]),
visible: c.value,
to: t(pe),
transition: t(n).transitionName,
alive: t(n).popperAlive ?? !t(pe),
onClick: U(Ce, ["stop"]),
onBeforeEnter: l[16] || (l[16] = (a) => E.value = !0),
onBeforeLeave: l[17] || (l[17] = (a) => E.value = !0),
onAfterEnter: l[18] || (l[18] = (a) => E.value = !1),
onAfterLeave: l[19] || (l[19] = (a) => E.value = !1)
}, {
default: I(() => [
F("div", {
class: d({
[t(o).be("panel")]: !0,
[t(o).bem("panel", "vertical")]: t(n).shortcuts.length && (t(n).shortcutsPlacement === "top" || t(n).shortcutsPlacement === "bottom")
}),
"aria-labelledby": t(O)
}, [
t(n).shortcuts.length ? (m(), b("div", {
key: 0,
class: d([
t(o).be("list"),
t(o).bem("list", "sub"),
t(o).be("shortcuts"),
t(o).bem("shortcuts", t(n).shortcutsPlacement)
])
}, [
(m(!0), b(Te, null, xt(t(n).shortcuts, (a, s) => (m(), b("div", {
key: s,
class: d(t(o).be("shortcut")),
title: a.name,
onClick: (A) => st(s)
}, ie(a.name), 11, Qt))), 128))
], 2)) : w("", !0),
F("div", {
class: d(t(o).be("list"))
}, [
F("div", {
class: d(t(o).be("wheels"))
}, [
f(Ne, {
hour: t(r).timeValue.hour,
"onUpdate:hour": l[8] || (l[8] = (a) => t(r).timeValue.hour = a),
minute: t(r).timeValue.minute,
"onUpdate:minute": l[9] || (l[9] = (a) => t(r).timeValue.minute = a),
second: t(r).timeValue.second,
"onUpdate:second": l[10] || (l[10] = (a) => t(r).timeValue.second = a),
"no-arrow": t(n).noArrow,
candidate: t(n).candidate,
steps: t(n).steps,
pointer: t(n).pointer,
"disabled-time": t(V),
"no-transition": E.value,
onChange: ke,
onToggleCol: l[11] || (l[11] = (a) => T("start"))
}, null, 8, ["hour", "minute", "second", "no-arrow", "candidate", "steps", "pointer", "disabled-time", "no-transition"]),
t(n).range ? (m(), kt(Ne, {
key: 0,
hour: t(i).timeValue.hour,
"onUpdate:hour": l[12] || (l[12] = (a) => t(i).timeValue.hour = a),
minute: t(i).timeValue.minute,
"onUpdate:minute": l[13] || (l[13] = (a) => t(i).timeValue.minute = a),
second: t(i).timeValue.second,
"onUpdate:second": l[14] || (l[14] = (a) => t(i).timeValue.second = a),
"no-arrow": t(n).noArrow,
candidate: t(n).candidate,
steps: t(n).steps,
pointer: t(n).pointer,
"disabled-time": t(V),
"no-transition": E.value,
onChange: ke,
onToggleCol: l[15] || (l[15] = (a) => T("end"))
}, null, 8, ["hour", "minute", "second", "no-arrow", "candidate", "steps", "pointer", "disabled-time", "no-transition"])) : w("", !0)
], 2),
t(n).noAction ? w("", !0) : (m(), b("div", {
key: 0,
class: d(t(o).be("action"))
}, [
f(t(Re), {
inherit: "",
text: "",
size: "small",
onClick: U(le, ["stop"])
}, {
default: I(() => [
Fe(ie(t(n).cancelText || t(y).cancel), 1)
]),
_: 1
}),
f(t(Re), {
inherit: "",
type: "primary",
size: "small",
disabled: W.value || K.value,
onClick: U(ne, ["stop"])
}, {
default: I(() => [
Fe(ie(t(n).confirmText || t(y).confirm), 1)
]),
_: 1
}, 8, ["disabled"])
], 2))
], 2)
], 10, Jt)
]),
_: 1
}, 8, ["class", "visible", "to", "transition", "alive"])
], 10, Kt));
}
});
export {
Cn as default
};
//# sourceMappingURL=time-picker.vue2.mjs.map