ag-element-ui/packages/agDatePicker/src/index.vue

284 lines
7.6 KiB
Vue
Raw Normal View History

2024-07-05 15:42:19 +08:00
<template>
<el-date-picker
2024-07-08 13:52:52 +08:00
:style="{ width }"
2024-07-08 17:19:16 +08:00
:prefix-icon="iconClass"
2024-07-09 10:36:44 +08:00
clear-icon="ag-icon-clear"
2024-07-05 15:42:19 +08:00
v-model="dateArr"
v-bind="attrs"
2024-07-13 18:10:18 +08:00
v-on="Listeners"
2024-07-08 17:19:16 +08:00
@mouseenter.native="mousetrue = true"
@mouseleave.native="mousetrue = false"
2024-07-05 15:42:19 +08:00
/>
</template>
<script>
/**
* agDatePicker 时间选择器
*/
import isEmpty from "../../../src/utils/isEmpty";
export default {
name: "agDatePicker",
props: {
value: {
2024-07-13 18:10:18 +08:00
default: "",
2024-07-05 15:42:19 +08:00
},
},
data() {
return {
2024-07-08 13:52:52 +08:00
width: "160px",
2024-07-13 18:10:18 +08:00
dateArr: "",
2024-07-08 17:19:16 +08:00
date_picker: false,
mousetrue: true,
2024-07-05 15:42:19 +08:00
};
},
computed: {
attrs() {
2024-07-13 18:10:18 +08:00
let config = {};
if (this.$attrs.type === "daterange" || !this.$attrs.type) {
config = {
"start-placeholder": "开始日期",
"end-placeholder": "结束日期",
"range-separator": "-",
"picker-options": {
disabledDate(time) {
return (
time.getTime() >
new Date(new Date().toLocaleDateString()).getTime() +
2024-07-05 15:42:19 +08:00
24 * 60 * 60 * 1000 -
2024-07-13 18:10:18 +08:00
1
);
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
shortcuts: [
{
text: "本月",
onClick(picker) {
const end =
new Date(new Date().toLocaleDateString()).getTime() +
24 * 60 * 60 * 1000 -
1;
const time = new Date();
time.setDate(1);
time.setHours(0);
time.setSeconds(0);
time.setMinutes(0);
var start = time.getTime();
picker.$emit("pick", [start, end]);
},
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
{
text: "近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
{
text: "近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
{
text: "近六个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 180);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一年",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 360);
picker.$emit("pick", [start, end]);
},
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
],
}, //多选日期
};
} else {
config = {
align: "right",
placeholder: "选择日期",
"picker-options": {
disabledDate(time) {
return time.getTime() > Date.now();
2024-07-05 15:42:19 +08:00
},
2024-07-13 18:10:18 +08:00
shortcuts: [
{
text: "近一周",
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 7 * 24 * 60 * 60 * 1000);
picker.$emit("pick", date);
},
},
{
text: "近一个月",
onClick(picker) {
const date = new Date();
date.setMonth(date.getMonth() - 1);
picker.$emit("pick", date);
},
},
{
text: "近三个月",
onClick(picker) {
const date = new Date();
date.setMonth(date.getMonth() - 3);
picker.$emit("pick", date);
},
},
{
text: "近六个月",
onClick(picker) {
const date = new Date();
date.setMonth(date.getMonth() - 6);
picker.$emit("pick", date);
},
},
{
text: "近一年",
onClick(picker) {
const date = new Date();
date.setFullYear(date.getFullYear() - 1);
picker.$emit("pick", date);
},
},
],
},
};
}
return {
size: "small",
type: "daterange",
format: "yyyy-MM-dd",
"value-format": "yyyy-MM-dd",
...config,
2024-07-05 15:42:19 +08:00
...this.$attrs,
};
},
// 所有父级事件
2024-07-13 18:10:18 +08:00
Listeners() {
2024-07-05 15:42:19 +08:00
return Object.assign({}, this.$listeners, {
input: (value) => {
2024-07-13 18:10:18 +08:00
if (this.attrs.type === "daterange") {
if (!isEmpty(value) && value.length === 2 && value[0] && value[1]) {
this.$emit("input", [
`${value[0]} 00:00:00`,
`${value[1]} 23:59:59`,
]);
} else {
this.$emit("input", []);
}
} else {
this.$emit("input", value);
2024-07-05 15:42:19 +08:00
}
},
});
},
2024-07-08 17:19:16 +08:00
iconClass() {
return this.date_picker && this.mousetrue
? "ag-icon-prefix-hide"
: "ag-icon-prefix-show";
},
2024-07-05 15:42:19 +08:00
},
watch: {
value: {
handler(newVal) {
2024-07-13 18:10:18 +08:00
if (this.attrs.type === "daterange") {
if (!Array.isArray(newVal)) {
throw new Error("agDatePicker date请传入数组");
}
const [date1, date2] = newVal.slice(0, 2);
2024-07-05 15:42:19 +08:00
this.dateArr = [date1 || "", date2 || ""];
2024-07-13 18:10:18 +08:00
} else {
this.dateArr = newVal;
2024-07-05 15:42:19 +08:00
}
},
immediate: true,
},
2024-07-08 17:19:16 +08:00
dateArr: {
handler(newVal) {
2024-07-13 18:10:18 +08:00
let defaultWidth = this.attrs.type === "daterange" ? "170px" : "140px";
if (this.attrs.type === "daterange") {
this.date_picker =
newVal &&
newVal.length > 0 &&
newVal.some((item) => item != null && item !== "");
this.width =
newVal &&
newVal.length > 0 &&
newVal.some((item) => item != null && item !== "")
? "205px"
: defaultWidth;
2024-07-08 17:19:16 +08:00
} else {
2024-07-13 18:10:18 +08:00
this.width = defaultWidth;
this.date_picker = !!newVal; // 使用逻辑非操作来转换newVal为布尔值
2024-07-08 17:19:16 +08:00
}
},
immediate: true,
deep: true,
},
},
2024-07-09 10:36:44 +08:00
methods: {},
2024-07-05 15:42:19 +08:00
};
</script>
2024-07-08 13:52:52 +08:00
<style lang="scss" scoped>
::v-deep {
2024-07-08 17:19:16 +08:00
[class*="ag-icon-"] {
2024-07-08 13:52:52 +08:00
font-family: element-icons !important;
speak: none;
font-style: normal;
font-weight: 400;
font-variant: normal;
text-transform: none;
line-height: 1;
vertical-align: baseline;
display: inline-block;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
2024-07-13 18:10:18 +08:00
.el-input__icon,
.ag-icon-prefix-show,
.ag-iconfont,
.ag-icon-clear {
2024-07-09 10:36:44 +08:00
position: absolute;
2024-07-13 18:10:18 +08:00
width: 16px !important;
2024-07-09 10:36:44 +08:00
font-size: 16px;
margin-left: -5px;
2024-07-13 18:10:18 +08:00
line-height: 1 !important;
right: 6px;
top: 1px;
2024-07-09 10:36:44 +08:00
z-index: 1;
}
2024-07-13 18:10:18 +08:00
.el-input__prefix {
position: absolute;
left: 98%;
}
2024-07-09 10:36:44 +08:00
.ag-icon-clear {
&:before {
content: "\e6db";
2024-07-08 13:52:52 +08:00
}
}
2024-07-08 17:19:16 +08:00
.ag-icon-prefix-show {
2024-07-08 13:52:52 +08:00
&:before {
content: "\e78e";
}
}
2024-07-08 17:19:16 +08:00
.ag-icon-prefix-hide {
display: none;
}
2024-07-08 13:52:52 +08:00
}
</style>