diff --git a/frontend/src/views/LectureSchedule/CreateEditSchedule.scss b/frontend/src/views/LectureSchedule/CreateEditSchedule.scss index f3aaa40ad971eccf730980cee81c25fd5ae4df95..391ee80781412f1e30750006fc482274c6aed078 100644 --- a/frontend/src/views/LectureSchedule/CreateEditSchedule.scss +++ b/frontend/src/views/LectureSchedule/CreateEditSchedule.scss @@ -6,4 +6,19 @@ overflow-x: hidden; } } + + .form-select { + border: none; + display: block; + width: 100%; + padding: 10px 10px !important; + font-size: 16px; + background-color: #F1F5F8; + border-radius: 4px; + color: #000000; + background-clip: padding-box; + line-height: 19px; + appearance: none; + outline: none; + } } \ No newline at end of file diff --git a/frontend/src/views/LectureSchedule/CreateEditSchedule.vue b/frontend/src/views/LectureSchedule/CreateEditSchedule.vue index 31ddf60b61b8ec26f30ff3d5101d25b326aa35c2..b4e1946cf7b7b3d58c8b729d33721a8affdc6b32 100644 --- a/frontend/src/views/LectureSchedule/CreateEditSchedule.vue +++ b/frontend/src/views/LectureSchedule/CreateEditSchedule.vue @@ -1,16 +1,44 @@ <template> <div class="row m-0 bg-primary-six"> + <!-- Alert Create Edit Class Result --> + <div class="d-flex justify-content-center"> + <div + v-if="submitted" + class="alert border-0 rounded alert-dismissible fade show" + role="alert" + :class="{ + 'alert-success': isAlertSuccess, + 'alert-danger': isAlertDanger + }" + > + {{ alertText }} + <div type="button" class="btn-close" @click="submitted = false"></div> + </div> + </div> <div class="col-auto p-0"> <sidebar /> </div> <div class="col p-4 container-manage-schedule"> <!-- Container Header --> <div class="row"> - <div class="col-12"> + <div class="col-md-9"> <h1 data-aos="fade-down" data-aos-duration="1500" class="mb-4"> Pengelolaan Perkuliahan </h1> </div> + <div class="col-md-3"> + <div> + <button + type="button" + class="btn btn-primary-six col-12" + data-aos="fade-down" + data-aos-duration="1500" + @click="$router.push('/lecture-schedule')" + > + Kembali ke Jadwal Perkuliahan + </button> + </div> + </div> </div> <!-- Container List of Attendees & Manage Class --> <div class="row mt-2 container-lecturer-course-enrollment"> @@ -42,127 +70,27 @@ </tr> </thead> <tbody> - <tr> - <td>1</td> - <td>23520051</td> - <td>Dimas Aditia Pratikto</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" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> - </div> - </div> - </div> - </td> - </tr> - <tr> - <td>1</td> - <td>23520051</td> - <td>Dimas Aditia Pratikto</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" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> - </div> - </div> - </div> - </td> - </tr> - <tr> - <td>1</td> - <td>23520051</td> - <td>Dimas Aditia Pratikto</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" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> - </div> - </div> - </div> - </td> - </tr> - <tr> - <td>1</td> - <td>23520051</td> - <td>Dimas Aditia Pratikto</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" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> - </div> - </div> - </div> - </td> - </tr> - <tr> - <td>1</td> - <td>23520051</td> - <td>Dimas Aditia Pratikto</td> + <tr + v-for="(attendance, index) in attendances" + :key="attendance.id" + > + <td>{{ index + 1 }}</td> + <td>{{ attendance.Student.nim }}</td> + <td>{{ attendance.Student.fullName }}</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" - @click="updateStudyPlan" - /> - <label - class="custom-control-label" - for="customSwitch1" - > - </label> - </div> + <select + class="form-select" + aria-label="attendance" + v-model="attendance.status" + > + <option value="PRESENT">Hadir</option> + <option value="ABSENT">Tidak Hadir</option> + <option value="SICK">Sakit</option> + <option value="PERMITTED">Izin</option> + </select> </div> </div> </td> @@ -202,12 +130,19 @@ </div> <div class="row"> <!-- Start Time Picker --> - <div class="col-5"> + <div + class="col-5" + v-for="(classesStartTime, index) in classStartTime" + :key="classesStartTime.id" + > <vue-timepicker class="mt-2" placeholder="Pilih jam" - :modelValue="classStartTime" - @update:modelValue="updateClassStartTime" + v-model="classStartTime[index]" + :modelValue="classStartTime[index]" + @update:modelValue=" + updateClassStartTime(classStartTime[index]) + " close-on-complete input-width="100%" ></vue-timepicker> @@ -216,12 +151,19 @@ s/d </div> <!-- End Time Picker --> - <div class="col-5"> + <div + class="col-5" + v-for="(classesEndTime, index) in classEndTime" + :key="classesEndTime.id" + > <vue-timepicker class="mt-2" placeholder="Pilih jam" - :modelValue="classEndTime" - @update:modelValue="updateClassEndTime" + v-model="classEndTime[index]" + :modelValue="classEndTime[index]" + @update:modelValue=" + updateClassEndTime(classEndTime[index]) + " close-on-complete input-width="100%" ></vue-timepicker> @@ -235,12 +177,19 @@ <label><b>Buka Presensi</b></label> <div class="row"> <!-- Start Time Picker --> - <div class="col-5"> + <div + class="col-5" + v-for="(presencesStartTime, index) in presenceStartTime" + :key="presencesStartTime.id" + > <vue-timepicker class="mt-2" placeholder="Pilih jam" - :modelValue="presenceStartTime" - @update:modelValue="updatePresenceStartTime" + v-model="presenceStartTime[index]" + :modelValue="presenceStartTime[index]" + @update:modelValue=" + updatePresenceStartTime(presenceStartTime[index]) + " close-on-complete input-width="100%" ></vue-timepicker> @@ -249,12 +198,19 @@ s/d </div> <!-- End Time Picker --> - <div class="col-5"> + <div + class="col-5" + v-for="(presencesEndTime, index) in presenceEndTime" + :key="presencesEndTime.id" + > <vue-timepicker class="mt-2" placeholder="Pilih jam" - :modelValue="presenceEndTime" - @update:modelValue="updatePresenceEndTime" + v-model="presenceEndTime[index]" + :modelValue="presenceEndTime[index]" + @update:modelValue=" + updatePresenceEndTime(presenceEndTime[index]) + " close-on-complete input-width="100%" ></vue-timepicker> @@ -272,6 +228,7 @@ <input type="text" placeholder="Masukan link perkuliahan daring" + v-model="link" /> </div> </div> @@ -287,6 +244,7 @@ <input type="text" placeholder="Masukan topik perkuliahan" + v-model="topic" /> </div> </div> @@ -303,6 +261,7 @@ placeholder="Masukan catatan perkuliahan" spellcheck="false" rows="4" + v-model="notes" /> </div> </div> @@ -312,7 +271,11 @@ <div class="row mt-5"> <!-- Button Close --> <div class="form-group col-12"> - <button type="button" class="btn btn-primary-six col-12"> + <button + type="button" + class="btn btn-primary-six col-12" + @click="submit" + > Simpan </button> </div> @@ -331,59 +294,180 @@ import Sidebar from "@/components/Sidebar/Sidebar"; import Datepicker from "vue3-datepicker"; import VueTimepicker from "vue3-timepicker"; import "vue3-timepicker/dist/VueTimepicker.css"; +import axios from "axios"; export default { components: { Sidebar, Datepicker, VueTimepicker }, name: "CreateEditSchedule", data() { return { + courseClassMeetingId: null, date: null, - classStartTime: { - hour: null, - minute: null - }, - classEndTime: { - hour: null, - minute: null - }, - presenceStartTime: { - hour: null, - minute: null - }, - presenceEndTime: { - hour: null, - minute: null - } + classStartTime: [], + classEndTime: [], + presenceStartTime: [], + presenceEndTime: [], + link: null, + topic: null, + notes: null, + attendances: null, + submitted: false, + alertText: null, + isAlertSuccess: false, + isAlertDanger: false }; }, - mounted() { - console.log(this.date); - this.date = new Date(); + async mounted() { + this.courseClassMeetingId = this.$route.query.id; + await this.getCourseClassMeetingDetail(); }, methods: { updateClassStartTime(time) { - if (time.HH && time.mm) { - this.classStartTime.hour = time.HH; - this.classStartTime.minute = time.mm; - } + this.classStartTime[0].HH = time.HH; + this.classStartTime[0].mm = time.mm; }, updateClassEndTime(time) { - if (time.HH && time.mm) { - this.classEndTime.hour = time.HH; - this.classEndTime.minute = time.mm; - } + this.classEndTime[0].HH = time.HH; + this.classEndTime[0].mm = time.mm; }, updatePresenceStartTime(time) { - if (time.HH && time.mm) { - this.presenceStartTime.hour = time.HH; - this.presenceStartTime.minute = time.mm; - } + this.presenceStartTime[0].HH = time.HH; + this.presenceStartTime[0].mm = time.mm; }, updatePresenceEndTime(time) { if (time.HH && time.mm) { - this.presenceEndTime.hour = time.HH; - this.presenceEndTime.minute = time.mm; + this.presenceEndTime[0].HH = time.HH; + this.presenceEndTime[0].mm = time.mm; + } + }, + submit() { + let classStartTime = new Date( + this.date.getFullYear(), + this.date.getMonth(), + this.date.getDate(), + this.classStartTime[0].HH, + this.classStartTime[0].mm + ); + + let classEndTime = new Date( + this.date.getFullYear(), + this.date.getMonth(), + this.date.getDate(), + this.classEndTime[0].HH, + this.classEndTime[0].mm + ); + + let presenceStartTime = new Date( + this.date.getFullYear(), + this.date.getMonth(), + this.date.getDate(), + this.presenceStartTime[0].HH, + this.presenceStartTime[0].mm + ); + + let presenceEndTime = new Date( + this.date.getFullYear(), + this.date.getMonth(), + this.date.getDate(), + this.presenceEndTime[0].HH, + this.presenceEndTime[0].mm + ); + + let attendances = []; + + for (let i = 0; i < this.attendances.length; i++) { + attendances.push({ + studentId: this.attendances[i].Student.id, + status: this.attendances[i].status + }); + } + + const requestBody = { + link: this.link, + topic: this.topic, + notes: this.notes, + startClass: classStartTime, + endClass: classEndTime, + startAttendance: presenceStartTime, + endAttendance: presenceEndTime, + attendances: attendances + }; + + axios + .put( + process.env.VUE_APP_API_ENDPOINT + + "/course-class-meeting/" + + this.courseClassMeetingId, + requestBody + ) + .then(() => { + this.showAlert(1); + }) + .catch((error) => { + console.error(error); + this.showAlert(0); + }); + }, + async getCourseClassMeetingDetail() { + function convertTime(time) { + return time > 9 ? "" + time : "0" + time; + } + + await axios + .get( + process.env.VUE_APP_API_ENDPOINT + + "/course-class-meeting/?courseClassMeetingId=" + + this.courseClassMeetingId + + "&shouldIncludeAttendances=true" + ) + .then((response) => { + let classStartTime = new Date(response.data.startTime); + let classEndTime = new Date(response.data.endTime); + let presenceStartTime = new Date(response.data.openAttendanceTime); + let presenceEndTime = new Date(response.data.closeAttendanceTime); + + this.date = classEndTime; + + this.classStartTime.push({ + HH: convertTime(classStartTime.getHours()), + mm: convertTime(classStartTime.getMinutes()) + }); + + this.classEndTime.push({ + HH: convertTime(classEndTime.getHours()), + mm: convertTime(classEndTime.getMinutes()) + }); + + this.presenceStartTime.push({ + HH: convertTime(presenceStartTime.getHours()), + mm: convertTime(presenceStartTime.getMinutes()) + }); + + this.presenceEndTime.push({ + HH: convertTime(presenceEndTime.getHours()), + mm: convertTime(presenceEndTime.getMinutes()) + }); + + this.link = response.data.link; + this.topic = response.data.topic; + this.notes = response.data.notes; + this.attendances = response.data.courseClassMeetingAttendances; + }) + .catch((error) => { + console.error(error); + }); + }, + showAlert(alertType) { + this.isAlertSuccess = false; + this.isAlertDanger = false; + if (alertType === 0) { + this.isAlertDanger = true; + this.alertText = "Edit Kelas Perkuliahan Gagal"; + } else { + this.alertText = "Edit Kelas Perkuliahan Berhasil"; + this.isAlertSuccess = true; } + this.submitted = true; } } };