fix(classes, settings): enhance professor dropdown mapping with phone numbers and optimize SMS bypass list reactivity
This commit is contained in:
@@ -39,7 +39,7 @@
|
||||
<div class="col-12 sm:col-4">
|
||||
<span class="text-muted text-xs block mb-1">استاد مدرس</span>
|
||||
<span class="font-bold text-color text-sm">
|
||||
{{ classData.professor ? `${classData.professor.name || ''} ${classData.professor.surname || ''}`.trim() : '—' }}
|
||||
{{ classData.professor ? (classData.professor.fullName || `${classData.professor.name || ''} ${classData.professor.surname || ''}`.trim() || classData.professor.user?.name || '—') : '—' }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="col-12 sm:col-4">
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||
<label class="font-semibold text-sm">استاد مدرس</label>
|
||||
<Dropdown v-model="form.professor" :options="professors" optionLabel="name" optionValue="_id" placeholder="استاد را انتخاب کنید" class="w-full text-sm" filter />
|
||||
<Dropdown v-model="form.professor" :options="professors" optionLabel="displayName" optionValue="_id" placeholder="استاد را انتخاب کنید" class="w-full text-sm" filter />
|
||||
</div>
|
||||
|
||||
<div class="col-12 md:col-3 flex flex-column gap-2">
|
||||
@@ -508,10 +508,15 @@ const fetchData = async () => {
|
||||
if (pResult.status === 'fulfilled') {
|
||||
const pRes = pResult.value;
|
||||
const pData = pRes.data || pRes;
|
||||
professors.value = (Array.isArray(pData) ? pData : (pData.items || pData.professors || pData.data || [])).map((p) => ({
|
||||
...p,
|
||||
name: `${p.name || ''} ${p.surname || ''}`.trim()
|
||||
}));
|
||||
professors.value = (Array.isArray(pData) ? pData : (pData.items || pData.professors || pData.data || [])).map((p) => {
|
||||
const fullName = p.fullName || `${p.name || ''} ${p.surname || ''}`.trim() || p.user?.name || 'استاد';
|
||||
return {
|
||||
...p,
|
||||
_id: p._id || p.id,
|
||||
name: fullName,
|
||||
displayName: `${fullName}${p.phoneNumber ? ` (${p.phoneNumber})` : ''}`
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
if (uResult.status === 'fulfilled') {
|
||||
@@ -523,10 +528,24 @@ const fetchData = async () => {
|
||||
if (classId) {
|
||||
const res = await classApi.getOne(classId);
|
||||
const data = res.data || res;
|
||||
const profId = data.professor?._id || data.professor?.id || (typeof data.professor === 'string' ? data.professor : null);
|
||||
|
||||
if (data.professor && typeof data.professor === 'object' && profId) {
|
||||
const profFullName = data.professor.fullName || `${data.professor.name || ''} ${data.professor.surname || ''}`.trim() || data.professor.user?.name || 'استاد';
|
||||
if (!professors.value.some((p) => String(p._id) === String(profId))) {
|
||||
professors.value.push({
|
||||
...data.professor,
|
||||
_id: profId,
|
||||
name: profFullName,
|
||||
displayName: `${profFullName}${data.professor.phoneNumber ? ` (${data.professor.phoneNumber})` : ''}`
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Object.assign(form, {
|
||||
name: data.name || '',
|
||||
course: data.course?._id || data.course || null,
|
||||
professor: data.professor?._id || data.professor || null,
|
||||
professor: profId,
|
||||
capacity: data.capacity || 20,
|
||||
tuitionFee: data.tuitionFee || 0,
|
||||
hasDiscount: Boolean(data.hasDiscount),
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||
<label class="font-semibold text-sm">استاد مدرس *</label>
|
||||
<Dropdown v-model="form.professor" :options="professors" optionLabel="name" optionValue="_id" placeholder="استاد را انتخاب کنید" class="w-full text-sm" filter />
|
||||
<Dropdown v-model="form.professor" :options="professors" optionLabel="displayName" optionValue="_id" placeholder="استاد را انتخاب کنید" class="w-full text-sm" filter />
|
||||
</div>
|
||||
|
||||
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||
@@ -182,21 +182,40 @@ const fetchData = async () => {
|
||||
if (pResult.status === 'fulfilled') {
|
||||
const pRes = pResult.value;
|
||||
const pData = pRes.data || pRes;
|
||||
professors.value = (Array.isArray(pData) ? pData : (pData.items || pData.professors || pData.data || [])).map((p) => ({
|
||||
...p,
|
||||
name: `${p.name || ''} ${p.surname || ''}`.trim()
|
||||
}));
|
||||
professors.value = (Array.isArray(pData) ? pData : (pData.items || pData.professors || pData.data || [])).map((p) => {
|
||||
const fullName = p.fullName || `${p.name || ''} ${p.surname || ''}`.trim() || p.user?.name || 'استاد';
|
||||
return {
|
||||
...p,
|
||||
_id: p._id || p.id,
|
||||
name: fullName,
|
||||
displayName: `${fullName}${p.phoneNumber ? ` (${p.phoneNumber})` : ''}`
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
if (sessionId) {
|
||||
const res = await sessionApi.getOne(sessionId);
|
||||
const data = res.data || res;
|
||||
const courseId = data.course?._id || data.course || null;
|
||||
const profId = data.professor?._id || data.professor?.id || (typeof data.professor === 'string' ? data.professor : null);
|
||||
|
||||
if (data.professor && typeof data.professor === 'object' && profId) {
|
||||
const profFullName = data.professor.fullName || `${data.professor.name || ''} ${data.professor.surname || ''}`.trim() || data.professor.user?.name || 'استاد';
|
||||
if (!professors.value.some((p) => String(p._id) === String(profId))) {
|
||||
professors.value.push({
|
||||
...data.professor,
|
||||
_id: profId,
|
||||
name: profFullName,
|
||||
displayName: `${profFullName}${data.professor.phoneNumber ? ` (${data.professor.phoneNumber})` : ''}`
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await loadClasses(courseId);
|
||||
Object.assign(form, {
|
||||
course: courseId,
|
||||
class: data.class?._id || data.class || null,
|
||||
professor: data.professor?._id || data.professor || null,
|
||||
professor: profId,
|
||||
day: toJalaliPickerValue(data.day || data.date) || getTodayJalali(),
|
||||
startTime: data.startTime || '19:00',
|
||||
endTime: data.endTime || '20:30',
|
||||
|
||||
@@ -876,6 +876,7 @@ const saveBypassItem = async () => {
|
||||
});
|
||||
}
|
||||
|
||||
smsBypassNumbers.value = list;
|
||||
const res = await settingsApi.save({ smsBypassNumbers: list });
|
||||
applySettings(res);
|
||||
showSuccess(isEditingBypass.value ? 'شماره مجاز با موفقیت ویرایش شد' : 'شماره مجاز جدید اضافه شد');
|
||||
@@ -891,6 +892,7 @@ const toggleBypassStatus = async (item, index) => {
|
||||
try {
|
||||
const list = [...smsBypassNumbers.value];
|
||||
list[index] = { ...list[index], isActive: !list[index].isActive };
|
||||
smsBypassNumbers.value = list;
|
||||
const res = await settingsApi.save({ smsBypassNumbers: list });
|
||||
applySettings(res);
|
||||
showSuccess(`وضعیت شماره ${item.phoneNumber} بهروزرسانی شد`);
|
||||
@@ -911,6 +913,7 @@ const deleteBypassItem = (index) => {
|
||||
accept: async () => {
|
||||
try {
|
||||
const list = smsBypassNumbers.value.filter((_, i) => i !== index);
|
||||
smsBypassNumbers.value = list;
|
||||
const res = await settingsApi.save({ smsBypassNumbers: list });
|
||||
applySettings(res);
|
||||
showSuccess('شماره با موفقیت از لیست مجاز حذف شد');
|
||||
@@ -941,7 +944,8 @@ const saveMessaging = async () => {
|
||||
smsEnabled: Boolean(messagingForm.value.smsEnabled),
|
||||
emailEnabled: Boolean(messagingForm.value.emailEnabled),
|
||||
botEnabled: Boolean(messagingForm.value.botEnabled)
|
||||
}
|
||||
},
|
||||
smsBypassNumbers: smsBypassNumbers.value
|
||||
});
|
||||
applySettings(response);
|
||||
showSuccess('تنظیمات کانالهای اطلاعرسانی با موفقیت ذخیره شد.');
|
||||
|
||||
Reference in New Issue
Block a user