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)