Files
filebrozer/frontend/src/views/settings/Profile.vue

210 lines
5.7 KiB
Vue

<template>
<div class="row">
<div class="column">
<form class="card" @submit="updateSettings">
<div class="card-title">
<h2>{{ t("settings.profileSettings") }}</h2>
</div>
<div class="card-content">
<p>
<input type="checkbox" name="hideDotfiles" v-model="hideDotfiles" />
{{ t("settings.hideDotfiles") }}
</p>
<p>
<input type="checkbox" name="singleClick" v-model="singleClick" />
{{ t("settings.singleClick") }}
</p>
<p>
<input type="checkbox" name="dateFormat" v-model="dateFormat" />
{{ t("settings.setDateFormat") }}
</p>
<h3>{{ t("settings.language") }}</h3>
<languages
class="input input--block"
v-model:locale="locale"
></languages>
<h3>{{ t("settings.aceEditorTheme") }}</h3>
<AceEditorTheme
class="input input--block"
v-model:aceEditorTheme="aceEditorTheme"
id="aceTheme"
></AceEditorTheme>
</div>
<div class="card-action">
<input
class="button button--flat"
type="submit"
name="submitProfile"
:value="t('buttons.update')"
/>
</div>
</form>
</div>
<div class="column">
<form
class="card"
v-if="!authStore.user?.lockPassword"
@submit="updatePassword"
>
<div class="card-title">
<h2>{{ t("settings.changePassword") }}</h2>
</div>
<div class="card-content">
<input
:class="passwordClass"
type="password"
:placeholder="t('settings.newPassword')"
v-model="password"
name="password"
/>
<input
:class="passwordClass"
type="password"
:placeholder="t('settings.newPasswordConfirm')"
v-model="passwordConf"
name="passwordConf"
/>
<input
v-if="isCurrentPasswordRequired"
:class="passwordClass"
type="password"
:placeholder="t('settings.currentPassword')"
v-model="currentPassword"
name="current_password"
autocomplete="current-password"
/>
</div>
<div class="card-action">
<input
class="button button--flat"
type="submit"
name="submitPassword"
:value="t('buttons.update')"
/>
</div>
</form>
</div>
</div>
</template>
<script setup lang="ts">
import { useAuthStore } from "@/stores/auth";
import { useLayoutStore } from "@/stores/layout";
import { users as api, settings } from "@/api";
import AceEditorTheme from "@/components/settings/AceEditorTheme.vue";
import Languages from "@/components/settings/Languages.vue";
import { computed, inject, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n";
const layoutStore = useLayoutStore();
const authStore = useAuthStore();
const { t } = useI18n();
const $showSuccess = inject<IToastSuccess>("$showSuccess")!;
const $showError = inject<IToastError>("$showError")!;
const password = ref<string>("");
const passwordConf = ref<string>("");
const currentPassword = ref<string>("");
const isCurrentPasswordRequired = ref<boolean>(false);
const hideDotfiles = ref<boolean>(false);
const singleClick = ref<boolean>(false);
const dateFormat = ref<boolean>(false);
const locale = ref<string>("");
const aceEditorTheme = ref<string>("");
const passwordClass = computed(() => {
const baseClass = "input input--block";
if (password.value === "" && passwordConf.value === "") {
return baseClass;
}
if (password.value === passwordConf.value) {
return `${baseClass} input--green`;
}
return `${baseClass} input--red`;
});
onMounted(async () => {
layoutStore.loading = true;
if (authStore.user === null) return false;
locale.value = authStore.user.locale;
hideDotfiles.value = authStore.user.hideDotfiles;
singleClick.value = authStore.user.singleClick;
dateFormat.value = authStore.user.dateFormat;
aceEditorTheme.value = authStore.user.aceEditorTheme;
layoutStore.loading = false;
const { authMethod } = await settings.get();
isCurrentPasswordRequired.value = authMethod == "json";
return true;
});
const updatePassword = async (event: Event) => {
event.preventDefault();
if (
password.value !== passwordConf.value ||
password.value === "" ||
currentPassword.value === "" ||
authStore.user === null
) {
return;
}
try {
const data = {
...authStore.user,
id: authStore.user.id,
password: password.value,
};
await api.update(data, ["password"], currentPassword.value);
authStore.updateUser(data);
$showSuccess(t("settings.passwordUpdated"));
} catch (e: any) {
$showError(e);
} finally {
password.value = passwordConf.value = "";
}
};
const updateSettings = async (event: Event) => {
event.preventDefault();
try {
if (authStore.user === null) throw new Error("User is not set!");
const data = {
...authStore.user,
id: authStore.user.id,
locale: locale.value,
hideDotfiles: hideDotfiles.value,
singleClick: singleClick.value,
dateFormat: dateFormat.value,
aceEditorTheme: aceEditorTheme.value,
};
await api.update(data, [
"locale",
"hideDotfiles",
"singleClick",
"dateFormat",
"aceEditorTheme",
]);
authStore.updateUser(data);
$showSuccess(t("settings.settingsUpdated"));
} catch (err) {
if (err instanceof Error) {
$showError(err);
}
}
};
</script>