diff --git a/frontend/src/components/LecturerCourseEnrollment/LecturerCourseEnrollment.vue b/frontend/src/components/LecturerCourseEnrollment/LecturerCourseEnrollment.vue index 5b4f7a55b0c8cc4c2032fdfc5d9cf4c3960c0f1e..8e671f73e03e8d5165e194660537013596e173b1 100644 --- a/frontend/src/components/LecturerCourseEnrollment/LecturerCourseEnrollment.vue +++ b/frontend/src/components/LecturerCourseEnrollment/LecturerCourseEnrollment.vue @@ -1,295 +1,602 @@ <template> - <!-- container course enrollment lecturer --> + <!-- Container Course Enrollment --> <div class="row"> - <!-- card course enrollment lecturer --> - <div class="col-md-12"> - <div data-aos="fade-up" data-aos-duration="500" class="card p-3"> - <div class="card-body"> - <h3 - data-aos="fade-in" - data-aos-offset="300" - data-aos-easing="ease-in-sine" - class="text-blue-six mb-4" - > - Daftar Mahasiswa Wali - </h3> - - <!-- Search & Filter --> - <div class="row"> - <!-- Filter Title --> - <div class="col-auto d-flex align-items-center justify-content-end"> - <b>Filter</b> + <!-- Alert PRS --> + <div class="d-flex justify-content-center"> + <div + v-if="submitPRS" + class="alert border-0 rounded alert-dismissible fade show" + role="alert" + :class="{ + 'alert-success': isAlertSuccess, + 'alert-danger': isAlertDanger + }" + > + Rencana studi berhasil disahkan! + <div type="button" class="btn-close" @click="submitPRS = false"></div> + </div> + </div> + <div class="row"> + <!-- Card Course Enrollment Kaprodi --> + <div class="col-md-8"> + <div data-aos="fade-up" data-aos-duration="500" class="card p-3"> + <div class="card-body"> + <h3 + data-aos="fade-in" + data-aos-offset="300" + data-aos-easing="ease-in-sine" + class="text-blue-six mb-4" + > + Daftar Mahasiswa Prodi + </h3> + <!-- Search & Filter --> + <div class="row"> + <!-- Filter Title --> + <div + class="col-auto d-flex align-items-center justify-content-end" + > + <b>Filter</b> + </div> + <!-- Filter by Status --> + <div class="col-auto px-0 dropdown"> + <select + class="btn btn-dropdown-six dropdown-toggle" + aria-label="Status" + @change="filterStudents($event.target.value)" + id="filter-status" + > + <option value="all" selected>Semua</option> + <option value="FINAL">Final</option> + <option value="APPROVED">Disetujui</option> + <option value="UNAPPROVED">Tidak disetujui</option> + <option value="SUBMITTED">Belum disetujui</option> + <option value="DRAFT">Belum Dikirim</option> + </select> + </div> + <!-- Search Title --> + <div class="col d-flex align-items-center justify-content-end"> + <b>Cari</b> + </div> + <!-- Search Field --> + <div class="col-5"> + <form class="d-flex"> + <input + class="py-2 form-control" + type="search" + placeholder="Cari Mahasiswa" + aria-label="Search" + v-model="keywordProdi" + /> + <button class="btn btn-primary-six px-3 py-0" type="submit"> + <span><i class="fa fa-search" aria-hidden="true"></i></span> + </button> + </form> + </div> + </div> + <!-- Lecturer Course Table --> + <table class="table table-hover my-4"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">NIM</th> + <th scope="col">Nama Mahasiswa</th> + <th scope="col" class="text-center">Total SKS</th> + <th scope="col" class="text-center">Status</th> + </tr> + </thead> + <tbody> + <tr + v-for="(item, i) of showedStudentsData" + :key="'student' + i" + > + <th scope="row">{{ i + 1 }}</th> + <td>{{ item.nim }}</td> + <td>{{ item.name }}</td> + <td class="text-center">{{ item.studyPlan.creditsTotal }}</td> + <td class="text-center"> + <span + class="badge" + :class=" + item.studyPlan.status === 'FINAL' + ? 'badge-success' + : item.studyPlan.status === 'APPROVED' + ? 'badge-success' + : item.studyPlan.status === 'DRAFT' + ? 'badge-warning' + : item.studyPlan.status === 'SUBMITTED' + ? 'badge-warning' + : 'badge-danger' + " + >{{ + item.studyPlan.status === "FINAL" + ? "Final" + : item.studyPlan.status === "APPROVED" + ? "Disetujui" + : item.studyPlan.status === "DRAFT" + ? "Belum dikirim" + : item.studyPlan.status === "SUBMITTED" + ? "Belum disetujui" + : "Tidak disetujui" + }}</span + > + </td> + </tr> + </tbody> + </table> + <!-- Pagination --> + <div class="row"> + <div class="col"> + <span> + Total: {{ filteredStudentsData.length }} mahasiswa + </span> + </div> + <div class="col d-flex justify-content-end"> + <v-pagination + v-model="page" + :pages="pageNumberTotal" + :range-size="studentsPerPage" + active-color="#DCEDFF" + @update:modelValue="updatePage" + /> + </div> </div> - <!-- Filter by Status --> - <div class="col-auto px-0 dropdown"> - <select - class="btn btn-dropdown-six dropdown-toggle" - aria-label="Status" - @change="filterStudents($event.target.value)" - id="filter-status" + </div> + </div> + </div> + <!-- Card Finalize Study Plan --> + <div class="col-md-4"> + <div data-aos="fade-up" data-aos-duration="500" class="card p-3"> + <div class="card-body"> + <h3 + data-aos="fade-in" + data-aos-offset="300" + data-aos-easing="ease-in-sine" + class="text-start text-blue-six mb-4" + > + Finalisasi Rencana Studi + </h3> + <p class="text-start" data-aos="fade-in" data-aos-offset="300"> + Finalisasi Rencana Studi hanya dapat diterapkan apabila seluruh + rencana studi mahasiswa sudah disetujui oleh dosen wali mahasiswa + yang bersangkutan. + </p> + <p class="text-start" textdata-aos="fade-in" data-aos-offset="300"> + Perlu diingat bahwa finalisasi rencana studi diterapkan untuk + mahasiswa prodi terkait dan tidak dapat dibatalkan hingga periode + PRS dimulai. + </p> + <div class="row justify-content-center mt-5"> + <button + type="button" + class="btn btn-primary-six col-11" + data-toggle="modal" + data-target="#FRSModal" + @click="submitPRS = false" > - <option value="all" selected>Semua</option> - <option value="APPROVED">Disetujui</option> - <option value="DRAFT">Belum Mengirim</option> - <option value="SUBMITTED">Tidak Disetujui</option> - </select> + Finalisasi Sekarang + </button> </div> - - <!-- Search Title --> - <div class="col d-flex align-items-center justify-content-end"> - <b>Cari</b> + </div> + </div> + </div> + </div> + <!-- Modal finalisasi rencana studi --> + <div + class="modal fade" + id="FRSModal" + tabindex="-1" + role="dialog" + aria-labelledby="FRSModal" + > + <div class="modal-dialog modal-dialog-centered modal-m" role="document"> + <div class="modal-content p-3"> + <div class="modal-header"> + <h2 class="mx-auto text-blue-six" id="FRSModal"> + Finalisasi Rencana Studi + </h2> + </div> + <div class="modal-body"> + <div class="row"> + <p> + Apakah Anda yakin untuk melakukan finalisasi rencana studi? Anda + tidak dapat membatalkan FRS hingga periode PRS dimulai. + </p> </div> - <!-- Search Field --> - <div class="col-5"> - <form class="d-flex"> - <input - class="py-2 form-control" - type="search" - placeholder="Cari Mahasiswa [NIM] [Nama]" - aria-label="Search" - v-model="keyword" - /> - <button class="btn btn-primary-six px-3 py-0" type="submit"> - <span><i class="fa fa-search" aria-hidden="true"></i></span> + <div class="row"> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-secondary-six col-12" + data-dismiss="modal" + > + Batal </button> - </form> + </div> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-primary-six col-12" + data-dismiss="modal" + @click="submitPRSButton" + > + Simpan + </button> + </div> </div> </div> - - <!-- Lecturer Course Table --> - <table class="table table-hover my-4"> - <thead> - <tr> - <th scope="col">#</th> - <th scope="col">NIM</th> - <th scope="col">Nama Mahasiswa</th> - <th scope="col" class="text-center">Total SKS</th> - <th scope="col" class="text-center">Status</th> - <th scope="col" class="text-center">Aksi</th> - </tr> - </thead> - <tbody> - <tr v-for="(item, i) of showedStudentsData" :key="'student' + i"> - <th scope="row">{{ i + 1 }}</th> - <td>{{ item.nim }}</td> - <td>{{ item.name }}</td> - <td class="text-center">{{ item.studyPlan.creditsTotal }}</td> - <td class="text-center"> - <span - class="badge" - :class=" - item.studyPlan.status === 'APPROVED' - ? 'badge-success' - : item.studyPlan.status === 'SUBMITTED' - ? 'badge-danger' - : 'badge-warning' - " - >{{ - item.studyPlan.status === "APPROVED" - ? "Disetujui" - : item.studyPlan.status === "SUBMITTED" - ? "Tidak Disetujui" - : "Belum dikirim" - }}</span - > - </td> - <td class="text-center"> - <button - type="button" - class="btn py-1 px-2" - :class=" - item.studyPlan.status === 'DRAFT' - ? 'btn-disabled-six' - : 'btn-secondary-six' - " - @click=" - item.studyPlan.status === 'DRAFT' - ? null - : openEditStudentCourseEnrollmentModal(item) - " - > - Sunting + </div> + </div> + </div> + <!-- course enrollment kaprodi ends here --> + <!-- card course enrollment lecturer --> + <div class="row mt-4"> + <div class="col-md-12"> + <div data-aos="fade-up" data-aos-duration="500" class="card p-3"> + <div class="card-body"> + <h3 + data-aos="fade-in" + data-aos-offset="300" + data-aos-easing="ease-in-sine" + class="text-blue-six mb-4" + > + Daftar Mahasiswa Wali + </h3> + <!-- Search & Filter --> + <div class="row"> + <!-- Filter Title --> + <div + class="col-auto d-flex align-items-center justify-content-end" + > + <b>Filter</b> + </div> + <!-- Filter by Status --> + <div class="col-auto px-0 dropdown"> + <select + class="btn btn-dropdown-six dropdown-toggle" + aria-label="Status" + @change="filterStudentsAdvised($event.target.value)" + id="filter-status" + > + <option value="all" selected>Semua</option> + <option value="FINAL">Final</option> + <option value="APPROVED">Disetujui</option> + <option value="UNAPPROVED">Tidak disetujui</option> + <option value="SUBMITTED">Belum disetujui</option> + <option value="DRAFT">Belum Dikirim</option> + </select> + </div> + <!-- Search Title --> + <div class="col d-flex align-items-center justify-content-end"> + <b>Cari</b> + </div> + <!-- Search Field --> + <div class="col-5"> + <form class="d-flex"> + <input + class="py-2 form-control" + type="search" + placeholder="Cari Mahasiswa" + aria-label="Search" + v-model="keywordAdvised" + /> + <button class="btn btn-primary-six px-3 py-0" type="submit"> + <span><i class="fa fa-search" aria-hidden="true"></i></span> </button> - </td> - </tr> - </tbody> - </table> - - <!-- Pagination --> - <div class="row"> - <div class="col"> - <span> - Total: {{ filteredStudentsData.length }} mahasiswa - </span> + </form> + </div> </div> - <div class="col d-flex justify-content-end"> - <v-pagination - v-model="page" - :pages="pageNumberTotal" - :range-size="studentsPerPage" - active-color="#DCEDFF" - @update:modelValue="updatePage" - /> + <!-- Lecturer Course Table - Advised --> + <table class="table table-hover my-4"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">NIM</th> + <th scope="col">Nama Mahasiswa</th> + <th scope="col" class="text-center">Total SKS</th> + <th scope="col" class="text-center">Status</th> + <th scope="col" class="text-center">Aksi</th> + </tr> + </thead> + <tbody> + <tr + v-for="(item, i) of showedStudentsDataAdvised" + :key="'student' + i" + > + <th scope="row">{{ i + 1 }}</th> + <td>{{ item.nim }}</td> + <td>{{ item.name }}</td> + <td class="text-center">{{ item.studyPlan.creditsTotal }}</td> + <td class="text-center"> + <span + class="badge" + :class=" + item.studyPlan.status === 'FINAL' + ? 'badge-success' + : item.studyPlan.status === 'APPROVED' + ? 'badge-success' + : item.studyPlan.status === 'DRAFT' + ? 'badge-warning' + : item.studyPlan.status === 'SUBMITTED' + ? 'badge-warning' + : 'badge-danger' + " + >{{ + item.studyPlan.status === "FINAL" + ? "Disetujui" + : item.studyPlan.status === "APPROVED" + ? "Disetujui" + : item.studyPlan.status === "DRAFT" + ? "Belum dikirim" + : item.studyPlan.status === "SUBMITTED" + ? "Belum disetujui" + : "Tidak disetujui" + }}</span + > + </td> + <td class="text-center"> + <button + type="button" + class="btn py-1 px-2" + :class=" + item.studyPlan.status === 'DRAFT' + ? 'btn-disabled-six' + : 'btn-secondary-six' + " + @click=" + item.studyPlan.status === 'DRAFT' + ? null + : openEditStudentCourseEnrollmentModal(item) + " + > + Sunting + </button> + </td> + </tr> + </tbody> + </table> + <!-- Pagination --> + <div class="row"> + <div class="col"> + <span> + Total: {{ filteredStudentsDataAdvised.length }} mahasiswa + + </span> + </div> + <div class="col d-flex justify-content-end"> + <v-pagination + v-model="pageAdvised" + :pages="pageNumberTotalAdvised" + :range-size="studentsPerPage" + active-color="#DCEDFF" + @update:modelValue="updatePageAdvised" + /> + </div> </div> </div> </div> - </div> - <!-- Edit Modal --> - <div - class="modal fade" - id="editButton" - tabindex="-1" - role="dialog" - aria-labelledby="editButton" - > + <!-- Edit Study Plan Modal --> <div - class="modal-dialog modal-dialog-centered modal-lg" - role="document" + class="modal fade" + id="editButton" + tabindex="-1" + role="dialog" + aria-labelledby="editButton" > - <div class="modal-content p-3"> - <div class="modal-header"> - <h2 class="mx-auto text-blue-six" id="editButton"> - Penyetujuan Rencana Studi - </h2> - </div> - <div class="modal-body overflow-auto"> - <div class="row" v-if="selectedStudent"> - <div class="col"> - {{ selectedStudent.name }} - {{ selectedStudent.nim }} / Total - SKS : {{ selectedStudent.studyPlan.creditsTotal }} - </div> - <div class="col-auto"> - Status - <span - class="badge" - :class=" - selectedStudent.studyPlan.status === 'APPROVED' - ? 'badge-success' - : 'badge-danger' - " - >{{ - selectedStudent.studyPlan.status === "APPROVED" - ? "Disetujui" - : "Tidak Disetujui" - }}</span - > - </div> + <div + class="modal-dialog modal-dialog-centered modal-lg" + role="document" + > + <div class="modal-content p-3"> + <div class="modal-header"> + <h2 class="mx-auto text-blue-six" id="editButton"> + Penyetujuan Rencana Studi + </h2> </div> - - <div class="row"> - <!-- Field Table --> - <table class="table table-hover my-4"> - <thead> - <tr> - <th scope="col">#</th> - <th scope="col">Kode</th> - <th scope="col">Mata Kuliah</th> - <th scope="col" class="text-center">Kelas</th> - <th scope="col" class="text-center">SKS</th> - <th scope="col" class="text-center">Jenis Mata Kuliah</th> - <th scope="col" class="text-center">Penyetujuan</th> - </tr> - </thead> - <tbody v-if="selectedStudent && selectedStudent.studyPlan"> - <tr - v-for="(item, i) of selectedStudent.studyPlan - .studyPlanCourses" - :key="'student' + i" + <div class="modal-body overflow-auto"> + <div class="row" v-if="selectedStudent"> + <div class="col"> + {{ selectedStudent.name }} - {{ selectedStudent.nim }} / + Total SKS : {{ selectedStudent.studyPlan.creditsTotal }} + </div> + <div class="col-auto"> + Status + <span + class="badge" + :class=" + selectedStudent.studyPlan.status === 'APPROVED' + ? 'badge-success' + : 'badge-danger' + " + >{{ + selectedStudent.studyPlan.status === "APPROVED" + ? "Disetujui" + : "Tidak Disetujui" + }}</span > - <th scope="row">{{ i + 1 }}</th> - <td>{{ item.code }}</td> - <td>{{ item.name }}</td> - <td class="text-center">01</td> - <td class="text-center">{{ item.credits }}</td> - <td class="text-center">{{ item.type }}</td> - <!-- @TODO: modify code in here --> - <td class="text-center"> - <div class="col-auto"> - <div class="form-group"> - <div class="custom-control custom-switch"> - <input - type="checkbox" - class="custom-control-input p-0" - id="customSwitch1" - v-model="selectedStudentapproved" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> + </div> + </div> + + <div class="row"> + <!-- Field Table --> + <table class="table table-hover my-4"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">Kode</th> + <th scope="col">Mata Kuliah</th> + <th scope="col" class="text-center">Kelas</th> + <th scope="col" class="text-center">SKS</th> + <th scope="col" class="text-center"> + Jenis Mata Kuliah + </th> + <th scope="col" class="text-center">Penyetujuan</th> + </tr> + </thead> + <tbody v-if="selectedStudent && selectedStudent.studyPlan"> + <tr + v-for="(item, i) of selectedStudent.studyPlan + .studyPlanCourses" + :key="'student' + i" + > + <th scope="row">{{ i + 1 }}</th> + <td>{{ item.code }}</td> + <td>{{ item.name }}</td> + <td class="text-center">01</td> + <td class="text-center">{{ item.credits }}</td> + <td class="text-center">{{ item.type }}</td> + <!-- @TODO: modify code in here --> + <td class="text-center"> + <div class="col-auto"> + <div class="form-group"> + <div class="custom-control custom-switch"> + <input + type="checkbox" + class="custom-control-input p-0" + id="customSwitch1" + v-model="selectedStudentapproved" + @click="updateStudyPlan" + /> + <label + class="custom-control-label" + for="customSwitch1" + > + </label> + </div> </div> </div> - </div> - </td> - </tr> - </tbody> - </table> - </div> - <div class="row mt-5"> - <!-- Button Close --> - <div class="form-group col-6"> - <button - type="button" - class="btn btn-secondary-six col-12" - @click="cancelStudentCourseEnrollmentModal" - > - Batal - </button> + </td> + </tr> + </tbody> + </table> </div> - <!-- Button Update --> - <div class="form-group col-6"> - <button - type="button" - class="btn btn-primary-six col-12" - @click="submitStudentCourseEnrollmentModal" - > - Simpan - </button> + <div class="row mt-5"> + <!-- Button Close --> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-secondary-six col-12" + @click="cancelStudentCourseEnrollmentModal" + > + Batal + </button> + </div> + <!-- Button Update --> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-primary-six col-12" + @click="submitStudentCourseEnrollmentModal" + > + Simpan + </button> + </div> </div> </div> </div> </div> </div> - </div> - <!-- Notes Modal --> - <div - class="modal fade" - id="notesApproval" - tabindex="-1" - role="dialog" - aria-labelledby="notesApproval" - > - <div class="modal-dialog modal-dialog-centered" role="document"> - <div class="modal-content p-3"> - <div class="modal-header"> - <h2 class="mx-auto text-blue-six" id="notesApproval"> - Catatan - </h2> - </div> - <div class="modal-body overflow-auto"> - <form> - <div class="row"> - <!-- Field Reason --> - <div class="form-group col-12"> - <label>Alasan tidak menyetujui</label> - <textarea - class="mt-2" - v-model="reasonApproval" - placeholder="Masukan alasan mengapa rencana studi ini tidak disetujui" - spellcheck="false" - /> + <!-- Edit Modal --> + <div + class="modal fade" + id="editButton" + tabindex="-1" + role="dialog" + aria-labelledby="editButton" + > + <div + class="modal-dialog modal-dialog-centered modal-lg" + role="document" + > + <div class="modal-content p-3"> + <div class="modal-header"> + <h2 class="mx-auto text-blue-six" id="editButton"> + Penyetujuan Rencana Studi + </h2> + </div> + <div class="modal-body overflow-auto"> + <div class="row" v-if="selectedStudent"> + <div class="col"> + {{ selectedStudent.name }} - {{ selectedStudent.nim }} / + Total SKS : {{ selectedStudent.studyPlan.creditsTotal }} + </div> + <div class="col-auto"> + Status + <span + class="badge" + :class=" + selectedStudent.studyPlan.status === 'APPROVED' + ? 'badge-success' + : 'badge-danger' + " + >{{ + selectedStudent.studyPlan.status === "APPROVED" + ? "Disetujui" + : "Tidak Disetujui" + }}</span + > </div> </div> + <div class="row"> + <!-- Field Table --> + <table class="table table-hover my-4"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">Kode</th> + <th scope="col">Mata Kuliah</th> + <th scope="col" class="text-center">Kelas</th> + <th scope="col" class="text-center">SKS</th> + <th scope="col" class="text-center"> + Jenis Mata Kuliah + </th> + <th scope="col" class="text-center">Penyetujuan</th> + </tr> + </thead> + <tbody v-if="selectedStudent && selectedStudent.studyPlan"> + <tr + v-for="(item, i) of selectedStudent.studyPlan + .studyPlanCourses" + :key="'student' + i" + > + <th scope="row">{{ i + 1 }}</th> + <td>{{ item.code }}</td> + <td>{{ item.name }}</td> + <td class="text-center">01</td> + <td class="text-center">{{ item.credits }}</td> + <td class="text-center">{{ item.type }}</td> + <!-- @TODO: modify code in here --> + <td class="text-center"> + <div class="col-auto"> + <div class="form-group"> + <div class="custom-control custom-switch"> + <input + type="checkbox" + class="custom-control-input p-0" + id="customSwitch1" + v-model="selectedStudentapproved" + @click="updateStudyPlan" + /> + <label + class="custom-control-label" + for="customSwitch1" + > + </label> + </div> + </div> + </div> + </td> + </tr> + </tbody> + </table> + </div> <div class="row mt-5"> <!-- Button Close --> <div class="form-group col-6"> <button type="button" class="btn btn-secondary-six col-12" - @click="cancelNotesApproval" + @click="cancelStudentCourseEnrollmentModal" > Batal </button> @@ -299,13 +606,70 @@ <button type="button" class="btn btn-primary-six col-12" - @click="submitNotesApproval" + @click="submitStudentCourseEnrollmentModal" > - Kirim + Simpan </button> </div> </div> - </form> + </div> + </div> + </div> + </div> + <!-- Notes Modal --> + <div + class="modal fade" + id="notesApproval" + tabindex="-1" + role="dialog" + aria-labelledby="notesApproval" + > + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content p-3"> + <div class="modal-header"> + <h2 class="mx-auto text-blue-six" id="notesApproval"> + Catatan + </h2> + </div> + <div class="modal-body overflow-auto"> + <form> + <div class="row"> + <!-- Field Reason --> + <div class="form-group col-12"> + <label>Alasan tidak menyetujui</label> + <textarea + class="mt-2" + v-model="reasonApproval" + placeholder="Masukan alasan mengapa rencana studi ini tidak disetujui" + spellcheck="false" + /> + </div> + </div> + + <div class="row mt-5"> + <!-- Button Close --> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-secondary-six col-12" + @click="cancelNotesApproval" + > + Batal + </button> + </div> + <!-- Button Update --> + <div class="form-group col-6"> + <button + type="button" + class="btn btn-primary-six col-12" + @click="submitNotesApproval" + > + Kirim + </button> + </div> + </div> + </form> + </div> </div> </div> </div> @@ -332,36 +696,67 @@ export default { reasonApproval: null, semester: 1, year: 2021, + kaprodi: true, + currentSkillGroup: null, + currentSkillGroupID: null, + lecturersID: [], studentsData: [], + studentsDataAdvised: [], filteredStudentsData: [], showedStudentsData: [], + filteredStudentsDataAdvised: [], + showedStudentsDataAdvised: [], studentsPerPage: 5, page: 1, + pageAdvised: 1, pageNumberTotal: 1, + pageNumberTotalAdvised: 1, startIndex: 0, + startIndexAdvised: 0, selectedStudent: null, selectedStudentCourses: null, selectedStudentapproved: false, - keyword: "" + keywordProdi: "", + keywordAdvised: "", + isAlertSuccess: false, + isAlertDanger: false, + submitPRS: false, + // For debugging purposes + debugString: null }; }, watch: { - keyword: function(val) { + keywordProdi: function(val) { if (!val) { this.showedStudentsData = this.studentsData; } else { - this.showedStudentsData = this.showedStudentsData.filter( - (student) => - student.name.toLowerCase().includes(val.toLowerCase()) || - student.nim.toLowerCase().includes(val.toLowerCase()) + this.showedStudentsData = this.showedStudentsData.filter((student) => + student.name.toLowerCase().includes(val.toLowerCase()) + ); + } + }, + keywordAdvised: function(val) { + if (!val) { + this.showedStudentsDataAdvised = this.studentsDataAdvised; + } else { + this.showedStudentsDataAdvised = this.showedStudentsDataAdvised.filter( + (student) => student.name.toLowerCase().includes(val.toLowerCase()) ); } } }, mounted() { - this.getAllStudentAdvised(); + this.currentSkillGroup = "Rekayasa Perangkat Lunak"; + this.kaprodi = false; + this.getAllStudents(); + this.getAdvisedStudents(); }, methods: { + submitPRSButton() { + this.submitPRS = true; + this.isAlertSuccess = true; + }, + // Modal Methods openEditStudentCourseEnrollmentModal(student) { this.selectedStudent = student; this.getCoursesSelectedStudent(); @@ -393,7 +788,77 @@ export default { submitNotesApproval() { console.log(this.reasonApproval); }, - async getAllStudentAdvised() { + // Get methods + async getAllStudents() { + // Get current skill group ID + await axios + .get(process.env.VUE_APP_API_ENDPOINT + "/skillgroup") + .then((response) => { + if (response.status == 200) { + for (let i = 0; i < response.data.length; i++) { + if (response.data[i].name === this.currentSkillGroup) { + this.currentSkillGroupID = response.data[i].id; + } + } + } + }) + .catch((error) => { + console.error(error); + }); + // Get all lecturers in skill group + await axios + .get( + process.env.VUE_APP_API_ENDPOINT + + "/lecturer/?skillGroups=" + + this.currentSkillGroupID + ) + .then((response) => { + if (response.status == 200) { + for (let i = 0; i < response.data.length; i++) { + this.lecturersID.push(response.data[i].userId); + } + } + }) + .catch((error) => { + console.error(error); + }); + // For each lecturer, get all advised students + for (let i = 0; i < this.lecturersID.length; i++) { + await axios + .get( + process.env.VUE_APP_API_ENDPOINT + + "/lecturer/" + + this.lecturersID[i] + ) + .then((response) => { + if (response.status == 200) { + for (let j = 0; j < response.data.advisedStudents.length; j++) { + let student = { + id: response.data.advisedStudents[j].id, + nim: response.data.advisedStudents[j].nim, + name: response.data.advisedStudents[j].fullName + }; + this.studentsData.push(student); + } + this.pageNumberTotal = Math.ceil( + this.studentsData.length / this.studentsPerPage + ); + this.updatePage(1); + } + }) + .catch((error) => { + console.error(error); + }); + } + for (let i = 0; i < this.studentsData.length; i++) { + this.studentsData[i].studyPlan = await this.getStudyPlan( + this.studentsData[i].id + ); + } + this.filteredStudentsData = this.studentsData; + this.updatePage(1); + }, + async getAdvisedStudents() { const lecturerId = localStorage.uid; await axios .get(process.env.VUE_APP_API_ENDPOINT + "/lecturer/" + lecturerId) @@ -405,24 +870,24 @@ export default { nim: response.data.advisedStudents[i].nim, name: response.data.advisedStudents[i].fullName }; - this.studentsData.push(student); + this.studentsDataAdvised.push(student); } this.pageNumberTotal = Math.ceil( - this.studentsData.length / this.studentsPerPage + this.studentsDataAdvised.length / this.studentsPerPage ); - this.updatePage(1); + this.updatePageAdvised(1); } }) .catch((error) => { console.error(error); }); - for (let i = 0; i < this.studentsData.length; i++) { - this.studentsData[i].studyPlan = await this.getStudyPlan( - this.studentsData[i].id + for (let i = 0; i < this.studentsDataAdvised.length; i++) { + this.studentsDataAdvised[i].studyPlan = await this.getStudyPlan( + this.studentsDataAdvised[i].id ); } - this.filteredStudentsData = this.studentsData; - this.updatePage(1); + this.filteredStudentsDataAdvised = this.studentsDataAdvised; + this.updatePageAdvised(1); }, async getStudyPlan(studentId) { let studyPlan = null; @@ -486,6 +951,10 @@ export default { }); } }, + // Update Study Plan + toggleStudyPlan() { + this.selectedStudentapproved = !this.selectedStudentapproved; + }, updateStudyPlan() { let newStatus = "APPROVED"; if (this.selectedStudentapproved) { @@ -516,6 +985,7 @@ export default { console.error(error); }); }, + // Table related methods updatePage(pageNumber) { this.showedStudentsData = this.studentsData; @@ -532,6 +1002,22 @@ export default { ); this.startIndex = minIndex; }, + updatePageAdvised(pageNumber) { + this.showedStudentsDataAdvised = this.studentsDataAdvised; + + let minIndex = pageNumber * this.studentsPerPage - this.studentsPerPage; + let maxIndex = pageNumber * this.studentsPerPage; + + if (maxIndex > this.showedStudentsDataAdvised.length) { + maxIndex = this.showedStudentsDataAdvised.length; + } + + this.showedStudentsDataAdvised = this.filteredStudentsDataAdvised.slice( + minIndex, + maxIndex + ); + this.startIndexAdvised = minIndex; + }, filterStudents(status) { this.filteredStudentsData = []; if (status === "all") { @@ -549,6 +1035,24 @@ export default { ); this.updatePage(1); this.page = 1; + }, + filterStudentsAdvised(status) { + this.filteredStudentsDataAdvised = []; + if (status === "all") { + this.filteredStudentsDataAdvised = this.studentsDataAdvised; + } else { + for (let i = 0; i < this.studentsDataAdvised.length; i++) { + if (this.studentsDataAdvised[i].studyPlan.status === status) { + this.filteredStudentsDataAdvised.push(this.studentsDataAdvised[i]); + } + } + } + this.showedStudentsDataAdvised = this.filteredStudentsDataAdvised; + this.pageNumberTotalAdvised = Math.ceil( + this.showedStudentsDataAdvised.length / this.studentsPerPage + ); + this.updatePageAdvised(1); + this.page = 1; } } };