forked from morrning/hesabixCore
166 lines
5.2 KiB
Vue
166 lines
5.2 KiB
Vue
|
<template>
|
|||
|
<v-dialog v-model="dialog" max-width="500px" persistent>
|
|||
|
<v-card>
|
|||
|
<v-card-title>تغییر کلمه عبور</v-card-title>
|
|||
|
<v-card-text>
|
|||
|
<v-form ref="form" @submit.prevent="submitForm">
|
|||
|
<v-text-field
|
|||
|
v-model="password"
|
|||
|
label="کلمه عبور جدید"
|
|||
|
type="password"
|
|||
|
:rules="passwordRules"
|
|||
|
required
|
|||
|
:disabled="loading"
|
|||
|
></v-text-field>
|
|||
|
<v-text-field
|
|||
|
v-model="confirmPassword"
|
|||
|
label="تکرار کلمه عبور"
|
|||
|
type="password"
|
|||
|
:rules="confirmPasswordRules"
|
|||
|
required
|
|||
|
class="mt-2"
|
|||
|
:disabled="loading"
|
|||
|
></v-text-field>
|
|||
|
<v-switch
|
|||
|
v-model="notifyUser"
|
|||
|
label="اطلاع رسانی به کاربر"
|
|||
|
class="mt-4"
|
|||
|
color="primary"
|
|||
|
hide-details
|
|||
|
:disabled="loading"
|
|||
|
></v-switch>
|
|||
|
</v-form>
|
|||
|
</v-card-text>
|
|||
|
<v-card-actions>
|
|||
|
<v-btn color="primary" @click="submitForm" :loading="loading" :disabled="loading">
|
|||
|
ذخیره
|
|||
|
</v-btn>
|
|||
|
<v-btn @click="closeDialog" :disabled="loading">لغو</v-btn>
|
|||
|
</v-card-actions>
|
|||
|
</v-card>
|
|||
|
</v-dialog>
|
|||
|
|
|||
|
<!-- دیالوگ اطلاعرسانی -->
|
|||
|
<v-dialog v-model="notificationDialog" max-width="400px">
|
|||
|
<v-card>
|
|||
|
<v-card-title>{{ notificationTitle }}</v-card-title>
|
|||
|
<v-card-text>{{ notificationMessage }}</v-card-text>
|
|||
|
<v-card-actions>
|
|||
|
<v-btn color="primary" @click="notificationDialog = false">بستن</v-btn>
|
|||
|
</v-card-actions>
|
|||
|
</v-card>
|
|||
|
</v-dialog>
|
|||
|
</template>
|
|||
|
|
|||
|
<script lang="ts">
|
|||
|
import { defineComponent, ref } from 'vue';
|
|||
|
import axios from 'axios';
|
|||
|
|
|||
|
export default defineComponent({
|
|||
|
name: 'ChangePasswordDialog',
|
|||
|
props: {
|
|||
|
userId: {
|
|||
|
type: Number,
|
|||
|
required: true,
|
|||
|
},
|
|||
|
dialog: {
|
|||
|
type: Boolean,
|
|||
|
required: true,
|
|||
|
},
|
|||
|
},
|
|||
|
emits: ['update:dialog'],
|
|||
|
|
|||
|
setup(props, { emit }) {
|
|||
|
// فرم و دادهها
|
|||
|
const form = ref<any>(null);
|
|||
|
const password = ref<string>('');
|
|||
|
const confirmPassword = ref<string>('');
|
|||
|
const notifyUser = ref<boolean>(true);
|
|||
|
const loading = ref<boolean>(false);
|
|||
|
|
|||
|
// دیالوگ اطلاعرسانی
|
|||
|
const notificationDialog = ref<boolean>(false);
|
|||
|
const notificationTitle = ref<string>('');
|
|||
|
const notificationMessage = ref<string>('');
|
|||
|
|
|||
|
// قوانین ولیدیشن
|
|||
|
const passwordRules = [
|
|||
|
(v: string) => !!v || 'کلمه عبور الزامی است',
|
|||
|
(v: string) => v.length >= 6 || 'کلمه عبور باید حداقل ۶ کاراکتر باشد',
|
|||
|
];
|
|||
|
const confirmPasswordRules = [
|
|||
|
(v: string) => !!v || 'تکرار کلمه عبور الزامی است',
|
|||
|
(v: string) => v === password.value || 'کلمه عبور و تکرار آن باید یکسان باشند',
|
|||
|
];
|
|||
|
|
|||
|
// بستن دیالوگ
|
|||
|
const closeDialog = () => {
|
|||
|
if (!loading.value) {
|
|||
|
resetForm();
|
|||
|
emit('update:dialog', false);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// ریست کردن فرم
|
|||
|
const resetForm = () => {
|
|||
|
password.value = '';
|
|||
|
confirmPassword.value = '';
|
|||
|
notifyUser.value = true;
|
|||
|
if (form.value) {
|
|||
|
form.value.reset();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// ارسال فرم
|
|||
|
const submitForm = async () => {
|
|||
|
// بررسی ولیدیشن فرم
|
|||
|
const { valid } = await form.value.validate();
|
|||
|
if (!valid) {
|
|||
|
showNotification('خطا', 'لطفاً تمام فیلدها را به درستی پر کنید');
|
|||
|
return; // اگر ولیدیشن ناموفق بود، تابع متوقف میشود
|
|||
|
}
|
|||
|
|
|||
|
// شروع لودینگ و ارسال درخواست
|
|||
|
loading.value = true;
|
|||
|
try {
|
|||
|
await axios.post(`/api/admin/user/change-password/${props.userId}`, {
|
|||
|
password: password.value,
|
|||
|
notifyUser: notifyUser.value,
|
|||
|
});
|
|||
|
|
|||
|
// موفقیت
|
|||
|
showNotification('موفقیت', 'کلمه عبور با موفقیت تغییر یافت');
|
|||
|
resetForm();
|
|||
|
emit('update:dialog', false);
|
|||
|
} catch (error) {
|
|||
|
console.error('Error changing password:', error);
|
|||
|
showNotification('خطا', 'خطا در تغییر کلمه عبور');
|
|||
|
} finally {
|
|||
|
loading.value = false;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// نمایش پیام اطلاعرسانی
|
|||
|
const showNotification = (title: string, message: string) => {
|
|||
|
notificationTitle.value = title;
|
|||
|
notificationMessage.value = message;
|
|||
|
notificationDialog.value = true;
|
|||
|
};
|
|||
|
|
|||
|
return {
|
|||
|
form,
|
|||
|
password,
|
|||
|
confirmPassword,
|
|||
|
notifyUser,
|
|||
|
loading,
|
|||
|
notificationDialog,
|
|||
|
notificationTitle,
|
|||
|
notificationMessage,
|
|||
|
passwordRules,
|
|||
|
confirmPasswordRules,
|
|||
|
submitForm,
|
|||
|
closeDialog,
|
|||
|
};
|
|||
|
},
|
|||
|
});
|
|||
|
</script>
|