calendar-vue-next
Version:
一款高效、简洁、功能丰富、宽度可自适应的 pc 端考勤日历插件
352 lines (351 loc) • 17.1 kB
JavaScript
import { defineComponent as P, ref as g, onMounted as x, onUnmounted as V, openBlock as d, createBlock as X, Transition as J, withCtx as q, createElementBlock as h, createElementVNode as v, toDisplayString as p, createCommentVNode as b, h as z, createApp as W, computed as Z, watch as I, normalizeClass as f, normalizeStyle as y, createTextVNode as Q, Fragment as T, renderList as j } from "vue";
const A = {
birthdayImg: "data:image/png;base64,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",
sundayStart: !1,
// 默认是周一开始,周一或周天开始相应的位置也要改一下
MonthDays: 0,
// 一个月共几填=>计算数据集合的长度(你的日历共有几排=>每排肯定是七个,礼拜1-天),公式用:Math.ceil((当月总天数+当月第一天是礼拜几)/7)
startDay: 0,
// 当月第一天是礼拜几=>用于补足上月数据展示
endDay: 0,
// 当月最后一天是礼拜几=>用于补足下月数据展示
arrayPreNum: 0,
// 计算第一排需要补充上个月的天数(因为你本月一号有可能是周2等)
// 获取某个月的实际天数
getMonthDays(t) {
const r = t.getFullYear(), l = t.getMonth() + 1;
return new Date(r, l, 0).getDate();
},
init(t) {
const r = t.getFullYear(), l = t.getMonth();
this.startDay = new Date(r, l, 1).getDay();
const c = new Date(r, l + 1, 0);
return this.MonthDays = c.getDate(), this.endDay = c.getDay(), this.setArrayPreNum(), t;
},
strToDateObj(t) {
if (typeof t == "string" && (t = t.replace(/-/g, "/"), t = new Date(t), !(t instanceof Date && !isNaN(t.getTime()))))
throw "日期格式错误,格式为:YYYY-MM-DD";
return t;
},
// 计算第一排需要补充上个月的天数
setArrayPreNum() {
const t = this.startDay;
this.arrayPreNum = this.sundayStart ? t === 0 ? 7 : t : t === 0 ? 6 : t - 1;
},
//获取当前日期上个月或者下个月
resetprevOrNextDateObj(t, r = "next") {
const l = this.dateFormatStr(t).split("/"), c = parseInt(l[0]), n = parseInt(l[1]);
let s = c, o;
r === "next" ? (o = n + 1, o == 13 && (s += 1, o = 1)) : (o = n - 1, o == 0 && (s -= 1, o = 12));
const i = `${s}/${o}/01`;
return new Date(i);
},
// 上个月末尾的一些日期
getPrevMonthList(t) {
let r = [];
const l = this.arrayPreNum, c = this.resetprevOrNextDateObj(t, "prev"), n = this.getMonthDays(c) - l + 1;
for (let s = 0; s < l; s++) {
const o = n + s, i = `${c.getFullYear()}/${c.getMonth() + 1}/${o}`;
r.push({
id: o,
date: i,
isToday: !1,
whitchMonth: "prev"
});
}
return r;
},
// 下个月末尾的一些日期
getRightArr(t) {
let r = [];
const l = this.resetprevOrNextDateObj(t, "next"), c = this.MonthDays + this.arrayPreNum;
let n = 7 - c % 7;
c < 35 && (n += 7);
for (let s = 0; s < n; s++) {
const o = s + 1, i = `${l.getFullYear()}/${l.getMonth() + 1}/${o}`;
r.push({
id: o,
date: i,
isToday: !1,
whitchMonth: "next"
});
}
return r;
},
// format日期.date转string
dateFormatStr(t) {
return `${t.getFullYear()}/${t.getMonth() + 1}/${t.getDate()}`;
},
// 获取当月的天数数据
getThisMonthList(t) {
const r = [], l = this.MonthDays, c = t.getFullYear(), n = t.getMonth() + 1, s = this.dateFormatStr(/* @__PURE__ */ new Date());
for (let o = 1; o <= l; o++) {
const i = `${c}/${n}/${o}`;
r.push({
id: o,
date: i,
isToday: s === i,
whitchMonth: "current"
});
}
return r;
},
// 获取某月的列表 用于渲染
getMonthList(t) {
return t = this.init(t), [...this.getPrevMonthList(t), ...this.getThisMonthList(t), ...this.getRightArr(t)];
}
}, $ = /* @__PURE__ */ v("i", { class: "ivcufont ivcu-cw_1" }, null, -1), _ = [
$
], tt = { class: "cv-popover-contentBox" }, et = ["innerHTML"], ot = { key: 1 }, at = /* @__PURE__ */ P({
__name: "template",
props: {
obj: {}
},
emits: ["close"],
setup(t, { emit: r }) {
const l = g(!0), c = r, n = () => {
console.log("click"), l.value = !1, document.removeEventListener("keyup", s), c("close");
}, s = (o) => {
o.code == "Escape" && n();
};
return x(() => {
document.addEventListener("keyup", s);
}), V(() => {
n();
}), (o, i) => (d(), X(J, {
name: "fade",
appear: ""
}, {
default: q(() => [
l.value ? (d(), h("div", {
key: 0,
class: "cv-popover-ivContainer",
onKeyup: n
}, [
v("button", {
class: "cv-popover-ivCloseBtn",
onClick: n
}, _),
v("div", tt, [
o.obj.renderHtml ? (d(), h("div", {
key: 0,
innerHTML: o.obj.markContent
}, null, 8, et)) : (d(), h("p", ot, p(o.obj.markContent), 1))
])
], 32)) : b("", !0)
]),
_: 1
}));
}
});
function rt() {
const t = g(null);
let r = null;
function l(s, o) {
const i = z(
at,
{
obj: o,
onClose: () => {
console.log("emit"), n();
}
}
);
W({
render() {
return i;
}
}).mount(s);
}
const c = (s) => {
r = document.createElement("div"), l(r, s), document.body.appendChild(r);
}, n = () => {
r && setTimeout(() => {
document.body.removeChild(r), r = null;
}, 300);
};
return {
modalRef: t,
// 如果你需要在模板中访问这个 ref,可以返回它
showModal: c,
hideModal: n
};
}
const nt = { class: "cv-controlBox" }, lt = { class: "cv-contentBox" }, st = { class: "cv-main" }, ct = ["onMouseenter", "onClick"], ut = ["onClick"], it = ["src"], dt = ["onClick"], At = /* @__PURE__ */ P({
__name: "template",
props: {
min: { type: Boolean, default: !1 },
futureDisabled: { type: Boolean, default: !1 },
sundayStart: { type: Boolean, default: !1 },
titlebgColor: { default: "#f5f7fa" },
titleColor: { default: "#333333" },
weeklabelColor: { default: "#9da5b1" },
arrowColor: { default: "#4b7df6" },
itembgColor: { default: "#fff" },
itemlabelColor: { default: "#333333" },
birthdayImg: { default: A.birthdayImg },
birthdaybgColor: { default: "#FFF5E7" },
birthdaylabelColor: { default: "#333333" },
crrentdaybgColor: { default: "#4b7df6" },
crrentdaylabelColor: { default: "#fff" },
clickdaybgColor: { default: "rgba(51, 51, 51,0.8)" },
clickdaylabelColor: { default: "#fff" },
hoverbgColor: { default: "#4b7df6" },
hoverlabelColor: { default: "#fff" },
prevColor: { default: "#cccccc" },
nextColor: { default: "#cccccc" },
markArr: { default: () => [] },
birthdayArr: { default: () => [] }
},
emits: ["onclickdate", "onchangemonth"],
setup(t, { expose: r, emit: l }) {
const { showModal: c } = rt(), n = t, s = Z(() => {
let e = !1;
if (n.futureDisabled) {
const u = (/* @__PURE__ */ new Date()).getFullYear() + "." + (/* @__PURE__ */ new Date()).getMonth(), a = A.strToDateObj(o.value);
e = a.getFullYear() + "." + a.getMonth() >= u;
}
return e;
}), o = g(/* @__PURE__ */ new Date()), i = g(null), B = g(["一", "二", "三", "四", "五", "六"]), M = g(["一", "二", "三", "四", "五", "六"]), D = g([]), k = g(null), O = l, w = () => {
D.value = A.getMonthList(o.value), N(), E();
}, N = () => {
D.value.forEach((e) => {
e.mark = !1;
let u = n.markArr.find(
(a) => A.dateFormatStr(new Date(a.date)) === A.dateFormatStr(new Date(e.date))
);
u && Object.assign(e, u, { mark: !0 });
});
}, E = () => {
D.value.forEach((e) => {
const u = n.birthdayArr.some((a) => A.dateFormatStr(new Date(a)) === e.date);
Object.assign(e, { isBirthday: u });
});
}, L = (e) => {
if (e === "next" && n.futureDisabled && s.value)
return;
const u = o.value;
o.value = A.resetprevOrNextDateObj(u, e), O("onchangemonth", {
day1: o.value,
type: e
}), w();
}, K = (e) => {
o.value = A.strToDateObj(e), w();
}, R = (e) => {
o.value = A.strToDateObj(e), i.value = A.dateFormatStr(o.value), w();
}, F = (e) => {
c(e);
}, H = (e) => {
const u = e.date;
i.value = u, console.log(e.whitchMonth), !(n.futureDisabled && s.value) && (e.whitchMonth != "current" && K(u), O("onclickdate", e));
}, Y = (e) => `${e.getFullYear()}年-${e.getMonth() + 1}月`, G = () => {
const e = n.sundayStart;
A.sundayStart = e, e ? M.value = ["日", ...B.value] : M.value = [...B.value, "日"], o.value = A.strToDateObj(o.value), w();
}, S = I(
() => n.markArr,
() => {
N();
}
), U = I(
() => n.markArr,
() => {
E();
}
);
return G(), V(() => {
S(), U();
}), r({
jumpToDay: R
}), (e, u) => (d(), h("div", {
class: f(["vue-calendar-ui", { "vue-calendar-small": e.min }])
}, [
v("div", nt, [
v("div", {
class: "cv-title",
style: y({ color: e.titleColor })
}, [
Q(p(Y(o.value)) + " ", 1),
v("i", {
class: f(["ivcufont ivcu-arrowrightcircleyouyuanjiantou cv-arrowRight", { "cv-arrow-disabled": s.value }]),
style: y({ color: e.arrowColor }),
onClick: u[0] || (u[0] = (a) => L("next"))
}, null, 6),
v("i", {
class: "ivcufont ivcu-arrowleftcirclezuoyuanjiantou cv-arrowLeft",
style: y({ color: e.arrowColor }),
onClick: u[1] || (u[1] = (a) => L("prev"))
}, null, 4)
], 4)
]),
v("div", lt, [
v("ul", {
class: "cv-top",
style: y({ color: e.weeklabelColor })
}, [
(d(!0), h(T, null, j(M.value, (a, C) => (d(), h("li", {
key: C,
class: "cv-label"
}, p(a), 1))), 128))
], 4),
v("ul", st, [
(d(!0), h(T, null, j(D.value, (a, C) => (d(), h("li", {
class: f(["cv-item", {
"cv-prev": a.whitchMonth === "prev",
"cv-next": a.whitchMonth === "next"
}]),
key: C
}, [
v("div", {
class: f(["cv-date", {
"cv-today": a.isToday
}]),
style: y({
"background-color": a.isBirthday ? e.birthdaybgColor : a.isToday ? e.crrentdaybgColor : a.date === i.value ? e.clickdaybgColor : C === k.value ? e.hoverbgColor : e.itembgColor,
color: a.isBirthday ? e.birthdaylabelColor : a.isToday ? e.crrentdaylabelColor : a.date === i.value ? e.clickdaylabelColor : C === k.value ? e.hoverlabelColor : a.whitchMonth === "prev" ? e.prevColor : a.whitchMonth === "next" ? e.nextColor : e.itemlabelColor
}),
onMouseenter: (m) => k.value = C,
onMouseleave: u[2] || (u[2] = (m) => k.value = null),
onClick: (m) => H(a)
}, [
Q(p(a.id) + " ", 1),
a.mark && a.userPopover ? (d(), h("span", {
key: 0,
class: "cv-click-Box",
onClick: (m) => F(a)
}, null, 8, ut)) : b("", !0),
a.isBirthday ? (d(), h("img", {
key: 1,
class: "cv-today-birthday",
src: e.birthdayImg,
alt: ""
}, null, 8, it)) : b("", !0)
], 46, ct),
a.mark ? (d(), h("span", {
key: 0,
class: f(["cv-circle", { "cv-circle-label": a.isLabel }]),
style: y({ "background-color": a.color, color: a.color })
}, [
Q(p(a.isLabel ? a.label : null) + " ", 1),
a.mark && a.userPopover ? (d(), h("span", {
key: 0,
class: "cv-click-Box",
onClick: (m) => F(a)
}, null, 8, dt)) : b("", !0)
], 6)) : b("", !0)
], 2))), 128))
])
])
], 2));
}
}), ht = (t, r) => {
const l = t.__vccOpts || t;
for (const [c, n] of r)
l[c] = n;
return l;
}, vt = /* @__PURE__ */ ht(At, [["__scopeId", "data-v-87ce9da6"]]);
function Ct(t) {
t.component("Calendar", vt);
}
export {
Ct as default
};