11<script lang="ts" setup>
2+ import { computed } from ' vue'
3+
24import { useRandomId } from ' ../../utils/random-utils'
35
46import 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
2527defineEmits <{ (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