133 lines
3.3 KiB
JavaScript
133 lines
3.3 KiB
JavaScript
import { computed, defineComponent, createVNode as _createVNode } from "vue";
|
|
import { makeNumberProp, createNamespace, makeRequiredProp } from "../utils/index.mjs";
|
|
import { bem } from "./utils.mjs";
|
|
const [name] = createNamespace("calendar-day");
|
|
var stdin_default = defineComponent({
|
|
name,
|
|
props: {
|
|
item: makeRequiredProp(Object),
|
|
color: String,
|
|
index: Number,
|
|
offset: makeNumberProp(0),
|
|
rowHeight: String
|
|
},
|
|
emits: ["click", "clickDisabledDate"],
|
|
setup(props, {
|
|
emit,
|
|
slots
|
|
}) {
|
|
const style = computed(() => {
|
|
var _a;
|
|
const {
|
|
item,
|
|
index,
|
|
color,
|
|
offset,
|
|
rowHeight
|
|
} = props;
|
|
const style2 = {
|
|
height: rowHeight
|
|
};
|
|
if (item.type === "placeholder") {
|
|
style2.width = "100%";
|
|
return style2;
|
|
}
|
|
if (index === 0) {
|
|
style2.marginLeft = `${100 * offset / 7}%`;
|
|
}
|
|
if (color) {
|
|
switch (item.type) {
|
|
case "end":
|
|
case "start":
|
|
case "start-end":
|
|
case "multiple-middle":
|
|
case "multiple-selected":
|
|
style2.background = color;
|
|
break;
|
|
case "middle":
|
|
style2.color = color;
|
|
break;
|
|
}
|
|
}
|
|
if (offset + (((_a = item.date) == null ? void 0 : _a.getDate()) || 1) > 28) {
|
|
style2.marginBottom = 0;
|
|
}
|
|
return style2;
|
|
});
|
|
const onClick = () => {
|
|
if (props.item.type !== "disabled") {
|
|
emit("click", props.item);
|
|
} else {
|
|
emit("clickDisabledDate", props.item);
|
|
}
|
|
};
|
|
const renderTopInfo = () => {
|
|
const {
|
|
topInfo
|
|
} = props.item;
|
|
if (topInfo || slots["top-info"]) {
|
|
return _createVNode("div", {
|
|
"class": bem("top-info")
|
|
}, [slots["top-info"] ? slots["top-info"](props.item) : topInfo]);
|
|
}
|
|
};
|
|
const renderBottomInfo = () => {
|
|
const {
|
|
bottomInfo
|
|
} = props.item;
|
|
if (bottomInfo || slots["bottom-info"]) {
|
|
return _createVNode("div", {
|
|
"class": bem("bottom-info")
|
|
}, [slots["bottom-info"] ? slots["bottom-info"](props.item) : bottomInfo]);
|
|
}
|
|
};
|
|
const renderText = () => {
|
|
return slots.text ? slots.text(props.item) : props.item.text;
|
|
};
|
|
const renderContent = () => {
|
|
const {
|
|
item,
|
|
color,
|
|
rowHeight
|
|
} = props;
|
|
const {
|
|
type
|
|
} = item;
|
|
const Nodes = [renderTopInfo(), renderText(), renderBottomInfo()];
|
|
if (type === "selected") {
|
|
return _createVNode("div", {
|
|
"class": bem("selected-day"),
|
|
"style": {
|
|
width: rowHeight,
|
|
height: rowHeight,
|
|
background: color
|
|
}
|
|
}, [Nodes]);
|
|
}
|
|
return Nodes;
|
|
};
|
|
return () => {
|
|
const {
|
|
type,
|
|
className
|
|
} = props.item;
|
|
if (type === "placeholder") {
|
|
return _createVNode("div", {
|
|
"class": bem("day"),
|
|
"style": style.value
|
|
}, null);
|
|
}
|
|
return _createVNode("div", {
|
|
"role": "gridcell",
|
|
"style": style.value,
|
|
"class": [bem("day", type), className],
|
|
"tabindex": type === "disabled" ? void 0 : -1,
|
|
"onClick": onClick
|
|
}, [renderContent()]);
|
|
};
|
|
}
|
|
});
|
|
export {
|
|
stdin_default as default
|
|
};
|