Forráskód Böngészése

penambahan tabel radar pada dashboard
fix tuntas
fix detail sanksi

andi 2 éve
szülő
commit
92f89adfa9
41 módosított fájl, 548 hozzáadás és 200 törlés
  1. 2 2
      actions/cabutSanksi.js
  2. 23 16
      actions/pelaporan.js
  3. 2 2
      actions/pemeriksaan.js
  4. 3 3
      actions/sanksi.js
  5. 17 9
      components/Extras/calendar.view.js
  6. 2 1
      components/Layout/Header.js
  7. 6 6
      components/Layout/MenuReadOnly.js
  8. 6 6
      components/Layout/Sidebar.js
  9. 1 1
      components/Main/DetailSanksi.js
  10. 1 1
      components/PelaporanTuntas/CaseProgress.js
  11. 2 2
      components/PelaporanTuntas/DetailLaporan.js
  12. 1 1
      components/PelaporanTuntas/DetailSanksi.js
  13. 2 3
      components/PelaporanTuntas/TableLaporan.js
  14. 10 2
      components/Pemeriksaan/InputEvaluasi.js
  15. 1 1
      components/RekomendasiDelegasi/DetailSanksi.js
  16. 155 46
      components/Riwayat/TableRadar.js
  17. 1 1
      components/Sanksi/DetailSanksi.js
  18. 17 4
      components/Sanksi/Redudansi.js
  19. 1 1
      components/Sanksi/SuratBA _detail.js
  20. 0 3
      components/Sanksi/TablePenetapanSanksi.js
  21. 1 2
      pages/app/dashboard/all_Laporan.js
  22. 2 3
      pages/app/dashboard/banding.js
  23. 3 4
      pages/app/dashboard/cabutSanksi.js
  24. 62 0
      pages/app/dashboard/delegasi.js
  25. 1 1
      pages/app/dashboard/detail.js
  26. 1 1
      pages/app/dashboard/index.js
  27. 3 4
      pages/app/dashboard/keberatan.js
  28. 1 1
      pages/app/dashboard/pemeriksaan.js
  29. 1 1
      pages/app/dashboard/penjadwalan.js
  30. 2 3
      pages/app/dashboard/perbaikan.js
  31. 3 4
      pages/app/dashboard/sanksi.js
  32. 61 0
      pages/app/dashboard/tuntasCabutsanksi.js
  33. 61 0
      pages/app/dashboard/tuntasDitutup.js
  34. 0 1
      pages/app/pelaporan/search.js
  35. 54 41
      pages/app/pencabutan-sanksi/detail.js
  36. 1 0
      pages/app/sanksi/detail.js
  37. 11 1
      pages/app/sanksi/proses.js
  38. 18 15
      pages/app/tuntas/detail.js
  39. 6 4
      pages/app/tuntas/index.js
  40. 1 1
      pages/pt/jawaban-pencabutan-sanksi/index.js
  41. 2 2
      pages/signature/pleno-sanksi/[id].js

+ 2 - 2
actions/cabutSanksi.js

@@ -63,10 +63,10 @@ export const bypassCabutSanksi = async (token, id, _csrf) => {
 const logSuccessBypassCabutSanksi = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil melakukan bypass ke pencabutan sanksi, id: ${id}`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil melakukan bypass ke pencabutan sanksi, id: ${id}`,menu:"Bypass Pencabutan Sanksi", _csrf: _csrf });
 }
 const logErrorBypassCabutSanksi = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Gagal melakukan bypass ke pencabutan sanksi, id: ${id}`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Gagal melakukan bypass ke pencabutan sanksi, id: ${id}`, menu:"Bypass Pencabutan Sanksi",_csrf: _csrf });
 }

+ 23 - 16
actions/pelaporan.js

