Skip to content

Commit 879d1f2

Browse files
committed
feat: add a maxDate prop on datepicker
1 parent d3a62f2 commit 879d1f2

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

packages/design-system/src/components/OcDatepicker/OcDatepicker.vue

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
:label="label"
66
type="date"
77
:min="minDate?.toISODate()"
8+
:max="maxDate?.toISODate()"
89
:fix-message-line="true"
910
:error-message="errorMessage"
1011
:clear-button-enabled="isClearable"
@@ -25,7 +26,8 @@ export default defineComponent({
2526
label: { type: String, required: true },
2627
isClearable: { type: Boolean, default: true },
2728
currentDate: { type: Object as PropType<DateTime>, required: false, default: null },
28-
minDate: { type: Object as PropType<DateTime>, required: false, default: null }
29+
minDate: { type: Object as PropType<DateTime>, required: false, default: null },
30+
maxDate: { type: Object as PropType<DateTime>, required: false, default: null }
2931
},
3032
emits: ['dateChanged'],
3133
setup(props, { emit }) {
@@ -44,6 +46,13 @@ export default defineComponent({
4446
return unref(date) < props.minDate
4547
})
4648
49+
const isMaxDateExceeded = computed(() => {
50+
if (!props.maxDate || !unref(date)) {
51+
return false
52+
}
53+
return unref(date) > props.maxDate
54+
})
55+
4756
const errorMessage = computed(() => {
4857
if (unref(isMinDateUndercut)) {
4958
return $gettext('The date must be after %{date}', {
@@ -53,6 +62,14 @@ export default defineComponent({
5362
.toLocaleString(DateTime.DATE_SHORT)
5463
})
5564
}
65+
if (unref(isMaxDateExceeded)) {
66+
return $gettext('The date must be before %{date}', {
67+
date: props.maxDate
68+
.plus({ day: 1 })
69+
.setLocale(current)
70+
.toLocaleString(DateTime.DATE_SHORT)
71+
})
72+
}
5673
return ''
5774
})
5875
@@ -73,6 +90,7 @@ export default defineComponent({
7390
date,
7491
() => {
7592
emit('dateChanged', { date: unref(date), error: unref(isMinDateUndercut) })
93+
emit('dateChanged', { date: unref(date), error: unref(isMaxDateExceeded) })
7694
},
7795
{
7896
deep: true
@@ -97,7 +115,7 @@ export default defineComponent({
97115
```js
98116
<template>
99117
<div>
100-
<oc-datepicker :current-date="currentDate" :min-date="minDate" label="Enter or pick a date"
118+
<oc-datepicker :current-date="currentDate" :min-date="minDate" :max-date="maxDate" label="Enter or pick a date"
101119
@date-changed="onDateChanged"/>
102120
<p v-if="selectedDate" v-text="selectedDate"/>
103121
</div>
@@ -107,7 +125,7 @@ export default defineComponent({
107125

108126
export default {
109127
data: () => ({
110-
minDate: DateTime.now(), currentDate: DateTime.now(), selectedDate: ''
128+
minDate: DateTime.now(), currentDate: DateTime.now(), selectedDate: '', maxDate: null
111129
}),
112130
methods: {
113131
onDateChanged({date}) {

packages/web-app-files/src/components/Modals/DatePickerModal.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
:label="$gettext('Expiration date')"
44
type="date"
55
:min-date="minDate"
6+
:max-date="maxDate"
67
:current-date="currentDate"
78
:is-clearable="isClearable"
89
@date-changed="onDateChanged"
@@ -38,6 +39,7 @@ export default defineComponent({
3839
modal: { type: Object as PropType<Modal>, required: true },
3940
currentDate: { type: Object as PropType<DateTime>, required: false, default: null },
4041
minDate: { type: Object as PropType<DateTime>, required: false, default: null },
42+
maxDate: { type: Object as PropType<DateTime>, required: false, default: null },
4143
isClearable: { type: Boolean, default: true }
4244
},
4345
emits: ['confirm', 'cancel'],

0 commit comments

Comments
 (0)