Skip to content

Commit 713f209

Browse files
committed
fix(DsfrInputGroup): amélioration de l'accessibilité
1 parent cd39ec3 commit 713f209

File tree

1 file changed

+32
-8
lines changed

1 file changed

+32
-8
lines changed

src/components/DsfrInput/DsfrInputGroup.vue

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts" setup>
2+
import { computed } from 'vue'
3+
24
import { useRandomId } from '../../utils/random-utils'
35
46
import DsfrInput from './DsfrInput.vue'
@@ -10,7 +12,7 @@ defineOptions({
1012
inheritAttrs: false,
1113
})
1214
13-
withDefaults(defineProps<DsfrInputGroupProps>(), {
15+
const props = withDefaults(defineProps<DsfrInputGroupProps>(), {
1416
descriptionId: () => useRandomId('input', 'group'),
1517
hint: '',
1618
label: '',
@@ -23,6 +25,28 @@ withDefaults(defineProps<DsfrInputGroupProps>(), {
2325
})
2426
2527
defineEmits<{ (e: 'update:modelValue', payload: string): void }>()
28+
29+
function getDescriptionIdFromArray (messages: string[], baseId: string): string {
30+
return Array.from(Array.from({ length: messages.length })).map((_, idx) => `${baseId}-${idx + 1}`).join(' ')
31+
}
32+
const descId = computed(() => {
33+
if (!props.errorMessage && !props.validMessage) {
34+
return undefined
35+
}
36+
if (Array.isArray(props.errorMessage)) {
37+
return getDescriptionIdFromArray(props.errorMessage, props.descriptionId)
38+
}
39+
if (typeof props.errorMessage === 'string') {
40+
return props.errorMessage
41+
}
42+
if (typeof props.validMessage === 'string') {
43+
return props.validMessage
44+
}
45+
if (Array.isArray(props.validMessage)) {
46+
return getDescriptionIdFromArray(props.validMessage, props.descriptionId)
47+
}
48+
return undefined
49+
})
2650
</script>
2751

2852
<template>
@@ -41,7 +65,7 @@ defineEmits<{ (e: 'update:modelValue', payload: string): void }>()
4165
<slot
4266
:is-valid="!!validMessage"
4367
:is-invalid="!!errorMessage"
44-
:description-id="((errorMessage || validMessage) && descriptionId) || undefined"
68+
:description-id="descId"
4569
/>
4670
<DsfrInput
4771
v-if="!$slots.default"
@@ -50,7 +74,7 @@ defineEmits<{ (e: 'update:modelValue', payload: string): void }>()
5074
:is-invalid="!!errorMessage"
5175
:label="label"
5276
:hint="hint"
53-
:description-id="((errorMessage || validMessage) && descriptionId) || undefined"
77+
:description-id="descId"
5478
:label-visible="labelVisible"
5579
:model-value="modelValue"
5680
:placeholder="placeholder"
@@ -65,8 +89,8 @@ defineEmits<{ (e: 'update:modelValue', payload: string): void }>()
6589
v-if="Array.isArray(errorMessage)"
6690
>
6791
<p
68-
v-for="message in errorMessage"
69-
:id="descriptionId"
92+
v-for="(message, idx) in errorMessage"
93+
:id="`${descriptionId}-${idx + 1}`"
7094
:key="message"
7195
:data-testid="descriptionId"
7296
class="fr-error-text"
@@ -85,11 +109,11 @@ defineEmits<{ (e: 'update:modelValue', payload: string): void }>()
85109
</p>
86110

87111
<template
88-
v-if="Array.isArray(validMessage)"
112+
v-else-if="Array.isArray(validMessage)"
89113
>
90114
<p
91-
v-for="message in validMessage"
92-
:id="descriptionId"
115+
v-for="(message, idx) in validMessage"
116+
:id="`${descriptionId}-${idx + 1}`"
93117
:key="message"
94118
:data-testid="descriptionId"
95119
class="fr-valid-text"

0 commit comments

Comments
 (0)