464 lines
13 KiB
Vue
464 lines
13 KiB
Vue
<script setup>
|
|
import avatar1 from '@images/avatars/avatar-1.png';
|
|
import {
|
|
emailValidator,
|
|
requiredEmail,
|
|
requiredName,
|
|
requiredPhone,
|
|
validUSAPhone
|
|
} from '@validators';
|
|
import { useStore } from 'vuex';
|
|
|
|
const store = useStore();
|
|
let imageBlob = null;
|
|
const profileData = ref([]);
|
|
const errors = ref({
|
|
name: undefined,
|
|
email: undefined,
|
|
phone:undefined,
|
|
})
|
|
const accountData = {
|
|
avatarImg: avatar1,
|
|
name: '',
|
|
last_name: '',
|
|
email: '',
|
|
phone: '',
|
|
}
|
|
|
|
const refVForm = ref()
|
|
const refInputEl = ref()
|
|
const isConfirmDialogOpen = ref(false)
|
|
const accountDataLocal = ref(structuredClone(accountData))
|
|
const isAccountDeactivated = ref(false)
|
|
const validateAccountDeactivation = [v => !!v || 'Please confirm account deactivation']
|
|
const getIsTonalSnackbarVisible = ref(false);
|
|
const ImageBase64 = ref();
|
|
const resetForm = () => {
|
|
accountDataLocal.value = structuredClone(accountData)
|
|
}
|
|
|
|
// const changeAvatar = file => {
|
|
// const fileReader = new FileReader()
|
|
// const { files } = file.target
|
|
// if (files && files.length) {
|
|
// fileReader.readAsDataURL(files[0])
|
|
// fileReader.onload = () => {
|
|
// if (typeof fileReader.result === 'string')
|
|
// accountDataLocal.value.avatarImg = fileReader.result
|
|
// console.log("daas",accountDataLocal.value.avatarImg);
|
|
// }
|
|
// }
|
|
// }
|
|
const changeAvatar = file => {
|
|
const fileReader = new FileReader()
|
|
const { files } = file.target
|
|
if (files && files.length) {
|
|
fileReader.readAsDataURL(files[0])
|
|
fileReader.onload = () => {
|
|
if (typeof fileReader.result === 'string') {
|
|
accountDataLocal.value.avatarImg = fileReader.result
|
|
}
|
|
ImageBase64.value = fileReader.result.split(',')[1];
|
|
|
|
}
|
|
}
|
|
}
|
|
onMounted(async () => {
|
|
await store.dispatch('adminDetial');
|
|
// profileData.value =
|
|
let list = await store.getters.getAdminDetail
|
|
accountDataLocal.value.email = list.email
|
|
// accountData.name = profileData.value.name;
|
|
accountDataLocal.value.name = list.name
|
|
// accountData.lastName = profileData.value.last_name;
|
|
accountDataLocal.value.lastName = list.last_name;
|
|
// accountData.phone = profileData.value.phone_no;
|
|
accountDataLocal.value.phone = list.phone_no
|
|
// accountData.avatarImg = profileData.value.profile_image ? profileData.value.profile_image : avatar1;
|
|
if(!list.image_path){
|
|
accountDataLocal.value.avatarImg = avatar1;
|
|
}else{
|
|
accountDataLocal.value.avatarImg = list.image_path
|
|
}
|
|
|
|
});
|
|
// reset avatar image
|
|
const resetAvatar = () => {
|
|
accountDataLocal.value.avatarImg = accountData.avatarImg
|
|
}
|
|
|
|
const timezones = [
|
|
'(GMT-11:00) International Date Line West',
|
|
'(GMT-11:00) Midway Island',
|
|
'(GMT-10:00) Hawaii',
|
|
'(GMT-09:00) Alaska',
|
|
'(GMT-08:00) Pacific Time (US & Canada)',
|
|
'(GMT-08:00) Tijuana',
|
|
'(GMT-07:00) Arizona',
|
|
'(GMT-07:00) Chihuahua',
|
|
'(GMT-07:00) La Paz',
|
|
'(GMT-07:00) Mazatlan',
|
|
'(GMT-07:00) Mountain Time (US & Canada)',
|
|
'(GMT-06:00) Central America',
|
|
'(GMT-06:00) Central Time (US & Canada)',
|
|
'(GMT-06:00) Guadalajara',
|
|
'(GMT-06:00) Mexico City',
|
|
'(GMT-06:00) Monterrey',
|
|
'(GMT-06:00) Saskatchewan',
|
|
'(GMT-05:00) Bogota',
|
|
'(GMT-05:00) Eastern Time (US & Canada)',
|
|
'(GMT-05:00) Indiana (East)',
|
|
'(GMT-05:00) Lima',
|
|
'(GMT-05:00) Quito',
|
|
'(GMT-04:00) Atlantic Time (Canada)',
|
|
'(GMT-04:00) Caracas',
|
|
'(GMT-04:00) La Paz',
|
|
'(GMT-04:00) Santiago',
|
|
'(GMT-03:30) Newfoundland',
|
|
'(GMT-03:00) Brasilia',
|
|
'(GMT-03:00) Buenos Aires',
|
|
'(GMT-03:00) Georgetown',
|
|
'(GMT-03:00) Greenland',
|
|
'(GMT-02:00) Mid-Atlantic',
|
|
'(GMT-01:00) Azores',
|
|
'(GMT-01:00) Cape Verde Is.',
|
|
'(GMT+00:00) Casablanca',
|
|
'(GMT+00:00) Dublin',
|
|
'(GMT+00:00) Edinburgh',
|
|
'(GMT+00:00) Lisbon',
|
|
'(GMT+00:00) London',
|
|
]
|
|
|
|
const currencies = [
|
|
'USD',
|
|
'EUR',
|
|
'GBP',
|
|
'AUD',
|
|
'BRL',
|
|
'CAD',
|
|
'CNY',
|
|
'CZK',
|
|
'DKK',
|
|
'HKD',
|
|
'HUF',
|
|
'INR',
|
|
]
|
|
|
|
|
|
const onSubmit = async () => {
|
|
const { valid } = await refVForm.value.validate()
|
|
console.log(valid)
|
|
if (valid) {
|
|
try {
|
|
console.log(ImageBase64.value);
|
|
await store.dispatch('profileUpdate',{
|
|
name: accountDataLocal.value.name,
|
|
last_name: accountDataLocal.value.last_name,
|
|
phone: accountDataLocal.value.phone,
|
|
image: ImageBase64.value, //ecelData,
|
|
})
|
|
} catch (error) {
|
|
console.error(error)
|
|
}
|
|
await store.dispatch('siteSetting');
|
|
let list = await store.getters.getSiteSetting
|
|
console.log('list',list)
|
|
accountDataLocal.value.avatarImg = list.logo
|
|
accountDataLocal.value.name = list.first_name
|
|
accountDataLocal.value.last_name = list.last_name
|
|
accountDataLocal.value.phone = list.phone
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const formatPhoneNumber = () => {
|
|
// Remove non-numeric characters from the input
|
|
const numericValue = accountDataLocal.value.phone.replace(/\D/g, '');
|
|
|
|
// Apply formatting logic
|
|
if (numericValue.length <= 10) {
|
|
accountDataLocal.value.phone = numericValue.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
|
|
} else {
|
|
// Limit the input to a maximum of 14 characters
|
|
const truncatedValue = numericValue.slice(0, 10);
|
|
accountDataLocal.value.phone = truncatedValue.replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<VRow>
|
|
<VCol cols="12">
|
|
<VCard>
|
|
<VCardText>
|
|
<div class="d-flex mb-10">
|
|
<VSnackbar v-model="getIsTonalSnackbarVisible" :timeout="5000" location="top end" variant="flat"
|
|
color="success">
|
|
<VIcon
|
|
class="ri-success-line success-icon"
|
|
/> Profile Update Successfully
|
|
</VSnackbar>
|
|
<!-- 👉 Avatar -->
|
|
<VAvatar
|
|
rounded
|
|
size="100"
|
|
class="me-6"
|
|
:image="accountDataLocal.avatarImg"
|
|
/>
|
|
|
|
<!-- 👉 Upload Photo -->
|
|
<form class="d-flex flex-column justify-center gap-4">
|
|
<div class="d-flex flex-wrap gap-4">
|
|
<VBtn
|
|
color="primary"
|
|
@click="refInputEl?.click()"
|
|
>
|
|
<VIcon
|
|
icon="ri-upload-cloud-line"
|
|
class="d-sm-none"
|
|
/>
|
|
<span class="d-none d-sm-block">Upload Logo</span>
|
|
</VBtn>
|
|
<input
|
|
ref="refInputEl"
|
|
type="file"
|
|
name="file"
|
|
accept=".jpeg,.png,.jpg,GIF"
|
|
hidden
|
|
@input="changeAvatar"
|
|
>
|
|
</div>
|
|
<p class="text-body-1 mb-0">
|
|
Allowed JPG, GIF or PNG. Max size of 800K
|
|
</p>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- 👉 Form -->
|
|
<VForm ref="refVForm" @submit.prevent="onSubmit">
|
|
<VRow>
|
|
<!-- 👉 First Name -->
|
|
<VCol
|
|
md="6"
|
|
cols="12"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.name"
|
|
label="Name"
|
|
:rules="[requiredName]"
|
|
:error-messages="errors.name"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Last Name -->
|
|
<VCol
|
|
md="6"
|
|
cols="12"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.lastName"
|
|
placeholder="Doe"
|
|
label="Last Name"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Email -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
>
|
|
<VTextField readonly
|
|
v-model="accountDataLocal.email"
|
|
label="E-mail"
|
|
placeholder="johndoe@gmail.com"
|
|
type="email"
|
|
:rules="[requiredEmail, emailValidator]"
|
|
:error-messages="errors.email"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Organization -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.org"
|
|
label="Organization"
|
|
placeholder="ThemeSelection"
|
|
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Phone -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.phone"
|
|
label="Phone Number"
|
|
placeholder="+1 (917) 543-9876"
|
|
:rules="[requiredPhone, validUSAPhone]"
|
|
:error-messages="errors.phone"
|
|
@input="formatPhoneNumber"
|
|
max="14"
|
|
pattern="^\(\d{3}\) \d{3}-\d{4}$"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Address -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.address"
|
|
label="Address"
|
|
placeholder="123 Main St, New York, NY 10001"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 State -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.state"
|
|
label="State"
|
|
placeholder="New York"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Zip Code -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VTextField
|
|
v-model="accountDataLocal.zip"
|
|
label="Zip Code"
|
|
placeholder="10001"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Country -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VSelect
|
|
v-model="accountDataLocal.country"
|
|
multiple
|
|
chips
|
|
closable-chips
|
|
label="Country"
|
|
:items="['USA', 'Canada', 'UK', 'India', 'Australia']"
|
|
placeholder="Select Country"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Language -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VSelect
|
|
v-model="accountDataLocal.language"
|
|
label="Language"
|
|
multiple
|
|
chips
|
|
closable-chips
|
|
placeholder="Select Language"
|
|
:items="['English', 'Spanish', 'Arabic', 'Hindi', 'Urdu']"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Timezone -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VSelect
|
|
v-model="accountDataLocal.timezone"
|
|
label="Timezone"
|
|
placeholder="Select Timezone"
|
|
:items="timezones"
|
|
:menu-props="{ maxHeight: 200 }"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Currency -->
|
|
<VCol
|
|
cols="12"
|
|
md="6"
|
|
style="display: none;"
|
|
>
|
|
<VSelect
|
|
v-model="accountDataLocal.currency"
|
|
label="Currency"
|
|
placeholder="Select Currency"
|
|
:items="currencies"
|
|
:menu-props="{ maxHeight: 200 }"
|
|
/>
|
|
</VCol>
|
|
|
|
<!-- 👉 Form Actions -->
|
|
<VCol
|
|
cols="12"
|
|
class="d-flex flex-wrap gap-4"
|
|
>
|
|
<VBtn type="submit">Save changes</VBtn>
|
|
</VCol>
|
|
</VRow>
|
|
</VForm>
|
|
</VCardText>
|
|
</VCard>
|
|
</VCol>
|
|
|
|
<VCol cols="12" style="display: none;">
|
|
<!-- 👉 Delete Account -->
|
|
<VCard title="Delete Account">
|
|
<VCardText>
|
|
<!-- 👉 Checkbox and Button -->
|
|
<div>
|
|
<VCheckbox
|
|
v-model="isAccountDeactivated"
|
|
:rules="validateAccountDeactivation"
|
|
label="I confirm my account deactivation"
|
|
/>
|
|
</div>
|
|
|
|
<VBtn
|
|
:disabled="!isAccountDeactivated"
|
|
color="error"
|
|
class="mt-3"
|
|
@click="isConfirmDialogOpen = true"
|
|
>
|
|
Deactivate Account
|
|
</VBtn>
|
|
</VCardText>
|
|
</VCard>
|
|
</VCol>
|
|
</VRow>
|
|
|
|
<!-- Confirm Dialog -->
|
|
<ConfirmDialog
|
|
v-model:isDialogVisible="isConfirmDialogOpen"
|
|
confirmation-question="Are you sure you want to deactivate your account?"
|
|
confirm-title="Deactivated!"
|
|
confirm-msg="Your account has been deactivated successfully."
|
|
cancel-title="Cancelled"
|
|
cancel-msg="Account Deactivation Cancelled!"
|
|
/>
|
|
</template>
|