diff --git a/dashboard/src/components/UserDialog.vue b/dashboard/src/components/UserDialog.vue index c19d007e8..107fe30c3 100644 --- a/dashboard/src/components/UserDialog.vue +++ b/dashboard/src/components/UserDialog.vue @@ -5,7 +5,7 @@ const i18n = useI18n(); const t = i18n.t; import { ref, useTemplateRef, inject } from 'vue'; -import { Dialog, TextInput, FormGroup, Checkbox, MultiSelect, SingleSelect } from '@cloudron/pankow'; +import { Dialog, TextInput, EmailInput, FormGroup, Checkbox, MultiSelect, SingleSelect } from '@cloudron/pankow'; import { ROLES } from '../constants.js'; import ImagePicker from '../components/ImagePicker.vue'; import DashboardModel from '../models/DashboardModel.js'; @@ -66,6 +66,11 @@ function onAvatarChanged(file) { avatarFile = file; } +const isFormValid = ref(false); +function validateForm() { + isFormValid.value = form.value && form.value.checkValidity(); +} + async function onSubmit() { if (!form.value.reportValidity()) return; @@ -231,7 +236,7 @@ defineExpose({ :title="user ? $t('users.editUserDialog.title') : $t('users.addUserDialog.title')" :confirm-label="user ? $t('main.dialog.save') : $t('users.addUserDialog.addUserAction')" :confirm-busy="busy" - :confirm-active="!busy" + :confirm-active="!busy && isFormValid" reject-style="secondary" :reject-label="$t('main.dialog.cancel')" :reject-active="!busy" @@ -241,13 +246,9 @@ defineExpose({ @alternate="onReset2FA()" @confirm="onSubmit()" > -

{{ $t('users.editUserDialog.externalLdapWarning') }}

- -
{{ formError.generic }}
- -
+
- +
@@ -255,18 +256,21 @@ defineExpose({
- +
{{ $t('users.editUserDialog.externalLdapWarning') }}
+
{{ formError.generic }}
+ + {{ $t('users.user.usernamePlaceholder') }} -
{{ formError.username }}
+
{{ formError.username }}
- -
{{ formError.email }}
+ +
{{ formError.email }}
@@ -277,14 +281,14 @@ defineExpose({ - + {{ $t('users.user.fallbackEmailPlaceholder') }} -
{{ formError.role }}
+
{{ formError.role }}
@@ -296,7 +300,7 @@ defineExpose({ - +