InputRekomendasi.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import React, { Component } from "react";
  2. import { insertPemeriksaan } from "@/actions/pemeriksaan";
  3. import Router from "next/router";
  4. import Datetime from "react-datetime";
  5. import moment from "moment";
  6. import { Row, Col, FormGroup, Input, Button } from "reactstrap";
  7. import { ToastContainer, toast } from "react-toastify";
  8. import { Formik, Form, Field, ErrorMessage } from "formik";
  9. import * as Yup from "yup";
  10. import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
  11. import { connect } from "react-redux";
  12. const selectInstanceId = 1;
  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. const checkIfFilesAreCorrectType = (files) => {
  25. let valid = true;
  26. if (files) {
  27. files.map((file) => {
  28. if (!["image/jpeg", "image/png"].includes(file.type)) {
  29. valid = false;
  30. }
  31. });
  32. }
  33. return valid;
  34. };
  35. const RekomendasiDelegasiSchema = Yup.object().shape({
  36. dokumen: Yup.array().min(1).required("Wajib diisi").test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
  37. });
  38. let Dropzone = null;
  39. class DropzoneWrapper extends Component {
  40. state = {
  41. isClient: false,
  42. };
  43. componentDidMount = () => {
  44. Dropzone = require("react-dropzone").default;
  45. this.setState({ isClient: true });
  46. };
  47. render() {
  48. return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
  49. }
  50. }
  51. class InputRekomendasi extends Component {
  52. constructor(props) {
  53. super(props);
  54. this.state = {
  55. dropdownOpen: false,
  56. splitButtonOpen: false,
  57. judulEvaluasi: "",
  58. tanggal: moment().format("D MMMM YYYY"),
  59. files: [],
  60. delegasichecklist: false,
  61. rolelldikti: false,
  62. };
  63. }
  64. setjudulEvaluasi = (e) => {
  65. this.setState({ judulEvaluasi: e.target.value });
  66. };
  67. setTanggal = (moment) => {
  68. this.setState({ tanggal: moment.format("D MMMM YYYY") });
  69. };
  70. toggleSplit = () => {
  71. this.setState({
  72. splitButtonOpen: !this.state.splitButtonOpen,
  73. });
  74. };
  75. toggleDropDown = () => {
  76. this.setState({
  77. dropdownOpen: !this.state.dropdownOpen,
  78. });
  79. };
  80. onDrop = (files) => {
  81. this.setState({
  82. files: files.map((file) =>
  83. Object.assign(file, {
  84. preview: URL.createObjectURL(file),
  85. })
  86. ),
  87. stat: "Added " + files.length + " file(s)",
  88. });
  89. };
  90. uploadFiles = (e) => {
  91. e.preventDefault();
  92. e.stopPropagation();
  93. this.setState({
  94. stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.",
  95. });
  96. };
  97. clearFiles = (e) => {
  98. e.preventDefault();
  99. e.stopPropagation();
  100. this.setState({
  101. stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.",
  102. });
  103. this.setState({
  104. files: [],
  105. });
  106. };
  107. onSubmit = async (data, { resetForm }) => {
  108. const { token, query } = this.props;
  109. const { id } = query;
  110. const formdata = new FormData();
  111. data.dokumen.forEach((e) => {
  112. formdata.append("dokumen", e);
  113. });
  114. if (this.state.delegasichecklist == true) {
  115. await toast.promise(insertPemeriksaan(token, id, formdata), {
  116. pending: "Loading",
  117. success: "Success",
  118. error: "Error",
  119. });
  120. data.change_role = "true";
  121. data.keterangan = "delegasi ke DIKTI"
  122. Router.push("/app/pemeriksaan");
  123. update = await updateLaporan(token, id, data);
  124. } else {
  125. await toast.promise(insertPemeriksaan(token, id, formdata), {
  126. pending: "Loading",
  127. success: "Success",
  128. error: "Error",
  129. });
  130. }
  131. this.setState({ files: [] });
  132. resetForm();
  133. const pelaporan = await getOneLaporan(token, query.id);
  134. this.props.changePelaporan(pelaporan);
  135. };
  136. render() {
  137. const { files } = this.state;
  138. const thumbs = files.map((file, index) => (
  139. <div md={3} key={index}>
  140. {/* <img className="img-fluid mb-2" src={file.preview} alt="Item" /> */}
  141. <span className="text-left">{index + 1}.{file.name}</span>
  142. </div>
  143. ));
  144. return (
  145. <>
  146. <p className="lead bb">Evaluasi</p>
  147. <Formik
  148. initialValues={{
  149. dokumen: [],
  150. }}
  151. validationSchema={evaluasiSchema}
  152. onSubmit={this.onSubmit}
  153. >
  154. <Form className="form-horizontal">
  155. <FormGroup row>
  156. <label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
  157. <div className="col-md-10">
  158. <Field name="dokumen">
  159. {({ field, form, meta }) => (
  160. <DropzoneWrapper
  161. className=""
  162. onDrop={(e) => {
  163. this.onDrop(e);
  164. form.setFieldValue(field.name, e);
  165. }}
  166. >
  167. {({ getRootProps, getInputProps, isDragActive }) => {
  168. return (
  169. <div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
  170. <input name="dokumen" {...getInputProps()} />
  171. <div className="dropzone-style-1">
  172. <div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ? <Row><span className="text-left">{thumbs}</span></Row> :
  173. <div className="text-center fa-2x icon-cloud-upload mr-2 ">
  174. <h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
  175. </div>
  176. }
  177. </div>
  178. </div>
  179. <div className="d-flex align-items-center">
  180. <small className="ml-auto">
  181. <button
  182. type="button"
  183. className="btn btn-link"
  184. onClick={(e) => {
  185. this.clearFiles(e);
  186. form.setFieldValue(field.name, []);
  187. }}
  188. >
  189. Reset dokumen
  190. </button>
  191. </small>
  192. </div>
  193. </div>
  194. );
  195. }}
  196. </DropzoneWrapper>
  197. )}
  198. </Field>
  199. <ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
  200. <p className="mrgn-top-5">
  201. Ukuran setiap dokumen maksimal 15mb
  202. </p>
  203. </div>
  204. </FormGroup>
  205. <FormGroup row>
  206. <div className="col-xl-10">
  207. <Button color className="btn-login" type="submit">
  208. <span className="font-color-white">
  209. Simpan Evaluasi
  210. </span>
  211. </Button>
  212. </div>
  213. </FormGroup>
  214. </Form>
  215. </Formik>
  216. </>
  217. );
  218. }
  219. }
  220. const mapStateToProps = (state) => ({ user: state.user, token: state.token });
  221. export default connect(mapStateToProps)(InputRekomendasi);