fix(classes, settings): enhance professor dropdown mapping with phone numbers and optimize SMS bypass list reactivity

This commit is contained in:
2026-08-26 05:17:53 +03:30
parent 3a4ac1396d
commit 8ba4121e91
4 changed files with 56 additions and 14 deletions
+1 -1
View File
@@ -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">
+25 -6
View File
@@ -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),
+25 -6
View File
@@ -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',
+5 -1
View File
@@ -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('تنظیمات کانال‌های اطلاع‌رسانی با موفقیت ذخیره شد.');