diff --git a/packages/date-picker/__tests__/date-picker.spec.ts b/packages/date-picker/__tests__/date-picker.spec.ts index d0018468cd..b94d3db600 100644 --- a/packages/date-picker/__tests__/date-picker.spec.ts +++ b/packages/date-picker/__tests__/date-picker.spec.ts @@ -176,6 +176,21 @@ describe('DatePicker', () => { await nextTick() expect(document.querySelector('.disabled')).not.toBeNull() }) + + it('ref focus', async () => { + _mount(``, () => ({ value: '' }), { + mounted() { + this.$refs.input.focus() + }, + }) + await nextTick() + const popperEl = document.querySelector('.el-picker__popper') + const attr = popperEl.getAttribute('aria-hidden') + expect(attr).toEqual('false') + }) }) describe('DatePicker Navigation', () => { diff --git a/packages/date-picker/src/date-picker.ts b/packages/date-picker/src/date-picker.ts index 977594fbac..d3468e6734 100644 --- a/packages/date-picker/src/date-picker.ts +++ b/packages/date-picker/src/date-picker.ts @@ -1,4 +1,4 @@ -import { defineComponent } from 'vue' +import { defineComponent, ref } from 'vue' import { DEFAULT_FORMATS_DATE, DEFAULT_FORMATS_DATEPICKER } from '@element-plus/time-picker' import { CommonPicker, defaultProps } from '@element-plus/time-picker' import DatePickPanel from './date-picker-com/panel-date-pick.vue' @@ -44,11 +44,20 @@ export default defineComponent({ }, emits: ['update:modelValue'], setup(props, ctx) { + const commonPicker = ref(null) const format = DEFAULT_FORMATS_DATEPICKER[props.type] || DEFAULT_FORMATS_DATE + const refProps = { + ...props, + focus: () => { + commonPicker.value?.handleFocus() + }, + } + ctx.expose(refProps) return () => h(CommonPicker, { format, ...props, // allow format to be overwrite type: props.type, + ref: commonPicker, 'onUpdate:modelValue': value => ctx.emit('update:modelValue', value), }, { diff --git a/packages/directives/click-outside/index.ts b/packages/directives/click-outside/index.ts index 98ba3b0e79..96e3005239 100644 --- a/packages/directives/click-outside/index.ts +++ b/packages/directives/click-outside/index.ts @@ -42,7 +42,7 @@ function createDocumentHandler( popperRef: Nullable }>).popperRef const mouseUpTarget = mouseup.target as Node - const mouseDownTarget = mousedown.target as Node + const mouseDownTarget = mousedown?.target as Node const isBound = !binding || !binding.instance const isTargetExists = !mouseUpTarget || !mouseDownTarget const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget) diff --git a/packages/time-picker/__tests__/time-picker.spec.ts b/packages/time-picker/__tests__/time-picker.spec.ts index 0029ab15c0..d8eb9a9b6b 100644 --- a/packages/time-picker/__tests__/time-picker.spec.ts +++ b/packages/time-picker/__tests__/time-picker.spec.ts @@ -289,6 +289,21 @@ describe('TimePicker', () => { expect(enabledMinutes).toEqual([0]) expect(enabledSeconds).toEqual([0]) }) + + it('ref focus', async () => { + _mount(``, () => ({ value: new Date(2016, 9, 10, 18, 40) }), { + mounted() { + this.$refs.input.focus() + }, + }) + await nextTick() + const popperEl = document.querySelector('.el-picker__popper') + const attr = popperEl.getAttribute('aria-hidden') + expect(attr).toEqual('false') + }) }) describe('TimePicker(range)', () => { diff --git a/packages/time-picker/src/common/picker.vue b/packages/time-picker/src/common/picker.vue index 8b77089158..ee0cd7683a 100644 --- a/packages/time-picker/src/common/picker.vue +++ b/packages/time-picker/src/common/picker.vue @@ -207,7 +207,7 @@ export default defineComponent({ valueOnOpen.value = props.modelValue } }) - const emitChange = (val, isClear) => { + const emitChange = (val, isClear?: boolean) => { // determine user real change only if (isClear || !valueEquals(val, valueOnOpen.value)) { ctx.emit('change', val) diff --git a/packages/time-picker/src/time-picker.ts b/packages/time-picker/src/time-picker.ts index a028c4efca..d782046aef 100644 --- a/packages/time-picker/src/time-picker.ts +++ b/packages/time-picker/src/time-picker.ts @@ -1,4 +1,4 @@ -import { defineComponent, h } from 'vue' +import { defineComponent, h, ref } from 'vue' import dayjs from 'dayjs' import customParseFormat from 'dayjs/plugin/customParseFormat' import { DEFAULT_FORMATS_TIME } from './common/constant' @@ -20,12 +20,21 @@ export default defineComponent({ }, emits: ['update:modelValue'], setup(props, ctx) { + const commonPicker = ref(null) const type = props.isRange ? 'timerange' : 'time' const panel = props.isRange ? TimeRangePanel : TimePickPanel + const refProps = { + ...props, + focus: () => { + commonPicker.value?.handleFocus() + }, + } + ctx.expose(refProps) return () => h(Picker, { format: DEFAULT_FORMATS_TIME, ...props, // allow format to be overwrite type, + ref: commonPicker, 'onUpdate:modelValue': value => ctx.emit('update:modelValue', value), }, {