andi před 2 roky
rodič
revize
e0f8fe9de9

+ 164 - 13
components/Extras/calendar.view.js

@@ -26,7 +26,17 @@ 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" },
@@ -47,7 +57,27 @@ const jadwalSchema = Yup.object().shape({
 
 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 ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
+	}
+}
+
 
 class Calendar extends Component {
 	calendarPlugins = [interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, bootstrapPlugin];
@@ -71,9 +101,44 @@ class Calendar extends Component {
 			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() {
@@ -136,7 +201,7 @@ class Calendar extends Component {
 	}
 
 	handleEventCalendar = async (data) => {
-		if (this.props?.user?.role.id === 2024) {
+		if (this.props.user.role.id === 2024) {
 			Swal.fire({
 				icon: 'error',
 				title: 'Oops...',
@@ -197,7 +262,7 @@ class Calendar extends Component {
 	}
 
 	handleSimpan = async (value) => {
-		if (this.props?.user?.role.id === 2024) {
+		if (this.props.user.role.id === 2024) {
 			Swal.fire({
 				icon: 'error',
 				title: 'Oops...',
@@ -214,13 +279,19 @@ class Calendar extends Component {
 			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);
 					Router.push("/app/penjadwalan");
 				} else if (value.status.value === this.getStatus()[2].value) {
-					data.aktif = "false";
-					update = await updateLaporan(token, id, data, _csrf);
+
+					update = await updateLaporan(token, id, formdata, _csrf + `&redudansi=true`);
 					Router.push("/app/penjadwalan");
 				}
 				if (!update) {
@@ -240,7 +311,20 @@ class Calendar extends Component {
 	};
 
 	render() {
-		const { externalEvents, laporan, selectedOption, selectedEvent } = this.state;
+		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) => (
+			<p>
+				<em className="far fa-file" />&nbsp;&nbsp;{file.name}
+				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
+			</p>
+		));
 		return (
 			<ContentWrapper>
 				<div className="content-heading">
@@ -263,7 +347,7 @@ class Calendar extends Component {
 							<Col>
 								<Card className="card-default">
 									<CardBody>
-										<DetailLaporan noStatus data={laporan.data} role={this.props.user.role.id}/>
+										<DetailLaporan noStatus data={laporan.data} role={this.props.user.role.id} />
 									</CardBody>
 								</Card>
 							</Col>
@@ -316,11 +400,78 @@ class Calendar extends Component {
 														{selectedOption?.value === this.getStatus()[0].value ? (
 															""
 														) : (
-															<FormGroup>
-																<label className="col-form-label">Keterangan<span className=" text-danger">*</span></label>
-																<Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
-																<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
-															</FormGroup>
+															selectedOption?.value === this.getStatus()[1].value ? (
+																<FormGroup>
+																	<label className="col-form-label">Keterangan<span className=" text-danger">*</span></label>
+																	<Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
+																	<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
+																</FormGroup>
+															) : (
+																<div>
+																	<FormGroup >
+																		<label className="col-form-label">Keterangan<span className=" text-danger">*</span></label>
+																		<Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
+																		<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
+																	</FormGroup>
+																	<FormGroup >
+																		<label className=" col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+																		<div >
+																			<Field name="dokumen">
+																				{({ field, form, meta }) => (
+																					<DropzoneWrapper
+																						className=""
+																						onDrop={(e) => {
+																							this.onDrop(e);
+																							form.setFieldValue(field.name, e);
+																						}}
+																					>
+																						{({ getRootProps, getInputProps, isDragActive }) => {
+																							return (
+																								<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+																									<input name="dokumen" {...getInputProps()} />
+																									<div className="dropzone-style-1">
+																										<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+																											<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																												<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+																											</div> :
+																											<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																												<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
+																											</div>
+																										}
+																										</div>
+																									</div>
+																									<div className="d-flex align-items-center">
+																										<small className="ml-auto">
+																											<button
+																												type="button"
+																												className="btn btn-link"
+																												onClick={(e) => {
+																													this.clearFiles(e);
+																													form.setFieldValue(field.name, []);
+																												}}
+																											>
+																												Reset dokumen
+																											</button>
+																										</small>
+																									</div>
+																								</div>
+																							);
+																						}}
+																					</DropzoneWrapper>
+																				)}
+																			</Field>
+																			{thumbs}
+																			<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
+																			<p className="mrgn-top-5 font-color-black">
+																				Ukuran setiap dokumen maksimal 15mb
+																			</p>
+																		</div>
+																	</FormGroup>
+																</div>
+
+															)
+
+
 														)}
 														<div className="btn-simpanjadwal">
 															<Button className="text-btn-penjadwalan-1 btn-colorpenjadwalan color-3e3a8e" color block disabled={laporan.data?.sanksi || isSubmitting} >
@@ -459,7 +610,7 @@ class Calendar extends Component {
 						</div>
 					</div>
 				</div>
-			</ContentWrapper>
+			</ContentWrapper >
 		);
 	}
 }

+ 3 - 1
components/Layout/Header.js

@@ -63,7 +63,9 @@ class Header extends Component {
 		await logout(_csrf);
 		this.props.tokenNull();
 		this.props.userNull();
-		location.href = '/app'
+
+		location.href='/app'
+	
 	};
 
 	resize() {

+ 6 - 0
components/Layout/Menu.js

@@ -132,6 +132,12 @@ const Menu = [
 		icon: "icon-film",
 		translate: "sidebar.nav.Riwayat",
 	},
+	{
+		name: "Dashboard",
+		path: "/app/dashboard",
+		icon: "icon-film",
+		translate: "sidebar.nav.Dashboard",
+	},
 	{
 		name: "Pelaporan Tuntas",
 		path: "/app/tuntas",

+ 6 - 0
components/Layout/MenuBypass.js

@@ -132,6 +132,12 @@ const MenuBypass = [
 		icon: "icon-film",
 		translate: "sidebar.nav.Riwayat",
 	},
+	{
+		name: "Dashboard",
+		path: "/app/dashboard",
+		icon: "icon-film",
+		translate: "sidebar.nav.Dashboard",
+	},
 	{
 		name: "Pelaporan Tuntas",
 		path: "/app/tuntas",

+ 0 - 25
components/Layout/MenuPT.js

@@ -15,31 +15,6 @@ const MenuPT = [
 		icon: "icon-social-steam",
 		translate: "sidebar.nav.PT_PEMANTAUAN",
 	},
-	// {
-	// 	name: "Pengajuan Keberatan",
-	// 	icon: "icon-hourglass",
-	// 	translate: "sidebar.nav.PENGAJUAN_KEBERATAN",
-	// 	submenu: [
-	// 		{
-	// 			name: "a. Permohonan Keberatan",
-	// 			path: "/pt/keberatan",
-	// 		},
-	// 		{
-	// 			name: "b. Jawaban keberatan",
-	// 			path: "/pt/jawaban-keberatan",
-	// 		},
-	// 		{
-	// 			name: "c. Jawaban banding",
-	// 			path: "/pt/jawaban-banding",
-	// 		},
-	// 	],
-	// },
-	// {
-	// 	name: "Dokumen Perbaikan",
-	// 	path: "/pt/dokumen-perbaikan",
-	// 	icon: "icon-graph",
-	// 	translate: "sidebar.nav.PT_DOKUMEN_PERBAIKAN",
-	// },
 	{
 		name: "Pencabutan Sanksi",
 		icon: "icon-shield",

+ 3 - 3
components/Layout/MenuReadOnly.js

@@ -110,10 +110,10 @@ const MenuReadOnly = [
 		translate: "sidebar.heading.ANALYTICS_REPORT",
 	},
 	{
-		name: "Riwayat",
-		path: "/app/riwayat",
+		name: "Dashboard",
+		path: "/app/dashboard",
 		icon: "icon-film",
-		translate: "sidebar.nav.Riwayat",
+		translate: "sidebar.nav.Dashboard",
 	},
 	{
 		name: "Pelaporan Tuntas",

+ 54 - 0
components/PelaporanTuntas/DetailLaporan.js

@@ -166,6 +166,60 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 						</Scrollable>
 					</Col>
 				</FormGroup>
+
+			</form>
+			<form className="form-horizontal">
+				{noTitle ? (
+					""
+				) : (
+					<div className="header-1">
+						<h2 className="card-title-1">Status Laporan</h2>
+					</div>
+				)}
+				<FormGroup row>
+					<Col md="4">Status:</Col>
+					<Col md="8">
+						<strong>Ditutup</strong>
+					</Col>
+				</FormGroup>
+				{data.tuntas.keterangan && (
+					<FormGroup row>
+						<Col md="4">Keterangan Penutupan Laporan:</Col>
+						<Col md="8">
+							<strong>{data.tuntas.keterangan}</strong>
+						</Col>
+					</FormGroup>
+				)}
+				{data.tuntas.dokumen.length ? (
+					<FormGroup row>
+						<Col md="4">Dokumen Penutupan Laporan:</Col>
+						<Col md="8">
+							<Scrollable height="120px" className="list-group">
+								<table className="table table-bordered bg-transparent">
+									<tbody>
+										{data.tuntas.dokumen.map((e, index) => (
+											<tr key={`files-${index}`}>
+												<td style={{ width: "30px" }}>
+													<em className="fa-lg far fa-file-code"></em>
+												</td>
+												<td>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
+												</td>
+											</tr>
+										))}
+									</tbody>
+								</table>
+							</Scrollable>
+						</Col>
+					</FormGroup>) : ""}
 			</form>
 		</>
 	);

+ 278 - 104
components/Pemeriksaan/InputEvaluasi.js

@@ -3,7 +3,7 @@ import { insertPemeriksaan } from "@/actions/pemeriksaan";
 import Router from "next/router";
 import Datetime from "react-datetime";
 import moment from "moment";
-import { Row, Col, FormGroup, Input, Button, Progress } from "reactstrap";
+import { Row, Col, FormGroup, Input, Button, Progress, Card } from "reactstrap";
 import { ToastContainer, toast } from "react-toastify";
 import { Formik, Form, Field, ErrorMessage } from "formik";
 import * as Yup from "yup";
@@ -11,6 +11,8 @@ import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
 import { connect } from "react-redux";
 import { getCsrf } from "../../actions/security";
 import Swal from "sweetalert2";
+import Select from "react-select";
+
 
 
 const selectInstanceId = 1;
@@ -44,6 +46,10 @@ const evaluasiSchema = Yup.object().shape({
 	dokumen: Yup.array().min(1).required("Wajib diisi").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 {
@@ -59,6 +65,11 @@ class DropzoneWrapper extends Component {
 	}
 }
 
+const status = [
+	{ value: "Evaluasi", label: "Evaluasi", className: "State-ACT" },
+	{ value: "Ditutup", label: "Ditutup", className: "State-ACT" },
+];
+
 
 class InputEvaluasi extends Component {
 	constructor(props) {
@@ -72,9 +83,23 @@ class InputEvaluasi extends Component {
 			delegasichecklist: false,
 			rolelldikti: false,
 			selectedFile: {},
+			selectedOption: null,
 		};
 	}
 
+	async componentDidMount() {
+
+		this.defaultStatus();
+
+	}
+	defaultStatus = async () => {
+		return this.setState({ selectedOption: status[0] });
+	};
+
+	handleChangeSelect = (selectedOption) => this.setState({ selectedOption });
+
+	getStatus = () => (status);
+
 	setjudulEvaluasi = (e) => {
 		this.setState({ judulEvaluasi: e.target.value });
 	};
@@ -105,15 +130,6 @@ class InputEvaluasi extends Component {
 			stat: "Added " + selectedFile.length + " file(s)",
 		});
 		const selectFile = this.state.selectedFile
-		// this.state.files.push(...this.state.selectedFile)
-		// this.setState({
-		// 	files: files.map((file) =>
-		// 		Object.assign(file, {
-		// 			preview: URL.createObjectURL(file),
-		// 		})
-		// 	),
-		// 	stat: "Added " + files.length + " file(s)",
-		// });
 		this.setState(prevState => ({
 			files: [...prevState.files, ...selectFile]
 		}))
@@ -193,11 +209,47 @@ class InputEvaluasi extends Component {
 	handlechecklist = () => {
 		this.setState({ delegasichecklist: !this.state.delegasichecklist })
 	};
-	// getStatus = () => (this.props.user?.role.id == 2021 ? this.setState({ rolelldikti: !this.state.rolelldikti }) : "")
+
+	handleTutupLaporan = async (data, value) => {
+		if (this.props?.user?.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+			})
+		} else {
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { token, query } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			formdata.append("keterangan", data.keterangan);
+			this.state.files.forEach((e) => {
+				formdata.append("dokumen", e);
+			});
+			formdata.append("aktif", "false");
+			// formdata.append("_csrf", _csrf)
+			await toast.promise(updateLaporan(token, id, formdata, _csrf + `&redudansi=true`), {
+				pending: "Loading",
+				success: {
+					render: "success",
+					autoClose: 1000
+				},
+				error: "Error",
+
+			});
+			await Router.push({
+				pathname: "/app/pemeriksaan",
+			});
+		}
+
+	};
 
 
 	render() {
-		const { files } = this.state;
+		const { files, selectedOption } = this.state;
 		const removeFile = file => () => {
 			const newFiles = [...files]
 			newFiles.splice(newFiles.indexOf(file), 1)
@@ -213,123 +265,245 @@ class InputEvaluasi extends Component {
 		));
 		return (
 			<>
-				<p className="lead bb">Evaluasi</p>
 				<Formik
+					enableReinitialize={true}
 					initialValues={{
-						tanggal: new Date(),
-						judul: "",
+						status: this.getStatus()[0],
+						keterangan: "",
 						dokumen: [],
 					}}
-					validationSchema={evaluasiSchema}
-					onSubmit={this.onSubmit}
+					validationSchema={selectedOption?.value === this.getStatus()[1].value ? ditutupSchema : null}
+					onSubmit={this.handleTutupLaporan}
 				>
 					{({ isSubmitting }) => (
-						<Form className="form-horizontal">
+						<Form>
 							<FormGroup row>
-								<label className="col-md-2 col-form-label">Tanggal Evaluasi</label>
+								<label className="col-md-2 col-form-label font-weight-bold font-color-black">Status Laporan</label>
 								<div className="col-md-10">
-									<Field name="tanggal">
+									<Field name="status">
 										{({ field, form }) => (
-											<Datetime
-												timeFormat={false}
-												inputProps={{ className: "form-control" }}
+											<Select
 												value={field.value}
 												onChange={(e) => {
 													form.setFieldValue(field.name, e);
+													this.handleChangeSelect(e);
 												}}
+												options={this.getStatus()}
+												required
 											/>
 										)}
 									</Field>
-									<ErrorMessage name="tanggal" component="div" className="form-text text-danger" />
-								</div>
-							</FormGroup>
-							<FormGroup row>
-								<label className="col-md-2 col-form-label">Judul Dokumen</label>
-								<div className="col-md-10">
-									<Field name="judul">{({ field, form }) => <Input type="text" placeholder="judul" {...field} />}</Field>
-									<ErrorMessage name="judul" component="div" className="form-text text-danger" />
+									<ErrorMessage name="status" component="div" className="form-text text-danger" />
 								</div>
+
 							</FormGroup>
-							<FormGroup row>
-								<label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
-								<div className="col-md-10">
-									<Field name="dokumen">
-										{({ field, form, meta }) => (
-											<DropzoneWrapper
-												className=""
-												onDrop={(e) => {
-													this.onDrop(e);
-													form.setFieldValue(field.name, e);
-												}}
-											>
-												{({ getRootProps, getInputProps, isDragActive }) => {
-													return (
-														<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
-															<input name="dokumen" {...getInputProps()} />
-															<div className="dropzone-style-1">
-																<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
-																	<div className="text-center fa-2x icon-cloud-upload mr-2 ">
-																		<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
-																	</div> :
-																	<div className="text-center fa-2x icon-cloud-upload mr-2 ">
-																		<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
+							{selectedOption?.value === this.getStatus()[0].value ? (
+								""
+							) : (
+								<div>
+									<FormGroup row>
+										<label className="col-md-2 col-form-label">Keterangan<span className=" text-danger">*</span></label>
+										<div className="col-md-10">
+											<Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
+											<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
+										</div>
+
+									</FormGroup>
+									<FormGroup row>
+										<label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+										<div className="col-md-10">
+											<Field name="dokumen">
+												{({ field, form, meta }) => (
+													<DropzoneWrapper
+														className=""
+														onDrop={(e) => {
+															this.onDrop(e);
+															form.setFieldValue(field.name, e);
+														}}
+													>
+														{({ getRootProps, getInputProps, isDragActive }) => {
+															return (
+																<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+																	<input name="dokumen" {...getInputProps()} />
+																	<div className="dropzone-style-1">
+																		<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+																			<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																				<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+																			</div> :
+																			<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																				<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
+																			</div>
+																		}
+																		</div>
+																	</div>
+																	<div className="d-flex align-items-center">
+																		<small className="ml-auto">
+																			<button
+																				type="button"
+																				className="btn btn-link"
+																				onClick={(e) => {
+																					this.clearFiles(e);
+																					form.setFieldValue(field.name, []);
+																				}}
+																			>
+																				Reset dokumen
+																			</button>
+																		</small>
 																	</div>
-																}
 																</div>
-															</div>
-															<div className="d-flex align-items-center">
-																<small className="ml-auto">
-																	<button
-																		type="button"
-																		className="btn btn-link"
-																		onClick={(e) => {
-																			this.clearFiles(e);
-																			form.setFieldValue(field.name, []);
-																		}}
-																	>
-																		Reset dokumen
-																	</button>
-																</small>
-															</div>
-														</div>
-													);
-												}}
-											</DropzoneWrapper>
-										)}
-									</Field>
-									{thumbs}
-									<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
-									<p className="mrgn-top-5 font-color-black">
-										Ukuran setiap dokumen maksimal 15mb
-									</p>
-								</div>
-							</FormGroup>
-							{this.props.user?.role.id === 2021 ? (
-								<FormGroup row>
-									<label className="col-md-2 col-form-label">Delegasi ke dikti</label>
-									<div className="col-md-10 mt-2">
-										<div className="checkbox c-checkbox">
-											<label>
-												<Input type="checkbox" onChange={this.handlechecklist} defaultChecked={this.state.delegasichecklist} />
-												<span className="fa fa-check"></span></label>
+															);
+														}}
+													</DropzoneWrapper>
+												)}
+											</Field>
+											{thumbs}
+											<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
+											<p className="mrgn-top-5 font-color-black">
+												Ukuran setiap dokumen maksimal 15mb
+											</p>
 										</div>
-									</div>
-								</FormGroup>
-							) : ("")}
-							<FormGroup row>
-								<div className="col-xl-10">
-									<Button color className="btn-login" type="submit" disabled={isSubmitting}>
-										<span className="font-color-white">
-											Simpan Evaluasi
-										</span>
-									</Button>
+									</FormGroup>
+									<FormGroup>
+										<div className="col-xl-10">
+											<Button color className="btn-login width-133 mt-4" type="submit" disabled={isSubmitting}>
+												<span className="font-color-white">
+													Tutup Laporan
+												</span>
+											</Button>
+										</div>
+									</FormGroup>
+
 								</div>
-							</FormGroup>
-						</Form>
 
-					)}
 
+							)}
+						</Form>
+					)}
 				</Formik>
+
+
+				{selectedOption?.value === this.getStatus()[1].value ? (
+					""
+				) : (
+					<Card>
+						<Formik
+							initialValues={{
+								tanggal: new Date(),
+								judul: "",
+								dokumen: [],
+							}}
+							validationSchema={evaluasiSchema}
+							onSubmit={this.onSubmit}
+						>
+							{({ isSubmitting }) => (
+								<Form className="form-horizontal">
+									<FormGroup row>
+										<label className="col-md-2 col-form-label">Tanggal Evaluasi</label>
+										<div className="col-md-10">
+											<Field name="tanggal">
+												{({ field, form }) => (
+													<Datetime
+														timeFormat={false}
+														inputProps={{ className: "form-control" }}
+														value={field.value}
+														onChange={(e) => {
+															form.setFieldValue(field.name, e);
+														}}
+													/>
+												)}
+											</Field>
+											<ErrorMessage name="tanggal" component="div" className="form-text text-danger" />
+										</div>
+									</FormGroup>
+									<FormGroup row>
+										<label className="col-md-2 col-form-label">Judul Dokumen</label>
+										<div className="col-md-10">
+											<Field name="judul">{({ field, form }) => <Input type="text" placeholder="judul" {...field} />}</Field>
+											<ErrorMessage name="judul" component="div" className="form-text text-danger" />
+										</div>
+									</FormGroup>
+									<FormGroup row>
+										<label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+										<div className="col-md-10">
+											<Field name="dokumen">
+												{({ field, form, meta }) => (
+													<DropzoneWrapper
+														className=""
+														onDrop={(e) => {
+															this.onDrop(e);
+															form.setFieldValue(field.name, e);
+														}}
+													>
+														{({ getRootProps, getInputProps, isDragActive }) => {
+															return (
+																<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+																	<input name="dokumen" {...getInputProps()} />
+																	<div className="dropzone-style-1">
+																		<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+																			<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																				<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+																			</div> :
+																			<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																				<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
+																			</div>
+																		}
+																		</div>
+																	</div>
+																	<div className="d-flex align-items-center">
+																		<small className="ml-auto">
+																			<button
+																				type="button"
+																				className="btn btn-link"
+																				onClick={(e) => {
+																					this.clearFiles(e);
+																					form.setFieldValue(field.name, []);
+																				}}
+																			>
+																				Reset dokumen
+																			</button>
+																		</small>
+																	</div>
+																</div>
+															);
+														}}
+													</DropzoneWrapper>
+												)}
+											</Field>
+											{thumbs}
+											<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
+											<p className="mrgn-top-5 font-color-black">
+												Ukuran setiap dokumen maksimal 15mb
+											</p>
+										</div>
+									</FormGroup>
+									{this.props.user?.role.id === 2021 ? (
+										<FormGroup row>
+											<label className="col-md-2 col-form-label">Delegasi ke dikti</label>
+											<div className="col-md-10 mt-2">
+												<div className="checkbox c-checkbox">
+													<label>
+														<Input type="checkbox" onChange={this.handlechecklist} defaultChecked={this.state.delegasichecklist} />
+														<span className="fa fa-check"></span></label>
+												</div>
+											</div>
+										</FormGroup>
+									) : ("")}
+									<FormGroup row>
+										<div className="col-xl-10">
+											<Button color className="btn-login" type="submit" disabled={isSubmitting}>
+												<span className="font-color-white">
+													Simpan Evaluasi
+												</span>
+											</Button>
+										</div>
+									</FormGroup>
+								</Form>
+
+							)}
+
+						</Formik>
+					</Card>
+				)}
 			</>
 		);
 	}

+ 262 - 0
components/Sanksi/Redudansi.js

@@ -0,0 +1,262 @@
+import React, { Component } from "react";
+import { Row, Col, Input, FormGroup, Label, Progress, Button } from "reactstrap";
+import Select from "react-select";
+import "react-datepicker/dist/react-datepicker.css";
+import Swal from "sweetalert2";
+import * as Yup from "yup";
+import { connect } from "react-redux";
+import { Formik, Form, Field, ErrorMessage } from "formik";
+import { updateLaporan } from "../../actions/pelaporan"
+import { getCsrf } from "../../actions/security";
+import { ToastContainer, toast } from "react-toastify";
+import Router from "next/router";
+
+
+
+const checkIfFilesAreTooBig = (files) => {
+    let valid = true;
+    if (files) {
+        files.map((file) => {
+            if (file.size > 15 * 1024 * 1024) {
+                valid = false;
+            }
+        });
+    }
+    return valid;
+};
+let Dropzone = null;
+class DropzoneWrapper extends Component {
+    state = {
+        isClient: false,
+    };
+    componentDidMount = () => {
+        Dropzone = require("react-dropzone").default;
+        this.setState({ isClient: true });
+    };
+    render() {
+        return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
+    }
+}
+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),
+});
+const status = [
+    { value: "Sanksi", label: "Sanksi", className: "State-ACT" },
+    { value: "Ditutup", label: "Ditutup", className: "State-ACT" },
+];
+
+export class Redudansi extends Component {
+    constructor(props) {
+        super(props);
+        const tmt_awal = new Date();
+        this.state = {
+            files: [],
+            keterangan: "",
+            selectedOption: null,
+
+        };
+    }
+    async componentDidMount() {
+
+        this.defaultStatus();
+
+    }
+    defaultStatus = async () => {
+        return this.setState({ selectedOption: status[0] });
+    };
+
+    handleChangeSelect = (selectedOption) => this.setState({ selectedOption }, this.setDataStatusLaporan);
+    // handleChangeSelect = (selectedOption) => {
+    //     this.state.selectedOption = selectedOption
+    //     this.setDataStatusLaporan()
+    // }
+    getStatus = () => (status);
+
+    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]
+        }))
+    };
+    handleTutupLaporan = async (data, value) => {
+        if (this.props.role === 2024) {
+            Swal.fire({
+                icon: 'error',
+                title: 'Oops...',
+                html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+                confirmButtonColor: "#3e3a8e",
+                confirmButtonText: 'Oke'
+            })
+        } else {
+            const getToken = await getCsrf();
+            const _csrf = getToken.token;
+            const { token } = this.props;
+            const formdata = new FormData();
+            formdata.append("keterangan", data.keterangan);
+            this.state.files.forEach((e) => {
+                formdata.append("dokumen", e);
+            });
+            formdata.append("aktif", "false");
+
+            await toast.promise(updateLaporan(token, this.props.id, formdata, _csrf + `&redudansi=true`), {
+                pending: "Loading",
+                success: "Success",
+                error: "Error",
+                autoClose: 1000
+            });
+           await Router.push("/app/sanksi");
+        }
+
+    };
+    setDataStatusLaporan = () => {
+        this.props.setDataStatusLaporan(this.state)
+    }
+
+    render() {
+        const { files, selectedOption } = this.state;
+        const removeFile = file => () => {
+            const newFiles = [...files]
+            newFiles.splice(newFiles.indexOf(file), 1)
+            this.setState({
+                files: newFiles,
+            });
+        }
+        const thumbs = files.map((file, index) => (
+            <p>
+                <em className="far fa-file" />&nbsp;&nbsp;{file.name}
+                <button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
+            </p>
+        ));
+        return (
+            <>
+                <Formik
+                    enableReinitialize={true}
+                    initialValues={{
+                        status: this.getStatus()[0],
+                        keterangan: "",
+                        dokumen: [],
+                    }}
+                    validationSchema={selectedOption?.value === this.getStatus()[1].value ? ditutupSchema : null}
+                    onSubmit={this.handleTutupLaporan}
+                >
+                    {({ isSubmitting }) => (
+                        <Form>
+                            <FormGroup row>
+                                <label className="col-md-2 col-form-label font-weight-bold font-color-black">Status Laporan</label>
+                                <div className="col-md-10">
+                                    <Field name="status">
+                                        {({ field, form }) => (
+                                            <Select
+                                                value={field.value}
+                                                onChange={(e) => {
+                                                    form.setFieldValue(field.name, e);
+                                                    this.handleChangeSelect(e);
+                                                }}
+                                                options={this.getStatus()}
+                                                required
+                                            />
+                                        )}
+                                    </Field>
+                                    <ErrorMessage name="status" component="div" className="form-text text-danger" />
+                                </div>
+
+                            </FormGroup>
+                            {selectedOption?.value === this.getStatus()[0].value ? (
+                                ""
+                            ) : (
+                                <div>
+                                    <FormGroup row>
+                                        <label className="col-md-2 col-form-label">Keterangan<span className=" text-danger">*</span></label>
+                                        <div className="col-md-10">
+                                            <Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
+                                            <ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
+                                        </div>
+
+                                    </FormGroup>
+                                    <FormGroup row>
+                                        <label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+                                        <div className="col-md-10">
+                                            <Field name="dokumen">
+                                                {({ field, form, meta }) => (
+                                                    <DropzoneWrapper
+                                                        className=""
+                                                        onDrop={(e) => {
+                                                            this.onDrop(e);
+                                                            form.setFieldValue(field.name, e);
+                                                        }}
+                                                    >
+                                                        {({ getRootProps, getInputProps, isDragActive }) => {
+                                                            return (
+                                                                <div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+                                                                    <input name="dokumen" {...getInputProps()} />
+                                                                    <div className="dropzone-style-1">
+                                                                        <div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+                                                                            <div className="text-center fa-2x icon-cloud-upload mr-2 ">
+                                                                                <h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+                                                                            </div> :
+                                                                            <div className="text-center fa-2x icon-cloud-upload mr-2 ">
+                                                                                <h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
+                                                                            </div>
+                                                                        }
+                                                                        </div>
+                                                                    </div>
+                                                                    <div className="d-flex align-items-center">
+                                                                        <small className="ml-auto">
+                                                                            <button
+                                                                                type="button"
+                                                                                className="btn btn-link"
+                                                                                onClick={(e) => {
+                                                                                    this.clearFiles(e);
+                                                                                    form.setFieldValue(field.name, []);
+                                                                                }}
+                                                                            >
+                                                                                Reset dokumen
+                                                                            </button>
+                                                                        </small>
+                                                                    </div>
+                                                                </div>
+                                                            );
+                                                        }}
+                                                    </DropzoneWrapper>
+                                                )}
+                                            </Field>
+                                            {thumbs}
+                                            <ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
+                                            <p className="mrgn-top-5 font-color-black">
+                                                Ukuran setiap dokumen maksimal 15mb
+                                            </p>
+                                        </div>
+                                        <FormGroup>
+                                            <div className="col-xl-10">
+                                                <Button color className="btn-login width-133 mt-4" type="submit" disabled={isSubmitting}>
+                                                    <span className="font-color-white">
+                                                        Tutup Laporan
+                                                    </span>
+                                                </Button>
+                                            </div>
+                                        </FormGroup>
+                                    </FormGroup>
+                                </div>
+
+
+                            )}
+                        </Form>
+                    )}
+                </Formik>
+            </>
+        );
+    }
+}
+
+// const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+// export default connect(mapStateToProps)(Redudansi);
+export default Redudansi

+ 1 - 1
components/Sanksi/Ringkasan.js

@@ -78,7 +78,7 @@ export class Ringkasan extends Component {
 								</Col>
 							</FormGroup>
 							<FormGroup row>
-								<Col md="4">Tanggal Dibuat Laporan::</Col>
+								<Col md="4">Tanggal Dibuat Laporan:</Col>
 								<Col md="8">
 									<strong>{moment(dataLaporan.createdAt).format("D MMMM YYYY")}</strong>
 								</Col>

+ 34 - 35
components/Sanksi/UploadSurat.js

@@ -208,42 +208,41 @@ export class UploadSurat extends Component {
 				{!this.state.tidakPerluTMTCheck && (
 					<FormGroup row className="mt-3">
 						<label className="col-md-4 col-form-label">Isi TMT</label>
-						<Row >
-							<Col>
-								<FormGroup>
-									<span className="ml-3">
-										<DatePicker
-											selected={this.state.awalTMT ? new Date(this.state.awalTMT) : this.state.awalTMT}
-											onChange={(awalTMT) => {
-												this.setState({ awalTMT }, this.setUploadSuratSanksi)
-											}}
-											dateFormat="dd/MM/yyyy"
-											maxDate={new Date(this.state.startDay)}
-											placeholderText="Dari Tanggal"
-											locale={id}
-											className="form-control bg-white"
-										/>
-									</span>
+						<Col>
+							<FormGroup>
+								<span>
+									<DatePicker
+										selected={this.state.awalTMT ? new Date(this.state.awalTMT) : this.state.awalTMT}
+										onChange={(awalTMT) => {
+											this.setState({ awalTMT }, this.setUploadSuratSanksi)
+										}}
+										dateFormat="dd/MM/yyyy"
+										maxDate={new Date(this.state.startDay)}
+										placeholderText="Dari Tanggal"
+										locale={id}
+										className="form-control bg-white"
+									/>
+								</span>
+
+							</FormGroup>
+						</Col>
+						<Col>
+							<FormGroup>
+								<span >
+									<DatePicker
+										selected={this.state.akhirTMT ? new Date(this.state.akhirTMT) : this.state.akhirTMT}
+										onChange={(akhirTMT) => { this.setAkhirSanksi(akhirTMT) }}
+										dateFormat="dd/MM/yyyy"
+										minDate={new Date(this.state.awalTMT)}
+										maxDate={addMonths(new Date(this.state.awalTMT), 6)}
+										placeholderText="Sampai tanggal"
+										locale={id}
+										className="form-control bg-white"
+									/>
+								</span>
+							</FormGroup>
+						</Col>
 
-								</FormGroup>
-							</Col>
-							<Col>
-								<FormGroup>
-									<span className="ml-3">
-										<DatePicker
-											selected={this.state.akhirTMT ? new Date(this.state.akhirTMT) : this.state.akhirTMT}
-											onChange={(akhirTMT) => { this.setAkhirSanksi(akhirTMT) }}
-											dateFormat="dd/MM/yyyy"
-											minDate={new Date(this.state.awalTMT)}
-											maxDate={addMonths(new Date(this.state.awalTMT), 6)}
-											placeholderText="Sampai tanggal"
-											locale={id}
-											className="form-control bg-white"
-										/>
-									</span>
-								</FormGroup>
-							</Col>
-						</Row>
 					</FormGroup>
 				)}
 				{!this.state.tidakPerluTMTCheck && (

+ 62 - 0
pages/app/dashboard/all_Laporan.js

@@ -0,0 +1,62 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Penjadwalan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina,);
+        this.setState({ laporanPembina, });
+        console.log(this.state.laporanPembina)
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Penjadwalan);

+ 63 - 0
pages/app/dashboard/banding.js

@@ -0,0 +1,63 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Banding extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+            laporan: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { banding: true });
+        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
+        this.setState({ laporanPembina, laporan });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Banding);

+ 62 - 0
pages/app/dashboard/cabutSanksi.js

@@ -0,0 +1,62 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class cabutSanksi extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { cabutSanksi: true });
+        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
+        this.setState({ laporanPembina, laporan });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(cabutSanksi);

+ 62 - 0
pages/app/dashboard/detail.js

@@ -0,0 +1,62 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class laporanByPembina extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+            // pembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina);
+        this.setState({ laporanPembina });
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(laporanByPembina);

+ 69 - 0
pages/app/dashboard/index.js

@@ -0,0 +1,69 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button, Card, CardBody, Table } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+
+
+
+
+class Dashboard extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      jumlahStatusLaporan: {}
+    };
+  }
+  handleClick = (e, idPembina) => {
+    e.preventDefault();
+    Router.push({
+      pathname: "/app/riwayat/detail",
+      query: { id: idPembina },
+    });
+  };
+
+  componentDidMount = async () => {
+    const { token } = this.props;
+    const jumlahStatusLaporan = await getjumlahStatusLaporan(token);
+    this.setState({ jumlahStatusLaporan });
+  };
+
+
+  render() {
+    const { jumlahStatusLaporan } = this.state;
+    return (
+      <ContentWrapper>
+        <div className="content-heading">
+          <span className="font-color-white">Dashboard</span>
+        </div>
+        <Row>
+          <Col lg="6">
+            <ChartDataBar />
+          </Col>
+          <Col lg="6">
+            <Maps />
+          </Col>
+          <Col lg="6">
+            <ChartRadarA />
+          </Col>
+          <Col lg="6">
+            <ChartRadarB />
+          </Col>
+          <Col lg="12">
+            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/dashboard/detail" jadwal="/app/dashboard/penjadwalan" all_Laporan="/app/dashboard/all_Laporan" pemeriksaan="/app/dashboard/pemeriksaan" sanksi="/app/dashboard/sanksi" keberatan="/app/dashboard/keberatan" banding="/app/dashboard/banding" perbaikan="/app/dashboard/perbaikan" cabutSanksi="/app/dashboard/cabutSanksi" linkName="Lihat" /> : <Loader />}
+          </Col>
+        </Row>
+      </ContentWrapper>
+    );
+  }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Dashboard);

