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 checkIfFilesAreTooBig = (files) => { let valid = true; if (files) { files.map((file) => { if (file.size > 15 * 1024 * 1024) { valid = false; } }); } return valid; }; 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"), dokumen: Yup.array().min(1).test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig), }); const ditutupSchema = Yup.object().shape({ keterangan: Yup.string().required("Harus diisi"), dokumen: Yup.array().min(1).required("Wajib diisi").test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig), }); let Dropzone = null; class DropzoneWrapper extends Component { state = { isClient: false, }; componentDidMount = () => { Dropzone = require("react-dropzone").default; this.setState({ isClient: true }); }; render() { return Dropzone ? {this.props.children} : null; } } 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, files: [], }; } onDrop = (selectedFile) => { this.setState({ selectedFile: selectedFile.map((file) => Object.assign(file, { preview: URL.createObjectURL(file), }) ), stat: "Added " + selectedFile.length + " file(s)", }); const selectFile = this.state.selectedFile this.setState(prevState => ({ files: [...prevState.files, ...selectFile] })) }; uploadFiles = (e) => { e.preventDefault(); e.stopPropagation(); this.setState({ stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.", }); }; clearFiles = (e) => { e.preventDefault(); e.stopPropagation(); this.setState({ stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.", }); this.setState({ files: [], }); }; 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}`,menu: "Penjadwalan", _csrf: _csrf }); } handleEventCalendar = async (data) => { if (this.props.user.role.id === 2071) { 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 }); 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, menu: "Penjadwalan" }); } logdelegasi = async () => { const getToken = await getCsrf(); const _csrf = getToken.token; const { token, query } = this.props; const { id } = query; await createLog(token, { aktivitas: `Berhasil Delegasi Laporan, id: ${id}`, _csrf: _csrf , menu :"Penjadwalan"}); } logDitutup = async () => { const getToken = await getCsrf(); const _csrf = getToken.token; const { token, query } = this.props; const { id } = query; await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${id}`, _csrf: _csrf, menu: "Penjadwalan" }); } handleSimpan = async (value) => { if (this.props.user.role.id === 2071) { 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 }; const formdata = new FormData(); formdata.append("keterangan", value.keterangan); this.state.files.forEach((e) => { formdata.append("dokumen", e); }); formdata.append("aktif", "false"); if (value.status.value === this.getStatus()[1].value) { data.change_role = "true"; update = await updateLaporan(token, id, data, _csrf); await this.logdelegasi() Router.push("/app/penjadwalan"); } else if (value.status.value === this.getStatus()[2].value) { update = await updateLaporan(token, id, formdata, _csrf + `&redudansi=true`); await this.logDitutup() Router.push("/app/penjadwalan"); } if (!update) { toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true }); this.logUpdateLaporanError() } else { toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true }); this.logUpdateLaporanSuccess() Router.push("/app/penjadwalan"); } Router.push("/app/penjadwalan"); } Router.push("/app/penjadwalan"); } }; render() { const { files, externalEvents, laporan, selectedOption, selectedEvent } = this.state; const removeFile = file => () => { const newFiles = [...files] newFiles.splice(newFiles.indexOf(file), 1) this.setState({ files: newFiles, }); } const thumbs = files.map((file, index) => (

  {file.name}

{laporan.data ? ( ) : ( )}

Status Pelaporan

{({ isSubmitting }) => (
{({ field, form }) => ( } ) : (
{({ field, form }) => }
{({ field, form, meta }) => ( { this.onDrop(e); form.setFieldValue(field.name, e); }} > {({ getRootProps, getInputProps, isDragActive }) => { return (
{this.state.files.length > 0 ?
Klik untuk tambah file
:
Klik untuk upload dokumen
}
); }}
)}
{thumbs}

Ukuran setiap dokumen maksimal 15mb

) )}
)}
{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);