diff --git a/packages/radix-vue/src/DateField/DateField.test.ts b/packages/radix-vue/src/DateField/DateField.test.ts
index a9999ce00..4c581fdfe 100644
--- a/packages/radix-vue/src/DateField/DateField.test.ts
+++ b/packages/radix-vue/src/DateField/DateField.test.ts
@@ -42,13 +42,14 @@ function thisTimeZone(date: string): string {
function setup(props: { dateFieldProps?: DateFieldRootProps, emits?: { 'onUpdate:modelValue'?: (data: DateValue) => void } } = {}) {
const user = userEvent.setup()
const returned = render(DateField, { props })
+ const value = returned.getByTestId('value')
const month = returned.getByTestId('month')
const day = returned.getByTestId('day')
const year = returned.getByTestId('year')
const input = returned.getByTestId('input')
const label = returned.getByTestId('label')
- return { ...returned, user, month, day, year, input, label }
+ return { ...returned, user, month, day, year, input, label, value }
}
it('should pass axe accessibility tests', async () => {
@@ -439,6 +440,37 @@ describe('dateField', async () => {
expect(dayPeriod).toHaveFocus()
})
+ it('updates the hour on the modelValue if the dayPeriod is updated', async () => {
+ const { getByTestId, user, value, rerender } = setup({
+ dateFieldProps: {
+ modelValue: calendarDateTime,
+ granularity: 'second',
+ },
+ emits: {
+ 'onUpdate:modelValue': (data: DateValue) => {
+ return rerender({
+ dateFieldProps: {
+ modelValue: data,
+ granularity: 'second',
+ },
+ })
+ },
+ },
+ })
+
+ const dayPeriod = getByTestId('dayPeriod')
+ expect(value.textContent).toBe(calendarDateTime.toString())
+ await user.click(dayPeriod)
+ await user.keyboard('{a}')
+ expect(getByTestId('value').textContent).toBe(calendarDateTime.subtract({ hours: 12 }).toString())
+ await user.keyboard('{p}')
+ expect(getByTestId('value').textContent).toBe(calendarDateTime.toString())
+ await user.keyboard('{A}')
+ expect(getByTestId('value').textContent).toBe(calendarDateTime.subtract({ hours: 12 }).toString())
+ await user.keyboard('{P}')
+ expect(getByTestId('value').textContent).toBe(calendarDateTime.toString())
+ })
+
it('fully overwrites on first click and type - `month`', async () => {
const { user, month } = setup({
dateFieldProps: {
diff --git a/packages/radix-vue/src/DateField/story/_DateField.vue b/packages/radix-vue/src/DateField/story/_DateField.vue
index c6e4f76ca..0ce96e543 100644
--- a/packages/radix-vue/src/DateField/story/_DateField.vue
+++ b/packages/radix-vue/src/DateField/story/_DateField.vue
@@ -12,12 +12,14 @@ const props = defineProps<{ dateFieldProps?: DateFieldRootProps, emits?: { 'onUp
{{ item.value }}
+
+ {{ modelValue }}
diff --git a/packages/radix-vue/src/DateField/useDateField.ts b/packages/radix-vue/src/DateField/useDateField.ts
index f0ffcdac6..9cd7c6b52 100644
--- a/packages/radix-vue/src/DateField/useDateField.ts
+++ b/packages/radix-vue/src/DateField/useDateField.ts
@@ -770,13 +770,13 @@ export function useDateField(props: UseDateFieldProps) {
return
}
- if (e.key === 'a') {
+ if (['a', 'A'].includes(e.key) && props.segmentValues.value.dayPeriod !== 'AM') {
props.segmentValues.value.dayPeriod = 'AM'
props.segmentValues.value.hour = props.segmentValues.value.hour! - 12
return
}
- if (e.key === 'p') {
+ if (['p', 'P'].includes(e.key) && props.segmentValues.value.dayPeriod !== 'PM') {
props.segmentValues.value.dayPeriod = 'PM'
props.segmentValues.value.hour = props.segmentValues.value.hour! + 12
}
@@ -811,13 +811,7 @@ export function useDateField(props: UseDateFieldProps) {
if (!isSegmentNavigationKey(e.key) && e.key !== kbd.TAB && e.key !== kbd.SHIFT && isAcceptableSegmentKey(e.key)) {
if (Object.values(props.segmentValues.value).every(item => item !== null)) {
- let updateObject = { ...props.segmentValues.value as Record }
- if ('dayPeriod' in props.segmentValues.value) {
- updateObject = {
- ...updateObject,
- hour: props.segmentValues.value.dayPeriod === 'PM' && !props.modelValue.value ? props.segmentValues.value.hour! + 12 : props.segmentValues.value.hour!,
- }
- }
+ const updateObject = { ...props.segmentValues.value as Record }
let dateRef = props.placeholder.value.copy()
diff --git a/packages/radix-vue/src/DateField/utils/segment.ts b/packages/radix-vue/src/DateField/utils/segment.ts
index 7d7f08393..9fb950172 100644
--- a/packages/radix-vue/src/DateField/utils/segment.ts
+++ b/packages/radix-vue/src/DateField/utils/segment.ts
@@ -23,6 +23,10 @@ export function isAcceptableSegmentKey(key: string) {
kbd.ARROW_RIGHT,
kbd.BACKSPACE,
kbd.SPACE,
+ 'a',
+ 'A',
+ 'p',
+ 'P',
]
if (acceptableSegmentKeys.includes(key))
return true