Skip to content

Commit 2ce4e7d

Browse files
authored
feat: calendar select support info.source param (#6697)
* docs: add ant-design-vue nuxt module * feat: calendar select support info.source param
1 parent fc5181d commit 2ce4e7d

File tree

4 files changed

+66
-13
lines changed

4 files changed

+66
-13
lines changed

components/calendar/Header.tsx

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Select from '../select';
22
import { Group, Button } from '../radio';
3-
import type { CalendarMode } from './generateCalendar';
3+
import type { CalendarMode, SelectInfo } from './generateCalendar';
44
import type { Ref } from 'vue';
55
import { defineComponent, ref } from 'vue';
66
import type { Locale } from '../vc-picker/interface';
@@ -150,7 +150,7 @@ export interface CalendarHeaderProps<DateType> {
150150
locale: Locale;
151151
mode: CalendarMode;
152152
fullscreen: boolean;
153-
onChange: (date: DateType) => void;
153+
onChange: (date: DateType, source: SelectInfo['source']) => void;
154154
onModeChange: (mode: CalendarMode) => void;
155155
}
156156

@@ -177,15 +177,26 @@ export default defineComponent<CalendarHeaderProps<any>>({
177177
const { prefixCls, fullscreen, mode, onChange, onModeChange } = props;
178178
const sharedProps = {
179179
...props,
180-
onChange,
181180
fullscreen,
182181
divRef,
183182
} as any;
184183

185184
return (
186185
<div class={`${prefixCls}-header`} ref={divRef}>
187-
<YearSelect {...sharedProps} />
188-
{mode === 'month' && <MonthSelect {...sharedProps} />}
186+
<YearSelect
187+
{...sharedProps}
188+
onChange={v => {
189+
onChange(v, 'year');
190+
}}
191+
/>
192+
{mode === 'month' && (
193+
<MonthSelect
194+
{...sharedProps}
195+
onChange={v => {
196+
onChange(v, 'month');
197+
}}
198+
/>
199+
)}
189200
<ModeSwitch {...sharedProps} onModeChange={onModeChange} />
190201
</div>
191202
);

components/calendar/generateCalendar.tsx

+13-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ type InjectDefaultProps<Props> = Omit<
2727
size?: 'large' | 'default' | 'small';
2828
};
2929

30+
export interface SelectInfo {
31+
source: 'year' | 'month' | 'date' | 'customize';
32+
}
33+
3034
// Picker Props
3135
export type PickerPanelBaseProps<DateType> = InjectDefaultProps<RCPickerPanelBaseProps<DateType>>;
3236
export type PickerPanelDateProps<DateType> = InjectDefaultProps<RCPickerPanelDateProps<DateType>>;
@@ -64,7 +68,7 @@ export interface CalendarProps<DateType> {
6468
onChange?: (date: DateType | string) => void;
6569
'onUpdate:value'?: (date: DateType | string) => void;
6670
onPanelChange?: (date: DateType | string, mode: CalendarMode) => void;
67-
onSelect?: (date: DateType | string) => void;
71+
onSelect?: (date: DateType, selectInfo: SelectInfo) => void;
6872
valueFormat?: string;
6973
}
7074

@@ -217,9 +221,9 @@ function generateCalendar<
217221
triggerPanelChange(mergedValue.value, newMode);
218222
};
219223

220-
const onInternalSelect = (date: DateType) => {
224+
const onInternalSelect = (date: DateType, source: SelectInfo['source']) => {
221225
triggerChange(date);
222-
emit('select', maybeToString(date));
226+
emit('select', maybeToString(date), { source });
223227
};
224228
// ====================== Locale ======================
225229
const defaultLocale = computed(() => {
@@ -317,7 +321,9 @@ function generateCalendar<
317321
headerRender({
318322
value: mergedValue.value,
319323
type: mergedMode.value,
320-
onChange: onInternalSelect,
324+
onChange: nextDate => {
325+
onInternalSelect(nextDate, 'customize');
326+
},
321327
onTypeChange: triggerModeChange,
322328
})
323329
) : (
@@ -340,7 +346,9 @@ function generateCalendar<
340346
generateConfig={generateConfig}
341347
dateRender={dateRender}
342348
monthCellRender={obj => monthRender(obj, mergedLocale.value.lang)}
343-
onSelect={onInternalSelect}
349+
onSelect={nextDate => {
350+
onInternalSelect(nextDate, panelMode.value);
351+
}}
344352
mode={panelMode.value}
345353
picker={panelMode.value}
346354
disabledDate={mergedDisabledDate.value}

components/calendar/index.en-US.md

+18-1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,21 @@ customize the progress dot by setting a scoped slot
4646
| --- | --- | --- | --- | --- |
4747
| change | Callback for when value change | function(date: dayjs \| string) | - | |
4848
| panelChange | Callback for when panel changes | function(date: dayjs \| string, mode: string) | - | |
49-
| select | Callback for when a date is selected | function(date: dayjs \| string) | - | |
49+
| select | Callback for when a date is selected, include source info | function(date: dayjs \| string,info:{ source: 'year' \| 'month' \| 'date' \| 'customize' }) | - | |
50+
51+
### How to get date from panel click?
52+
53+
`select` event provide `info.source` to help on this:
54+
55+
```html
56+
<script lang="ts" setup>
57+
const onSelect = (date, { source }) => {
58+
if (source === 'date') {
59+
console.log('Panel Select:', source);
60+
}
61+
};
62+
</script>
63+
<template>
64+
<a-calendar @select="onSelect" />
65+
</template>
66+
```

components/calendar/index.zh-CN.md

+19-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,24 @@ coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*-p-wQLik200AAA
4242
### 事件
4343

4444
| 事件名称 | 说明 | 回调参数 | |
45-
| --- | --- | --- | --- |
45+
| --- | --- | --- | --- | --- |
4646
| change | 日期变化时的回调, 面板变化有可能导致日期变化 | function(date: dayjs \| string) ||
4747
| panelChange | 日期面板变化回调 | function(date: dayjs \| string, mode: string) ||
48-
| select | 点击选择日期回调 | function(date: dayjs \| string) ||
48+
| select | 选择日期回调,包含来源信息 | function(date: Dayjs, info: { source: 'year' \| 'month' \| 'date' \| 'customize' }) | - | |
49+
50+
### 如何仅获取来自面板点击的日期?
51+
52+
`select` 事件提供额外的来源信息,你可以通过 `info.source` 来判断来源:
53+
54+
```html
55+
<script lang="ts" setup>
56+
const onSelect = (date, { source }) => {
57+
if (source === 'date') {
58+
console.log('Panel Select:', source);
59+
}
60+
};
61+
</script>
62+
<template>
63+
<a-calendar @select="onSelect" />
64+
</template>
65+
```

0 commit comments

Comments
 (0)