DetailSanksi.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import Scrollable from "@/components/Common/Scrollable";
  2. import moment from "moment";
  3. import { Col, FormGroup, Table, Button } from "reactstrap";
  4. import { API_URL } from "@/env";
  5. import React, { Component } from "react";
  6. import { getOneSanksi } from "../../actions/sanksi";
  7. import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
  8. import ComponentBA from "../Sanksi/SuratBA _detail";
  9. import Link from "next/dist/client/link";
  10. import { connect } from "react-redux";
  11. import Swal from "sweetalert2";
  12. class DetailSanksi extends Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. sanksi: {},
  17. };
  18. }
  19. static getInitialProps = async ({ query }) => {
  20. return { query };
  21. };
  22. componentDidMount = async () => {
  23. const { query, token } = this.props;
  24. const sanksi = await getOneSanksi(token, query.id);
  25. this.setState({ sanksi });
  26. };
  27. handleOpenAlert = () => {
  28. Swal.fire({
  29. icon: 'error',
  30. title: 'Oops...',
  31. html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
  32. confirmButtonColor: "#3e3a8e",
  33. confirmButtonText: 'Oke'
  34. })
  35. };
  36. render() {
  37. const { sanksi } = this.state
  38. const lastSanksi = sanksi.data?.sanksi?.at(-1);
  39. return (
  40. <>
  41. <p className="lead bb">Detail Sanksi</p>
  42. {sanksi.data &&
  43. <form className="form-horizontal">
  44. <FormGroup row>
  45. <Col md="4">Nomor Sanksi:</Col>
  46. <Col md="8">
  47. <strong>{sanksi.data.no_sanksi}</strong>
  48. </Col>
  49. </FormGroup>
  50. <FormGroup row>
  51. <Col md="4">Nama Perguruan Tinggi:</Col>
  52. <Col md="8">
  53. <strong>{sanksi.data.laporan.pt.nama}</strong>
  54. </Col>
  55. </FormGroup>
  56. <FormGroup row>
  57. <Col md="4">Keterangan:</Col>
  58. <Col md="8">
  59. <Scrollable height="100px" className="list-group">
  60. <p>{sanksi.data.keterangan}</p>
  61. </Scrollable>
  62. </Col>
  63. </FormGroup>
  64. <FormGroup row>
  65. <Col md="4">Tanggal Penetapan Sanksi:</Col>
  66. <Col md="8">
  67. <strong>{sanksi.data?.masa_berlaku?.from_date ? moment(sanksi.data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY") : "-"}</strong>
  68. </Col>
  69. </FormGroup>
  70. {
  71. sanksi.data.tanggal_akhir_keberatan &&
  72. <FormGroup row>
  73. <Col md="4">Tanggal Akhir Pengajuan Keberatan</Col>
  74. <Col md="8">
  75. <strong>{moment(sanksi.data.tanggal_akhir_keberatan).locale("id").format("D MMMM YYYY")}</strong>
  76. </Col>
  77. </FormGroup>
  78. }
  79. {
  80. sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding &&
  81. <FormGroup row>
  82. <Col md="4">Tanggal Akhir Pengajuan Banding:</Col>
  83. <Col md="8">
  84. <strong>{moment(sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding).locale("id").format("D MMMM YYYY")}</strong>
  85. </Col>
  86. </FormGroup>
  87. }
  88. <FormGroup row>
  89. <Col md="4">Dokumen Sanksi:</Col>
  90. <Col md="8">
  91. <Scrollable height="120px" className="list-group">
  92. <table className="table table-bordered bg-transparent">
  93. <tbody>
  94. {sanksi.data.dokumen.map((e) => (
  95. <tr>
  96. <td style={{ width: "30px" }}>
  97. <em className="fa-lg far fa-file-code"></em>
  98. </td>
  99. <td>
  100. {this.props?.user?.role.id === 2071 ?
  101. <a className="text-muted" onClick={this.handleOpenAlert} >
  102. {e.judul}
  103. </a>
  104. :
  105. <a className="text-muted" href={e.path} target="_blank" download={e.judul}>
  106. {e.judul}
  107. </a>
  108. }
  109. </td>
  110. </tr>
  111. ))}
  112. </tbody>
  113. </table>
  114. </Scrollable>
  115. </Col>
  116. </FormGroup>
  117. <FormGroup row>
  118. <Col md="4">Dokumen Acara Pleno:</Col>
  119. <Col md="8">
  120. <div>
  121. {this.props?.user?.role.id === 2071 ?
  122. <Button color className="btn-labeled-4 mt-0" onClick={this.handleOpenAlert}>
  123. <h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
  124. </Button>
  125. :
  126. <ReactToPrint
  127. trigger={() => {
  128. return <span>
  129. <Link
  130. href={{
  131. pathname: "/app/sanksi/detail",
  132. query: { id: this.props.query.id },
  133. }}>
  134. <Button color className="btn-labeled-4 mt-0">
  135. <h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
  136. </Button>
  137. </Link>
  138. </span>
  139. }}
  140. content={() => this.componentRef}
  141. />
  142. }
  143. <div style={{ display: "none" }}>
  144. <ComponentBA ref={el => (this.componentRef = el)} query={this.props.query} />
  145. </div>
  146. </div>
  147. </Col>
  148. </FormGroup>
  149. <FormGroup row>
  150. <Col md={12}>
  151. <div className="card b">
  152. <div className="card-body bb">
  153. <Table responsive>
  154. <thead>
  155. <tr>
  156. <th>Jenis Pelanggaran</th>
  157. <th>Sanksi</th>
  158. </tr>
  159. </thead>
  160. <tbody>
  161. {sanksi.data.pelanggaran.map((jp, index) => (
  162. <tr key={jp._id}>
  163. <td width={50}>
  164. <div className="media align-items-center">
  165. <div className="media-body d-flex">
  166. <div>
  167. <p>{jp.pelanggaran}</p>
  168. <p>Durasi : {jp.tmt_bulan} Bulan</p>
  169. <p>Jenis Sanksi Administratif : {jp.label_sanksi}</p>
  170. </div>
  171. </div>
  172. </div>
  173. </td>
  174. <td width={50}>
  175. <div className="media align-items-center">
  176. <div className="media-body d-flex">
  177. <div>
  178. <p>{jp.sanksi}</p>
  179. <p>Keterangan : {jp.keterangan_sanksi}</p>
  180. </div>
  181. </div>
  182. </div>
  183. </td>
  184. </tr>
  185. ))}
  186. </tbody>
  187. </Table>
  188. </div>
  189. </div>
  190. </Col>
  191. </FormGroup>
  192. {
  193. sanksi.data.riwayat_sanksi?.length ? (
  194. <FormGroup row>
  195. <Col md={12}>
  196. <div className="card b">
  197. <div className="card-body bb">
  198. <Table responsive>
  199. <thead>
  200. <tr>
  201. <th>Sanksi Saat Ini</th>
  202. </tr>
  203. </thead>
  204. <tbody>
  205. {lastSanksi && (
  206. <tr key={lastSanksi._id}>
  207. <td width={50}>
  208. <div className="media align-items-center">
  209. <div className="media-body d-flex">
  210. <div>
  211. <p>{lastSanksi.description}</p>
  212. <p>
  213. Durasi : {moment(sanksi.data?.masa_berlaku?.to_date).diff(sanksi.data?.masa_berlaku?.from_date, 'month')} Bulan
  214. </p>
  215. <p>Jenis Sanksi Administratif : {lastSanksi.label}</p>
  216. </div>
  217. </div>
  218. </div>
  219. </td>
  220. <td width={50}></td>
  221. </tr>
  222. )}
  223. </tbody>
  224. </Table>
  225. </div>
  226. </div>
  227. </Col>
  228. </FormGroup>
  229. ) : (
  230. ""
  231. )
  232. }
  233. </form>
  234. }
  235. </>
  236. )
  237. }
  238. }
  239. const mapStateToProps = (state) => ({ user: state.user, token: state.token });
  240. export default connect(mapStateToProps)(DetailSanksi)