BeritaAcara_A.js 26 KB

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