yazid138 преди 3 години
родител
ревизия
16252e1cd6

+ 35 - 0
actions/keberatan.js

@@ -0,0 +1,35 @@
+import { addLog } from "./log";
+
+export const addKeberatan = async ({ noSanksi, ptId }, data) => {
+	try {
+		const res = await fetch(`http://localhost:5000/keberatan/add?noSanksi=${noSanksi}&ptId=${ptId}`, {
+			method: "POST",
+			body: data,
+		});
+		const result = await res.json();
+		console.log(result);
+		// addLog({ status: "SUCCESS", action: "CREATE", from: { id: result.added._id, data: "keberatan" }, description: "membuat permohonan keberatan" });
+		return result;
+	} catch (error) {
+		console.log("error", error);
+		addLog({ status: "FAIL", action: "CREATE", from: { data: "keberatan" }, description: error.message || "membuat permohonan keberatan" });
+		return false;
+	}
+};
+
+export const addJawabanKeberatan = async ({ noSanksi, ptId }, data) => {
+	try {
+		const res = await fetch(`http://localhost:5000/keberatan/jawaban/add?noSanksi=${noSanksi}&ptId=${ptId}`, {
+			method: "POST",
+			body: data,
+		});
+		const result = await res.json();
+		console.log(result);
+		// addLog({ status: "SUCCESS", action: "CREATE", from: { id: result.added._id, data: "keberatan" }, description: "membuat permohonan keberatan" });
+		return result;
+	} catch (error) {
+		console.log("error", error);
+		addLog({ status: "FAIL", action: "CREATE", from: { data: "keberatan" }, description: error.message || "membuat permohonan keberatan" });
+		return false;
+	}
+};

+ 22 - 22
components/Common/Scrollable.js

@@ -1,37 +1,37 @@
 // SLIMSCROLL
 // -----------------------------------
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
+import React, { Component } from "react";
+import PropTypes from "prop-types";
 // Perfect Scrollbar
-import PerfectScrollbar from 'react-perfect-scrollbar';
+import PerfectScrollbar from "react-perfect-scrollbar";
 
 // ensure rails are shown over the rest
-const fixRailsZIndex = '.ps__rail-y, ps__rail-x {z-index: 999999; }';
+const fixRailsZIndex = ".ps__rail-y, ps__rail-x {z-index: 999999; }";
 
