diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md index f67b6c48486..cdf9d5041e6 100644 --- a/CHANGELOG.en-US.md +++ b/CHANGELOG.en-US.md @@ -12,6 +12,7 @@ - `n-date-picker` prop `defaultTime` can also accept a function that will return a formatted string - `n-steps` adds `content-placement` prop, closes [#7044](https://github.com/tusen-ai/naive-ui/issues/7044). +- `n-date-picker` adds `single-panel` 支持 `type="daterange"` 选择日期范围时打开单面板 ## 2.43.1 diff --git a/CHANGELOG.zh-CN.md b/CHANGELOG.zh-CN.md index 2d9976d2a57..b6bf4080d87 100644 --- a/CHANGELOG.zh-CN.md +++ b/CHANGELOG.zh-CN.md @@ -12,6 +12,7 @@ - `n-date-picker` 的 `defaultTime` 属性可以接受返回格式化字符串的函数 - `n-steps` 增加 `content-placement` 属性,关闭 [#7044](https://github.com/tusen-ai/naive-ui/issues/7044) +- `n-date-picker` 新增 `single-panel` 支持 `type="daterange"` 选择日期范围时打开单面板 ## 2.43.1 diff --git a/src/date-picker/demos/enUS/index.demo-entry.md b/src/date-picker/demos/enUS/index.demo-entry.md index 2d97dff2e97..b8375a0d663 100644 --- a/src/date-picker/demos/enUS/index.demo-entry.md +++ b/src/date-picker/demos/enUS/index.demo-entry.md @@ -31,6 +31,7 @@ focus.vue status.vue icon.vue panel.vue +single-panel.vue ``` ## API @@ -113,6 +114,7 @@ panel.vue | default-calendar-start-time | `number` | `undefined` | Default panel calendar start month timestamp. | 2.28.3 | | default-calendar-end-time | `number` | `undefined` | Default panel calendar end month timestamp. | 2.28.3 | | end-placeholder | `string` | `'End Date'` | Placeholder at end part of the input. | | +| single-panel | `boolean` | `false` | Whether to use a single panel | NEXT_VERSION | | format | `string` | `'yyyy-MM-dd'` | Format of the input. For detail please see [format](https://date-fns.org/v2.23.0/docs/format). | | | is-date-disabled | `(current: number, phase: 'start' \| 'end', value: [number, number] \| null) => boolean` | `undefined` | Validator of the date. | `detail` 2.37.1 | | is-time-disabled | `(current: number, phase: 'start' \| 'end', value: [number, number]) => { isHourDisabled?: (hour: number) => boolean, isMinuteDisabled?: (minute: number, hour: number \| null) => boolean, isSecondDisabled?: (second: number, minute: number \| null, hour: number \| null) => boolean }` | `undefined` | Validator of the time. `null` in validators means value of picker is empty. | | diff --git a/src/date-picker/demos/enUS/single-panel.demo.vue b/src/date-picker/demos/enUS/single-panel.demo.vue new file mode 100644 index 00000000000..7bea9b70df9 --- /dev/null +++ b/src/date-picker/demos/enUS/single-panel.demo.vue @@ -0,0 +1,28 @@ + +# Single panel + +It is valid when type is daterange. + + + + + diff --git a/src/date-picker/demos/zhCN/index.demo-entry.md b/src/date-picker/demos/zhCN/index.demo-entry.md index 47de63e9fd6..492f00b3151 100644 --- a/src/date-picker/demos/zhCN/index.demo-entry.md +++ b/src/date-picker/demos/zhCN/index.demo-entry.md @@ -29,6 +29,7 @@ footerslot.vue status.vue icon.vue panel.vue +single-panel.vue panel-debug.vue form-debug.vue ``` @@ -113,6 +114,7 @@ form-debug.vue | bind-calendar-months | `boolean` | `false` | 面板月份是否连续 | 2.28.3 | | default-calendar-start-time | `number` | `undefined` | 面板日历默认开始的月份时间戳 | 2.28.3 | | default-calendar-end-time | `number` | `undefined` | 面板日历默认结束的月份时间戳 | 2.28.3 | +| single-panel | `boolean` | `false` | 是否使用单面板 | NEXT_VERSION | | format | `string` | `'yyyy-MM-dd'` | 时间格式化字符串,详情见 [format](https://date-fns.org/v2.23.0/docs/format) | | | is-date-disabled | `(current: number, phase: 'start' \| 'end', value: [number, number] \| null) => boolean` | `undefined` | 日期禁用的校验函数 | | | is-time-disabled | `(current: number, phase: 'start' \| 'end', value: [number, number]) => { isHourDisabled?: (hour: number) => boolean, isMinuteDisabled?: (minute: number, hour: number \| null) => boolean, isSecondDisabled?: (second: number, minute: number \| null, hour: number \| null) => boolean }` | `undefined` | 时间禁用的校验函数,校验函数中的 `null` 表示当前没有选中值 | | diff --git a/src/date-picker/demos/zhCN/single-panel.demo.vue b/src/date-picker/demos/zhCN/single-panel.demo.vue new file mode 100644 index 00000000000..345d04605e9 --- /dev/null +++ b/src/date-picker/demos/zhCN/single-panel.demo.vue @@ -0,0 +1,28 @@ + +# 单面板 + +type为daterange时有效。 + + + + + diff --git a/src/date-picker/src/DatePicker.tsx b/src/date-picker/src/DatePicker.tsx index e919eccdbcf..d114326c19b 100644 --- a/src/date-picker/src/DatePicker.tsx +++ b/src/date-picker/src/DatePicker.tsx @@ -977,6 +977,7 @@ export default defineComponent({ defaultTime: this.defaultTime, themeClass: this.themeClass, panel: this.panel, + singlePanel: this.singlePanel, inputReadonly: this.inputReadonly || this.mergedDisabled, onRender: this.onRender, onNextMonth: this.onNextMonth, diff --git a/src/date-picker/src/panel/daterange.tsx b/src/date-picker/src/panel/daterange.tsx index b364ca3d2b8..28cfaf3c94a 100644 --- a/src/date-picker/src/panel/daterange.tsx +++ b/src/date-picker/src/panel/daterange.tsx @@ -156,105 +156,109 @@ export default defineComponent({ ))} -
-
-
-
- {resolveSlot(datePickerSlots['prev-year'], () => [ - - ])} -
-
- {resolveSlot(datePickerSlots['prev-month'], () => [ - - ])} -
- -
- {resolveSlot(datePickerSlots['next-month'], () => [ - - ])} -
-
- {resolveSlot(datePickerSlots['next-year'], () => [ - - ])} -
-
-
- {this.weekdays.map(weekday => ( + {!this.singlePanel ? ( +
+ ) : null} + {!this.singlePanel ? ( +
+
- {weekday} + {resolveSlot(datePickerSlots['prev-year'], () => [ + + ])}
- ))} -
-
-
- {this.endDateArray.map((dateItem, i) => (
{ - this.handleDateClick(dateItem) - }} - onMouseenter={() => { - this.handleDateMouseEnter(dateItem) - }} + class={`${mergedClsPrefix}-date-panel-month__prev`} + onClick={this.endCalendarPrevMonth} > -
- {dateItem.dateObject.date} - {dateItem.isCurrentDate ? ( -
- ) : null} + {resolveSlot(datePickerSlots['prev-month'], () => [ + + ])}
- ))} + +
+ {resolveSlot(datePickerSlots['next-month'], () => [ + + ])} +
+
+ {resolveSlot(datePickerSlots['next-year'], () => [ + + ])} +
+
+
+ {this.weekdays.map(weekday => ( +
+ {weekday} +
+ ))} +
+
+
+ {this.endDateArray.map((dateItem, i) => ( +
{ + this.handleDateClick(dateItem) + }} + onMouseenter={() => { + this.handleDateMouseEnter(dateItem) + }} + > +
+ {dateItem.dateObject.date} + {dateItem.isCurrentDate ? ( +
+ ) : null} +
+ ))} +
-
+ ) : null} {this.datePickerSlots.footer ? (
{this.datePickerSlots.footer()} diff --git a/src/date-picker/src/panel/use-panel-common.ts b/src/date-picker/src/panel/use-panel-common.ts index 32103b1775e..5e98141e066 100644 --- a/src/date-picker/src/panel/use-panel-common.ts +++ b/src/date-picker/src/panel/use-panel-common.ts @@ -48,6 +48,7 @@ const usePanelCommonProps = { themeClass: String, onRender: Function as PropType<(() => void) | undefined>, panel: Boolean, + singlePanel: Boolean, onNextMonth: Function as PropType<() => void>, onPrevMonth: Function as PropType<() => void>, onNextYear: Function as PropType<() => void>, diff --git a/src/date-picker/src/props.ts b/src/date-picker/src/props.ts index fb8c92eb85c..0cfc4665fe2 100644 --- a/src/date-picker/src/props.ts +++ b/src/date-picker/src/props.ts @@ -76,6 +76,7 @@ export const datePickerProps = { default: undefined }, panel: Boolean, + singlePanel: Boolean, ranges: Object as PropType>, firstDayOfWeek: Number as PropType, inputReadonly: Boolean,