|  | @@ -7,13 +7,22 @@ import Header from "@/components/Main/Header";
 | 
	
		
			
				|  |  |  import DetailPT from "@/components/Main/DetailPT";
 | 
	
		
			
				|  |  |  import PermohonanPT from "@/components/Main/PermohonanPT";
 | 
	
		
			
				|  |  |  import Riwayat from "@/components/PencabutanSanksi/Riwayat";
 | 
	
		
			
				|  |  | -import { getSanksi } from "@/actions/sanksi";
 | 
	
		
			
				|  |  | +import { getOneSanksi } from "@/actions/sanksi";
 | 
	
		
			
				|  |  |  import { addJawabanCabutSanksi } from "@/actions/cabutSanksi";
 | 
	
		
			
				|  |  |  import ContentWrapper from "@/components/Layout/ContentWrapper";
 | 
	
		
			
				|  |  |  import { Row, Col, Card, CardBody, FormGroup, Button, Input, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
 | 
	
		
			
				|  |  |  import { getPT } from "@/actions/PT";
 | 
	
		
			
				|  |  |  import Loader from "@/components/Common/Loader";
 | 
	
		
			
				|  |  |  import { toast } from "react-toastify";
 | 
	
		
			
				|  |  | +import { connect } from "react-redux";
 | 
	
		
			
				|  |  | +import { Formik, Form, Field, ErrorMessage } from "formik";
 | 
	
		
			
				|  |  | +import * as Yup from "yup";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const jawabanCabutSanksiSchema = Yup.object().shape({
 | 
	
		
			
				|  |  | +	status: Yup.string().required("Harap Diisi"),
 | 
	
		
			
				|  |  | +	keterangan: Yup.string().max(200).notRequired(),
 | 
	
		
			
				|  |  | +	dokumen: Yup.array().notRequired(),
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  let Dropzone = null;
 | 
	
		
			
				|  |  |  class DropzoneWrapper extends Component {
 | 
	
	
		
			
				|  | @@ -39,19 +48,18 @@ class JawabanPencabutanSanksi extends Component {
 | 
	
		
			
				|  |  |  			files: [],
 | 
	
		
			
				|  |  |  			keterangan: "",
 | 
	
		
			
				|  |  |  			sanksi: {},
 | 
	
		
			
				|  |  | -			pt: {},
 | 
	
		
			
				|  |  | +			pt: null,
 | 
	
		
			
				|  |  | +			data: {},
 | 
	
		
			
				|  |  |  		};
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	static getInitialProps = async ({ query }) => {
 | 
	
		
			
				|  |  | -		return { query };
 | 
	
		
			
				|  |  | -	};
 | 
	
		
			
				|  |  | +	static getInitialProps = async ({ query }) => ({ query });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	componentDidMount = async () => {
 | 
	
		
			
				|  |  | -		const { query } = this.props;
 | 
	
		
			
				|  |  | -		const sanksi = await getSanksi(query);
 | 
	
		
			
				|  |  | -		const pt = await getPT({ id: query.ptId });
 | 
	
		
			
				|  |  | -		this.setState({ pt, sanksi });
 | 
	
		
			
				|  |  | +		const { query, token } = this.props;
 | 
	
		
			
				|  |  | +		const sanksi = await getOneSanksi(token, query.id);
 | 
	
		
			
				|  |  | +		const pt = sanksi.data.laporan.pt;
 | 
	
		
			
				|  |  | +		this.setState({ sanksi, pt });
 | 
	
		
			
				|  |  |  	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	toggleModal = () => {
 | 
	
	
		
			
				|  | @@ -98,26 +106,25 @@ class JawabanPencabutanSanksi extends Component {
 | 
	
		
			
				|  |  |  		this.setState({ keterangan: e.target.value });
 | 
	
		
			
				|  |  |  	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	handleSimpan = async (e) => {
 | 
	
		
			
				|  |  | -		e.preventDefault();
 | 
	
		
			
				|  |  | -		const { selectedOption, keterangan } = this.state;
 | 
	
		
			
				|  |  | -		const { noSanksi, ptId } = this.props.query;
 | 
	
		
			
				|  |  | +	handleSimpan = async () => {
 | 
	
		
			
				|  |  | +		const { data } = this.state;
 | 
	
		
			
				|  |  | +		console.log(data);
 | 
	
		
			
				|  |  | +		const { token, query } = this.props;
 | 
	
		
			
				|  |  |  		const formdata = new FormData();
 | 
	
		
			
				|  |  | -		formdata.append("status", selectedOption.value);
 | 
	
		
			
				|  |  | -		formdata.append("description", keterangan);
 | 
	
		
			
				|  |  | -		if (this.state.files.length > 0) {
 | 
	
		
			
				|  |  | -			this.state.files.forEach((e) => {
 | 
	
		
			
				|  |  | -				formdata.append("files", e);
 | 
	
		
			
				|  |  | +		formdata.append("status", data.status);
 | 
	
		
			
				|  |  | +		formdata.append("keterangan", data.keterangan);
 | 
	
		
			
				|  |  | +		this.state.files.forEach((e) => {
 | 
	
		
			
				|  |  | +			formdata.append("dokumen", e);
 | 
	
		
			
				|  |  | +		});
 | 
	
		
			
				|  |  | +		const toastid = toast.loading("Please wait...");
 | 
	
		
			
				|  |  | +		const added = await addJawabanCabutSanksi(token, query.id, formdata);
 | 
	
		
			
				|  |  | +		if (!added) {
 | 
	
		
			
				|  |  | +			toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
 | 
	
		
			
				|  |  | +			Router.push({
 | 
	
		
			
				|  |  | +				pathname: "/app/pencabutan-sanksi",
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  | -			const id = toast.loading("Please wait...");
 | 
	
		
			
				|  |  | -			const added = await addJawabanCabutSanksi({ noSanksi, ptId }, formdata);
 | 
	
		
			
				|  |  | -			// console.log(added);
 | 
	
		
			
				|  |  | -			if (added) {
 | 
	
		
			
				|  |  | -				toast.update(id, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
 | 
	
		
			
				|  |  | -				Router.push({
 | 
	
		
			
				|  |  | -					pathname: "/app/pencabutan-sanksi",
 | 
	
		
			
				|  |  | -				});
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	};
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -149,69 +156,104 @@ class JawabanPencabutanSanksi extends Component {
 | 
	
		
			
				|  |  |  									<CardBody>
 | 
	
		
			
				|  |  |  										<Row>
 | 
	
		
			
				|  |  |  											<Col lg={12}>
 | 
	
		
			
				|  |  | -												<DetailSanksi data={sanksi.data[0]} />
 | 
	
		
			
				|  |  | -												<PermohonanPT data={sanksi.data[0].sanksi.cabut_sanksi} />
 | 
	
		
			
				|  |  | +												<DetailSanksi data={sanksi.data} />
 | 
	
		
			
				|  |  | +												<PermohonanPT data={sanksi.data.pengajuan.cabut_sanksi} />
 | 
	
		
			
				|  |  |  												<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: "Diterima", label: "Diterima", className: "State-ACT" },
 | 
	
		
			
				|  |  | -																	{ value: "Rekomendasi Perbaikan", label: "Rekomendasi Perbaikan", className: "State-ACT" },
 | 
	
		
			
				|  |  | -																]}
 | 
	
		
			
				|  |  | -																required
 | 
	
		
			
				|  |  | -															/>
 | 
	
		
			
				|  |  | -															{/* <span className="form-text">Pilih Jenis Pelanggaran</span> */}
 | 
	
		
			
				|  |  | -														</div>
 | 
	
		
			
				|  |  | -													</FormGroup>
 | 
	
		
			
				|  |  | -													{selectedOption && selectedOption.value === "Rekomendasi Perbaikan" ? (
 | 
	
		
			
				|  |  | -														<FormGroup>
 | 
	
		
			
				|  |  | -															<label className="row-form-label">Keterangan:</label>
 | 
	
		
			
				|  |  | -															<div className="row-md-10">
 | 
	
		
			
				|  |  | -																<Input type="textarea" value={this.state.keterangan} onChange={this.setKeterangan} required />
 | 
	
		
			
				|  |  | -																{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
 | 
	
		
			
				|  |  | -															</div>
 | 
	
		
			
				|  |  | -														</FormGroup>
 | 
	
		
			
				|  |  | -													) : (
 | 
	
		
			
				|  |  | -														""
 | 
	
		
			
				|  |  | +												<Formik
 | 
	
		
			
				|  |  | +													initialValues={{
 | 
	
		
			
				|  |  | +														status: "",
 | 
	
		
			
				|  |  | +														keterangan: "",
 | 
	
		
			
				|  |  | +														dokumen: [],
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  | +													validationSchema={jawabanCabutSanksiSchema}
 | 
	
		
			
				|  |  | +													onSubmit={async (data) => {
 | 
	
		
			
				|  |  | +														this.setState({ data });
 | 
	
		
			
				|  |  | +														if (sanksi.data.jawaban?.cabut_sanksi) this.toggleModal();
 | 
	
		
			
				|  |  | +														else await this.handleSimpan();
 | 
	
		
			
				|  |  | +													}}
 | 
	
		
			
				|  |  | +												>
 | 
	
		
			
				|  |  | +													{() => (
 | 
	
		
			
				|  |  | +														<Form className="form-horizontal">
 | 
	
		
			
				|  |  | +															<FormGroup>
 | 
	
		
			
				|  |  | +																<label className="row-form-label">Status:</label>
 | 
	
		
			
				|  |  | +																<div className="row-md-10">
 | 
	
		
			
				|  |  | +																	<Field name="status">
 | 
	
		
			
				|  |  | +																		{({ field, form }) => (
 | 
	
		
			
				|  |  | +																			<Select
 | 
	
		
			
				|  |  | +																				instanceId={selectInstanceId + 1}
 | 
	
		
			
				|  |  | +																				value={this.state.selectedOption}
 | 
	
		
			
				|  |  | +																				onChange={(e) => {
 | 
	
		
			
				|  |  | +																					this.handleChangeSelect(e);
 | 
	
		
			
				|  |  | +																					form.setFieldValue(field.name, e.value);
 | 
	
		
			
				|  |  | +																				}}
 | 
	
		
			
				|  |  | +																				options={[
 | 
	
		
			
				|  |  | +																					{ value: "Diterima", label: "Diterima", className: "State-ACT" },
 | 
	
		
			
				|  |  | +																					{ value: "Rekomendasi Perbaikan", label: "Rekomendasi Perbaikan", className: "State-ACT" },
 | 
	
		
			
				|  |  | +																				]}
 | 
	
		
			
				|  |  | +																			/>
 | 
	
		
			
				|  |  | +																		)}
 | 
	
		
			
				|  |  | +																	</Field>
 | 
	
		
			
				|  |  | +																	<ErrorMessage name="status" component="div" className="form-text text-danger" />
 | 
	
		
			
				|  |  | +																	{/* <span className="form-text">Pilih Jenis Pelanggaran</span> */}
 | 
	
		
			
				|  |  | +																</div>
 | 
	
		
			
				|  |  | +															</FormGroup>
 | 
	
		
			
				|  |  | +															{selectedOption && selectedOption.value === "Rekomendasi Perbaikan" ? (
 | 
	
		
			
				|  |  | +																<FormGroup>
 | 
	
		
			
				|  |  | +																	<label className="row-form-label">Keterangan:</label>
 | 
	
		
			
				|  |  | +																	<div className="row-md-10">
 | 
	
		
			
				|  |  | +																		<Field name="keterangan">{({ field }) => <Input type="textarea" {...field} />}</Field>
 | 
	
		
			
				|  |  | +																		<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
 | 
	
		
			
				|  |  | +																		{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
 | 
	
		
			
				|  |  | +																	</div>
 | 
	
		
			
				|  |  | +																</FormGroup>
 | 
	
		
			
				|  |  | +															) : (
 | 
	
		
			
				|  |  | +																""
 | 
	
		
			
				|  |  | +															)}
 | 
	
		
			
				|  |  | +															<FormGroup>
 | 
	
		
			
				|  |  | +																<label className="row-form-label">Upload Dokumen:</label>
 | 
	
		
			
				|  |  | +																<div className="row-md-10">
 | 
	
		
			
				|  |  | +																	<Field name="dokumen">
 | 
	
		
			
				|  |  | +																		{({ field, form }) => (
 | 
	
		
			
				|  |  | +																			<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 {...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>
 | 
	
		
			
				|  |  | +																<div className="row-xl-10">
 | 
	
		
			
				|  |  | +																	<Button color="primary" type="submit">
 | 
	
		
			
				|  |  | +																		Simpan
 | 
	
		
			
				|  |  | +																	</Button>
 | 
	
		
			
				|  |  | +																</div>
 | 
	
		
			
				|  |  | +															</FormGroup>
 | 
	
		
			
				|  |  | +														</Form>
 | 
	
		
			
				|  |  |  													)}
 | 
	
		
			
				|  |  | -													<FormGroup>
 | 
	
		
			
				|  |  | -														<label className="row-form-label">Upload Dokumen:</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={sanksi.data && sanksi.data.length && sanksi.data[0].sanksi.cabut_sanksi.jawaban ? this.toggleModal : this.handleSimpan}>
 | 
	
		
			
				|  |  | -																Simpan
 | 
	
		
			
				|  |  | -															</Button>
 | 
	
		
			
				|  |  | -														</div>
 | 
	
		
			
				|  |  | -													</FormGroup>
 | 
	
		
			
				|  |  | -												</form>
 | 
	
		
			
				|  |  | +												</Formik>
 | 
	
		
			
				|  |  |  											</Col>
 | 
	
		
			
				|  |  |  										</Row>
 | 
	
		
			
				|  |  |  									</CardBody>
 | 
	
	
		
			
				|  | @@ -220,12 +262,12 @@ class JawabanPencabutanSanksi extends Component {
 | 
	
		
			
				|  |  |  						) : (
 | 
	
		
			
				|  |  |  							<Loader />
 | 
	
		
			
				|  |  |  						)}
 | 
	
		
			
				|  |  | -						<Col xl="3">{pt.data ? <DetailPT data={pt.data[0]} /> : <Loader />}</Col>
 | 
	
		
			
				|  |  | +						<Col xl="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>
 | 
	
		
			
				|  |  |  					</Row>
 | 
	
		
			
				|  |  |  					{sanksi.data && (
 | 
	
		
			
				|  |  |  						<Row>
 | 
	
		
			
				|  |  |  							<Col>
 | 
	
		
			
				|  |  | -								<Riwayat data={sanksi.data[0]} />
 | 
	
		
			
				|  |  | +								<Riwayat data={sanksi.data.jawaban.cabut_sanksi} />
 | 
	
		
			
				|  |  |  							</Col>
 | 
	
		
			
				|  |  |  						</Row>
 | 
	
		
			
				|  |  |  					)}
 | 
	
	
		
			
				|  | @@ -246,4 +288,5 @@ class JawabanPencabutanSanksi extends Component {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -export default JawabanPencabutanSanksi;
 | 
	
		
			
				|  |  | +const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 | 
	
		
			
				|  |  | +export default connect(mapStateToProps)(JawabanPencabutanSanksi);
 |