Add numberOfSessions to class form and fix attendance navigation.

Editable session count on the class edit page and corrected redirects back to the attendance list route.
This commit is contained in:
2026-08-16 08:55:04 +03:30
parent e87d78c295
commit 8d29a5d858
2 changed files with 19 additions and 4 deletions
@@ -5,7 +5,7 @@
:title="$t('attendances.title')" :title="$t('attendances.title')"
:subtitle="`دوره: ${session.course?.title || '-'} | کلاس: ${session.class?.name || '-'} | تاریخ: ${formatJalali(session.day)} (${session.startTime || ''} تا ${session.endTime || ''})`" :subtitle="`دوره: ${session.course?.title || '-'} | کلاس: ${session.class?.name || '-'} | تاریخ: ${formatJalali(session.day)} (${session.startTime || ''} تا ${session.endTime || ''})`"
> >
<Button label="بازگشت" icon="pi pi-arrow-left" text severity="secondary" @click="$router.push('/attendances')" /> <Button label="بازگشت" icon="pi pi-arrow-left" text severity="secondary" @click="$router.push('/attendance')" />
</PageHeader> </PageHeader>
<div class="surface-card p-4 sm:p-5 border-round border-1 border-color shadow-sm mb-3" v-if="session.note"> <div class="surface-card p-4 sm:p-5 border-round border-1 border-color shadow-sm mb-3" v-if="session.note">
@@ -56,7 +56,7 @@
</DataTable> </DataTable>
<div class="flex justify-content-end gap-2 mt-4 pt-3 border-top-1 border-color"> <div class="flex justify-content-end gap-2 mt-4 pt-3 border-top-1 border-color">
<Button label="انصراف" text severity="secondary" @click="$router.push('/attendances')" /> <Button label="انصراف" text severity="secondary" @click="$router.push('/attendance')" />
<Button <Button
:label="$t('attendances.submitAttendance')" :label="$t('attendances.submitAttendance')"
icon="pi pi-save" icon="pi pi-save"
@@ -147,7 +147,7 @@ const handleSubmit = async () => {
})); }));
await attendanceApi.recordSessionAttendance(sessionId, payloadList); await attendanceApi.recordSessionAttendance(sessionId, payloadList);
showSuccess('حضور و غیاب جلسه با موفقیت ثبت شد'); showSuccess('حضور و غیاب جلسه با موفقیت ثبت شد');
router.push('/attendances'); router.push('/attendance');
} catch (err) { } catch (err) {
showError(err); showError(err);
} finally { } finally {
+16 -1
View File
@@ -45,6 +45,11 @@
<InputNumber v-model="form.freeSpots" :min="0" class="w-full text-sm" placeholder="دستی" /> <InputNumber v-model="form.freeSpots" :min="0" class="w-full text-sm" placeholder="دستی" />
</div> </div>
<div class="col-12 md:col-3 flex flex-column gap-2">
<label class="font-semibold text-sm">تعداد جلسات</label>
<InputNumber v-model="form.numberOfSessions" :min="1" class="w-full text-sm" placeholder="مثلا ۱۲" />
</div>
<div class="col-12"> <div class="col-12">
<div class="flex flex-column gap-2 p-3 border-1 border-color border-round"> <div class="flex flex-column gap-2 p-3 border-1 border-color border-round">
<div class="flex align-items-center gap-2"> <div class="flex align-items-center gap-2">
@@ -303,6 +308,7 @@ const form = reactive({
days: [], days: [],
startTime: '', startTime: '',
endTime: '', endTime: '',
numberOfSessions: null,
isActive: true, isActive: true,
adminNotes: [] adminNotes: []
}); });
@@ -359,6 +365,9 @@ const applyCourseDefaults = (course) => {
} }
if (course.capacity) form.capacity = course.capacity; if (course.capacity) form.capacity = course.capacity;
if (course.price != null) form.tuitionFee = course.price; if (course.price != null) form.tuitionFee = course.price;
if (form.numberOfSessions == null && course.sectionCount) {
form.numberOfSessions = course.sectionCount;
}
if (course.sectionCount) defaultSessionCount.value = course.sectionCount; if (course.sectionCount) defaultSessionCount.value = course.sectionCount;
}; };
@@ -400,11 +409,16 @@ const fetchData = async () => {
days: Array.isArray(data.days) ? data.days.map(Number).filter((day) => day >= 0 && day <= 6) : [], days: Array.isArray(data.days) ? data.days.map(Number).filter((day) => day >= 0 && day <= 6) : [],
startTime: data.startTime || '', startTime: data.startTime || '',
endTime: data.endTime || '', endTime: data.endTime || '',
numberOfSessions: data.numberOfSessions ?? null,
isActive: data.isActive !== false, isActive: data.isActive !== false,
adminNotes: Array.isArray(data.adminNotes) ? [...data.adminNotes] : [] adminNotes: Array.isArray(data.adminNotes) ? [...data.adminNotes] : []
}); });
students.value = data.students || []; students.value = data.students || [];
if (data.course?.sectionCount) defaultSessionCount.value = data.course.sectionCount; if (data.numberOfSessions) {
defaultSessionCount.value = data.numberOfSessions;
} else if (data.course?.sectionCount) {
defaultSessionCount.value = data.course.sectionCount;
}
} else if (queryCourseId) { } else if (queryCourseId) {
const linked = courses.value.find((c) => String(c._id) === String(queryCourseId)); const linked = courses.value.find((c) => String(c._id) === String(queryCourseId));
if (linked) { if (linked) {
@@ -443,6 +457,7 @@ const handleSubmit = async () => {
days: form.days || [], days: form.days || [],
startTime: form.startTime || '', startTime: form.startTime || '',
endTime: form.endTime || '', endTime: form.endTime || '',
numberOfSessions: form.numberOfSessions,
isActive: form.isActive, isActive: form.isActive,
adminNotes: (form.adminNotes || []).map((n) => String(n).trim()).filter(Boolean) adminNotes: (form.adminNotes || []).map((n) => String(n).trim()).filter(Boolean)
}; };