Redudansi.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import React, { Component } from "react";
  2. import { Row, Col, Input, FormGroup, Label, Progress, Button } from "reactstrap";
  3. import Select from "react-select";
  4. import Swal from "sweetalert2";
  5. import * as Yup from "yup";
  6. import { connect } from "react-redux";
  7. import { Formik, Form, Field, ErrorMessage } from "formik";
  8. import { updateLaporan } from "../../actions/pelaporan"
  9. import { getCsrf } from "../../actions/security";
  10. import { ToastContainer, toast } from "react-toastify";
  11. import Router from "next/router";
  12. import { createLog } from "../../actions/log";
  13. const checkIfFilesAreTooBig = (files) => {
  14. let valid = true;
  15. if (files) {
  16. files.map((file) => {
  17. if (file.size > 15 * 1024 * 1024) {
  18. valid = false;
  19. }
  20. });
  21. }
  22. return valid;
  23. };
  24. let Dropzone = null;
  25. class DropzoneWrapper extends Component {
  26. state = {
  27. isClient: false,
  28. };
  29. componentDidMount = () => {
  30. Dropzone = require("react-dropzone").default;
  31. this.setState({ isClient: true });
  32. };
  33. render() {
  34. return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
  35. }
  36. }
  37. const ditutupSchema = Yup.object().shape({
  38. keterangan: Yup.string().required("Harus diisi"),
  39. dokumen: Yup.array().test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
  40. });
  41. const status = [
  42. { value: "Sanksi", label: "Sanksi", className: "State-ACT" },
  43. { value: "Ditutup", label: "Ditutup", className: "State-ACT" },
  44. ];
  45. export class Redudansi extends Component {
  46. constructor(props) {
  47. super(props);
  48. const tmt_awal = new Date();
  49. this.state = {
  50. files: [],
  51. keterangan: "",
  52. selectedOption: null,
  53. };
  54. }
  55. async componentDidMount() {
  56. this.defaultStatus();
  57. }
  58. defaultStatus = async () => {
  59. return this.setState({ selectedOption: status[0] });
  60. };
  61. handleChangeSelect = (selectedOption) => this.setState({ selectedOption }, this.setDataStatusLaporan);
  62. // handleChangeSelect = (selectedOption) => {
  63. // this.state.selectedOption = selectedOption
  64. // this.setDataStatusLaporan()
  65. // }
  66. getStatus = () => (status);
  67. onDrop = (selectedFile) => {
  68. this.setState({
  69. selectedFile: selectedFile.map((file) =>
  70. Object.assign(file, {
  71. preview: URL.createObjectURL(file),
  72. })
  73. ),
  74. stat: "Added " + selectedFile.length + " file(s)",
  75. });
  76. const selectFile = this.state.selectedFile
  77. this.setState(prevState => ({
  78. files: [...prevState.files, ...selectFile]
  79. }))
  80. };
  81. logDitutup = async () => {
  82. const getToken = await getCsrf();
  83. const _csrf = getToken.token;
  84. const { token } = this.props;
  85. await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${this.props.id}`, _csrf: _csrf, menu: "Sanksi" });
  86. }
  87. handleTutupLaporan = async (data, value) => {
  88. if (this.props.role === 2024) {
  89. Swal.fire({
  90. icon: 'error',
  91. title: 'Oops...',
  92. html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
  93. confirmButtonColor: "#3e3a8e",
  94. confirmButtonText: 'Oke'
  95. })
  96. } else {
  97. const getToken = await getCsrf();
  98. const _csrf = getToken.token;
  99. const { token } = this.props;
  100. const formdata = new FormData();
  101. formdata.append("keterangan", data.keterangan);
  102. this.state.files.forEach((e) => {
  103. formdata.append("dokumen", e);
  104. });
  105. formdata.append("aktif", "false");
  106. await toast.promise(updateLaporan(token, this.props.id, formdata, _csrf + `&redudansi=true`), {
  107. pending: "Loading",
  108. success: {
  109. render: "success",
  110. autoClose: 1000
  111. },
  112. error: "Error",
  113. });
  114. await this.logDitutup()
  115. await Router.push({
  116. pathname: "/app/sanksi",
  117. });
  118. }
  119. };
  120. setDataStatusLaporan = () => {
  121. this.props.setDataStatusLaporan(this.state)
  122. }
  123. render() {
  124. const { files, selectedOption } = this.state;
  125. const removeFile = file => () => {
  126. const newFiles = [...files]
  127. newFiles.splice(newFiles.indexOf(file), 1)
  128. this.setState({
  129. files: newFiles,
  130. });
  131. }
  132. const thumbs = files.map((file, index) => (
  133. <p>
  134. <em className="far fa-file" />&nbsp;&nbsp;{file.name}
  135. <button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
  136. </p>
  137. ));
  138. return (
  139. <>
  140. <Formik
  141. enableReinitialize={true}
  142. initialValues={{
  143. status: this.getStatus()[0],
  144. keterangan: "",
  145. dokumen: [],
  146. }}
  147. validationSchema={selectedOption?.value === this.getStatus()[1].value ? ditutupSchema : null}
  148. onSubmit={this.handleTutupLaporan}
  149. >
  150. {({ isSubmitting }) => (
  151. <Form>
  152. <FormGroup row>
  153. <label className="col-md-2 col-form-label font-weight-bold font-color-black">Status Laporan</label>
  154. <div className="col-md-10">
  155. <Field name="status">
  156. {({ field, form }) => (
  157. <Select
  158. value={field.value}
  159. onChange={(e) => {
  160. form.setFieldValue(field.name, e);
  161. this.handleChangeSelect(e);
  162. }}
  163. options={this.getStatus()}
  164. required
  165. />
  166. )}
  167. </Field>
  168. <ErrorMessage name="status" component="div" className="form-text text-danger" />
  169. </div>
  170. </FormGroup>
  171. {selectedOption?.value === this.getStatus()[0].value ? (
  172. ""
  173. ) : (
  174. <div>
  175. <FormGroup row>
  176. <label className="col-md-2 col-form-label">Keterangan<span className=" text-danger">*</span></label>
  177. <div className="col-md-10">
  178. <Field name="keterangan">{({ field, form }) => <Input type="text" placeholder="Keterangan" {...field} />}</Field>
  179. <ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
  180. </div>
  181. </FormGroup>
  182. <FormGroup row>
  183. <label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
  184. <div className="col-md-10">
  185. <Field name="dokumen">
  186. {({ field, form, meta }) => (
  187. <DropzoneWrapper
  188. className=""
  189. onDrop={(e) => {
  190. this.onDrop(e);
  191. form.setFieldValue(field.name, e);
  192. }}
  193. >
  194. {({ getRootProps, getInputProps, isDragActive }) => {
  195. return (
  196. <div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
  197. <input name="dokumen" {...getInputProps()} />
  198. <div className="dropzone-style-1">
  199. <div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
  200. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  201. <h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
  202. </div> :
  203. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  204. <h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
  205. </div>
  206. }
  207. </div>
  208. </div>
  209. <div className="d-flex align-items-center">
  210. <small className="ml-auto">
  211. <button
  212. type="button"
  213. className="btn btn-link"
  214. onClick={(e) => {
  215. this.clearFiles(e);
  216. form.setFieldValue(field.name, []);
  217. }}
  218. >
  219. Reset dokumen
  220. </button>
  221. </small>
  222. </div>
  223. </div>
  224. );
  225. }}
  226. </DropzoneWrapper>
  227. )}
  228. </Field>
  229. {thumbs}
  230. <ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
  231. <p className="mrgn-top-5 font-color-black">
  232. Ukuran setiap dokumen maksimal 15mb
  233. </p>
  234. </div>
  235. <FormGroup>
  236. <div className="col-xl-10">
  237. <Button color className="btn-login width-133 mt-4" type="submit" disabled={isSubmitting}>
  238. <span className="font-color-white">
  239. Tutup Laporan
  240. </span>
  241. </Button>
  242. </div>
  243. </FormGroup>
  244. </FormGroup>
  245. </div>
  246. )}
  247. </Form>
  248. )}
  249. </Formik>
  250. </>
  251. );
  252. }
  253. }
  254. // const mapStateToProps = (state) => ({ user: state.user, token: state.token });
  255. // export default connect(mapStateToProps)(Redudansi);
  256. export default Redudansi