Skip to content

Commit b030df8

Browse files
committed
fix(VTimePicker): keep hour value when changing AM/PM
1 parent d8d16e1 commit b030df8

3 files changed

Lines changed: 43 additions & 2 deletions

File tree

packages/vuetify/src/components/VTimePicker/VTimePicker.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ export const VTimePicker = genericComponent<VTimePickerSlots>()({
114114
watch(inputMinute, emitValue)
115115
watch(inputSecond, emitValue)
116116

117+
watch(period, (newPeriod, oldPeriod) => {
118+
if (inputHour.value == null || newPeriod === oldPeriod) return
119+
if (newPeriod === 'pm' && inputHour.value < 12) {
120+
inputHour.value = inputHour.value + 12
121+
} else if (newPeriod === 'am' && inputHour.value >= 12) {
122+
inputHour.value = inputHour.value - 12
123+
}
124+
})
125+
117126
watch(() => props.modelValue, val => setInputData(val))
118127

119128
watch(() => props.useSeconds, (val, old) => {

packages/vuetify/src/components/VTimePicker/VTimePickerControls.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,6 @@ export const VTimePickerControls = genericComponent()({
226226

227227
function setPeriod (val: Period) {
228228
emit('update:period', val)
229-
const next = findNextAllowed('hour', val === 'am' ? 23 : 11, true)
230-
nextTick(() => hour.value = pad(next))
231229
}
232230

233231
const hourInputRef = ref<VTimePickerField>()

packages/vuetify/src/components/VTimePicker/__tests__/VTimePicker.spec.browser.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,39 @@ describe('VTimePicker', () => {
149149
expect(minuteInput).not.toHaveClass('v-input--error')
150150
})
151151
})
152+
153+
describe('AM/PM period toggle', () => {
154+
it('should preserve hour value when switching between AM and PM', async () => {
155+
const model = ref<string | null>('09:45')
156+
render(() => (
157+
<VTimePicker
158+
v-model={ model.value }
159+
variant="input"
160+
/>
161+
))
162+
163+
expect(model.value).toBe('09:45')
164+
await userEvent.click(screen.getByCSS('.v-time-picker-controls__ampm__pm'))
165+
expect(model.value).toBe('21:45')
166+
await userEvent.click(screen.getByCSS('.v-time-picker-controls__ampm__am'))
167+
expect(model.value).toBe('09:45')
168+
})
169+
170+
it('should preserve hour 12 when switching periods', async () => {
171+
const model = ref<string | null>('00:15')
172+
render(() => (
173+
<VTimePicker
174+
v-model={ model.value }
175+
variant="input"
176+
/>
177+
))
178+
179+
expect(model.value).toBe('00:15')
180+
await userEvent.click(screen.getByCSS('.v-time-picker-controls__ampm__pm'))
181+
expect(model.value).toBe('12:15')
182+
await userEvent.click(screen.getByCSS('.v-time-picker-controls__ampm__am'))
183+
expect(model.value).toBe('00:15')
184+
})
185+
})
152186
})
153187
})

0 commit comments

Comments
 (0)