yazid138 3 年 前
コミット
6d17f276a1

+ 12 - 2
actions/pelanggaran.js

@@ -23,9 +23,19 @@ export const getPelanggaranId = async (id) => {
 	}
 };
 
-export const getPelanggaran = async (token) => {
+export const getPelanggaran = async (token, query) => {
 	try {
-		const res = await axios.get("/pelanggaran", {
+		let url = "/pelanggaran";
+		if (query != null) {
+			const { id } = query;
+			url += "?";
+			const parseURL = [];
+			if (id) {
+				parseURL.push(`id=${id}`);
+			}
+			url += parseURL.join("&");
+		}
+		const res = await axios.get(url, {
 			headers: {
 				Authorization: token,
 			},

+ 6 - 9
actions/pelaporan.js

@@ -5,18 +5,15 @@ export const getPelaporan = async (token, query = {}) => {
 	try {
 		let url = "/laporan";
 		if (query != null) {
-			const { number, ptId, jadwal, pemeriksaan, active, role, orgId } = query;
+			const { jadwal, evaluasi } = query;
 			url += "?";
 			const parseURL = [];
-			if (number) parseURL.push(`number=${number}`);
-			if (ptId) parseURL.push(`ptId=${ptId}`);
-			if (jadwal) parseURL.push(`jadwal=true`);
-			if (pemeriksaan) parseURL.push(`pemeriksaan=true`);
-			if (active) parseURL.push(`active=${active}`);
-			if (role) {
-				parseURL.push(`role=${role}`);
-				if (role === "lldikti" && orgId) parseURL.push(`orgId=${orgId}`);
+			if (jadwal) {
+				parseURL.push(`jadwal=true`);
+			} else if (evaluasi) {
+				parseURL.push(`evaluasi=true`);
 			}
+
 			url += parseURL.join("&");
 		}
 

+ 4 - 9
actions/pemeriksaan.js

@@ -1,11 +1,6 @@
-import { post } from "../config/request";
+import axiosAPI from "../config/axios";
 
-export const insertPemeriksaan = async ({ number, ptId }, data) => {
-	try {
-		const res = await post(`/pelaporan/pemeriksaan/create?number=${number}&ptId=${ptId}`, data);
-		return res.data;
-	} catch (error) {
-		console.log("error", error);
-		return false;
-	}
+export const insertPemeriksaan = async (token, id, data) => {
+	const res = await axiosAPI.post(`/laporan/evaluasi/add/${id}`, data, { headers: { Authorization: token } });
+	return res.data;
 };

+ 19 - 22
actions/sanksi.js

@@ -1,39 +1,36 @@
-import { post, get } from "../config/request";
+import axiosAPI from "../config/axios";
 
-export const createSanksi = async ({ number, ptId }, data) => {
-	try {
-		const res = await post(`/sanksi/create?number=${number}&ptId=${ptId}`, data);
-		console.log(res);
-		return res.data;
-	} catch (error) {
-		console.log("error", error);
-		return false;
-	}
+export const createSanksi = async (token, id, data) => {
+	const res = await axiosAPI.post(`/sanksi/create/${id}`, data, { headers: { Authorization: token } });
+	return res.data;
 };
 
-export const getSanksi = async (query = {}) => {
+export const getSanksi = async (token, query = {}) => {
 	try {
 		let url = "/sanksi";
-		if (query != null) {
-			const { ptId, noSanksi, keberatan, jawaban, banding, active, cabutSanksi, docPerbaikan, role, orgId } = query;
+		if (query != {}) {
+			const { keberatan, jawaban, banding, cabutSanksi, perbaikan } = query;
 			url += "?";
 			const parseURL = [];
-			if (noSanksi) parseURL.push(`noSanksi=${noSanksi}`);
-			if (ptId) parseURL.push(`ptId=${ptId}`);
 			if (keberatan) parseURL.push(`keberatan=true`);
 			if (banding) parseURL.push(`banding=true`);
 			if (cabutSanksi) parseURL.push(`cabutSanksi=true`);
-			if (docPerbaikan) parseURL.push(`docPerbaikan=true`);
+			if (perbaikan) parseURL.push(`perbaikan=true`);
 			if (jawaban) parseURL.push(`jawaban=true`);
-			if (role) {
-				parseURL.push(`role=${role}`);
-				if (role === "lldikti" && orgId) parseURL.push(`orgId=${orgId}`);
-			}
-			parseURL.push(`active=${active || "true"}`);
 			url += parseURL.join("&");
 		}
 
-		const res = await get(url);
+		const res = await axiosAPI.get(url, { headers: { Authorization: token } });
+		return res.data;
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};
+
+export const getOneSanksi = async (token, id) => {
+	try {
+		const res = await axiosAPI.get(`/sanksi/${id}`, { headers: { Authorization: token } });
 		return res.data;
 	} catch (error) {
 		console.log("error", error);

+ 8 - 6
components/Extras/calendar.view.js

@@ -232,6 +232,13 @@ class Calendar extends Component {
 													>
 														{() => (
 															<Form>
+																<FormGroup>
+																	<label className="col-form-label">Warna</label>
+																	<div className="badge d-block" style={{ backgroundColor: this.state.color, color: "white" }}>
+																		{this.state.color}
+																	</div>
+																</FormGroup>
+																
 																<FormGroup>
 																	<label className="col-form-label">Judul</label>
 																	<Field name="judul">{({ field, form }) => <Input type="text" placeholder="judul" {...field} />}</Field>
@@ -269,12 +276,7 @@ class Calendar extends Component {
 																	</Field>
 																	<ErrorMessage name="sampai_tanggal" component="div" className="form-text text-danger" />
 																</FormGroup>
-																<FormGroup>
-																	<label className="col-form-label">Warna</label>
-																	<div className="badge d-block" style={{ backgroundColor: this.state.color, color: "white" }}>
-																		{this.state.color}
-																	</div>
-																</FormGroup>
+
 																<FormGroup row>
 																	<div className="col-xl-12">
 																		<Button color="primary" block type="submit">

+ 8 - 8
components/Main/DetailSanksi.js

@@ -11,13 +11,13 @@ function DetailSanksi({ data, noTitle = false }) {
 				<FormGroup row>
 					<Col md="4">Nomor Sanksi:</Col>
 					<Col md="8">
-						<strong>{data.sanksi.no_sanksi}</strong>
+						<strong>{data.no_sanksi}</strong>
 					</Col>
 				</FormGroup>
 				<FormGroup row>
 					<Col md="4">Nama Perguruan Tinggi:</Col>
 					<Col md="8">
-						<strong>{data.pt.nama}</strong>
+						<strong>{data.laporan.pt.nama}</strong>
 					</Col>
 				</FormGroup>
 
@@ -25,14 +25,14 @@ function DetailSanksi({ data, noTitle = false }) {
 					<Col md="4">Keterangan:</Col>
 					<Col md="8">
 						<Scrollable height="100px" className="list-group">
-							<p>{data.sanksi.description}</p>
+							<p>{data.keterangan}</p>
 						</Scrollable>
 					</Col>
 				</FormGroup>
 				<FormGroup row>
 					<Col md="4">Dibuat Pada:</Col>
 					<Col md="8">
-						<strong>{moment(data.sanksi.createdAt).format("D MMMM YYYY")}</strong>
+						<strong>{moment(data.createdAt).format("D MMMM YYYY")}</strong>
 					</Col>
 				</FormGroup>
 				<FormGroup row>
@@ -41,14 +41,14 @@ function DetailSanksi({ data, noTitle = false }) {
 						<Scrollable height="120px" className="list-group">
 							<table className="table table-bordered bg-transparent">
 								<tbody>
-									{data.sanksi.files.map((e) => (
+									{data.dokumen.map((e) => (
 										<tr>
 											<td>
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
-												<a className="text-muted" href={API_URL + e.path} target="_blank" download={e.name}>
-													{e.name}
+												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+													{e.judul}
 												</a>
 											</td>
 										</tr>
@@ -70,7 +70,7 @@ function DetailSanksi({ data, noTitle = false }) {
 										</tr>
 									</thead>
 									<tbody>
-										{data.sanksi.pelanggaran.map((jp, index) => (
+										{data.pelanggaran.map((jp, index) => (
 											<tr key={jp._id}>
 												<td width={50}>
 													<div className="media align-items-center">

+ 1 - 1
components/Main/TableLaporan.js

@@ -37,7 +37,7 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
 											</td>
 											{status ? (
 												<td>
-													<div className="badge badge-info">{data.role_data}</div>
+													<div className="badge badge-info">{data.role_data === "dikti" ? "Ditindaklanjuti DIKTI" : "Ditindaklanjuti LLDIKTI"}</div>
 												</td>
 											) : (
 												""

+ 9 - 1
components/Main/Timeline.js

@@ -1,7 +1,7 @@
 import moment from "moment";
 import { API_URL } from "@/env";
 
-function Timeline({ data, noFile = false }) {
+function Timeline({ data, noFile = false, noJadwal = false }) {
 	const date = data && [...new Set(data.map((e) => moment(e.createdAt).format("DD MMMM YYYY")))];
 	return (
 		<ul className="timeline-alt">
@@ -38,6 +38,14 @@ function Timeline({ data, noFile = false }) {
 														<p className="text-muted m-0">{moment(data.createdAt).format("hh:mm")}</p>
 													</p>
 												</div>
+												{!noJadwal && data.jadwal && (
+													<>
+														<p className="text-muted my-2">Jadwal Pemeriksaan</p>
+														<p>
+															Tanggal {moment(data.jadwal.dari_tanggal).format("DD MMMM YYYY")} - {moment(data.jadwal.sampai_tanggal).format("DD MMMM YYYY")}
+														</p>
+													</>
+												)}
 												{!noFile && data.dokumen.length ? (
 													<>
 														<p className="text-muted my-2">Dokumen</p>

+ 5 - 5
components/PT/JawabanKeberatan/TableSanksiJawaban.js

@@ -19,23 +19,23 @@ function TableSanksi({ listData, to, linkName }) {
 						{listData.map((data) => {
 							return (
 								<tr key={data._id}>
-									<td>{data.sanksi.no_sanksi}</td>
+									<td>{data.no_sanksi}</td>
 									<td className="text-nowrap">
 										<div className="media align-items-center">
 											{/* <img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" /> */}
 											<div className="media-body d-flex">
 												<div>
-													<h4 className="m-0">{data.pt.nama}</h4>
+													<h4 className="m-0">{data.laporan.pt.nama}</h4>
 													{/* <small className="text-muted">0742/O/1990 - www.satyagama.ac.id - info@satyagama.ac.id</small> */}
-													<p>{data.sanksi.description.length > 70 ? data.sanksi.description.substring(0, 70) + "..." : data.sanksi.description}</p>
+													<p>{data.keterangan.length > 70 ? data.keterangan.substring(0, 70) + "..." : data.keterangan}</p>
 												</div>
 											</div>
 										</div>
 									</td>
 									<td>{moment(data.sanksi.createdAt).format("DD MMMM YYYY")}</td>
 									<td>
-										{data.sanksi.keberatan?.jawaban ? (
-											<Link href={{ pathname: to, query: { noSanksi: data.sanksi.no_sanksi } }}>
+										{data.jawaban?.keberatan ? (
+											<Link href={{ pathname: to, query: { id: data._id } }}>
 												<Button color="primary">{linkName}</Button>
 											</Link>
 										) : (

+ 17 - 33
components/PT/Riwayat.js

@@ -18,39 +18,23 @@ function Riwayat({ data }) {
 							</tr>
 						</thead>
 						<tbody>
-							{data.length ? (
-								data.map((value) => (
-									<tr>
-										<td>{moment(value.createAt).format("DD MMMM YYYY")}</td>
-										<td>
-											{value.files.map((e) => (
-												<>
-													<em className="fa-lg far fa-file-code"></em>
-													<a className="text-muted" href={`data:${e.type};base64, ${Buffer.from(e.data).toString("base64")}`} download={e.name}>
-														{e.name}
-													</a>
-												</>
-											))}
-										</td>
-									</tr>
-								))
-							) : data ? (
-								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
-									<td>
-										{data.files.map((e) => (
-											<>
-												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={`data:${e.type};base64, ${Buffer.from(e.data).toString("base64")}`} download={e.name}>
-													{e.name}
-												</a>
-											</>
-										))}
-									</td>
-								</tr>
-							) : (
-								""
-							)}
+							{data.length
+								? data.map((value) => (
+										<tr>
+											<td>{moment(value.createAt).format("DD MMMM YYYY")}</td>
+											<td>
+												{value.dokumen.map((e) => (
+													<>
+														<em className="fa-lg far fa-file-code"></em>
+														<a className="text-muted" href={data.path} download={e.judul}>
+															{e.judul}
+														</a>
+													</>
+												))}
+											</td>
+										</tr>
+								  ))
+								: ""}
 						</tbody>
 					</table>
 				</Datatable>

+ 5 - 5
components/PT/TableSanksi.js

@@ -19,20 +19,20 @@ function TableSanksi({ listData, to, linkName }) {
 						{listData.map((data) => {
 							return (
 								<tr key={data._id}>
-									<td>{data.sanksi.no_sanksi}</td>
+									<td>{data.no_sanksi}</td>
 									<td className="text-nowrap">
 										<div className="media align-items-center">
 											<div className="media-body d-flex">
 												<div>
-													<h4 className="m-0">{data.pt.nama}</h4>
-													<p>{data.sanksi.description.length > 70 ? data.sanksi.description.substring(0, 70) + "..." : data.sanksi.description}</p>
+													<h4 className="m-0">{data.laporan.pt.nama}</h4>
+													<p>{data.keterangan.length > 70 ? data.sanksi.description.substring(0, 70) + "..." : data.keterangan}</p>
 												</div>
 											</div>
 										</div>
 									</td>
-									<td>{moment(data.sanksi.createdAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>
-										<Link href={{ pathname: to, query: { noSanksi: data.sanksi.no_sanksi } }}>
+										<Link href={{ pathname: to, query: { id: data._id } }}>
 											<Button color="primary">{linkName}</Button>
 										</Link>
 									</td>

+ 3 - 3
components/PT/TableSanksiJawaban.js

@@ -19,13 +19,13 @@ function TableSanksi({ listData, to, linkName }) {
 						{listData.map((data) => {
 							return (
 								<tr key={data._id}>
-									<td>{data.sanksi.no_sanksi}</td>
+									<td>{data.no_sanksi}</td>
 									<td className="text-nowrap">
 										<div className="media align-items-center">
 											<div className="media-body d-flex">
 												<div>
-													<h4 className="m-0">{data.pt.nama}</h4>
-													<p>{data.sanksi.description}</p>
+													<h4 className="m-0">{data.laporan.pt.nama}</h4>
+													<p>{data.keterangan}</p>
 												</div>
 											</div>
 										</div>

+ 1 - 1
components/Pelaporan/InputData.js

@@ -40,7 +40,7 @@ export class InputData extends Component {
 			splitButtonOpen: false,
 			selectedOptionMulti: [],
 			stat: "Waiting to add files..",
-			pelaporanNumber: moment(new Date()).format("YYMMDD") + "" + Math.floor(Math.random() * 10000),
+			pelaporanNumber: moment(new Date()).format("DDMMYY") + "" + Math.floor(Math.random() * 10000),
 			keteranganLaporan: "",
 			files: [],
 			pelanggaran: [],

+ 96 - 65
components/Pemeriksaan/InputEvaluasi.js

@@ -5,8 +5,17 @@ import Datetime from "react-datetime";
 import moment from "moment";
 import { Row, Col, FormGroup, Input } from "reactstrap";
 import { ToastContainer, toast } from "react-toastify";
+import { Formik, Form, Field, ErrorMessage } from "formik";
+import * as Yup from "yup";
 
 const selectInstanceId = 1;
+
+const evaluasiSchema = Yup.object().shape({
+	tanggal: Yup.date().required("Required"),
+	judul: Yup.string().min(3).max(150).required("Required"),
+	dokumen: Yup.array().min(1).required("Required"),
+});
+
 let Dropzone = null;
 
 class DropzoneWrapper extends Component {
@@ -84,25 +93,21 @@ export default class InputEvaluasi extends Component {
 		});
 	};
 
-	onSubmit = async (e) => {
-		e.preventDefault();
-		const { number, ptId } = this.props.query;
+	onSubmit = async (data) => {
+		const { token, query } = this.props;
+		const { id } = query;
 		const formdata = new FormData();
-		formdata.append("title", this.state.judulEvaluasi);
-		formdata.append("date", this.state.tanggal);
-		if (this.state.files.length > 0) {
-			this.state.files.forEach((e) => {
-				formdata.append("files", e);
-			});
-		}
-		const id = toast.loading("Please wait...");
-		const inserted = await insertPemeriksaan({ number, ptId }, formdata);
-		if (inserted) {
-			toast.update(id, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			Router.push({
-				pathname: "/app/pemeriksaan",
-			});
-		}
+		formdata.append("judul", data.judul);
+		formdata.append("tanggal", data.tanggal);
+		data.dokumen.forEach((e) => {
+			formdata.append("dokumen", e);
+		});
+
+		await toast.promise(insertPemeriksaan(token, id, formdata), {
+			pending: "Loading",
+			success: "Success",
+			error: "Error",
+		});
 	};
 
 	render() {
@@ -116,53 +121,79 @@ export default class InputEvaluasi extends Component {
 		return (
 			<>
 				<p className="lead bb">Evaluasi</p>
-				<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
-					<FormGroup>
-						<label>Tanggal Dokumen:</label>
-						<div>
-							<Datetime inputProps={{ className: "form-control" }} value={this.state.tanggal} onChange={this.setTanggal} />
-							{/* <span className="form-text">Tanggal</span> */}
-						</div>
-					</FormGroup>
-					<FormGroup>
-						<label>Judul Dokumen:</label>
-						<div>
-							<Input type="text" value={this.state.judulEvaluasi} onChange={this.setjudulEvaluasi} />
-							{/* <Input type="textarea" value={this.state.keteranganLaporan} onChange={this.setKeteranganPelaporan} /> */}
-							{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
-						</div>
-					</FormGroup>
-					<FormGroup>
-						<label>Upload File Pendukung:</label>
-						<div>
-							<DropzoneWrapper className="" onDrop={this.onDrop}>
-								{({ getRootProps, getInputProps, isDragActive }) => {
-									return (
-										<div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
-											<input {...getInputProps()} />
-											<div className="dropzone-previews flex">{this.state.files.length > 0 ? <Row>{thumbs}</Row> : <div className="text-center dz-default dz-message">Drop files here to upload</div>}</div>
-											<div className="d-flex align-items-center">
-												<small className="ml-auto">
-													<button type="button" className="btn btn-link" onClick={this.clearFiles}>
-														Clear files
-													</button>
-												</small>
-											</div>
-										</div>
-									);
-								}}
-							</DropzoneWrapper>
-							<span className="form-text">Multiple files upload</span>
-						</div>
-					</FormGroup>
-					<FormGroup>
-						<div>
-							<button className="btn btn-sm btn-primary" type="submit">
-								Simpan Evaluasi
-							</button>
-						</div>
-					</FormGroup>
-				</form>
+				<Formik
+					initialValues={{
+						tanggal: new Date(),
+						judul: "",
+						dokumen: [],
+					}}
+					validationSchema={evaluasiSchema}
+					onSubmit={this.onSubmit}
+				>
+					<Form className="form-horizontal">
+						<FormGroup>
+							<label className="col-form-label">Tanggal Dokumen</label>
+							<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" />
+						</FormGroup>
+						<FormGroup>
+							<label className="col-form-label">Judul Dokumen</label>
+							<Field name="judul">{({ field, form }) => <Input type="text" placeholder="judul" {...field} />}</Field>
+							<ErrorMessage name="judul" component="div" className="form-text text-danger" />
+						</FormGroup>
+						<FormGroup row>
+							<label className="col-md-2 col-form-label">Upload File Pendukung</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 p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
+														<input name="dokumen" {...getInputProps()} />
+														<div className="dropzone-previews flex">{this.state.files.length > 0 ? <Row>{thumbs}</Row> : <div className="text-center dz-default dz-message">Drop files here to upload</div>}</div>
+														<div className="d-flex align-items-center">
+															<small className="ml-auto">
+																<button type="button" className="btn btn-link" onClick={this.clearFiles}>
+																	Clear files
+																</button>
+															</small>
+														</div>
+													</div>
+												);
+											}}
+										</DropzoneWrapper>
+									)}
+								</Field>
+								<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
+							</div>
+						</FormGroup>
+						<FormGroup row>
+							<div className="col-xl-10">
+								<button className="btn btn-sm btn-primary" type="submit">
+									Simpan Evaluasi
+								</button>
+							</div>
+						</FormGroup>
+					</Form>
+				</Formik>
 			</>
 		);
 	}

+ 8 - 10
components/Pemeriksaan/TableRiwayat.js

@@ -1,8 +1,6 @@
 import Datatable from "@/components/Tables/Datatable";
-import { API_URL } from "@/env";
 
 function TableRiwayat({ data }) {
-	console.log(data);
 	return (
 		<Datatable options={{ responsive: true }}>
 			<table className="table table-striped my-4 w-100">
@@ -15,17 +13,17 @@ function TableRiwayat({ data }) {
 					</tr>
 				</thead>
 				<tbody>
-					{data.penjadwalan.pemeriksaan.map((e, index) => (
-						<tr key={`riwayatPemeriksaan-${index}`}>
+					{data.evaluasi.map((e, index) => (
+						<tr key={index}>
 							<td>{moment(e.createdAt).format("D MMMM YYYY")}</td>
-							<td>{moment(e.date).format("D MMMM YYYY")}</td>
-							<td>{e.title}</td>
+							<td>{moment(e.tanggal).format("D MMMM YYYY")}</td>
+							<td>{e.judul}</td>
 							<td>
-								{e.files.map((e, index) => (
+								{e.dokumen.map((e, index) => (
 									<>
-										<em className="fa-lg far fa-file-code"></em>
-										<a className="text-muted" href={API_URL + e.path} target="_blank" download={e.name}>
-											{e.name}
+										<em key="index" className="fa-lg far fa-file-code"></em>
+										<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+											{e.judul}
 										</a>
 										<br />
 									</>

+ 4 - 4
components/Sanksi/TableLaporan.js

@@ -23,19 +23,19 @@ function TableLaporan({ listData }) {
 								{listData.map((data) => {
 									return (
 										<tr key={data._id}>
-											<td>{data._number}</td>
+											<td>{data.no_laporan}</td>
 											<td className="text-nowrap">
 												<div className="media align-items-center">
 													<div className="media-body d-flex">
 														<div>
 															<h4 className="m-0">{data.pt.nama}</h4>
-															<p>{data.description.length > 35 ? data.description.substring(0, 35) + "..." : data.description}</p>
+															<p>{data.keterangan.length > 35 ? data.keterangan.substring(0, 35) + "..." : data.keterangan}</p>
 														</div>
 													</div>
 												</div>
 											</td>
 											<td>
-												<div className="badge badge-info">{data.status}</div>
+												<div className="badge badge-info">{data.role_data}</div>
 											</td>
 											<td>{moment(data.createdAt).fromNow()}</td>
 											<td>
@@ -43,7 +43,7 @@ function TableLaporan({ listData }) {
 													<Link
 														href={{
 															pathname: data.sanksi ? "/app/sanksi/detail" : "/app/sanksi/proses",
-															query: { ptId: data.pt_id, number: data._number },
+															query: { id: data.sanksi || data._id },
 														}}
 													>
 														<Button color="primary" size="sm">

+ 4 - 5
components/Sanksi/TablePenetapanSanksi.js

@@ -10,14 +10,13 @@ export class TablePenetapanSanksi extends Component {
 		super(props);
 		this.state = {
 			pelanggaran: null,
-			// checkedData: [],
+			checkedData: [],
 		};
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const pelanggaran = await getPelanggaran();
-		if (user.peran[0].peran.id === 2021) pelanggaran.data = pelanggaran.data.filter((e) => e.level_sanksi === 1);
+		const { token } = this.props;
+		const pelanggaran = await getPelanggaran(token);
 		this.setState({ pelanggaran });
 	};
 
@@ -88,5 +87,5 @@ export class TablePenetapanSanksi extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(TablePenetapanSanksi);

+ 4 - 6
pages/app/pemeriksaan/index.js

@@ -16,10 +16,8 @@ class Pemeriksaan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { organisasi, peran } = this.props.user.peran[0];
-		const query = { role: peran.id === 2021 ? "lldikti" : "dikti", penjadwalan: true, active: true };
-		if (peran.id === 2021) query.orgId = organisasi.id;
-		const pelaporan = await getPelaporan(query);
+		const { token } = this.props;
+		const pelaporan = await getPelaporan(token, { jadwal: true });
 		this.setState({ pelaporan });
 	};
 
@@ -32,12 +30,12 @@ class Pemeriksaan extends Component {
 					<Col lg="4">
 						<CaseProgress />
 					</Col>
-					<Col lg="8">{pelaporan?.data ? <TableLaporan noBy listData={pelaporan.data} to="/app/pemeriksaan/new" linkName="Evaluasi" status /> : <Loader />}</Col>
+					<Col lg="8">{pelaporan?.data ? <TableLaporan status noBy listData={pelaporan.data} to="/app/pemeriksaan/new" linkName="Evaluasi" /> : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Pemeriksaan);

+ 13 - 11
pages/app/pemeriksaan/new.js

@@ -5,10 +5,11 @@ import Header from "@/components/Main/Header";
 import DetailLaporan from "@/components/Main/DetailLaporan";
 import InputEvaluasi from "@/components/Pemeriksaan/InputEvaluasi";
 import TableRiwayat from "@/components/Pemeriksaan/TableRiwayat";
-import { getPelaporan } from "@/actions/pelaporan";
+import { getOneLaporan } from "@/actions/pelaporan";
 import Link from "next/link";
 import { Row, Col, Card, CardBody, CardHeader, CardTitle } from "reactstrap";
 import Loader from "@/components/Common/Loader";
+import { connect } from "react-redux";
 
 class PemeriksaanNew extends Component {
 	constructor(props) {
@@ -22,13 +23,13 @@ class PemeriksaanNew extends Component {
 	};
 
 	componentDidMount = async () => {
-		const { query } = this.props;
-		const pelaporan = await getPelaporan({ ptId: query.ptId, number: query.number });
+		const { token, query } = this.props;
+		const pelaporan = await getOneLaporan(token, query.id);
 		this.setState({ pelaporan });
 	};
 
 	render() {
-		const { query } = this.props;
+		const { query, token } = this.props;
 		const { pelaporan } = this.state;
 		return (
 			<ContentWrapper unwrap>
@@ -44,13 +45,13 @@ class PemeriksaanNew extends Component {
 					</div>
 					<Row>
 						<Col xl="9">
-							{pelaporan.data && pelaporan.data.length ? (
+							{pelaporan.data ? (
 								<Card className="card-default">
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailLaporan data={pelaporan.data[0]} />
-												<InputEvaluasi query={query} />
+												<DetailLaporan data={pelaporan.data} />
+												<InputEvaluasi query={query} token={token} />
 											</Col>
 										</Row>
 									</CardBody>
@@ -59,9 +60,9 @@ class PemeriksaanNew extends Component {
 								<Loader />
 							)}
 						</Col>
-						<Col xl="3">{pelaporan.data && pelaporan.data.length ? <DetailPT data={pelaporan.data[0].pt} /> : <Loader />}</Col>
+						<Col xl="3">{pelaporan.data ? <DetailPT data={pelaporan.data.pt} /> : <Loader />}</Col>
 					</Row>
-					{pelaporan.data && pelaporan.data.length && (
+					{pelaporan.data && (
 						<Row>
 							<Col>
 								<Card className="card-default">
@@ -69,7 +70,7 @@ class PemeriksaanNew extends Component {
 										<CardTitle>Riwayat Evaluasi</CardTitle>
 									</CardHeader>
 									<CardBody>
-										<TableRiwayat data={pelaporan.data[0]} />
+										<TableRiwayat data={pelaporan.data} />
 									</CardBody>
 								</Card>
 							</Col>
@@ -81,4 +82,5 @@ class PemeriksaanNew extends Component {
 	}
 }
 
-export default PemeriksaanNew;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(PemeriksaanNew);

+ 11 - 9
pages/app/sanksi/detail.js

@@ -7,8 +7,9 @@ import DetailSanksi from "@/components/Main/DetailSanksi";
 import Header from "@/components/Main/Header";
 import Link from "next/link";
 import { getPelaporan } from "@/actions/pelaporan";
-import { createSanksi } from "@/actions/sanksi";
+import { getOneSanksi } from "@/actions/sanksi";
 import Loader from "@/components/Common/Loader";
+import { connect } from "react-redux";
 
 const stepNavitemStyle = {
 	backgroundColor: "#fcfcfc",
@@ -18,7 +19,7 @@ class Detail extends Component {
 	constructor(props) {
 		super(props);
 		this.state = {
-			pelaporan: {},
+			sanksi: {},
 		};
 	}
 
@@ -27,13 +28,13 @@ class Detail extends Component {
 	};
 
 	componentDidMount = async () => {
-		const { query } = this.props;
-		const pelaporan = await getPelaporan({ ptId: query.ptId, number: query.number });
-		this.setState({ pelaporan });
+		const { query, token } = this.props;
+		const sanksi = await getOneSanksi(token, query.id);
+		this.setState({ sanksi });
 	};
 
 	render() {
-		const { pelaporan } = this.state;
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper unwrap>
 				{/* <Header /> */}
@@ -46,12 +47,12 @@ class Detail extends Component {
 							</Link>
 						</div>
 					</div>
-					{pelaporan?.data ? (
+					{sanksi.data ? (
 						<Card className="card-default">
 							<CardBody>
 								<Row>
 									<Col>
-										<DetailSanksi data={pelaporan.data[0]} />
+										<DetailSanksi data={sanksi.data} />
 									</Col>
 								</Row>
 							</CardBody>
@@ -65,4 +66,5 @@ class Detail extends Component {
 	}
 }
 
-export default Detail;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Detail);

+ 4 - 6
pages/app/sanksi/index.js

@@ -16,10 +16,8 @@ class Sanksi extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { organisasi, peran } = this.props.user.peran[0];
-		const query = { role: peran.id === 2021 ? "lldikti" : "dikti", pemeriksaan: true, active: true };
-		if (peran.id === 2021) query.orgId = organisasi.id;
-		const pelaporan = await getPelaporan(query);
+		const { token } = this.props;
+		const pelaporan = await getPelaporan(token, { evaluasi: true });
 		this.setState({ pelaporan });
 	};
 
@@ -32,12 +30,12 @@ class Sanksi extends Component {
 					<Col lg="4">
 						<CaseProgress />
 					</Col>
-					<Col lg="8">{pelaporan?.data ? <TableLaporan listData={pelaporan.data} /> : <Loader />}</Col>
+					<Col lg="8">{pelaporan.data ? <TableLaporan listData={pelaporan.data} /> : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Sanksi);

+ 31 - 28
pages/app/sanksi/proses.js

@@ -10,9 +10,9 @@ import UploadSurat from "@/components/Sanksi/UploadSurat";
 import Ringkasan from "@/components/Sanksi/Ringkasan";
 import TablePenetapanSanksi from "@/components/Sanksi/TablePenetapanSanksi";
 import Link from "next/link";
-import { getPelaporan } from "@/actions/pelaporan";
+import { getOneLaporan } from "@/actions/pelaporan";
 import { createSanksi } from "@/actions/sanksi";
-import { getPelanggaranId } from "@/actions/pelanggaran";
+import { getPelanggaran } from "@/actions/pelanggaran";
 import { connect } from "react-redux";
 import Loader from "@/components/Common/Loader";
 import { ToastContainer, toast } from "react-toastify";
@@ -29,7 +29,7 @@ class ProsesSanksi extends Component {
 			activeStep: "1",
 			dataUpload: null,
 			dataPelanggaran: {},
-			pelaporan: null,
+			pelaporan: {},
 		};
 	}
 
@@ -38,31 +38,34 @@ class ProsesSanksi extends Component {
 	};
 
 	componentDidMount = async () => {
-		const { query } = this.props;
-		const pelaporan = await getPelaporan({ ptId: query.ptId, number: query.number });
+		const { query, token } = this.props;
+		const { id } = query;
+		const pelaporan = await getOneLaporan(token, id);
 		this.setState({ pelaporan });
 	};
 
 	done = async (e) => {
-		e.preventDefault();
-		const { ptId, number } = this.props.query;
-		const formdata = new FormData();
-		formdata.append("no_sanksi", this.state.dataUpload.nomorSanksi);
-		formdata.append("user", this.props.user._id);
-		formdata.append("description", this.state.dataUpload.keterangan);
-		formdata.append("pelanggaran", this.state.dataPelanggaran.data.map((e) => e._id).join());
-		if (this.state.dataUpload.files.length > 0) {
-			this.state.dataUpload.files.forEach((e) => {
-				formdata.append("files", e);
-			});
-		}
-		const id = toast.loading("Please wait...");
-		const create = await createSanksi({ ptId, number }, formdata);
-		if (create) {
-			toast.update(id, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
+		const toastid = toast.loading("Please wait...");
+		try {
+			e.preventDefault();
+			const { query, token } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			formdata.append("no_sanksi", this.state.dataUpload.nomorSanksi);
+			formdata.append("keterangan", this.state.dataUpload.keterangan);
+			formdata.append("pelanggaran_id", this.state.dataPelanggaran.data.map((e) => e._id).join());
+			if (this.state.dataUpload.files.length > 0) {
+				this.state.dataUpload.files.forEach((e) => {
+					formdata.append("dokumen", e);
+				});
+			}
+			await createSanksi(token, id, formdata);
+			toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
 			Router.push({
 				pathname: "/app/sanksi",
 			});
+		} catch (error) {
+			toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
 		}
 	};
 
@@ -75,12 +78,12 @@ class ProsesSanksi extends Component {
 	};
 
 	setCheckedData = async (data) => {
-		const result = await getPelanggaranId(data);
+		const { token } = this.props;
+		const result = await getPelanggaran(token, { id: data.join(",") });
 		this.setState({ dataPelanggaran: result });
 	};
 
 	setUploadSuratSanksi = (data) => {
-		// this.dataUpload = data;
 		this.setState({ dataUpload: data });
 	};
 
@@ -165,7 +168,7 @@ class ProsesSanksi extends Component {
 										<TabPane tabId="1">
 											<div className="pt-3 mb-3">
 												<h2>Detail Laporan</h2>
-												{pelaporan?.data ? <DetailLaporan noTitle data={pelaporan.data[0]} /> : <Loader />}
+												{pelaporan.data ? <DetailLaporan noTitle data={pelaporan.data} /> : <Loader />}
 											</div>
 											<hr />
 											<div className="d-flex">
@@ -178,9 +181,9 @@ class ProsesSanksi extends Component {
 											<div className="pt-3 mb-3">
 												<h2>Hasil Evaluasi</h2>
 												<Card className="card-default">
-													{pelaporan?.data ? (
+													{pelaporan.data ? (
 														<CardBody>
-															<TableRiwayat data={pelaporan.data[0]} />
+															<TableRiwayat data={pelaporan.data} />
 														</CardBody>
 													) : (
 														<Loader />
@@ -230,7 +233,7 @@ class ProsesSanksi extends Component {
 										<TabPane tabId="5">
 											<div className="pt-3 mb-3">
 												<h2>Ringkasan</h2>
-												{pelaporan?.data ? <Ringkasan dataLaporan={pelaporan.data[0]} dataPelanggaran={dataPelanggaran.data} dataUpload={dataUpload} /> : <Loader />}
+												{pelaporan.data ? <Ringkasan dataLaporan={pelaporan.data} dataPelanggaran={dataPelanggaran.data} dataUpload={dataUpload} /> : <Loader />}
 											</div>
 											<hr />
 											<div className="d-flex">
@@ -253,5 +256,5 @@ class ProsesSanksi extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(ProsesSanksi);

+ 4 - 5
pages/pt/dokumen-perbaikan/index.js

@@ -15,9 +15,8 @@ class Pelaporan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token, { perbaikan: true });
 		this.setState({ sanksi });
 	};
 
@@ -27,12 +26,12 @@ class Pelaporan extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Dokumen Perbaikan</div>
 				<Row>
-					<Col lg={12}>{sanksi.data && sanksi.data.length > 0 ? <TableSanksi listData={sanksi.data} to="/app/pt/dokumen-perbaikan/detail" linkName="Detail" /> : sanksi.data ? 'Tidak ada Sanksi' : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/dokumen-perbaikan/detail" linkName="Detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Pelaporan);

+ 4 - 5
pages/pt/jawaban-banding/index.js

@@ -15,9 +15,8 @@ class JawabanKeberatan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ banding: true, ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token, { banding: true, jawaban: true });
 		this.setState({ sanksi });
 	};
 
@@ -27,12 +26,12 @@ class JawabanKeberatan extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Jawaban Atas Permohonan Banding</div>
 				<Row>
-					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-banding/detail" linkName="Detail" /> : sanksi.data ? '' : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-banding/detail" linkName="Detail" /> : sanksi.data ? "" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(JawabanKeberatan);

+ 4 - 5
pages/pt/jawaban-keberatan/index.js

@@ -15,9 +15,8 @@ class JawabanKeberatan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ keberatan: true, ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token, { keberatan: true, jawaban: true });
 		this.setState({ sanksi });
 	};
 
@@ -27,12 +26,12 @@ class JawabanKeberatan extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Jawaban Atas Permohonan Keberatan</div>
 				<Row>
-					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-keberatan/detail" linkName="Detail" /> : sanksi.data ? '' : <Loader />} </Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-keberatan/detail" linkName="Detail" /> : sanksi.data ? "" : <Loader />} </Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(JawabanKeberatan);

+ 4 - 5
pages/pt/jawaban-pencabutan-sanksi/index.js

@@ -15,9 +15,8 @@ class JawabanCabutSanksi extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ cabutSanksi: true, ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token, { cabutSanksi: true, jawaban: true });
 		this.setState({ sanksi });
 	};
 
@@ -27,12 +26,12 @@ class JawabanCabutSanksi extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Jawaban Permohonan Pencabutan Sanksi</div>
 				<Row>
-					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? '' : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/jawaban-pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(JawabanCabutSanksi);

+ 20 - 18
pages/pt/keberatan/detail.js

@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
-import { getSanksi } from "@/actions/sanksi";
+import { getOneSanksi } from "@/actions/sanksi";
 import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
 import DetailSanksi from "@/components/Main/DetailSanksi";
-import Riwayat from "@/components/PT/Keberatan/Riwayat";
+import Riwayat from "@/components/PT/Riwayat";
 import ModalPermohonan from "@/components/PT/Keberatan/ModalPermohonan";
 import Link from "next/link";
 import moment from "moment";
@@ -17,13 +17,15 @@ class Keberatan extends Component {
 	state = {
 		modal: false,
 		sanksi: {},
+		pt: null,
 	};
 
+	static getInitialProps = ({ query }) => ({ query });
+
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const { noSanksi } = this.props.router.query;
-		const sanksi = await getSanksi({ noSanksi, ptId: user.peran[0].organisasi.id });
-		this.setState({ sanksi });
+		const { token, query } = this.props;
+		const sanksi = await getOneSanksi(token, query.id);
+		this.setState({ sanksi, pt: sanksi.data.laporan.pt });
 	};
 
 	toggleModal = (value = true) => {
@@ -35,11 +37,11 @@ class Keberatan extends Component {
 	};
 
 	render() {
-		const { sanksi } = this.state;
+		const { sanksi, pt } = this.state;
 		return (
 			<ContentWrapper unwrap>
-				{sanksi?.data && <ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.router.query} data={sanksi.data[0]} />}
-				<Header data={this.props.pt[0]} />
+				{sanksi.data && <ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.router.query} data={sanksi.data} />}
+				{pt && <Header data={pt} />}
 				<div className="p-3">
 					<div className="content-heading">
 						<div>Permohonan Keberatan</div>
@@ -50,20 +52,20 @@ class Keberatan extends Component {
 						</div>
 					</div>
 					<Row>
-						{sanksi?.data ? (
+						{sanksi.data ? (
 							<Col xl="9">
 								<Card className="card-default">
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data[0]} />
-												{new Date(sanksi.data[0].sanksi.close_keberatan).getTime() > Date.now() ? (
+												<DetailSanksi data={sanksi.data} />
+												{new Date(sanksi.data.batas_waktu.keberatan).getTime() > Date.now() ? (
 													<>
 														<p>
 															Setelah membaca surat keputusan sanksi tersebut, jika Perguruan Tinggi bermaksud mengajukan permohonan keberatan maka dapat menekan tombol di bawah ini paling lambat{" "}
-															{moment(sanksi.data[0].sanksi.close_keberatan).format("DD MMMM YYYY")}
+															{moment(sanksi.data.batas_waktu.keberatan).format("DD MMMM YYYY")}
 														</p>
-														<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data[0].sanksi.keberatan || false}>
+														<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data.pengajuan?.keberatan || false}>
 															Ajukan Permohonan Keberatan
 														</Button>
 													</>
@@ -78,12 +80,12 @@ class Keberatan extends Component {
 						) : (
 							<Loader />
 						)}
-						<Col xl="3">{this.props.pt && <DetailPT data={this.props.pt[0]} />}</Col>
+						<Col xl="3">{pt && <DetailPT data={pt} />}</Col>
 					</Row>
-					{sanksi?.data && (
+					{sanksi.data && (
 						<Row>
 							<Col>
-								<Riwayat data={sanksi.data[0]} />
+								<Riwayat data={sanksi.data?.pengajuan?.keberatan ? sanksi.data.pengajuan.keberatan : []} />
 							</Col>
 						</Row>
 					)}
@@ -93,5 +95,5 @@ class Keberatan extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user, pt: state.pt });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(withRouter(Keberatan));

+ 4 - 5
pages/pt/keberatan/index.js

@@ -14,9 +14,8 @@ class Keberatan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token);
 		this.setState({ sanksi });
 	};
 
@@ -26,12 +25,12 @@ class Keberatan extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Permohonan Keberatan</div>
 				<Row>
-					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/app/pt/keberatan/detail" linkName="Detail" /> : sanksi.data ? 'Tidak ada Sanksi' : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/keberatan/detail" linkName="Detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Keberatan);

+ 16 - 15
pages/pt/pencabutan-sanksi/detail.js

@@ -1,11 +1,11 @@
 import React, { Component } from "react";
 import Router from "next/router";
 import Link from "next/link";
-import { getSanksi } from "@/actions/sanksi";
+import { getOneSanksi } from "@/actions/sanksi";
 import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
 import DetailSanksi from "@/components/Main/DetailSanksi";
-import Riwayat from "@/components/PT/CabutSanksi/Riwayat";
+import Riwayat from "@/components/PT/Riwayat";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Card, CardBody, FormGroup, Button } from "reactstrap";
 import { addCabutSanksi } from "@/actions/cabutSanksi";
@@ -32,6 +32,8 @@ class DetailPencabutanSanksi extends Component {
 		super(props);
 		this.state = {
 			files: [],
+			sanksi: {},
+			pt: null,
 		};
 	}
 
@@ -40,10 +42,9 @@ class DetailPencabutanSanksi extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const { noSanksi } = this.props.query;
-		const sanksi = await getSanksi({ noSanksi, ptId: user.peran[0].organisasi.id });
-		this.setState({ sanksi });
+		const { token, query } = this.props;
+		const sanksi = await getOneSanksi(token, query.id);
+		this.setState({ sanksi, pt: sanksi.data.laporan.pt });
 	};
 
 	onDrop = (files) => {
@@ -98,7 +99,7 @@ class DetailPencabutanSanksi extends Component {
 	};
 
 	render() {
-		const { files, sanksi } = this.state;
+		const { files, sanksi, pt } = this.state;
 
 		const thumbs = files.map((file, index) => (
 			<Col md={3} key={index}>
@@ -107,24 +108,24 @@ class DetailPencabutanSanksi extends Component {
 		));
 		return (
 			<ContentWrapper unwrap>
-				<Header data={this.props.pt[0]} />
+				{pt && <Header data={pt} />}
 				<div className="p-3">
 					<div className="content-heading">
 						<div>Permohonan Pencabutan Sanksi</div>
 						<div className="ml-auto">
-							<Link href="/app/pt/pencabutan-sanksi">
+							<Link href="/pt/pencabutan-sanksi">
 								<button className="btn btn-sm btn-secondary text-sm">&lt; back</button>
 							</Link>
 						</div>
 					</div>
 					<Row>
-						{sanksi?.data ? (
+						{sanksi.data ? (
 							<Col xl="9">
 								<Card className="card-default">
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data[0]} />
+												<DetailSanksi data={sanksi.data} />
 												<p className="lead bb">Permohonan Pencabutan Sanksi</p>
 												<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
 													<FormGroup>
@@ -153,7 +154,7 @@ class DetailPencabutanSanksi extends Component {
 													</FormGroup>
 													<FormGroup>
 														<div className="row-xl-10">
-															<Button color="primary" onClick={this.handleKirim} disabled={sanksi.data[0].sanksi.cabut_sanksi || false} type="submit">
+															<Button color="primary" onClick={this.handleKirim} disabled={sanksi.data?.pengajuan?.cabut_sanksi ? sanksi.data.pengajuan.cabut_sanksi : false} type="submit">
 																Kirim
 															</Button>
 														</div>
@@ -167,12 +168,12 @@ class DetailPencabutanSanksi extends Component {
 						) : (
 							<Loader />
 						)}
-						<Col xl="3">{this.props.pt && <DetailPT data={this.props.pt[0]} />}</Col>
+						<Col xl="3">{pt && <DetailPT data={pt} />}</Col>
 					</Row>
 					{sanksi?.data && (
 						<Row>
 							<Col>
-								<Riwayat data={sanksi.data[0]} />
+								<Riwayat data={sanksi.data?.pengajuan?.cabut_sanksi ? sanksi.data.pengajuan.cabut_sanksi : []} />
 							</Col>
 						</Row>
 					)}
@@ -182,5 +183,5 @@ class DetailPencabutanSanksi extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user, pt: state.pt });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(DetailPencabutanSanksi);

+ 4 - 5
pages/pt/pencabutan-sanksi/index.js

@@ -15,9 +15,8 @@ class PencabutanSanksi extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const org_id = user.peran[0].organisasi.id;
-		const sanksi = await getSanksi({ ptId: org_id });
+		const { token } = this.props;
+		const sanksi = await getSanksi(token);
 		this.setState({ sanksi });
 	};
 
@@ -27,12 +26,12 @@ class PencabutanSanksi extends Component {
 			<ContentWrapper>
 				<div className="content-heading">Permohonan Pencabutan Sanksi</div>
 				<Row>
-					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? 'Tidak ada Sanksi' : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(PencabutanSanksi);