+ 63 - 0
pages/app/dashboard/keberatan.js

@@ -0,0 +1,63 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Keberatan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+            laporan: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { keberatan: true });
+        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
+        this.setState({ laporanPembina, laporan });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Keberatan);

+ 62 - 0
pages/app/dashboard/pemeriksaan.js

@@ -0,0 +1,62 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Pemeriksaan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { pemeriksaan: true });
+        // const pembina = laporanPembina.data.laporan.map((e) => e.pt.pembina)
+        this.setState({ laporanPembina, });
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Pemeriksaan);

+ 61 - 0
pages/app/dashboard/penjadwalan.js

@@ -0,0 +1,61 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Penjadwalan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { penjadwalan: true });
+        this.setState({ laporanPembina, });
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Penjadwalan);

+ 63 - 0
pages/app/dashboard/perbaikan.js

@@ -0,0 +1,63 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Perbaikan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+            laporan: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { perbaikan: true });
+        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
+        this.setState({ laporanPembina, laporan });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Perbaikan);

+ 63 - 0
pages/app/dashboard/sanksi.js

@@ -0,0 +1,63 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class sanksi extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+            laporan: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { sanksi: true });
+        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
+        this.setState({ laporanPembina, laporan });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(sanksi);

+ 5 - 4
pages/app/pelaporan/search.js

