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, addStatus, removeLaporan, activeLaporan, changeRoleData } from "@/actions/pelaporan"; import { updateJadwal } from "@/actions/penjadwalan"; import DetailLaporan from "@/components/Main/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 events from "./calendar.events"; import Select from "react-select"; import moment from "moment"; 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"; 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("Required"), dari_tanggal: Yup.date().required("Required"), sampai_tanggal: Yup.date().required("Required"), }); 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, }; } static getInitialProps = ({ query }) => ({ query }); async componentDidMount() { const { token, query } = this.props; const dataLaporan = await getPelaporan(token, { jadwal: true }); const laporan = await getOneLaporan(token, query.id); this.setState({ dataLaporan }); this.getDataEvent(); this.defaultStatus(); this.setState({ laporan }); let color = "#" + Math.floor(Math.random() * 16777215).toString(16); if (laporan.data.jadwal) { color = laporan.data.jadwal.warna; } this.setState({ externalEvents: [{ id: query.id, color, name: `Jadwal Pemeriksaan - No.Laporan : ${laporan.data.no_laporan} - ${laporan.data.pt.nama}`, allDay: true }] }); } 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: new Date(e.jadwal.dari_tanggal), end: new Date(e.jadwal.sampai_tanggal), 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); }; handleEventCalendar = async (data) => { const { token, query } = this.props; const { id } = query; const { laporan } = this.state; const warna = "#" + Math.floor(Math.random() * 16777215).toString(16); const d = { judul: data.judul, dari_tanggal: data.dari_tanggal, sampai_tanggal: data.sampai_tanggal, warna, }; if (laporan.data.jadwal) { d.warna = laporan.data.jadwal.warna; } await toast.promise(updateJadwal(token, id, d), { pending: "Loading", success: "Success", error: "Error", }); // this.state.dataEvent.push({ // title: data.judul, // start: new Date(data.dari_tanggal), // end: new Date(data.sampai_tanggal), // backgroundColor: warna, // borderColor: warna, // }); }; defaultStatus = async () => { const status = this.getStatus(); return this.setState({ selectedOption: status[0] }); }; handleChangeSelect = (selectedOption) => this.setState({ selectedOption }); handleSimpan = async (e) => { const { selectedOption } = this.state; const { ptId, number } = this.props.query; this.setState({ selectedOption }); const id = toast.loading("Please wait..."); if (selectedOption.value === this.getStatus()[1].value) { const roleId = this.props.user.peran[0].peran.id; await changeRoleData({ number, ptId }, { role_data: roleId === 2021 ? "dikti" : "lldikti" }); const statusData = roleId === 2021 ? status : statusLLDIKTI; await addStatus({ number, ptId }, { status: statusData[0].value }); toast.update(id, { render: "All is good", type: "success", isLoading: false }); Router.push("/app/penjadwalan"); return; } if (selectedOption.value === this.getStatus()[2].value) { await removeLaporan({ number, ptId }); } else if (!this.state.laporan.data[0].active) { await activeLaporan({ number, ptId }); } await addStatus({ number, ptId }, { status: selectedOption.value }); toast.update(id, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true }); }; render() { const { externalEvents, laporan, selectedOption, selectedEvent } = this.state; console.log(this.state.dataLaporan); return (
Jadwal Pemeriksaan
{laporan.data ? ( ) : ( )}
Status Pelaporan } {({ 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);