import React, { Component } from "react"; import ContentWrapper from "@/components/Layout/ContentWrapper"; import { Card, CardBody, CardHeader, CardTitle, Button, Row, Col, FormGroup, Input } from "reactstrap"; import { getPelaporan, getOneLaporan, updateLaporan } from "@/actions/pelaporan"; import { updateJadwal } from "@/actions/penjadwalan"; import DetailLaporan from "@/components/Penjadwalan/DetailLaporan"; import Link from "next/link"; import FullCalendar from "@fullcalendar/react"; import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin, { Draggable } from "@fullcalendar/interaction"; import listPlugin from "@fullcalendar/list"; import bootstrapPlugin from "@fullcalendar/bootstrap"; import Select from "react-select"; import moment from "moment-timezone"; import { connect } from "react-redux"; import Loader from "@/components/Common/Loader"; import Router from "next/router"; import { ToastContainer, toast } from "react-toastify"; import { Formik, Form, Field, ErrorMessage } from "formik"; import * as Yup from "yup"; import Datetime from "react-datetime"; import 'moment/locale/id'; import { getCsrf } from "../../actions/security"; import { createLog } from "../../actions/log"; moment.locale('id') import Swal from "sweetalert2"; const status = [ { value: "Ditindaklanjuti DIKTI", label: "Ditindaklanjuti DIKTI", className: "State-ACT" }, { value: "Delegasi ke LLDIKTI", label: "Delegasi ke LLDIKTI", className: "State-ACT" }, { value: "Ditutup", label: "Ditutup", className: "State-ACT" }, ]; const statusLLDIKTI = [ { value: "Ditindaklanjuti LLDIKTI", label: "Ditindaklanjuti LLDIKTI", className: "State-ACT" }, { value: "Delegasi ke DIKTI", label: "Delegasi ke DIKTI", className: "State-ACT" }, { value: "Ditutup", label: "Ditutup", className: "State-ACT" }, ]; const jadwalSchema = Yup.object().shape({ judul: Yup.string().required("Wajib diisi"), dari_tanggal: Yup.date().required("Wajib diisi"), sampai_tanggal: Yup.date().required("Wajib diisi"), }); const laporanSchema = Yup.object().shape({ keterangan: Yup.string().required("Harus diisi"), }); class Calendar extends Component { calendarPlugins = [interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, bootstrapPlugin]; calendarHeader = { left: "prev,next today", center: "title", right: "dayGridMonth,timeGridWeek,timeGridDay", }; constructor(props) { super(props); this.state = { selectedEvent: null, evRemoveOnDrop: true, evNewName: "", externalEvents: [], dataLaporan: [], dataEvent: [], laporan: {}, selectedOption: null, color: "", disabled: true, }; } static getInitialProps = ({ query }) => ({ query }); async componentDidMount() { const { token, query } = this.props; const laporan = await getOneLaporan(token, query.id); const dataLaporan = await getPelaporan(token, { jadwal: true }); this.setState({ dataLaporan }); this.getDataEvent(); this.defaultStatus(); this.setState({ laporan }); let color = "#" + Math.random().toString(16).slice(2, 8); if (laporan.data.jadwal) { color = laporan.data.jadwal.warna; } this.setState({ color }); } componentShouldUpdate(nextProps, nextState) { return nextState.dataLaporan !== this.state.dataLaporan; } getStatus = () => (this.props.user?.role.id === 2021 ? statusLLDIKTI : status); getDataEvent = () => { const dataEvent = this.state.dataLaporan.data.map((e) => ({ id: e._id, title: e.jadwal.judul, start: moment(e.jadwal.dari_tanggal).format("YYYY-MM-DD"), end: moment(e.jadwal.sampai_tanggal).add(1, "d").format("YYYY-MM-DD"), backgroundColor: e.jadwal.warna, borderColor: e.jadwal.warna, })); this.setState({ dataEvent }); }; eventClick = (info) => { const data = { title: info.event.title, start: moment(info.event.start).format("DD MMMM YYYY"), end: moment(info.event.end - 1).format("DD MMMM YYYY"), }; this.setState({ selectedEvent: data }); }; handleEventReceive = (info) => { var styles = getComputedStyle(info.draggedEl); info.event.setProp("backgroundColor", styles.backgroundColor); info.event.setProp("borderColor", styles.borderColor); this.handleEventCalendar(info); }; logSuccessUpdateJadwal = async () => { const { query, token } = this.props; const { id } = query; const getToken = await getCsrf(); const _csrf = getToken.token; await createLog(token, { aktivitas: `Berhasil menetapkan jadwal, id: ${id}`, _csrf: _csrf }); } handleEventCalendar = async (data) => { if (this.props.user.role.id === 2024) { Swal.fire({ icon: 'error', title: 'Oops...', html: 'Maaf anda tidak memiliki akses untuk menyelesaikan

proses ini.

', confirmButtonColor: "#3e3a8e", confirmButtonText: 'Oke' }) } else { const { query, token } = this.props; const { id } = query; const { color, laporan } = this.state; const getToken = await getCsrf(); const _csrf = getToken.token; await toast.promise( updateJadwal(token, id, { judul: "No.Laporan " + laporan.data.no_laporan + " - " + data.judul, dari_tanggal: data.dari_tanggal, sampai_tanggal: data.sampai_tanggal, warna: color, }, _csrf), { pending: "Loading", success: "Success", error: "Error", } ); Router.push("/app/penjadwalan"); const dataLaporan = await getPelaporan(token, { jadwal: true }); this.setState({ dataLaporan }); this.getDataEvent(); } }; defaultStatus = async () => { const status = this.getStatus(); return this.setState({ selectedOption: status[0] }); }; handleChangeSelect = (selectedOption) => this.setState({ selectedOption }); logUpdateLaporanSuccess = async () => { const getToken = await getCsrf(); const _csrf = getToken.token; const { token, query } = this.props; const { id } = query; await createLog(token, { aktivitas: `Berhasil mengubah data laporan, id: ${id}`, _csrf: _csrf }); } logUpdateLaporanError = async () => { const getToken = await getCsrf(); const _csrf = getToken.token; const { token, query } = this.props; const { id } = query; await createLog(token, { aktivitas: `Berhasil mengubah data laporan, id: ${id}`, _csrf: _csrf }); } handleSimpan = async (value) => { if (this.props.user.role.id === 2024) { Swal.fire({ icon: 'error', title: 'Oops...', html: 'Maaf anda tidak memiliki akses untuk menyelesaikan

proses ini.

', confirmButtonColor: "#3e3a8e", confirmButtonText: 'Oke' }) } else { const getToken = await getCsrf(); const _csrf = getToken.token; const { token, query } = this.props; const { id } = query; let update = null; if (value.status.value === this.getStatus()[1].value || value.status.value === this.getStatus()[2].value) { const toastid = toast.loading("Please wait..."); const data = { keterangan: value.keterangan }; if (value.status.value === this.getStatus()[1].value) { data.change_role = "true"; update = await updateLaporan(token, id, data, _csrf); Router.push("/app/penjadwalan"); } else if (value.status.value === this.getStatus()[2].value) { data.aktif = "false"; update = await updateLaporan(token, id, data, _csrf); Router.push("/app/penjadwalan"); } if (!update) { toast.update(toastid, { render: "Gagal simpan jadwal", type: "error", isLoading: false, autoClose: true, closeButton: true }); this.logUpdateLaporanError() } else { toast.update(toastid, { render: "Input jadwal berhasil", type: "success", isLoading: false, autoClose: true, closeButton: true }); this.logUpdateLaporanSuccess() Router.push("/app/penjadwalan"); } Router.push("/app/penjadwalan"); } Router.push("/app/penjadwalan"); } }; render() { const { externalEvents, laporan, selectedOption, selectedEvent } = this.state; return (
Membuat Jadwal Pemeriksaan
{laporan.data ? ( ) : ( )}

Status Pelaporan

{({ isSubmitting }) => (
{({ field, form }) => ( } )}
)}
{selectedOption?.value === this.getStatus()[2].value || selectedOption?.value === this.getStatus()[1].value ? ( "" ) : ( <>

Input Jadwal

{({ isSubmitting }) => (
{this.state.color}
{/*
*/}
{({ field, form }) => } {({ field, form }) => ( { form.setFieldValue(field.name, e); }} /> )} {({ field, form }) => ( { form.setFieldValue(field.name, e); }} /> )}
)}
)}
{selectedEvent && (

Selected:

{JSON.stringify(selectedEvent)}
)} {!selectedEvent && (

Click calendar to show information

)}
{/* START calendar */}
); } } const mapStateToProps = (state) => ({ user: state.user, token: state.token }); export default connect(mapStateToProps)(Calendar);