diff --git a/frontend/src/components/prompts/CurrentPassword.vue b/frontend/src/components/prompts/CurrentPassword.vue new file mode 100644 index 00000000..c97485f2 --- /dev/null +++ b/frontend/src/components/prompts/CurrentPassword.vue @@ -0,0 +1,58 @@ + + + diff --git a/frontend/src/components/prompts/Prompts.vue b/frontend/src/components/prompts/Prompts.vue index 791d3ca9..968e22f5 100644 --- a/frontend/src/components/prompts/Prompts.vue +++ b/frontend/src/components/prompts/Prompts.vue @@ -28,6 +28,7 @@ import ShareDelete from "./ShareDelete.vue"; import Upload from "./Upload.vue"; import DiscardEditorChanges from "./DiscardEditorChanges.vue"; import ResolveConflict from "./ResolveConflict.vue"; +import CurrentPassword from "./CurrentPassword.vue"; const layoutStore = useLayoutStore(); @@ -50,6 +51,7 @@ const components = new Map([ ["deleteUser", DeleteUser], ["discardEditorChanges", DiscardEditorChanges], ["resolve-conflict", ResolveConflict], + ["current-password", CurrentPassword], ]); const modal = computed(() => { diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 77d74d9f..dcbedcef 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -175,7 +175,9 @@ "filesInDest": "Files in destination", "override": "Overwrite", "skip": "Skip", - "forbiddenError": "Forbidden Error" + "forbiddenError": "Forbidden Error", + "currentPassword": "Your password", + "currentPasswordMessage": "Enter your password to validate this action." }, "search": { "images": "Images", diff --git a/frontend/src/views/settings/User.vue b/frontend/src/views/settings/User.vue index 77786e2a..b726d9ef 100644 --- a/frontend/src/views/settings/User.vue +++ b/frontend/src/views/settings/User.vue @@ -15,19 +15,6 @@ :isDefault="false" :isNew="isNew" /> - -

- - -

@@ -77,7 +64,6 @@ const error = ref(); const originalUser = ref(); const user = ref(); const createUserDir = ref(false); -const currentPassword = ref(""); const isCurrentPasswordRequired = ref(false); const $showError = inject("$showError")!; @@ -134,16 +120,30 @@ const fetchData = async () => { } }; -const deletePrompt = () => - layoutStore.showHover({ prompt: "deleteUser", confirm: deleteUser }); +const deletePrompt = () => { + if (isCurrentPasswordRequired.value) { + layoutStore.showHover({ + prompt: "current-password", + confirm: (event: Event, currentPassword: string) => { + event.preventDefault(); + layoutStore.closeHovers(); + deleteUser(currentPassword); + }, + }); + } else { + layoutStore.showHover({ + prompt: "deleteUser", + confirm: () => deleteUser(""), + }); + } +}; -const deleteUser = async (e: Event) => { - e.preventDefault(); +const deleteUser = async (currentPassword: string) => { if (!user.value) { return false; } try { - await api.remove(user.value.id, currentPassword.value); + await api.remove(user.value.id, currentPassword); router.push({ path: "/settings/users" }); $showSuccess(t("settings.userDeleted")); } catch (err) { @@ -157,8 +157,25 @@ const deleteUser = async (e: Event) => { return true; }; -const save = async (event: Event) => { +const save = (event: Event) => { event.preventDefault(); + if (isCurrentPasswordRequired.value) { + layoutStore.showHover({ + prompt: "current-password", + confirm: (event: Event, currentPassword: string) => { + event.preventDefault(); + layoutStore.closeHovers(); + send(currentPassword); + }, + }); + } else { + send(""); + } + + return true; +}; + +const send = async (currentPassword: string) => { if (!user.value) { return false; } @@ -170,11 +187,11 @@ const save = async (event: Event) => { ...user.value, }; - const loc = await api.create(newUser, currentPassword.value); + const loc = await api.create(newUser, currentPassword); router.push({ path: loc || "/settings/users" }); $showSuccess(t("settings.userCreated")); } else { - await api.update(user.value, ["all"], currentPassword.value); + await api.update(user.value, ["all"], currentPassword); if (user.value.id === authStore.user?.id) { authStore.updateUser(user.value); @@ -185,7 +202,5 @@ const save = async (event: Event) => { } catch (e: any) { $showError(e); } - - return true; };