-const Scrollable = props => {
-    const scrollStyle = {
-        position: 'relative'
-    };
-    if (props.height !== null) {
-        scrollStyle.height = props.height;
-    }
-    return (
-        <>
-            <style>{fixRailsZIndex}</style>
-            <PerfectScrollbar {...props} style={scrollStyle}>
-                {props.children}
-            </PerfectScrollbar>
-        </>
-    );
+const Scrollable = (props) => {
+	const scrollStyle = {
+		position: "relative",
+	};
+	if (props.height !== null) {
+		scrollStyle.maxHeight = props.height;
+	}
+	return (
+		<>
+			<style>{fixRailsZIndex}</style>
+			<PerfectScrollbar {...props} style={scrollStyle}>
+				{props.children}
+			</PerfectScrollbar>
+		</>
+	);
 };
 
 Scrollable.propTypes = {
-    /** height of the element */
-    height: PropTypes.string
+	/** height of the element */
+	height: PropTypes.string,
 };
 
 Scrollable.defaultProps = {
-    height: '250px'
+	height: "250px",
 };
 
 export default Scrollable;

+ 37 - 0
components/Keberatan/PermohonanPT.js

@@ -0,0 +1,37 @@
+import Scrollable from "@/components/Common/Scrollable";
+import { Col, FormGroup } from "reactstrap";
+
+function PermohonanPT({ data }) {
+	return (
+		<>
+			<p className="lead bb">Permohonan PT</p>
+			<form className="form-horizontal">
+				<FormGroup row>
+					<Col md="4">Dokumen Permohonan:</Col>
+					<Col md="8">
+						<Scrollable height="120px" className="list-group">
+							<table className="table table-bordered bg-transparent">
+								<tbody>
+									{data.sanksi.keberatan.files.map((e) => (
+										<tr>
+											<td>
+												<em className="fa-lg far fa-file-code"></em>
+											</td>
+											<td>
+												<a className="text-muted" href={`data:${e.type};base64, ${Buffer.from(e.data).toString("base64")}`} download={e.name}>
+													{e.name}
+												</a>
+											</td>
+										</tr>
+									))}
+								</tbody>
+							</table>
+						</Scrollable>
+					</Col>
+				</FormGroup>
+			</form>
+		</>
+	);
+}
+
+export default PermohonanPT;

+ 49 - 7
components/Keberatan/Riwayat.js

@@ -1,9 +1,51 @@
-function Riwayat() {
-    return (
-        <div>
-            Enter
-        </div>
-    );
+import Datatable from "@/components/Tables/Datatable";
+import moment from "moment";
+import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
+
+function Riwayat({ data }) {
+	const jawaban = data.sanksi.keberatan.jawaban;
+	return (
+		<Card className="card-default">
+			<CardHeader>
+				<CardTitle>Riwayat</CardTitle>
+			</CardHeader>
+			<CardBody>
+				<Datatable options={{ responsive: true }}>
+					<table className="table table-striped my-4 w-100">
+						<thead>
+							<tr>
+								<th>Tanggal</th>
+								<th>Status</th>
+								<th>Keterangan Jawaban</th>
+								<th>Dokumen Jawaban</th>
+							</tr>
+						</thead>
+						<tbody>
+							{jawaban ? (
+								<tr>
+									<td>{moment(jawaban.createAt).format("DD MMMM YYYY")}</td>
+									<td>{jawaban.status}</td>
+									<td>{jawaban.description}</td>
+									<td>
+										{jawaban.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>
+							) : (
+								""
+							)}
+						</tbody>
+					</table>
+				</Datatable>
+			</CardBody>
+		</Card>
+	);
 }
 
-export default Riwayat;
+export default Riwayat;

+ 45 - 13
components/Main/DetailSanksi.js

@@ -1,12 +1,55 @@
 import Scrollable from "@/components/Common/Scrollable";
 import moment from "moment";
-import { Col, FormGroup } from "reactstrap";
+import { Col, FormGroup, Table } from "reactstrap";
 
 function DetailSanksi({ data, noTitle = false }) {
 	return (
 		<>
 			{noTitle ? "" : <p className="lead bb">Detail Sanksi</p>}
 			<form className="form-horizontal">
+				<FormGroup row>
+					<Col md={12}>
+						<div className="card b">
+							<div className="card-body bb">
+								<Table responsive>
+									<thead>
+										<tr>
+											<th>Jenis Pelanggaran</th>
+											<th>Sanksi</th>
+										</tr>
+									</thead>
+									<tbody>
+										{data.sanksi.pelanggaran.map((jp, index) => (
+											<tr key={jp._id}>
+												<td>
+													<div className="media align-items-center">
+														<div className="media-body d-flex">
+															<div>
+																<p>{jp.pelanggaran}</p>
+																<p>TMT : {jp.tmt_bulan} Bulan</p>
+																<p>Level Pelanggaran : {jp.label_sanksi}</p>
+															</div>
+														</div>
+													</div>
+												</td>
+												<td>
+													<div className="media align-items-center">
+														<div className="media-body d-flex">
+															<div>
+																<p>{jp.sanksi}</p>
+																<p>Keterangan : {jp.keterangan_sanksi}</p>
+															</div>
+														</div>
+													</div>
+												</td>
+											</tr>
+										))}
+									</tbody>
+								</Table>
+							</div>
+						</div>
+					</Col>
+				</FormGroup>
 				<FormGroup row>
 					<Col md="4">Nomor Sanksi:</Col>
 					<Col md="8">
@@ -19,18 +62,7 @@ function DetailSanksi({ data, noTitle = false }) {
 						<strong>Universitas Satyagama</strong>
 					</Col>
 				</FormGroup>
-				<FormGroup row>
-					<Col md="4">Jenis Pelanggaran:</Col>
-					<Col md="8">
-						<Scrollable height="75px" className="list-group">
-							<ul>
-								{data.sanksi.pelanggaran.map((e) => (
-									<li>Lorem ipsum dolor sit.</li>
-								))}
-							</ul>
-						</Scrollable>
-					</Col>
-				</FormGroup>
+
 				<FormGroup row>
 					<Col md="4">Keterangan:</Col>
 					<Col md="8">

+ 47 - 0
components/PT/Keberatan/Riwayat.js

@@ -0,0 +1,47 @@
+import Datatable from "@/components/Tables/Datatable";
+import moment from "moment";
+import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
+
+function Riwayat({ data }) {
+	const keberatan = data.sanksi.keberatan;
+	return (
+		<Card className="card-default">
+			<CardHeader>
+				<CardTitle>Riwayat</CardTitle>
+			</CardHeader>
+			<CardBody>
+				<Datatable options={{ responsive: true }}>
+					<table className="table table-striped my-4 w-100">
+						<thead>
+							<tr>
+								<th>Tanggal</th>
+								<th>Dokumen</th>
+							</tr>
+						</thead>
+						<tbody>
+							{keberatan ? (
+								<tr>
+									<td>{moment(keberatan.createAt).format("DD MMMM YYYY")}</td>
+									<td>
+										{keberatan.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>
+							) : (
+								""
+							)}
+						</tbody>
+					</table>
+				</Datatable>
+			</CardBody>
+		</Card>
+	);
+}
+
+export default Riwayat;

+ 51 - 0
components/PT/TableSanksi.js

@@ -0,0 +1,51 @@
+import moment from "moment";
+import { Button, Table } from "reactstrap";
+import Link from "next/link";
+
+function TableSanksi({ listData, to, linkName }) {
+	return (
+		<div className="card b">
+			<div className="card-body">
+				<Table className="table w-100">
+					<thead>
+						<tr>
+							<th>Nomor Sanksi</th>
+							<th>Keterangan Sanksi</th>
+							<th>Created</th>
+							<th></th>
+						</tr>
+					</thead>
+					<tbody>
+						{listData.map((data) => {
+							return (
+								<tr key={data._id}>
+									<td>{data.sanksi.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">Universitas Satyagama</h4>
+													{/* <small className="text-muted">0742/O/1990 - www.satyagama.ac.id - info@satyagama.ac.id</small> */}
+													<p>{data.sanksi.description}</p>
+												</div>
+											</div>
+										</div>
+									</td>
+									<td>{moment(data.sanksi.createAt).fromNow()}</td>
+									<td>
+										<Link href={{ pathname: to, query: { noSanksi: data.sanksi.no_sanksi } }}>
+											<Button color="primary">{linkName}</Button>
+										</Link>
+									</td>
+								</tr>
+							);
+						})}
+					</tbody>
+				</Table>
+			</div>
+		</div>
+	);
+}
+
+export default TableSanksi;

+ 98 - 147
pages/app/keberatan/detail.js

@@ -1,35 +1,17 @@
 import React, { Component } from "react";
+import Router from "next/router";
 import Link from "next/link";
 import Select from "react-select";
-import Datatable from "@/components/Tables/Datatable";
 import DetailSanksi from "@/components/Main/DetailSanksi";
 import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
+import PermohonanPT from "@/components/Keberatan/PermohonanPT";
+import Riwayat from "@/components/Keberatan/Riwayat";
 import { getSanksi } from "@/actions/sanksi";
+import { addJawabanKeberatan } from "@/actions/keberatan";
 
 import ContentWrapper from "@/components/Layout/ContentWrapper";
-import {
-	Row,
-	Col,
-	Card,
-	CardHeader,
-	CardBody,
-	CardTitle,
-	FormGroup,
-	FormFeedback,
-	FormText,
-	Label,
-	InputGroup,
-	InputGroupAddon,
-	InputGroupButtonDropdown,
-	InputGroupText,
-	Input,
-	Button,
-	DropdownToggle,
-	DropdownMenu,
-	CustomInput,
-	DropdownItem,
-} from "reactstrap";
+import { Row, Col, Card, CardBody, FormGroup, Input, Button } from "reactstrap";
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -47,12 +29,13 @@ class DropzoneWrapper extends Component {
 
 const selectInstanceId = 1;
 
-class UploadKeberatan extends Component {
+class DetailKeberatan extends Component {
 	constructor(props) {
 		super(props);
 		this.state = {
 			selectedOption: null,
 			files: [],
+			keterangan: "",
 		};
 	}
 
@@ -95,10 +78,30 @@ class UploadKeberatan extends Component {
 		});
 	};
 
+	handelSimpan = async (e) => {
+		e.preventDefault();
+		const { keterangan, selectedOption } = this.state;
+		const { noSanksi, ptId } = this.props.query;
+		const formdata = new FormData();
+		formdata.append("description", keterangan);
+		formdata.append("status", selectedOption.value);
+		if (this.state.files.length > 0) {
+			this.state.files.forEach((e) => {
+				formdata.append("files", e);
+			});
+		}
+
+		const added = await addJawabanKeberatan({ noSanksi, ptId }, formdata);
+		if (added) {
+			Router.push({
+				pathname: "/app/keberatan",
+			});
+		}
+	};
+
 	render() {
 		const { files } = this.state;
 		const { sanksi } = this.props;
-		console.log(sanksi);
 
 		const thumbs = files.map((file, index) => (
 			<Col md={3} key={index}>
@@ -111,10 +114,7 @@ class UploadKeberatan extends Component {
 				<Header />
 				<div className="p-3">
 					<div className="content-heading">
-						<div>
-							Permohonan Keberatan
-							{/* <small>Form pembuatan laporan baru v.0.1</small> */}
-						</div>
+						<div>Permohonan Keberatan</div>
 						<div className="ml-auto">
 							<Link href="/app/pt/keberatan">
 								<button className="btn btn-sm btn-secondary text-sm">&lt; back</button>
@@ -124,78 +124,83 @@ class UploadKeberatan extends Component {
 					<Row>
 						<Col xl="9">
 							<Card className="card-default">
-								{/* <CardHeader>
-									<label>Informasi Dokumen</label>
-								</CardHeader> */}
 								<CardBody>
 									<Row>
 										<Col lg={6}>
 											<DetailSanksi data={sanksi.data[0]} />
 										</Col>
 										<Col lg={6}>
-											<p className="lead bb">Jawaban</p>
-											<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
-												<FormGroup>
-													<label className="row-form-label">Status:</label>
-													<div className="row-md-10">
-														<Select
-															instanceId={selectInstanceId + 1}
-															value={this.state.selectedOption}
-															onChange={this.handleChangeSelect}
-															options={[
-																{ value: "ditolak", label: "Ditolak", className: "State-ACT" },
-																{ value: "mengubah sanksi", label: "Mengubah Sanksi", className: "State-ACT" },
-																{ value: "mencabut sanksi", label: "Mencabut Sanksi", className: "State-ACT" },
-															]}
-															required
-														/>
-														{/* <span className="form-text">Pilih Jenis Pelanggaran</span> */}
-													</div>
-												</FormGroup>
-												<FormGroup>
-													<label className="row-form-label">Keterangan Dokumen:</label>
-													<div className="row-md-10">
-														<Input type="textarea" value={this.state.keteranganLaporan} onChange={this.setKeteranganPelaporan} required />
-														{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
-													</div>
-												</FormGroup>
-												<FormGroup>
-													<label className="row-form-label">Dokumen Jawaban:</label>
-													<div className="row-md-10">
-														<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>
-													</div>
-												</FormGroup>
-												<FormGroup>
-													<div className="row-xl-10">
-														<button className="btn btn-sm btn-primary" type="submit">
-															Simpan
-														</button>
-													</div>
-												</FormGroup>
-											</form>
+											<Row>
+												<Col>
+													<PermohonanPT data={sanksi.data[0]} />
+												</Col>
+											</Row>
+											<Row>
+												<Col>
+													<p className="lead bb">Jawaban</p>
+													<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
+														<FormGroup>
+															<label className="row-form-label">Status:</label>
+															<div className="row-md-10">
+																<Select
+																	instanceId={selectInstanceId + 1}
+																	value={this.state.selectedOption}
+																	onChange={this.handleChangeSelect}
+																	options={[
+																		{ value: "ditolak", label: "Ditolak", className: "State-ACT" },
+																		{ value: "mengubah sanksi", label: "Mengubah Sanksi", className: "State-ACT" },
+																		{ value: "mencabut sanksi", label: "Mencabut Sanksi", className: "State-ACT" },
+																	]}
+																	required
+																/>
+																{/* <span className="form-text">Pilih Jenis Pelanggaran</span> */}
+															</div>
+														</FormGroup>
+														<FormGroup>
+															<label className="row-form-label">Keterangan Jawaban:</label>
+															<div className="row-md-10">
+																<Input type="textarea" value={this.state.keterangan} onChange={(e) => this.setState({ keterangan: e.target.value })} required />
+																{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
+															</div>
+														</FormGroup>
+														<FormGroup>
+															<label className="row-form-label">Dokumen Jawaban:</label>
+															<div className="row-md-10">
+																<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>
+															</div>
+														</FormGroup>
+														<FormGroup>
+															<div className="row-xl-10">
+																<Button color="primary" onClick={this.handelSimpan} type="submit">
+																	Simpan
+																</Button>
+															</div>
+														</FormGroup>
+													</form>
+												</Col>
+											</Row>
 										</Col>
 									</Row>
 								</CardBody>
 							</Card>
-							{/* END card */}
 						</Col>
 						<Col xl="3">
 							<DetailPT />
@@ -203,61 +208,7 @@ class UploadKeberatan extends Component {
 					</Row>
 					<Row>
 						<Col>
-							<Card className="card-default">
-								<CardHeader>
-									<CardTitle>Riwayat</CardTitle>
-									{/* <div className="text-sm">DataTables has most features enabled by default, so all you need to do to use it with your own tables is to call the construction function: $().DataTable();.</div> */}
-								</CardHeader>
-								<CardBody>
-									<Datatable options={{ responsive: true }}>
-										<table className="table table-striped my-4 w-100">
-											<thead>
-												<tr>
-													<th>Tanggal</th>
-													<th>Status</th>
-													<th>Keterangan Dokumen</th>
-													<th>Dokumen Jawaban</th>
-												</tr>
-											</thead>
-											<tbody>
-												<tr>
-													<td>23/01/2022</td>
-													<td>Ditolak</td>
-													<td>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos, maxime.</td>
-													<td>
-														<em className="fa-lg far fa-file-code"></em>
-														<a className="text-muted" href="">
-															database.controller.js
-														</a>
-													</td>
-												</tr>
-												<tr>
-													<td>23/01/2022</td>
-													<td>Ditolak</td>
-													<td>Lorem ipsum dolor sit amet consectetur adipisicing.</td>
-													<td>
-														<em className="fa-lg far fa-file-code"></em>
-														<a className="text-muted" href="">
-															database.controller.js
-														</a>
-													</td>
-												</tr>
-												<tr>
-													<td>23/01/2022</td>
-													<td>Ditolak</td>
-													<td>Lorem ipsum dolor sit.</td>
-													<td>
-														<em className="fa-lg far fa-file-code"></em>
-														<a className="text-muted" href="">
-															database.controller.js
-														</a>
-													</td>
-												</tr>
-											</tbody>
-										</table>
-									</Datatable>
-								</CardBody>
-							</Card>
+							<Riwayat data={sanksi.data[0]} />
 						</Col>
 					</Row>
 				</div>
@@ -266,4 +217,4 @@ class UploadKeberatan extends Component {
 	}
 }
 
-export default UploadKeberatan;
+export default DetailKeberatan;

+ 81 - 307
pages/app/pt/keberatan/detail.js

@@ -1,37 +1,14 @@
 import React, { Component } from "react";
 import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
-import Datetime from "react-datetime";
-import moment from "moment";
-import Scrollable from "@/components/Common/Scrollable";
-import Datatable from "@/components/Tables/Datatable";
+import { getSanksi } from "@/actions/sanksi";
+import { addKeberatan } from "@/actions/keberatan";
+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 Link from "next/link";
-import {
-	Row,
-	Col,
-	Card,
-	CardHeader,
-	CardBody,
-	CardTitle,
-	FormGroup,
-	FormFeedback,
-	FormText,
-	Label,
-	InputGroup,
-	InputGroupAddon,
-	InputGroupButtonDropdown,
-	InputGroupText,
-	Input,
-	Button,
-	DropdownToggle,
-	DropdownMenu,
-	CustomInput,
-	DropdownItem,
-	Modal,
-	ModalHeader,
-	ModalBody,
-	ModalFooter,
-} from "reactstrap";
+import { Row, Col, Card, CardBody, FormGroup, Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -47,47 +24,19 @@ class DropzoneWrapper extends Component {
 	}
 }
 
-const styleHeaderText = {
-	color: "brown",
-};
-
-const selectInstanceId = 1;
-
-class FormStandard extends Component {
+class Keberatan extends Component {
 	state = {
-		dropdownOpen: false,
-		splitButtonOpen: false,
 		modal: false,
 		modal1: false,
-		keteranganLaporan: "",
-		tanggal: moment().format("D MMMM YYYY"),
 		files: [],
 	};
 
-	static getInitialProps({ query }) {
-		return { query };
+	static async getInitialProps({ query }) {
+		const { noSanksi } = query;
+		const sanksi = await getSanksi({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
+		return { query, sanksi };
 	}
 
-	setKeteranganPelaporan = (e) => {
-		this.setState({ keteranganLaporan: e.target.value });
-	};
-
-	setTanggal = (moment) => {
-		this.setState({ tanggal: moment.format("D MMMM YYYY") });
-	};
-
-	toggleDropDown = () => {
-		this.setState({
-			dropdownOpen: !this.state.dropdownOpen,
-		});
-	};
-
-	toggleSplit = () => {
-		this.setState({
-			splitButtonOpen: !this.state.splitButtonOpen,
-		});
-	};
-
 	onDrop = (files) => {
 		this.setState({
 			files: files.map((file) =>
@@ -120,20 +69,18 @@ class FormStandard extends Component {
 
 	onSubmit = async (e) => {
 		e.preventDefault();
-		const { number, ptId } = this.props.query;
+		const { noSanksi } = this.props.query;
 		const formdata = new FormData();
-		formdata.append("description", this.state.keteranganLaporan);
-		formdata.append("date", this.state.tanggal);
 		if (this.state.files.length > 0) {
 			this.state.files.forEach((e) => {
 				formdata.append("files", e);
 			});
 		}
 
-		const inserted = await insertPemeriksaan({ number, ptId }, formdata);
-		if (inserted) {
+		const added = await addKeberatan({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" }, formdata);
+		if (added) {
 			Router.push({
-				pathname: "/app/pemeriksaan",
+				pathname: "/app/pt/keberatan",
 			});
 		}
 	};
@@ -153,14 +100,16 @@ class FormStandard extends Component {
 		});
 	};
 
-	handleSimpan = () => {
+	handleKirim = (e) => {
 		this.setState({
 			modal1: !this.state.modal1,
 		});
+		this.onSubmit(e);
 	};
 
 	render() {
 		const { files } = this.state;
+		const { sanksi } = this.props;
 
 		const thumbs = files.map((file, index) => (
 			<Col md={3} key={index}>
@@ -169,19 +118,12 @@ class FormStandard extends Component {
 		));
 		return (
 			<ContentWrapper unwrap>
-				<div className="bg-cover" style={{ backgroundImage: "url(/static/img/profile-bg.png)" }}>
-					<div className="p-4 text-center" style={styleHeaderText}>
-						<img className="img-thumbnail rounded-circle thumb128" src="/static/img/univ-avatar.png" alt="Avatar" />
-						<h3 className="m-0">Universitas Satyagama</h3>
-						<p>0742/O/1990</p>
-						<p>Jalan Kamal Raya No 2-A Cengkareng</p>
-					</div>
-				</div>
+				<Header />
 				<div className="p-3">
 					<div className="content-heading">
 						<div>Permohonan Keberatan</div>
 						<div className="ml-auto">
-							<Link href="/app/pemeriksaan">
+							<Link href="/app/keberatan">
 								<button className="btn btn-sm btn-secondary text-sm">&lt; back</button>
 							</Link>
 						</div>
@@ -192,240 +134,72 @@ class FormStandard extends Component {
 								<CardBody>
 									<Row>
 										<Col lg={12}>
-											<p className="lead bb">Detail Laporan</p>
-											<form className="form-horizontal">
-												<FormGroup row>
-													<Col md="4">Nomor Laporan:</Col>
-													<Col md="8">
-														<strong>987654</strong>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">Nama Perguruan Tinggi:</Col>
-													<Col md="8">
-														<strong>Universitas Satyagama</strong>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">Jenis Pelanggaran:</Col>
-													<Col md="8">
-														<Scrollable height="75px" className="list-group">
-															<ul>
-																<li>Lorem ipsum dolor sit amet.</li>
-																<li>Lorem, ipsum dolor.</li>
-																<li>Lorem ipsum dolor sit.</li>
-															</ul>
-														</Scrollable>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">Keterangan Laporan:</Col>
-													<Col md="8">
-														<Scrollable height="100px" className="list-group">
-															<p>
-																Lorem ipsum dolor sit, amet consectetur adipisicing elit. Amet dicta placeat enim illo aspernatur adipisci neque repellendus itaque blanditiis fugit. Quam obcaecati sed
-																perferendis facere.
-															</p>
-														</Scrollable>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">Dibuat Pada:</Col>
-													<Col md="8">
-														<strong>23 Januari 2022</strong>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">Status</Col>
-													<Col md="8">
-														<div className="badge badge-info">Ditindaklanjuti</div>
-													</Col>
-												</FormGroup>
-												<FormGroup row>
-													<Col md="4">File Pendukung</Col>
-													<Col md="8">
-														<Scrollable height="120px" className="list-group">
-															<table className="table table-bordered bg-transparent">
-																<tbody>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-code"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				database.controller.js
-																			</a>
-																		</td>
-																	</tr>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-image"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				baground-lg.png
-																			</a>
-																		</td>
-																	</tr>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-code"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				picture.controller.js
-																			</a>
-																		</td>
-																	</tr>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-word"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				applicat-diagrams.docx
-																			</a>
-																		</td>
-																	</tr>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-code"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				database.controller.js
-																			</a>
-																		</td>
-																	</tr>
-																	<tr>
-																		<td>
-																			<em className="fa-lg far fa-file-code"></em>
-																		</td>
-																		<td>
-																			<a className="text-muted" href="">
-																				database.controller.js
-																			</a>
-																		</td>
-																	</tr>
-																</tbody>
-															</table>
-														</Scrollable>
-													</Col>
-												</FormGroup>
-												<Button color="primary" onClick={this.toggleModal}>
-													Ajukan Permohonan Keberatan
-												</Button>
-												<Modal isOpen={this.state.modal} toggle={this.toggleModal}>
-													{/* <ModalHeader toggle={this.toggleModal}>Banding</ModalHeader> */}
-													<ModalBody>Apakah anda akan mengajukan permohonan keberatan atas pengenaan sanksi?</ModalBody>
-													<ModalFooter>
-														<Button color="primary" onClick={this.toggleModal1}>
-															Ya
-														</Button>{" "}
-														<Button color="secondary" onClick={this.toggleModal}>
-															Tidak
-														</Button>
-													</ModalFooter>
-												</Modal>
-												<Modal isOpen={this.state.modal1} toggle={this.toggleModal1}>
-													<ModalHeader toggle={this.toggleModal1}>Upload Dokumen Permohonan Keberatan</ModalHeader>
-													<ModalBody>
-														<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
-															<FormGroup>
-																<label>Dokumen Permohonan Keberatan</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>
+											<DetailSanksi data={sanksi.data[0]} />
+											<p>Setelah membaca surat keputusan sanksi tersebut, jika Perguruan Tinggi bermaksud mengajukan permohonan keberatan maka dapat menekan tombol di bawah ini (21 Hari Kerja)</p>
+											<Button color="primary" onClick={this.toggleModal}>
+												Ajukan Permohonan Keberatan
+											</Button>
+											<Modal isOpen={this.state.modal} toggle={this.toggleModal}>
+												{/* <ModalHeader toggle={this.toggleModal}>Banding</ModalHeader> */}
+												<ModalBody>Apakah anda akan mengajukan permohonan keberatan atas pengenaan sanksi?</ModalBody>
+												<ModalFooter>
+													<Button color="primary" onClick={this.toggleModal1}>
+														Ya
+													</Button>{" "}
+													<Button color="secondary" onClick={this.toggleModal}>
+														Tidak
+													</Button>
+												</ModalFooter>
+											</Modal>
+											<Modal isOpen={this.state.modal1} toggle={this.toggleModal1}>
+												<ModalHeader toggle={this.toggleModal1}>Unggah Dokumen Permohonan Keberatan</ModalHeader>
+												<ModalBody>
+													<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
+														<FormGroup>
+															<label>Dalam hal mengajukan permohonan keberatan maka wajib mengunggah dokumen pendukungnya</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>
-																			);
-																		}}
-																	</DropzoneWrapper>
-																	<span className="form-text">Multiple files upload</span>
-																</div>
-															</FormGroup>
-														</form>
-													</ModalBody>
-													<ModalFooter>
-														<Button color="primary" onClick={this.handleSimpan}>
-															Kirim
-														</Button>{" "}
-													</ModalFooter>
-												</Modal>
-											</form>
+																			</div>
+																		);
+																	}}
+																</DropzoneWrapper>
+																<span className="form-text">Multiple files upload</span>
+															</div>
+														</FormGroup>
+													</form>
+												</ModalBody>
+												<ModalFooter>
+													<Button color="primary" onClick={this.handleKirim}>
+														Kirim
+													</Button>
+												</ModalFooter>
+											</Modal>
 										</Col>
-										{/* <Col lg={6}>
-											<p className="lead bb">Permohonan Keberatan</p>
-											<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
-												<FormGroup>
-													<label>Upload dokumen</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">
-															Kirim
-														</button>
-													</div>
-												</FormGroup>
-											</form>
-										</Col> */}
 									</Row>
 								</CardBody>
 							</Card>
-							{/* END card */}
 						</Col>
 						<Col xl="3">
-							<div className="card card-default">
-								<div className="card-body">
-									<div className="text-center">
-										<h3 className="mt-0">Universitas Satyagama</h3>
-										<p>0742/O/1990</p>
-									</div>
-									<hr />
-									<ul className="list-unstyled px-4">
-										<li>
-											<em className="fa fa-globe fa-fw mr-3"></em>www.satyagama.ac.id
-										</li>
-										<li>
-											<em className="fa fa-graduation-cap fa-fw mr-3"></em>Status Pelanggaran : Tidak Ada
-										</li>
-									</ul>
-								</div>
-							</div>
+							<DetailPT />
+						</Col>
+					</Row>
+					<Row>
+						<Col>
+							<Riwayat data={sanksi.data[0]} />
 						</Col>
 					</Row>
 				</div>
@@ -434,4 +208,4 @@ class FormStandard extends Component {
 	}
 }
 
-export default FormStandard;
+export default Keberatan;

+ 8 - 82
pages/app/pt/keberatan/index.js

@@ -1,101 +1,27 @@
 import React, { Component } from "react";
-import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
-import { Row, Col, Progress, Modal, ModalHeader, ModalBody, ModalFooter, Button, Table } from "reactstrap";
-import { getPelaporan } from "../../../../actions/pelaporan";
-
-import Sparkline from "@/components/Common/Sparklines";
-import Datatable from "@/components/Tables/Datatable";
-import moment from "moment";
+import { Row, Col } from "reactstrap";
+import { getSanksi } from "@/actions/sanksi";
+import TableSanksi from "@/components/PT/TableSanksi";
 
 class Keberatan extends Component {
 	constructor(props) {
 		super(props);
-		this.state = {
-			modal: false,
-		};
 	}
 
-	// static getInitialProps = async () => {
-	// 	const pelaporan = await getPelaporan();
-	// 	return { pelaporan };
-	// };
-
-	detailKeberatanClick = (e, ptId, number) => {
-		e.preventDefault();
-		Router.push({
-			pathname: "/app/pt/keberatan/detail",
-		});
+	static getInitialProps = async () => {
+		const sanksi = await getSanksi();
+		return { sanksi };
 	};
 
 	render() {
-		console.log(this.state);
-		// const { pelaporan } = this.props;
+		const { sanksi } = this.props;
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Permohonan Keberatan</div>
 				<Row>
 					<Col lg={12}>
-						<div className="card b">
-							<div className="card-body">
-								<Table options={{ responsive: true }}>
-									{/* <table className="table w-100"> */}
-									<thead>
-										<tr>
-											<th>#ID</th>
-											<th>Description</th>
-											<th>Created</th>
-											<th>Status</th>
-											<th></th>
-										</tr>
-									</thead>
-									<tbody>
-										{/* {pelaporan.data.map((value) => {
-											return ( */}
-										<tr key={1}>
-											<td>BI:408066447929</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">Universitas Satyagama</h4>
-															<small className="text-muted">0742/O/1990 - www.satyagama.ac.id - info@satyagama.ac.id</small>
-															<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Reprehenderit, animi?</p>
-														</div>
-													</div>
-												</div>
-											</td>
-											<td>{moment().fromNow()}</td>
-											<td>
-												<div className="inline wd-xxs badge badge-success">open</div>
-											</td>
-											<td>
-												<Button color="primary" onClick={(e) => this.detailKeberatanClick(e)}>
-													Detail
-												</Button>
-
-												{/* <Swal options={this.state.swalOption} callback={this.swalCallback} className="btn btn-primary">
-															Ajukan
-														</Swal> */}
-												{/* START card */}
-												{/* Button trigger modal */}
-												{/* <Button color="primary" onClick={(e) => this.permohonanClick(e, value.pt_id, value.number)}>
-															Ajukan
-														</Button> */}
-												{/* END card */}
-												{/* <Button onClick={(e) => this.permohonanClick(e, value.pt_id, value.number)} className="btn-primary">
-															Ajukan
-														</Button> */}
-											</td>
-										</tr>
-										{/* );
-										})} */}
-									</tbody>
-									{/* </table> */}
-								</Table>
-							</div>
-						</div>
+						<TableSanksi listData={sanksi.data} to="/app/pt/keberatan/detail" linkName="Detail" />
 					</Col>
 				</Row>
 			</ContentWrapper>