@@ -121,7 +121,7 @@ class Search extends Component {
 		this.setState({ loading: true });
 		this.fetchData();
 		this.setState({ loading: false });
-		if (this.state.data.length) {
+		if (this.state.data?.length) {
 			this.renderTableData();
 			this.setState({ noData: true });
 		}
@@ -129,6 +129,7 @@ class Search extends Component {
 
 	render() {
 		const { selectedOptionMulti, pembina } = this.state;
+		console.log(this.state)
 		return (
 			<ContentWrapper>
 				<div className="content-heading">
@@ -159,14 +160,14 @@ class Search extends Component {
 								placeholder="Pencarian Nama Perguruan Tinggi"
 							/>
 							<div className="d-flex">
-								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
+								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleApplyClick()}>
 									Search
 								</button>
 								<div className="ml-auto">{this.props.user.role.id === 2021 && `Pembina: ${this.props.user.lembaga.nama}`}</div>
 							</div>
 						</div>
 						<div className="card card-default">
-							{this.state.data.length ? (<div className="card-header">Jumlah Pencarian : {this.state.data.length}</div>) : (<div className="card-header">Search results</div>)}							<Table striped bordered hover>
+							{this.state.data?.length ? (<div className="card-header">Jumlah Pencarian : {this.state.data.length}</div>) : (<div className="card-header">Search results</div>)}							<Table striped bordered hover>
 								<thead>
 									<tr>
 										<th>No. </th>
@@ -176,7 +177,7 @@ class Search extends Component {
 								<tbody>{this.renderTableData()}</tbody>
 							</Table>
 							<div className="card-footer">
-								<div >{!this.state.data.length > 0 && this.state.noData && (<h3 className=" text-center">Data tidak ditemukan</h3>)}</div>
+								<div >{!this.state.data?.length > 0 && this.state.noData && (<h3 className=" text-center">Data tidak ditemukan</h3>)}</div>
 							</div>
 						</div>
 					</Col>

+ 20 - 59
pages/app/riwayat/index.js

@@ -1,75 +1,36 @@
 import React, { Component } from "react";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
-import Link from "next/link";
 import { Row, Col, Button, Card, CardBody, Table } from "reactstrap";
 import { connect } from "react-redux";
-import Loader from "@/components/Common/Loader";
-import Router from "next/router";
 import TableRiwayat from "@/components/Riwayat/TableRiwayat";
 import ChartData from "@/components/Riwayat/ChartData";
-import ChartDataBar from "@/components/Riwayat/ChartDataBar";
-import Maps from "@/components/Riwayat/Maps"
-import TableRadar from "../../../components/Riwayat/TableRadar";
-import { getjumlahStatusLaporan } from "../../../actions/graph";
-import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
-import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
 
 
 
 
 class Riwayat extends Component {
-  constructor(props) {
-    super(props);
-    this.state = {
-      jumlahStatusLaporan: {}
-    };
-  }
-  handleClick = (e, idPembina) => {
-    e.preventDefault();
-    Router.push({
-      pathname: "/app/riwayat/detail",
-      query: { id: idPembina },
-    });
-  };
+    constructor(props) {
+        super(props);
+        this.state = {
+        };
+    }
 
-  componentDidMount = async () => {
-    const { token } = this.props;
-    const jumlahStatusLaporan = await getjumlahStatusLaporan(token);
-    this.setState({ jumlahStatusLaporan });
-  };
 
-
-  render() {
-    const { jumlahStatusLaporan } = this.state;
-    return (
-      <ContentWrapper>
-        <div className="content-heading">
-          <span className="font-color-white">Riwayat</span>
-        </div>
-        <Row>
-          <Col lg="6">
-            <ChartDataBar />
-          </Col>
-          <Col lg="6">
-            <Maps />
-          </Col>
-          <Col lg="6">
-            <ChartRadarA />
-          </Col>
-          <Col lg="6">
-            <ChartRadarB />
-          </Col>
-          <Col lg="12">
-            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/riwayat/detail" jadwal="/app/riwayat/penjadwalan" all_Laporan="/app/riwayat/all_Laporan" pemeriksaan="/app/riwayat/pemeriksaan" sanksi="/app/riwayat/sanksi" keberatan="/app/riwayat/keberatan" banding="/app/riwayat/banding" perbaikan="/app/riwayat/perbaikan" cabutSanksi="/app/riwayat/cabutSanksi" linkName="Lihat" /> : <Loader />}
-          </Col>
-          <ChartData />
-          <Col lg="12">
-            <TableRiwayat />
-          </Col>
-        </Row>
-      </ContentWrapper>
-    );
-  }
+    render() {
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">Riwayat</span>
+                </div>
+                <Row>
+                    <ChartData />
+                    <Col lg="12">
+                        <TableRiwayat />
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
 }
 const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Riwayat);

+ 64 - 22
pages/app/sanksi/proses.js

@@ -25,6 +25,7 @@ import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
 import { updatePddikti } from "../../../actions/sanksi";
 import { ENV } from "../../../env";
 import Swal from "sweetalert2";
+import Redudansi from "../../../components/Sanksi/Redudansi";
 
 
 
@@ -85,7 +86,6 @@ class ProsesSanksi extends Component {
 				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
 				confirmButtonText: 'Oke'
-				// footer: '<a href="">Why do I have this issue?</a>'
 			})
 		} else {
 			this.setState({
@@ -257,7 +257,13 @@ class ProsesSanksi extends Component {
 	};
 	setDataSuratBA = (data) => {
 		this.setState({ dataSuratBA: data });
-		console.log(this.state.dataSuratBA)
+
+	};
+	setDataStatusLaporan = async (data) => {
+		await this.setState({ dataStatusLaporan: data });
+		const thisclose = data.selectedOption.value
+		this.setState({ thisclose })
+
 
 	};
 	validation = (activeStep) => {
@@ -282,7 +288,7 @@ class ProsesSanksi extends Component {
 				});
 			} else {
 				this.setState({
-					activeStep: "6"
+					activeStep: "7"
 				});
 			}
 		} else {
@@ -305,7 +311,7 @@ class ProsesSanksi extends Component {
 				});
 			} else {
 				this.setState({
-					activeStep: "6"
+					activeStep: "7"
 				});
 			}
 		}
@@ -322,7 +328,7 @@ class ProsesSanksi extends Component {
 	};
 
 	render() {
-		const { dataUpload, dataPelanggaran, pelaporan, dataSuratBA } = this.state
+		const { dataUpload, dataPelanggaran, pelaporan, dataSuratBA, thisclose } = this.state
 		return (
 			<ContentWrapper unwrap>
 				{/* <Header /> */}
@@ -361,7 +367,7 @@ class ProsesSanksi extends Component {
 												})}
 												onClick={this.toggleStep("2")}
 											>
-												<h4 className="text-left my-3">2. Hasil Evaluasi</h4>
+												<h4 className="text-left my-3">2. Status Laporan</h4>
 											</NavLink>
 										</NavItem>
 										<NavItem style={stepNavitemStyle}>
@@ -371,8 +377,9 @@ class ProsesSanksi extends Component {
 													active: this.state.activeStep === "3",
 												})}
 												onClick={this.toggleStep("3")}
+												disabled={thisclose === "Ditutup"}
 											>
-												<h4 className="text-left my-3">3. Penetapan Jenis Pelanggaran</h4>
+												<h4 className="text-left my-3">3. Hasil Evaluasi</h4>
 											</NavLink>
 										</NavItem>
 										<NavItem style={stepNavitemStyle}>
@@ -382,8 +389,9 @@ class ProsesSanksi extends Component {
 													active: this.state.activeStep === "4",
 												})}
 												onClick={this.toggleStep("4")}
