{{ i18nDate }}
-
+
{{ t('el.datepicker.prevMonth') }}
@@ -16,6 +19,16 @@
+
+
+
@@ -50,6 +63,7 @@ import { useLocale, useNamespace } from '@element-plus/hooks'
import DateTable from './date-table.vue'
import { useCalendar } from './use-calendar'
import { calendarEmits, calendarProps } from './calendar'
+import SelectController from './select-controller.vue'
const ns = useNamespace('calendar')
@@ -68,6 +82,7 @@ const {
realSelectedDay,
selectDate,
validatedRange,
+ handleDateChange,
} = useCalendar(props, emit, COMPONENT_NAME)
const { t } = useLocale()
diff --git a/packages/components/calendar/src/select-controller.ts b/packages/components/calendar/src/select-controller.ts
new file mode 100644
index 0000000000..d76d4d7e89
--- /dev/null
+++ b/packages/components/calendar/src/select-controller.ts
@@ -0,0 +1,32 @@
+import {
+ buildProps,
+ definePropType,
+ isObject,
+ isString,
+} from '@element-plus/utils'
+
+import type { ExtractPropTypes, ExtractPublicPropTypes } from 'vue'
+import type { Dayjs } from 'dayjs'
+
+export const selectControllerProps = buildProps({
+ date: {
+ type: definePropType(Object),
+ required: true,
+ },
+ formatter: {
+ type: definePropType<
+ (value: number, type: 'year' | 'month') => string | number
+ >(Function),
+ },
+} as const)
+export type SelectControllerProps = ExtractPropTypes<
+ typeof selectControllerProps
+>
+export type SelectControllerPropsPublic = ExtractPublicPropTypes<
+ typeof selectControllerProps
+>
+
+export const selectControllerEmits = {
+ 'date-change': (date: Dayjs | 'today') => isObject(date) || isString(date),
+}
+export type SelectControllerEmits = typeof selectControllerEmits
diff --git a/packages/components/calendar/src/select-controller.vue b/packages/components/calendar/src/select-controller.vue
new file mode 100644
index 0000000000..031b64a34d
--- /dev/null
+++ b/packages/components/calendar/src/select-controller.vue
@@ -0,0 +1,90 @@
+
+
+
+
+ {{ t('el.datepicker.today') }}
+
+
+
+
diff --git a/packages/components/calendar/src/use-calendar.ts b/packages/components/calendar/src/use-calendar.ts
index 2d7bdfb70e..fa74d53b60 100644
--- a/packages/components/calendar/src/use-calendar.ts
+++ b/packages/components/calendar/src/use-calendar.ts
@@ -178,6 +178,14 @@ export const useCalendar = (
}
}
+ const handleDateChange = (date: Dayjs | 'today') => {
+ if (date === 'today') {
+ selectDate('today')
+ } else {
+ pickDay(date)
+ }
+ }
+
return {
calculateValidatedDateRange,
date,
@@ -185,5 +193,6 @@ export const useCalendar = (
pickDay,
selectDate,
validatedRange,
+ handleDateChange,
}
}
diff --git a/packages/components/calendar/style/css.ts b/packages/components/calendar/style/css.ts
index ee3b3433b8..a55e6ee325 100644
--- a/packages/components/calendar/style/css.ts
+++ b/packages/components/calendar/style/css.ts
@@ -2,3 +2,4 @@ import '@element-plus/components/base/style/css'
import '@element-plus/theme-chalk/el-calendar.css'
import '@element-plus/components/button/style/css'
import '@element-plus/components/button-group/style/css'
+import '@element-plus/components/select/style/css'
diff --git a/packages/components/calendar/style/index.ts b/packages/components/calendar/style/index.ts
index a4a0e8d98e..7c49659b7e 100644
--- a/packages/components/calendar/style/index.ts
+++ b/packages/components/calendar/style/index.ts
@@ -2,3 +2,4 @@ import '@element-plus/components/base/style'
import '@element-plus/theme-chalk/src/calendar.scss'
import '@element-plus/components/button/style'
import '@element-plus/components/button-group/style'
+import '@element-plus/components/select/style'
diff --git a/packages/theme-chalk/src/calendar.scss b/packages/theme-chalk/src/calendar.scss
index d0cf1d5a1f..a309ab5444 100644
--- a/packages/theme-chalk/src/calendar.scss
+++ b/packages/theme-chalk/src/calendar.scss
@@ -22,6 +22,20 @@
@include e(body) {
padding: 12px 20px 35px;
}
+
+ @include e(select-controller) {
+ .#{$namespace}-select {
+ margin-right: 8px;
+ }
+
+ .#{$namespace}-calendar-select__year {
+ width: 120px;
+ }
+
+ .#{$namespace}-calendar-select__month {
+ width: 60px;
+ }
+ }
}
@include b(calendar-table) {