UNPKG

@aurouscia/vue-lunar-date-select

Version:

vue3公历农历联动日期选择器

313 lines (312 loc) 9.98 kB
import { computed as B, defineComponent as de, ref as L, onBeforeMount as ve, createElementBlock as D, openBlock as x, Fragment as T, createElementVNode as S, withDirectives as I, renderList as V, unref as R, toDisplayString as U, vModelSelect as w } from "vue"; import { LunarYear as ee, SolarMonth as _e, LunarMonth as pe, SolarDay as E, LunarDay as he } from "tyme4ts"; function G(e) { if (typeof e == "string" || typeof e == "number") { const o = /* @__PURE__ */ new Date(), a = E.fromYmd(o.getFullYear(), o.getMonth() + 1, o.getDate()); if (typeof e == "number") return a.next(e); switch (e) { case "today": return a; case "tomorrow": return a.next(1); case "yesterday": return a.next(-1); } } else return e instanceof Date ? E.fromYmd(e.getFullYear(), e.getMonth() + 1, e.getDate()) : e instanceof E ? e : E.fromYmd(...e); } function ye(e, o) { const a = G(e), i = G(o), h = a.getLunarDay(), u = i.getLunarDay(); function O(f) { const l = [], _ = f === "solar" ? a : h, g = f === "solar" ? i : u; for (let s = _.getYear(); s <= g.getYear(); s++) l.push(s); return c(l), l; } function M(f, l) { if (l == null) return []; if (f == "solar") { const _ = a.getYear(), g = i.getYear(); let s = 1, m = 12; l == _ && (s = a.getMonth()), l == g && (m = i.getMonth()); const d = []; for (let v = s; v <= m; v++) d.push(v); return c(d), d; } else { const _ = h.getYear(), g = u.getYear(), s = ee.fromYear(l).getMonths(); let m = 0, d = s.length - 1; l == _ && (m = h.getLunarMonth().getIndexInYear()), l == g && (d = u.getLunarMonth().getIndexInYear()); const v = s.slice(m, d + 1).map((p) => p.getMonthWithLeap()); return c(v), v; } } function r(f, l, _) { if (l == null || _ == null) return []; if (f == "solar") { const g = a.getYear(), s = i.getYear(), m = a.getMonth(), d = i.getMonth(), v = _e.fromYm(l, _).getDayCount(); let p = 1, C = v; l == g && _ == m && (p = a.getDay()), l == s && _ == d && (C = i.getDay()); const y = []; for (let F = p; F <= C; F++) y.push(F); return c(y), y; } else { const g = h.getYear(), s = u.getYear(), m = h.getLunarMonth().getMonthWithLeap(), d = u.getLunarMonth().getMonthWithLeap(), v = pe.fromYm(l, _).getDayCount(); let p = 1, C = v; l == g && _ == m && (p = h.getDay()), l == s && _ == d && (C = u.getDay()); const y = []; for (let F = p; F <= C; F++) y.push(F); return c(y), y; } } function c(f) { f.length === 0 && console.error("请检查可选范围设置是否正确"); } return { getYearsOptions: O, getMonthsOptions: M, getDaysOptions: r }; } function q(e, o) { if (o.length == 0) return { clamped: e ?? 1 }; if (e == null) return { clamped: o[0], exceeded: "min" }; if (o.includes(e)) return { clamped: e }; const a = Math.abs(e); if (o.includes(a)) return { clamped: a }; const i = Math.abs(o[o.length - 1]); return a > i ? { clamped: o[o.length - 1], exceeded: "max" } : { clamped: o[0], exceeded: "min" }; } function Me(e, o) { const a = o[0], i = o[1], h = o[2]; let u = e[0]; const O = q(u, a()); if (u = O.clamped, O.exceeded) { const f = A(i(u), O.exceeded), l = A(h(u, f), O.exceeded); return [u, f, l]; } let M = e[1]; const r = q(M, i(u)); if (M = r.clamped, r.exceeded) { const f = A(h(u, M), r.exceeded); return [u, M, f]; } let c = e[2]; return c = q(c, h(u, M)).clamped, [u, M, c]; } function A(e, o) { return e.length == 0 ? 1 : o == "min" ? e[0] : e[e.length - 1]; } function Ye(e) { function o(r, c) { return { num: r, text: c }; } const a = B(() => e.s_y_o.value.map((r) => o(r, r + " 年"))), i = B(() => e.s_m_o.value.map((r) => { const c = r < 10 ? "0" + r : r; return o(r, c + " 月"); })), h = B(() => e.s_d_o.value.map((r) => { const c = r < 10 ? "0" + r : r; return o(r, c + " 日"); })), u = B(() => e.l_y_o.value.map((r) => { const f = ee.fromYear(r).getSixtyCycle().toString(); return o(r, `${r} ${f}年`); })), O = B(() => e.l_m_o.value.map((r) => o(r, `${De(r)}月`))), M = B(() => e.l_d_o.value.map((r) => o(r, xe(r)))); return { s_y_o_full: a, s_m_o_full: i, s_d_o_full: h, l_y_o_full: u, l_m_o_full: O, l_d_o_full: M }; } function De(e) { let o = ""; return e < 0 && (o += "闰", e = -e), e == 1 ? o += "正" : e <= 10 && (o += k(e)), e === 11 && (o += "冬"), e === 12 && (o += "腊"), o; } function xe(e) { return e <= 10 ? "初" + k(e) : e < 20 ? "十" + k(e - 10) : e == 20 ? "二十" : e < 30 ? "廿" + k(e - 20) : "三十"; } function k(e) { return ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"][e]; } const Ce = ["value"], Le = ["value"], Oe = ["value"], Fe = ["value"], Se = ["value"], Te = ["value"], Be = /* @__PURE__ */ de({ __name: "LunarDateSelect", props: { rangeFrom: {}, rangeTo: {}, init: {} }, emits: ["changed"], setup(e, { expose: o, emit: a }) { const i = e, { getYearsOptions: h, getMonthsOptions: u, getDaysOptions: O } = ye(i.rangeFrom, i.rangeTo), M = L([2e3]), r = L([1]), c = L([1]), f = L([2e3]), l = L([1]), _ = L([1]), g = L(2e3), s = L(1), m = L(1), d = L(2e3), v = L(1), p = L(1); function C(Y, n) { if (Y === "solar") { y(Y, n); const t = E.fromYmd(g.value, s.value, m.value).getLunarDay(); d.value = t.getYear(), v.value = t.getMonth(), p.value = t.getDay(), y("lunar"); } else { y(Y, n); const t = he.fromYmd(d.value, v.value, p.value).getSolarDay(); g.value = t.getYear(), s.value = t.getMonth(), m.value = t.getDay(), y("solar"); } j(); } function y(Y, n) { if (n === "d") return; const t = !n, Q = n === "y" || t, ue = n === "m" || Q, b = Y === "solar", se = b ? M : f, ce = b ? r : l, ie = b ? c : _, N = b ? g : d, z = b ? s : v, X = b ? m : p, fe = () => { if (t) { const $ = h(Y); return se.value = $, $; } return []; }, ge = ($) => { if (Q) { const W = u(Y, $ ?? N.value); return ce.value = W, W; } return []; }, me = ($, W) => { if (ue) { const Z = O(Y, $ ?? N.value, W ?? z.value); return ie.value = Z, Z; } return []; }, H = Me( [N.value, z.value, X.value], [fe, ge, me] ); N.value = H[0], z.value = H[1], X.value = H[2]; } const { s_y_o_full: F, s_m_o_full: te, s_d_o_full: ne, l_y_o_full: oe, l_m_o_full: re, l_d_o_full: le } = Ye({ s_y_o: M, s_m_o: r, s_d_o: c, l_y_o: f, l_m_o: l, l_d_o: _ }); function J() { return [g.value, s.value, m.value]; } let P = ""; function j(Y) { const n = J(); let t = n.join("-"); if (Y) { P = t; return; } t !== P && (P = t, ae("changed", n)); } const ae = a; function K(Y = !1) { const n = G(i.init ?? "today"); g.value = n.getYear(), s.value = n.getMonth(), m.value = n.getDay(), Y && j("init"), y("solar"), j(); const t = n.getLunarDay(); d.value = t.getYear(), v.value = t.getMonth(), p.value = t.getDay(), y("lunar"); } return ve(() => { K(!0); }), o({ initByProps: () => K(), getEmitData: J }), (Y, n) => (x(), D(T, null, [ S("div", null, [ I(S("select", { "onUpdate:modelValue": n[0] || (n[0] = (t) => g.value = t), onChange: n[1] || (n[1] = (t) => C("solar", "y")) }, [ (x(!0), D(T, null, V(R(F), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Ce))), 256)) ], 544), [ [w, g.value] ]), I(S("select", { "onUpdate:modelValue": n[2] || (n[2] = (t) => s.value = t), onChange: n[3] || (n[3] = (t) => C("solar", "m")) }, [ (x(!0), D(T, null, V(R(te), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Le))), 256)) ], 544), [ [w, s.value] ]), I(S("select", { "onUpdate:modelValue": n[4] || (n[4] = (t) => m.value = t), onChange: n[5] || (n[5] = (t) => C("solar", "d")) }, [ (x(!0), D(T, null, V(R(ne), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Oe))), 256)) ], 544), [ [w, m.value] ]) ]), S("div", null, [ I(S("select", { "onUpdate:modelValue": n[6] || (n[6] = (t) => d.value = t), onChange: n[7] || (n[7] = (t) => C("lunar", "y")) }, [ (x(!0), D(T, null, V(R(oe), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Fe))), 256)) ], 544), [ [w, d.value] ]), I(S("select", { "onUpdate:modelValue": n[8] || (n[8] = (t) => v.value = t), onChange: n[9] || (n[9] = (t) => C("lunar", "m")) }, [ (x(!0), D(T, null, V(R(re), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Se))), 256)) ], 544), [ [w, v.value] ]), I(S("select", { "onUpdate:modelValue": n[10] || (n[10] = (t) => p.value = t), onChange: n[11] || (n[11] = (t) => C("lunar", "d")) }, [ (x(!0), D(T, null, V(R(le), (t) => (x(), D("option", { value: t.num }, U(t.text), 9, Te))), 256)) ], 544), [ [w, p.value] ]) ]) ], 64)); } }); export { k as ChineseNumberChar, xe as ChineseNumberDayOfMonth, De as ChineseNumberMonth, Be as default };