diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 2ce38f23..c357c9da 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -8,14 +8,11 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { - AdminBatchDashboard: typeof import('./src/components/AdminBatchDashboard.vue')['default'] - Annoucements: typeof import('./src/components/Annoucements.vue')['default'] AnnouncementModal: typeof import('./src/components/Modals/AnnouncementModal.vue')['default'] Apps: typeof import('./src/components/Sidebar/Apps.vue')['default'] AppSidebar: typeof import('./src/components/Sidebar/AppSidebar.vue')['default'] AssessmentModal: typeof import('./src/components/Modals/AssessmentModal.vue')['default'] AssessmentPlugin: typeof import('./src/components/AssessmentPlugin.vue')['default'] - Assessments: typeof import('./src/components/Assessments.vue')['default'] Assignment: typeof import('./src/components/Assignment.vue')['default'] AssignmentForm: typeof import('./src/components/Modals/AssignmentForm.vue')['default'] AudioBlock: typeof import('./src/components/AudioBlock.vue')['default'] @@ -24,14 +21,8 @@ declare module 'vue' { BadgeAssignments: typeof import('./src/components/Settings/BadgeAssignments.vue')['default'] BadgeForm: typeof import('./src/components/Settings/BadgeForm.vue')['default'] Badges: typeof import('./src/components/Settings/Badges.vue')['default'] - BatchCard: typeof import('./src/components/BatchCard.vue')['default'] BatchCourseModal: typeof import('./src/components/Modals/BatchCourseModal.vue')['default'] - BatchCourses: typeof import('./src/components/BatchCourses.vue')['default'] - BatchDashboard: typeof import('./src/components/BatchDashboard.vue')['default'] - BatchFeedback: typeof import('./src/components/BatchFeedback.vue')['default'] - BatchOverlay: typeof import('./src/components/BatchOverlay.vue')['default'] BatchStudentProgress: typeof import('./src/components/Modals/BatchStudentProgress.vue')['default'] - BatchStudents: typeof import('./src/components/BatchStudents.vue')['default'] BrandSettings: typeof import('./src/components/Settings/BrandSettings.vue')['default'] BulkCertificates: typeof import('./src/components/Modals/BulkCertificates.vue')['default'] Categories: typeof import('./src/components/Settings/Categories.vue')['default'] @@ -82,7 +73,6 @@ declare module 'vue' { LessonContent: typeof import('./src/components/LessonContent.vue')['default'] LessonHelp: typeof import('./src/components/LessonHelp.vue')['default'] Link: typeof import('./src/components/Controls/Link.vue')['default'] - LiveClass: typeof import('./src/components/LiveClass.vue')['default'] LiveClassAttendance: typeof import('./src/components/Modals/LiveClassAttendance.vue')['default'] LiveClassModal: typeof import('./src/components/Modals/LiveClassModal.vue')['default'] LMSLogo: typeof import('./src/components/Icons/LMSLogo.vue')['default'] diff --git a/frontend/src/components/AdminBatchDashboard.vue b/frontend/src/components/AdminBatchDashboard.vue deleted file mode 100644 index 4ed419d9..00000000 --- a/frontend/src/components/AdminBatchDashboard.vue +++ /dev/null @@ -1,118 +0,0 @@ - - diff --git a/frontend/src/components/Annoucements.vue b/frontend/src/components/Annoucements.vue deleted file mode 100644 index 16ca3e41..00000000 --- a/frontend/src/components/Annoucements.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/frontend/src/components/LiveClass.vue b/frontend/src/components/LiveClass.vue deleted file mode 100644 index fffbd23a..00000000 --- a/frontend/src/components/LiveClass.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - diff --git a/frontend/src/components/Modals/StudentModal.vue b/frontend/src/components/Modals/StudentModal.vue index 5c9c7b97..f1d0ae90 100644 --- a/frontend/src/components/Modals/StudentModal.vue +++ b/frontend/src/components/Modals/StudentModal.vue @@ -3,7 +3,7 @@ v-model="show" :options="{ title: __('Enroll a Student'), - size: 'sm', + size: 'lg', actions: [ { label: 'Submit', @@ -52,8 +52,6 @@ import { useOnboarding } from 'frappe-ui/frappe' import { openSettings } from '@/utils' import Link from '@/components/Controls/Link.vue' -const students = defineModel('reloadStudents') -const batchModal = defineModel('batchModal') const student = ref(null) const payment = ref(null) const user = inject('$user') @@ -62,33 +60,37 @@ const show = defineModel() const props = defineProps({ batch: { - type: String, + type: Object, + default: null, + }, + students: { + type: Object, default: null, }, }) const addStudent = (close) => { - call('frappe.client.insert', { - doc: { - doctype: 'LMS Batch Enrollment', - batch: props.batch, + props.students.insert.submit( + { member: student.value, payment: payment.value, + batch: props.batch.data?.name, }, - }) - .then(() => { - if (user.data?.is_system_manager) - updateOnboardingStep('add_batch_student') + { + onSuccess() { + if (user.data?.is_system_manager) + updateOnboardingStep('add_batch_student') - students.value.reload() - batchModal.value.reload() - student.value = null - payment.value = null - close() - }) - .catch((err) => { - toast.error(err.messages?.[0] || err) - console.error(err) - }) + student.value = null + payment.value = null + props.batch.reload() + close() + }, + onError(err) { + toast.error(err.messages?.[0] || err) + console.error(err) + }, + } + ) } diff --git a/frontend/src/pages/BatchDetail.vue b/frontend/src/pages/BatchDetail.vue deleted file mode 100644 index e071e8e7..00000000 --- a/frontend/src/pages/BatchDetail.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - diff --git a/frontend/src/pages/Batch.vue b/frontend/src/pages/Batches/Batch.vue similarity index 92% rename from frontend/src/pages/Batch.vue rename to frontend/src/pages/Batches/Batch.vue index de79570e..7a67a322 100644 --- a/frontend/src/pages/Batch.vue +++ b/frontend/src/pages/Batches/Batch.vue @@ -235,18 +235,6 @@ import { formatTime } from '@/utils' import { sessionStore } from '@/stores/session' import CourseInstructors from '@/components/CourseInstructors.vue' import UserAvatar from '@/components/UserAvatar.vue' -import BatchDashboard from '@/components/BatchDashboard.vue' -import BatchCourses from '@/components/BatchCourses.vue' -import LiveClass from '@/components/LiveClass.vue' -import BatchStudents from '@/components/BatchStudents.vue' -import AdminBatchDashboard from '@/components/AdminBatchDashboard.vue' -import Assessments from '@/components/Assessments.vue' -import Announcements from '@/components/Annoucements.vue' -import AnnouncementModal from '@/components/Modals/AnnouncementModal.vue' -import Discussions from '@/components/Discussions.vue' -import DateRange from '@/components/Common/DateRange.vue' -import BulkCertificates from '@/components/Modals/BulkCertificates.vue' -import BatchFeedback from '@/components/BatchFeedback.vue' import dayjs from 'dayjs/esm' import { getLmsRoute } from '@/utils/basePath' diff --git a/frontend/src/components/BatchCourses.vue b/frontend/src/pages/Batches/BatchCourses.vue similarity index 100% rename from frontend/src/components/BatchCourses.vue rename to frontend/src/pages/Batches/BatchCourses.vue diff --git a/frontend/src/pages/Batches/BatchDetail.vue b/frontend/src/pages/Batches/BatchDetail.vue new file mode 100644 index 00000000..1b511741 --- /dev/null +++ b/frontend/src/pages/Batches/BatchDetail.vue @@ -0,0 +1,143 @@ + + + diff --git a/frontend/src/pages/BatchForm.vue b/frontend/src/pages/Batches/BatchForm.vue similarity index 98% rename from frontend/src/pages/BatchForm.vue rename to frontend/src/pages/Batches/BatchForm.vue index 96bc9c6d..dec36546 100644 --- a/frontend/src/pages/BatchForm.vue +++ b/frontend/src/pages/Batches/BatchForm.vue @@ -1,6 +1,6 @@ + diff --git a/frontend/src/pages/Courses/CourseDashboard.vue b/frontend/src/pages/Courses/CourseDashboard.vue index 186c29f1..1c9fa8c5 100644 --- a/frontend/src/pages/Courses/CourseDashboard.vue +++ b/frontend/src/pages/Courses/CourseDashboard.vue @@ -349,14 +349,12 @@ const updateLessonProgress = (value: string) => { } watch([searchFilter], () => { - let filterApplied = false let filters: Filters = { course: props.course.data?.name, } if (searchFilter.value) { filters.member_name = ['like', `%${searchFilter.value}%`] - filterApplied = true } progressList.update({ @@ -392,7 +390,7 @@ const progressColumns = computed(() => { width: '30%', }, { - label: __('Start Date'), + label: __('Enrolled On'), key: 'creation', align: 'right', }, diff --git a/frontend/src/pages/Home/AdminHome.vue b/frontend/src/pages/Home/AdminHome.vue index 669dd305..8bb3af34 100644 --- a/frontend/src/pages/Home/AdminHome.vue +++ b/frontend/src/pages/Home/AdminHome.vue @@ -210,7 +210,7 @@ import { } from 'lucide-vue-next' import { formatTime } from '@/utils' import CourseCard from '@/components/CourseCard.vue' -import BatchCard from '@/components/BatchCard.vue' +import BatchCard from '@/pages/Batches/components/BatchCard.vue' const user = inject('$user') const dayjs = inject('$dayjs') diff --git a/frontend/src/pages/Home/StudentHome.vue b/frontend/src/pages/Home/StudentHome.vue index 1c45e331..10e9f1f4 100644 --- a/frontend/src/pages/Home/StudentHome.vue +++ b/frontend/src/pages/Home/StudentHome.vue @@ -150,7 +150,7 @@ import { Video, } from 'lucide-vue-next' import CourseCard from '@/components/CourseCard.vue' -import BatchCard from '@/components/BatchCard.vue' +import BatchCard from '@/pages/Batches/components/BatchCard.vue' import UpcomingEvaluations from '@/components/UpcomingEvaluations.vue' const dayjs = inject('$dayjs') diff --git a/frontend/src/router.js b/frontend/src/router.js index ce46a656..1d57a76f 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -42,18 +42,12 @@ const routes = [ { path: '/batches', name: 'Batches', - component: () => import('@/pages/Batches.vue'), - }, - { - path: '/batches/details/:batchName', - name: 'BatchDetail', - component: () => import('@/pages/BatchDetail.vue'), - props: true, + component: () => import('@/pages/Batches/Batches.vue'), }, { path: '/batches/:batchName', - name: 'Batch', - component: () => import('@/pages/Batch.vue'), + name: 'BatchDetail', + component: () => import('@/pages/Batches/BatchDetail.vue'), props: true, }, { @@ -125,12 +119,6 @@ const routes = [ component: () => import('@/pages/LessonForm.vue'), props: true, }, - { - path: '/batches/:batchName/edit', - name: 'BatchForm', - component: () => import('@/pages/BatchForm.vue'), - props: true, - }, { path: '/job-opening/:jobName/edit', name: 'JobForm', diff --git a/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json b/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json index 179867fb..adbdc3e7 100644 --- a/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json +++ b/lms/lms/doctype/lms_batch_enrollment/lms_batch_enrollment.json @@ -9,6 +9,7 @@ "member", "member_name", "member_username", + "member_image", "column_break_sjzm", "batch", "payment", @@ -70,11 +71,17 @@ "label": "Batch", "options": "LMS Batch", "reqd": 1 + }, + { + "fetch_from": "member.user_image", + "fieldname": "member_image", + "fieldtype": "Attach Image", + "label": "Member Image" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2026-02-03 10:51:28.475356", + "modified": "2026-02-10 16:07:28.315982", "modified_by": "sayali@frappe.io", "module": "LMS", "name": "LMS Batch Enrollment", diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 5631aa1c..acdacdc5 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -1110,7 +1110,7 @@ def get_batch_details(batch: str): is_student_enrolled = frappe.session.user in batch_students if not (is_batch_published or is_batch_admin or is_student_enrolled): - return + return {} batch_details = frappe.db.get_value( "LMS Batch",