BeritaAcara_A.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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. render() {
  119. const { dataPelanggaran, dataLaporan, dataSuratBA } = this.props
  120. const { isEditTempat, tempat, isEditTanggal, tanggal, setTanggal, namaPeserta, isEditNamaPeserta, simpulan, isEditTemuanLain, temuanLain, memberatkan, isEditKeberatan, isEditMeringankan, meringankan, sanksi, isEditSanksi, autoSaveDataSuratBA } = this.state
  121. return (
  122. <div>
  123. <div className=' content-heading border-radius-login'>
  124. <span className="btn-radius">
  125. <ReactToPrint
  126. trigger={() => {
  127. // NOTE: could just as easily return <SomeComponent />. Do NOT pass an `onClick` prop
  128. // to the root node of the returned component as it will be overwritten.
  129. return <span>
  130. <Button color className="btn-labeled-4">
  131. <h4 className="p-0 mt-2">Print dan Download</h4>
  132. </Button>
  133. </span>
  134. }}
  135. content={() => this.componentRef}
  136. />
  137. </span>
  138. </div>
  139. <div style={{ display: "none" }}>
  140. <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
  141. </div>
  142. <div className='page'>
  143. <page>
  144. <div className='BA-logo'>
  145. <img className='BA-logo' src="/static/img/logo-single-1-login.png" alt="logo" />
  146. </div>
  147. <h3 className='BA-header'>LAPORAN HASIL EVALUASI DAN PEMBAHASAN</h3>
  148. {dataLaporan.data && (<h3 className='BA-header'>{dataLaporan.data.pt.nama}</h3>)}
  149. <div className='body'>
  150. <p className='body'>
  151. Pada hari ini
  152. {isEditTanggal &&
  153. <span>
  154. <DatePicker
  155. selected={tanggal}
  156. onChange={(tanggal) => {
  157. this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
  158. }}
  159. dateFormat="dd/MM/yyyy"
  160. placeholderText="Isi Tanggal"
  161. locale={id}
  162. className="form-control bg-white"
  163. />
  164. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
  165. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
  166. />
  167. </span>
  168. }
  169. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  170. <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> :
  171. <span onClick={this.isEditTanggal}> &nbsp;[Mohon Diisi] &nbsp;</span>
  172. }
  173. &nbsp;bertempat di
  174. {isEditTempat &&
  175. <span>
  176. <input type='text'
  177. defaultValue=""
  178. ref="inputTempat"
  179. onChange={() => {
  180. this.setState({ tempat: this.refs.inputTempat.value, settempat: true }, this.setDataSuratBA)
  181. }}
  182. />
  183. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTempat} />
  184. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.isEditTempat() }} />
  185. </span>
  186. }
  187. {dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat ?
  188. <span onClick={this.isEditTempat}>
  189. &nbsp;{dataSuratBA?.tempat || autoSaveDataSuratBA?.tempat}
  190. </span>
  191. :
  192. <span onClick={this.isEditTempat}>[Mohon Diisi]</span>
  193. }
  194. ,
  195. 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:
  196. </p>
  197. <div className='body'>
  198. <ol>
  199. {dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => <li>{value.nama}</li>)}
  200. </ol>
  201. </div>
  202. </div>
  203. <p>
  204. 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:
  205. </p>
  206. <div className='body'>
  207. <ol>
  208. <li>Telah dibacakan Berita Acara Evaluasi Kinerja Perguruan Tinggi {dataLaporan.data && (<span>{dataLaporan.data.pt.nama}</span>)}, tanggal
  209. {setTanggal === true || autoSaveDataSuratBA?.setTanggal === true ?
  210. <span> &nbsp;{moment(tanggal || autoSaveDataSuratBA?.tanggal).format("DD-MM-YYYY")}</span>
  211. :
  212. <span> &nbsp;....... &nbsp;</span>
  213. }
  214. </li>
  215. <li>Telah dilakukan pembahasan rekomendasi mengenai fakta-fakta yang ditemukan Tim EKPT Ditjen Diktiristek, dengan temuan sebagai berikut:</li>
  216. <table className='table-a'>
  217. <thead>
  218. <tr>
  219. <th rowspan="2">NO</th>
  220. <th rowspan="2">NAMA DAN IZIN PRODI</th>
  221. <th colspan="3">PELANGGARAN TERHADAP PERMENDIKBUD NO.7 TAHUN 2020</th>
  222. <th rowspan="2">SIMPULAN</th>
  223. <th rowspan="2">REKOMENDASI</th>
  224. </tr>
  225. <tr>
  226. <th>PASAL</th>
  227. <th>BUTIR PELANGGARAN</th>
  228. <th>DESKRIPSI PELANGGARAN</th>
  229. </tr>
  230. </thead>
  231. <tbody>
  232. {dataPelanggaran
  233. ? dataPelanggaran.map((e, i) => (
  234. <tr key={e._id}>
  235. <td>{++i}</td>
  236. {dataLaporan.data && (<td className='BA-header'>{dataLaporan.data.pt.nama}</td>)}
  237. <td>{e.pasal}</td>
  238. <td>{e.butir_pelanggaran}</td>
  239. <td>{e.pelanggaran}</td>
  240. <td contenteditable='true'>[Mohon Diisi]</td>
  241. <td contenteditable='true'>[Mohon Diisi]</td>
  242. </tr>
  243. ))
  244. : ""}
  245. </tbody>
  246. </table>
  247. <li>Temuan Lain:
  248. {isEditTemuanLain ?
  249. <span>
  250. <input style={{ height: "30px", width: "250px" }} type='textarea' defaultValue={""} ref="inputTemuan"
  251. />
  252. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => {
  253. this.updateValueTemuanLain(), this.isEditTemuanLain(), this.handleAutoSave()
  254. }} />
  255. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTemuanLain} />
  256. </span>
  257. : <Button onClick={this.isEditTemuanLain} className=" p-0 m-0" color="success">Input Data</Button>}
  258. <ol type="a">
  259. {dataSuratBA?.temuanLain.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.temuanLain.map((value) => <li>{value}</li>)}
  260. </ol>
  261. </li>
  262. <li>Hal-hal yang memberatkan, sebagai berikut:
  263. {isEditKeberatan ?
  264. <span>
  265. <input style={{ height: "30px", width: "250px" }} type='text' defaultValue={""} ref="inputMemberatkan" />
  266. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemberatkan(), this.isEditKeberatan() }} />
  267. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditKeberatan} />
  268. </span>
  269. : <Button onClick={this.isEditKeberatan} className=" p-0 m-0" color="success">Input Data</Button>}
  270. <ol type="a">
  271. {dataSuratBA?.memberatkan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.memberatkan.map((value) => <li>{value}</li>)}
  272. </ol>
  273. </li>
  274. <li>hal-hal yang meringankan, sebagai berikut:
  275. {isEditMeringankan ?
  276. <span>
  277. <input type='text' defaultValue={""} ref="inputMeringankan" />
  278. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={() => { this.updateValueMemringankan(), this.isEditMeringankan() }} />
  279. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditMeringankan} />
  280. </span>
  281. : <Button onClick={this.isEditMeringankan} className=" p-0 m-0" color="success">Input Data</Button>}
  282. <ol type="a">
  283. {dataSuratBA?.meringankan.map((value) => <li>{value}</li>) || autoSaveDataSuratBA?.meringankan.map((value) => <li>{value}</li>)}
  284. </ol>
  285. </li>
  286. <li>
  287. Berdasarkan pembahasan yang dilakukan, disepakati untuk merekomendasikan <strong>“Sanksi Administratif berupa {isEditSanksi ?
  288. <span>
  289. <input type='text'
  290. defaultValue=""
  291. ref="inputSanksi" />
  292. <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditSanksi} />
  293. <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.updateValueSanksi} />
  294. </span> : <span onClick={this.isEditSanksi}>&nbsp;{dataSuratBA?.sanksi || autoSaveDataSuratBA?.sanksi}</span>}</strong>
  295. </li>
  296. </ol>
  297. </div>
  298. <p className=''>
  299. Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
  300. </p>
  301. <p>
  302. <CopyToClipboard
  303. text={`https://dev.sidali.kemdikbud.go.id/signature/pleno-sanksi/${dataLaporan.data?._id}`}
  304. options={{ asHtml: true }}
  305. >
  306. <div>
  307. <Button color="" id="Popover1" className="btn-labeled-notHover" onClick={() => {
  308. this.setState({
  309. setTemuanLain: !this.state.setTemuanLain
  310. }, this.setDataSuratBA()), this.handleAutoSave()
  311. }}>
  312. <h4 className="mt-2 mb-md-2 text-center font-color-white pl-3 pr-3">Copy Link Add Peserta</h4>
  313. </Button>
  314. <Popover placement="bottom" isOpen={this.state.Copied} target="Popover1" toggle={this.Copied}>
  315. <PopoverHeader>Berhasil Copy Link</PopoverHeader>
  316. <PopoverBody><strong>Link</strong>:https://dev.sidali.kemdikbud.go.id//app/signature/pleno-sanksi/${dataLaporan.data?._id}</PopoverBody>
  317. </Popover>
  318. </div>
  319. </CopyToClipboard>
  320. </p>
  321. <table className='demo'>
  322. <tbody>
  323. <tr>
  324. <th colspan="4">PESERTA RAPAT PENYUSUNAN REKOMENDASI</th>
  325. </tr>
  326. {dataLaporan
  327. ? dataLaporan.data?.peserta_penetapan_sanksi?.map((value) => (
  328. <tr>
  329. <td>{value.nama}</td>
  330. <td>
  331. <img
  332. style={{ width: "200px" }}
  333. src={value.ttd.path} />
  334. </td>
  335. </tr>)) : ""}
  336. </tbody>
  337. </table>
  338. </page>
  339. </div>
  340. </div >
  341. );
  342. }
  343. }
  344. export default BeritaAcara