feat(front): add error handling to InputGroupField component with aria attributes for accessibility

This commit is contained in:
keven1024
2026-04-22 08:40:14 +08:00
parent 706464ce3c
commit e8b5f98260

View File

@@ -6,7 +6,7 @@ const props = defineProps<{
label?: string label?: string
rules?: RuleExpression<string[]> rules?: RuleExpression<string[]>
}>() }>()
const { value, setValue } = useField<string[]>(props.name, props?.rules) const { value, setValue, errorMessage } = useField<string[]>(props.name, props?.rules)
const addInput = ref('') const addInput = ref('')
</script> </script>
@@ -17,22 +17,28 @@ const addInput = ref('')
<Input <Input
:model-value="item" :model-value="item"
@update:model-value="(v: string | number) => setValue(value.map((o, i) => (i === index ? String(v) : o)))" @update:model-value="(v: string | number) => setValue(value.map((o, i) => (i === index ? String(v) : o)))"
:aria-invalid="!!errorMessage || undefined"
v-bind="$attrs" v-bind="$attrs"
/> />
<Button variant="ghost" size="icon" @click="setValue(value.filter((_, i) => i !== index))"><LucideX class="size-4" /></Button> <Button variant="ghost" size="icon" @click="setValue(value.filter((_, i) => i !== index))"><LucideX class="size-4" /></Button>
</div> </div>
<div class="flex flex-row gap-2 items-center"> <div class="flex flex-row gap-2 items-center">
<Input v-model="addInput" v-bind="$attrs" /> <Input v-model="addInput" :aria-invalid="!!errorMessage || undefined" v-bind="$attrs" />
<Button <Button
size="icon" size="icon"
@click=" @click="
() => { () => {
setValue([...(value || []), addInput]) const nextValue = addInput.trim()
if (!nextValue) {
return
}
setValue([...(value || []), nextValue])
addInput = '' addInput = ''
} }
" "
><LucidePlus class="size-4" ><LucidePlus class="size-4"
/></Button> /></Button>
</div> </div>
<p v-if="errorMessage" class="text-sm text-destructive">{{ errorMessage }}</p>
</div> </div>
</template> </template>