tethys.backend/resources/js/Pages/profile/partials/update-profile-information-form.vue
Arno Kaimbacher 7bb4bd06cf hotfix: disable username and email fields in profile form
- Disabled the username and email fields in the profile update form.
- Set the `is-read-only` property to `true` for the username and email `FormControl` components.
2025-03-31 15:49:25 +02:00

179 lines
No EOL
7.3 KiB
Vue

<script lang="ts" setup>
import { computed, Ref, ref } from 'vue';
import { useForm, usePage } from '@inertiajs/vue3';
import ActionMessage from '@/Components/action-message.vue'
import FormControl from '@/Components/FormControl.vue';
import FormField from '@/Components/FormField.vue';
import CardBox from '@/Components/CardBox.vue';
import { mdiAccount } from '@mdi/js';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue'
import { stardust } from '@eidellev/adonis-stardust/client';
import AvatarInput from '@/Components/avatar-input.vue';
const props = defineProps({
user: {
type: Object,
required: true,
},
defaultUrl: {
type: String,
required: false,
},
});
const errors: Ref<any> = computed(() => {
return usePage().props.errors || {}
});
const flash: Ref<any> = computed(() => {
return usePage().props.flash;
});
const fullName = computed(() => `${props.user.first_name} ${props.user.last_name}`);
const recentlyHasError = ref(false);
const form = useForm({
first_name: props.user.first_name,
last_name: props.user.last_name,
login: props.user.login,
email: props.user.email,
// mobile: `${props.user.mobile}`,
avatar: undefined as File | undefined,
});
// const verificationLinkSent = ref(null);
const avatarInput: Ref<HTMLInputElement | null> = ref(null);
const updateProfileInformation = () => {
// if (avatarInput.value) {
// form.avatar = avatarInput.value?.files ? avatarInput.value.files[0] : undefined;
// }
form.put(stardust.route('settings.profile.update', [props.user.id]), {
errorBag: 'updateProfileInformation',
preserveScroll: true,
onSuccess: () => {
// clearPhotoFileInput();
},
onError: () => {
if (form.errors.avatar) {
if (avatarInput.value) {
avatarInput.value.value = '';
}
}
recentlyHasError.value = true
setTimeout(() => {
recentlyHasError.value = false
}, 5000)
},
});
};
// const sendEmailVerification = () => {
// verificationLinkSent.value = true;
// };
</script>
<template>
<CardBox id="passwordForm" title="Basic Info" :icon="mdiAccount" form :show-header-icon="false">
<!-- <FormValidationErrors v-bind:errors="errors" /> -->
<AvatarInput class="h-24 w-24 rounded-full" v-model="form.avatar" ref="avatarInput"
:default-src="defaultUrl ? defaultUrl : '/api/avatar?name=' + fullName + '&size=50'">
</AvatarInput>
<div class="text-red-400 text-sm" v-if="errors.avatar && Array.isArray(errors.avatar)">
{{ errors.avatar.join(', ') }}
</div>
<FormField label="First Name" :class="{ 'text-red-400': form.errors.first_name }">
<FormControl id="first_name" label="First Name" v-model="form.first_name" :error="form.errors.first_name"
type="text" :placeholder="'First Name'" class="w-full" autocomplete="first_name">
<div class="text-red-400 text-sm" v-if="errors.first_name && Array.isArray(errors.first_name)">
{{ errors.first_name.join(', ') }}
</div>
</FormControl>
</FormField>
<FormField label="Last Name" :class="{ 'text-red-400': form.errors.last_name }">
<FormControl id="last_name" label="Last Name" v-model="form.last_name" :error="form.errors.last_name"
type="text" :placeholder="'Last Name'" class="w-full" autocomplete="last_name">
<div class="text-red-400 text-sm" v-if="errors.last_name && Array.isArray(errors.last_name)">
{{ errors.last_name.join(', ') }}
</div>
</FormControl>
</FormField>
<FormField label="Username" :class="{ 'text-red-400': form.errors.login }">
<FormControl id="username" label="Username" v-model="form.login" class="w-full"
:is-read-only="true">
<div class="text-red-400 text-sm" v-if="errors.login && Array.isArray(errors.login)">
{{ errors.login.join(', ') }}
</div>
</FormControl>
</FormField>
<FormField label="Enter Email">
<FormControl v-model="form.email" type="text" placeholder="Email" :errors="form.errors.email"
:is-read-only="true">
<div class="text-red-400 text-sm" v-if="errors.email && Array.isArray(errors.email)">
{{ errors.email.join(', ') }}
</div>
</FormControl>
</FormField>
<!-- Email -->
<!-- <div>
<FormControl label="Email" id="email" v-model="form.email" :readonly="!user.is_super_admin"
:disabled="!user.is_super_admin" class="w-full" />
<div v-if="user.email_verified_at === null">
<p class="text-sm mt-2">
{{ 'Your email address is unverified.' }}
<Link :href="route('verification.send')" method="post" as="button"
class="underline text-gray-600 hover:text-gray-900" @click.prevent="sendEmailVerification">
{{ 'Click here to re-send the verification email.' }}
</Link>
</p>
<div v-show="verificationLinkSent" class="mt-2 font-medium text-sm text-green-600">
{{ 'A new verification link has been sent to your email address.' }}
</div>
</div>
</div> -->
<!-- <div class="relative">
<FormControl label="Mobile" id="mobile" class="w-full" input-class="w-full pl-5" v-model="form.mobile"
:readonly="!user.is_super_admin" :disabled="!user.is_super_admin" />
<span class="absolute top-9 left-0 inline-flex items-center ml-2 font-bold text-secondary-light">+</span>
</div> -->
<!-- <div class="col-span-2 flex justify-end items-center mt-5"> -->
<template #footer>
<div class="flex items-center justify-end gap-3 ">
<ActionMessage :on="recentlyHasError" color="warning">
<ul class="list-disc list-inside space-y-2 text-sm">
<li v-for="(messages, field) in errors" :key="field" class="flex flex-col">
<span class="font-semibold capitalize text-gray-700 dark:text-gray-300">{{ field }}:</span>
<span class="text-red-600 dark:text-red-400 ml-4">{{ messages.join(', ') }}</span>
</li>
</ul>
</ActionMessage>
<ActionMessage v-if="flash.message" :on="form.recentlySuccessful" color="success">
{{ flash.message }}
</ActionMessage>
<ActionMessage v-if="flash.warning" :on="form.recentlySuccessful" color="warning">
{{ flash.warning }}
</ActionMessage>
<BaseButtons>
<BaseButton type="submit" color="info" label="Save Changes"
@click.prevent="updateProfileInformation" :disabled="form.processing" />
</BaseButtons>
</div>
</template>
</CardBox>
<!-- </div>
</div> -->
</template>