BeritaAcara_A.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  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. setTemuanLain: 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. isEditNamaPeserta = () => {
  67. this.setState({
  68. isEditNamaPeserta: !this.state.isEditNamaPeserta,
  69. }, this.setDataSuratBA, this.handleAutoSave())
  70. }
  71. isEditTemuanLain = () => {
  72. this.setState({
  73. isEditTemuanLain: !this.state.isEditTemuanLain,
  74. }, this.setDataSuratBA, this.handleAutoSave())
  75. }
  76. isEditKeberatan = () => {
  77. this.setState({
  78. isEditKeberatan: !this.state.isEditKeberatan,
  79. }, this.setDataSuratBA, this.handleAutoSave())
  80. }
  81. isEditMeringankan = () => {
  82. this.setState({
  83. isEditMeringankan: !this.state.isEditMeringankan,
  84. }, this.setDataSuratBA, this.handleAutoSave())
  85. }
  86. isEditSanksi = () => {
  87. this.setState({
  88. isEditSanksi: !this.state.isEditSanksi,
  89. }, this.setDataSuratBA, this.handleAutoSave())
  90. }
  91. updateValueTemuanLain = () => {
  92. const addTemuanLain = this.refs.inputTemuan.value
  93. this.setState({
  94. temuanLain: [...this.state.temuanLain, addTemuanLain]
  95. }, this.setDataSuratBA, this.handleAutoSave())
  96. }
  97. updateValueMemringankan = () => {
  98. const addMeringankan = this.refs.inputMeringankan.value
  99. this.setState({
  100. meringankan: [...this.state.meringankan, addMeringankan]
  101. }, this.setDataSuratBA, this.handleAutoSave())
  102. }
  103. updateValueMemberatkan = () => {
  104. const addKeberatan = this.refs.inputMemberatkan.value
  105. this.setState({
  106. memberatkan: [...this.state.memberatkan, addKeberatan]
  107. }, this.setDataSuratBA, this.handleAutoSave())
  108. }
  109. updateValueSanksi = () => {
  110. this.setState({
  111. isEditSanksi: false,
  112. sanksi: this.refs.inputSanksi.value
  113. }, this.setDataSuratBA, this.handleAutoSave())
  114. }
  115. Copied = () => this.setState({
  116. copied: !this.state.copied
  117. })
  118. CloseCopied = () => {
  119. setTimeout(() => {
  120. this.setState({
  121. copied: !this.state.copied
  122. });
  123. }, 3000);
  124. }
  125. render() {
  126. const { dataPelanggaran, dataLaporan, dataSuratBA } = this.props
  127. const { isEditTempat, tempat, isEditTanggal, tanggal, setTanggal, namaPeserta, isEditNamaPeserta, simpulan, isEditTemuanLain, temuanLain, memberatkan, isEditKeberatan, isEditMeringankan, meringankan, sanksi, isEditSanksi, autoSaveDataSuratBA } = this.state
  128. return (
  129. <div>
  130. <div className=' content-heading border-radius-login'>
  131. <span className="btn-radius">
  132. <ReactToPrint
  133. trigger={() => {
  134. // NOTE: could just as easily return <SomeComponent />. Do NOT pass an `onClick` prop
  135. // to the root node of the returned component as it will be overwritten.
  136. return <span>
  137. <Button color className="btn-labeled-4">
  138. <h4 className="p-0 mt-2">Print dan Download</h4>
  139. </Button>
  140. </span>
  141. }}
  142. content={() => this.componentRef}
  143. />
  144. </span>
  145. </div>
  146. <div style={{ display: "none" }}>
  147. <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
  148. </div>
  149. <div className='page'>
  150. <page>
  151. <div className='BA-logo'>
  152. <img className='BA-logo' src="/static/img/logo-single-1-login.png" alt="logo" />
  153. </div>
  154. <h3 className='BA-header'>LAPORAN HASIL EVALUASI DAN PEMBAHASAN</h3>
  155. {dataLaporan.data && (<h3 className='BA-header'>{dataLaporan.data.pt.nama}</h3>)}
  156. <div className='body'>
  157. <p className='body'>
  158. Pada hari ini
  159. {isEditTanggal &&
  160. <span>
  161. <DatePicker
  162. selected={tanggal}
  163. onChange={(tanggal) => {
  164. this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
  165. }}
  166. dateFormat="dd/MM/yyyy"
  167. placeholderText="Isi Tanggal"
  168. locale={id}
  169. className="form-control bg-white"
  170. />
  171. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
  172. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
  173. />
  174. </span>
  175. }
  176. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  177. <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> :
  178. <span onClick={this.isEditTanggal}> &nbsp;[Mohon Diisi] &nbsp;</span>
  179. }
  180. &nbsp;bertempat di
  181. {isEditTempat &&
  182. <span>
  183. <input type='text'
  184. defaultValue=""
  185. ref="inputTempat"
  186. onChange={() => {
  187. this.setState({ tempat: this.refs.inputTempat.value, settempat: true }, this.setDataSuratBA)
  188. }}
  189. />
  190. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTempat} />
  191. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.isEditTempat() }} />
  192. </span>
  193. }
  194. {dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat ?
  195. <span onClick={this.isEditTempat}>
  196. &nbsp;{dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat}
  197. </span>
  198. :
  199. <span onClick={this.isEditTempat}>[Mohon Diisi]</span>
  200. }
  201. ,
  202. 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:
  203. </p>
  204. <div className='body'>
  205. <ol>
  206. {dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => <li>{value.nama}</li>)}
  207. </ol>
  208. </div>
  209. </div>
  210. <p>
  211. 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:
  212. </p>
  213. <div className='body'>
  214. <ol>
  215. <li>Telah dibacakan Berita Acara Evaluasi Kinerja Perguruan Tinggi {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, tanggal
  216. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  217. <span> &nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("DD-MM-YYYY")}</span>
  218. :
  219. <span> &nbsp;....... &nbsp;</span>
  220. }
  221. </li>
  222. <li>Telah dilakukan pembahasan rekomendasi mengenai fakta-fakta yang ditemukan Tim EKPT Ditjen Diktiristek, dengan temuan sebagai berikut:</li>
  223. <table className='table-a'>
  224. <thead>
  225. <tr>
  226. <th rowspan="2">NO</th>
  227. <th rowspan="2">NAMA DAN IZIN PRODI</th>
  228. <th colspan="3">PELANGGARAN TERHADAP PERMENDIKBUD NO.7 TAHUN 2020</th>
  229. <th rowspan="2">SIMPULAN</th>
  230. <th rowspan="2">REKOMENDASI</th>
  231. </tr>
  232. <tr>
  233. <th>PASAL</th>
  234. <th>BUTIR PELANGGARAN</th>
  235. <th>DESKRIPSI PELANGGARAN</th>
  236. </tr>
  237. </thead>
  238. <tbody>
  239. {dataPelanggaran
  240. ? dataPelanggaran.map((e, i) => (
  241. <tr key={e._id}>
  242. <td>{++i}</td>
  243. {dataLaporan.data && (<td className='BA-header'>{dataLaporan.data.pt.nama}</td>)}
  244. <td>{e.pasal}</td>
  245. <td>{e.butir_pelanggaran}</td>
  246. <td>{e.pelanggaran}</td>
  247. <td contenteditable='true'>[Mohon Diisi]</td>
  248. <td contenteditable='true'>[Mohon Diisi]</td>
  249. </tr>
  250. ))
  251. : ""}
  252. </tbody>
  253. </table>
  254. <li>Temuan Lain:
  255. {isEditTemuanLain ?
  256. <span>
  257. <input style={{ height: "30px", width: "250px" }} type='textarea' defaultValue={""} ref="inputTemuan"
  258. />
  259. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => {
  260. this.updateValueTemuanLain(), this.isEditTemuanLain(), this.handleAutoSave()
  261. }} />
  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. {dataSuratBA?.temuanLain.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.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. {dataSuratBA?.memberatkan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.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. {dataSuratBA?.meringankan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.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;{dataSuratBA?.sanksi || autoSaveDataSuratBA?.sanksi}</span>}</strong>
  302. </li>
  303. </ol>
  304. </div>
  305. <p className=''>
  306. Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
  307. </p>
  308. <p>
  309. <CopyToClipboard
  310. text={`https://dev.sidali.kemdikbud.go.id/signature/pleno-sanksi/${dataLaporan.data?._id}`}
  311. options={{ asHtml: true }}
  312. >
  313. <div>
  314. <Button color="" id="Popover1" className="btn-labeled-notHover" onClick={() => {
  315. this.setState({
  316. setTemuanLain: !this.state.setTemuanLain
  317. }, this.setDataSuratBA()), this.handleAutoSave(), this.CloseCopied()
  318. }}>
  319. <h4 className="mt-2 mb-md-2 text-center font-color-white pl-3 pr-3">Copy Link Add Peserta</h4>
  320. </Button>
  321. <Popover placement="bottom" isOpen={this.state.copied} target="Popover1" toggle={this.Copied}>
  322. <PopoverHeader>Berhasil Copy Link</PopoverHeader>
  323. <PopoverBody><strong>Link</strong>:https://dev.sidali.kemdikbud.go.id//app/signature/pleno-sanksi/${dataLaporan.data?._id}</PopoverBody>
  324. </Popover>
  325. </div>
  326. </CopyToClipboard>
  327. </p>
  328. <table className='demo'>
  329. <tbody>
  330. <tr>
  331. <th colspan="4">PESERTA RAPAT PENYUSUNAN REKOMENDASI</th>
  332. </tr>
  333. {dataLaporan
  334. ? dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => (
  335. <tr>
  336. <td>{value.nama}</td>
  337. <td>
  338. <img
  339. style={{ width: "200px" }}
  340. src={value.ttd.path} />
  341. </td>
  342. </tr>)) : ""}
  343. </tbody>
  344. </table>
  345. {/* <div>
  346. <div id="ttd-header" className='text-center signature-border'>
  347. <span className='text-center'> PESERTA RAPAT PENYUSUNAN REKOMENDASI</span>
  348. </div>
  349. <div id="ttd">
  350. {dataLaporan
  351. ? dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => (
  352. <div className='ttd-div'>
  353. <img
  354. className='sign-ttd'
  355. src={value.ttd.path} />
  356. <div className='sign-nama font-color-black'>{value.nama}</div>
  357. </div>
  358. )) : ""}
  359. </div>
  360. </div> */}
  361. </page>
  362. </div>
  363. </div >
  364. );
  365. }
  366. }
  367. export default BeritaAcara