InputData.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import React, { Component } from "react";
  2. import Router from "next/router";
  3. import { getPelanggaran } from "@/actions/pelanggaran";
  4. import { createPelaporan } from "@/actions/pelaporan";
  5. import Select from "react-select";
  6. import { Row, Col, FormGroup, Input } from "reactstrap";
  7. let Dropzone = null;
  8. class DropzoneWrapper extends Component {
  9. state = {
  10. isClient: false,
  11. };
  12. componentDidMount = () => {
  13. Dropzone = require("react-dropzone").default;
  14. this.setState({ isClient: true });
  15. };
  16. render() {
  17. return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
  18. }
  19. }
  20. const selectInstanceId = 1;
  21. export class InputData extends Component {
  22. constructor(props) {
  23. super(props);
  24. this.state = {
  25. dropdownOpen: false,
  26. splitButtonOpen: false,
  27. selectedOptionMulti: [],
  28. stat: "Waiting to add files..",
  29. pelaporanNumber: Math.floor(Date.now() * Math.random()),
  30. keteranganLaporan: "",
  31. files: [],
  32. pelanggaran: [],
  33. };
  34. }
  35. componentDidMount = async () => {
  36. const pelanggaran = await getPelanggaran();
  37. this.setState({ pelanggaran });
  38. };
  39. optionsJenisPelanggaran = (pelanggaran) => {
  40. return pelanggaran.data.map((e) => ({ value: e._id, label: e.Pelanggaran, className: "State-ACT" }));
  41. };
  42. setKeteranganPelaporan = (e) => {
  43. this.setState({ keteranganLaporan: e.target.value });
  44. };
  45. toggleDropDown = () => {
  46. this.setState({
  47. dropdownOpen: !this.state.dropdownOpen,
  48. });
  49. };
  50. toggleSplit = () => {
  51. this.setState({
  52. splitButtonOpen: !this.state.splitButtonOpen,
  53. });
  54. };
  55. handleChangeSelectMulti = (selectedOptionMulti) => {
  56. this.setState({ selectedOptionMulti });
  57. };
  58. onDrop = (files) => {
  59. this.setState({
  60. files: files.map((file) =>
  61. Object.assign(file, {
  62. preview: URL.createObjectURL(file),
  63. })
  64. ),
  65. stat: "Added " + files.length + " file(s)",
  66. });
  67. };
  68. uploadFiles = (e) => {
  69. e.preventDefault();
  70. e.stopPropagation();
  71. this.setState({
  72. stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.",
  73. });
  74. };
  75. clearFiles = (e) => {
  76. e.preventDefault();
  77. e.stopPropagation();
  78. this.setState({
  79. stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.",
  80. });
  81. this.setState({
  82. files: [],
  83. });
  84. };
  85. onSubmit = async (e) => {
  86. e.preventDefault();
  87. const formdata = new FormData();
  88. formdata.append("number", this.state.pelaporanNumber);
  89. formdata.append("pt_id", this.props.query.ptId);
  90. formdata.append("description", this.state.keteranganLaporan);
  91. formdata.append("pelanggaran_id", this.state.selectedOptionMulti.map((e) => e.value).join());
  92. if (this.state.files.length > 0) {
  93. this.state.files.forEach((e) => {
  94. formdata.append("files", e);
  95. });
  96. }
  97. const create = await createPelaporan(formdata);
  98. console.log(create);
  99. // await this.props.dispatch(createPelaporan(formdata));
  100. // this.props.dispatch(listPelaporan());
  101. if (create) {
  102. Router.push({
  103. pathname: "/app/pelaporan",
  104. });
  105. }
  106. };
  107. render() {
  108. const { selectedOptionMulti, files, pelanggaran } = this.state;
  109. const thumbs = files.map((file, index) => (
  110. <Col md={3} key={index}>
  111. <img className="img-fluid mb-2" src={file.preview} alt="Item" />
  112. </Col>
  113. ));
  114. return (
  115. <form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
  116. <FormGroup row>
  117. <label className="col-md-2 col-form-label">Nomor Pelaporan</label>
  118. <div className="col-md-10">
  119. <Input type="text" disabled value={this.state.pelaporanNumber} />
  120. <span className="form-text">Nomor pelaporan akan digenerate otomatis dari sistem</span>
  121. </div>
  122. </FormGroup>
  123. <FormGroup row>
  124. <label className="col-md-2 col-form-label">Jenis Pelanggaran</label>
  125. <div className="col-md-10">
  126. <Select instanceId={selectInstanceId + 1} isMulti value={selectedOptionMulti} onChange={this.handleChangeSelectMulti} options={pelanggaran.data ? this.optionsJenisPelanggaran(pelanggaran) : []} required />
  127. <span className="form-text">Pilih Jenis Pelanggaran</span>
  128. </div>
  129. </FormGroup>
  130. <FormGroup row>
  131. <label className="col-md-2 col-form-label">Keterangan Laporan</label>
  132. <div className="col-md-10">
  133. <Input type="textarea" value={this.state.keteranganLaporan} onChange={this.setKeteranganPelaporan} required />
  134. <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span>
  135. </div>
  136. </FormGroup>
  137. <FormGroup row>
  138. <label className="col-md-2 col-form-label">Upload File Pendukung</label>
  139. <div className="col-md-10">
  140. <DropzoneWrapper className="" onDrop={this.onDrop}>
  141. {({ getRootProps, getInputProps, isDragActive }) => {
  142. return (
  143. <div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
  144. <input {...getInputProps()} />
  145. <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>
  146. <div className="d-flex align-items-center">
  147. <small className="ml-auto">
  148. <button type="button" className="btn btn-link" onClick={this.clearFiles}>
  149. Clear files
  150. </button>
  151. </small>
  152. </div>
  153. </div>
  154. );
  155. }}
  156. </DropzoneWrapper>
  157. </div>
  158. </FormGroup>
  159. <FormGroup row>
  160. <div className="col-xl-10">
  161. <button className="btn btn-sm btn-primary" type="submit">
  162. Submit Laporan
  163. </button>
  164. </div>
  165. </FormGroup>
  166. </form>
  167. );
  168. }
  169. }
  170. export default InputData;