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