BeritaAcara_A.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. import React, { useRef, Component } from 'react';
  2. import { useReactToPrint } from "react-to-print";
  3. import { Row, Col, Button, Popover, PopoverHeader, PopoverBody, } 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. import CopyToClipboard from "react-copy-to-clipboard";
  13. import { getAutoSave } from "@/actions/autosave";
  14. class BeritaAcara extends Component {
  15. constructor(props) {
  16. super(props);
  17. this.state = {
  18. isEditTempat: false,
  19. tempat: "[Mohon Diisi]",
  20. isEditTanggal: false,
  21. tanggal: "",
  22. setTanggal: false,
  23. namaPeserta: [],
  24. isEditNamaPeserta: false,
  25. simpulan: "",
  26. rekomendasi: "",
  27. isEditTemuanLain: false,
  28. temuanLain: [],
  29. memberatkan: [],
  30. isEditKeberatan: false,
  31. isEditMeringankan: false,
  32. meringankan: [],
  33. sanksi: "[Mohon Diisi]",
  34. isEditSanksi: false,
  35. copied: false,
  36. setmeState: true,
  37. };
  38. }
  39. static getInitialProps = async ({ query }) => {
  40. return { query };
  41. };
  42. componentDidMount = async () => {
  43. const { query, token } = this.props;
  44. const { id } = query;
  45. const getDataSave = await getAutoSave({ id, laporan: true });
  46. const autoSaveDataSuratBA = getDataSave.data?.PenetapanSanksi?.dataSuratBA;
  47. const autoSaveDataPelanggaran = getDataSave.data?.PenetapanSanksi?.dataPelanggaran?.data;
  48. this.setState({ autoSaveDataPelanggaran, autoSaveDataSuratBA });
  49. };
  50. setDataSuratBA = () => {
  51. this.props.setDataSuratBA(this.state);
  52. }
  53. handleAutoSave = () => {
  54. this.props.handleAutoSave()
  55. }
  56. isEditTempat = () => {
  57. this.setState({
  58. isEditTempat: !this.state.isEditTempat,
  59. }, this.setDataSuratBA, this.handleAutoSave())
  60. }
  61. isEditTanggal = () => {
  62. this.setState({
  63. isEditTanggal: !this.state.isEditTanggal,
  64. }, this.setDataSuratBA, this.handleAutoSave())
  65. }
  66. isEditTemuanLain = () => {
  67. this.setState({
  68. isEditTemuanLain: !this.state.isEditTemuanLain,
  69. }, this.setDataSuratBA, this.handleAutoSave())
  70. }
  71. isEditKeberatan = () => {
  72. this.setState({
  73. isEditKeberatan: !this.state.isEditKeberatan,
  74. }, this.setDataSuratBA, this.handleAutoSave())
  75. }
  76. isEditMeringankan = () => {
  77. this.setState({
  78. isEditMeringankan: !this.state.isEditMeringankan,
  79. }, this.setDataSuratBA, this.handleAutoSave())
  80. }
  81. isEditSanksi = () => {
  82. this.setState({
  83. isEditSanksi: !this.state.isEditSanksi,
  84. }, this.setDataSuratBA, this.handleAutoSave())
  85. }
  86. updateValueTemuanLain = () => {
  87. const addTemuanLain = this.refs.inputTemuan.value
  88. this.state.temuanLain.push(addTemuanLain)
  89. this.setDataSuratBA(this.state)
  90. this.handleAutoSave()
  91. // this.setState({
  92. // temuanLain: [...this.state.temuanLain, addTemuanLain]
  93. // }, this.setDataSuratBA, this.handleAutoSave())
  94. }
  95. updateValueMemringankan = () => {
  96. const addMeringankan = this.refs.inputMeringankan.value
  97. this.state.meringankan.push(addMeringankan)
  98. this.setDataSuratBA(this.state)
  99. this.handleAutoSave()
  100. // this.setState({
  101. // meringankan: [...this.state.meringankan, addMeringankan]
  102. // }, this.setDataSuratBA, this.handleAutoSave())
  103. }
  104. updateValueMemberatkan = () => {
  105. const addKeberatan = this.refs.inputMemberatkan.value
  106. this.state.memberatkan.push(addKeberatan)
  107. this.setDataSuratBA(this.state)
  108. this.handleAutoSave()
  109. }
  110. Copied = () => this.setState({
  111. copied: !this.state.copied
  112. })
  113. CloseCopied = () => {
  114. setTimeout(() => {
  115. this.setState({
  116. copied: !this.state.copied
  117. });
  118. }, 1000);
  119. }
  120. render() {
  121. const { dataPelanggaran, dataLaporan, dataSuratBA } = this.props
  122. const { isEditTempat, tempat, isEditTanggal, tanggal, setTanggal, isEditTemuanLain, isEditKeberatan, isEditMeringankan, isEditSanksi, autoSaveDataSuratBA, autoSaveDataPelanggaran } = this.state
  123. return (
  124. <div>
  125. <div className=' content-heading border-radius-login'>
  126. <span className="btn-radius">
  127. <ReactToPrint
  128. trigger={() => {
  129. // NOTE: could just as easily return <SomeComponent />. Do NOT pass an `onClick` prop
  130. // to the root node of the returned component as it will be overwritten.
  131. return <span>
  132. <Button color className="btn-labeled-4">
  133. <h4 className="p-0 mt-2">Print dan Download</h4>
  134. </Button>
  135. </span>
  136. }}
  137. content={() => this.componentRef}
  138. />
  139. </span>
  140. </div>
  141. <div style={{ display: "none" }}>
  142. <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
  143. </div>
  144. <div className='page'>
  145. <page>
  146. <div className='BA-logo'>
  147. <img className='BA-logo' src="/static/img/logo-single-1-login.png" alt="logo" />
  148. </div>
  149. <h3 className='BA-header'>LAPORAN HASIL EVALUASI DAN PEMBAHASAN</h3>
  150. {dataLaporan.data && (<h3 className='BA-header'>{dataLaporan.data.pt.nama}</h3>)}
  151. <div className='body'>
  152. <p className='body'>
  153. Pada hari ini
  154. {isEditTanggal &&
  155. <span>
  156. <DatePicker
  157. selected={tanggal}
  158. onChange={(tanggal) => {
  159. this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
  160. }}
  161. dateFormat="dd/MM/yyyy"
  162. placeholderText="Isi Tanggal"
  163. locale={id}
  164. className="form-control bg-white"
  165. />
  166. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
  167. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
  168. />
  169. </span>
  170. }
  171. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  172. <span onClick={this.isEditTanggal}> {moment(tanggal || autoSaveDataSuratBA?.tanggal).locale("id").format("dddd")}, tanggal&nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("D")}&nbsp; bulan &nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("MMMM")} tahun &nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("YYYY")},</span> :
  173. <span onClick={this.isEditTanggal}> &nbsp;[Mohon Diisi] &nbsp;</span>
  174. }
  175. &nbsp;bertempat di
  176. {isEditTempat &&
  177. <span>
  178. <input type='text'
  179. defaultValue=""
  180. ref="inputTempat"
  181. onChange={() => {
  182. this.setState({ tempat: this.refs.inputTempat.value }, this.setDataSuratBA)
  183. }}
  184. />
  185. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTempat} />
  186. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.isEditTempat() }} />
  187. </span>
  188. }
  189. {dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat ?
  190. <span onClick={this.isEditTempat}>
  191. &nbsp;{dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat}
  192. </span>
  193. :
  194. <span onClick={this.isEditTempat}>[Mohon Diisi]</span>
  195. }
  196. ,
  197. 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:
  198. </p>
  199. <div className='body'>
  200. <ol>
  201. {dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => <li>{value.nama}</li>)}
  202. </ol>
  203. </div>
  204. </div>
  205. <p>
  206. 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:
  207. </p>
  208. <div className='body'>
  209. <ol>
  210. <li>Telah dibacakan Berita Acara Evaluasi Kinerja Perguruan Tinggi {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, tanggal
  211. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  212. <span> &nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("DD-MM-YYYY")}</span>
  213. :
  214. <span> &nbsp;....... &nbsp;</span>
  215. }
  216. </li>
  217. <li>Telah dilakukan pembahasan rekomendasi mengenai fakta-fakta yang ditemukan Tim EKPT Ditjen Diktiristek, dengan temuan sebagai berikut:</li>
  218. <table className='table-a'>
  219. <thead>
  220. <tr>
  221. <th rowspan="2">NO</th>
  222. <th rowspan="2">NAMA DAN IZIN PRODI</th>
  223. <th colspan="3">PELANGGARAN TERHADAP PERMENDIKBUD NO.7 TAHUN 2020</th>
  224. <th rowspan="2">SIMPULAN</th>
  225. <th rowspan="2">REKOMENDASI</th>
  226. </tr>
  227. <tr>
  228. <th>PASAL</th>
  229. <th>BUTIR PELANGGARAN</th>
  230. <th>DESKRIPSI PELANGGARAN</th>
  231. </tr>
  232. </thead>
  233. <tbody>
  234. {dataPelanggaran?.map((e, i) => (
  235. <tr key={e._id}>
  236. <td>{++i}</td>
  237. {dataLaporan.data && (<td className='BA-header'>{dataLaporan.data.pt.nama}</td>)}
  238. <td>{e.pasal}</td>
  239. <td>{e.butir_pelanggaran}</td>
  240. <td>{e.pelanggaran}</td>
  241. <td contenteditable='true'>[Mohon Diisi]</td>
  242. <td contenteditable='true'>[Mohon Diisi]</td>
  243. </tr>
  244. )) ||
  245. autoSaveDataPelanggaran?.map((e, i) => (
  246. <tr key={e._id}>
  247. <td>{++i}</td>
  248. {dataLaporan.data && (<td className='BA-header'>{dataLaporan.data.pt.nama}</td>)}
  249. <td>{e.pasal}</td>
  250. <td>{e.butir_pelanggaran}</td>
  251. <td>{e.pelanggaran}</td>
  252. <td contenteditable='true' onc>[Mohon Diisi]</td>
  253. <td contenteditable='true'>[Mohon Diisi]</td>
  254. </tr>
  255. ))}
  256. </tbody>
  257. </table>
  258. <li>Temuan Lain:
  259. {isEditTemuanLain ?
  260. <span>
  261. <input style={{ height: "30px", width: "250px" }} type='textarea' defaultValue={""} ref="inputTemuan"
  262. />
  263. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => {
  264. this.updateValueTemuanLain(), this.isEditTemuanLain(), this.handleAutoSave()
  265. }} />
  266. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTemuanLain} />
  267. </span>
  268. : <Button onClick={this.isEditTemuanLain} className=" p-0 m-0" color="success">Input Data</Button>}
  269. <ol type="a">
  270. {dataSuratBA?.temuanLain.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.temuanLain.map((value) => <li>{value}</li>)}
  271. </ol>
  272. </li>
  273. <li>Hal-hal yang memberatkan, sebagai berikut:
  274. {isEditKeberatan ?
  275. <span>
  276. <input style={{ height: "30px", width: "250px" }} type='text' defaultValue={""} ref="inputMemberatkan" />
  277. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemberatkan(), this.isEditKeberatan() }} />
  278. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditKeberatan} />
  279. </span>
  280. : <Button onClick={this.isEditKeberatan} className=" p-0 m-0" color="success">Input Data</Button>}
  281. <ol type="a">
  282. {dataSuratBA?.memberatkan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.memberatkan.map((value) => <li>{value}</li>)}
  283. </ol>
  284. </li>
  285. <li>hal-hal yang meringankan, sebagai berikut:
  286. {isEditMeringankan ?
  287. <span>
  288. <input type='text' defaultValue={""} ref="inputMeringankan" />
  289. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemringankan(), this.isEditMeringankan() }} />
  290. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditMeringankan} />
  291. </span>
  292. : <Button onClick={this.isEditMeringankan} className=" p-0 m-0" color="success">Input Data</Button>}
  293. <ol type="a">
  294. {dataSuratBA?.meringankan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.meringankan.map((value) => <li>{value}</li>)}
  295. </ol>
  296. </li>
  297. <li>
  298. Berdasarkan pembahasan yang dilakukan, disepakati untuk merekomendasikan <strong>“Sanksi Administratif berupa
  299. {isEditSanksi &&
  300. <span>
  301. <input type='text'
  302. defaultValue=""
  303. ref="inputsanksi"
  304. onChange={() => {
  305. this.setState({ sanksi: this.refs.inputsanksi.value }, this.setDataSuratBA)
  306. }}
  307. />
  308. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditSanksi} />
  309. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.isEditSanksi() }} />
  310. </span>
  311. }
  312. {dataSuratBA?.sanksi || autoSaveDataSuratBA?.sanksi ?
  313. <span onClick={this.isEditSanksi}>
  314. &nbsp;{dataSuratBA?.sanksi || autoSaveDataSuratBA?.sanksi}
  315. </span>
  316. :
  317. <span onClick={this.isEditSanksi}>[Mohon Diisi]</span>
  318. }
  319. </strong>
  320. </li>
  321. </ol>
  322. </div>
  323. <p className=''>
  324. Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
  325. </p>
  326. <p>
  327. <CopyToClipboard
  328. text={`https://dev.sidali.kemdikbud.go.id/signature/pleno-sanksi/${dataLaporan.data?._id}`}
  329. options={{ asHtml: true }}
  330. >
  331. <div>
  332. <span className="btn-radius">
  333. <Button color id="Popover1" className="btn-labeled-3" onClick={() => {
  334. this.setState({
  335. setmeState: !this.state.setmeState
  336. }, this.setDataSuratBA()), this.handleAutoSave(), this.CloseCopied()
  337. }} >
  338. <h4 className="p-0 mt-2 float-right"> <em className="fas fa-project-diagram float-left mt-1" /> &nbsp;Link Dokumen</h4>
  339. </Button>
  340. </span>
  341. <Popover placement="bottom" isOpen={this.state.copied} target="Popover1" toggle={this.Copied}>
  342. <PopoverHeader>Link Berhasil Disalin</PopoverHeader>
  343. </Popover>
  344. </div>
  345. </CopyToClipboard>
  346. </p>
  347. <table className='demo'>
  348. <tbody>
  349. <tr>
  350. <th className='thdemo' colspan="4">PESERTA RAPAT PENYUSUNAN REKOMENDASI</th>
  351. </tr>
  352. <tr className='trdemo'>
  353. <th className='trdemo'>No</th>
  354. <th className='trdemo'>Nama</th>
  355. <th className='trdemo'>Tanda Tangan</th>
  356. </tr>
  357. {dataLaporan
  358. ? dataLaporan.data?.peserta_penetapan_sanksi?.map((value, index) => (
  359. <tr>
  360. <td className='trdemo'>{index + 1}</td>
  361. <td className=' tddemo'>{value.nama}</td>
  362. <td className='tddemo'>
  363. <img
  364. style={{ width: "200px" }}
  365. src={value.ttd.path} />
  366. </td>
  367. </tr>)) : ""}
  368. </tbody>
  369. </table>
  370. {/* <div>
  371. <div id="ttd-header" className='text-center signature-border'>
  372. <span className='text-center'> PESERTA RAPAT PENYUSUNAN REKOMENDASI</span>
  373. </div>
  374. <div id="ttd">
  375. {dataLaporan
  376. ? dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => (
  377. <div className='ttd-div'>
  378. <img
  379. className='sign-ttd'
  380. src={value.ttd.path} />
  381. <div className='sign-nama font-color-black'>{value.nama}</div>
  382. </div>
  383. )) : ""}
  384. </div>
  385. </div> */}
  386. </page>
  387. </div>
  388. </div >
  389. );
  390. }
  391. }
  392. export default BeritaAcara