|
@@ -7,13 +7,22 @@ import Header from "@/components/Main/Header";
|
|
|
import DetailPT from "@/components/Main/DetailPT";
|
|
import DetailPT from "@/components/Main/DetailPT";
|
|
|
import PermohonanPT from "@/components/Main/PermohonanPT";
|
|
import PermohonanPT from "@/components/Main/PermohonanPT";
|
|
|
import Riwayat from "@/components/PencabutanSanksi/Riwayat";
|
|
import Riwayat from "@/components/PencabutanSanksi/Riwayat";
|
|
|
-import { getSanksi } from "@/actions/sanksi";
|
|
|
|
|
|
|
+import { getOneSanksi } from "@/actions/sanksi";
|
|
|
import { addJawabanCabutSanksi } from "@/actions/cabutSanksi";
|
|
import { addJawabanCabutSanksi } from "@/actions/cabutSanksi";
|
|
|
import ContentWrapper from "@/components/Layout/ContentWrapper";
|
|
import ContentWrapper from "@/components/Layout/ContentWrapper";
|
|
|
import { Row, Col, Card, CardBody, FormGroup, Button, Input, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
|
|
import { Row, Col, Card, CardBody, FormGroup, Button, Input, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
|
|
|
import { getPT } from "@/actions/PT";
|
|
import { getPT } from "@/actions/PT";
|
|
|
import Loader from "@/components/Common/Loader";
|
|
import Loader from "@/components/Common/Loader";
|
|
|
import { toast } from "react-toastify";
|
|
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;
|
|
let Dropzone = null;
|
|
|
class DropzoneWrapper extends Component {
|
|
class DropzoneWrapper extends Component {
|
|
@@ -39,19 +48,18 @@ class JawabanPencabutanSanksi extends Component {
|
|
|
files: [],
|
|
files: [],
|
|
|
keterangan: "",
|
|
keterangan: "",
|
|
|
sanksi: {},
|
|
sanksi: {},
|
|
|
- pt: {},
|
|
|
|
|
|
|
+ pt: null,
|
|
|
|
|
+ data: {},
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static getInitialProps = async ({ query }) => {
|
|
|
|
|
- return { query };
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ static getInitialProps = async ({ query }) => ({ query });
|
|
|
|
|
|
|
|
componentDidMount = async () => {
|
|
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 = () => {
|
|
toggleModal = () => {
|
|
@@ -98,26 +106,25 @@ class JawabanPencabutanSanksi extends Component {
|
|
|
this.setState({ keterangan: e.target.value });
|
|
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();
|
|
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>
|
|
<CardBody>
|
|
|
<Row>
|
|
<Row>
|
|
|
<Col lg={12}>
|
|
<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>
|
|
<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>
|
|
</Col>
|
|
|
</Row>
|
|
</Row>
|
|
|
</CardBody>
|
|
</CardBody>
|
|
@@ -220,12 +262,12 @@ class JawabanPencabutanSanksi extends Component {
|
|
|
) : (
|
|
) : (
|
|
|
<Loader />
|
|
<Loader />
|
|
|
)}
|
|
)}
|
|
|
- <Col xl="3">{pt.data ? <DetailPT data={pt.data[0]} /> : <Loader />}</Col>
|
|
|
|
|
|
|
+ <Col xl="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>
|
|
|
</Row>
|
|
</Row>
|
|
|
{sanksi.data && (
|
|
{sanksi.data && (
|
|
|
<Row>
|
|
<Row>
|
|
|
<Col>
|
|
<Col>
|
|
|
- <Riwayat data={sanksi.data[0]} />
|
|
|
|
|
|
|
+ <Riwayat data={sanksi.data.jawaban.cabut_sanksi} />
|
|
|
</Col>
|
|
</Col>
|
|
|
</Row>
|
|
</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);
|