Skip to content

Commit 836f2e9

Browse files
zernoniaclaude
andauthored
fix(MonthPicker, YearPicker): preserve day/month when selecting (#2594)
* fix(MonthPicker, YearPicker): preserve day/month when selecting month or year MonthPicker was resetting the day to 1 and YearPicker was resetting both month and day to 1 when a new value was selected, because grid cells are constructed with startOfMonth/startOfYear. Now the selected month/year is applied to the existing modelValue or placeholder, preserving other segments. Closes #2587, closes #2588 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: preserve era when paging across BC/AD boundaries Use the selected value as the base (preserving its era) and copy month/day from the reference, instead of the other way around. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 1d77296 commit 836f2e9

4 files changed

Lines changed: 32 additions & 20 deletions

File tree

packages/core/src/MonthPicker/MonthPickerRoot.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,23 +205,29 @@ watch(modelValue, (_modelValue) => {
205205
}
206206
})
207207
208+
function resolveMonthValue(value: DateValue, reference?: DateValue) {
209+
if (!reference)
210+
return value.copy()
211+
return value.copy().set({ day: reference.day })
212+
}
213+
208214
function onMonthChange(value: DateValue) {
209215
if (!multiple.value) {
210216
if (!modelValue.value) {
211-
modelValue.value = value.copy()
217+
modelValue.value = resolveMonthValue(value, placeholder.value)
212218
return
213219
}
214220
215221
if (!preventDeselect.value && isSameYearMonth(modelValue.value as DateValue, value)) {
216-
placeholder.value = value.copy()
222+
placeholder.value = resolveMonthValue(value, modelValue.value as DateValue)
217223
modelValue.value = undefined
218224
}
219225
else {
220-
modelValue.value = value.copy()
226+
modelValue.value = resolveMonthValue(value, modelValue.value as DateValue)
221227
}
222228
}
223229
else if (!modelValue.value) {
224-
modelValue.value = [value.copy()]
230+
modelValue.value = [resolveMonthValue(value, placeholder.value)]
225231
}
226232
else {
227233
const modelValueArray = Array.isArray(modelValue.value)
@@ -230,12 +236,12 @@ function onMonthChange(value: DateValue) {
230236
231237
const index = modelValueArray.findIndex(date => isSameYearMonth(date, value))
232238
if (index === -1) {
233-
modelValue.value = [...modelValueArray, value.copy()]
239+
modelValue.value = [...modelValueArray, resolveMonthValue(value, placeholder.value)]
234240
}
235241
else if (!preventDeselect.value) {
236242
const next = modelValueArray.filter(date => !isSameYearMonth(date, value))
237243
if (!next.length) {
238-
placeholder.value = value.copy()
244+
placeholder.value = resolveMonthValue(value, modelValueArray[index])
239245
modelValue.value = undefined
240246
return
241247
}

packages/core/src/MonthPicker/useMonthPicker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ export function useMonthPicker(props: UseMonthPickerProps) {
134134
if (nextPageFunc || props.nextPage.value) {
135135
const newDate = (nextPageFunc || props.nextPage.value)!(currentDate)
136136
grid.value = createMonthGrid({ dateObj: newDate })
137-
props.placeholder.value = newDate.set({ day: 1 })
137+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
138138
return
139139
}
140140

141141
const newDate = currentDate.add({ years: 1 })
142142
grid.value = createMonthGrid({ dateObj: newDate })
143-
props.placeholder.value = newDate.set({ day: 1 })
143+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
144144
}
145145

146146
const prevPage = (prevPageFunc?: (date: DateValue) => DateValue) => {
@@ -149,13 +149,13 @@ export function useMonthPicker(props: UseMonthPickerProps) {
149149
if (prevPageFunc || props.prevPage.value) {
150150
const newDate = (prevPageFunc || props.prevPage.value)!(currentDate)
151151
grid.value = createMonthGrid({ dateObj: newDate })
152-
props.placeholder.value = newDate.set({ day: 1 })
152+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
153153
return
154154
}
155155

156156
const newDate = currentDate.subtract({ years: 1 })
157157
grid.value = createMonthGrid({ dateObj: newDate })
158-
props.placeholder.value = newDate.set({ day: 1 })
158+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
159159
}
160160

161161
watch(props.placeholder, (value) => {

packages/core/src/YearPicker/YearPickerRoot.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,33 +211,39 @@ watch(modelValue, (_modelValue) => {
211211
}
212212
})
213213
214+
function resolveYearValue(value: DateValue, reference?: DateValue) {
215+
if (!reference)
216+
return value.copy()
217+
return value.copy().set({ month: reference.month, day: reference.day })
218+
}
219+
214220
function onYearChange(value: DateValue) {
215221
if (!multiple.value) {
216222
if (!modelValue.value) {
217-
modelValue.value = value.copy()
223+
modelValue.value = resolveYearValue(value, placeholder.value)
218224
return
219225
}
220226
221227
if (!preventDeselect.value && isSameYear(modelValue.value as DateValue, value)) {
222-
placeholder.value = value.copy()
228+
placeholder.value = resolveYearValue(value, modelValue.value as DateValue)
223229
modelValue.value = undefined
224230
}
225231
else {
226-
modelValue.value = value.copy()
232+
modelValue.value = resolveYearValue(value, modelValue.value as DateValue)
227233
}
228234
}
229235
else if (!modelValue.value) {
230-
modelValue.value = [value.copy()]
236+
modelValue.value = [resolveYearValue(value, placeholder.value)]
231237
}
232238
else if (Array.isArray(modelValue.value)) {
233239
const index = modelValue.value.findIndex(date => isSameYear(date, value))
234240
if (index === -1) {
235-
modelValue.value = [...modelValue.value, value.copy()]
241+
modelValue.value = [...modelValue.value, resolveYearValue(value, placeholder.value)]
236242
}
237243
else if (!preventDeselect.value) {
238244
const next = modelValue.value.filter(date => !isSameYear(date, value))
239245
if (!next.length) {
240-
placeholder.value = value.copy()
246+
placeholder.value = resolveYearValue(value, modelValue.value[index])
241247
modelValue.value = undefined
242248
return
243249
}

packages/core/src/YearPicker/useYearPicker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,13 @@ export function useYearPicker(props: UseYearPickerProps) {
138138
if (nextPageFunc || props.nextPage.value) {
139139
const newDate = (nextPageFunc || props.nextPage.value)!(firstYearInGrid)
140140
grid.value = createYearGrid({ dateObj: newDate, yearsPerPage: props.yearsPerPage.value, decadeAligned: false })
141-
props.placeholder.value = newDate.set({ month: 1, day: 1 })
141+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
142142
return
143143
}
144144

145145
const newDate = firstYearInGrid.add({ years: props.yearsPerPage.value })
146146
grid.value = createYearGrid({ dateObj: newDate, yearsPerPage: props.yearsPerPage.value, decadeAligned: false })
147-
props.placeholder.value = newDate.set({ month: 1, day: 1 })
147+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
148148
}
149149

150150
const prevPage = (prevPageFunc?: (date: DateValue) => DateValue) => {
@@ -153,13 +153,13 @@ export function useYearPicker(props: UseYearPickerProps) {
153153
if (prevPageFunc || props.prevPage.value) {
154154
const newDate = (prevPageFunc || props.prevPage.value)!(firstYearInGrid)
155155
grid.value = createYearGrid({ dateObj: newDate, yearsPerPage: props.yearsPerPage.value, decadeAligned: false })
156-
props.placeholder.value = newDate.set({ month: 1, day: 1 })
156+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
157157
return
158158
}
159159

160160
const newDate = firstYearInGrid.subtract({ years: props.yearsPerPage.value })
161161
grid.value = createYearGrid({ dateObj: newDate, yearsPerPage: props.yearsPerPage.value, decadeAligned: false })
162-
props.placeholder.value = newDate.set({ month: 1, day: 1 })
162+
props.placeholder.value = newDate.set({ month: props.placeholder.value.month, day: props.placeholder.value.day })
163163
}
164164

165165
watch(props.placeholder, (value) => {

0 commit comments

Comments
 (0)