@aurouscia/vue-lunar-date-select
Version:
vue3公历农历联动日期选择器
313 lines (312 loc) • 9.98 kB
JavaScript
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
};