+												disabled={thisclose === "Ditutup"}
 											>
-												<h4 className="text-left my-3">4. Berita Acara Pleno</h4>
+												<h4 className="text-left my-3">4. Penetapan Jenis Pelanggaran</h4>
 											</NavLink>
 										</NavItem>
 										<NavItem style={stepNavitemStyle}>
@@ -393,8 +401,9 @@ class ProsesSanksi extends Component {
 													active: this.state.activeStep === "5",
 												})}
 												onClick={this.toggleStep("5")}
+												disabled={thisclose === "Ditutup"}
 											>
-												<h4 className="text-left my-3">5. Penetapan Sanksi</h4>
+												<h4 className="text-left my-3">5. Berita Acara Pleno</h4>
 											</NavLink>
 										</NavItem>
 										<NavItem style={stepNavitemStyle}>
@@ -403,10 +412,23 @@ class ProsesSanksi extends Component {
 												className={classnames({
 													active: this.state.activeStep === "6",
 												})}
+												onClick={this.toggleStep("6")}
+												disabled={thisclose === "Ditutup"}
+											>
+												<h4 className="text-left my-3">6. Penetapan Sanksi</h4>
+											</NavLink>
+										</NavItem>
+										<NavItem style={stepNavitemStyle}>
+											<NavLink
+												tag="div"
+												className={classnames({
+													active: this.state.activeStep === "7",
+												})}
 												onClick={this.validation}
+												disabled={thisclose === "Ditutup"}
 											// onClick={this.toggleStep("6")}
 											>
-												<h4 className="text-left my-3">6. Ringkasan</h4>
+												<h4 className="text-left my-3">7. Ringkasan</h4>
 											</NavLink>
 										</NavItem>
 									</Nav>
@@ -426,6 +448,26 @@ class ProsesSanksi extends Component {
 											</div>
 										</TabPane>
 										<TabPane tabId="2">
+											<div className="pt-3 mb-3">
+												<h2>Status Laporan</h2>
+												<Card className="card-default">
+
+													<CardBody>
+														<Redudansi setDataStatusLaporan={this.setDataStatusLaporan} id={pelaporan.data?._id}  role={this.props?.user?.role.id}/>
+													</CardBody>
+												</Card>
+											</div>
+											<hr />
+											<div className="d-flex">
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("1")}>
+													<span className="font-color-white">Previous</span>
+												</Button>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("3")} disabled={thisclose === "Ditutup"}>
+													<span className="font-color-white">Next</span>
+												</Button>
+											</div>
+										</TabPane>
+										<TabPane tabId="3">
 											<div className="pt-3 mb-3">
 												<h2>Hasil Evaluasi</h2>
 												<Card className="card-default">
