BeritaAcara_A.js 25 KB

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