From 8ba4121e910cbfa7827ed3c250eda9174002f3ac Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Wed, 26 Aug 2026 05:17:53 +0330 Subject: [PATCH] fix(classes, settings): enhance professor dropdown mapping with phone numbers and optimize SMS bypass list reactivity --- src/views/classes/ClassDetailView.vue | 2 +- src/views/classes/ClassFormView.vue | 31 +++++++++++++++++++++----- src/views/sessions/SessionFormView.vue | 31 +++++++++++++++++++++----- src/views/settings/SettingsView.vue | 6 ++++- 4 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/views/classes/ClassDetailView.vue b/src/views/classes/ClassDetailView.vue index acfc311..f5435f5 100644 --- a/src/views/classes/ClassDetailView.vue +++ b/src/views/classes/ClassDetailView.vue @@ -39,7 +39,7 @@
استاد مدرس - {{ 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 || '—') : '—' }}
diff --git a/src/views/classes/ClassFormView.vue b/src/views/classes/ClassFormView.vue index d66d2d2..6ce82ca 100644 --- a/src/views/classes/ClassFormView.vue +++ b/src/views/classes/ClassFormView.vue @@ -39,7 +39,7 @@
- +
@@ -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), diff --git a/src/views/sessions/SessionFormView.vue b/src/views/sessions/SessionFormView.vue index 32dec7d..e07b83d 100644 --- a/src/views/sessions/SessionFormView.vue +++ b/src/views/sessions/SessionFormView.vue @@ -41,7 +41,7 @@
- +
@@ -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', diff --git a/src/views/settings/SettingsView.vue b/src/views/settings/SettingsView.vue index bf4e31b..e3a9854 100644 --- a/src/views/settings/SettingsView.vue +++ b/src/views/settings/SettingsView.vue @@ -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('تنظیمات کانال‌های اطلاع‌رسانی با موفقیت ذخیره شد.');