@@ -440,43 +482,43 @@ class ProsesSanksi extends Component {
 											</div>
 											<hr />
 											<div className="d-flex">
-												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("1")}>
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("2")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
-												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("3")}>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("4")}>
 													<span className="font-color-white">Next</span>
 												</Button>
 											</div>
 										</TabPane>
-										<TabPane tabId="3">
+										<TabPane tabId="4">
 											<div className="pt-3 mb-3">
 												<h2>Penetapan Jenis Pelanggaran</h2>
 												<TablePenetapanSanksi query={this.props.query} handleDelegasi={this.handleDelegasi} handleAutoSave={this.handleAutoSave} setCheckedData={this.setCheckedData} dataPelanggaran={dataPelanggaran} />
 											</div>
 											<hr />
 											<div className="d-flex">
-												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("2")}>
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("3")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
-												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("4")}>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("5")}>
 													<span className="font-color-white">Next</span>
 												</Button>
 											</div>
 										</TabPane>
-										<TabPane tabId="4">
+										<TabPane tabId="5">
 											<Card>
 												<BeritaAcara query={this.props.query} handleAutoSave={this.handleAutoSave} dataPelanggaran={this.state.dataPelanggaran} setDataSuratBA={this.setDataSuratBA} dataLaporan={pelaporan} dataSuratBA={dataSuratBA} role={this.props?.user?.role.id} />
 											</Card>
 											<div className="d-flex">
