Skip to content

Commit 5862e86

Browse files
fix(components): [date-picker] input should not be editable when editable is false (element-plus#23085)
fix(components): input should not be editable when editable is false
1 parent 198db2a commit 5862e86

File tree

6 files changed

+46
-2
lines changed

6 files changed

+46
-2
lines changed

packages/components/date-picker-panel/src/date-picker-com/panel-date-pick.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
size="small"
3535
:validate-event="false"
3636
:disabled="dateDisabled"
37+
:readonly="!editable"
3738
@input="(val) => (userInputDate = val)"
3839
@change="handleVisibleDateChange"
3940
/>
@@ -48,6 +49,7 @@
4849
size="small"
4950
:validate-event="false"
5051
:disabled="dateDisabled"
52+
:readonly="!editable"
5153
@focus="onTimePickerInputFocus"
5254
@input="(val) => (userInputTime = val)"
5355
@change="handleVisibleTimeChange"

packages/components/date-picker-panel/src/date-picker-com/panel-date-range.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
:class="drpNs.e('editor')"
3737
:model-value="minVisibleDate"
3838
:validate-event="false"
39+
:readonly="!editable"
3940
@input="(val) => handleDateInput(val, 'min')"
4041
@change="(val) => handleDateChange(val, 'min')"
4142
/>
@@ -51,6 +52,7 @@
5152
:placeholder="t('el.datepicker.startTime')"
5253
:model-value="minVisibleTime"
5354
:validate-event="false"
55+
:readonly="!editable"
5456
@focus="minTimePickerVisible = true"
5557
@input="(val) => handleTimeInput(val, 'min')"
5658
@change="(val) => handleTimeChange(val, 'min')"
@@ -75,7 +77,7 @@
7577
:disabled="rangeState.selecting || dateRangeDisabled"
7678
:placeholder="t('el.datepicker.endDate')"
7779
:model-value="maxVisibleDate"
78-
:readonly="!minDate"
80+
:readonly="!minDate || !editable"
7981
:validate-event="false"
8082
@input="(val) => handleDateInput(val, 'max')"
8183
@change="(val) => handleDateChange(val, 'max')"
@@ -91,7 +93,7 @@
9193
:disabled="rangeState.selecting || dateRangeDisabled"
9294
:placeholder="t('el.datepicker.endTime')"
9395
:model-value="maxVisibleTime"
94-
:readonly="!minDate"
96+
:readonly="!minDate || !editable"
9597
:validate-event="false"
9698
@focus="minDate && (maxTimePickerVisible = true)"
9799
@input="(val) => handleTimeInput(val, 'max')"

packages/components/date-picker-panel/src/props/date-picker-panel.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ export const datePickerPanelProps = buildProps({
119119
type: Boolean,
120120
default: true,
121121
},
122+
/**
123+
* @description whether the input is editable
124+
*/
125+
editable: {
126+
type: Boolean,
127+
default: true,
128+
},
122129
} as const)
123130

124131
export type DatePickerPanelProps = ExtractPropTypes<typeof datePickerPanelProps>

packages/components/date-picker-panel/src/props/shared.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ export const panelSharedProps = buildProps({
7575
showWeekNumber: Boolean,
7676
border: Boolean,
7777
disabled: Boolean,
78+
editable: {
79+
type: Boolean,
80+
default: true,
81+
},
7882
} as const)
7983

8084
export const panelRangeSharedProps = buildProps({

packages/components/date-picker/__tests__/date-time-picker.test.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,18 @@ describe('Datetime Picker', () => {
505505
'6',
506506
])
507507
})
508+
509+
it('should work with editable prop', async () => {
510+
const value = ref(new Date(2000, 10, 8, 10, 10))
511+
const wrapper = _mount(() => (
512+
<DatePicker v-model={value.value} editable={false} type="datetime" />
513+
))
514+
515+
const inputs = wrapper.findAllComponents({ name: 'ElInput' })
516+
inputs.forEach((input) => {
517+
expect(input.props().readonly).toBe(true)
518+
})
519+
})
508520
})
509521

510522
describe('Datetimerange', () => {
@@ -1219,4 +1231,20 @@ describe('Datetimerange', () => {
12191231
.textContent
12201232
).toBe('01')
12211233
})
1234+
1235+
it('should work with editable prop', async () => {
1236+
const modelValue = ['2025-09-01', '2025-09-07']
1237+
_mount(() => (
1238+
<DatePicker
1239+
modelValue={modelValue}
1240+
editable={false}
1241+
type="datetimerange"
1242+
/>
1243+
))
1244+
1245+
const inputs = document.querySelectorAll('input')
1246+
inputs.forEach((input) => {
1247+
expect(input.readOnly).toBe(true)
1248+
})
1249+
})
12221250
})

packages/components/date-picker/src/date-picker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default defineComponent({
7373
default: (scopedProps: /**FIXME: remove any type */ any) => (
7474
<ElDatePickerPanel
7575
disabled={props.disabled}
76+
editable={props.editable}
7677
border={false}
7778
{...scopedProps}
7879
>

0 commit comments

Comments
 (0)