diff --git a/src/components/generic/AErrorList.vue b/src/components/generic/AErrorList.vue new file mode 100644 index 0000000000000000000000000000000000000000..b2b32a1c9f6b4a8a345d9bec7ec76f2c5b59e990 --- /dev/null +++ b/src/components/generic/AErrorList.vue @@ -0,0 +1,27 @@ +<script lang="ts" setup> +import { computed } from 'vue' +import { useI18n } from '@/i18n' + +type Error = { + code?: string + message?: string +} + +const props = defineProps<{ + errors?: undefined | (Error | undefined | null)[] +}>() +const { t } = useI18n() +const errorList = computed<Error[]>(() => (props.errors ?? []).filter((e): e is Error => !!e)) +</script> + +<template> + <div v-if="errorList.length > 0" class="invalid-feedback"> + <template v-for="(error, index) in errorList" :key="index"> + <p class="last:tw-mb-0"> + {{ + error.code ? t(`error.${error.code}`) : error.message ? error.message : t('error.unknown') + }} + </p> + </template> + </div> +</template> diff --git a/src/components/generic/FormGroup.vue b/src/components/generic/FormGroup.vue index 0cab02480f9944c2d55394fb4b5022ef8295fe46..d703e327f9fd964818bd719214cd45dd2eba4c51 100644 --- a/src/components/generic/FormGroup.vue +++ b/src/components/generic/FormGroup.vue @@ -49,23 +49,7 @@ <slot name="iconLeft" :class="[iconClasses, 'tw-ml-2']" role="presentation" /> <slot name="iconRight" :class="[iconClasses, 'tw-mr-2']" role="presentation" /> </div> - <div - v-if="errors !== undefined && errors.length > 0" - :id="errorsId" - class="invalid-feedback" - > - <template v-for="(error, index) in errorList" :key="index"> - <p class="last:tw-mb-0"> - {{ - error.code - ? t(`error.${error.code}`) - : error.message - ? error.message - : t('error.unknown') - }} - </p> - </template> - </div> + <AErrorList :id="errorsId" :errors="errors" /> </div> </div> </APermissionGuard> @@ -73,10 +57,10 @@ <script lang="ts" setup> import { computed, inject, provide, useAttrs, useSlots } from 'vue' -import { useI18n } from '@/i18n' import { useId } from '@/util' import SaveIndicator from '@/components/generic/SaveIndicator.vue' import APermissionGuard, { PermissionGuardProps } from '@/components/generic/APermissionGuard.vue' +import AErrorList from '@/components/generic/AErrorList.vue' defineOptions({ inheritAttrs: false }) @@ -110,7 +94,6 @@ const emit = defineEmits<{ edit: [] }>() -const { t } = useI18n() const parentAttrs = useAttrs() const slots = useSlots() const formGroupClass = inject('formGroupClass', undefined)