timeline.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import React, { Component } from "react";
  2. import ContentWrapper from "@/components/Layout/ContentWrapper";
  3. import { getLog } from "@/actions/log";
  4. import { Row, Col, Card, CardBody, Button } from "reactstrap";
  5. import Timeline from "@/components/Main/Timeline";
  6. import { getOnePT } from "@/actions/PT";
  7. import { connect } from "react-redux";
  8. import { getOneLaporan, getPelaporan } from "../../../actions/pelaporan";
  9. import DetailLaporan from "@/components/Main/DetailLaporan";
  10. import Link from "next/link";
  11. import Loader from "@/components/Common/Loader";
  12. import DetailPT from "@/components/Main/DetailPT";
  13. import moment from "moment";
  14. import Datatable from "@/components/Tables/Datatable";
  15. <meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>;
  16. class Pemantauan extends Component {
  17. constructor(props) {
  18. super(props);
  19. this.state = {
  20. log: {},
  21. detailLaporanPt: {},
  22. pelaporan: {},
  23. pt: {},
  24. };
  25. }
  26. static async getInitialProps({ query }) {
  27. return { query };
  28. }
  29. componentDidMount = async () => {
  30. const { query, token } = this.props;
  31. const ptId = query.ptId;
  32. const pelaporan = await getPelaporan(token, { pt_id: ptId, all: true, aktif: true });
  33. const pt = await getOnePT(token, ptId);
  34. this.setState({ pelaporan, pt });
  35. };
  36. handleLihatPemantaun = async (e, id_laporan) => {
  37. const { token } = this.props;
  38. const log = await getLog(token, id_laporan);
  39. const detailLaporanPt = await getOneLaporan(token, id_laporan, { all: true, aktif: true });
  40. this.setState({ detailLaporanPt, log });
  41. };
  42. render() {
  43. const { detailLaporanPt, log, pt, pelaporan } = this.state;
  44. return (
  45. <ContentWrapper unwrap>
  46. <div className="p-3">
  47. <div className="content-heading">
  48. <div className="font-color-white">Pemantauan {pt?.data && pt.data.nama}</div>
  49. <div className="ml-auto">
  50. <Link href="/app/pemantauan">
  51. <Button className="color-3e3a8e" color>
  52. <span className="font-color-white">&lt; Kembali</span>
  53. </Button>
  54. </Link>
  55. </div>
  56. </div>
  57. <Row>
  58. <Col xl={9}>
  59. <div className="card b">
  60. <div className="card-body">
  61. {pelaporan.data?.length ? (
  62. <Datatable options={{ responsive: false }}>
  63. <table className="table w-100" data-order='[[0, "desc"]]'>
  64. <thead>
  65. <tr>
  66. <th>Tanggal</th>
  67. <th>No.Laporan</th>
  68. <th>Deskripsi Laporan</th>
  69. <th>Pelapor</th>
  70. <th>Aksi</th>
  71. </tr>
  72. </thead>
  73. <tbody>
  74. {pelaporan.data.map((data) => {
  75. return (
  76. <tr key={data._id}>
  77. <td>
  78. <p style={{ display: "none" }}>{data.createdAt}</p>
  79. {moment(data.createdAt).format("DD/MM/YYYY")}</td>
  80. <td>{data.no_laporan}</td>
  81. <td className="text-nowrap">
  82. <div className="media align-items-center">
  83. <div className="media-body d-flex">
  84. <div>
  85. <p>{data.keterangan.length > 35 ? data.keterangan.substring(0, 35) + "..." : data.keterangan}</p>
  86. </div>
  87. </div>
  88. </div>
  89. </td>
  90. <td>
  91. {data.user?.isPrivate ? "" : data.user?.nama} - {data.role_asal}
  92. </td>
  93. <td>
  94. <div>
  95. <Button color className="color-3e3a8e" onClick={(e) => this.handleLihatPemantaun(e, data._id)}>
  96. <span className="font-color-white">Detail</span>
  97. </Button>
  98. </div>
  99. </td>
  100. </tr>
  101. );
  102. })}
  103. </tbody>
  104. </table>
  105. </Datatable>
  106. ) : pelaporan.data ? (
  107. "Pelaporan tidak ada"
  108. ) : (
  109. <Loader />
  110. )}
  111. </div>
  112. </div>
  113. </Col>
  114. <Col xl={3}>{pt?.data ? <DetailPT data={pt.data} /> : <Loader />}</Col>
  115. </Row>
  116. <Row>
  117. <Col xl="12">
  118. {detailLaporanPt.data ? (
  119. <Card className="card-default">
  120. <CardBody>
  121. <Row>
  122. <Col lg={12}>{<DetailLaporan data={detailLaporanPt.data} />}</Col>
  123. </Row>
  124. </CardBody>
  125. </Card>
  126. ) : (
  127. <div></div>
  128. )}
  129. </Col>
  130. </Row>
  131. <Row>
  132. {log.data && (
  133. <Col xl={"12"}>
  134. <Timeline data={log.data} />
  135. </Col>
  136. )}
  137. </Row>
  138. </div>
  139. </ContentWrapper>
  140. );
  141. }
  142. }
  143. const mapStateToProps = (state) => ({ user: state.user, token: state.token });
  144. export default connect(mapStateToProps)(Pemantauan);