UploadSurat.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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 DatePicker from "react-datepicker";
  5. import "react-datepicker/dist/react-datepicker.css";
  6. // import "react-datepicker/dist/react-datepicker.css";
  7. import ms from "ms";
  8. import { addDays, addMonths } from 'date-fns';
  9. import id from 'date-fns/locale/id';
  10. // registerLocale('id', id)
  11. import { getAutoSave, inputAutoSave } from "@/actions/autosave";
  12. import ComponentToPrint from "./SuratBA_A";
  13. import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
  14. let Dropzone = null;
  15. class DropzoneWrapper extends Component {
  16. state = {
  17. isClient: false,
  18. };
  19. componentDidMount = () => {
  20. Dropzone = require("react-dropzone").default;
  21. this.setState({ isClient: true });
  22. };
  23. render() {
  24. return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
  25. }
  26. }
  27. const formatOptionLabel = ({ value, sanksi, label_sanksi }) => (
  28. <div style={{ display: "flex" }}>
  29. <span className="">{value}</span>
  30. <div style={{ marginLeft: "10px", color: "#adaca8" }}>{label_sanksi}</div>
  31. </div>
  32. );
  33. export class UploadSurat extends Component {
  34. constructor(props) {
  35. super(props);
  36. const tmt_awal = new Date();
  37. this.state = {
  38. files: [],
  39. nomorSanksi: "",
  40. keterangan: "",
  41. listSanksi: "",
  42. startDay: tmt_awal,
  43. maxDay: "",
  44. isiTmt: "",
  45. awalsanksi: "",
  46. akhirsanksi: "",
  47. tmtCheck: false,
  48. terimaSuratSanksi: "",
  49. tglAkhirKeberatan: "",
  50. filesTandaTerimaSS: [],
  51. };
  52. }
  53. onDrop = (files) => {
  54. this.setState({
  55. files: files.map((file) =>
  56. Object.assign(file, {
  57. preview: URL.createObjectURL(file),
  58. })
  59. ),
  60. stat: "Added " + files.length + " file(s)",
  61. });
  62. this.props.setUploadSuratSanksi(this.state);
  63. };
  64. onDropTandaTerimaSS = (filesTandaTerimaSS) => {
  65. this.setState({
  66. filesTandaTerimaSS: filesTandaTerimaSS.map((file) =>
  67. Object.assign(file, {
  68. preview: URL.createObjectURL(file),
  69. })
  70. ),
  71. stat: "file tanda terima sanksi " + filesTandaTerimaSS.length + " file",
  72. });
  73. this.props.setUploadSuratSanksi(this.state);
  74. };
  75. componentDidMount = async () => {
  76. const { query, token } = this.props;
  77. const { id } = query;
  78. // const getDataSave = await getAutoSave({ id, laporan: true });
  79. // const autosaveDataUpload = getDataSave.data?.PenetapanSanksi?.dataUpload;
  80. // this.setState(autosaveDataUpload)
  81. }
  82. uploadFiles = (e) => {
  83. e.preventDefault();
  84. e.stopPropagation();
  85. this.setState({
  86. stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.",
  87. });
  88. this.props.setUploadSuratSanksi(this.state);
  89. };
  90. clearFiles = (e) => {
  91. e.preventDefault();
  92. e.stopPropagation();
  93. this.setState({
  94. stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.",
  95. });
  96. this.setState({
  97. files: [],
  98. });
  99. this.props.setUploadSuratSanksi(this.state);
  100. };
  101. clearFilesTerimaSanksi = (e) => {
  102. e.preventDefault();
  103. e.stopPropagation();
  104. this.setState({
  105. stat: this.state.filesTandaTerimaSS.length ? this.state.filesTandaTerimaSS.length + " file(s) cleared." : "No files to clear.",
  106. });
  107. this.setState({
  108. filesTandaTerimaSS: [],
  109. });
  110. this.props.setUploadSuratSanksi(this.state);
  111. };
  112. // handleAutoSave = () => {
  113. // this.props.handleAutoSave()
  114. // }
  115. setUploadSuratSanksi = () => {
  116. this.props.setUploadSuratSanksi(this.state);
  117. };
  118. setNomorSanksi = (e) => {
  119. // this.setState({ nomorSanksi: e.target.value }, this.setUploadSuratSanksi);
  120. this.state.nomorSanksi = e.target.value
  121. this.setUploadSuratSanksi()
  122. // this.handleAutoSave()
  123. };
  124. setKeterangan = (e) => {
  125. // this.setState({ keterangan: e.target.value }, this.setUploadSuratSanksi);
  126. this.state.keterangan = e.target.value
  127. this.setUploadSuratSanksi()
  128. // this.handleAutoSave()
  129. };
  130. setAkhirSanksi = (akhirsanksi) => {
  131. // this.setState({ keterangan: e.target.value }, this.setUploadSuratSanksi);
  132. this.state.akhirsanksi = akhirsanksi
  133. this.setUploadSuratSanksi()
  134. // this.handleAutoSave()
  135. };
  136. setListSanksi = (ls) => {
  137. this.setState({ listSanksi: ls.target.value }, this.setUploadSuratSanksi);
  138. };
  139. handleChangeListSanksi = (listSanksi) => {
  140. this.setState({ listSanksi }, this.setUploadSuratSanksi);
  141. };
  142. handleTmtCheck = () => {
  143. // this.setState({ tmtCheck: !this.state.tmtCheck }, this.setUploadSuratSanksi);
  144. this.state.tmtCheck = !this.state.tmtCheck
  145. this.setUploadSuratSanksi()
  146. // this.handleAutoSave()
  147. }
  148. render() {
  149. const { files, terimaSuratSanksi, tglAkhirKeberatan, filesTandaTerimaSS, tmtCheck } = this.state;
  150. const removeFile = file => () => {
  151. const newFiles = [...files]
  152. newFiles.splice(newFiles.indexOf(file), 1)
  153. this.setState({
  154. files: newFiles,
  155. });
  156. }
  157. const removeFileTandaTerimaSS = file => () => {
  158. const newFiles = [...filesTandaTerimaSS]
  159. newFiles.splice(newFiles.indexOf(file), 1)
  160. this.setState({
  161. filesTandaTerimaSS: newFiles,
  162. });
  163. }
  164. const thumbs = files.map((file, index) => (
  165. <p>
  166. <em className="far fa-file" />&nbsp;&nbsp;{file.name}
  167. <button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
  168. </p>
  169. ));
  170. const thumbsTandaTerimaSS = filesTandaTerimaSS.map((file, index) => (
  171. <p>
  172. <em className="far fa-file" />&nbsp;&nbsp;{file.name}
  173. <button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFileTandaTerimaSS(file)} />
  174. </p>
  175. ));
  176. return (
  177. <form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
  178. <FormGroup row>
  179. <label className="col-md-2 col-form-label">Nomor Surat<span className="text-danger">*</span></label>
  180. <div className="col-md-10">
  181. <Input type="text" value={this.state.nomorSanksi} onChange={(e) => { this.setNomorSanksi(e) }} />
  182. </div>
  183. </FormGroup>
  184. <FormGroup row className="mt-3">
  185. <label className="col-md-2 col-form-label">Keterangan<span className="text-danger">*</span></label>
  186. <div className="col-md-10">
  187. <Input type="textarea" value={this.state.keterangan} onChange={(e) => { this.setKeterangan(e) }} required />
  188. </div>
  189. </FormGroup>
  190. <FormGroup row>
  191. <label className="col-md-2 col-form-label">Tidak Perlu TMT</label>
  192. <div className="col-md-10 mt-2">
  193. <div className="checkbox c-checkbox">
  194. <label>
  195. <Input type="checkbox" onChange={() => this.handleTmtCheck()} defaultChecked={this.state.tmtCheck} />
  196. <span className="fa fa-check"></span></label>
  197. </div>
  198. </div>
  199. </FormGroup>
  200. {this.state.tmtCheck && (
  201. <FormGroup row className="mt-3">
  202. <label className="col-md-2 col-form-label">Tanggal Penetapan Sanksi</label>
  203. <span className="col-sm-3 float-left">
  204. <DatePicker
  205. selected={this.state.awalsanksi ? new Date(this.state.awalsanksi) : this.state.awalsanksi}
  206. onChange={(awalsanksi) => {
  207. this.setState({ awalsanksi }, this.setUploadSuratSanksi)
  208. }}
  209. dateFormat="dd/MM/yyyy"
  210. maxDate={new Date(this.state.startDay)}
  211. placeholderText="Isi Tanggal"
  212. locale={id}
  213. className="form-control bg-white"
  214. />
  215. </span>
  216. </FormGroup>
  217. )}
  218. {!this.state.tmtCheck && (
  219. <FormGroup row className="mt-3">
  220. <label className="col-md-2 col-form-label">Isi TMT</label>
  221. <Row >
  222. <Col>
  223. <FormGroup>
  224. <span className="ml-3">
  225. <DatePicker
  226. selected={this.state.awalsanksi ? new Date(this.state.awalsanksi) : this.state.awalsanksi}
  227. onChange={(awalsanksi) => {
  228. this.setState({ awalsanksi }, this.setUploadSuratSanksi)
  229. }}
  230. dateFormat="dd/MM/yyyy"
  231. maxDate={new Date(this.state.startDay)}
  232. placeholderText="Dari Tanggal"
  233. locale={id}
  234. className="form-control bg-white"
  235. />
  236. </span>
  237. </FormGroup>
  238. </Col>
  239. <Col>
  240. <FormGroup>
  241. <span className="ml-3">
  242. <DatePicker
  243. selected={this.state.akhirsanksi ? new Date(this.state.akhirsanksi) : this.state.akhirsanksi}
  244. // onChange={(akhirsanksi, e) => {
  245. // this.setState({ akhirsanksi }, this.setUploadSuratSanksi(e), this.props.handleAutoSave(e))
  246. // }}
  247. onChange={(akhirsanksi) => { this.setAkhirSanksi(akhirsanksi) }}
  248. dateFormat="dd/MM/yyyy"
  249. minDate={new Date(this.state.awalsanksi)}
  250. maxDate={addMonths(new Date(this.state.awalsanksi), 6)}
  251. placeholderText="Sampai tanggal"
  252. locale={id}
  253. className="form-control bg-white"
  254. />
  255. </span>
  256. </FormGroup>
  257. </Col>
  258. </Row>
  259. </FormGroup>
  260. )}
  261. {!this.state.tmtCheck && (
  262. <FormGroup row className="mt-1">
  263. <label className="col-md-2 col-form-label">TMT berlaku</label>
  264. <div className="col-md-10 mt-2">
  265. <b>{this.state.awalsanksi ? moment(this.state.awalsanksi).format("DD-MM-YYYY") : "-"}</b> hingga <b>{this.state.akhirsanksi ? moment(this.state.akhirsanksi).format("DD-MM-YYYY") : "-"}</b>
  266. </div>
  267. </FormGroup>
  268. )}
  269. {!this.state.tmtCheck && (
  270. <FormGroup row className="mt-1">
  271. <label className="col-md-2 col-form-label">TMT</label>
  272. <div className="col-md-10 mt-2">
  273. <b>{this.state.akhirsanksi ? moment(this.state.akhirsanksi).diff(this.state.awalsanksi, 'month') : "-"} bulan</b>
  274. </div>
  275. </FormGroup>
  276. )}
  277. <FormGroup row className="mt-3">
  278. <label className="col-md-2 col-form-label">List sanksi </label>
  279. <div className="col-md-10">
  280. <Select
  281. options={this.props.listSanksi.map(e => ({ value: `Sanksi Administratif ${e.split(";")[0]} - ${e.split(";")[1]}` }))}
  282. isMulti
  283. formatOptionLabel={formatOptionLabel}
  284. onChange={(e) => {
  285. this.handleChangeListSanksi(e);
  286. }}
  287. />
  288. </div>
  289. </FormGroup>
  290. <FormGroup row>
  291. <label className="col-md-2 col-form-label">
  292. Dokumen Surat Sanksi<span className="text-danger">*</span>
  293. </label>
  294. <div className="col-md-10">
  295. <DropzoneWrapper className="" onDrop={this.onDrop}>
  296. {({ getRootProps, getInputProps, isDragActive }) => {
  297. return (
  298. <div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
  299. <input {...getInputProps()} />
  300. <div className="dropzone-style-1">
  301. <div className="center-ver-hor dropzone-previews flex">
  302. {this.state.files.length > 0 ? (
  303. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  304. <h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
  305. </div>
  306. ) : (
  307. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  308. <h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
  309. </div>
  310. )}
  311. </div>
  312. </div>
  313. <div className="d-flex align-items-center">
  314. <small className="ml-auto">
  315. <button type="button" className="btn btn-link" onClick={this.clearFiles}>
  316. Reset dokumen
  317. </button>
  318. </small>
  319. </div>
  320. </div>
  321. );
  322. }}
  323. </DropzoneWrapper>
  324. <div>
  325. {thumbs}
  326. </div>
  327. <p className="mrgn-top-5 font-color-black">Ukuran setiap dokumen maksimal 15mb</p>
  328. </div>
  329. </FormGroup>
  330. <FormGroup row>
  331. <label className="col-md-2 col-form-label">
  332. Dokumen Laporan Evaluasi dan Pembahasan
  333. </label>
  334. <div className="col-md-10">
  335. <div style={{ display: "none" }}>
  336. <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
  337. </div>
  338. <ReactToPrint
  339. trigger={() => {
  340. return <span>
  341. <Button color className="btn-labeled-4 mt-0">
  342. <h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
  343. </Button>
  344. </span>
  345. }}
  346. content={() => this.componentRef}
  347. />
  348. </div>
  349. </FormGroup>
  350. <FormGroup row className="mt-3">
  351. <label className="col-md-2 col-form-label">Tanggal Terima Surat Sanksi<span className="text-danger">*</span></label>
  352. <span className="col-sm-3 float-left">
  353. <DatePicker
  354. selected={this.state.terimaSuratSanksi ? new Date(this.state.terimaSuratSanksi) : this.state.terimaSuratSanksi}
  355. onChange={(terimaSuratSanksi) => {
  356. this.setState({ terimaSuratSanksi }, this.setUploadSuratSanksi)
  357. }}
  358. dateFormat="dd/MM/yyyy"
  359. minDate={new Date(this.state.awalsanksi)}
  360. placeholderText="Isi Tanggal"
  361. locale={id}
  362. className="form-control bg-white"
  363. />
  364. </span>
  365. </FormGroup>
  366. <FormGroup row>
  367. <label className="col-md-2 col-form-label">
  368. Dokumen Tanda Terima Surat Sanksi<span className="text-danger">*</span>
  369. </label>
  370. <div className="col-md-10">
  371. <DropzoneWrapper className="" onDrop={this.onDropTandaTerimaSS}>
  372. {({ getRootProps, getInputProps, isDragActive }) => {
  373. return (
  374. <div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
  375. <input {...getInputProps()} />
  376. <div className="dropzone-style-1">
  377. <div className="center-ver-hor dropzone-previews flex">
  378. {this.state.filesTandaTerimaSS.length > 0 ? (
  379. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  380. <h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
  381. </div>
  382. ) : (
  383. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  384. <h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
  385. </div>
  386. )}
  387. </div>
  388. </div>
  389. <div className="d-flex align-items-center">
  390. <small className="ml-auto">
  391. <button type="button" className="btn btn-link" onClick={this.clearFilesTerimaSanksi}>
  392. Reset dokumen
  393. </button>
  394. </small>
  395. </div>
  396. </div>
  397. );
  398. }}
  399. </DropzoneWrapper>
  400. <div>
  401. {thumbsTandaTerimaSS}
  402. </div>
  403. <p className="mrgn-top-5 font-color-black">Ukuran setiap dokumen maksimal 15mb</p>
  404. </div>
  405. </FormGroup>
  406. <FormGroup row className="mt-3">
  407. <label className="col-md-2 col-form-label">Tanggal Akhir Pengajuan Keberatan<span className="text-danger">*</span>
  408. <p>
  409. Note : 21 hari kerja
  410. </p>
  411. </label>
  412. <span className="col-sm-3 float-left">
  413. <DatePicker
  414. selected={this.state.tglAkhirKeberatan ? new Date(this.state.tglAkhirKeberatan) : this.state.tglAkhirKeberatan}
  415. onChange={(tglAkhirKeberatan) => {
  416. this.setState({ tglAkhirKeberatan }, this.setUploadSuratSanksi)
  417. }}
  418. dateFormat="dd/MM/yyyy"
  419. minDate={new Date(terimaSuratSanksi)}
  420. placeholderText="Isi Tanggal"
  421. locale={id}
  422. className="form-control bg-white"
  423. />
  424. </span>
  425. </FormGroup>
  426. </form >
  427. );
  428. }
  429. }
  430. export default UploadSurat;