Selaa lähdekoodia

penambahan laporan delegasi dan fixing bug

yazid138 3 vuotta sitten
vanhempi
commit
1704e493a5

+ 2 - 2
actions/log.js

@@ -1,9 +1,9 @@
 import { get } from "../config/request";
 import axios from "@/config/axios";
 
-export const getLog = async (token, ptId) => {
+export const getLog = async (token, laporan_id) => {
 	try {
-		let url = `/pemantauan/${ptId}`;
+		let url = `/pemantauan/${laporan_id}`;
 		const res = await axios.get(url, {
 			headers: {
 				Authorization: token,

+ 6 - 1
actions/pelaporan.js

@@ -5,13 +5,18 @@ export const getPelaporan = async (token, query = {}) => {
 	try {
 		let url = "/laporan";
 		if (query != null) {
-			const { jadwal, evaluasi } = query;
+			const { jadwal, evaluasi, pt_id, delegasi } = query;
 			url += "?";
 			const parseURL = [];
 			if (jadwal) {
 				parseURL.push(`jadwal=true`);
 			} else if (evaluasi) {
 				parseURL.push(`evaluasi=true`);
+			} else if (delegasi) {
+				parseURL.push(`delegasi=true`);
+			}
+			if (pt_id) {
+				parseURL.push(`pt_id=${pt_id}`);
 			}
 
 			url += parseURL.join("&");

+ 6 - 0
components/Layout/Menu.js

@@ -9,6 +9,12 @@ const Menu = [
 		icon: "icon-notebook",
 		translate: "sidebar.nav.PEMANTAUAN",
 	},
+	{
+		name: "Laporan Delegasi",
+		path: "/app/laporan-delegasi",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.LAPORAN_DELEGASI",
+	},
 	{
 		name: "Pelaporan",
 		path: "/app/pelaporan",

+ 6 - 0
components/Layout/MenuLLDIKTI.js

@@ -9,6 +9,12 @@ const Menu = [
 		icon: "icon-notebook",
 		translate: "sidebar.nav.PEMANTAUAN",
 	},
+	{
+		name: "Laporan Delegasi",
+		path: "/app/laporan-delegasi",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.LAPORAN_DELEGASI",
+	},
 	{
 		name: "Pelaporan",
 		path: "/app/pelaporan",

+ 14 - 5
components/Main/Timeline.js

@@ -1,8 +1,9 @@
 import moment from "moment";
-import { API_URL } from "@/env";
+import { useSelector } from "react-redux";
 
 function Timeline({ data, noFile = false, noJadwal = false }) {
 	const date = data && [...new Set(data.map((e) => moment(e.createdAt).format("DD MMMM YYYY")))];
+	const user = useSelector((state) => state.user);
 	return (
 		<ul className="timeline-alt">
 			{date.map((value) => (
@@ -44,15 +45,23 @@ function Timeline({ data, noFile = false, noJadwal = false }) {
 														<p className="text-muted m-0">{moment(data.createdAt).format("hh:mm")}</p>
 													</p>
 												</div>
-												{!noJadwal && data.jadwal && (
+												{!data.user.isPublic && user?.role.id !== 2022 && data.jawaban && (
+													<>
+														<p className="text-muted my-2">Jawaban</p>
+														<div className="p-2">
+															<b>{data.jawaban}</b>
+														</div>
+													</>
+												)}
+												{!data.user.isPublic && data.jadwal && (
 													<>
 														<p className="text-muted my-2">Jadwal Pemeriksaan</p>
-														<p>
+														<div className="p-2">
 															Tanggal {moment(data.jadwal.dari_tanggal).format("DD MMMM YYYY")} - {moment(data.jadwal.sampai_tanggal).format("DD MMMM YYYY")}
-														</p>
+														</div>
 													</>
 												)}
-												{!noFile && data.dokumen.length ? (
+												{!data.user.isPublic && data.dokumen?.length ? (
 													<>
 														<p className="text-muted my-2">Dokumen</p>
 														{data.dokumen.map((e) => (

+ 2 - 3
components/PT/JawabanBanding/DetailJawaban.js

@@ -1,9 +1,8 @@
 import { FormGroup, Button } from "reactstrap";
 import Scrollable from "@/components/Common/Scrollable";
 import Link from "next/link";
-import { API_URL } from "@/env";
 
-function DetailJawaban({ data }) {
+function DetailJawaban({ data, sanksiId }) {
 	return (
 		<>
 			<p className="lead bb">Jawaban Permohonan Banding</p>
@@ -46,7 +45,7 @@ function DetailJawaban({ data }) {
 				<Link
 					href={{
 						pathname: "/pt/dokumen-perbaikan/detail",
-						query: { id: data._id },
+						query: { id: sanksiId },
 					}}
 				>
 					<Button color="primary">Perbaiki Dokumen</Button>

+ 1 - 1
components/PT/JawabanBanding/TableSanksiJawaban.js

@@ -26,7 +26,7 @@ function TableSanksi({ listData, to, linkName }) {
 											<div className="media-body d-flex">
 												<div>
 													<h4 className="m-0">{data.laporan.pt.nama}</h4>
-													<p>{data.keterangan.length > 70 ? dataketerangan.substring(0, 70) + "..." : data.keterangan}</p>
+													<p>{data.keterangan.length > 70 ? data.keterangan.substring(0, 70) + "..." : data.keterangan}</p>
 												</div>
 											</div>
 										</div>

+ 1 - 1
components/PT/TableSanksi.js

@@ -25,7 +25,7 @@ function TableSanksi({ listData, to, linkName }) {
 											<div className="media-body d-flex">
 												<div>
 													<h4 className="m-0">{data.laporan.pt.nama}</h4>
-													<p>{data.keterangan.length > 70 ? data.sanksi.description.substring(0, 70) + "..." : data.keterangan}</p>
+													<p>{data.keterangan.length > 70 ? data.keterangan.substring(0, 70) + "..." : data.keterangan}</p>
 												</div>
 											</div>
 										</div>

+ 93 - 0
pages/app/laporan-delegasi/detail.js

@@ -0,0 +1,93 @@
+import React, { Component } from "react";
+import Header from "@/components/Main/Header";
+import DetailPT from "@/components/Main/DetailPT";
+import { getOneLaporan } from "@/actions/pelaporan";
+import { getLog } from "@/actions/log";
+import DetailLaporan from "@/components/Main/DetailLaporan";
+import Link from "next/link";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col, Card, CardBody, FormGroup } from "reactstrap";
+import Loader from "@/components/Common/Loader";
+import { connect } from "react-redux";
+import Scrollable from "@/components/Common/Scrollable";
+import Timeline from "@/components/Main/Timeline";
+
+class DetailPelaporan extends Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			pelaporan: {},
+			pemantauan: {},
+		};
+	}
+
+	static getInitialProps = async ({ query }) => {
+		return { query };
+	};
+
+	componentDidMount = async () => {
+		const { query } = this.props;
+		const pelaporan = await getOneLaporan(this.props.token, query.id + "?delegasi=true");
+		const pemantauan = await getLog(this.props.token, query.id + "?delegasi=true&asc=true");
+		pemantauan.data = pemantauan.data.filter((e) => e.action != "CREATE LAPORAN");
+		this.setState({ pelaporan, pemantauan });
+	};
+
+	render() {
+		const { pelaporan, pemantauan } = this.state;
+		return (
+			<ContentWrapper unwrap>
+				{/* <Header /> */}
+				<div className="p-3">
+					<div className="content-heading">
+						<div>Detail Laporan Delegasi</div>
+						<div className="ml-auto">
+							<Link href="/app/laporan-delegasi">
+								<button className="btn btn-sm btn-secondary text-sm">&lt; back</button>
+							</Link>
+						</div>
+					</div>
+					<Row>
+						<Col xl="9">
+							{pelaporan.data ? (
+								<Card className="card-default">
+									<CardBody>
+										<Row>
+											<Col lg={12}>
+												{<DetailLaporan data={pelaporan.data} />}
+												<p className="lead bb">Keterangan Delegasi</p>
+												<form className="form-horizontal">
+													<FormGroup row>
+														<Col md="4">Alasan Delegasi:</Col>
+														<Col md="8">
+															<Scrollable height="100px" className="list-group">
+																<p>{pelaporan.data.alasan_delegasi}</p>
+															</Scrollable>
+														</Col>
+													</FormGroup>
+												</form>
+											</Col>
+										</Row>
+									</CardBody>
+								</Card>
+							) : (
+								<Loader />
+							)}
+						</Col>
+						<Col xl="3">{pelaporan.data ? <DetailPT data={pelaporan.data.pt} /> : <Loader />}</Col>
+					</Row>
+					<Row>
+						{pemantauan.data && (
+							<Col xl={12}>
+								<Timeline data={pemantauan.data} />
+							</Col>
+						)}
+					</Row>
+				</div>
+			</ContentWrapper>
+		);
+	}
+}
+
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(DetailPelaporan);

+ 44 - 0
pages/app/laporan-delegasi/index.js

@@ -0,0 +1,44 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { getPelaporan } from "@/actions/pelaporan";
+import CaseProgress from "@/components/Main/CaseProgress";
+import TableLaporan from "@/components/Main/TableLaporan";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+
+class Pelaporan extends Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			pelaporan: {},
+		};
+	}
+
+	componentDidMount = async () => {
+		const pelaporan = await getPelaporan(this.props.token, { delegasi: true });
+		this.setState({ pelaporan });
+	};
+
+	render() {
+		const { pelaporan } = this.state;
+		return (
+			<ContentWrapper>
+				<div className="content-heading">
+					<div>Laporan Delegasi</div>
+					<div className="ml-auto"></div>
+				</div>
+				<Row>
+					<Col lg="4">
+						<CaseProgress />
+					</Col>
+					<Col lg="8">{pelaporan?.data ? <TableLaporan listData={pelaporan.data} to="/app/laporan-delegasi/detail" linkName="Detail" /> : <Loader />}</Col>
+				</Row>
+			</ContentWrapper>
+		);
+	}
+}
+
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Pelaporan);

+ 1 - 1
pages/pt/jawaban-banding/detail.js

@@ -51,7 +51,7 @@ class JawabanBanding extends Component {
 										<Row>
 											<Col lg={12}>
 												<DetailSanksi data={sanksi.data} />
-												<DetailJawaban data={sanksi.data.jawaban.banding} />
+												<DetailJawaban data={sanksi.data.jawaban.banding} sanksiId={sanksi.data._id} />
 											</Col>
 										</Row>
 									</CardBody>