From 28a296a7ed0275c1fbe8f881f3280e7126b25a99 Mon Sep 17 00:00:00 2001 From: Jevin Date: Thu, 5 Sep 2024 18:32:50 +0800 Subject: [PATCH 01/45] refactor(datePicker): init component --- .../datePickerV2/component/YearPanel.vue | 5 + .../component/common/commonBlock.vue | 76 ++ .../datePickerV2/component/interface.ts | 17 + .../component/component/datePickerV2/day.ts | 111 +++ .../datePickerV2/hook/useDateCommon.ts | 30 + .../datePickerV2/hook/useDatePicker.ts | 59 ++ .../component/datePickerV2/index.less | 647 ++++++++++++++++++ .../component/component/datePickerV2/index.ts | 5 + .../component/datePickerV2/index.vue | 49 ++ .../component/datePickerV2/interface.ts | 84 +++ packages/component/index.ts | 2 + packages/component/types/common.ts | 3 + 12 files changed, 1088 insertions(+) create mode 100644 packages/component/component/datePickerV2/component/YearPanel.vue create mode 100644 packages/component/component/datePickerV2/component/common/commonBlock.vue create mode 100644 packages/component/component/datePickerV2/component/interface.ts create mode 100644 packages/component/component/datePickerV2/day.ts create mode 100644 packages/component/component/datePickerV2/hook/useDateCommon.ts create mode 100644 packages/component/component/datePickerV2/hook/useDatePicker.ts create mode 100644 packages/component/component/datePickerV2/index.less create mode 100644 packages/component/component/datePickerV2/index.ts create mode 100644 packages/component/component/datePickerV2/index.vue create mode 100644 packages/component/component/datePickerV2/interface.ts create mode 100644 packages/component/types/common.ts diff --git a/packages/component/component/datePickerV2/component/YearPanel.vue b/packages/component/component/datePickerV2/component/YearPanel.vue new file mode 100644 index 00000000..5c3efa95 --- /dev/null +++ b/packages/component/component/datePickerV2/component/YearPanel.vue @@ -0,0 +1,5 @@ + + + diff --git a/packages/component/component/datePickerV2/component/common/commonBlock.vue b/packages/component/component/datePickerV2/component/common/commonBlock.vue new file mode 100644 index 00000000..8bc75121 --- /dev/null +++ b/packages/component/component/datePickerV2/component/common/commonBlock.vue @@ -0,0 +1,76 @@ + + + diff --git a/packages/component/component/datePickerV2/component/interface.ts b/packages/component/component/datePickerV2/component/interface.ts new file mode 100644 index 00000000..fe6cd3cc --- /dev/null +++ b/packages/component/component/datePickerV2/component/interface.ts @@ -0,0 +1,17 @@ +import type { StyleValue } from "vue"; +import type { CommonSize, CommonClass } from "../../../types/common"; + +export interface CommonBlockProps { + name: string; + classes: CommonClass; + size: CommonSize; + disabled: boolean; + allowClear: boolean; + range: boolean; + rangeSeparator: string; + readonly: boolean; + prefixIcon?: string; + suffixIcon?: string; + contentClass?: CommonClass; + contentStyle?: StyleValue; +} diff --git a/packages/component/component/datePickerV2/day.ts b/packages/component/component/datePickerV2/day.ts new file mode 100644 index 00000000..9cadb13a --- /dev/null +++ b/packages/component/component/datePickerV2/day.ts @@ -0,0 +1,111 @@ +/** + * 获取年份列表 + * @param {Date | number} date 时间 + * @param {Number} page 页数 + * @param {Number} step 步进 + */ +const getYears = (date?: Date | number, page = 15, step = 1) => { + const years = []; + const y = typeof date === "number" ? date : date?.getFullYear() ?? 1970; + console.log(y, page, step); + const r = (page % 2 ? page - 1 : page) / 2; + for (let i = y - r; i <= y + r; i += step) { + years.push(i); + } + return years; +}; + +/** + * 获取当前日期 + */ +const getDate = (val = "") => { + if (val) { + return new Date(val); + } else { + return new Date(); + } +}; + +/** + * 获取当前年份 + */ +const getYear = (val = "") => { + return getDate(val).getFullYear(); +}; + +/** + * 获取当前月份 + */ +const getMonth = (val = "") => { + return getDate(val).getMonth(); +}; + +const getDay = (val = "") => { + if (val) { + return new Date(getDate(val).toDateString()).getTime(); + } else { + return -1; + } +}; + +/** + * 获取月份天数 + * + * @param year + * @param month + */ +const getDayLength = (year: number, month: number): number => { + return new Date(year, month + 1, 0).getDate(); +}; + +// 设置日期列表 +const setDateList = (year: number, month: number) => { + const curDays = getDayLength(year, month); // 当月天数 + const prevDays = getDayLength(year, month - 1); // 上月天数 + const curFirstDayWeek = new Date(year, month, 1).getDay(); // 当月第一天星期几 + const list: any[] = []; + // 填充上月天数 + for (let i = prevDays - curFirstDayWeek + 1; i <= prevDays; i++) { + list.push({ + day: i, + value: +new Date(year, month - 1, i), + isRange: false, + isSelected: false, + type: "prev", + }); + } + // 填充当月天数 + for (let i = 1; i <= curDays; i++) { + list.push({ + day: i, + value: +new Date(year, month, i), + isRange: false, + isSelected: false, + type: "current", + }); + } + // 填充下月天数 + const nextDays = 7 - (list.length % 7); + if (nextDays !== 7) { + for (let i = 1; i <= nextDays; i++) { + list.push({ + day: i, + value: +new Date(year, month + 1, i), + isRange: false, + isSelected: false, + type: "next", + }); + } + } + return list; +}; + +export { + getDayLength, + getYears, + getDate, + getMonth, + getYear, + getDay, + setDateList, +}; diff --git a/packages/component/component/datePickerV2/hook/useDateCommon.ts b/packages/component/component/datePickerV2/hook/useDateCommon.ts new file mode 100644 index 00000000..a92d7bfa --- /dev/null +++ b/packages/component/component/datePickerV2/hook/useDateCommon.ts @@ -0,0 +1,30 @@ +import type { DatePickerProps } from "../interface"; +import type { CommonBlockProps } from "../component/interface"; + +import { computed } from "vue"; + +export const useDateCommon = (props: DatePickerProps) => { + const commonBlockProps = computed(() => { + return { + name: props.name!, + classes: [ + "layui-date-picker", + { "layui-date-range-picker": props.range }, + ], + size: "md", + disabled: props.disabled!, + allowClear: props.allowClear!, + range: props.range!, + rangeSeparator: props.rangeSeparator!, + readonly: props.readonly!, + prefixIcon: props.prefixIcon, + suffixIcon: props.suffixIcon, + contentClass: props.contentClass!, + contentStyle: props.contentStyle!, + }; + }); + + return { + commonBlockProps, + }; +}; diff --git a/packages/component/component/datePickerV2/hook/useDatePicker.ts b/packages/component/component/datePickerV2/hook/useDatePicker.ts new file mode 100644 index 00000000..9cddde7f --- /dev/null +++ b/packages/component/component/datePickerV2/hook/useDatePicker.ts @@ -0,0 +1,59 @@ +import type { DatePickerProps, DatePickerEmits, TypeMap } from "../interface"; + +import { computed } from "vue"; +// import dayjs from "dayjs"; +import YearPanel from "../component/YearPanel.vue"; + +export const useDatePicker = ( + props: DatePickerProps, + emits: DatePickerEmits +) => { + const _modelValue = computed({ + get() { + return props.modelValue; + }, + set(val) { + return emits("update:modelValue", val as string | Array); + }, + }); + + const _format = computed(() => { + return props.format ?? typeMap.value.format; + }); + + const _inputFormat = computed(() => { + return props.inputFormat ?? typeMap.value.format; + }); + + // 类型映射 + const TYPE_MAP: TypeMap = { + date: { component: YearPanel, format: "YYYY-MM-DD" }, + datetime: { component: YearPanel, format: "YYYY-MM-DD HH:mm:ss" }, + year: { component: YearPanel, format: "YYYY" }, + month: { component: YearPanel, format: "MM" }, + time: { component: YearPanel, format: "HH:mm:ss" }, + yearmonth: { component: YearPanel, format: "YYYY-MM" }, + }; + + const renderComponentProps = computed(() => { + return { + ...props, + format: _format.value, + inputFormat: _inputFormat.value, + }; + }); + + const typeMap = computed(() => { + return TYPE_MAP[props.type!]; + }); + + const RenderComponent = computed(() => { + return typeMap.value.component; + }); + + return { + _modelValue, + RenderComponent, + renderComponentProps, + }; +}; diff --git a/packages/component/component/datePickerV2/index.less b/packages/component/component/datePickerV2/index.less new file mode 100644 index 00000000..09c43cdc --- /dev/null +++ b/packages/component/component/datePickerV2/index.less @@ -0,0 +1,647 @@ +@import "../dropdown/index.less"; +@import "../input/index.less"; + +@lg: 44px; +@md: 38px; +@sm: 32px; +@xs: 26px; +@lg-width: 260px; +@md-width: 220px; +@sm-width: 180px; +@xs-width: 140px; +@lg-range-width: 520px; +@md-range-width: 440px; +@sm-range-width: 360px; +@xs-range-width: 280px; + +.set-size(@size,@width) { + & { + width: @width; + height: @size; + .layui-input { + height: @size; + line-height: @size; + } + } +} + +.layui-date-picker { + &[size="lg"] { + .set-size(@lg,@lg-width); + } + &[size="md"] { + .set-size(@md,@md-width); + } + &[size="sm"] { + .set-size(@sm,@sm-width); + } + &[size="xs"] { + .set-size(@xs,@xs-width); + } +} +.layui-date-range-picker { + &[size="lg"] { + .set-size(@lg,@lg-range-width); + } + &[size="md"] { + .set-size(@md,@md-range-width); + } + &[size="sm"] { + .set-size(@sm,@sm-range-width); + } + &[size="xs"] { + .set-size(@xs,@xs-range-width); + } +} + +@font-face { + font-family: "laydate-icon"; + src: url("./font/iconfont.eot"); + src: url("./font/iconfont.eot#iefix") format("embedded-opentype"), + url("./font/iconfont.svg#iconfont") format("svg"), + url("./font/iconfont.woff") format("woff"), + url("./font/iconfont.ttf") format("truetype"); +} + +.laydate-icon { + font-family: "laydate-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +html #layuicss-laydate { + display: none; + position: absolute; + width: 1989px; +} + +/* 初始化 */ +.layui-laydate * { + margin: 0; + padding: 0; +} + +/* 主体结构 */ +.layui-laydate, +.layui-laydate * { + box-sizing: border-box; +} +.layui-laydate { + z-index: 66666666; + border-radius: var(--global-border-radius); + font-size: 14px; + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + + .layui-laydate-year-control { + padding: 4px; + } +} +.layui-laydate-main { + width: 272px; +} +.layui-laydate-header *, +.layui-laydate-content td, +.layui-laydate-list li { + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; +} + +/* 微微往下滑入 */ +@keyframes laydate-downbit { + 0% { + opacity: 0.3; + transform: translate3d(0, -5px, 0); + } + 100% { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +.layui-laydate { + animation-name: laydate-downbit; +} +.layui-laydate-static { + position: relative; + z-index: 0; + display: inline-block; + margin: 0; + -webkit-animation: none; + animation: none; +} + +/* 展开年月列表时 */ +.laydate-ym-show .laydate-prev-m, +.laydate-ym-show .laydate-next-m { + display: none !important; +} +.laydate-ym-show .laydate-prev-y, +.laydate-ym-show .laydate-next-y { + display: inline-block !important; +} +.laydate-ym-show .laydate-set-ym span[lay-type="month"] { + display: none !important; +} + +/* 展开时间列表时 */ +.laydate-time-show .layui-laydate-header .layui-icon, +.laydate-time-show .laydate-set-ym span[lay-type="year"], +.laydate-time-show .laydate-set-ym span[lay-type="month"] { + display: none !important; +} + +/* 头部结构 */ +.layui-laydate-header { + position: relative; + line-height: 30px; + padding: 10px 70px 5px; +} +.layui-laydate-header * { + vertical-align: bottom; +} +.layui-laydate-header i { + position: absolute; + top: 10px; + padding: 0 5px; + color: #999; + font-size: 12px; + cursor: pointer; + user-select: none; +} +.layui-laydate-header i.laydate-prev-y { + left: 15px; +} +.layui-laydate-header i.laydate-prev-m { + left: 45px; +} +.layui-laydate-header i.laydate-next-y { + right: 15px; +} +.layui-laydate-header i.laydate-next-m { + right: 45px; +} +.layui-laydate-year-panel-header { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + padding: 10px 14px 5px; + line-height: 30px; + border-bottom: 1px solid #e2e2e2; + + .laydate-set-ym { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + + i { + cursor: pointer; + user-select: none; + } + } +} +.laydate-set-ym { + width: 100%; + text-align: center; + box-sizing: border-box; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.laydate-set-ym span { + padding: 0 10px; + cursor: pointer; +} +.laydate-time-text { + cursor: default !important; +} + +/* 主体结构 */ +.layui-laydate-content { + position: relative; + padding: 10px; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.layui-laydate-content table { + border-collapse: collapse; + border-spacing: 0; +} +.layui-laydate-content th, +.layui-laydate-content td { + width: 36px; + height: 30px; + padding: 5px; + text-align: center !important; +} +.layui-laydate-content th { + font-weight: 400; +} +.layui-laydate-content td { + position: relative; + cursor: pointer; +} +.laydate-day-mark { + position: absolute; + left: 0; + top: 0; + width: 100%; + line-height: 30px; + font-size: 12px; + overflow: hidden; +} +.laydate-day-mark::after { + position: absolute; + content: ""; + right: 2px; + top: 2px; + width: 5px; + height: 5px; + border-radius: 50%; +} + +/* 底部结构 */ +.layui-laydate-footer { + position: relative; + height: 46px; + line-height: 26px; + padding: 10px; +} + +.layui-laydate-footer .laydate-footer-btns span { + border-radius: 0px; +} + +.layui-laydate-footer .laydate-footer-btns span:first-child { + border-top-left-radius: var(--global-border-radius); + border-bottom-left-radius: var(--global-border-radius); +} + +.layui-laydate-footer .laydate-footer-btns span:last-child { + border-top-right-radius: var(--global-border-radius); + border-bottom-right-radius: var(--global-border-radius); +} + +.layui-laydate-footer span { + display: inline-block; + vertical-align: top; + height: 26px; + line-height: 24px; + padding: 0 10px; + border: 1px solid #c9c9c9; + border-radius: 2px; + background-color: #fff; + font-size: 12px; + cursor: pointer; + white-space: nowrap; + transition: all 0.3s; +} +.layui-laydate-footer span:hover { + color: var(--global-primary-color); +} +.layui-laydate-footer span.layui-laydate-preview { + cursor: default; + border-color: transparent !important; +} +.layui-laydate-footer span.layui-laydate-preview:hover { + color: #666; +} +.layui-laydate-footer span:first-child.layui-laydate-preview { + padding-left: 0; +} +.laydate-footer-btns { + position: absolute; + right: 10px; + top: 10px; +} +.laydate-footer-btns span { + margin: 0 0 0 -1px; +} + +/* 年月列表 */ +.layui-laydate-list { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + padding: 10px; + box-sizing: border-box; + background-color: #fff; +} +.layui-laydate-list > li { + position: relative; + display: inline-block; + width: 33.3%; + height: 36px; + line-height: 36px; + margin: 3px 0; + vertical-align: middle; + text-align: center; + cursor: pointer; +} +.laydate-month-list > li { + width: 25%; + margin: 17px 0; +} +.laydate-time-list > li { + height: 100%; + margin: 0; + line-height: normal; + cursor: default; +} +.laydate-time-list p { + position: relative; + top: -4px; + line-height: 29px; +} +.laydate-time-list ol { + height: 181px; + overflow: hidden; +} +.laydate-time-list > li:hover ol { + overflow-y: auto; +} + +.laydate-time-list ol li { + width: 130%; + padding-left: 4px; + height: 30px; + line-height: 30px; + text-align: left; + cursor: pointer; +} + +/* 提示 */ +.layui-laydate-hint { + top: 115px; + left: 50%; + width: 250px; + margin-left: -125px; + line-height: 20px; + padding: 15px; + text-align: center; + font-size: 12px; + color: #ff5722; +} + +/* 双日历 */ +.layui-laydate-range { + min-width: 546px; +} +.layui-laydate-range .layui-laydate-main { + display: inline-block; + vertical-align: middle; +} +.layui-laydate-range .laydate-main-list-1 .layui-laydate-header, +.layui-laydate-range .laydate-main-list-1 .layui-laydate-content { + border-left: 1px solid #e2e2e2; +} + +/* 默认简约主题 */ +.layui-laydate, +.layui-laydate-hint { + background-color: #fff; + color: #666; +} +.layui-laydate-header { + border-bottom: 1px solid #e2e2e2; +} +.layui-laydate-header i:hover, +.layui-laydate-header span:hover { + color: #5fb878; +} +.layui-laydate-content { + border-top: none 0; + border-bottom: none 0; +} +.layui-laydate-content th { + color: #333; +} +.layui-laydate-content td { + color: #666; +} +.layui-laydate-content td.laydate-selected { + background-color: #b5fff8; +} +.laydate-selected:hover { + background-color: #00f7de !important; +} +.layui-laydate-content td:hover, +.layui-laydate-list li:hover { + background-color: #eee; + color: #333; +} +.laydate-time-list li ol { + margin: 0; + padding: 0; + border: 1px solid #e2e2e2; +} +.laydate-time-list li:first-child ol { + border-left-width: 1px; +} +.laydate-time-list > li:hover { + background: none; +} +.layui-laydate-content .laydate-day-prev, +.layui-laydate-content .laydate-day-next { + color: #d2d2d2; +} +.laydate-selected.laydate-day-prev, +.laydate-selected.laydate-day-next { + background-color: #f8f8f8 !important; +} +.layui-laydate-footer { + border-top: 1px solid #e2e2e2; +} +.layui-laydate-hint { + color: #ff5722; +} +.laydate-day-mark::after { + background-color: #5fb878; +} +.layui-laydate-content td.layui-this .laydate-day-mark::after { + display: none; +} +.layui-laydate-footer span[lay-type="date"] { + color: #5fb878; +} +.layui-laydate .layui-this { + background-color: var(--global-primary-color) !important; + color: #fff !important; +} + +.layui-laydate .laydate-disabled, +.layui-laydate .laydate-disabled:hover { + background: none !important; + color: #d2d2d2 !important; + cursor: not-allowed !important; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +/* 墨绿/自定义背景色主题 */ +.laydate-theme-molv { + border: none; +} +.laydate-theme-molv.layui-laydate-range { + width: 548px; +} +.laydate-theme-molv .layui-laydate-main { + width: 274px; +} +.laydate-theme-molv .layui-laydate-header { + border: none; + background-color: #009688; +} +.laydate-theme-molv .layui-laydate-header i, +.laydate-theme-molv .layui-laydate-header span { + color: #f6f6f6; +} +.laydate-theme-molv .layui-laydate-header i:hover, +.laydate-theme-molv .layui-laydate-header span:hover { + color: #fff; +} +.laydate-theme-molv .layui-laydate-content { + border: 1px solid #e2e2e2; + border-top: none; + border-bottom: none; +} +.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content { + border-left: none; +} +.laydate-theme-molv .layui-laydate-footer { + border: 1px solid #e2e2e2; +} + +/* 格子主题 */ +.laydate-theme-grid .layui-laydate-content td, +.laydate-theme-grid .layui-laydate-content thead, +.laydate-theme-grid .laydate-year-list > li, +.laydate-theme-grid .laydate-month-list > li { + border: 1px solid #e2e2e2; +} +.laydate-theme-grid .laydate-selected, +.laydate-theme-grid .laydate-selected:hover { + background-color: #f2f2f2 !important; + color: #009688 !important; +} +.laydate-theme-grid .laydate-selected.laydate-day-prev, +.laydate-theme-grid .laydate-selected.laydate-day-next { + color: #d2d2d2 !important; +} +.laydate-theme-grid .laydate-year-list, +.laydate-theme-grid .laydate-month-list { + margin: 1px 0 0 1px; +} +.laydate-theme-grid .laydate-year-list > li, +.laydate-theme-grid .laydate-month-list > li { + margin: 0 -1px -1px 0; +} +.laydate-theme-grid .laydate-year-list > li { + height: 43px; + line-height: 43px; +} +.laydate-theme-grid .laydate-month-list > li { + height: 71px; + line-height: 71px; +} +.laydate-range-hover { + background-color: var(--global-neutral-color-2) !important; +} +.layui-laydate-content .layui-disabled:hover { + background-color: transparent !important; +} + +.laydate-range-inputs { + display: flex; + align-items: center; + height: 100%; + border-width: 1px; + box-sizing: border-box; + width: 100%; + border-style: solid; + overflow: hidden; + display: inline-flex; + border-color: var(--input-border-color); + border-radius: var(--input-border-radius); + &:hover { + border-color: #d2d2d2; + } + .range-separator { + margin: 0 5px; + color: var(--global-neutral-color-8); + background-color: transparent; + } + .layui-input-wrapper { + border: none; + box-sizing: border-box; + input { + text-align: center; + padding: 0; + } + } + .layui-input { + border: none; + } +} +.layui-laydate-range { + .laydate-set-ym { + overflow: visible; + white-space: nowrap; + } + .laydate-set-ym .layui-dropdown { + width: auto !important; + } + + .time-panel { + .layui-laydate-main { + width: 272px; + display: unset !important; + } + .layui-laydate-preview { + display: none; + } + } + .layui-laydate-content { + .laydate-year-list { + display: flex; + flex-wrap: wrap; + } + } + .layui-laydate-list { + display: flex; + flex-wrap: wrap; + } +} +.layui-laydate-range-datetime { + .layui-laydate-main { + width: 340px; + } +} +.layui-laydate-current { + background-color: var(--global-neutral-color-3); +} + +.laydate-time-list > li:hover ol::-webkit-scrollbar { + width: 0px; +} +.layui-laydate-content::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.layui-laydate-content::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: #eeeeee; +} +.layui-laydate-content::-webkit-scrollbar-thumb:hover { + background-color: #dddddd; +} diff --git a/packages/component/component/datePickerV2/index.ts b/packages/component/component/datePickerV2/index.ts new file mode 100644 index 00000000..f747fde1 --- /dev/null +++ b/packages/component/component/datePickerV2/index.ts @@ -0,0 +1,5 @@ +import { withInstall } from "../../utils"; +import Component from "./index.vue"; + +const component = withInstall(Component); +export default component; diff --git a/packages/component/component/datePickerV2/index.vue b/packages/component/component/datePickerV2/index.vue new file mode 100644 index 00000000..3ee038cb --- /dev/null +++ b/packages/component/component/datePickerV2/index.vue @@ -0,0 +1,49 @@ + + + diff --git a/packages/component/component/datePickerV2/interface.ts b/packages/component/component/datePickerV2/interface.ts new file mode 100644 index 00000000..cda39b64 --- /dev/null +++ b/packages/component/component/datePickerV2/interface.ts @@ -0,0 +1,84 @@ +import type { Ref, StyleValue, Component, DefineComponent } from "vue"; +import type { CommonSize, CommonClass } from "../../types/common"; + +export type DatePickerType = + | "date" + | "datetime" + | "year" + | "month" + | "time" + | "yearmonth"; + +export type TypeMap = { + [k in DatePickerType]: { + component: Component; + format: string; + }; +}; + +export type DatePickerModelValueSingleType = number | string | Date; + +export interface DatePickerProps { + name?: string; + modelValue?: + | DatePickerModelValueSingleType + | Array; + type?: DatePickerType; + disabled?: boolean; + readonly?: boolean; + placeholder?: string | string[]; + allowClear?: boolean; + simple?: boolean; + max?: string; + min?: string; + range?: boolean; + rangeSeparator?: string; + size?: CommonSize; + prefixIcon?: string; + suffixIcon?: string; + timestamp?: boolean; + format?: string; + inputFormat?: string; + defaultTime?: string | string[]; + contentStyle?: StyleValue; + contentClass?: CommonClass; + yearPage?: number; + yearStep?: number; +} + +export type DatePickerEmits = { + (e: "update:modelValue", value: string | Array): void; + (e: "change", value: string | Array): void; + (e: "blur", event: Event): void; + (e: "focus", event: Event): void; + (e: "clear"): void; +}; + +export type provideType = { + currentYear: Ref; + currentMonth: Ref; + currentDay: Ref; + dateValue: Ref; + hms: Ref; + type: string; + showPanel: Ref; + clear: Function; + now: Function; + ok: Function; + range: boolean; + rangeValue: { + first: string; + last: string; + hover: string; + firstTime: { hh: number; mm: number; ss: number }; + lastTime: { hh: number; mm: number; ss: number }; + }; + rangeSeparator: string; + simple: boolean; + timestamp: boolean; + max: Ref; + min: Ref; + defaultTime: string | string[]; + yearPage: Ref; + yearStep: Ref; +}; diff --git a/packages/component/index.ts b/packages/component/index.ts index 100b7e8e..77562e51 100644 --- a/packages/component/index.ts +++ b/packages/component/index.ts @@ -84,6 +84,7 @@ import LayException from "./component/exception/index"; import LayResult from "./component/result/index"; import LayFullscreen from "./component/fullscreen/index"; import LayDatePicker from "./component/datePicker/index"; +import LayDatePickerV2 from "./component/datePickerV2/index"; import LayTransition from "./component/transition/index"; import LayUpload from "./component/upload/index"; import LayRipple from "./component/ripple/index"; @@ -187,6 +188,7 @@ const components: Record = { LayFullscreen, LayConfigProvider, LayDatePicker, + LayDatePickerV2, LayTransition, LayUpload, LayRipple, diff --git a/packages/component/types/common.ts b/packages/component/types/common.ts new file mode 100644 index 00000000..bf9c011c --- /dev/null +++ b/packages/component/types/common.ts @@ -0,0 +1,3 @@ +export type CommonSize = "lg" | "md" | "sm" | "xs"; + +export type CommonClass = string | Array | object; -- Gitee From f43fbd289c22ed5c29df8d67be5603701c2d825b Mon Sep 17 00:00:00 2001 From: Jevin Date: Wed, 11 Sep 2024 18:55:43 +0800 Subject: [PATCH 02/45] chore: yaer month --- .../datePickerV2/component/Picker.vue | 92 ++ .../datePickerV2/component/YearPanel.vue | 5 - .../{commonBlock.vue => InputBlock.vue} | 70 +- .../datePickerV2/component/common/Month.vue | 151 ++ .../component/common/PanelFoot.vue | 45 + .../datePickerV2/component/common/Year.vue | 139 ++ .../datePickerV2/component/interface.ts | 30 +- .../datePickerV2/hook/useDateCommon.ts | 5 +- .../datePickerV2/hook/useDatePicker.ts | 32 +- .../component/datePickerV2/index.less | 1298 +++++++++-------- .../component/datePickerV2/index.vue | 33 +- .../component/datePickerV2/interface.ts | 3 +- 12 files changed, 1215 insertions(+), 688 deletions(-) create mode 100644 packages/component/component/datePickerV2/component/Picker.vue delete mode 100644 packages/component/component/datePickerV2/component/YearPanel.vue rename packages/component/component/datePickerV2/component/common/{commonBlock.vue => InputBlock.vue} (49%) create mode 100644 packages/component/component/datePickerV2/component/common/Month.vue create mode 100644 packages/component/component/datePickerV2/component/common/PanelFoot.vue create mode 100644 packages/component/component/datePickerV2/component/common/Year.vue diff --git a/packages/component/component/datePickerV2/component/Picker.vue b/packages/component/component/datePickerV2/component/Picker.vue new file mode 100644 index 00000000..4c2a21d0 --- /dev/null +++ b/packages/component/component/datePickerV2/component/Picker.vue @@ -0,0 +1,92 @@ + + + diff --git a/packages/component/component/datePickerV2/component/YearPanel.vue b/packages/component/component/datePickerV2/component/YearPanel.vue deleted file mode 100644 index 5c3efa95..00000000 --- a/packages/component/component/datePickerV2/component/YearPanel.vue +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/packages/component/component/datePickerV2/component/common/commonBlock.vue b/packages/component/component/datePickerV2/component/common/InputBlock.vue similarity index 49% rename from packages/component/component/datePickerV2/component/common/commonBlock.vue rename to packages/component/component/datePickerV2/component/common/InputBlock.vue index 8bc75121..3bc97cf4 100644 --- a/packages/component/component/datePickerV2/component/common/commonBlock.vue +++ b/packages/component/component/datePickerV2/component/common/InputBlock.vue @@ -1,14 +1,70 @@ @@ -21,6 +25,7 @@ import { useI18n } from "../../../../language"; export interface PanelFoot { showNow?: boolean; + showConfirm?: boolean; } defineOptions({ @@ -29,6 +34,7 @@ defineOptions({ const props = withDefaults(defineProps(), { showNow: true, + showConfirm: true, }); const { t } = useI18n(); diff --git a/packages/component/component/datePickerV2/component/common/InputBlock.vue b/packages/component/component/datePickerV2/component/common/InputBlock.vue index 3bc97cf4..7f50028c 100644 --- a/packages/component/component/datePickerV2/component/common/InputBlock.vue +++ b/packages/component/component/datePickerV2/component/common/InputBlock.vue @@ -1,30 +1,19 @@ diff --git a/packages/component/component/datePickerV2/component/common/Year.vue b/packages/component/component/datePickerV2/component/common/Year.vue index 28b71707..a37ae3f8 100644 --- a/packages/component/component/datePickerV2/component/common/Year.vue +++ b/packages/component/component/datePickerV2/component/common/Year.vue @@ -5,14 +5,14 @@
{{ yearRange.join(" - ") }}
@@ -37,62 +37,38 @@ - diff --git a/packages/component/component/datePickerV2/component/interface.ts b/packages/component/component/datePickerV2/component/interface.ts index 11c5b1db..f628ccbe 100644 --- a/packages/component/component/datePickerV2/component/interface.ts +++ b/packages/component/component/datePickerV2/component/interface.ts @@ -3,6 +3,7 @@ import type { DatePickerType, PanelPickerProps } from "../interface"; export interface BasePanelProps { modelValue: Dayjs; + inputDate: Dayjs; dateType: DatePickerType; } diff --git a/packages/component/component/datePickerV2/hook/useDatePicker.ts b/packages/component/component/datePickerV2/hook/useDatePicker.ts index 7e0fcf52..b495695a 100644 --- a/packages/component/component/datePickerV2/hook/useDatePicker.ts +++ b/packages/component/component/datePickerV2/hook/useDatePicker.ts @@ -25,12 +25,12 @@ export const useDatePicker = (props: RequiredDatePickerProps) => { if ( ["year", "month"].includes(props.type!) && isNumber(props.modelValue) && - (`${props.modelValue}`.length === 4 || - `${props.modelValue}`.length === 2) + `${props.modelValue}`.length <= 4 ) { value += ""; } - return dayjs(value || new Date()); + + return dayjs(value || new Date(), typeMap.value.format); } }); @@ -49,7 +49,7 @@ export const useDatePicker = (props: RequiredDatePickerProps) => { year: { component: DatePicker, format: "YYYY" }, month: { component: DatePicker, format: "M" }, yearmonth: { component: DatePicker, format: "YYYY-MM" }, - time: { component: YearPanel, format: "HH:mm:ss" }, + time: { component: DatePicker, format: "HH:mm:ss" }, }; const renderComponentProps = computed(() => { diff --git a/packages/component/component/datePickerV2/index.vue b/packages/component/component/datePickerV2/index.vue index c34eee69..6c551081 100644 --- a/packages/component/component/datePickerV2/index.vue +++ b/packages/component/component/datePickerV2/index.vue @@ -1,5 +1,8 @@ + + diff --git a/packages/component/component/datePickerV2/component/common/Date.vue b/packages/component/component/datePickerV2/component/common/Date.vue index de05467f..8c40ff24 100644 --- a/packages/component/component/datePickerV2/component/common/Date.vue +++ b/packages/component/component/datePickerV2/component/common/Date.vue @@ -85,8 +85,6 @@ const MONTH_NAME = computed(() => [ watch( () => props.modelValue, () => { - Day.value = dayjs(props.inputDate).startOf("day").valueOf(); //unix - Year.value = dayjs(props.modelValue).year(); Month.value = dayjs(props.modelValue).month(); @@ -97,6 +95,16 @@ watch( } ); +watch( + () => props.inputDate, + () => { + Day.value = dayjs(props.inputDate).startOf("day").valueOf(); //unix + }, + { + immediate: true, + } +); + const handleYearMonthChange = ( calc: "add" | "subtract", type: "year" | "month" diff --git a/packages/component/component/datePickerV2/component/common/InputBlock.vue b/packages/component/component/datePickerV2/component/common/InputBlock.vue index 2e093c3f..21c720bf 100644 --- a/packages/component/component/datePickerV2/component/common/InputBlock.vue +++ b/packages/component/component/datePickerV2/component/common/InputBlock.vue @@ -28,11 +28,10 @@ const classes = computed(() => { const dateValue = computed(() => { if (props.range) { - return (props.modelValue as Array).map( - (data) => { - return normalizeDayjsValue(data, props.format!).format(props.format); - } - ); + const modelValue = isArray(props.modelValue) ? props.modelValue : []; + return modelValue.map((data) => { + return normalizeDayjsValue(data, props.format!).format(props.format); + }); } else { if (!props.modelValue) return ""; @@ -65,6 +64,7 @@ function onPick(item: string | Date) { ref="dropdownRef" :disabled="disabled" :autoFitMinWidth="false" + :click-to-close="false" :contentClass="contentClass" :contentStyle="contentStyle" > diff --git a/packages/component/component/datePickerV2/component/common/Month.vue b/packages/component/component/datePickerV2/component/common/Month.vue index 9a50c184..007e418d 100644 --- a/packages/component/component/datePickerV2/component/common/Month.vue +++ b/packages/component/component/datePickerV2/component/common/Month.vue @@ -1,51 +1,55 @@ + + diff --git a/packages/component/component/datePickerV2/component/common/Year.vue b/packages/component/component/datePickerV2/component/common/Year.vue index 11eb696f..c6e2d6c4 100644 --- a/packages/component/component/datePickerV2/component/common/Year.vue +++ b/packages/component/component/datePickerV2/component/common/Year.vue @@ -2,19 +2,21 @@
- -
- - {{ yearRange.join(" - ") }} - -
- + + +
+ + {{ yearRange.join(" - ") }} + +
+ +
{{ item }} @@ -48,7 +52,6 @@ import dayjs from "dayjs"; import { computed, ref, watch, inject } from "vue"; import LayIcon from "../../../icon"; -import { useI18n } from "../../../../language"; import { DATE_PICKER_CONTEXT } from "../../interface"; import { getYears } from "../../day"; @@ -57,7 +60,7 @@ defineOptions({ }); const props = withDefaults(defineProps(), {}); -const emits = defineEmits(["pick"]); +const emits = defineEmits(["pick", "hover-cell"]); const DatePickerContext = inject(DATE_PICKER_CONTEXT)!; @@ -103,6 +106,14 @@ const handleYearClick = (item: number) => { } currentYear.value = item; - emits("pick", item); + emits("pick", DatePickerContext.range ? props.modelValue.year(item) : item); +}; + +const handleYearMouseenter = (item: number) => { + if (cellDisabled.value(item) || !DatePickerContext.range) { + return; + } + + emits("hover-cell", dayjs().year(item)); }; diff --git a/packages/component/component/datePickerV2/hook/useDatePicker.ts b/packages/component/component/datePickerV2/hook/useDatePicker.ts index f3e378b0..f63c969e 100644 --- a/packages/component/component/datePickerV2/hook/useDatePicker.ts +++ b/packages/component/component/datePickerV2/hook/useDatePicker.ts @@ -10,6 +10,7 @@ import { type Dayjs } from "dayjs"; import { computed } from "vue"; import DatePicker from "../component/DatePicker.vue"; import MonthRange from "../component/MonthRange.vue"; +import YearRange from "../component/YearRange.vue"; import { normalizeDayjsValue } from "../util"; import { isArray, isNumber } from "../../../utils"; @@ -60,7 +61,7 @@ export const useDatePicker = (props: RequiredDatePickerProps) => { const TYPE_MAP: TypeMap = { datetime: { component: DatePicker, format: "YYYY-MM-DD HH:mm:ss" }, date: { component: DatePicker, format: "YYYY-MM-DD" }, - year: { component: DatePicker, format: "YYYY" }, + year: { component: props.range ? YearRange : DatePicker, format: "YYYY" }, month: { component: props.range ? MonthRange : DatePicker, format: "M" }, yearmonth: { component: props.range ? MonthRange : DatePicker, -- Gitee From 15f10266c1c4d944077626dc4fac4db3127b8441 Mon Sep 17 00:00:00 2001 From: Jevin Date: Thu, 19 Sep 2024 19:16:47 +0800 Subject: [PATCH 11/45] docs: update --- docs/src/document/zh-CN/components/datePicker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/document/zh-CN/components/datePicker.md b/docs/src/document/zh-CN/components/datePicker.md index e780ac3b..7fbae553 100644 --- a/docs/src/document/zh-CN/components/datePicker.md +++ b/docs/src/document/zh-CN/components/datePicker.md @@ -412,8 +412,8 @@ export default { | default-time | 范围日期 `type=datetime` 时分秒默认时间 | `string` `Array` | -- | 例如`12:30:00` | `2.17.2` | | contentStyle | 内容自定义样式 | `StyleValue` | -- | -- | -- | | contentClass | 内容自定义 Class | `string` `Array` `object` | -- | -- | -- | -| yearPage | 年份选择器每页年份的个数 | `2.18.4` | `number` | `15` | -- | -| yearStep | 年份选择器年份的步进值 | `2.18.4` | `number` | `1` | -- | +| yearPage | 年份选择器每页年份的个数 | `2.19.0` | `number` | `15` | -- | +| yearStep | 年份选择器年份的步进值 | `2.19.0` | `number` | `1` | -- | ::: -- Gitee From 0a2179d41bcdd94e5c0e9f7fa44037baf867eb23 Mon Sep 17 00:00:00 2001 From: Jevin Date: Fri, 20 Sep 2024 11:30:29 +0800 Subject: [PATCH 12/45] feat: yearmonth/month year change --- .../datePickerV2/component/MonthRange.vue | 43 ++++++++++++++++--- .../datePickerV2/component/common/Month.vue | 2 +- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/component/component/datePickerV2/component/MonthRange.vue b/packages/component/component/datePickerV2/component/MonthRange.vue index 6b9ebe4c..83c50f54 100644 --- a/packages/component/component/datePickerV2/component/MonthRange.vue +++ b/packages/component/component/datePickerV2/component/MonthRange.vue @@ -6,7 +6,9 @@ import type { RangePickerProps } from "./interface"; import { useI18n } from "../../../language"; import LayIcon from "../../icon"; +import LayDropdown from "../../dropdown"; import Month from "./common/Month.vue"; +import Year from "./common/Year.vue"; import Footer from "./common/Footer.vue"; const props = withDefaults(defineProps(), {}); @@ -19,6 +21,9 @@ const endDate = ref(); const leftDate = ref(dayjs()); const rightDate = ref(dayjs()); +const yearLeftRef = ref>(); +const yearRightRef = ref>(); + const hoverMonth = ref(); watch( @@ -84,6 +89,16 @@ const handleMonthHover = (date: Dayjs) => { hoverMonth.value = date; }; +const handleLeftYearChange = (year: Dayjs) => { + leftDate.value = year; + yearLeftRef.value?.hide(); +}; + +const handleRightYearChange = (year: Dayjs) => { + leftDate.value = year.subtract(1, "year"); + yearRightRef.value?.hide(); +}; + const formatValue = () => { // format 正确传 format后的格式,否则传Date对象 if (startDate.value && endDate.value) { @@ -114,8 +129,15 @@ const handleConfirm = () => { type="layui-icon-prev" @click="leftDate = leftDate.subtract(1, 'year')" /> - {{ leftDate.year() }} {{ t("datePicker.year") }} - + + +
+ {{ leftDate.year() }} {{ t("datePicker.year") }} +
+ +
{ @hover-cell="handleMonthHover" > - ::: @@ -238,7 +197,7 @@ export default { ::: title 限制可选范围 ::: -::: demo 通过预设`min`、`max`属性限制组件选择的最大值与最小值,目前仅支持`date`、`year`、`month`、`time(不包含range)`模式,且无法在初始化时强制变更 modelValue,在未来的版本中将补齐这一特性并支持更多模式 +::: demo 通过预设`min`、`max`属性限制组件选择的最大值与最小值。 - ::: @@ -300,23 +246,77 @@ export default { ::: demo 目前在 type 等于`year`、`month`这类输出值为非组合值时无效,使用`format`属性任意组合吧 - ::: + +::: title 快捷选项 +::: + +::: demo 通过 `shortcuts` 在左侧添加快捷选项 + + + + + +::: + ::: title Date Picker 属性 ::: @@ -341,12 +341,14 @@ export default { | suffix-icon | 后置图标 | `string` | -- | 内置图标集 | `1.4.0` | | timestamp | 时间戳模式(13 位),仅对 date 和 datetime 有效 | `boolean` | `false` | `true` `false` | `1.6.5` | | format | 输出格式化 | `string` | -- | 例如`YYYY-MM-DD` | - | +| input-format | 输入框格式化 | `string` | -- | 例如`YYYY-MM-DD` | `2.19.0` | | default-value | `首次未点击` 时,下拉弹窗打开时默认显示的时间,传空为组件首次 `渲染时间` | `DatePickerModelValueSingleType` `Array` | -- | -- | `2.19.0` | | default-time | 范围日期 `type=datetime` 时分秒默认时间 | `string` `Array` | -- | 例如`12:30:00` | `2.17.2` | | content-style | 内容自定义样式 | `StyleValue` | -- | -- | -- | | content-class | 内容自定义 Class | `string` `Array` `object` | -- | -- | -- | -| year-page | 年份选择器每页年份的个数 | `2.19.0` | `number` | `15` | -- | -| year-step | 年份选择器年份的步进值 | `2.19.0` | `number` | `1` | -- | +| year-page | 年份选择器每页年份的个数 | `number` | `15` | --| `2.19.0` | +| shortcuts | 设置快捷选项,需要传入数组对象 | `Array` | `15` | --| `2.19.0` | + ::: @@ -364,10 +366,23 @@ export default { ::: +::: title Types + ```ts + import type { ConfigType } from "dayjs"; type DatePickerModelValueSingleType = ConfigType; + +interface Shortcuts { + text: string | number; + value: + | DatePickerModelValueSingleType + | Array + | (() => DatePickerModelValueSingleType) + | (() => Array); +} + ``` ::: previousNext datePicker diff --git a/packages/component/component/datePicker/component/interface.ts b/packages/component/component/datePicker/component/interface.ts index ee688b85..6c38cd9e 100644 --- a/packages/component/component/datePicker/component/interface.ts +++ b/packages/component/component/datePicker/component/interface.ts @@ -12,11 +12,13 @@ export interface BasePanelProps { classes?: (val: Dayjs) => Record; } -export interface UniquePickerProps extends DatePickerContextType { +export interface UniquePickerProps + extends /* @vue-ignore */ DatePickerContextType { modelValue: Exclude>; } -export interface RangePickerProps extends DatePickerContextType { +export interface RangePickerProps + extends /* @vue-ignore */ DatePickerContextType { modelValue: Array; } diff --git a/packages/component/component/datePicker/interface.ts b/packages/component/component/datePicker/interface.ts index 25a70210..4e0605f4 100644 --- a/packages/component/component/datePicker/interface.ts +++ b/packages/component/component/datePicker/interface.ts @@ -66,7 +66,8 @@ export interface DatePickerProps { static?: boolean; } -export interface RequiredDatePickerProps extends DatePickerProps { +export interface RequiredDatePickerProps + extends /* @vue-ignore */ DatePickerProps { size: CommonSize; type: DatePickerType; disabled: boolean; @@ -91,7 +92,8 @@ export type DatePickerEmits = { export type DatePickerValue = Dayjs | Array | null | undefined; -export interface DatePickerContextType extends RequiredDatePickerProps { +export interface DatePickerContextType + extends /* @vue-ignore */ RequiredDatePickerProps { modelValue: DatePickerValue; } @@ -103,10 +105,6 @@ export interface Shortcuts { value: | DatePickerModelValueSingleType | Array - | Date - | Array | (() => DatePickerModelValueSingleType) - | (() => Array) - | (() => Date) - | (() => Array); + | (() => Array); } -- Gitee From cec93347f2530287bb2b4e8250251760651b2d78 Mon Sep 17 00:00:00 2001 From: Jevin Date: Tue, 15 Oct 2024 19:56:22 +0800 Subject: [PATCH 39/45] fix: update --- .../document/zh-CN/components/datePicker.md | 23 ++++++++++++---- .../datePicker/component/DateRange.vue | 6 +---- .../datePicker/component/TimeRange.vue | 8 ------ .../component/common/InputBlock.vue | 5 +--- .../datePicker/component/interface.ts | 10 +++---- .../component/component/datePicker/index.less | 26 +++++++++---------- .../component/component/datePicker/index.vue | 2 +- .../component/datePicker/interface.ts | 18 ++++++------- 8 files changed, 46 insertions(+), 52 deletions(-) diff --git a/docs/src/document/zh-CN/components/datePicker.md b/docs/src/document/zh-CN/components/datePicker.md index 0172c3b1..3072d419 100644 --- a/docs/src/document/zh-CN/components/datePicker.md +++ b/docs/src/document/zh-CN/components/datePicker.md @@ -114,13 +114,12 @@ const endTimeDisabled = ref("2022-03-04 17:35:00"); ::: title 年份选择 ::: -::: demo 将 `type` 设置成 `"year"` 使用年份选择模式。可以用 `year-page` 指定每页展示年份的数量,用 `year-step` 指定生成年份的步进值。 +::: demo 将 `type` 设置成 `"year"` 使用年份选择模式。可以用 `year-page` 指定每页展示年份的数量。 @@ -138,19 +137,31 @@ const endTimeYearRange = ref("2022"); ::: demo 设置 `simple` 属性后,只需要点击一次后自动关闭,无需点击确认按钮。 @@ -158,11 +169,13 @@ const endTimeYearRange = ref("2022"); import { ref } from 'vue' const endTime = ref(null); -const endTime2 = ref(null); -const endTime3 = ref(null); +const endTimeRange = ref(null); const endTime4 = ref(null); +const endTime4Range = ref(null); const endTime5 = ref(null); +const endTime5Range = ref(null); const endTime6 = ref(null); +const endTime6Range = ref(null); ::: diff --git a/packages/component/component/datePicker/component/DateRange.vue b/packages/component/component/datePicker/component/DateRange.vue index 08324770..aed23ede 100644 --- a/packages/component/component/datePicker/component/DateRange.vue +++ b/packages/component/component/datePicker/component/DateRange.vue @@ -393,11 +393,7 @@ const handleConfirm = () => {
-
+
{{ startDate?.format(props.inputFormat) }} {{ props.rangeSeparator }} {{ endDate?.format(props.inputFormat) }} diff --git a/packages/component/component/datePicker/component/TimeRange.vue b/packages/component/component/datePicker/component/TimeRange.vue index fd7c1bfc..b6865372 100644 --- a/packages/component/component/datePicker/component/TimeRange.vue +++ b/packages/component/component/datePicker/component/TimeRange.vue @@ -41,12 +41,6 @@ watch( { immediate: true } ); -const handleTimePick = () => { - if (props.simple && startDate.value && endDate.value) { - handleConfirm(); - } -}; - const handleLeftTimePick = (date: Dayjs) => { if (date.isSameOrAfter(endDate.value)) { startDate.value = endDate.value; @@ -54,7 +48,6 @@ const handleLeftTimePick = (date: Dayjs) => { } else { startDate.value = date; } - handleTimePick(); }; const handleRightTimePick = (date: Dayjs) => { @@ -64,7 +57,6 @@ const handleRightTimePick = (date: Dayjs) => { } else { endDate.value = date; } - handleTimePick(); }; const handleChangeShortcut = (shortcuts: ShortcutsType) => { diff --git a/packages/component/component/datePicker/component/common/InputBlock.vue b/packages/component/component/datePicker/component/common/InputBlock.vue index f4ac53d5..8bae2856 100644 --- a/packages/component/component/datePicker/component/common/InputBlock.vue +++ b/packages/component/component/datePicker/component/common/InputBlock.vue @@ -31,7 +31,7 @@ const classes = computed(() => { "layui-date-picker", { "layui-date-range-picker": props.range, - "layui-date-picker-static": props.static, + // "layui-date-picker-static": props.static, }, ]; }); @@ -284,8 +284,5 @@ function onPick(dates: Dayjs | Array) { -
diff --git a/packages/component/component/datePicker/component/interface.ts b/packages/component/component/datePicker/component/interface.ts index 6c38cd9e..e30aefcf 100644 --- a/packages/component/component/datePicker/component/interface.ts +++ b/packages/component/component/datePicker/component/interface.ts @@ -12,15 +12,13 @@ export interface BasePanelProps { classes?: (val: Dayjs) => Record; } -export interface UniquePickerProps - extends /* @vue-ignore */ DatePickerContextType { +export type UniquePickerProps = DatePickerContextType & { modelValue: Exclude>; -} +}; -export interface RangePickerProps - extends /* @vue-ignore */ DatePickerContextType { +export type RangePickerProps = DatePickerContextType & { modelValue: Array; -} +}; export interface DateContentSingleDateObject { day: number; diff --git a/packages/component/component/datePicker/index.less b/packages/component/component/datePicker/index.less index 9560d9e7..2a0fb580 100644 --- a/packages/component/component/datePicker/index.less +++ b/packages/component/component/datePicker/index.less @@ -109,14 +109,14 @@ html #layuicss-laydate { .layui-laydate { animation-name: laydate-downbit; } -.layui-laydate-static { - position: relative; - z-index: 0; - display: inline-block; - margin: 0; - -webkit-animation: none; - animation: none; -} +// .layui-laydate-static { +// position: relative; +// z-index: 0; +// display: inline-block; +// margin: 0; +// -webkit-animation: none; +// animation: none; +// } /* 展开年月列表时 */ .laydate-ym-show .laydate-prev-m, @@ -694,8 +694,8 @@ html #layuicss-laydate { } } /* 静态面板 */ -.layui-date-picker-static { - width: auto !important; - height: 100% !important; - border: 1px solid var(--input-border-color); -} \ No newline at end of file +// .layui-date-picker-static { +// width: auto !important; +// height: 100% !important; +// border: 1px solid var(--input-border-color); +// } diff --git a/packages/component/component/datePicker/index.vue b/packages/component/component/datePicker/index.vue index a6d6a9ba..82252ab1 100644 --- a/packages/component/component/datePicker/index.vue +++ b/packages/component/component/datePicker/index.vue @@ -41,7 +41,7 @@ const props = withDefaults(defineProps(), { defaultTime: null, yearPage: 15, // yearStep: 1, - static: false, + // static: false, }); const { size } = useProps(props); diff --git a/packages/component/component/datePicker/interface.ts b/packages/component/component/datePicker/interface.ts index 4e0605f4..f0255099 100644 --- a/packages/component/component/datePicker/interface.ts +++ b/packages/component/component/datePicker/interface.ts @@ -59,15 +59,14 @@ export interface DatePickerProps { * @version 2.19.0 */ shortcuts?: Array; - /** - * 静态面板 - * @version 2.19.0 - */ - static?: boolean; + // /** + // * 静态面板 + // * @version 2.19.0 + // */ + // static?: boolean; } -export interface RequiredDatePickerProps - extends /* @vue-ignore */ DatePickerProps { +export interface RequiredDatePickerProps extends DatePickerProps { size: CommonSize; type: DatePickerType; disabled: boolean; @@ -92,10 +91,9 @@ export type DatePickerEmits = { export type DatePickerValue = Dayjs | Array | null | undefined; -export interface DatePickerContextType - extends /* @vue-ignore */ RequiredDatePickerProps { +export type DatePickerContextType = RequiredDatePickerProps & { modelValue: DatePickerValue; -} +}; export const DATE_PICKER_CONTEXT: InjectionKey = Symbol("LayDatePicker"); -- Gitee From 75e16e5e3e665c02650dd733e8ff795ea2a55934 Mon Sep 17 00:00:00 2001 From: Jevin Date: Wed, 16 Oct 2024 10:57:15 +0800 Subject: [PATCH 40/45] chore: update --- .../document/zh-CN/components/datePicker.md | 18 +++++++++--------- .../datePicker/component/DateRange.vue | 8 ++++++-- .../datePicker/component/TimeRange.vue | 6 +----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/src/document/zh-CN/components/datePicker.md b/docs/src/document/zh-CN/components/datePicker.md index 3072d419..f26d38b4 100644 --- a/docs/src/document/zh-CN/components/datePicker.md +++ b/docs/src/document/zh-CN/components/datePicker.md @@ -134,7 +134,7 @@ const endTimeYearRange = ref("2022"); ::: title 快速选择 ::: -::: demo 设置 `simple` 属性后,只需要点击一次后自动关闭,无需点击确认按钮。 +::: demo 设置 `simple` 属性后,只需要点击一次后自动关闭,无需点击确认按钮。 对于 `datetime` 、 `time` 与对应 `range` 模式因交互影响无效。