diff --git a/src/config-provider/__test__/__snapshots__/demo.test.jsx.snap b/src/config-provider/__test__/__snapshots__/demo.test.jsx.snap index 74143e4db..d77925f97 100644 --- a/src/config-provider/__test__/__snapshots__/demo.test.jsx.snap +++ b/src/config-provider/__test__/__snapshots__/demo.test.jsx.snap @@ -3222,12 +3222,12 @@ exports[`ConfigProvider > ConfigProvider mobileVue demo works fine 1`] = `
- Cancel + 取消
- title test + 选择时间
ConfigProvider mobileVue demo works fine 1`] = ` class="t-picker__indicator" />
+ @@ -6493,12 +6494,12 @@ exports[`ConfigProvider > ConfigProvider otherEnVue demo works fine 1`] = `
- Cancel + 取消
- title test + 选择时间
ConfigProvider otherEnVue demo works fine 1`] = ` class="t-picker__indicator" />
+ diff --git a/src/date-time-picker/__test__/__snapshots__/demo.test.jsx.snap b/src/date-time-picker/__test__/__snapshots__/demo.test.jsx.snap index c614778a5..04dd680f6 100644 --- a/src/date-time-picker/__test__/__snapshots__/demo.test.jsx.snap +++ b/src/date-time-picker/__test__/__snapshots__/demo.test.jsx.snap @@ -564,6 +564,7 @@ exports[`DateTimePicker > DateTimePicker baseVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1031,6 +1032,7 @@ exports[`DateTimePicker > DateTimePicker customRangeVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -2644,6 +2646,7 @@ exports[`DateTimePicker > DateTimePicker fullVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -3247,6 +3250,7 @@ exports[`DateTimePicker > DateTimePicker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -3584,6 +3588,7 @@ exports[`DateTimePicker > DateTimePicker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -4278,6 +4283,7 @@ exports[`DateTimePicker > DateTimePicker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -4762,6 +4768,341 @@ exports[`DateTimePicker > DateTimePicker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + + + + + + + + + +
+
+ +

+ 自定义步数 +

+
+
+ + +
+
+ + +
+
+
+ 选择日期 + +
+ +
+
+ 年 月 日 +
+ +
+ + + @@ -5810,6 +6152,7 @@ exports[`DateTimePicker > DateTimePicker yearMonthVue demo works fine 1`] = ` class="t-picker__indicator" />
+
diff --git a/src/date-time-picker/__test__/__snapshots__/index.test.jsx.snap b/src/date-time-picker/__test__/__snapshots__/index.test.jsx.snap index 870d0dbad..9af30e638 100644 --- a/src/date-time-picker/__test__/__snapshots__/index.test.jsx.snap +++ b/src/date-time-picker/__test__/__snapshots__/index.test.jsx.snap @@ -520,5 +520,6 @@ exports[`DateTimePicker > props > : onPick 1`] = ` class="t-picker__indicator" /> + `; diff --git a/src/date-time-picker/date-time-picker.en-US.md b/src/date-time-picker/date-time-picker.en-US.md index f4dfa0167..567a48182 100644 --- a/src/date-time-picker/date-time-picker.en-US.md +++ b/src/date-time-picker/date-time-picker.en-US.md @@ -6,19 +6,27 @@ name | type | default | description | required -- | -- | -- | -- | -- +autoClose | Boolean | false | \- | N cancelBtn | String | 取消 | \- | N confirmBtn | String | - | \- | N end | String / Number | - | \- | N +filter | Function | - | Typescript:`(type: TimeModeValues, columns: DateTimePickerColumn) => DateTimePickerColumn` `type DateTimePickerColumn = DateTimePickerColumnItem[]` `interface DateTimePickerColumnItem { label: string,value: string}`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +footer | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N format | String | 'YYYY-MM-DD HH:mm:ss' | \- | N -mode | String / Array | 'date' | Typescript:`DateTimePickerMode` `type DateTimePickerMode = TimeModeValues | Array ` `type TimeModeValues = 'year' | 'month' | 'date' | 'hour' | 'minute' | 'second'`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +header | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N +mode | String / Array | 'date' | Typescript:`DateTimePickerMode` `type DateTimePickerMode = TimeModeValues \| Array ` `type TimeModeValues = 'year' \| 'month' \| 'date' \| 'hour' \| 'minute' \| 'second'`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N renderLabel | Function | - | Typescript:`(type: string, value: number) => string` | N showWeek | Boolean | false | \- | N start | String / Number | - | \- | N -title | String | - | title of picker | N +steps | Object | - | Typescript:`Record` | N +title | String | '选择时间' | title of picker | N +usePopup | Boolean | false | \- | N value | String / Number | - | `v-model` and `v-model:value` is supported。Typescript:`DateValue` `type DateValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N defaultValue | String / Number | - | uncontrolled property。Typescript:`DateValue` `type DateValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +visible | Boolean | false | \- | N onCancel | Function | | Typescript:`(context: { e: MouseEvent }) => void`
| N onChange | Function | | Typescript:`(value: DateValue) => void`
| N +onClose | Function | | Typescript:`(trigger: TriggerSource) => void`
[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts)。
`import { TriggerSource } from '@Picker'`
| N onConfirm | Function | | Typescript:`(value: DateValue) => void`
| N onPick | Function | | Typescript:`(value: DateValue) => void`
| N @@ -28,12 +36,13 @@ name | params | description -- | -- | -- cancel | `(context: { e: MouseEvent })` | \- change | `(value: DateValue)` | \- +close | `(trigger: TriggerSource)` | [see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts)。
`import { TriggerSource } from '@Picker'`
confirm | `(value: DateValue)` | \- pick | `(value: DateValue)` | \- - ### CSS Variables + The component provides the following CSS variables, which can be used to customize styles. Name | Default Value | Description -- | -- | -- ---td-data-time-picker-year-width | 64px | - +--td-data-time-picker-year-width | 64px | - \ No newline at end of file diff --git a/src/date-time-picker/date-time-picker.md b/src/date-time-picker/date-time-picker.md index 9eab00eb1..d8050ebc6 100644 --- a/src/date-time-picker/date-time-picker.md +++ b/src/date-time-picker/date-time-picker.md @@ -1,23 +1,32 @@ :: BASE_DOC :: ## API + ### DateTimePicker Props -名称 | 类型 | 默认值 | 说明 | 必传 +名称 | 类型 | 默认值 | 描述 | 必传 -- | -- | -- | -- | -- +autoClose | Boolean | false | 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible | N cancelBtn | String | 取消 | 取消按钮文字 | N confirmBtn | String | - | 确定按钮文字 | N end | String / Number | - | 选择器的最大可选时间,默认为当前时间+10年 | N +filter | Function | - | 列选项过滤函数,支持自定义列内容。(type 值可为: year, month, date, hour, minute, second)。TS 类型:`(type: TimeModeValues, columns: DateTimePickerColumn) => DateTimePickerColumn` `type DateTimePickerColumn = DateTimePickerColumnItem[]` `interface DateTimePickerColumnItem { label: string,value: string}`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +footer | Slot / Function | - | 底部内容。TS 类型:`TNode`。[通用类型定义](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N format | String | 'YYYY-MM-DD HH:mm:ss' | 用于pick、change、confirm事件参数格式化[详细文档](https://day.js.org/docs/en/display/format) | N -mode | String / Array | 'date' | year = 年;month = 年月;date = 年月日;hour = 年月日时; minute = 年月日时分;当类型为数组时,第一个值控制年月日,第二个值控制时分秒。TS 类型:`DateTimePickerMode` `type DateTimePickerMode = TimeModeValues | Array ` `type TimeModeValues = 'year' | 'month' | 'date' | 'hour' | 'minute' | 'second'`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +header | Slot / Function | - | 顶部内容。TS 类型:`TNode`。[通用类型定义](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N +mode | String / Array | 'date' | year = 年;month = 年月;date = 年月日;hour = 年月日时; minute = 年月日时分;当类型为数组时,第一个值控制年月日,第二个值控制时分秒。TS 类型:`DateTimePickerMode` `type DateTimePickerMode = TimeModeValues \| Array ` `type TimeModeValues = 'year' \| 'month' \| 'date' \| 'hour' \| 'minute' \| 'second'`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N renderLabel | Function | - | 自定义label。TS 类型:`(type: string, value: number) => string` | N showWeek | Boolean | false | 【开发中】是否在日期旁边显示周几(如周一,周二,周日等) | N start | String / Number | - | 选择器的最小可选时间,默认为当前时间-10年 | N +steps | Object | - | 时间间隔步数,示例:`{ minute: 5 }`。TS 类型:`Record` | N title | String | '选择时间' | 标题 | N -value | String / Number | - | 选中值。支持语法糖 `v-model` 或 `v-model:value`。TS 类型:`DateValue` `type DateValue = string | number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N -defaultValue | String / Number | - | 选中值。非受控属性。TS 类型:`DateValue` `type DateValue = string | number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +usePopup | Boolean | false | 是否使用弹出层包裹 | N +value | String / Number | - | 选中值。支持语法糖 `v-model` 或 `v-model:value`。TS 类型:`DateValue` `type DateValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +defaultValue | String / Number | - | 选中值。非受控属性。TS 类型:`DateValue` `type DateValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts) | N +visible | Boolean | false | 是否显示 | N onCancel | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
取消按钮点击时触发 | N onChange | Function | | TS 类型:`(value: DateValue) => void`
value改变时触发 | N +onClose | Function | | TS 类型:`(trigger: TriggerSource) => void`
关闭时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts)。
`import { TriggerSource } from '@Picker'`
| N onConfirm | Function | | TS 类型:`(value: DateValue) => void`
确认按钮点击时触发 | N onPick | Function | | TS 类型:`(value: DateValue) => void`
选中值发生变化时触发 | N @@ -27,12 +36,13 @@ onPick | Function | | TS 类型:`(value: DateValue) => void`
选中值发 -- | -- | -- cancel | `(context: { e: MouseEvent })` | 取消按钮点击时触发 change | `(value: DateValue)` | value改变时触发 +close | `(trigger: TriggerSource)` | 关闭时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/date-time-picker/type.ts)。
`import { TriggerSource } from '@Picker'`
confirm | `(value: DateValue)` | 确认按钮点击时触发 pick | `(value: DateValue)` | 选中值发生变化时触发 - ### CSS Variables + 组件提供了下列 CSS 变量,可用于自定义样式。 名称 | 默认值 | 描述 -- | -- | -- ---td-data-time-picker-year-width | 64px | - +--td-data-time-picker-year-width | 64px | - \ No newline at end of file diff --git a/src/date-time-picker/date-time-picker.tsx b/src/date-time-picker/date-time-picker.tsx index 882619cbb..7062b52cc 100644 --- a/src/date-time-picker/date-time-picker.tsx +++ b/src/date-time-picker/date-time-picker.tsx @@ -12,6 +12,8 @@ import { useVModel } from '../shared'; import { Picker as TPicker } from '../picker'; import { PickerColumn, PickerColumnItem, PickerValue, PickerContext } from '../picker/type'; import { usePrefixClass, useConfig } from '../hooks/useClass'; +import type { TimeModeValues } from './type'; +import type { TriggerSource } from '../picker/type'; dayjs.extend(weekday); dayjs.extend(customParseFormat); @@ -41,12 +43,14 @@ export default defineComponent({ const confirmButtonText = computed(() => props.confirmBtn || globalConfig.value.confirm); const cancelButtonText = computed(() => props.cancelBtn || globalConfig.value.cancel); + const normalize = (val: string | number, defaultDay: Dayjs) => val && dayjs(val).isValid() ? dayjs(val) : defaultDay; const start = computed(() => normalize(props.start, dayjs().subtract(10, 'year'))); const end = computed(() => normalize(props.end, dayjs().add(10, 'year'))); const meaningColumn = computed(() => getMeaningColumn(props.mode)); + const isTimeMode = computed( () => isArray(props.mode) && props.mode[0] == null && ['hour', 'minute', 'second'].includes(props.mode[1]), ); @@ -104,16 +108,22 @@ export default defineComponent({ second: globalConfig.value.secondLabel, }; - const generateColumn = (start: number, end: number, type: string) => { + const generateColumn = (start: number, end: number, type: TimeModeValues) => { const arr: PickerColumnItem[] = []; - for (let i = start; i <= end; i++) { + const step = props.steps?.[type] ?? 1; + for (let i = start; i <= end; i += step) { const value = i.toString(); arr.push({ label: props.renderLabel ? props.renderLabel(type, i) : `${value} ${typeUnit[type]}`, value: type === 'month' ? `${+value - 1}` : value, }); } - ret.push(arr); + + if (typeof props.filter === 'function') { + ret.push(props.filter(type, arr)); + } else { + ret.push(arr); + } }; if (meaningColumn.value.includes('year')) { @@ -153,11 +163,14 @@ export default defineComponent({ }); const onConfirm = (value: string[]) => { - const dayObject = value.reduce((map, cur, index) => { - const type = meaningColumn.value[index]; - map[type] = cur; - return map; - }, {}); + const dayObject = value.reduce( + (map: Record, cur, index) => { + const type = meaningColumn.value[index]; + map[type] = cur; + return map; + }, + {} as Record, + ); const cur = dayjs(dayObject); props.onConfirm?.(dayjs(cur || curDate.value).format(props.format)); setDateTimePickerValue(dayjs(cur || curDate.value).format(props.format)); @@ -167,6 +180,10 @@ export default defineComponent({ props.onCancel?.({ e: context.e }); }; + const onClose = (triggerSource: TriggerSource) => { + props.onClose?.(triggerSource); + }; + const onPick = (value: Array, context: PickerContext) => { const { column, index } = context; const type = meaningColumn.value[column]; @@ -189,9 +206,14 @@ export default defineComponent({ confirm-btn={confirmButtonText.value} cancel-btn={cancelButtonText.value} columns={columns.value} + header={props.header} + footer={props.footer} + usePopup={props.usePopup} + visible={props.visible} onConfirm={onConfirm} onCancel={onCancel} onPick={onPick} + onClose={onClose} /> ); }; diff --git a/src/date-time-picker/demos/mobile.vue b/src/date-time-picker/demos/mobile.vue index c2187e532..d35904dd0 100644 --- a/src/date-time-picker/demos/mobile.vue +++ b/src/date-time-picker/demos/mobile.vue @@ -10,6 +10,9 @@ + + + diff --git a/src/date-time-picker/demos/steps.vue b/src/date-time-picker/demos/steps.vue new file mode 100644 index 000000000..7bf5e66ec --- /dev/null +++ b/src/date-time-picker/demos/steps.vue @@ -0,0 +1,60 @@ + + diff --git a/src/date-time-picker/props.ts b/src/date-time-picker/props.ts index b94cd341e..34d7e7b79 100644 --- a/src/date-time-picker/props.ts +++ b/src/date-time-picker/props.ts @@ -8,10 +8,12 @@ import { TdDateTimePickerProps } from './type'; import { PropType } from 'vue'; export default { + /** 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible */ + autoClose: Boolean, /** 取消按钮文字 */ cancelBtn: { type: String, - default: '', + default: '取消', }, /** 确定按钮文字 */ confirmBtn: { @@ -22,11 +24,23 @@ export default { end: { type: [String, Number] as PropType, }, + /** 列选项过滤函数,支持自定义列内容。(type 值可为: year, month, date, hour, minute, second) */ + filter: { + type: Function as PropType, + }, + /** 底部内容 */ + footer: { + type: Function as PropType, + }, /** 用于pick、change、confirm事件参数格式化[详细文档](https://day.js.org/docs/en/display/format) */ format: { type: String, default: 'YYYY-MM-DD HH:mm:ss', }, + /** 顶部内容 */ + header: { + type: Function as PropType, + }, /** year = 年;month = 年月;date = 年月日;hour = 年月日时; minute = 年月日时分;当类型为数组时,第一个值控制年月日,第二个值控制时分秒 */ mode: { type: [String, Array] as PropType, @@ -42,26 +56,38 @@ export default { start: { type: [String, Number] as PropType, }, + /** 时间间隔步数,示例:`{ minute: 5 }` */ + steps: { + type: Object as PropType, + }, /** 标题 */ title: { type: String, - default: '', + default: '选择时间', }, + /** 是否使用弹出层包裹 */ + usePopup: Boolean, /** 选中值 */ value: { type: [String, Number] as PropType, + default: undefined, }, modelValue: { type: [String, Number] as PropType, + default: undefined, }, /** 选中值,非受控属性 */ defaultValue: { type: [String, Number] as PropType, }, + /** 是否显示 */ + visible: Boolean, /** 取消按钮点击时触发 */ onCancel: Function as PropType, /** value改变时触发 */ onChange: Function as PropType, + /** 关闭时触发 */ + onClose: Function as PropType, /** 确认按钮点击时触发 */ onConfirm: Function as PropType, /** 选中值发生变化时触发 */ diff --git a/src/date-time-picker/shared.ts b/src/date-time-picker/shared.ts index a1094f322..f83d7cced 100644 --- a/src/date-time-picker/shared.ts +++ b/src/date-time-picker/shared.ts @@ -1,6 +1,7 @@ import { isArray } from 'lodash-es'; +import type { TimeModeValues } from './type'; -export const getMeaningColumn = (mode: string | string[]) => { +export const getMeaningColumn = (mode: string | string[]): Array => { const arr = ['year', 'month', 'date', 'hour', 'minute', 'second']; if (isArray(mode)) { @@ -18,10 +19,10 @@ export const getMeaningColumn = (mode: string | string[]) => { ans.push(...arr.slice(3, cutIndex + 1)); } } - return ans; + return ans as TimeModeValues[]; } const cutIndex = arr.indexOf(mode); - return arr.slice(0, cutIndex + 1); + return arr.slice(0, cutIndex + 1) as TimeModeValues[]; }; diff --git a/src/date-time-picker/type.ts b/src/date-time-picker/type.ts index b9dfa08af..1a509b4f4 100644 --- a/src/date-time-picker/type.ts +++ b/src/date-time-picker/type.ts @@ -4,9 +4,15 @@ * 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC * */ +import { TriggerSource } from '../picker'; import { TNode } from '../common'; export interface TdDateTimePickerProps { + /** + * 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible + * @default false + */ + autoClose?: boolean; /** * 取消按钮文字 * @default 取消 @@ -21,11 +27,23 @@ export interface TdDateTimePickerProps { * 选择器的最大可选时间,默认为当前时间+10年 */ end?: string | number; + /** + * 列选项过滤函数,支持自定义列内容。(type 值可为: year, month, date, hour, minute, second) + */ + filter?: (type: TimeModeValues, columns: DateTimePickerColumn) => DateTimePickerColumn; + /** + * 底部内容 + */ + footer?: TNode; /** * 用于pick、change、confirm事件参数格式化[详细文档](https://day.js.org/docs/en/display/format) * @default 'YYYY-MM-DD HH:mm:ss' */ format?: string; + /** + * 顶部内容 + */ + header?: TNode; /** * year = 年;month = 年月;date = 年月日;hour = 年月日时; minute = 年月日时分;当类型为数组时,第一个值控制年月日,第二个值控制时分秒 * @default 'date' @@ -44,11 +62,20 @@ export interface TdDateTimePickerProps { * 选择器的最小可选时间,默认为当前时间-10年 */ start?: string | number; + /** + * 时间间隔步数,示例:`{ minute: 5 }` + */ + steps?: Record; /** * 标题 * @default '选择时间' */ title?: string; + /** + * 是否使用弹出层包裹 + * @default false + */ + usePopup?: boolean; /** * 选中值 */ @@ -61,6 +88,11 @@ export interface TdDateTimePickerProps { * 选中值 */ modelValue?: DateValue; + /** + * 是否显示 + * @default false + */ + visible?: boolean; /** * 取消按钮点击时触发 */ @@ -69,6 +101,10 @@ export interface TdDateTimePickerProps { * value改变时触发 */ onChange?: (value: DateValue) => void; + /** + * 关闭时触发 + */ + onClose?: (trigger: TriggerSource) => void; /** * 确认按钮点击时触发 */ @@ -79,6 +115,13 @@ export interface TdDateTimePickerProps { onPick?: (value: DateValue) => void; } +export type DateTimePickerColumn = DateTimePickerColumnItem[]; + +export interface DateTimePickerColumnItem { + label: string; + value: string; +} + export type DateTimePickerMode = TimeModeValues | Array; export type TimeModeValues = 'year' | 'month' | 'date' | 'hour' | 'minute' | 'second'; diff --git a/src/form/__test__/__snapshots__/demo.test.jsx.snap b/src/form/__test__/__snapshots__/demo.test.jsx.snap index 30f3ff5cd..52c7fa323 100644 --- a/src/form/__test__/__snapshots__/demo.test.jsx.snap +++ b/src/form/__test__/__snapshots__/demo.test.jsx.snap @@ -801,6 +801,7 @@ exports[`Form > Form horizontalVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -2579,6 +2580,7 @@ exports[`Form > Form mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -4216,6 +4218,7 @@ exports[`Form > Form verticalVue demo works fine 1`] = ` class="t-picker__indicator" /> + diff --git a/src/picker/__test__/__snapshots__/demo.test.jsx.snap b/src/picker/__test__/__snapshots__/demo.test.jsx.snap index af6d19994..69ceaaa09 100644 --- a/src/picker/__test__/__snapshots__/demo.test.jsx.snap +++ b/src/picker/__test__/__snapshots__/demo.test.jsx.snap @@ -145,6 +145,7 @@ exports[`Picker > Picker areaVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -356,6 +357,7 @@ exports[`Picker > Picker baseVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -532,6 +534,7 @@ exports[`Picker > Picker baseVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -716,6 +719,7 @@ exports[`Picker > Picker cascadeVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1010,6 +1014,7 @@ exports[`Picker > Picker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1186,6 +1191,7 @@ exports[`Picker > Picker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1332,6 +1338,7 @@ exports[`Picker > Picker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1536,6 +1543,7 @@ exports[`Picker > Picker mobileVue demo works fine 1`] = ` class="t-picker__indicator" /> + @@ -1774,6 +1782,7 @@ exports[`Picker > Picker titleVue demo works fine 1`] = ` class="t-picker__indicator" /> + diff --git a/src/picker/picker.en-US.md b/src/picker/picker.en-US.md index ef17fcb2b..432cb01e7 100644 --- a/src/picker/picker.en-US.md +++ b/src/picker/picker.en-US.md @@ -6,17 +6,22 @@ name | type | default | description | required -- | -- | -- | -- | -- +autoClose | Boolean | true | \- | N cancelBtn | String / Boolean | true | Typescript:`boolean \| string` | N columns | Array / Function | [] | required。Typescript:`PickerColumn \| Array \| ((item: Array) => Array)` `type PickerColumn = PickerColumnItem[]` `interface PickerColumnItem { label: string,value: string}`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | Y confirmBtn | String / Boolean | true | Typescript:`boolean \| string` | N +footer | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N header | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N option | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N renderLabel | Function | - | Typescript:`(item: PickerColumnItem) => string` | N title | String | '' | \- | N +usePopup | Boolean | false | \- | N value | Array | - | `v-model` and `v-model:value` is supported。Typescript:`Array` `type PickerValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | N defaultValue | Array | - | uncontrolled property。Typescript:`Array` `type PickerValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | N +visible | Boolean | false | \- | N onCancel | Function | | Typescript:`(context: { e: MouseEvent }) => void`
| N onChange | Function | | Typescript:`(value: Array, context: { columns: Array, e: MouseEvent }) => void`
[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`interface PickerContext{ column: number,index: number }`
| N +onClose | Function | | Typescript:`(trigger: TriggerSource) => void`
[see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`type TriggerSource = 'overlay' \| 'cancel-btn' \| 'confirm-btn'`
| N onConfirm | Function | | Typescript:`(value: Array, context: { index: number[], e: MouseEvent, label: string[] }) => void`
| N onPick | Function | | Typescript:`(value: Array,context: PickerContext) => void`
| N @@ -26,6 +31,7 @@ name | params | description -- | -- | -- cancel | `(context: { e: MouseEvent })` | \- change | `(value: Array, context: { columns: Array, e: MouseEvent }) ` | [see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`interface PickerContext{ column: number,index: number }`
+close | `(trigger: TriggerSource)` | [see more ts definition](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`type TriggerSource = 'overlay' \| 'cancel-btn' \| 'confirm-btn'`
confirm | `(value: Array, context: { index: number[], e: MouseEvent, label: string[] })` | \- pick | `(value: Array,context: PickerContext)` | \- diff --git a/src/picker/picker.md b/src/picker/picker.md index 97fe19b95..3c57ea637 100644 --- a/src/picker/picker.md +++ b/src/picker/picker.md @@ -7,17 +7,22 @@ 名称 | 类型 | 默认值 | 描述 | 必传 -- | -- | -- | -- | -- +autoClose | Boolean | true | 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible | N cancelBtn | String / Boolean | true | 取消按钮文字。TS 类型:`boolean \| string` | N columns | Array / Function | [] | 必需。配置每一列的选项。TS 类型:`PickerColumn \| Array \| ((item: Array) => Array)` `type PickerColumn = PickerColumnItem[]` `interface PickerColumnItem { label: string,value: string}`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | Y confirmBtn | String / Boolean | true | 确定按钮文字。TS 类型:`boolean \| string` | N +footer | Slot / Function | - | 底部内容。TS 类型:`TNode`。[通用类型定义](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N header | Slot / Function | - | 自定义头部内容。TS 类型:`TNode`。[通用类型定义](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N option | Slot / Function | - | 自定义选项内容。参数为 `option: PickerColumnItem, index: number`。TS 类型:`TNode`。[通用类型定义](https://github.com/Tencent/tdesign-mobile-vue/blob/develop/src/common.ts) | N renderLabel | Function | - | 自定义label。TS 类型:`(item: PickerColumnItem) => string` | N title | String | '' | 标题 | N +usePopup | Boolean | false | 是否使用弹出层包裹 | N value | Array | - | 选中值。支持语法糖 `v-model` 或 `v-model:value`。TS 类型:`Array` `type PickerValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | N defaultValue | Array | - | 选中值。非受控属性。TS 类型:`Array` `type PickerValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts) | N +visible | Boolean | false | 是否显示 | N onCancel | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
点击取消按钮时触发 | N onChange | Function | | TS 类型:`(value: Array, context: { columns: Array, e: MouseEvent }) => void`
选中变化时候触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`interface PickerContext{ column: number,index: number }`
| N +onClose | Function | | TS 类型:`(trigger: TriggerSource) => void`
关闭时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`type TriggerSource = 'overlay' \| 'cancel-btn' \| 'confirm-btn'`
| N onConfirm | Function | | TS 类型:`(value: Array, context: { index: number[], e: MouseEvent, label: string[] }) => void`
点击确认按钮时触发 | N onPick | Function | | TS 类型:`(value: Array,context: PickerContext) => void`
任何一列选中都会触发,不同的列参数不同。`context.column` 表示第几列变化,`context.index` 表示变化那一列的选中项下标 | N @@ -27,6 +32,7 @@ onPick | Function | | TS 类型:`(value: Array,context: PickerCo -- | -- | -- cancel | `(context: { e: MouseEvent })` | 点击取消按钮时触发 change | `(value: Array, context: { columns: Array, e: MouseEvent }) ` | 选中变化时候触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`interface PickerContext{ column: number,index: number }`
+close | `(trigger: TriggerSource)` | 关闭时触发。[详细类型定义](https://github.com/Tencent/tdesign-mobile-vue/tree/develop/src/picker/type.ts)。
`type TriggerSource = 'overlay' \| 'cancel-btn' \| 'confirm-btn'`
confirm | `(value: Array, context: { index: number[], e: MouseEvent, label: string[] })` | 点击确认按钮时触发 pick | `(value: Array,context: PickerContext)` | 任何一列选中都会触发,不同的列参数不同。`context.column` 表示第几列变化,`context.index` 表示变化那一列的选中项下标 diff --git a/src/picker/picker.tsx b/src/picker/picker.tsx index e733a8204..2fe18145d 100644 --- a/src/picker/picker.tsx +++ b/src/picker/picker.tsx @@ -6,6 +6,7 @@ import { PickerValue, PickerColumn, PickerColumnItem } from './type'; import { useVModel } from '../shared'; import { useTNodeJSX } from '../hooks/tnode'; import PickerItem from './picker-item'; +import { Popup as TPopup } from '../popup'; import { getPickerColumns } from './utils'; import { usePrefixClass, useConfig } from '../hooks/useClass'; @@ -18,7 +19,7 @@ const getIndexFromColumns = (column: PickerColumn, value: PickerValue) => { export default defineComponent({ name: `${prefix}-picker`, - components: { PickerItem }, + components: { PickerItem, TPopup }, props: PickerProps, emits: ['change', 'cancel', 'pick', 'update:modelValue', 'update:value'], setup(props, { slots }) { @@ -28,6 +29,13 @@ export default defineComponent({ const { value, modelValue } = toRefs(props); const [pickerValue = ref([]), setPickerValue] = useVModel(value, modelValue, props.defaultValue, props.onChange); + const innerVisible = ref(props.visible); + watch( + () => props.visible, + (value) => { + innerVisible.value = value; + }, + ); const getDefaultText = (prop: string | boolean, defaultText: string): string => { if (isString(prop)) return prop; @@ -64,13 +72,25 @@ export default defineComponent({ const value = target.map((item: PickerColumnItem) => item.value); setPickerValue(value); props.onConfirm?.(value, { index: curIndexArray, label, e }); + + if (props.autoClose) { + innerVisible.value = false; + props.onClose?.('confirm-btn'); + } }; + const handleCancel = (e: MouseEvent) => { pickerItemInstanceArray.value.forEach((item: any, index: number) => { item?.setIndex(curIndexArray[index]); }); props.onCancel?.({ e }); + + if (props.autoClose) { + innerVisible.value = false; + props.onClose?.('cancel-btn'); + } }; + const handlePick = (context: any, column: number) => { const { index } = context; @@ -80,6 +100,11 @@ export default defineComponent({ props.onPick?.(curValueArray.value, { index, column }); }; + const onClose = () => { + innerVisible.value = false; + props.onClose?.('overlay'); + }; + watch(pickerValue, () => { curValueArray.value = pickerValue.value.map((item: PickerValue) => item); }); @@ -94,7 +119,9 @@ export default defineComponent({ return () => { const header = renderTNodeJSX('header'); - return ( + const footer = renderTNodeJSX('footer'); + + const inner = (
{cancelButtonText.value && ( @@ -127,8 +154,18 @@ export default defineComponent({
+ {footer}
); + + if (props.usePopup) { + return ( + + {inner} + + ); + } + return inner; }; }, }); diff --git a/src/picker/props.ts b/src/picker/props.ts index 1d7276aac..92affbde7 100644 --- a/src/picker/props.ts +++ b/src/picker/props.ts @@ -8,6 +8,11 @@ import { TdPickerProps } from './type'; import { PropType } from 'vue'; export default { + /** 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible */ + autoClose: { + type: Boolean, + default: true, + }, /** 取消按钮文字 */ cancelBtn: { type: [String, Boolean] as PropType, @@ -24,6 +29,10 @@ export default { type: [String, Boolean] as PropType, default: true, }, + /** 底部内容 */ + footer: { + type: Function as PropType, + }, /** 自定义头部内容 */ header: { type: Function as PropType, @@ -41,6 +50,8 @@ export default { type: String, default: '', }, + /** 是否使用弹出层包裹 */ + usePopup: Boolean, /** 选中值 */ value: { type: Array as PropType, @@ -54,10 +65,14 @@ export default { defaultValue: { type: Array as PropType, }, + /** 是否显示 */ + visible: Boolean, /** 点击取消按钮时触发 */ onCancel: Function as PropType, /** 选中变化时候触发 */ onChange: Function as PropType, + /** 关闭时触发 */ + onClose: Function as PropType, /** 点击确认按钮时触发 */ onConfirm: Function as PropType, /** 任何一列选中都会触发,不同的列参数不同。`context.column` 表示第几列变化,`context.index` 表示变化那一列的选中项下标 */ diff --git a/src/picker/type.ts b/src/picker/type.ts index 87b2eb865..14571face 100644 --- a/src/picker/type.ts +++ b/src/picker/type.ts @@ -7,6 +7,11 @@ import { TNode } from '../common'; export interface TdPickerProps { + /** + * 自动关闭;在确认、取消、点击遮罩层自动关闭,不需要手动设置 visible + * @default true + */ + autoClose?: boolean; /** * 取消按钮文字 * @default true @@ -22,6 +27,10 @@ export interface TdPickerProps { * @default true */ confirmBtn?: boolean | string; + /** + * 底部内容 + */ + footer?: TNode; /** * 自定义头部内容 */ @@ -39,6 +48,11 @@ export interface TdPickerProps { * @default '' */ title?: string; + /** + * 是否使用弹出层包裹 + * @default false + */ + usePopup?: boolean; /** * 选中值 */ @@ -51,6 +65,11 @@ export interface TdPickerProps { * 选中值 */ modelValue?: Array; + /** + * 是否显示 + * @default false + */ + visible?: boolean; /** * 点击取消按钮时触发 * @default '' @@ -61,6 +80,10 @@ export interface TdPickerProps { * @default '' */ onChange?: (value: Array, context: { columns: Array; e: MouseEvent }) => void; + /** + * 关闭时触发 + */ + onClose?: (trigger: TriggerSource) => void; /** * 点击确认按钮时触发 * @default '' @@ -86,3 +109,5 @@ export interface PickerContext { column: number; index: number; } + +export type TriggerSource = 'overlay' | 'cancel-btn' | 'confirm-btn';