-												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("3")}>
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("4")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
-												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("5")}>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("6")}>
 													<span className="font-color-white">Next</span>
 												</Button>
 											</div>
 										</TabPane>
-										<TabPane tabId="5">
+										<TabPane tabId="6">
 											<div className="pt-3 mb-3">
 												<h2>Penetapan Sanksi</h2>
 												{this.state.listSanksi && <UploadSurat setUploadSuratSanksi={this.setUploadSuratSanksi} listSanksi={this.state.listSanksi} query={this.props.query} handleAutoSave={this.handleAutoSave} dataPelanggaran={this.state.dataPelanggaran} dataSuratBA={dataSuratBA} />}
@@ -513,7 +555,7 @@ class ProsesSanksi extends Component {
 											</FormGroup>
 											<hr />
 											<div className="d-flex">
-												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("4")}>
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("5")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
 												<Button className="ml-auto btn-login color-3e3a8e" color onClick={() => { this.validation() }}>
@@ -521,7 +563,7 @@ class ProsesSanksi extends Component {
 												</Button>
 											</div>
 										</TabPane>
-										<TabPane tabId="6">
+										<TabPane tabId="7">
 											<div className="pt-3 mb-3">
 												<h2>Ringkasan</h2>
 												{pelaporan.data ? <Ringkasan dataSuratBA={dataSuratBA} query={this.props.query} dataLaporan={pelaporan.data} dataPelanggaran={dataPelanggaran?.data} dataPelanggaranBA={this.state.dataPelanggaran} dataUpload={dataUpload} /> : <Loader />}
@@ -552,7 +594,7 @@ class ProsesSanksi extends Component {
 											</div>
 											<hr />
 											<div className="d-flex">
-												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("5")}>
+												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("6")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
 												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.done}

+ 1 - 1
pages/pt/jawaban-pencabutan-sanksi/index.js

@@ -16,7 +16,7 @@ class JawabanCabutSanksi extends Component {
 
 	componentDidMount = async () => {
 		const { token } = this.props;
-		const sanksi = await getSanksi(token, { cabutSanksi: true, jawaban: true });
+		const sanksi = await getSanksi(token, { cabutSanksi: true, jawaban: false });
 		this.setState({ sanksi });
 	};