Skip to content

Commit

Permalink
fix(DateField): rebuild focusable element Set on locale change (#1132)
Browse files Browse the repository at this point in the history
* fix(DateField): rebuild focusable elements set on locale change

* chore(DateField): lint fix

* refactor: extract element query to utils
  • Loading branch information
epr3 authored Jul 19, 2024
1 parent 6b6abc5 commit f63b9c1
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 10 deletions.
16 changes: 12 additions & 4 deletions packages/radix-vue/src/DateField/DateFieldRoot.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
getDefaultDate,
} from '@/shared/date'
import { type Matcher, hasTime, isBefore } from '@/date'
import { createContent, initializeSegmentValues, isSegmentNavigationKey, syncSegmentValues } from './utils'
import { createContent, getSegmentElements, initializeSegmentValues, isSegmentNavigationKey, syncSegmentValues } from './utils'
import type { Direction } from '@/shared/types'
type DateFieldRootContext = {
Expand Down Expand Up @@ -81,7 +81,7 @@ export const [injectDateFieldRootContext, provideDateFieldRootContext]
</script>

<script setup lang="ts">
import { computed, onMounted, ref, toRefs, watch } from 'vue'
import { computed, nextTick, onMounted, ref, toRefs, watch } from 'vue'
import { Primitive, usePrimitiveElement } from '@/Primitive'
import { useVModel } from '@vueuse/core'
Expand Down Expand Up @@ -118,7 +118,7 @@ const { primitiveElement, currentElement: parentElement }
const segmentElements = ref<Set<HTMLElement>>(new Set())
onMounted(() => {
Array.from(parentElement.value.querySelectorAll('[data-radix-vue-date-field-segment]')).filter(item => item.getAttribute('data-radix-vue-date-field-segment') !== 'literal').forEach(el => segmentElements.value.add(el as HTMLElement))
getSegmentElements(parentElement.value).forEach(item => segmentElements.value.add(item as HTMLElement))
})
const modelValue = useVModel(props, 'modelValue', emits, {
Expand Down Expand Up @@ -179,8 +179,15 @@ const segmentContents = computed(() => allSegmentContent.value.arr)
const editableSegmentContents = computed(() => segmentContents.value.filter(({ part }) => part !== 'literal'))
watch(locale, (value) => {
if (formatter.getLocale() !== value)
if (formatter.getLocale() !== value) {
formatter.setLocale(value)
// Locale changed, so we need to clear the segment elements and re-get them (different order)
// Get the focusable elements again on the next tick
nextTick(() => {
segmentElements.value.clear()
getSegmentElements(parentElement.value).forEach(item => segmentElements.value.add(item as HTMLElement))
})
}
})
watch(modelValue, (_modelValue) => {
Expand Down Expand Up @@ -273,6 +280,7 @@ defineExpose({
:dir="dir"
@keydown.left.right="handleKeydown"
>
{{ currentSegmentIndex }}
<slot
:model-value="modelValue"
:segments="segmentContents"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import { Label } from '@/Label'
<Label
class="text-sm text-gray9"
for="date-field"
>Appointment (unavailable on 19th)</Label>
>
Appointment (unavailable on 19th)
</Label>
<DateFieldRoot
id="date-field"
v-slot="{ segments, isInvalid }"
Expand Down Expand Up @@ -40,7 +42,9 @@ import { Label } from '@/Label'
<span
v-if="isInvalid"
class="text-red-500"
>Invalidddd</span>
>
Invalid
</span>
</DateFieldRoot>
</div>
</Variant>
Expand Down
4 changes: 4 additions & 0 deletions packages/radix-vue/src/DateField/utils/segment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,7 @@ export function isAcceptableSegmentKey(key: string) {
return true
return false
}

export function getSegmentElements(parentElement: HTMLElement): Element[] {
return Array.from(parentElement.querySelectorAll('[data-radix-vue-date-field-segment]')).filter(item => item.getAttribute('data-radix-vue-date-field-segment') !== 'literal')
}
15 changes: 11 additions & 4 deletions packages/radix-vue/src/DateRangeField/DateRangeFieldRoot.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
hasTime,
isBefore,
} from '@/date'
import { createContent, initializeSegmentValues, isSegmentNavigationKey, syncSegmentValues } from '@/DateField/utils'
import { createContent, getSegmentElements, initializeSegmentValues, isSegmentNavigationKey, syncSegmentValues } from '@/DateField/utils'
import type { Direction } from '@/shared/types'
export type DateRangeType = 'start' | 'end'
Expand Down Expand Up @@ -90,7 +90,7 @@ export const [injectDateRangeFieldRootContext, provideDateRangeFieldRootContext]
</script>

<script setup lang="ts">
import { computed, onMounted, ref, toRefs, watch } from 'vue'
import { computed, nextTick, onMounted, ref, toRefs, watch } from 'vue'
import { Primitive, usePrimitiveElement } from '@/Primitive'
import { useVModel } from '@vueuse/core'
Expand All @@ -116,7 +116,7 @@ const segmentElements = ref<Set<HTMLElement>>(new Set())
const dir = useDirection(propsDir)
onMounted(() => {
Array.from(parentElement.value.querySelectorAll('[data-radix-vue-date-field-segment]')).filter(item => item.getAttribute('data-radix-vue-date-field-segment') !== 'literal').forEach(el => segmentElements.value.add(el as HTMLElement))
getSegmentElements(parentElement.value).forEach(item => segmentElements.value.add(item as HTMLElement))
})
const modelValue = useVModel(props, 'modelValue', emits, {
Expand Down Expand Up @@ -264,8 +264,15 @@ watch([startValue, locale], ([_startValue]) => {
})
watch(locale, (value) => {
if (formatter.getLocale() !== value)
if (formatter.getLocale() !== value) {
formatter.setLocale(value)
// Locale changed, so we need to clear the segment elements and re-get them (different order)
// Get the focusable elements again on the next tick
nextTick(() => {
segmentElements.value.clear()
getSegmentElements(parentElement.value).forEach(item => segmentElements.value.add(item as HTMLElement))
})
}
})
watch(modelValue, (_modelValue) => {
Expand Down

0 comments on commit f63b9c1

Please sign in to comment.