BeritaAcara_A.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. import React, { useRef, Component } from 'react';
  2. import { useReactToPrint } from "react-to-print";
  3. import { Row, Col, Button } from "reactstrap";
  4. import Head from 'next/head'
  5. import SignatureCanvas from 'react-signature-canvas'
  6. import ComponentToPrint from "./SuratBA";
  7. import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
  8. import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
  9. import DatePicker from "react-datepicker";
  10. import "react-datepicker/dist/react-datepicker.css";
  11. import id from 'date-fns/locale/id';
  12. class BeritaAcara extends Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. isEditTempat: false,
  17. tempat: "[Mohon Diisi]",
  18. isEditTanggal: false,
  19. tanggal: "",
  20. setTanggal: false,
  21. namaPeserta: [],
  22. isEditNamaPeserta: false,
  23. simpulan: "",
  24. rekomendasi: "",
  25. isEditTemuanLain: false,
  26. temuanLain: [],
  27. memberatkan: [],
  28. isEditKeberatan: false,
  29. isEditMeringankan: false,
  30. meringankan: [],
  31. sanksi: "[Mohon Diisi]",
  32. isEditSanksi: false,
  33. signature: [],
  34. peserta: [{
  35. nama: "",
  36. signature: "",
  37. }]
  38. };
  39. }
  40. static getInitialProps = async ({ query }) => {
  41. return { query };
  42. };
  43. setDataSuratBA = () => {
  44. this.props.setDataSuratBA(this.state);
  45. }
  46. isEditTempat = () => {
  47. this.setState({
  48. isEditTempat: !this.state.isEditTempat,
  49. })
  50. }
  51. isEditTanggal = () => {
  52. this.setState({
  53. isEditTanggal: !this.state.isEditTanggal,
  54. })
  55. }
  56. isEditNamaPeserta = () => {
  57. this.setState({
  58. isEditNamaPeserta: !this.state.isEditNamaPeserta,
  59. })
  60. }
  61. isEditTemuanLain = () => {
  62. this.setState({
  63. isEditTemuanLain: !this.state.isEditTemuanLain,
  64. })
  65. }
  66. isEditKeberatan = () => {
  67. this.setState({
  68. isEditKeberatan: !this.state.isEditKeberatan,
  69. })
  70. }
  71. isEditMeringankan = () => {
  72. this.setState({
  73. isEditMeringankan: !this.state.isEditMeringankan,
  74. })
  75. }
  76. isEditSanksi = () => {
  77. this.setState({
  78. isEditSanksi: !this.state.isEditSanksi,
  79. })
  80. }
  81. updateValueTempat = () => {
  82. this.setState({
  83. isEditTempat: false,
  84. tempat: this.refs.inputTempat.value
  85. }, this.setDataSuratBA)
  86. }
  87. updateValueNamaPeserta = () => {
  88. const addNamaPeserta = this.refs.inputNamaPeserta.value
  89. this.setState({
  90. namaPeserta: [...this.state.namaPeserta, addNamaPeserta]
  91. }, this.setDataSuratBA)
  92. }
  93. updateValueTemuanLain = () => {
  94. const addTemuanLain = this.refs.inputTemuan.value
  95. this.setState({
  96. temuanLain: [...this.state.temuanLain, addTemuanLain]
  97. }, this.setDataSuratBA)
  98. }
  99. updateValueMemringankan = () => {
  100. const addMeringankan = this.refs.inputMeringankan.value
  101. this.setState({
  102. meringankan: [...this.state.meringankan, addMeringankan]
  103. }, this.setDataSuratBA)
  104. }
  105. updateValueMemberatkan = () => {
  106. const addKeberatan = this.refs.inputMemberatkan.value
  107. this.setState({
  108. memberatkan: [...this.state.memberatkan, addKeberatan]
  109. }, this.setDataSuratBA)
  110. }
  111. updateValueSanksi = () => {
  112. this.setState({
  113. isEditSanksi: false,
  114. sanksi: this.refs.inputSanksi.value
  115. }, this.setDataSuratBA)
  116. }
  117. sigPad = []
  118. clear = () => {
  119. this.sigPad.clear()
  120. }
  121. updateValueSignature = () => {
  122. const addsig = this.sigPad.getTrimmedCanvas().toDataURL('image/png')
  123. this.setState({
  124. signature: [...this.state.signature, addsig]
  125. }, this.setDataSuratBA)
  126. }
  127. render() {
  128. const { dataPelanggaran, dataLaporan } = this.props
  129. const { isEditTempat, tempat, isEditTanggal, tanggal, setTanggal, namaPeserta, isEditNamaPeserta, simpulan, isEditTemuanLain, temuanLain, memberatkan, isEditKeberatan, isEditMeringankan, meringankan, sanksi, isEditSanksi, trimmedDataURL } = this.state
  130. console.log(this.state.tempat)
  131. return (
  132. <div>
  133. <div className=' content-heading border-radius-login'>
  134. <span className="btn-radius">
  135. <ReactToPrint
  136. trigger={() => {
  137. // NOTE: could just as easily return <SomeComponent />. Do NOT pass an `onClick` prop
  138. // to the root node of the returned component as it will be overwritten.
  139. return <span>
  140. <Button color className="btn-labeled-4">
  141. <h4 className="p-0 mt-2">Print dan Download</h4>
  142. </Button>
  143. </span>
  144. }}
  145. content={() => this.componentRef}
  146. />
  147. </span>
  148. </div>
  149. <div style={{ display: "none" }}>
  150. <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
  151. </div>
  152. <div className='page'>
  153. <page>
  154. <div className='BA-logo'>
  155. <img className='BA-logo' src="/static/img/logo-single-1-login.png" alt="logo" />
  156. </div>
  157. <h3 className='BA-header'>LAPORAN HASIL EVALUASI DAN PEMBAHASAN</h3>
  158. {dataLaporan.data && (<h3 className='BA-header'>{dataLaporan.data.pt.nama}</h3>)}
  159. <div className='body'>
  160. <p className='body'>
  161. Pada hari ini
  162. {isEditTanggal &&
  163. <span>
  164. <DatePicker
  165. selected={tanggal}
  166. onChange={(tanggal) => {
  167. this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
  168. }}
  169. dateFormat="dd/MM/yyyy"
  170. placeholderText="Isi Tanggal"
  171. locale={id}
  172. className="form-control bg-white"
  173. />
  174. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
  175. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
  176. />
  177. </span>
  178. }
  179. {setTanggal === true ?
  180. <span onClick={this.isEditTanggal}> {moment(tanggal).locale("id").format("dddd")}, tanggal&nbsp;{moment(tanggal).format("D")}&nbsp; bulan &nbsp;{moment(tanggal).format("MMMM")} tahun &nbsp;{moment(tanggal).format("YYYY")},</span> :
  181. <span onClick={this.isEditTanggal}> &nbsp;[Mohon Diisi] &nbsp;</span>
  182. }
  183. &nbsp;bertempat di
  184. {isEditTempat ?
  185. <span>
  186. <input type='text'
  187. defaultValue=""
  188. ref="inputTempat" />
  189. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTempat} />
  190. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.updateValueTempat} />
  191. </span>
  192. :
  193. <span onClick={this.isEditTempat}>&nbsp;{tempat}</span>
  194. }
  195. ,
  196. telah dilakukan rapat evaluasi dan pembahasan dugaan pelanggaran penyelenggaraan oleh perguruan tinggi dan/atau badan penyelenggara {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, yang dihadiri oleh:
  197. </p>
  198. <div className='body'>
  199. <ol>
  200. {namaPeserta.map((value) => <li>{value}</li>)}
  201. {isEditNamaPeserta ?
  202. <span>
  203. <input type='text' defaultValue={""} ref="inputNamaPeserta" />
  204. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueNamaPeserta(), this.isEditNamaPeserta() }} />
  205. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditNamaPeserta} />
  206. </span>
  207. :
  208. <Button onClick={this.isEditNamaPeserta} className=" p-0 m-0" color="success">Tambah peserta</Button>
  209. }
  210. </ol>
  211. </div>
  212. </div>
  213. <p>
  214. Berdasarkan rapat evaluasi dan pembahasan dugaan pelanggaran penyelenggaraan oleh perguruan tinggi dan/atau badan penyelenggara {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, disampaikan sebagai berikut:
  215. </p>
  216. <div className='body'>
  217. <ol>
  218. <li>Telah dibacakan Berita Acara Evaluasi Kinerja Perguruan Tinggi {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, tanggal
  219. {setTanggal === true ?
  220. <span> &nbsp;{moment(tanggal).format("DD-MM-YYYY")}</span>
  221. :
  222. <span> &nbsp;....... &nbsp;</span>
  223. }
  224. </li>
  225. <li>Telah dilakukan pembahasan rekomendasi mengenai fakta-fakta yang ditemukan Tim EKPT Ditjen Diktiristek, dengan temuan sebagai berikut:</li>
  226. <table className='table-a'>
  227. <thead>
  228. <tr>
  229. <th rowspan="2">NO</th>
  230. <th rowspan="2">NAMA DAN IZIN PRODI</th>
  231. <th colspan="3">PELANGGARAN TERHADAP PERMENDIKBUD NO.7 TAHUN 2020</th>
  232. <th rowspan="2">SIMPULAN</th>
  233. <th rowspan="2">REKOMENDASI</th>
  234. </tr>
  235. <tr>
  236. <th>PASAL</th>
  237. <th>BUTIR PELANGGARAN</th>
  238. <th>DESKRIPSI PELANGGARAN</th>
  239. </tr>
  240. </thead>
  241. <tbody>
  242. {dataPelanggaran
  243. ? dataPelanggaran.map((e, i) => (
  244. <tr key={e._id}>
  245. <td>{++i}</td>
  246. {dataLaporan.data && (<td className='BA-header'>{dataLaporan.data.pt.nama}</td>)}
  247. <td>{e.pasal}</td>
  248. <td>{e.butir_pelanggaran}</td>
  249. <td>{e.pelanggaran}</td>
  250. <td contenteditable='true'>[Mohon Diisi]</td>
  251. <td contenteditable='true'>[Mohon Diisi]</td>
  252. </tr>
  253. ))
  254. : ""}
  255. </tbody>
  256. </table>
  257. <li>Temuan Lain:
  258. {isEditTemuanLain ?
  259. <span>
  260. <input style={{ height: "30px", width: "250px" }} type='textarea' defaultValue={""} ref="inputTemuan" />
  261. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueTemuanLain(), this.isEditTemuanLain() }} />
  262. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTemuanLain} />
  263. </span>
  264. : <Button onClick={this.isEditTemuanLain} className=" p-0 m-0" color="success">Input Data</Button>}
  265. <ol type="a">
  266. {temuanLain.map((value) => <li>{value}</li>)}
  267. </ol>
  268. </li>
  269. <li>Hal-hal yang memberatkan, sebagai berikut:
  270. {isEditKeberatan ?
  271. <span>
  272. <input style={{ height: "30px", width: "250px" }} type='text' defaultValue={""} ref="inputMemberatkan" />
  273. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemberatkan(), this.isEditKeberatan() }} />
  274. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditKeberatan} />
  275. </span>
  276. : <Button onClick={this.isEditKeberatan} className=" p-0 m-0" color="success">Input Data</Button>}
  277. <ol type="a">
  278. {memberatkan.map((value) => <li>{value}</li>)}
  279. </ol>
  280. </li>
  281. <li>hal-hal yang meringankan, sebagai berikut:
  282. {isEditMeringankan ?
  283. <span>
  284. <input type='text' defaultValue={""} ref="inputMeringankan" />
  285. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemringankan(), this.isEditMeringankan() }} />
  286. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditMeringankan} />
  287. </span>
  288. : <Button onClick={this.isEditMeringankan} className=" p-0 m-0" color="success">Input Data</Button>}
  289. <ol type="a">
  290. {meringankan.map((value) => <li>{value}</li>)}
  291. </ol>
  292. </li>
  293. <li>
  294. Berdasarkan pembahasan yang dilakukan, disepakati untuk merekomendasikan <strong>“Sanksi Administratif berupa {isEditSanksi ?
  295. <span>
  296. <input type='text'
  297. defaultValue=""
  298. ref="inputSanksi" />
  299. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditSanksi} />
  300. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.updateValueSanksi} />
  301. </span> : <span onClick={this.isEditSanksi}>&nbsp;{sanksi}</span>}</strong>
  302. </li>
  303. </ol>
  304. </div>
  305. <p className='BA-body'>
  306. Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
  307. </p>
  308. <table className='demo'>
  309. <tbody>
  310. <tr>
  311. <th colspan="4">PESERTA RAPAT PENYUSUNAN REKOMENDASI</th>
  312. </tr>
  313. {namaPeserta
  314. ? namaPeserta.map((namaPeserta) => (
  315. <tr>
  316. <td>{namaPeserta}</td>
  317. <td>
  318. <SignatureCanvas penColor='black' canvasProps={{ width: 200, height: 100, className: 'sigCanvas' }} ref={(ref) => { this.sigPad = ref }} />
  319. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.updateValueSignature} />
  320. {/* <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.ised} /> */}
  321. </td>
  322. </tr>)) : ""}
  323. </tbody>
  324. </table>
  325. </page>
  326. </div>
  327. </div >
  328. );
  329. }
  330. }
  331. export default BeritaAcara