diff --git a/packages/sshecret-frontend/src/components/clients/ClientForm.vue b/packages/sshecret-frontend/src/components/clients/ClientForm.vue index 525d723..527e857 100644 --- a/packages/sshecret-frontend/src/components/clients/ClientForm.vue +++ b/packages/sshecret-frontend/src/components/clients/ClientForm.vue @@ -84,7 +84,11 @@ const sourceField = ref() const publicKeyField = ref() const clientCreateForm = ref() -const props = defineProps<{ client?: Client | null; errors: any[] | null }>() +interface Props { + client?: Client + errors?: any[] +} +const props = defineProps() const emit = defineEmits<{ (e: 'submit', data: ClientCreate): void (e: 'cancel'): void @@ -198,61 +202,3 @@ async function submitForm() { } } - - diff --git a/packages/sshecret-frontend/src/components/secrets/SecretForm.vue b/packages/sshecret-frontend/src/components/secrets/SecretForm.vue index 69fd442..255e602 100644 --- a/packages/sshecret-frontend/src/components/secrets/SecretForm.vue +++ b/packages/sshecret-frontend/src/components/secrets/SecretForm.vue @@ -6,7 +6,8 @@ autocomplete="off" help-text="Name of the secret" :value="secretName" - @input="secretName = $event.target.value" + @sl-input="secretName = $event.target.value" + @input="emit('clearErrors')" ref="nameField" > @@ -71,6 +73,8 @@ import { useAlertsStore } from '@/store/useAlertsStore' import { SshecretAdmin } from '@/client' import { SshecretObjectType } from '@/api/types' import { splitPath } from '@/api/paths' +import { ValidationError } from '@/api/errors' +import { assertSdkResponseOk } from '@/api/AssertSdkResponseOk' import SecretGroup from '@/components/secrets/SecretGroup.vue' import SecretGroupTreeItem from '@/components/secrets/SecretGroupTreeItem.vue' import SecretGroupTreeEntry from '@/components/secrets/SecretGroupTreeEntry.vue' @@ -101,6 +105,8 @@ const createDrawerKey = ref(0) const createGroupDrawer = ref(false) const createSecretDrawer = ref(false) +const createErrors = ref([]) + function cancelCreateGroup() { createGroupDrawer.value = false drawerKey.value += 1 @@ -172,7 +178,8 @@ async function createSecret(secretCreate: SecretCreate) { const response = await SshecretAdmin.addSecretApiV1SecretsPost({ body: secretCreate, }) - if (response.status == 200) { + try { + assertSdkResponseOk(response) alerts.showAlert('Secret created', 'success') // We can close the drawer now. createSecretDrawer.value = false @@ -185,12 +192,21 @@ async function createSecret(secretCreate: SecretCreate) { } treeState.selectSecret(secretCreate.name) - } else { - console.error(response) - alerts.showAlert('Secret creation failed', 'error') + } catch (err) { + if (err instanceof ValidationError) { + createErrors.value = err.errors + } else { + const errorMessage = err.message ?? 'Unknown error' + alerts.showAlert(`Error from backend: ${errorMessage}`, 'error') + } } } +function clearCreateErrors() { + // Clear any errors from the create form. + createErrors.value = [] +} + watch( () => treeState.secretGroupRevision, () => {