@@ -7,7 +7,7 @@ export const getPelaporan = async (token, query = {}) => {
 	try {
 		let url = "/laporan";
 		if (query != null) {
-			const { jadwal, evaluasi, pt_id, delegasi, aktif, sanksi, all } = query;
+			const { jadwal, evaluasi, pt_id, delegasi, aktif, sanksi, all, tuntas } = query;
 			url += "?";
 			const parseURL = [];
 			if (jadwal) {
@@ -23,6 +23,9 @@ export const getPelaporan = async (token, query = {}) => {
 			if (delegasi) {
 				parseURL.push(`delegasi=true`);
 			}
+			if (tuntas) {
+				parseURL.push(`tuntas=true`);
+			}
 
 			if (pt_id) {
 				parseURL.push(`pt_id=${pt_id}`);
@@ -74,17 +77,17 @@ export const getPelaporanPublic = async ({ number, noHp }) => {
 		return false;
 	}
 };
-
-export const createPelaporan = async (token, data, _csrf) => {
-	const res = await axiosAPI.post(`/laporan/create?_csrf=${_csrf}`, data, { headers: { Authorization: token } });
-	logCreatePelaporan(token)
-	return res.data;
-};
 const logCreatePelaporan = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil Membuat pelaporan`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil Membuat pelaporan`, menu: "Pelaporan", _csrf: _csrf });
 }
+export const createPelaporan = async (token, data, _csrf) => {
+	const res = await axiosAPI.post(`/laporan/create?_csrf=${_csrf}`, data, { headers: { Authorization: token } });
+	await logCreatePelaporan(token)
+	return res.data;
+};
+
 
 // export const createLaporanPublic = async (data) => {
 // 	try {
@@ -116,21 +119,16 @@ export const createLaporanPublic = async (token, data, _csrf) => {
 // 	}
 // };
 
-export const updateLaporan = async (token, id, data, _csrf) => {
+export const updateLaporan = async (token, id, data, _csrf, menu) => {
 	try {
 		const res = await axiosAPI.put(`/laporan/update/${id}?_csrf=${_csrf}`, data, { headers: { Authorization: token } });
-		if (data.aktif === "false") logUpdateLaporan(token, id);
 		return res.data;
 	} catch (error) {
 		console.log("error", error.response.data);
 		return false;
 	}
 };
-const logUpdateLaporan = async (token, id) => {
-	const getToken = await getCsrf();
-	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${id}`, _csrf: _csrf });
-}
+
 
 export const jumlahLaporan = async (token) => {
 	try {
@@ -145,7 +143,7 @@ export const getlaporanByPembina = async (token, idPembina, query = {}) => {
 	try {
 		let url = `/laporan/byPembina/${idPembina}`;
 		if (query != null) {
-			const { idPembina, penjadwalan, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, aktif } = query;
+			const { idPembina, penjadwalan, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, aktif, ditutup, delegasi, diterima } = query;
 			url += "?";
 			const parseURL = [];
 			if (idPembina) {
@@ -172,6 +170,15 @@ export const getlaporanByPembina = async (token, idPembina, query = {}) => {
 			if (cabutSanksi) {
 				parseURL.push(`cabutSanksi=true`);
 			};
+			if (ditutup) {
+				parseURL.push(`ditutup=true`);
+			};
+			if (diterima) {
+				parseURL.push(`diterima=true`);
+			};
+			if (delegasi) {
+				parseURL.push(`delegasi=true`);
+			};
 			if (aktif === false) {
 				parseURL.push(`aktif=false`);
 			}

+ 2 - 2
actions/pemeriksaan.js

@@ -6,12 +6,12 @@ import { getCsrf } from "./security";
 export const insertPemeriksaan = async (token, id, data, _csrf) => {
 	const res = await axiosAPI.post(`/laporan/evaluasi/add/${id}?_csrf=${_csrf}`, data, { headers: { Authorization: token } });
 	// await createLog(token, { aktivitas: `Berhasil menambah evaluasi, id: ${id}` });
-	log(token, id)
+	await log(token, id)
 	return res.data;
 };
 const log = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil menambah evaluasi, id: ${id}`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil menambah evaluasi, id: ${id}`, menu: "Pemeriksaan", _csrf: _csrf });
 
 }

+ 3 - 3
actions/sanksi.js

@@ -17,7 +17,7 @@ export const updatePddikti = async (token, id, _csrf) => {
 const logCreateSanksi = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil melakukan penetapan sanksi, id: ${id}`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil melakukan penetapan sanksi, id: ${id}`, menu: "Sanksi", _csrf: _csrf });
 
 }
 
@@ -87,7 +87,7 @@ export const addRekomendasiDelegasi = async (token, id, data, _csrf) => {
 const logSuccessAddRekomendasiDelegasi = async (token, id) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil melakukan Rekomendasi Delegasi, id: ${id}`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil melakukan Rekomendasi Delegasi, id: ${id}`, menu: "Sanksi", _csrf: _csrf });
 
 }
 const logErrorAddRekomendasiDelegasi = async (token, id) => {
@@ -141,6 +141,6 @@ export const removePesertaPleno = async (token, data, _csrf) => {
 const logRemovePesertaPleno = async (token) => {
 	const getToken = await getCsrf();
 	const _csrf = getToken.token;
-	await createLog(token, { aktivitas: `Berhasil hapus peserta pleno`, _csrf: _csrf });
+	await createLog(token, { aktivitas: `Berhasil hapus peserta pleno`, menu: "Sanksi - Berita Acara", _csrf: _csrf });
 
 }

+ 17 - 9
components/Extras/calendar.view.js

@@ -196,7 +196,7 @@ class Calendar extends Component {
 		const { id } = query;
 		const getToken = await getCsrf();
 		const _csrf = getToken.token;
-		await createLog(token, { aktivitas: `Berhasil menetapkan jadwal, id: ${id}`, _csrf: _csrf });
+		await createLog(token, { aktivitas: `Berhasil menetapkan jadwal, id: ${id}`,menu: "Penjadwalan", _csrf: _csrf });
 
 	}
 
@@ -245,20 +245,27 @@ class Calendar extends Component {
 	};
 
 	handleChangeSelect = (selectedOption) => this.setState({ selectedOption });
-	logUpdateLaporanSuccess = async () => {
+
+	logUpdateLaporanError = async () => {
 		const getToken = await getCsrf();
 		const _csrf = getToken.token;
 		const { token, query } = this.props;
 		const { id } = query;
-		await createLog(token, { aktivitas: `Berhasil mengubah data laporan, id: ${id}`, _csrf: _csrf });
-
+		await createLog(token, { aktivitas: `Berhasil mengubah data laporan, id: ${id}`, _csrf: _csrf, menu: "Penjadwalan" });
 	}
-	logUpdateLaporanError = async () => {
+	logdelegasi = async () => {
+		const getToken = await getCsrf();
+		const _csrf = getToken.token;
+		const { token, query } = this.props;
+		const { id } = query;
+		await createLog(token, { aktivitas: `Berhasil Delegasi Laporan, id: ${id}`, _csrf: _csrf , menu :"Penjadwalan"});
+	}
+	logDitutup = async () => {
 		const getToken = await getCsrf();
 		const _csrf = getToken.token;
 		const { token, query } = this.props;
 		const { id } = query;
-		await createLog(token, { aktivitas: `Berhasil mengubah data laporan, id: ${id}`, _csrf: _csrf });
+		await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${id}`, _csrf: _csrf, menu: "Penjadwalan" });
 	}
 
 	handleSimpan = async (value) => {
@@ -288,18 +295,19 @@ class Calendar extends Component {
 				if (value.status.value === this.getStatus()[1].value) {
 					data.change_role = "true";
 					update = await updateLaporan(token, id, data, _csrf);
+					await this.logdelegasi()
 					Router.push("/app/penjadwalan");
 				} else if (value.status.value === this.getStatus()[2].value) {
-
 					update = await updateLaporan(token, id, formdata, _csrf + `&redudansi=true`);
+					await this.logDitutup()
 					Router.push("/app/penjadwalan");
 				}
 				if (!update) {
-					toast.update(toastid, { render: "Gagal simpan jadwal", type: "error", isLoading: false, autoClose: true, closeButton: true });
+					toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
 					this.logUpdateLaporanError()
 
 				} else {
-					toast.update(toastid, { render: "Input jadwal berhasil", type: "success", isLoading: false, autoClose: true, closeButton: true });
+					toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
 					this.logUpdateLaporanSuccess()
 					Router.push("/app/penjadwalan");
 				}

+ 2 - 1
components/Layout/Header.js

@@ -65,7 +65,8 @@ class Header extends Component {
 		this.props.userNull();
 
 		location.href='/app'
-	
+		// Router.push({ pathname: "/app" });
+		// }
 	};
 
 	resize() {

+ 6 - 6
components/Layout/MenuReadOnly.js

@@ -109,12 +109,12 @@ const MenuReadOnly = [
 		heading: "Analytics Report",
 		translate: "sidebar.heading.ANALYTICS_REPORT",
 	},
-	{
-		name: "Dashboard",
-		path: "/app/dashboard",
-		icon: "icon-film",
-		translate: "sidebar.nav.Dashboard",
-	},
+	// {
+	// 	name: "Dashboard",
+	// 	path: "/app/dashboard",
+	// 	icon: "icon-film",
+	// 	translate: "sidebar.nav.Dashboard",
+	// },
 	{
 		name: "Pelaporan Tuntas",
 		path: "/app/tuntas",

+ 6 - 6
components/Layout/Sidebar.js

@@ -15,9 +15,9 @@ import SidebarUserBlock from "./SidebarUserBlock";
 import Menu from "./Menu.js";
 import MenuLLDIKTI from "./MenuLLDIKTI.js";
 import MenuPT from "./MenuPT.js";
-import MenuBypass from "./MenuBypass";
+import MenuBypass from "./MenuBypass.js";
 import { ENV } from "../../env";
-import MenuReadOnly from "./MenuReadOnly";
+import MenuReadOnly from "./MenuReadOnly.js";
 // localStorage.getItem("user");
 // import Menu from './MenuPT.js';
 
@@ -154,12 +154,12 @@ class Sidebar extends Component {
 		if (ENV === "production") {
 			this.menu = user.user_id === "2A080F42-AE7F-407B-976E-DE5FA87BD277" || user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
 		}
-		// if (ENV === "development") {
-		// 	this.menu = user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
-		// }
 		if (ENV === "development") {
-			this.menu = user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
+			this.menu = user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
 		}
+		// if (ENV === "development") {
+		// 	this.menu = user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
+		// }
 
 		// this.menu = user.user_id === "2A080F42-AE7F-407B-976E-DE5FA87BD277" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : Menu;
 		// prepare the flags to handle menu collapsed states

+ 1 - 1
components/Main/DetailSanksi.js

@@ -44,7 +44,7 @@ function DetailSanksi({ data, noTitle = false, role }) {
 					<FormGroup row>
 						<Col md="4">Tanggal Penetapan Sanksi:</Col>
 						<Col md="8">
-							<strong>{moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY")}</strong>
+							<strong>{data.masa_berlaku?.from_date?moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY"):"-"}</strong>
 						</Col>
 					</FormGroup>
 				}

+ 1 - 1
components/PelaporanTuntas/CaseProgress.js

@@ -112,7 +112,7 @@ function CaseProgress({ data, nextButton, prevButton, tahun, excelSemua, excelMe
 							Unduh
 						</Dropdown.Toggle>
 						<Dropdown.Menu>
-							<Dropdown.Item onClick={excelMenu}>Unduh dokumen sanksi</Dropdown.Item>
+							<Dropdown.Item onClick={excelMenu}>Unduh dokumen pelaporan tuntas</Dropdown.Item>
 							<Dropdown.Item onClick={excelSemua}>Unduh dokumen semua menu</Dropdown.Item>
 						</Dropdown.Menu>
 					</Dropdown>

+ 2 - 2
components/PelaporanTuntas/DetailLaporan.js

@@ -168,7 +168,7 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 				</FormGroup>
 
 			</form>
-			<form className="form-horizontal">
+			{data.tuntas.keterangan && (<form className="form-horizontal">
 				{noTitle ? (
 					""
 				) : (
@@ -220,7 +220,7 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 							</Scrollable>
 						</Col>
 					</FormGroup>) : ""}
-			</form>
+			</form>)}
 		</>
 	);
 }

+ 1 - 1
components/PelaporanTuntas/DetailSanksi.js

@@ -42,7 +42,7 @@ function DetailSanksi({ data, noTitle = false, role }) {
 				<FormGroup row>
 					<Col md="4">Tanggal Penetapan Sanksi:</Col>
 					<Col md="8">
-						<strong>{moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY")}</strong>
+						<strong>{data.masa_berlaku?.from_date?moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY"):"-"}</strong>
 					</Col>
 				</FormGroup>
 				{

+ 2 - 3
components/PelaporanTuntas/TableLaporan.js

@@ -4,7 +4,6 @@ import Link from "next/link";
 import moment from "moment";
 
 function TableLaporan({ listData, to, linkName }) {
-	console.log(listData)
 	return (
 		<div className="card b">
 			<div className="card-body card-over">
@@ -47,14 +46,14 @@ function TableLaporan({ listData, to, linkName }) {
 												</div>
 											</td>
 											<td>
-												{data.aktif === false ? <div className="badge badge-green">Selesai</div> : <div className="badge badge-red">Ditutup</div>}
+												{data.flag === "diterima" ? <div className="badge badge-success">Selesai - Diterima</div> :data.status === "Diterima" ? <div className="badge badge-success">Selesai - Diterima</div> : data.status === "Ditutup" ? <div className="badge badge-danger">Ditutup</div> : data.status === "Selesai" ? <div className="badge badge-success">Selesai</div> : ""}
 											</td>
 											<td>
 												<div className="ml-auto">
 													<Link
 														href={{
 															pathname: to,
-															query: { id: data._id, data: data.no_sanksi ? "sanksi" : "laporan" },
+															query: { id: data._id },
 														}}
 													>
 														<Button className="btn-login loader" color>

+ 10 - 2
components/Pemeriksaan/InputEvaluasi.js

@@ -12,6 +12,7 @@ import { connect } from "react-redux";
 import { getCsrf } from "../../actions/security";
 import Swal from "sweetalert2";
 import Select from "react-select";
+import { createLog } from "../../actions/log";
 
 
 
@@ -48,7 +49,7 @@ const evaluasiSchema = Yup.object().shape({
 
 const ditutupSchema = Yup.object().shape({
 	keterangan: Yup.string().required("Harus diisi"),
-	dokumen: Yup.array().min(1).required("Wajib diisi").test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
+	dokumen: Yup.array().test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
 });
 let Dropzone = null;
 
@@ -209,6 +210,13 @@ class InputEvaluasi extends Component {
 	handlechecklist = () => {
 		this.setState({ delegasichecklist: !this.state.delegasichecklist })
 	};
+	logDitutup = async () => {
+		const getToken = await getCsrf();
+		const _csrf = getToken.token;
+		const { token, query } = this.props;
+		const { id } = query;
+		await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${id}`, _csrf: _csrf, menu: "Pemeriksaan" });
+	}
 
 	handleTutupLaporan = async (data, value) => {
 		if (this.props?.user?.role.id === 2024) {
@@ -238,8 +246,8 @@ class InputEvaluasi extends Component {
 					autoClose: 1000
 				},
 				error: "Error",
-
 			});
+			await this.logDitutup()
 			await Router.push({
 				pathname: "/app/pemeriksaan",
 			});

+ 1 - 1
components/RekomendasiDelegasi/DetailSanksi.js

@@ -46,7 +46,7 @@ function DetailSanksi({ data, noTitle = false, role }) {
 					<FormGroup row>
 						<Col md="4">Tanggal Penetapan Sanksi:</Col>
 						<Col md="8">
-							<strong>{moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY")}</strong>
+							<strong>{data.masa_berlaku?.from_date ? moment(data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY") : "-"}</strong>
 						</Col>
 					</FormGroup>
 					{

+ 155 - 46
components/Riwayat/TableRadar.js

@@ -1,59 +1,131 @@
 import React, { Component } from 'react';
 import Link from "next/link";
 import { Row, Col, Card, CardHeader, CardBody, Table, Button } from 'reactstrap';
+import { Line } from 'react-chartjs-2';
 
 
-function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, all_Laporan }) {
+function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, all_Laporan, tuntasDitutup, tuntasCabutsanksi, delegasi }) {
     return (
         <Card className="card-default">
-            <CardBody>
+            <CardBody style={{
+                outerWidth: "700"
+            }}>
                 <Table bordered responsive>
                     <thead>
                         <tr >
-                            <th>Wilayah LLDikti\Menu</th>
-                            <th style={{
-                                color: "black",
-                            }}>Jumlah Laporan</th><th style={{
-                                backgroundColor: '#80b1ff',
-                                color: "black",
-                                textAlign: "center",
-                            }}>1. Penjadwalan Evaluasi</th>
-                            <th style={{
-                                backgroundColor: '#de8383',
-                                color: "black",
-                                textAlign: "center",
-                            }}>2. Pemeriksaan</th>
-                            <th style={{
-                                backgroundColor: '#fdda80',
-                                color: "black",
-                                textAlign: "center",
-                            }}>3. Sanksi</th>
-                            <th style={{
-                                backgroundColor: '#cfab80',
-                                color: "black",
-                                textAlign: "center",
-                            }}>4. Keberatan</th>
-                            <th style={{
-                                backgroundColor: '#ef90df',
-                                color: "black",
-                                textAlign: "center",
-                            }}>5. Banding</th>
-                            <th style={{
-                                backgroundColor: '#80df89',
-                                color: "black",
-                                textAlign: "center",
-                            }}>6. Pemantauan perbaikan</th>
-                            <th style={{
-                                backgroundColor: '#a3d4d1',
-                                color: "black",
-                                textAlign: "center",
-                            }}>7. Pencabutan Sanksi</th>
-                            <th style={{
-                                backgroundColor: '#e8f2f1',
-                                color: "black",
-                                textAlign: "center",
-                            }}>Lihat Laporan</th>
+                            <th rowspan="2"
+                                style={{
+                                    verticalAlign: "middle",
+                                    textAlign: "center",
+                                }}
+                            >Wilayah LLDikti\Menu</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    color: "black",
+                                    verticalAlign: "middle",
+                                }}>Jumlah Laporan</th>
+                            <th
+                                colSpan="2"
+                                style={{
+                                    backgroundColor: '#e8f2f1',
+                                    color: "black",
+                                    textAlign: "center",
+
+                                }}>Pelaporan Tuntas</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#80b1ff',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>1. Penjadwalan Evaluasi</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#de8383',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>2. Pemeriksaan</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#fdda80',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>3. Sanksi</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#cfab80',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>4. Keberatan</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#ef90df',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>5. Banding</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#80df89',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>6. Dokumen Perbaikan</th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#a3d4d1',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>7. Permohonan Pencabutan Sanksi</th>
+                            <th
+                                rowspan="2"
+                                id='cabutSanksi'
+                                style={{
+                                    // backgroundColor: '#e8f2f1',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>Pelaporan Tuntas
+                                <hr style={{
+                                    // backgroundColor: 'black',
+                                    color: "black",
+
+                                }}></hr>
+                                Cabut Sanksi
+
+                            </th>
+                            <th
+                                rowspan="2"
+                                style={{
+                                    backgroundColor: '#e8f2f1',
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}>Lihat Laporan</th>
                         </tr>
+                        <tr>
+                            <th
+                                style={{
+                                    color: "black",
+                                    textAlign: "center",
+                                    verticalAlign: "middle",
+                                }}
+                            >Ditutup</th>
+                            <th>Delegasi LLDIKTI</th>
+                        </tr>
+
                     </thead>
                     {listData.map((data) => {
                         return (
@@ -69,8 +141,33 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         color: "black",
                                         textAlign: "center",
                                         cursor: "pointer",
-                                    }}>{data.laporan.length}</td>
+                                    }}>{data.jumlah_laporan}</td>
+                                </Link>
+                                <Link
+                                    href={{
+                                        pathname: tuntasDitutup,
+                                        query: { id: data.pembina.id },
+                                    }}
+                                >
+                                    <td style={{
+                                        color: "black",
+                                        textAlign: "center",
+                                        cursor: "pointer",
+                                    }}>{data.jumlah_ditutup}</td>
+                                </Link>
+                                <Link
+                                    href={{
+                                        pathname: delegasi,
+                                        query: { id: data.pembina.id },
+                                    }}
+                                >
+                                    <td style={{
+                                        color: "black",
+                                        textAlign: "center",
+                                        cursor: "pointer",
+                                    }}>{data.jumlah_delegasi}</td>
                                 </Link>
+
                                 <Link
                                     href={{
                                         pathname: jadwal,
@@ -162,6 +259,18 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         cursor: "pointer",
                                     }}>{data.jumlah_pencabutan_sanksi}</td>
                                 </Link>
+                                <Link
+                                    href={{
+                                        pathname: tuntasCabutsanksi,
+                                        query: { id: data.pembina.id },
+                                    }}
+                                >
+                                    <td style={{
+                                        color: "black",
+                                        textAlign: "center",
+                                        cursor: "pointer",
+                                    }}>{data.jumlah_diterima}</td>
+                                </Link>
                                 <td>
                                     <div className="ml-auto" style={{
                                         textAlign: "center",

+ 1 - 1
components/Sanksi/DetailSanksi.js

@@ -71,7 +71,7 @@ class DetailSanksi extends Component {
 						<FormGroup row>
 							<Col md="4">Tanggal Penetapan Sanksi:</Col>
 							<Col md="8">
-							<strong>{sanksi.data?.masa_berlaku?.from_date ? moment(sanksi.data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY") : "-"}</strong>
+								<strong>{sanksi.data?.masa_berlaku?.from_date ? moment(sanksi.data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY") : "-"}</strong>
 							</Col>
 						</FormGroup>
 						{

+ 17 - 4
components/Sanksi/Redudansi.js

@@ -10,6 +10,7 @@ import { updateLaporan } from "../../actions/pelaporan"
 import { getCsrf } from "../../actions/security";
 import { ToastContainer, toast } from "react-toastify";
 import Router from "next/router";
+import { createLog } from "../../actions/log";
 
 
 
@@ -39,7 +40,7 @@ class DropzoneWrapper extends Component {
 }
 const ditutupSchema = Yup.object().shape({
     keterangan: Yup.string().required("Harus diisi"),
-    dokumen: Yup.array().min(1).required("Wajib diisi").test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
+    dokumen: Yup.array().test("filesize", "Maksimal ukuran dokumen 15mb", checkIfFilesAreTooBig),
 });
 const status = [
     { value: "Sanksi", label: "Sanksi", className: "State-ACT" },
@@ -87,6 +88,13 @@ export class Redudansi extends Component {
             files: [...prevState.files, ...selectFile]
         }))
     };
+    logDitutup = async () => {
+        const getToken = await getCsrf();
+        const _csrf = getToken.token;
+        const { token } = this.props;
+     
+        await createLog(token, { aktivitas: `Berhasil menutup laporan, id: ${this.props.id}`, _csrf: _csrf, menu: "Sanksi" });
+    }
     handleTutupLaporan = async (data, value) => {
         if (this.props.role === 2024) {
             Swal.fire({
@@ -109,11 +117,16 @@ export class Redudansi extends Component {
 
             await toast.promise(updateLaporan(token, this.props.id, formdata, _csrf + `&redudansi=true`), {
                 pending: "Loading",
-                success: "Success",
+                success: {
+                    render: "success",
+                    autoClose: 1000
+                },
                 error: "Error",
-                autoClose: 1000
             });
-           await Router.push("/app/sanksi");
+            await this.logDitutup()
+            await Router.push({
+                pathname: "/app/sanksi",
+            });
         }
 
     };

+ 1 - 1
components/Sanksi/SuratBA _detail.js

@@ -135,7 +135,7 @@ class ComponentBA extends React.Component {
                                                 -
                                             </td>)
                                         }
-                                        <td style={{ minWidth: "215px" }}>{`Sanksi Administratif berupa ${this.state?.sanksi ? this.state?.sanksi : ""}` || ""}</td>
+                                        <td style={{ minWidth: "215px" }}>{`Sanksi Administratif berupa ${this.state?.sanksi ? this.state?.sanksi : "-"}` || ""}</td>
                                     </tr>
                                 ))}
                                 {/* {this.state.dataPelanggaran?.data?.map((e, i) => (

+ 0 - 3
components/Sanksi/TablePenetapanSanksi.js

@@ -3,9 +3,6 @@ import { Card, Table } from "reactstrap";
 import { getPelanggaran } from "@/actions/pelanggaran";
 import { connect } from "react-redux";
 import Button from "reactstrap/lib/Button";
-import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
-import Router from "next/router";
-import { ToastContainer, toast } from "react-toastify";
 import { getAutoSave } from "@/actions/autosave";
 import Datatable from "@/components/Tables/Datatable";
 

+ 1 - 2
pages/app/dashboard/all_Laporan.js

@@ -37,7 +37,6 @@ class Penjadwalan extends Component {
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina,);
         this.setState({ laporanPembina, });
-        console.log(this.state.laporanPembina)
     };
 
     render() {
@@ -49,7 +48,7 @@ class Penjadwalan extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 2 - 3
pages/app/dashboard/banding.js

@@ -37,8 +37,7 @@ class Banding extends Component {
         const id = query.id;
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina, { banding: true });
-        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
-        this.setState({ laporanPembina, laporan });
+        this.setState({ laporanPembina });
     };
 
     render() {
@@ -50,7 +49,7 @@ class Banding extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 3 - 4
pages/app/dashboard/cabutSanksi.js

@@ -36,12 +36,11 @@ class cabutSanksi extends Component {
         const id = query.id;
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina, { cabutSanksi: true });
-        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
-        this.setState({ laporanPembina, laporan });
+        this.setState({ laporanPembina });
     };
 
     render() {
-        const { laporanPembina, laporan } = this.state;
+        const { laporanPembina } = this.state;
         return (
             <ContentWrapper>
                 <div className="content-heading">
@@ -49,7 +48,7 @@ class cabutSanksi extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 62 - 0
pages/app/dashboard/delegasi.js

@@ -0,0 +1,62 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class Pemeriksaan extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { delegasi: true });
+        // const pembina = laporanPembina.data.laporan.map((e) => e.pt.pembina)
+        this.setState({ laporanPembina,  });
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Pemeriksaan);

+ 1 - 1
pages/app/dashboard/detail.js

@@ -49,7 +49,7 @@ class laporanByPembina extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 1 - 1
pages/app/dashboard/index.js

@@ -58,7 +58,7 @@ class Dashboard extends Component {
             <ChartRadarB />
           </Col>
           <Col lg="12">
-            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/dashboard/detail" jadwal="/app/dashboard/penjadwalan" all_Laporan="/app/dashboard/all_Laporan" pemeriksaan="/app/dashboard/pemeriksaan" sanksi="/app/dashboard/sanksi" keberatan="/app/dashboard/keberatan" banding="/app/dashboard/banding" perbaikan="/app/dashboard/perbaikan" cabutSanksi="/app/dashboard/cabutSanksi" linkName="Lihat" /> : <Loader />}
+            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/dashboard/detail" jadwal="/app/dashboard/penjadwalan" all_Laporan="/app/dashboard/all_Laporan" pemeriksaan="/app/dashboard/pemeriksaan" sanksi="/app/dashboard/sanksi" keberatan="/app/dashboard/keberatan" banding="/app/dashboard/banding" perbaikan="/app/dashboard/perbaikan" cabutSanksi="/app/dashboard/cabutSanksi" tuntasCabutsanksi="/app/dashboard/tuntasCabutsanksi" tuntasDitutup="/app/dashboard/tuntasDitutup" delegasi="/app/dashboard/delegasi" linkName="Lihat" /> : <Loader />}
           </Col>
         </Row>
       </ContentWrapper>

+ 3 - 4
pages/app/dashboard/keberatan.js

@@ -37,12 +37,11 @@ class Keberatan extends Component {
         const id = query.id;
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina, { keberatan: true });
-        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
-        this.setState({ laporanPembina, laporan });
+        this.setState({ laporanPembina });
     };
 
     render() {
-        const { laporanPembina, laporan } = this.state;
+        const { laporanPembina } = this.state;
         return (
             <ContentWrapper>
                 <div className="content-heading">
@@ -50,7 +49,7 @@ class Keberatan extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 1 - 1
pages/app/dashboard/pemeriksaan.js

@@ -49,7 +49,7 @@ class Pemeriksaan extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 1 - 1
pages/app/dashboard/penjadwalan.js

@@ -48,7 +48,7 @@ class Penjadwalan extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 2 - 3
pages/app/dashboard/perbaikan.js

@@ -37,8 +37,7 @@ class Perbaikan extends Component {
         const id = query.id;
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina, { perbaikan: true });
-        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
-        this.setState({ laporanPembina, laporan });
+        this.setState({ laporanPembina});
     };
 
     render() {
@@ -50,7 +49,7 @@ class Perbaikan extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 3 - 4
pages/app/dashboard/sanksi.js

@@ -37,12 +37,11 @@ class sanksi extends Component {
         const id = query.id;
         const idPembina = id;
         const laporanPembina = await getlaporanByPembina(token, idPembina, { sanksi: true });
-        const laporan = laporanPembina.data.sanksi.map((e) => e.laporan)
-        this.setState({ laporanPembina, laporan });
+        this.setState({ laporanPembina });
     };
 
     render() {
-        const { laporanPembina, laporan } = this.state;
+        const { laporanPembina } = this.state;
         return (
             <ContentWrapper>
                 <div className="content-heading">
@@ -50,7 +49,7 @@ class sanksi extends Component {
                 </div>
                 <Row>
                     <Col lg="12">
-                        {laporanPembina.data && < TableLaporan listData={laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
 
 
                     </Col>

+ 61 - 0
pages/app/dashboard/tuntasCabutsanksi.js

@@ -0,0 +1,61 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class tuntasCabutsanksi extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { diterima: true });
+        this.setState({ laporanPembina });
+    };
+
+    render() {
+        const { laporanPembina, laporan } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina.data} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(tuntasCabutsanksi);

+ 61 - 0
pages/app/dashboard/tuntasDitutup.js

@@ -0,0 +1,61 @@
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Link from "next/link";
+import { Row, Col, Button } from "reactstrap";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import Router from "next/router";
+import TableRiwayat from "@/components/Riwayat/TableRiwayat";
+import ChartData from "@/components/Riwayat/ChartData";
+import ChartDataBar from "@/components/Riwayat/ChartDataBar";
+import Maps from "@/components/Riwayat/Maps"
+import TableRadar from "../../../components/Riwayat/TableRadar";
+import { getjumlahStatusLaporan } from "../../../actions/graph";
+import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";
+import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
+import ChartRadarA from "../../../components/Riwayat/ChartRadarA";
+import TableLaporan from "../../../components/Riwayat/TableLaporan";
+
+
+
+class tuntasDitutup extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            laporanPembina: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    }
+
+    componentDidMount = async () => {
+        const { token, query } = this.props;
+        const id = query.id;
+        const idPembina = id;
+        const laporanPembina = await getlaporanByPembina(token, idPembina, { ditutup: true });
+        this.setState({ laporanPembina });
+    };
+
+    render() {
+        const { laporanPembina } = this.state;
+        return (
+            <ContentWrapper>
+                <div className="content-heading">
+                    <span className="font-color-white">List Laporan Wilayah</span>
+                </div>
+                <Row>
+                    <Col lg="12">
+                        {laporanPembina.data && < TableLaporan listData={laporanPembina?.data} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(tuntasDitutup);

+ 0 - 1
pages/app/pelaporan/search.js

@@ -129,7 +129,6 @@ class Search extends Component {
 
 	render() {
 		const { selectedOptionMulti, pembina } = this.state;
-		console.log(this.state)
 		return (
 			<ContentWrapper>
 				<div className="content-heading">

+ 54 - 41
pages/app/pencabutan-sanksi/detail.js

@@ -84,7 +84,7 @@ class JawabanPencabutanSanksi extends Component {
 	componentDidMount = async () => {
 		const { query, token } = this.props;
 		const sanksi = await getOneSanksi(token, query.id);
-		const pt = sanksi.data.laporan.pt;
+		const pt = sanksi.data?.laporan?.pt;
 		this.setState({ sanksi, pt });
 	};
 
@@ -173,11 +173,18 @@ class JawabanPencabutanSanksi extends Component {
 	render() {
 		const { files, selectedOption, sanksi, pt } = this.state;
 
+		const removeFile = file => () => {
+			const newFiles = [...files]
+			newFiles.splice(newFiles.indexOf(file), 1)
+			this.setState({
+				files: newFiles,
+			});
+		}
 		const thumbs = files.map((file, index) => (
-			<div md={3} key={index}>
-				{/* <img className="img-fluid mb-2" src={file.preview} alt="Item" /> */}
-				<span className="text-left">{index + 1}.{file.name}</span>
-			</div>
+			<p>
+				<em className="far fa-file" />&nbsp;&nbsp;{file.name}
+				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
+			</p>
 		));
 
 		return (
@@ -226,9 +233,9 @@ class JawabanPencabutanSanksi extends Component {
 												>
 													{({ isSubmitting }) => (
 														<Form className="form-horizontal">
-															<FormGroup>
-																<label className="row-form-label">Status:</label>
-																<div className="row-md-10">
+															<FormGroup row>
+																<label className="col-md-2 col-form-label font-weight-bold font-color-black">Status:</label>
+																<div className="col-md-10">
 																	<Field name="status">
 																		{({ field, form }) => (
 																			<Select
@@ -250,9 +257,9 @@ class JawabanPencabutanSanksi extends Component {
 																</div>
 															</FormGroup>
 															{selectedOption && selectedOption.value === "Rekomendasi Perbaikan" ? (
-																<FormGroup>
-																	<label className="row-form-label">Keterangan:</label>
-																	<div className="row-md-10">
+																<FormGroup row>
+																	<label className="col-md-2 col-form-label">Keterangan:</label>
+																	<div className="col-md-10">
 																		<Field name="keterangan">{({ field }) => <Input type="textarea" {...field} />}</Field>
 																		<ErrorMessage name="keterangan" component="div" className="form-text text-danger" />
 																		{/* <span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span> */}
@@ -262,11 +269,11 @@ class JawabanPencabutanSanksi extends Component {
 																""
 															)}
 															{selectedOption && selectedOption.value === "Rekomendasi Perbaikan" ? (
-																<FormGroup>
-																	<label className="row-form-label">Upload Dokumen  &#40;Opsional&#41; :</label>
-																	<div className="row-md-10">
+																<FormGroup row>
+																	<label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+																	<div className="col-md-10">
 																		<Field name="dokumen">
-																			{({ field, form }) => (
+																			{({ field, form, meta }) => (
 																				<DropzoneWrapper
 																					className=""
 																					onDrop={(e) => {
@@ -276,17 +283,19 @@ class JawabanPencabutanSanksi extends Component {
 																				>
 																					{({ getRootProps, getInputProps, isDragActive }) => {
 																						return (
-																							<div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
-																								<input {...getInputProps()} />
-																								<div className="dropzone-previews flex">
-																									<div className="dropzone-style-1">
-																										<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ? <Row><span className="text-left">{thumbs}</span></Row> :
-																											<div className="text-center fa-2x icon-cloud-upload mr-2 ">
-																												<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
-																											</div>
-																										}
+																							<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+																								<input name="dokumen" {...getInputProps()} />
+																								<div className="dropzone-style-1">
+																									<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+																										<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																											<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+																										</div> :
+																										<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																											<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
 																										</div>
-																									</div>																							</div>
+																									}
+																									</div>
+																								</div>
 																								<div className="d-flex align-items-center">
 																									<small className="ml-auto">
 																										<button
@@ -307,18 +316,19 @@ class JawabanPencabutanSanksi extends Component {
 																				</DropzoneWrapper>
 																			)}
 																		</Field>
+																		{thumbs}
 																		<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
-																		<p className="mrgn-top-5">
+																		<p className="mrgn-top-5 font-color-black">
 																			Ukuran setiap dokumen maksimal 15mb
 																		</p>
 																	</div>
 																</FormGroup>
 															) : (
-																<FormGroup>
-																	<label className="row-form-label">Upload Dokumen <span className=" text-danger">*</span>:</label>
-																	<div className="row-md-10">
+																<FormGroup row>
+																	<label className="col-md-2 col-form-label">Upload File Pendukung<span className="text-danger">*</span></label>
+																	<div className="col-md-10">
 																		<Field name="dokumen">
-																			{({ field, form }) => (
+																			{({ field, form, meta }) => (
 																				<DropzoneWrapper
 																					className=""
 																					onDrop={(e) => {
@@ -328,17 +338,19 @@ class JawabanPencabutanSanksi extends Component {
 																				>
 																					{({ getRootProps, getInputProps, isDragActive }) => {
 																						return (
-																							<div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
-																								<input {...getInputProps()} />
-																								<div className="dropzone-previews flex">
-																									<div className="dropzone-style-1">
-																										<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ? <Row><span className="text-left">{thumbs}</span></Row> :
-																											<div className="text-center fa-2x icon-cloud-upload mr-2 ">
-																												<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
-																											</div>
-																										}
+																							<div {...getRootProps()} className={"dropzone card" + (isDragActive ? "dropzone-drag-active" : "")}>
+																								<input name="dokumen" {...getInputProps()} />
+																								<div className="dropzone-style-1">
+																									<div className="center-ver-hor dropzone-previews flex">{this.state.files.length > 0 ?
+																										<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																											<h5 className="text-center dz-default dz-message">Klik untuk tambah file</h5>
+																										</div> :
+																										<div className="text-center fa-2x icon-cloud-upload mr-2 ">
+																											<h5 className="text-center dz-default dz-message">Klik untuk upload dokumen</h5>
 																										</div>
-																									</div>		</div>
+																									}
+																									</div>
+																								</div>
 																								<div className="d-flex align-items-center">
 																									<small className="ml-auto">
 																										<button
@@ -359,8 +371,9 @@ class JawabanPencabutanSanksi extends Component {
 																				</DropzoneWrapper>
 																			)}
 																		</Field>
+																		{thumbs}
 																		<ErrorMessage name="dokumen" component="div" className="form-text text-danger" />
-																		<p className="mrgn-top-5">
+																		<p className="mrgn-top-5 font-color-black">
 																			Ukuran setiap dokumen maksimal 15mb
 																		</p>
 																	</div>

+ 1 - 0
pages/app/sanksi/detail.js

@@ -30,6 +30,7 @@ class Detail extends Component {
 		const { query, token } = this.props;
 		const sanksi = await getOneSanksi(token, query.id);
 		this.setState({ sanksi });
+		console.log(sanksi)
 	};
 
 	render() {

+ 11 - 1
pages/app/sanksi/proses.js

@@ -26,6 +26,7 @@ import { updatePddikti } from "../../../actions/sanksi";
 import { ENV } from "../../../env";
 import Swal from "sweetalert2";
 import Redudansi from "../../../components/Sanksi/Redudansi";
+import { createLog } from "../../../actions/log";
 
 
 
@@ -195,6 +196,13 @@ class ProsesSanksi extends Component {
 
 	}
 
+	logdelegasi = async () => {
+		const getToken = await getCsrf();
+		const _csrf = getToken.token;
+		const { token, query } = this.props;
+		const { id } = query;
+		await createLog(token, { aktivitas: `Berhasil Delegasi Laporan, id: ${id}`, _csrf: _csrf, menu: "Sanksi" });
+	}
 	handleDelegasi = async (data) => {
 		if (this.props?.user?.role.id === 2024) {
 			Swal.fire({
@@ -219,8 +227,10 @@ class ProsesSanksi extends Component {
 
 			if (!update) {
 				toast.update(toastid, { render: "Laporan gagal didelegasi", type: "error", isLoading: false, autoClose: true, closeButton: true });
+
 			} else {
 				toast.update(toastid, { render: "Laporan berhasil didelegasi", type: "success", isLoading: false, autoClose: true, closeButton: true });
+				await this.logdelegasi()
 				Router.push("/app/sanksi");
 			}
 		}
@@ -453,7 +463,7 @@ class ProsesSanksi extends Component {
 												<Card className="card-default">
 
 													<CardBody>
-														<Redudansi setDataStatusLaporan={this.setDataStatusLaporan} id={pelaporan.data?._id}  role={this.props?.user?.role.id}/>
+														<Redudansi setDataStatusLaporan={this.setDataStatusLaporan} id={pelaporan.data?._id} role={this.props?.user?.role.id} />
 													</CardBody>
 												</Card>
 											</div>

+ 18 - 15
pages/app/tuntas/detail.js

@@ -29,16 +29,16 @@ class DetailPelaporan extends Component {
 		const { token, query } = this.props;
 		const getTokenCsrf = await getCsrf();
 		const _csrf = getTokenCsrf.token;
-		if (query.data === "sanksi") {
-			const sanksi = await getOneSanksi(this.props.token, query.id + "?aktif=false");
-			await createLog(token, { aktivitas: `Mengakses halaman detail Pelaporan Tuntas dengan No. Laporan ${sanksi.data.laporan.no_laporan}`, menu: "Pelaporan", _csrf: _csrf });
-			this.setState({ sanksi });
-		}
-		else {
-			const pelaporan = await getOneLaporan(this.props.token, query.id + "?aktif=false");
+		// if (query.data === "sanksi") {
+		// 	const sanksi = await getOneSanksi(this.props.token, query.id + "?aktif=false");
+		// 	await createLog(token, { aktivitas: `Mengakses halaman detail Pelaporan Tuntas dengan No. Laporan ${sanksi.data.laporan.no_laporan}`, menu: "Pelaporan", _csrf: _csrf });
+		// 	this.setState({ sanksi });
+		// }
+		// else {
+			const pelaporan = await getOneLaporan(this.props.token, query.id);
 			await createLog(token, { aktivitas: `Mengakses halaman detail Pelaporan Tuntas dengan No. Laporan ${pelaporan?.data?.no_laporan}`, menu: "Pelaporan", _csrf: _csrf });
 			this.setState({ pelaporan });
-		}
+		// }
 
 
 	};
@@ -62,7 +62,7 @@ class DetailPelaporan extends Component {
 					</div>
 					<Row>
 						<Col xl="9">
-							{query?.data === "sanksi" &&
+							{/* {query?.data === "sanksi" &&
 								<Card className="card-default">
 									<CardBody>
 										<Row>
@@ -72,20 +72,23 @@ class DetailPelaporan extends Component {
 										</Row>
 									</CardBody>
 								</Card>
-							}
-							{query?.data === "laporan" &&
+							} */}
+							{/* {query?.data === "laporan" && */}
 								<Card className="card-default">
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												{pelaporan?.data && query.data === "laporan" ? <DetailLaporan data={pelaporan.data} role={this.props.user.role.id} /> : <Loader />}</Col>
+												{pelaporan?.data ? <DetailLaporan data={pelaporan.data} role={this.props.user.role.id} /> : <Loader />}</Col>
 										</Row>
 									</CardBody>
 								</Card>
-							}
+							{/* } */}
 						</Col>
-						{query?.data === "sanksi" && <Col xl="3">{sanksi?.data ? <DetailPT data={sanksi?.data.laporan?.pt} /> : <Loader />}</Col>}
-						{query?.data === "laporan" && <Col xl="3">{pelaporan?.data ? <DetailPT data={pelaporan?.data.pt} /> : <Loader />}</Col>}
+						{/* {query?.data === "sanksi" && <Col xl="3">{sanksi?.data ? <DetailPT data={sanksi?.data.laporan?.pt} /> : <Loader />}</Col>} */}
+						{/* {query?.data === "laporan" && */}
+						
+						<Col xl="3">{pelaporan?.data ? <DetailPT data={pelaporan?.data.pt} /> : <Loader />}</Col>
+						{/* } */}
 					</Row>
 				</div>
 			</ContentWrapper>

+ 6 - 4
pages/app/tuntas/index.js

@@ -32,9 +32,10 @@ class PelaporanTuntas extends Component {
                 ...laporanSelesai.data, laporan: [...laporanSelesai.data.laporan, ...laporanSelesai.data.sanksi], sanksi: null
             }
         }
-        const pelaporan = await getPelaporan(token, { jadwal: true, aktif: false });
+        const pelaporan = await getPelaporan(token, { tuntas: true });
         const graph = await getGraph(this.props.token, { evaluasi: true, listJadwal: true, aktif: false });
         this.setState({ pelaporan, graph, laporanSelesai });
+        console.log(this.state.pelaporan)
     };
 
     nextButton = async () => {
@@ -83,7 +84,7 @@ class PelaporanTuntas extends Component {
                 tahun: this.state.tahun,
                 pelaporan: true,
             });
-            if (this.state.graph.data.jumlah_ditutup && this.state.graph.data.jumlah_selesai) {
+            if (this.state.laporanSelesai.data.jumlah_ditutup && this.state.laporanSelesai.data.jumlah_selesai) {
                 Router.push(url);
             } else {
                 swal.fire({
@@ -112,7 +113,7 @@ class PelaporanTuntas extends Component {
                 sanksi: true,
 
             });
-            if (this.state.graph.data.jumlah_ditutup && this.state.graph.data.jumlah_selesai) {
+            if (this.state.laporanSelesai.data.jumlah_ditutup && this.state.laporanSelesai.data.jumlah_selesai) {
                 Router.push(url);
             } else {
                 swal.fire({
@@ -126,6 +127,7 @@ class PelaporanTuntas extends Component {
 
     render() {
         const { pelaporan, graph, laporanSelesai } = this.state;
+        console.log(pelaporan)
         return (
             <ContentWrapper>
                 <div className="content-heading">
@@ -135,7 +137,7 @@ class PelaporanTuntas extends Component {
                 </div>
                 <Row>
                     <Col lg="4">{laporanSelesai?.data ? <CaseProgress data={laporanSelesai.data} nextButton={this.nextButton} prevButton={this.prevButton} tahun={this.state.tahun} excel={this.excel} excelMenu={this.excelMenu} excelSemua={this.excelSemua} /> : <Loader />}</Col>
-                    <Col lg="8">{laporanSelesai?.data?.laporan ? <TableLaporan status noBy listData={laporanSelesai.data.laporan} to="/app/tuntas/detail" linkName="Detail" /> : <Loader />}</Col>
+                    <Col lg="8">{laporanSelesai?.data?.laporan ? <TableLaporan status noBy listData={pelaporan.data} to="/app/tuntas/detail" linkName="Detail" /> : <Loader />}</Col>
                 </Row>
             </ContentWrapper>
         );

+ 1 - 1
pages/pt/jawaban-pencabutan-sanksi/index.js

@@ -16,7 +16,7 @@ class JawabanCabutSanksi extends Component {
 
 	componentDidMount = async () => {
 		const { token } = this.props;
-		const sanksi = await getSanksi(token, { cabutSanksi: true, jawaban: false });
+		const sanksi = await getSanksi(token, { cabutSanksi: true, jawaban: true });
 		this.setState({ sanksi });
 	};
 

+ 2 - 2
pages/signature/pleno-sanksi/[id].js

@@ -226,7 +226,7 @@ class PlenoSanksi extends Component {
                                                     <td>{e.pasal}</td>
                                                     <td>{e.butir_pelanggaran}</td>
                                                     <td>{e.pelanggaran}</td>
-                                                    <td >{dataSuratBA?.descPelanggaran[e._id]?.simpulan || "Belum diisi"}</td>
+                                                    <td >{dataSuratBA?.descPelanggaran[e._id]?.simpulan || ""}</td>
                                                     <td style={{ maxWidth: "80px" }}>
                                                         {`Sanksi Administratif berupa ${dataSuratBA?.sanksi || this.state.sanksi || "Belum diisi"}`}
                                                     </td>
@@ -241,7 +241,7 @@ class PlenoSanksi extends Component {
                                                     <td>{e.pasal}</td>
                                                     <td>{e.butir_pelanggaran}</td>
                                                     <td>{e.pelanggaran}</td>
-                                                    <td >{dataSuratBA?.descPelanggaran[e._id]?.simpulan || "Belum diisi"}</td>
+                                                    <td >{dataSuratBA?.descPelanggaran[e._id]?.simpulan || ""}</td>
                                                     <td style={{ maxWidth: "80px" }}>
                                                         {`Sanksi Administratif berupa ${dataSuratBA?.sanksi || this.state.sanksi || "Belum diisi"}`}
                                                     </td>