andi 2 年之前
父節點
當前提交
040776574f
共有 71 個文件被更改,包括 1717 次插入1095 次删除
  1. 1 0
      actions/pelaporan.js
  2. 22 4
      components/Banding/Riwayat.js
  3. 20 9
      components/Bypass/TableBypass.js
  4. 21 4
      components/DocPerbaikan/Riwayat.js
  5. 73 66
      components/Extras/calendar.view.js
  6. 20 4
      components/Keberatan/Riwayat.js
  7. 6 0
      components/Layout/Menu.js
  8. 9 1
      components/Layout/Sidebar.js
  9. 20 4
      components/Main/DetailLaporan.js
  10. 31 12
      components/Main/DetailSanksi.js
  11. 3 5
      components/Main/Login.js
  12. 22 5
      components/Main/PermohonanPT.js
  13. 22 6
      components/NaikSanksi/DetailSanksi.js
  14. 31 21
      components/NaikSanksi/InputTanggal.js
  15. 12 26
      components/NaikSanksi/TableLaporan.js
  16. 20 4
      components/NaikSanksi/TableRiwayat.js
  17. 50 36
      components/Pelaporan/InputData.js
  18. 127 0
      components/PelaporanTuntas/DetailSanksi.js
  19. 2 1
      components/PelaporanTuntas/TableLaporan.js
  20. 10 1
      components/Pemeriksaan/DetailLaporan.js
  21. 46 34
      components/Pemeriksaan/InputEvaluasi.js
  22. 19 1
      components/Pemeriksaan/TableRiwayat.js
  23. 21 4
      components/PencabutanSanksi/Riwayat.js
  24. 20 2
      components/Penjadwalan/DetailLaporan.js
  25. 21 5
      components/PerpanjanganSanksi/DetailSanksi.js
  26. 27 17
      components/PerpanjanganSanksi/InputTanggal.js
  27. 22 5
      components/RekomendasiDelegasi/DetailSanksi.js
  28. 46 34
      components/RekomendasiDelegasi/InputRekomendasi.js
  29. 30 8
      components/RekomendasiDelegasi/TableRiwayat.js
  30. 1 1
      components/Riwayat/Maps.js
  31. 3 7
      components/Riwayat/TableLaporan.js
  32. 44 12
      components/Riwayat/TableRadar.js
  33. 94 115
      components/Riwayat/TableRiwayat.js
  34. 24 6
      components/Sanksi/BeritaAcara.js
  35. 139 242
      components/Sanksi/DetailSanksi.js
  36. 9 0
      components/Sanksi/Ringkasan.js
  37. 1 1
      components/Sanksi/TablePenetapanSanksi.js
  38. 21 63
      components/Sanksi/UploadSurat.js
  39. 22 6
      components/TurunSanksi/DetailSanksi.js
  40. 30 20
      components/TurunSanksi/InputTanggal.js
  41. 11 20
      components/TurunSanksi/TableLaporan.js
  42. 20 4
      components/TurunSanksi/TableRiwayat.js
  43. 42 30
      pages/app/banding/detail.js
  44. 1 1
      pages/app/bypass/detail.js
  45. 1 1
      pages/app/bypass/index.js
  46. 43 31
      pages/app/keberatan/detail.js
  47. 2 2
      pages/app/naik-sanksi/detail.js
  48. 1 1
      pages/app/pelaporan/detail.js
  49. 47 24
      pages/app/pelaporan/index.js
  50. 44 22
      pages/app/pemeriksaan/index.js
  51. 2 2
      pages/app/pemeriksaan/new.js
  52. 32 20
      pages/app/pencabutan-sanksi/detail.js
  53. 47 25
      pages/app/penjadwalan/index.js
  54. 2 2
      pages/app/perbaikan/detail.js
  55. 1 1
      pages/app/perpanjangan-sanksi/detail.js
  56. 2 2
      pages/app/rekomendasi-delegasi/detail.js
  57. 62 0
      pages/app/riwayat/all_Laporan.js
  58. 0 1
      pages/app/riwayat/banding.js
  59. 0 1
      pages/app/riwayat/cabutSanksi.js
  60. 0 1
      pages/app/riwayat/detail.js
  61. 2 3
      pages/app/riwayat/index.js
  62. 0 1
      pages/app/riwayat/keberatan.js
  63. 0 1
      pages/app/riwayat/pemeriksaan.js
  64. 0 1
      pages/app/riwayat/penjadwalan.js
  65. 0 1
      pages/app/riwayat/perbaikan.js
  66. 0 1
      pages/app/riwayat/sanksi.js
  67. 47 25
      pages/app/sanksi/index.js
  68. 111 66
      pages/app/sanksi/proses.js
  69. 33 10
      pages/app/tuntas/detail.js
  70. 2 2
      pages/app/turun-sanksi/detail.js
  71. 0 1
      pages/pt/sanksi/detail.js

+ 1 - 0
actions/pelaporan.js

@@ -1,6 +1,7 @@
 import { get, post, del, put } from "../config/request";
 import axiosAPI from "../config/axios";
 import { createLog } from "./log";
+import { getCsrf } from "./security";
 
 export const getPelaporan = async (token, query = {}) => {
 	try {

+ 22 - 4
components/Banding/Riwayat.js

@@ -1,8 +1,18 @@
 import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
+import Swal from "sweetalert2";
 
-function Riwayat({ data }) {
+function Riwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardHeader>
@@ -27,9 +37,17 @@ function Riwayat({ data }) {
 										{data.dokumen.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+
+												}
+
 											</>
 										))}
 									</td>

+ 20 - 9
components/Bypass/TableBypass.js

@@ -9,9 +9,10 @@ import Router from "next/router";
 import { useState } from "react";
 import { Modal, ModalBody, ModalFooter } from "reactstrap";
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 
 
-function TableBypass({ listData, to, linkName }) {
+function TableBypass({ listData, to, linkName, role }) {
 
     const token = useSelector((state) => state.token)
     const [modalIsOpen, setModalIsOpen] = useState(false)
@@ -29,15 +30,25 @@ function TableBypass({ listData, to, linkName }) {
                 <ModalFooter>
 
                     <Button color className="btn-login" onClick={async () => {
-                        	const getToken = await getCsrf();
+                        if (role === 2024) {
+                            Swal.fire({
+                                icon: 'error',
+                                title: 'Oops...',
+                                html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+                                confirmButtonColor: "#3e3a8e",
+                                confirmButtonText: 'Oke'
+                            })
+                        } else {
+                            const getToken = await getCsrf();
                             const _csrf = getToken.token;
-                        await toast.promise(bypassCabutSanksi(token, seledtedID, _csrf), {
-                            pending: "Loading",
-                            success: "Success",
-                            error: "Error",
-                        });
-                        Router.push(`/app/pencabutan-sanksi/detail?id=${seledtedID}`);
-                        setModalIsOpen(false)
+                            await toast.promise(bypassCabutSanksi(token, seledtedID, _csrf), {
+                                pending: "Loading",
+                                success: "Success",
+                                error: "Error",
+                            });
+                            Router.push(`/app/pencabutan-sanksi/detail?id=${seledtedID}`);
+                            setModalIsOpen(false)
+                        }
                     }}>
                         <span className="font-color-white">Ya</span>
                     </Button>

+ 21 - 4
components/DocPerbaikan/Riwayat.js

@@ -1,8 +1,18 @@
 import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
+import Swal from "sweetalert2";
 
-function Riwayat({ data }) {
+function Riwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardHeader>
@@ -28,9 +38,16 @@ function Riwayat({ data }) {
 											{value.dokumen.map((e) => (
 												<>
 													<em className="fa-lg far fa-file-code"></em>
-													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-														{e.judul}
-													</a>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+
+													}
 												</>
 											))}
 										</td>

+ 73 - 66
components/Extras/calendar.view.js

@@ -24,6 +24,7 @@ import 'moment/locale/id';
 import { getCsrf } from "../../actions/security";
 import { createLog } from "../../actions/log";
 moment.locale('id')
+import Swal from "sweetalert2";
 
 
 const status = [
@@ -135,47 +136,42 @@ class Calendar extends Component {
 	}
 
 	handleEventCalendar = async (data) => {
-		const { query, token } = this.props;
-		const { id } = query;
-		const { color, laporan } = this.state;
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		await toast.promise(
-
-			updateJadwal(token, id, {
-				judul: "No.Laporan " + laporan.data.no_laporan + " - " + data.judul,
-				dari_tanggal: data.dari_tanggal,
-				sampai_tanggal: data.sampai_tanggal,
-				warna: color,
-			}, _csrf),
-
-			{
-				pending: "Loading",
-				success: "Success",
-				error: "Error",
-			}
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+			})
+		} else {
+			const { query, token } = this.props;
+			const { id } = query;
+			const { color, laporan } = this.state;
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			await toast.promise(
+
+				updateJadwal(token, id, {
+					judul: "No.Laporan " + laporan.data.no_laporan + " - " + data.judul,
+					dari_tanggal: data.dari_tanggal,
+					sampai_tanggal: data.sampai_tanggal,
+					warna: color,
+				}, _csrf),
+
+				{
+					pending: "Loading",
+					success: "Success",
+					error: "Error",
+				}
+
+			);
+			Router.push("/app/penjadwalan");
+			const dataLaporan = await getPelaporan(token, { jadwal: true });
+			this.setState({ dataLaporan });
+			this.getDataEvent();
+		}
 
-		);
-		// const toastid = toast.loading("Please wait...");
-		// const added = await updateJadwal(token, id, {
-		// 	judul: "No.Laporan " + laporan.data.no_laporan + " - " + data.judul,
-		// 	dari_tanggal: data.dari_tanggal,
-		// 	sampai_tanggal: data.sampai_tanggal,
-		// 	warna: color,
-		// }, _csrf)
-		// if (!added) {
-		// 	toast.update(toastid, { render: "Gagal menetapkan jadwal", type: "error", isLoading: false, autoClose: true, closeButton: true });
-		// } else {
-		// 	toast.update(toastid, { render: "Berhasil menetapkan jadwal", type: "success", isLoading: false, autoClose: true, closeButton: true });
-
-		// 	this.logSuccessUpdateJadwal()
-
-
-		// }
-		Router.push("/app/penjadwalan");
-		const dataLaporan = await getPelaporan(token, { jadwal: true });
-		this.setState({ dataLaporan });
-		this.getDataEvent();
 	};
 
 	defaultStatus = async () => {
@@ -201,35 +197,46 @@ class Calendar extends Component {
 	}
 
 	handleSimpan = async (value) => {
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		const { token, query } = this.props;
-		const { id } = query;
-		let update = null;
-		if (value.status.value === this.getStatus()[1].value || value.status.value === this.getStatus()[2].value) {
-			const toastid = toast.loading("Please wait...");
-			const data = { keterangan: value.keterangan };
-			if (value.status.value === this.getStatus()[1].value) {
-				data.change_role = "true";
-				update = await updateLaporan(token, id, data, _csrf);
-				Router.push("/app/penjadwalan");
-			} else if (value.status.value === this.getStatus()[2].value) {
-				data.aktif = "false";
-				update = await updateLaporan(token, id, data, _csrf);
-				Router.push("/app/penjadwalan");
-			}
-			if (!update) {
-				toast.update(toastid, { render: "Gagal simpan jadwal", 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 });
-				this.logUpdateLaporanSuccess()
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+			})
+		} else {
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { token, query } = this.props;
+			const { id } = query;
+			let update = null;
+			if (value.status.value === this.getStatus()[1].value || value.status.value === this.getStatus()[2].value) {
+				const toastid = toast.loading("Please wait...");
+				const data = { keterangan: value.keterangan };
+				if (value.status.value === this.getStatus()[1].value) {
+					data.change_role = "true";
+					update = await updateLaporan(token, id, data, _csrf);
+					Router.push("/app/penjadwalan");
+				} else if (value.status.value === this.getStatus()[2].value) {
+					data.aktif = "false";
+					update = await updateLaporan(token, id, data, _csrf);
+					Router.push("/app/penjadwalan");
+				}
+				if (!update) {
+					toast.update(toastid, { render: "Gagal simpan jadwal", 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 });
+					this.logUpdateLaporanSuccess()
+					Router.push("/app/penjadwalan");
+				}
 				Router.push("/app/penjadwalan");
 			}
 			Router.push("/app/penjadwalan");
 		}
-		Router.push("/app/penjadwalan");
+
 	};
 
 	render() {
@@ -256,7 +263,7 @@ class Calendar extends Component {
 							<Col>
 								<Card className="card-default">
 									<CardBody>
-										<DetailLaporan noStatus data={laporan.data} />
+										<DetailLaporan noStatus data={laporan.data} role={this.props.user.role.id}/>
 									</CardBody>
 								</Card>
 							</Col>

+ 20 - 4
components/Keberatan/Riwayat.js

@@ -2,8 +2,18 @@ import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function Riwayat({ data }) {
+function Riwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardHeader>
@@ -30,9 +40,15 @@ function Riwayat({ data }) {
 										{data.dokumen.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
 											</>
 										))}
 									</td>

+ 6 - 0
components/Layout/Menu.js

@@ -113,6 +113,12 @@ const Menu = [
 		icon: "fas fa-building",
 		translate: "sidebar.nav.Riwayat",
 	},
+	{
+		name: "Bypass II",
+		path: "/app/bypassII",
+		icon: "fas fa-building",
+		translate: "sidebar.nav.Riwayat",
+	},
 
 	///////------ANALYTICS REPORT------\\\\\\\\\\\
 

+ 9 - 1
components/Layout/Sidebar.js

@@ -16,6 +16,7 @@ import Menu from "./Menu.js";
 import MenuLLDIKTI from "./MenuLLDIKTI.js";
 import MenuPT from "./MenuPT.js";
 import MenuBypass from "./MenuBypass";
+import { ENV } from "../../env";
 // localStorage.getItem("user");
 // import Menu from './MenuPT.js';
 
@@ -149,7 +150,14 @@ class Sidebar extends Component {
 	async componentDidMount() {
 		// const user = await getUser();
 		const user = this.props.user;
-		this.menu = user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : Menu;
+		if (ENV === "production") {
+			this.menu = user.user_id === "2A080F42-AE7F-407B-976E-DE5FA87BD277" ? MenuBypass : user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : 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 : 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
 		this.buildCollapseList();
 

+ 20 - 4
components/Main/DetailLaporan.js

@@ -2,9 +2,19 @@ import Scrollable from "@/components/Common/Scrollable";
 import moment from "moment";
 import { Col, FormGroup } from "reactstrap";
 import { useSelector } from "react-redux";
+import Swal from "sweetalert2";
 
-function DetailLaporan({ data, noTitle = false, noStatus = false }) {
+function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 	const user = useSelector((state) => state.user);
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<>
 			{(!data.user.isPrivate || user?.role.id === 2020) && (
@@ -149,9 +159,15 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a> :
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
+
 											</td>
 										</tr>
 									))}

+ 31 - 12
components/Main/DetailSanksi.js

@@ -2,8 +2,19 @@ import Scrollable from "@/components/Common/Scrollable";
 import moment from "moment";
 import { Col, FormGroup, Table } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
+import { connect } from "react-redux";
 
-function DetailSanksi({ data, noTitle = false }) {
+function DetailSanksi({ data, noTitle = false, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<>
 			{noTitle ? "" : <p className="lead bb">Detail Sanksi</p>}
@@ -29,12 +40,14 @@ function DetailSanksi({ data, noTitle = false }) {
 						</Scrollable>
 					</Col>
 				</FormGroup>
-				<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>
-					</Col>
-				</FormGroup>
+				{data.masa_berlaku?.from_date && data.masa_berlaku?.from_date === null &&
+					<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>
+						</Col>
+					</FormGroup>
+				}
 				{
 					data.tanggal_akhir_keberatan &&
 					<FormGroup row>
@@ -65,9 +78,15 @@ function DetailSanksi({ data, noTitle = false }) {
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
 											</td>
 										</tr>
 									))}
@@ -123,5 +142,5 @@ function DetailSanksi({ data, noTitle = false }) {
 		</>
 	);
 }
-
-export default DetailSanksi;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(DetailSanksi);

+ 3 - 5
components/Main/Login.js

@@ -75,13 +75,11 @@ class Login extends Component {
         this.props.setUser(auth.data.user);
         axiosAPI.defaults.headers.common["Authorization"] = auth.data.token;
         if (auth.data.user.role.id === 2022) {
-          Router.push({ pathname: "/pt/pemantauan" });
           await createLog(auth.data.token, { aktivitas: "Berhasil Login", _csrf: _csrf });
-          return;
-        } else if ([2020, 2021, 2023].includes(auth.data.user.role.id)) {
-          Router.push({ pathname: "/app/pemantauan" });
+          return location.href = '/pt/pemantauan';
+        } else if ([2020, 2021, 2023, 2024].includes(auth.data.user.role.id)) {
           await createLog(auth.data.token, { aktivitas: "Berhasil Login", _csrf: _csrf });
-          return;
+          return location.href = '/app/pemantauan';
         } else {
           this.setState({ error: "Akun tidak ada" });
         }

+ 22 - 5
components/Main/PermohonanPT.js

@@ -1,7 +1,17 @@
 import Scrollable from "@/components/Common/Scrollable";
 import { Col, FormGroup } from "reactstrap";
+import Swal from "sweetalert2";
 
-function PermohonanPT({ data, title = null }) {
+function PermohonanPT({ data, title = null, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<>
 			<p className="lead bb">{title || "Permohonan dari PT"}</p>
@@ -14,13 +24,20 @@ function PermohonanPT({ data, title = null }) {
 								<tbody>
 									{data.dokumen.map((e) => (
 										<tr>
-											<td  style={{ width: "30px" }}>
+											<td style={{ width: "30px" }}>
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
+
 											</td>
 										</tr>
 									))}

+ 22 - 6
components/NaikSanksi/DetailSanksi.js

@@ -4,8 +4,18 @@ import 'moment/min/locales';
 moment.locale('id');
 import { CardBody, Col, FormGroup, Table, Card } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function DetailSanksi({ data, noTitle = false }) {
+function DetailSanksi({ data, noTitle = false, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardBody>
@@ -97,7 +107,7 @@ function DetailSanksi({ data, noTitle = false }) {
 					<FormGroup row>
 						<Col md="4">Sanksi:</Col>
 						<Col md="8">
-							{data?.pelanggaran&& data.pelanggaran.map((e)=><li><strong>{e.sanksi}</strong> - {e.keterangan_sanksi}</li>)}
+							{data?.pelanggaran && data.pelanggaran.map((e) => <li><strong>{e.sanksi}</strong> - {e.keterangan_sanksi}</li>)}
 							{/* <strong>{data.pelanggaran.map((e) => e.sanksi)}</strong> */}
 						</Col>
 					</FormGroup>
@@ -109,13 +119,19 @@ function DetailSanksi({ data, noTitle = false }) {
 									<tbody>
 										{data.dokumen.map((e) => (
 											<tr>
-												<td  style={{ width: "30px" }}>
+												<td style={{ width: "30px" }}>
 													<em className="fa-lg far fa-file-code"></em>
 												</td>
 												<td>
-													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-														{e.judul}
-													</a>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
 												</td>
 											</tr>
 										))}

+ 31 - 21
components/NaikSanksi/InputTanggal.js

@@ -16,6 +16,7 @@ import Router from "next/router";
 import { getPelanggaranSanksi } from "@/actions/pelanggaran";
 import Select from "react-select";
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 
 
 const selectInstanceId = 1;
@@ -155,29 +156,38 @@ class InputTanggal extends Component {
 
 
     handelSimpan = async (data) => {
-        const getToken = await getCsrf();
-        const _csrf = getToken.token;
-        const { token, query } = this.props;
-        const { id } = query;
-        const formdata = new FormData();
-        formdata.append("no_sanksi", data.no_sanksi);
-        formdata.append("keterangan", data.keterangan);
-        formdata.append("from_date", data.from_date);
-        formdata.append("to_date", data.to_date);
-        // formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value }))));
-        formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value.split(";")[0], description: e.value.split(";")[1], level: e.value.split(";")[2] }))));
-
-        this.state.files.forEach((e) => {
-            formdata.append("dokumen", e);
-        });
-        const toastid = toast.loading("Please wait...");
-        const added = await update(token, id, formdata, _csrf);
-        if (!added) {
-            toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+        if (this.props.user.role.id === 2024) {
+            Swal.fire({
+                icon: 'error',
+                title: 'Oops...',
+                html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+                confirmButtonColor: "#3e3a8e",
+                confirmButtonText: 'Oke'
+            })
         } else {
-            toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
-            Router.push("/app/naik-sanksi");
+            const getToken = await getCsrf();
+            const _csrf = getToken.token;
+            const { token, query } = this.props;
+            const { id } = query;
+            const formdata = new FormData();
+            formdata.append("no_sanksi", data.no_sanksi);
+            formdata.append("keterangan", data.keterangan);
+            formdata.append("from_date", data.from_date);
+            formdata.append("to_date", data.to_date);
+            // formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value }))));
+            formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value.split(";")[0], description: e.value.split(";")[1], level: e.value.split(";")[2] }))));
 
+            this.state.files.forEach((e) => {
+                formdata.append("dokumen", e);
+            });
+            const toastid = toast.loading("Please wait...");
+            const added = await update(token, id, formdata, _csrf);
+            if (!added) {
+                toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+            } else {
+                toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
+                Router.push("/app/naik-sanksi");
+            }
         }
 
     };

+ 12 - 26
components/NaikSanksi/TableLaporan.js

@@ -57,37 +57,23 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
 												</div>
 											</td>
 											<td>
-												{/* <td>{data.no_laporan}</td> */}
-												<div className="media align-items-center">
-													<div className="media-body d-flex">
-														<div>
-															<h4>{data.no_sanksi}</h4>
-														</div>
-													</div>
+												<h4>{data.no_sanksi}</h4>
+											</td>
+											<td className=" col-md-6">
+												<div>
+													<h4 className="m-0">{data.laporan.pt.nama.length > 64 ? data.laporan.pt.nama.substring(0, 64) + "..." : data.laporan.pt.nama}</h4>
+													<p className="w-105">{data.laporan.keterangan.length > 100 ? data.laporan.keterangan.substring(0, 100) + "..." : data.laporan.keterangan}</p>
 												</div>
 											</td>
 
-											<td>
-												<div className="table-desc">
-													<div className="media align-items-center">
-														<div className="media-body d-flex">
-															<div>
-																<h4 className="m-0">{data.laporan.pt.nama.length > 64 ? data.laporan.pt.nama.substring(0, 64) + "..." : data.laporan.pt.nama}</h4>
-																<p className="w-105">{data.laporan.keterangan}</p>
-															</div>
-														</div>
-													</div>
+											<td className=" col-md-5">
+												<div>
+													<h4>
+														Sanksi Administratif : {getLabelSanksi(data.sanksi, "level") === 3 ? "Berat" : getLabelSanksi(data.sanksi, "level") === 2 ? "Sedang" : "Ringan"}
+													</h4>
+													<p className="w-105">{data.keterangan}</p>
 												</div>
 											</td>
-											{/* <td>
-												{data.sanksi.length ? data.sanksi.map((e) => (<h4 className="w-105">Sanksi Administratif {e.label}</h4>)) : data.pelanggaran.map((e) => (<h4 className="w-105">Sanksi Administratif:  {e.label_sanksi}</h4>))}
-												<p className="w-105">{data.keterangan}</p>
-											</td> */}
-											<td>
-												<h4 className="w-105">
-													Sanksi Administratif : {getLabelSanksi(data.sanksi, "level") === 3 ? "Berat" : getLabelSanksi(data.sanksi, "level") === 2 ? "Sedang" : "Ringan"}
-												</h4>
-											</td>
 											{!noBy && <td>{data.user.isPrivate ? "" : data.user.nama}</td>}
 											<td>
 												<div className="ml-auto">

+ 20 - 4
components/NaikSanksi/TableRiwayat.js

@@ -1,9 +1,19 @@
 import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import 'moment/min/locales';
+import Swal from "sweetalert2";
 moment.locale('id');
 
-function TableRiwayat({ data, perbaikan }) {
+function TableRiwayat({ data, perbaikan, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		// <Datatable options={{ responsive: true }}>
 		<div className="card-over">
@@ -40,9 +50,15 @@ function TableRiwayat({ data, perbaikan }) {
 										{value.dokumen.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
 											</>
 										))}
 									</td>

+ 50 - 36
components/Pelaporan/InputData.js

@@ -13,6 +13,8 @@ import * as Yup from "yup";
 import { getCsrf } from "../../actions/security";
 import { createLog } from "@/actions/log";
 
+import Swal from "sweetalert2";
+
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -71,7 +73,7 @@ export class InputData extends Component {
 			keteranganLaporan: "",
 			files: [],
 			pelanggaran: [],
-			selectedFile:{},
+			selectedFile: {},
 		};
 	}
 
@@ -104,20 +106,20 @@ export class InputData extends Component {
 		this.setState({ selectedOptionMulti });
 	};
 
-    onDrop = (selectedFile) => {
-        this.setState({
-            selectedFile: selectedFile.map((file) =>
-                Object.assign(file, {
-                    preview: URL.createObjectURL(file),
-                })
-            ),
-            stat: "Added " + selectedFile.length + " file(s)",
-        });
-        const selectFile = this.state.selectedFile
-        this.setState(prevState => ({
-            files: [...prevState.files, ...selectFile]
-        }))
-    };
+	onDrop = (selectedFile) => {
+		this.setState({
+			selectedFile: selectedFile.map((file) =>
+				Object.assign(file, {
+					preview: URL.createObjectURL(file),
+				})
+			),
+			stat: "Added " + selectedFile.length + " file(s)",
+		});
+		const selectFile = this.state.selectedFile
+		this.setState(prevState => ({
+			files: [...prevState.files, ...selectFile]
+		}))
+	};
 
 	uploadFiles = (e) => {
 		e.preventDefault();
@@ -144,29 +146,41 @@ export class InputData extends Component {
 		await createLog(token, { aktivitas: "Mengakses halaman Pelaporan", menu: "Pelaporan", _csrf: _csrf });
 	}
 	onSubmit = async (data) => {
-		const { token, query } = this.props;
-		const getTokenCsrf = await getCsrf();
-		const _csrf = getTokenCsrf.token;
-		const formdata = new FormData();
-		formdata.append("no_laporan", data.no_laporan);
-		formdata.append("pt_id", query.ptId);
-		formdata.append("keterangan", data.keterangan);
-		formdata.append("pelanggaran_id", data.pelanggaran.join());
-		this.state.files.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		const create = createPelaporan(token, formdata, _csrf);
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const { token, query } = this.props;
+			const getTokenCsrf = await getCsrf();
+			const _csrf = getTokenCsrf.token;
+			const formdata = new FormData();
+			formdata.append("no_laporan", data.no_laporan);
+			formdata.append("pt_id", query.ptId);
+			formdata.append("keterangan", data.keterangan);
+			formdata.append("pelanggaran_id", data.pelanggaran.join());
+			this.state.files.forEach((e) => {
+				formdata.append("dokumen", e);
+			});
+			const create = createPelaporan(token, formdata, _csrf);
 
-		await toast.promise(create, {
-			pending: "Loading...",
-			success: "Berhasil buat laporan",
-			error: "Gagal buat laporan",
-		},
-			this.createLog());
+			await toast.promise(create, {
+				pending: "Loading...",
+				success: "Berhasil buat laporan",
+				error: "Gagal buat laporan",
+			},
+				this.createLog());
+
+			await Router.push({
+				pathname: "/app/pelaporan",
+			});
+		}
 
-		Router.push({
-			pathname: "/app/pelaporan",
-		});
 	};
 
 	render() {

+ 127 - 0
components/PelaporanTuntas/DetailSanksi.js

@@ -0,0 +1,127 @@
+import Scrollable from "@/components/Common/Scrollable";
+import moment from "moment";
+import { Col, FormGroup, Table } from "reactstrap";
+import { API_URL } from "@/env";
+
+function DetailSanksi({ data, noTitle = false }) {
+	return (
+		<>
+			{noTitle ? "" : <p className="lead bb">Detail Sanksi</p>}
+			<form className="form-horizontal">
+				<FormGroup row>
+					<Col md="4">Nomor Sanksi:</Col>
+					<Col md="8">
+						<strong>{data.no_sanksi}</strong>
+					</Col>
+				</FormGroup>
+				<FormGroup row>
+					<Col md="4">Nama Perguruan Tinggi:</Col>
+					<Col md="8">
+						<strong>{data.laporan.pt.nama}</strong>
+					</Col>
+				</FormGroup>
+
+				<FormGroup row>
+					<Col md="4">Keterangan:</Col>
+					<Col md="8">
+						<Scrollable height="100px" className="list-group">
+							<p>{data.keterangan}</p>
+						</Scrollable>
+					</Col>
+				</FormGroup>
+				<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>
+					</Col>
+				</FormGroup>
+				{
+					data.tanggal_akhir_keberatan &&
+					<FormGroup row>
+						<Col md="4">Tanggal Akhir Pengajuan Keberatan</Col>
+						<Col md="8">
+							<strong>{moment(data.tanggal_akhir_keberatan).locale("id").format("D MMMM YYYY")}</strong>
+						</Col>
+					</FormGroup>
+				}
+				{
+					data.jawaban?.keberatan?.tanggal_akhir_banding &&
+					<FormGroup row>
+						<Col md="4">Tanggal Akhir Pengajuan Banding:</Col>
+						<Col md="8">
+							<strong>{moment(data.jawaban?.keberatan?.tanggal_akhir_banding).locale("id").format("D MMMM YYYY")}</strong>
+						</Col>
+					</FormGroup>
+				}
+				<FormGroup row>
+					<Col md="4">Dokumen Sanksi:</Col>
+					<Col md="8">
+						<Scrollable height="120px" className="list-group">
+							<table className="table table-bordered bg-transparent">
+								<tbody>
+									{data.dokumen.map((e) => (
+										<tr>
+											<td style={{ width: "30px" }}>
+												<em className="fa-lg far fa-file-code"></em>
+											</td>
+											<td>
+												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+													{e.judul}
+												</a>
+											</td>
+										</tr>
+									))}
+								</tbody>
+							</table>
+						</Scrollable>
+					</Col>
+				</FormGroup>
+				<FormGroup row>
+					<Col md={12}>
+						<div className="card b">
+							<div className="card-body bb">
+								<Table responsive>
+									<thead>
+										<tr>
+											<th>Jenis Pelanggaran</th>
+											<th>Sanksi</th>
+										</tr>
+									</thead>
+									<tbody>
+										{data.pelanggaran.map((jp, index) => (
+											<tr key={jp._id}>
+												<td width={50}>
+													<div className="media align-items-center">
+														<div className="media-body d-flex">
+															<div>
+																<p>{jp.pelanggaran}</p>
+																<p>TMT : {jp.tmt_bulan} Bulan</p>
+																<p>Jenis Sanksi Administratif : {jp.label_sanksi}</p>
+															</div>
+														</div>
+													</div>
+												</td>
+												<td width={50}>
+													<div className="media align-items-center">
+														<div className="media-body d-flex">
+															<div>
+																<p>{jp.sanksi}</p>
+																<p>Keterangan : {jp.keterangan_sanksi}</p>
+															</div>
+														</div>
+													</div>
+												</td>
+											</tr>
+										))}
+									</tbody>
+								</Table>
+							</div>
+						</div>
+					</Col>
+				</FormGroup>
+			</form>
+		</>
+	);
+}
+
+export default DetailSanksi;

+ 2 - 1
components/PelaporanTuntas/TableLaporan.js

@@ -4,6 +4,7 @@ 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">
@@ -53,7 +54,7 @@ function TableLaporan({ listData, to, linkName }) {
 													<Link
 														href={{
 															pathname: to,
-															query: { id: data._id },
+															query: { id: data._id, data: data.no_sanksi ? "sanksi" : "laporan" },
 														}}
 													>
 														<Button className="btn-login loader" color>

+ 10 - 1
components/Pemeriksaan/DetailLaporan.js

@@ -3,7 +3,7 @@ import moment from "moment";
 import { Col, FormGroup } from "reactstrap";
 import { useSelector } from "react-redux";
 
-function DetailLaporan({ data, noTitle = false, noStatus = false }) {
+function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 	const user = useSelector((state) => state.user);
 	return (
 		<>
@@ -148,6 +148,15 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
+												{role ===2024?
+												<a className="text-muted">
+													{e.judul}
+												</a>
+												:	<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+													{e.judul}
+												</a>
+											
+											}
 												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
 													{e.judul}
 												</a>

+ 46 - 34
components/Pemeriksaan/InputEvaluasi.js

@@ -10,6 +10,7 @@ import * as Yup from "yup";
 import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
 import { connect } from "react-redux";
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 
 
 const selectInstanceId = 1;
@@ -138,44 +139,55 @@ class InputEvaluasi extends Component {
 	};
 
 	onSubmit = async (data, { resetForm }) => {
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		const { token, query } = this.props;
-		const { id } = query;
-		const formdata = new FormData();
-		formdata.append("judul", data.judul);
-		formdata.append("tanggal", data.tanggal);
-		this.state.files.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		if (this.state.delegasichecklist == true) {
-			await toast.promise(insertPemeriksaan(token, id, formdata, _csrf), {
-				pending: "Loading",
-				success: "Success",
-				error: "Error",
-				autoClose: 1000
-			});
-
-			data.change_role = "true";
-			data.keterangan = "delegasi ke DIKTI"
-			Router.push("/app/pemeriksaan");
-			update = await updateLaporan(token, id, data);
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+			})
 		} else {
-			await toast.promise(insertPemeriksaan(token, id, formdata, _csrf), {
-				pending: "Loading",
-				success: {
-					render: "success",
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { token, query } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			formdata.append("judul", data.judul);
+			formdata.append("tanggal", data.tanggal);
+			this.state.files.forEach((e) => {
+				formdata.append("dokumen", e);
+			});
+			if (this.state.delegasichecklist == true) {
+				await toast.promise(insertPemeriksaan(token, id, formdata, _csrf), {
+					pending: "Loading",
+					success: "Success",
+					error: "Error",
 					autoClose: 1000
-				},
-				error: "Error",
+				});
 
-			});
-			Router.push("/app/pemeriksaan");
+				data.change_role = "true";
+				data.keterangan = "delegasi ke DIKTI"
+				Router.push("/app/pemeriksaan");
+				update = await updateLaporan(token, id, data);
+			} else {
+				await toast.promise(insertPemeriksaan(token, id, formdata, _csrf), {
+					pending: "Loading",
+					success: {
+						render: "success",
+						autoClose: 1000
+					},
+					error: "Error",
+
+				});
+				Router.push("/app/pemeriksaan");
+			}
+			this.setState({ files: [] });
+			resetForm();
+			const pelaporan = await getOneLaporan(token, query.id);
+			this.props.changePelaporan(pelaporan);
 		}
-		this.setState({ files: [] });
-		resetForm();
-		const pelaporan = await getOneLaporan(token, query.id);
-		this.props.changePelaporan(pelaporan);
+
 	};
 
 	handlechecklist = () => {

+ 19 - 1
components/Pemeriksaan/TableRiwayat.js

@@ -1,6 +1,16 @@
 import Datatable from "@/components/Tables/Datatable";
+import Swal from "sweetalert2";
 
-function TableRiwayat({ data }) {
+function TableRiwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		// <Datatable options={{ responsive: true }}>
 		<div className="card-over">
@@ -23,6 +33,14 @@ function TableRiwayat({ data }) {
 								{e.dokumen.map((e, index) => (
 									<>
 										<em key="index" className="fa-lg far fa-file-code"></em>
+										{role === 2024 ?
+											<a className="text-muted" onClick={handleOpenAlert} >
+												{e.judul}
+											</a>
+											: <a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+												{e.judul}
+											</a>
+										}
 										<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
 											{e.judul}
 										</a>

+ 21 - 4
components/PencabutanSanksi/Riwayat.js

@@ -2,8 +2,18 @@ import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function Riwayat({ data }) {
+function Riwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardHeader>
@@ -30,9 +40,16 @@ function Riwayat({ data }) {
 										{data.dokumen?.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+
+												}
 											</>
 										))}
 									</td>

+ 20 - 2
components/Penjadwalan/DetailLaporan.js

@@ -2,9 +2,19 @@ import Scrollable from "@/components/Common/Scrollable";
 import moment from "moment";
 import { Col, FormGroup } from "reactstrap";
 import { useSelector } from "react-redux";
+import Swal from "sweetalert2";
 
-function DetailLaporan({ data, noTitle = false, noStatus = false }) {
+function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 	const user = useSelector((state) => state.user);
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<>
 			{(!data.user.isPrivate || user?.role.id === 2020) && (
@@ -147,10 +157,18 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 											<td style={{ width: "30px" }}>
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
-											<td>
+
+											<td>{role === 2024 ?
+												<a className="text-muted" onClick={handleOpenAlert}>
+													{e.judul}
+												</a>
+												:
 												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
 													{e.judul}
 												</a>
+
+											}
+
 											</td>
 										</tr>
 									))}

+ 21 - 5
components/PerpanjanganSanksi/DetailSanksi.js

@@ -4,8 +4,18 @@ import 'moment/min/locales';
 moment.locale('id');
 import { CardBody, Col, FormGroup, Table, Card } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function DetailSanksi({ data, noTitle = false }) {
+function DetailSanksi({ data, noTitle = false, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardBody>
@@ -126,13 +136,19 @@ function DetailSanksi({ data, noTitle = false }) {
 									<tbody>
 										{data.dokumen.map((e) => (
 											<tr>
-												<td  style={{ width: "30px" }}>
+												<td style={{ width: "30px" }}>
 													<em className="fa-lg far fa-file-code"></em>
 												</td>
 												<td>
-													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-														{e.judul}
-													</a>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
 												</td>
 											</tr>
 										))}

+ 27 - 17
components/PerpanjanganSanksi/InputTanggal.js

@@ -14,6 +14,7 @@ import 'moment/min/locales';
 moment.locale('id');
 import Router from "next/router";
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 
 
 const selectInstanceId = 1;
@@ -140,24 +141,33 @@ class InputTanggal extends Component {
 
 
     handelSimpan = async (data) => {
-        const getToken = await getCsrf();
-        const _csrf = getToken.token;
-        const { token, query } = this.props;
-        const { id } = query;
-        const formdata = new FormData();
-        formdata.append("from_date", this.state.from_date);
-        formdata.append("to_date", this.state.to_date);
-        this.state.files.forEach((e) => {
-            formdata.append("dokumen", e);
-        });
-        const toastid = toast.loading("Please wait...");
-        const added = await editTmt(token, id, formdata, _csrf);
-        if (!added) {
-            toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+        if (this.props.user.role.id === 2024) {
+            Swal.fire({
+                icon: 'error',
+                title: 'Oops...',
+                html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+                confirmButtonColor: "#3e3a8e",
+                confirmButtonText: 'Oke'
+            })
         } else {
-            toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
-            Router.push("/app/perpanjangan-sanksi");
-
+            const getToken = await getCsrf();
+            const _csrf = getToken.token;
+            const { token, query } = this.props;
+            const { id } = query;
+            const formdata = new FormData();
+            formdata.append("from_date", this.state.from_date);
+            formdata.append("to_date", this.state.to_date);
+            this.state.files.forEach((e) => {
+                formdata.append("dokumen", e);
+            });
+            const toastid = toast.loading("Please wait...");
+            const added = await editTmt(token, id, formdata, _csrf);
+            if (!added) {
+                toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+            } else {
+                toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
+                Router.push("/app/perpanjangan-sanksi");
+            }
         }
 
     };

+ 22 - 5
components/RekomendasiDelegasi/DetailSanksi.js

@@ -4,8 +4,19 @@ import 'moment/min/locales';
 moment.locale('id');
 import { CardBody, Col, FormGroup, Table, Card } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function DetailSanksi({ data, noTitle = false }) {
+
+function DetailSanksi({ data, noTitle = false, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardBody>
@@ -64,13 +75,19 @@ function DetailSanksi({ data, noTitle = false }) {
 									<tbody>
 										{data.dokumen.map((e) => (
 											<tr>
-												<td  style={{ width: "30px" }}>
+												<td style={{ width: "30px" }}>
 													<em className="fa-lg far fa-file-code"></em>
 												</td>
 												<td>
-													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-														{e.judul}
-													</a>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
 												</td>
 											</tr>
 										))}

+ 46 - 34
components/RekomendasiDelegasi/InputRekomendasi.js

@@ -9,6 +9,7 @@ import { getOneSanksi, addRekomendasiDelegasi } from "@/actions/sanksi";
 import moment from "moment";
 import 'moment/min/locales';
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 moment.locale('id');
 
 
@@ -66,7 +67,7 @@ class InputRekomendasi extends Component {
 			files: [],
 			sanksi: {},
 			data: {},
-			selectedFile:{}
+			selectedFile: {}
 		};
 	}
 
@@ -82,20 +83,20 @@ class InputRekomendasi extends Component {
 		});
 	};
 
-    onDrop = (selectedFile) => {
-        this.setState({
-            selectedFile: selectedFile.map((file) =>
-                Object.assign(file, {
-                    preview: URL.createObjectURL(file),
-                })
-            ),
-            stat: "Added " + selectedFile.length + " file(s)",
-        });
-        const selectFile = this.state.selectedFile
-        this.setState(prevState => ({
-            files: [...prevState.files, ...selectFile]
-        }))
-    };
+	onDrop = (selectedFile) => {
+		this.setState({
+			selectedFile: selectedFile.map((file) =>
+				Object.assign(file, {
+					preview: URL.createObjectURL(file),
+				})
+			),
+			stat: "Added " + selectedFile.length + " file(s)",
+		});
+		const selectFile = this.state.selectedFile
+		this.setState(prevState => ({
+			files: [...prevState.files, ...selectFile]
+		}))
+	};
 
 	uploadFiles = (e) => {
 		e.preventDefault();
@@ -122,27 +123,38 @@ class InputRekomendasi extends Component {
 
 
 	handelSimpan = async () => {
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		const { token, query } = this.props;
-		const { id } = query;
-		const formdata = new FormData();
-		this.state.files.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		const toastid = toast.loading("Please wait...");
-		const added = await addRekomendasiDelegasi(token, id, formdata, _csrf);
-		if (!added) {
-			toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
 		} else {
-			toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			const sanksi = await getOneSanksi(token, id);
-			this.setState({ sanksi, files: [] });
-			resetForm();
-			// Router.push({
-			// 	pathname: "/app/rekomendasi-delegasi",
-			// });
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { token, query } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			this.state.files.forEach((e) => {
+				formdata.append("dokumen", e);
+			});
+			const toastid = toast.loading("Please wait...");
+			const added = await addRekomendasiDelegasi(token, id, formdata, _csrf);
+			if (!added) {
+				toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+			} else {
+				toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
+				const sanksi = await getOneSanksi(token, id);
+				this.setState({ sanksi, files: [] });
+				resetForm();
+				// Router.push({
+				// 	pathname: "/app/rekomendasi-delegasi",
+				// });
 
+			}
 		}
 
 	};

+ 30 - 8
components/RekomendasiDelegasi/TableRiwayat.js

@@ -1,9 +1,19 @@
 import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import 'moment/min/locales';
+import Swal from "sweetalert2";
 moment.locale('id');
 
-function TableRiwayat({ data, perbaikan }) {
+function TableRiwayat({ data, perbaikan, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		// <Datatable options={{ responsive: true }}>
 		<div className="card-over">
@@ -25,10 +35,16 @@ function TableRiwayat({ data, perbaikan }) {
 						<td>
 							{data.dokumen.map((e, index) => (
 								<>
-									<em key="index" className="fa-lg far fa-file-code"></em>
-									<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-										{e.judul}
-									</a>
+									<em className="fa-lg far fa-file-code"></em>
+									{role === 2024 ?
+										<a className="text-muted" onClick={handleOpenAlert}>
+											{e.judul}
+										</a>
+										:
+										<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+											{e.judul}
+										</a>
+									}
 									<br />
 								</>
 							))}
@@ -40,9 +56,15 @@ function TableRiwayat({ data, perbaikan }) {
 										{value.dokumen.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												}
 											</>
 										))}
 									</td>

+ 1 - 1
components/Riwayat/Maps.js

@@ -17,7 +17,7 @@ const RegionValues = {
     'ID_la': 0,
     'ID_be': 0,
     'ID_bb': 0,
-    'ID_jk': 33,
+    'ID_jk': 0,
     'ID_jb': 0,
     'ID_bt': 0,
     'ID_yo': 0,

+ 3 - 7
components/Riwayat/TableLaporan.js

@@ -14,10 +14,8 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
                                 <tr>
                                     <th>No.Laporan</th>
                                     <th>Deskripsi Laporan</th>
-                                    {status && <th>Status</th>}
+                                     <th>Status</th>
                                     {!noBy && <th>Dibuat Oleh</th>}
-                                    {/* <th>Created</th> */}
-                                    {/* <th></th> */}
                                 </tr>
                             </thead>
                             <tbody>
@@ -42,8 +40,6 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
                                                         <div className="media-body d-flex">
                                                             <div>
                                                                 <h4 className="m-0">{data.pt.nama.length > 64 ? data.pt.nama.substring(0, 64) + "..." : data.pt.nama}</h4>
-                                                                {/* <h4 className="m-0">{data.pt.nama}</h4> */}
-                                                                {/* <p className="w-105">{data.keterangan.length > 150 ? data.keterangan.substring(0, 150) + "..." : data.keterangan}</p> */}
                                                                 <p className="w-105">{data.keterangan}</p>
                                                             </div>
                                                         </div>
@@ -51,9 +47,9 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
                                                 </div>
                                             </td>
 
-                                            {status ? (
+                                            {data.step ? (
                                                 <td>
-                                                    <div className="badge badge-info">{data.role_data === "dikti" ? "Ditindaklanjuti DIKTI" : "Ditindaklanjuti LLDIKTI"}</div>
+                                                    <div className="badge badge-success">{data.step}</div>
                                                 </td>
                                             ) : (
                                                 ""

+ 44 - 12
components/Riwayat/TableRadar.js

@@ -1,11 +1,9 @@
 import React, { Component } from 'react';
-import ContentWrapper from '@/components/Layout/ContentWrapper';
 import Link from "next/link";
 import { Row, Col, Card, CardHeader, CardBody, Table, Button } from 'reactstrap';
-import cabutSanksi from '../../pages/app/riwayat/cabutSanksi';
 
 
-function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi }) {
+function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keberatan, banding, perbaikan, cabutSanksi, all_Laporan }) {
     return (
         <Card className="card-default">
             <CardBody>
@@ -14,36 +12,46 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                         <tr >
                             <th>Wilayah LLDikti\Menu</th>
                             <th style={{
+                                color: "black",
+                            }}>Jumlah Laporan</th><th style={{
                                 backgroundColor: '#80b1ff',
                                 color: "black",
-                            }}>Penjadwalan Evaluasi</th>
+                                textAlign: "center",
+                            }}>1. Penjadwalan Evaluasi</th>
                             <th style={{
                                 backgroundColor: '#de8383',
                                 color: "black",
-                            }}>Pemeriksaan</th>
+                                textAlign: "center",
+                            }}>2. Pemeriksaan</th>
                             <th style={{
                                 backgroundColor: '#fdda80',
                                 color: "black",
-                            }}>Sanksi</th>
+                                textAlign: "center",
+                            }}>3. Sanksi</th>
                             <th style={{
                                 backgroundColor: '#cfab80',
                                 color: "black",
-                            }}>Keberatan</th>
+                                textAlign: "center",
+                            }}>4. Keberatan</th>
                             <th style={{
                                 backgroundColor: '#ef90df',
                                 color: "black",
-                            }}>Banding</th>
+                                textAlign: "center",
+                            }}>5. Banding</th>
                             <th style={{
                                 backgroundColor: '#80df89',
                                 color: "black",
-                            }}>Pemantauan perbaikan</th>
+                                textAlign: "center",
+                            }}>6. Pemantauan perbaikan</th>
                             <th style={{
                                 backgroundColor: '#a3d4d1',
                                 color: "black",
-                            }}>Pencabutan Sanksi</th>
+                                textAlign: "center",
+                            }}>7. Pencabutan Sanksi</th>
                             <th style={{
                                 backgroundColor: '#e8f2f1',
                                 color: "black",
+                                textAlign: "center",
                             }}>Lihat Laporan</th>
                         </tr>
                     </thead>
@@ -51,6 +59,18 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                         return (
                             <tr key={data.id}>
                                 <td>{data.pembina.name}</td>
+                                <Link
+                                    href={{
+                                        pathname: all_Laporan,
+                                        query: { id: data.pembina.id },
+                                    }}
+                                >
+                                    <td style={{
+                                        color: "black",
+                                        textAlign: "center",
+                                        cursor: "pointer",
+                                    }}>{data.laporan.length}</td>
+                                </Link>
                                 <Link
                                     href={{
                                         pathname: jadwal,
@@ -61,6 +81,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#80b1ff',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer"
                                     }}>{data.jumlah_jadwal_evaluasi}</td>
                                 </Link>
                                 <Link
@@ -73,6 +94,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#de8383',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_pemeriksaan}</td>
                                 </Link>
                                 <Link
@@ -85,6 +107,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#fdda80',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_sanksi}</td>
                                 </Link>
                                 <Link
@@ -97,6 +120,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#cfab80',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_keberatan}</td>
                                 </Link>
                                 <Link
@@ -109,6 +133,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#ef90df',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_banding}</td>
                                 </Link>
                                 <Link
@@ -121,6 +146,7 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#80df89',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_pemantauan_perbaikan}</td>
                                 </Link>
                                 <Link
@@ -133,17 +159,23 @@ function TableRadar({ listData, to, linkName, jadwal, pemeriksaan, sanksi, keber
                                         backgroundColor: '#a3d4d1',
                                         color: "black",
                                         textAlign: "center",
+                                        cursor: "pointer",
                                     }}>{data.jumlah_pencabutan_sanksi}</td>
                                 </Link>
                                 <td>
-                                    <div className="ml-auto">
+                                    <div className="ml-auto" style={{
+                                        textAlign: "center",
+                                        marginLeft: "auto",
+                                        marginRight: "auto",
+
+                                    }}>
                                         <Link
                                             href={{
                                                 pathname: to,
                                                 query: { id: data.pembina.id },
                                             }}
                                         >
-                                            <Button className="btn-login" color>
+                                            <Button className="btn-login" color >
                                                 <span className="font-color-white">
                                                     {linkName}
                                                 </span>

+ 94 - 115
components/Riwayat/TableRiwayat.js

@@ -1,124 +1,103 @@
+import Datatable from "@/components/Tables/Datatable";
+import { Button } from "reactstrap";
+import Link from "next/link";
+import moment from "moment";
 import React, { Component } from "react";
-import ContentWrapper from "@/components/Layout/ContentWrapper";
-import { Container, Progress } from "reactstrap";
 import { getLog2 } from "@/actions/log";
 import { connect } from "react-redux";
-import moment from "moment";
 
-let ReactDataGrid = null;
 class TableRiwayat extends Component {
-	state = {
-		dataGridReady: false,
-		dataRiwayat: {},
-		rows: [],
-		originalRows: null,
-	};
-
-	constructor(props, context) {
-		super(props, context);
-
-		this._columns = [
-			{
-				key: "timestamp",
-				name: "Timestamp",
-				sortable: true,
-				// width: 150
-			},
-			{
-				key: "username",
-				name: "Username",
-				sortable: true,
-				// width: 200
-			},
-			{
-				key: "ipv4",
-				name: "IPv4",
-				sortable: true,
-				// width: 120
-			},
-			{
-				key: "menu",
-				name: "Menu",
-				sortable: true,
-				// width: 200
-			},
-			{
-				key: "deskripsi",
-				name: "Deskripsi",
-				sortable: true,
-				width: 400
-			},
-		];
-	}
-
-	async componentDidMount() {
-		const { token } = this.props;
-		const dataRiwayat = await getLog2(token);
-		this.setState({ dataRiwayat });
-		ReactDataGrid = require("react-data-grid");
-		this.setState({
-			dataGridReady: true,
-		});
-
-		let originalRows = this.createRows(1000);
-		let rows = originalRows.slice(0);
-		this.setState({ rows, originalRows });
-	}
-
-	getRandomDate = (start, end) => {
-		return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())).toLocaleDateString();
-	};
-	getover = (e) => {
-		return <div className=" getover"><span className="getover">{e}</span></div>
-	}
+    constructor(props) {
+        super(props);
+        this.state = {
+            dataRiwayat: "",
+        };
+    }
+    componentDidMount = async () => {
+        const { token } = this.props;
+        const dataRiwayat = await getLog2(this.props.token);
+        this.setState({ dataRiwayat });
+    }
 
-	createRows = () => {
-		let rows = [];
-		const { dataRiwayat } = this.state;
-		if (dataRiwayat) {
-			dataRiwayat.data.forEach((e) => {
-				rows.push({
-					deskripsi: (e.aktivitas),
-					complete: Math.min(100, Math.round(Math.random() * 110)),
-					ipv4: e.ipv4 || "-",
-					menu: e.menu || "-",
-					username: e.user?.nama || "-",
-					timelapse: this.getover(moment(e.createdAt).format("DD-MM-YYYY, hh:mm a")),
-					completeDate: this.getRandomDate(new Date(), new Date(2021, 0, 1)),
-				});
-			});
-		}
+    render() {
+        return (
+            <div className="card b ">
+                <div style={{ height: 500 }} className="card-body card-over">
+                    {this.state.dataRiwayat && (
+                        <Datatable options={{
+                            responsive: false, ordering: false, keys: false, lengthChange: false, searching: false, aLengthMenu: [500], paging: false, scrollX: true, scrollY: "370px",
+                            bordered: true
+                        }}>
+                            <table className="table w-100" data-order='[[3, "desc"]]'>
+                                <thead>
+                                    <tr>
+                                        <th>Timestamp</th>
+                                        <th>Username</th>
+                                        <th>IPv4</th>
+                                        <th>Menu</th>
+                                        <th>Deskripsi</th>
+                                        {/* <th>Created</th> */}
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    {this.state.dataRiwayat && this.state.dataRiwayat.data?.map(value => (
+                                        <tr>
+                                            <td style={{ width: 175 }}>
+                                                <div className="media align-items-center">
+                                                    <div className="media-body d-flex">
+                                                        <div>
+                                                            <p>{value.createdAt && (moment(value.createdAt).format("DD-MM-YYYY, HH:mm"))}</p>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td style={{ minWidth: 130 }}>
+                                                <div className="media align-items-center">
+                                                    <div className="media-body d-flex">
+                                                        <div>
+                                                            <p>{value.user?.nama}</p>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td style={{ minWidth: 120 }}>
+                                                <div className="media align-items-center">
+                                                    <div className="media-body d-flex">
+                                                        <div>
+                                                            <p>{value.ipv4}</p>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td style={{ minWidth: 150 }}>
+                                                <div className="media align-items-center">
+                                                    <div className="media-body d-flex">
+                                                        <div>
+                                                            <p>{value.menu}</p>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                            <td style={{ minWidth: 350 }}>
+                                                <div className="media align-items-center">
+                                                    <div className="media-body d-flex">
+                                                        <div>
+                                                            <p>{value.aktivitas}</p>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </td>
+                                        </tr>
+                                    ))}
 
-		return rows;
-	};
-
-	rowGetter = (i) => this.state.rows[i];
-
-	handleGridSort = (sortColumn, sortDirection) => {
-		const comparer = (a, b) => {
-			if (sortDirection === "ASC") {
-				return a[sortColumn] > b[sortColumn] ? 1 : -1;
-			} else if (sortDirection === "DESC") {
-				return a[sortColumn] < b[sortColumn] ? 1 : -1;
-			}
-		};
-
-		const rows = sortDirection === "NONE" ? this.state.originalRows.slice(0) : this.state.rows.sort(comparer);
-
-		this.setState({ rows });
-	};
-
-	render() {
-		return (
-			<ContentWrapper>
-				<Container fluid>{this.state.dataGridReady && <ReactDataGrid onGridSort={this.handleGridSort} columns={this._columns} rowGetter={this.rowGetter} rowsCount={this.state.rows.length} />}</Container>
-				<div align="center">
-					<span>Riwayat Pengguna</span>
-				</div>
-			</ContentWrapper>
-		);
-	}
+                                </tbody>
+                            </table>
+                        </Datatable>
+                    )}
+                </div>
+            </div >
+        );
+    }
 }
-
 const mapStateToProps = (state) => ({ token: state.token });
-export default connect(mapStateToProps)(TableRiwayat);
+export default connect(mapStateToProps)(TableRiwayat);

+ 24 - 6
components/Sanksi/BeritaAcara.js

@@ -13,6 +13,10 @@ import { ToastContainer, toast } from "react-toastify";
 import Router from "next/router";
 import { getCsrf } from '../../actions/security';
 import { ENV } from '../../env';
+import { connect } from "react-redux";
+import Swal from 'sweetalert2';
+
+
 
 
 
@@ -41,7 +45,7 @@ class BeritaAcara extends Component {
             setmeState: true,
             descPelanggaran: [],
             modalRemovePeserta: false,
-            selectedPeserta: ""
+            selectedPeserta: "",
         };
     }
 
@@ -238,13 +242,21 @@ class BeritaAcara extends Component {
         const meringankan = this.state.meringankan
         const data = [...meringankan]
         data.splice(index, 1);
-
         this.setState({
             meringankan: data,
         }, this.setDataSuratBA()
         );
-
     }
+
+    handleOpenAlert = () => {
+        Swal.fire({
+            icon: 'error',
+            title: 'Oops...',
+            html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+            confirmButtonColor: "#3e3a8e",
+            confirmButtonText: 'Oke'
+        })
+    };
     render() {
         const { dataLaporan, dataSuratBA, dataPelanggaran } = this.props
         const { descPelanggaran, tanggal, setTanggal, setTanggal_2, tanggal_2, temuanLain } = this.state
@@ -283,6 +295,10 @@ class BeritaAcara extends Component {
                 </Modal>
                 <div className=' content-heading border-radius-login'>
                     <span className="btn-radius">
+                        {this.props.user?.role?.id === 2024 ?
+                            <Button color className="btn-labeled-4" onClick={this.handleOpenAlert}>
+                                <h4 className="p-0 mt-2">Print dan Download</h4>
+                            </Button> :
                         <ReactToPrint
                             trigger={() => {
                                 return <span>
@@ -293,6 +309,8 @@ class BeritaAcara extends Component {
                             }}
                             content={() => this.componentRef}
                         />
+                        }
+
                     </span>
                 </div>
                 <div style={{ display: "none" }}>
@@ -634,6 +652,6 @@ class BeritaAcara extends Component {
     }
 }
 
-// const mapStateToProps = (state) => ({ user: state.user, token: state.token });
-// export default connect(mapStateToProps)(BeritaAcara)
-export default BeritaAcara
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(BeritaAcara)
+// export default BeritaAcara

+ 139 - 242
components/Sanksi/DetailSanksi.js

@@ -7,6 +7,9 @@ import { getOneSanksi } from "../../actions/sanksi";
 import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
 import ComponentBA from "../Sanksi/SuratBA _detail";
 import Link from "next/dist/client/link";
+import { connect } from "react-redux";
+import Swal from "sweetalert2";
+
 
 
 
@@ -28,6 +31,15 @@ class DetailSanksi extends Component {
 		const sanksi = await getOneSanksi(token, query.id);
 		this.setState({ sanksi });
 	};
+	handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 
 	render() {
 		const { sanksi } = this.state
@@ -49,81 +61,96 @@ class DetailSanksi extends Component {
 							</Col>
 						</FormGroup>
 						<FormGroup row>
-					<Col md="4">Keterangan:</Col>
-					<Col md="8">
-						<Scrollable height="100px" className="list-group">
-							<p>{sanksi.data.keterangan}</p>
-						</Scrollable>
-					</Col>
-				</FormGroup>
-				<FormGroup row>
-					<Col md="4">Tanggal Penetapan Sanksi:</Col>
-					<Col md="8">
-						<strong>{moment(sanksi.data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY")}</strong>
-					</Col>
-				</FormGroup>
-				{
-					sanksi.data.tanggal_akhir_keberatan &&
-					<FormGroup row>
-						<Col md="4">Tanggal Akhir Pengajuan Keberatan</Col>
-						<Col md="8">
-							<strong>{moment(sanksi.data.tanggal_akhir_keberatan).locale("id").format("D MMMM YYYY")}</strong>
-						</Col>
-					</FormGroup>
-				}
-				{
-					sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding &&
-					<FormGroup row>
-						<Col md="4">Tanggal Akhir Pengajuan Banding:</Col>
-						<Col md="8">
-							<strong>{moment(sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding).locale("id").format("D MMMM YYYY")}</strong>
-						</Col>
-					</FormGroup>
-				}
-				<FormGroup row>
-					<Col md="4">Dokumen Sanksi:</Col>
-					<Col md="8">
-						<Scrollable height="120px" className="list-group">
-							<table className="table table-bordered bg-transparent">
-								<tbody>
-									{sanksi.data.dokumen.map((e) => (
-										<tr>
-											<td style={{ width: "30px" }}>
-												<em className="fa-lg far fa-file-code"></em>
-											</td>
-											<td>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
-											</td>
-										</tr>
-									))}
-								</tbody>
-							</table>
-						</Scrollable>
-					</Col>
-				</FormGroup>
+							<Col md="4">Keterangan:</Col>
+							<Col md="8">
+								<Scrollable height="100px" className="list-group">
+									<p>{sanksi.data.keterangan}</p>
+								</Scrollable>
+							</Col>
+						</FormGroup>
+						<FormGroup row>
+							<Col md="4">Tanggal Penetapan Sanksi:</Col>
+							<Col md="8">
+								<strong>{moment(sanksi.data.masa_berlaku?.from_date).locale("id").format("D MMMM YYYY")}</strong>
+							</Col>
+						</FormGroup>
+						{
+							sanksi.data.tanggal_akhir_keberatan &&
+							<FormGroup row>
+								<Col md="4">Tanggal Akhir Pengajuan Keberatan</Col>
+								<Col md="8">
+									<strong>{moment(sanksi.data.tanggal_akhir_keberatan).locale("id").format("D MMMM YYYY")}</strong>
+								</Col>
+							</FormGroup>
+						}
+						{
+							sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding &&
+							<FormGroup row>
+								<Col md="4">Tanggal Akhir Pengajuan Banding:</Col>
+								<Col md="8">
+									<strong>{moment(sanksi.data.jawaban?.keberatan?.tanggal_akhir_banding).locale("id").format("D MMMM YYYY")}</strong>
+								</Col>
+							</FormGroup>
+						}
+						<FormGroup row>
+							<Col md="4">Dokumen Sanksi:</Col>
+							<Col md="8">
+								<Scrollable height="120px" className="list-group">
+									<table className="table table-bordered bg-transparent">
+										<tbody>
+											{sanksi.data.dokumen.map((e) => (
+												<tr>
+													<td style={{ width: "30px" }}>
+														<em className="fa-lg far fa-file-code"></em>
+													</td>
+													<td>
+														{this.props.user.role.id === 2024?
+															<a className="text-muted" onClick={this.handleOpenAlert} >
+																{e.judul}
+															</a>
+															:
+															<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+																{e.judul}
+															</a>
+
+														}
+
+													</td>
+												</tr>
+											))}
+										</tbody>
+									</table>
+								</Scrollable>
+							</Col>
+						</FormGroup>
 
 						<FormGroup row>
 							<Col md="4">Dokumen Acara Pleno:</Col>
 							<Col md="8">
 								<div>
-									<ReactToPrint
-										trigger={() => {
-											return <span>
-												<Link
-													href={{
-														pathname: "/app/sanksi/detail",
-														query: { id: this.props.query.id },
-													}}>
-													<Button color className="btn-labeled-4 mt-0">
-														<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
-													</Button>
-												</Link>
-											</span>
-										}}
-										content={() => this.componentRef}
-									/>
+									{this.props.user.role.id === 2024 ?
+										<Button color className="btn-labeled-4 mt-0" onClick={this.handleOpenAlert}>
+											<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+										</Button>
+										:
+										<ReactToPrint
+											trigger={() => {
+												return <span>
+													<Link
+														href={{
+															pathname: "/app/sanksi/detail",
+															query: { id: this.props.query.id },
+														}}>
+														<Button color className="btn-labeled-4 mt-0">
+															<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+														</Button>
+													</Link>
+												</span>
+											}}
+											content={() => this.componentRef}
+										/>
+									}
+
 									<div style={{ display: "none" }}>
 										<ComponentBA ref={el => (this.componentRef = el)} query={this.props.query} />
 									</div>
@@ -133,48 +160,48 @@ class DetailSanksi extends Component {
 							</Col>
 						</FormGroup>
 						<FormGroup row>
-					<Col md={12}>
-						<div className="card b">
-							<div className="card-body bb">
-								<Table responsive>
-									<thead>
-										<tr>
-											<th>Jenis Pelanggaran</th>
-											<th>Sanksi</th>
-										</tr>
-									</thead>
-									<tbody>
-										{sanksi.data.pelanggaran.map((jp, index) => (
-											<tr key={jp._id}>
-												<td width={50}>
-													<div className="media align-items-center">
-														<div className="media-body d-flex">
-															<div>
-																<p>{jp.pelanggaran}</p>
-																<p>TMT : {jp.tmt_bulan} Bulan</p>
-																<p>Jenis Sanksi Administratif : {jp.label_sanksi}</p>
+							<Col md={12}>
+								<div className="card b">
+									<div className="card-body bb">
+										<Table responsive>
+											<thead>
+												<tr>
+													<th>Jenis Pelanggaran</th>
+													<th>Sanksi</th>
+												</tr>
+											</thead>
+											<tbody>
+												{sanksi.data.pelanggaran.map((jp, index) => (
+													<tr key={jp._id}>
+														<td width={50}>
+															<div className="media align-items-center">
+																<div className="media-body d-flex">
+																	<div>
+																		<p>{jp.pelanggaran}</p>
+																		<p>TMT : {jp.tmt_bulan} Bulan</p>
+																		<p>Jenis Sanksi Administratif : {jp.label_sanksi}</p>
+																	</div>
+																</div>
 															</div>
-														</div>
-													</div>
-												</td>
-												<td width={50}>
-													<div className="media align-items-center">
-														<div className="media-body d-flex">
-															<div>
-																<p>{jp.sanksi}</p>
-																<p>Keterangan : {jp.keterangan_sanksi}</p>
+														</td>
+														<td width={50}>
+															<div className="media align-items-center">
+																<div className="media-body d-flex">
+																	<div>
+																		<p>{jp.sanksi}</p>
+																		<p>Keterangan : {jp.keterangan_sanksi}</p>
+																	</div>
+																</div>
 															</div>
-														</div>
-													</div>
-												</td>
-											</tr>
-										))}
-									</tbody>
-								</Table>
-							</div>
-						</div>
-					</Col>
-				</FormGroup>
+														</td>
+													</tr>
+												))}
+											</tbody>
+										</Table>
+									</div>
+								</div>
+							</Col>
+						</FormGroup>
 
 					</form>
 				}
@@ -186,136 +213,6 @@ class DetailSanksi extends Component {
 
 
 }
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(DetailSanksi)
 
-
-
-// function DetailSanksi({ data, noTitle = false, query }) {
-
-// 	return (
-// 		<>
-// 			{noTitle ? "" : <p className="lead bb">Detail Sanksi</p>}
-// <form className="form-horizontal">
-// 	<FormGroup row>
-// 		<Col md="4">Nomor Sanksi:</Col>
-// 		<Col md="8">
-// 			<strong>{data.no_sanksi}</strong>
-// 		</Col>
-// 	</FormGroup>
-// 	<FormGroup row>
-// 		<Col md="4">Nama Perguruan Tinggi:</Col>
-// 		<Col md="8">
-// 			<strong>{data.laporan.pt.nama}</strong>
-// 		</Col>
-// 	</FormGroup>
-// 	<FormGroup row>
-// 		<Col md="4">Keterangan:</Col>
-// 		<Col md="8">
-// 			<Scrollable height="100px" className="list-group">
-// 				<p>{data.keterangan}</p>
-// 			</Scrollable>
-// 		</Col>
-// 	</FormGroup>
-// 	<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>
-// 		</Col>
-// 	</FormGroup>
-// 	{
-// 		data.tanggal_akhir_keberatan &&
-// 		<FormGroup row>
-// 			<Col md="4">Tanggal Akhir Pengajuan Keberatan</Col>
-// 			<Col md="8">
-// 				<strong>{moment(data.tanggal_akhir_keberatan).locale("id").format("D MMMM YYYY")}</strong>
-// 			</Col>
-// 		</FormGroup>
-// 	}
-// 	{
-// 		data.jawaban?.keberatan?.tanggal_akhir_banding &&
-// 		<FormGroup row>
-// 			<Col md="4">Tanggal Akhir Pengajuan Banding:</Col>
-// 			<Col md="8">
-// 				<strong>{moment(data.jawaban?.keberatan?.tanggal_akhir_banding).locale("id").format("D MMMM YYYY")}</strong>
-// 			</Col>
-// 		</FormGroup>
-// 	}
-// 	<FormGroup row>
-// 		<Col md="4">Dokumen Sanksi:</Col>
-// 		<Col md="8">
-// 			<Scrollable height="120px" className="list-group">
-// 				<table className="table table-bordered bg-transparent">
-// 					<tbody>
-// 						{data.dokumen.map((e) => (
-// 							<tr>
-// 								<td style={{ width: "30px" }}>
-// 									<em className="fa-lg far fa-file-code"></em>
-// 								</td>
-// 								<td>
-// 									<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-// 										{e.judul}
-// 									</a>
-// 								</td>
-// 							</tr>
-// 						))}
-// 					</tbody>
-// 				</table>
-// 			</Scrollable>
-// 		</Col>
-// 	</FormGroup>
-// 	<FormGroup row>
-// 		<Col md="4">Dokumen Acara Pleno:</Col>
-// 		<Col md="8">
-// 			<BeritaAcara
-// 				query={query}
-// 			/>
-// 		</Col>
-// 	</FormGroup>
-// 	<FormGroup row>
-// 		<Col md={12}>
-// 			<div className="card b">
-// 				<div className="card-body bb">
-// 					<Table responsive>
-// 						<thead>
-// 							<tr>
-// 								<th>Jenis Pelanggaran</th>
-// 								<th>Sanksi</th>
-// 							</tr>
-// 						</thead>
-// 						<tbody>
-// 							{data.pelanggaran.map((jp, index) => (
-// 								<tr key={jp._id}>
-// 									<td width={50}>
-// 										<div className="media align-items-center">
-// 											<div className="media-body d-flex">
-// 												<div>
-// 													<p>{jp.pelanggaran}</p>
-// 													<p>TMT : {jp.tmt_bulan} Bulan</p>
-// 													<p>Jenis Sanksi Administratif : {jp.label_sanksi}</p>
-// 												</div>
-// 											</div>
-// 										</div>
-// 									</td>
-// 									<td width={50}>
-// 										<div className="media align-items-center">
-// 											<div className="media-body d-flex">
-// 												<div>
-// 													<p>{jp.sanksi}</p>
-// 													<p>Keterangan : {jp.keterangan_sanksi}</p>
-// 												</div>
-// 											</div>
-// 										</div>
-// 									</td>
-// 								</tr>
-// 							))}
-// 						</tbody>
-// 					</Table>
-// 				</div>
-// 			</div>
-// 		</Col>
-// 	</FormGroup>
-// </form>
-// 		</>
-// 	);
-// }
-
-export default DetailSanksi;

+ 9 - 0
components/Sanksi/Ringkasan.js

@@ -27,6 +27,15 @@ export class Ringkasan extends Component {
 		const saveData = getDataSave.data?.penetapanSanksi;
 		this.setState(saveData)
 	}
+		handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 
 	render() {
 		const { dataLaporan, dataPelanggaran, dataUpload } = this.props

+ 1 - 1
components/Sanksi/TablePenetapanSanksi.js

@@ -33,7 +33,7 @@ export class TablePenetapanSanksi extends Component {
 		const pelanggaran = await getPelanggaran(token);
 		const getDataSave = await getAutoSave({ id, laporan: true });
 		const getDataPelanggaranfromAutoSave = getDataSave.data?.PenetapanSanksi?.dataPelanggaran;
-		if (this.state.trigger === false || this.ttate.trigger === true) {
+		if (this.state.trigger === false || this.state.trigger === true) {
 			if (getDataPelanggaranfromAutoSave === "null")
 				this.setState({ checkedData: [] })
 			else{

+ 21 - 63
components/Sanksi/UploadSurat.js

@@ -184,20 +184,20 @@ export class UploadSurat extends Component {
 		return (
 			<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
 				<FormGroup row>
-					<label className="col-md-2 col-form-label">Nomor Surat<span className="text-danger">*</span></label>
-					<div className="col-md-10">
+					<label className="col-md-4 col-form-label">Nomor Surat<span className="text-danger">*</span></label>
+					<div className="col-md-8">
 						<Input type="text" value={this.state.nomorSanksi} onChange={(e) => { this.setNomorSanksi(e) }} />
 					</div>
 				</FormGroup>
 				<FormGroup row className="mt-3">
-					<label className="col-md-2 col-form-label">Keterangan<span className="text-danger">*</span></label>
-					<div className="col-md-10">
+					<label className="col-md-4 col-form-label">Keterangan<span className="text-danger">*</span></label>
+					<div className="col-md-8">
 						<Input type="textarea" value={this.state.keterangan} onChange={(e) => { this.setKeterangan(e) }} required />
 					</div>
 				</FormGroup>
 				<FormGroup row>
-					<label className="col-md-2 col-form-label">Tidak Perlu TMT</label>
-					<div className="col-md-10 mt-2">
+					<label className="col-md-4 col-form-label">Tidak Perlu TMT</label>
+					<div className="col-md-8 mt-2">
 						<div className="checkbox c-checkbox">
 							<label>
 								<Input type="checkbox" onChange={() => this.handleTmtCheck()} defaultChecked={this.state.tidakPerluTMTCheck} />
@@ -205,27 +205,9 @@ export class UploadSurat extends Component {
 						</div>
 					</div>
 				</FormGroup>
-				{/* {this.state.tidakPerluTMTCheck && (
-					<FormGroup row className="mt-3">
-						<label className="col-md-2 col-form-label">Tanggal Penetapan Sanksi</label>
-						<span className="col-sm-3 float-left">
-							<DatePicker
-								selected={this.state.awalTMT ? new Date(this.state.awalTMT) : this.state.awalTMT}
-								onChange={(awalTMT) => {
-									this.setState({ awalTMT }, this.setUploadSuratSanksi)
-								}}
-								dateFormat="dd/MM/yyyy"
-								maxDate={new Date(this.state.startDay)}
-								placeholderText="Isi Tanggal"
-								locale={id}
-								className="form-control bg-white"
-							/>
-						</span>
-					</FormGroup>
-				)} */}
 				{!this.state.tidakPerluTMTCheck && (
 					<FormGroup row className="mt-3">
-						<label className="col-md-2 col-form-label">Isi TMT</label>
+						<label className="col-md-4 col-form-label">Isi TMT</label>
 						<Row >
 							<Col>
 								<FormGroup>
@@ -250,9 +232,6 @@ export class UploadSurat extends Component {
 									<span className="ml-3">
 										<DatePicker
 											selected={this.state.akhirTMT ? new Date(this.state.akhirTMT) : this.state.akhirTMT}
-											// onChange={(akhirTMT, e) => {
-											// 	this.setState({ akhirTMT }, this.setUploadSuratSanksi(e), this.props.handleAutoSave(e))
-											// }}
 											onChange={(akhirTMT) => { this.setAkhirSanksi(akhirTMT) }}
 											dateFormat="dd/MM/yyyy"
 											minDate={new Date(this.state.awalTMT)}
@@ -269,23 +248,23 @@ export class UploadSurat extends Component {
 				)}
 				{!this.state.tidakPerluTMTCheck && (
 					<FormGroup row className="mt-1">
-						<label className="col-md-2 col-form-label">TMT berlaku</label>
-						<div className="col-md-10 mt-2">
+						<label className="col-md-4 col-form-label">TMT berlaku</label>
+						<div className="col-md-8 mt-2">
 							<b>{this.state.awalTMT ? moment(this.state.awalTMT).format("DD-MM-YYYY") : "-"}</b> hingga <b>{this.state.akhirTMT ? moment(this.state.akhirTMT).format("DD-MM-YYYY") : "-"}</b>
 						</div>
 					</FormGroup>
 				)}
 				{!this.state.tidakPerluTMTCheck && (
 					<FormGroup row className="mt-1">
-						<label className="col-md-2 col-form-label">TMT</label>
-						<div className="col-md-10 mt-2">
+						<label className="col-md-4 col-form-label">TMT</label>
+						<div className="col-md-8 mt-2">
 							<b>{this.state.akhirTMT ? moment(this.state.akhirTMT).diff(this.state.awalTMT, 'month') : "-"} bulan</b>
 						</div>
 					</FormGroup>
 				)}
 				<FormGroup row className="mt-3">
-					<label className="col-md-2 col-form-label">List sanksi </label>
-					<div className="col-md-10">
+					<label className="col-md-4 col-form-label">List sanksi </label>
+					<div className="col-md-8">
 						<Select
 							options={this.props.listSanksi.map(e => ({ value: `Sanksi Administratif ${e.split(";")[0]} - ${e.split(";")[1]}` }))}
 							isMulti
@@ -297,10 +276,10 @@ export class UploadSurat extends Component {
 					</div>
 				</FormGroup>
 				<FormGroup row>
-					<label className="col-md-2 col-form-label">
+					<label className="col-md-4 col-form-label">
 						Dokumen Surat Sanksi<span className="text-danger">*</span>
 					</label>
-					<div className="col-md-10">
+					<div className="col-md-8">
 						<DropzoneWrapper className="" onDrop={this.onDrop}>
 							{({ getRootProps, getInputProps, isDragActive }) => {
 								return (
@@ -336,29 +315,8 @@ export class UploadSurat extends Component {
 						<p className="mrgn-top-5 font-color-black">Ukuran setiap dokumen maksimal 15mb</p>
 					</div>
 				</FormGroup>
-				{/* <FormGroup row>
-					<label className="col-md-2 col-form-label">
-						Dokumen Laporan Evaluasi dan Pembahasan
-					</label>
-					<div className="col-md-10">
-
-						<div style={{ display: "none" }}>
-							<ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} dataPelanggaran={this.props.dataPelanggaran} dataSuratBA={this.props.dataSuratBA} />
-						</div>
-						<ReactToPrint
-							trigger={() => {
-								return <span>
-									<Button color className="btn-labeled-4 mt-0">
-										<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
-									</Button>
-								</span>
-							}}
-							content={() => this.componentRef}
-						/>
-					</div>
-				</FormGroup> */}
 				<FormGroup row className="mt-3">
-					<label className="col-md-2 col-form-label">Tanggal Terima Surat Sanksi<span className="text-danger">*</span></label>
+					<label className="col-md-4 col-form-label">Tanggal Terima Surat Sanksi<span className="text-danger">*</span></label>
 					<span className="col-sm-3 float-left">
 						<DatePicker
 							selected={this.state.terimaSuratSanksi ? new Date(this.state.terimaSuratSanksi) : this.state.terimaSuratSanksi}
@@ -374,10 +332,10 @@ export class UploadSurat extends Component {
 					</span>
 				</FormGroup>
 				<FormGroup row>
-					<label className="col-md-2 col-form-label">
+					<label className="col-md-4 col-form-label">
 						Dokumen Tanda Terima Surat Sanksi<span className="text-danger">*</span>
 					</label>
-					<div className="col-md-10">
+					<div className="col-md-8">
 						<DropzoneWrapper className="" onDrop={this.onDropTandaTerimaSS}>
 							{({ getRootProps, getInputProps, isDragActive }) => {
 								return (
@@ -415,12 +373,12 @@ export class UploadSurat extends Component {
 				</FormGroup>
 				{!this.state.tidakPerluTMTCheck && (
 					<FormGroup row className="mt-3">
-						<label className="col-md-2 col-form-label">Tanggal Akhir Pengajuan Keberatan<span className="text-danger">*</span>
+						<label className="col-md-4 col-form-label">Tanggal Akhir Pengajuan Keberatan<span className="text-danger">*</span>
 							<p>
 								Note : 21 hari kerja
 							</p>
 						</label>
-						<span className="col-sm-3 float-left">
+						<span className="col-sm-8 float-left">
 							<DatePicker
 								selected={this.state.tglAkhirKeberatan ? new Date(this.state.tglAkhirKeberatan) : this.state.tglAkhirKeberatan}
 								onChange={(tglAkhirKeberatan) => {
@@ -428,7 +386,7 @@ export class UploadSurat extends Component {
 								}}
 								dateFormat="dd/MM/yyyy"
 								minDate={new Date(terimaSuratSanksi)}
-								placeholderText="Isi Tanggal"
+								placeholderText="DD/MM/YYYY "
 								locale={id}
 								className="form-control bg-white"
 							/>

+ 22 - 6
components/TurunSanksi/DetailSanksi.js

@@ -4,8 +4,18 @@ import 'moment/min/locales';
 moment.locale('id');
 import { CardBody, Col, FormGroup, Table, Card } from "reactstrap";
 import { API_URL } from "@/env";
+import Swal from "sweetalert2";
 
-function DetailSanksi({ data, noTitle = false }) {
+function DetailSanksi({ data, noTitle = false, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		<Card className="card-default">
 			<CardBody>
@@ -97,7 +107,7 @@ function DetailSanksi({ data, noTitle = false }) {
 					<FormGroup row>
 						<Col md="4">Sanksi:</Col>
 						<Col md="8">
-						{data?.pelanggaran&& data.pelanggaran.map((e)=><li><strong>{e.sanksi}</strong> - {e.keterangan_sanksi}</li>)}
+							{data?.pelanggaran && data.pelanggaran.map((e) => <li><strong>{e.sanksi}</strong> - {e.keterangan_sanksi}</li>)}
 						</Col>
 					</FormGroup>
 					<FormGroup row>
@@ -108,13 +118,19 @@ function DetailSanksi({ data, noTitle = false }) {
 									<tbody>
 										{data.dokumen.map((e) => (
 											<tr>
-												<td  style={{ width: "30px" }}>
+												<td style={{ width: "30px" }}>
 													<em className="fa-lg far fa-file-code"></em>
 												</td>
 												<td>
-													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-														{e.judul}
-													</a>
+													{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
 												</td>
 											</tr>
 										))}

+ 30 - 20
components/TurunSanksi/InputTanggal.js

@@ -16,6 +16,7 @@ import Router from "next/router";
 import { getPelanggaranSanksi } from "@/actions/pelanggaran";
 import Select from "react-select";
 import { getCsrf } from "../../actions/security";
+import Swal from "sweetalert2";
 
 const selectInstanceId = 1;
 const checkIfFilesAreTooBig = (files) => {
@@ -158,27 +159,36 @@ class InputTanggal extends Component {
 
 
     handelSimpan = async (data) => {
-        const getToken = await getCsrf();
-        const _csrf = getToken.token;
-        const { token, query } = this.props;
-        const { id } = query;
-        const formdata = new FormData();
-        formdata.append("no_sanksi", data.no_sanksi);
-        formdata.append("keterangan", data.keterangan);
-        formdata.append("from_date", data.from_date);
-        formdata.append("to_date", data.to_date);
-        formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value.split(";")[0], description: e.value.split(";")[1], level: e.value.split(";")[2] }))));
-        this.state.files.forEach((e) => {
-            formdata.append("dokumen", e);
-        });
-        const toastid = toast.loading("Please wait...");
-        const added = await update(token, id, formdata, _csrf);
-        if (!added) {
-            toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
+        if (this.props.user.role.id === 2024) {
+            Swal.fire({
+                icon: 'error',
+                title: 'Oops...',
+                html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+                confirmButtonColor: "#3e3a8e",
+                confirmButtonText: 'Oke'
+            })
         } else {
-            toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
-            Router.push("/app/turun-sanksi");
-
+            const getToken = await getCsrf();
+            const _csrf = getToken.token;
+            const { token, query } = this.props;
+            const { id } = query;
+            const formdata = new FormData();
+            formdata.append("no_sanksi", data.no_sanksi);
+            formdata.append("keterangan", data.keterangan);
+            formdata.append("from_date", data.from_date);
+            formdata.append("to_date", data.to_date);
+            formdata.append("sanksi", JSON.stringify(data.sanksi.map((e) => ({ label: e.value.split(";")[0], description: e.value.split(";")[1], level: e.value.split(";")[2] }))));
+            this.state.files.forEach((e) => {
+                formdata.append("dokumen", e);
+            });
+            const toastid = toast.loading("Please wait...");
+            const added = await update(token, id, formdata, _csrf);
+            if (!added) {
+                toast.update(toastid, { render: "All is not good", type: "error", isLoading: false, autoClose: true, closeButton: true });
+            } else {
+                toast.update(toastid, { render: "All is good", type: "success", isLoading: false, autoClose: true, closeButton: true });
+                Router.push("/app/turun-sanksi");
+            }
         }
 
     };

+ 11 - 20
components/TurunSanksi/TableLaporan.js

@@ -65,29 +65,20 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
 													</div>
 												</div>
 											</td>
-
-											<td>
-												<div className="table-desc">
-													<div className="media align-items-center">
-														<div className="media-body d-flex">
-															<div>
-																<h4 className="m-0">{data.laporan.pt.nama.length > 64 ? data.laporan.pt.nama.substring(0, 64) + "..." : data.laporan.pt.nama}</h4>
-																<p className="w-105">{data.laporan.keterangan}</p>
-															</div>
-														</div>
-													</div>
+											<td className=" col-md-6">
+												<div>
+													<h4 className="m-0">{data.laporan.pt.nama.length > 64 ? data.laporan.pt.nama.substring(0, 64) + "..." : data.laporan.pt.nama}</h4>
+													<p className="w-105">{data.laporan.keterangan.length > 100 ? data.laporan.keterangan.substring(0, 100) + "..." : data.laporan.keterangan}</p>
 												</div>
 											</td>
 
-
-											{/* <td>
-												{data.sanksi.length ? data.sanksi.map((e) => (<h4 className="w-105">Sanksi Administratif {e.label}</h4>)) : data.pelanggaran.map((e) => (<h4 className="w-105">Sanksi Administratif:  {e.label_sanksi}</h4>))}
-												<p className="w-105">{data.sanksi.keterangan}</p>
-											</td> */}
-											<td>
-												<h4 className="w-105">
-													Sanksi Administratif : {getLabelSanksi(data.sanksi, "level") === 3 ? "Berat" : getLabelSanksi(data.sanksi, "level") === 2 ? "Sedang" : "Ringan"}
-												</h4>
+											<td className=" col-md-5">
+												<div>
+													<h4>
+														Sanksi Administratif : {getLabelSanksi(data.sanksi, "level") === 3 ? "Berat" : getLabelSanksi(data.sanksi, "level") === 2 ? "Sedang" : "Ringan"}
+													</h4>
+													<p className="w-105">{data.keterangan}</p>
+												</div>
 											</td>
 											{!noBy && <td>{data.user.isPrivate ? "" : data.user.nama}</td>}
 											<td>

+ 20 - 4
components/TurunSanksi/TableRiwayat.js

@@ -1,9 +1,19 @@
 import Datatable from "@/components/Tables/Datatable";
 import moment from "moment";
 import 'moment/min/locales';
+import Swal from "sweetalert2";
 moment.locale('id');
 
-function TableRiwayat({ data, perbaikan }) {
+function TableRiwayat({ data, perbaikan , role}) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
 	return (
 		// <Datatable options={{ responsive: true }}>
 		<div className="card-over">
@@ -40,9 +50,15 @@ function TableRiwayat({ data, perbaikan }) {
 										{value.dokumen.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
-												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
-													{e.judul}
-												</a>
+												{role === 2024 ?
+														<a className="text-muted" onClick={handleOpenAlert}>
+															{e.judul}
+														</a>
+														:
+														<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+															{e.judul}
+														</a>
+													}
 											</>
 										))}
 									</td>

+ 42 - 30
pages/app/banding/detail.js

@@ -24,6 +24,7 @@ import id from 'date-fns/locale/id';
 import moment from "moment";
 import Datetime from "react-datetime";
 import { getCsrf } from "../../../actions/security";
+import swal from "sweetalert2";
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -172,35 +173,46 @@ class JawabanBanding extends Component {
 
 
 	handelSimpan = async () => {
-		const getTokenCsrf = await getCsrf();
-		const _csrf = getTokenCsrf.token;
-		if (this.state.modal === true) {
-			this.toggleModal();
-		}
-		const { data } = this.state;
-		const { query, token } = this.props;
-		const { id } = query;
-		const formdata = new FormData();
-		formdata.append("status", data.status);
-		formdata.append("keterangan", data.keterangan);
-		formdata.append("no_banding", data.no_banding);
-		formdata.append("tanggal_terima_banding", data.tanggal_terima_banding);
-		formdata.append("tanggal_surat_banding", data.tanggal_surat_banding);
-		data.dokumen.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		data.dokumen_terima_banding.forEach((e) => {
-			formdata.append("dokumen_terima_banding", e);
-		});
-		const toastid = toast.loading("Please wait...");
-		const added = await addJawabanBanding(token, id, formdata, _csrf);
-		if (!added) {
-			toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+		if (this.props.user.role.id === 2024) {
+			swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
 		} else {
-			toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			Router.push({
-				pathname: "/app/banding",
+			const getTokenCsrf = await getCsrf();
+			const _csrf = getTokenCsrf.token;
+			if (this.state.modal === true) {
+				this.toggleModal();
+			}
+			const { data } = this.state;
+			const { query, token } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			formdata.append("status", data.status);
+			formdata.append("keterangan", data.keterangan);
+			formdata.append("no_banding", data.no_banding);
+			formdata.append("tanggal_terima_banding", data.tanggal_terima_banding);
+			formdata.append("tanggal_surat_banding", data.tanggal_surat_banding);
+			data.dokumen.forEach((e) => {
+				formdata.append("dokumen", e);
 			});
+			data.dokumen_terima_banding.forEach((e) => {
+				formdata.append("dokumen_terima_banding", e);
+			});
+			const toastid = toast.loading("Please wait...");
+			const added = await addJawabanBanding(token, id, formdata, _csrf);
+			if (!added) {
+				toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+			} else {
+				toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
+				Router.push({
+					pathname: "/app/banding",
+				});
+			}
 		}
 	};
 
@@ -249,8 +261,8 @@ class JawabanBanding extends Component {
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data} />
-												<PermohonanPT data={sanksi.data.pengajuan.banding} title="Permohonan Banding" />
+												<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
+												<PermohonanPT data={sanksi.data.pengajuan.banding} title="Permohonan Banding" role={this.props.user.role.id} />
 												<p className="lead bb">Jawaban</p>
 												<Formik
 													initialValues={{
@@ -478,7 +490,7 @@ class JawabanBanding extends Component {
 					{sanksi.data && (
 						<Row>
 							<Col>
-								<Riwayat data={sanksi.data.jawaban.banding} />
+								<Riwayat data={sanksi.data.jawaban.banding} role={this.props.user.role.id} />
 							</Col>
 						</Row>
 					)}

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

@@ -57,7 +57,7 @@ class Detail extends Component {
 							<CardBody>
 								<Row>
 									<Col>
-										<DetailSanksi data={sanksi.data} />
+										<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 									</Col>
 								</Row>
 							</CardBody>

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

@@ -28,7 +28,7 @@ class Bypass extends Component {
                         Bypass
                     </span></div>
                 <Row>
-                    <Col lg={12}>{sanksi.data?.length ? <TableBypass listData={sanksi.data} linkName="Detail" to="/app/bypass/detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
+                    <Col lg={12}>{sanksi.data?.length ? <TableBypass listData={sanksi.data} role={this.props.user.role.id} linkName="Detail" to="/app/bypass/detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
                 </Row>
             </ContentWrapper>
         );

+ 43 - 31
pages/app/keberatan/detail.js

@@ -24,6 +24,7 @@ import id from 'date-fns/locale/id';
 import moment from "moment";
 import Datetime from "react-datetime";
 import { getCsrf } from "../../../actions/security";
+import swal from "sweetalert2";
 
 
 let Dropzone = null;
@@ -181,36 +182,47 @@ class DetailKeberatan extends Component {
 	};
 
 	handelSimpan = async () => {
-		const getTokenCsrf = await getCsrf();
-		const _csrf = getTokenCsrf.token;
-		if (this.state.modal === true) {
-			this.toggleModal();
-		}
-		const { data } = this.state;
-		const { query, token } = this.props;
-		const { id } = query;
-		const formdata = new FormData();
-		formdata.append("keterangan", data.keterangan);
-		formdata.append("status", data.status);
-		formdata.append("no_keberatan", data.no_keberatan);
-		formdata.append("tanggal_terima_keberatan", data.tanggal_terima_keberatan);
-		formdata.append("tanggal_akhir_banding", data.tanggal_akhir_banding);
-		formdata.append("tanggal_surat_keberatan", data.tanggal_surat_keberatan);
-		data.dokumen.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		data.dokumen_terima_keberatan.forEach((e) => {
-			formdata.append("dokumen_terima_keberatan", e);
-		});
-		const toastid = toast.loading("Please wait...");
-		const added = await addJawabanKeberatan(token, id, formdata, _csrf);
-		if (!added) {
-			toast.update(toastid, { render: "Gagal Menjawab Keberatan", type: "error", isLoading: false, autoClose: true, closeButton: true });
+		if (this.props.user.role.id === 2024) {
+			swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
 		} else {
-			toast.update(toastid, { render: "Berhasil Menjawab Keberatan", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			Router.push({
-				pathname: "/app/keberatan",
+			const getTokenCsrf = await getCsrf();
+			const _csrf = getTokenCsrf.token;
+			if (this.state.modal === true) {
+				this.toggleModal();
+			}
+			const { data } = this.state;
+			const { query, token } = this.props;
+			const { id } = query;
+			const formdata = new FormData();
+			formdata.append("keterangan", data.keterangan);
+			formdata.append("status", data.status);
+			formdata.append("no_keberatan", data.no_keberatan);
+			formdata.append("tanggal_terima_keberatan", data.tanggal_terima_keberatan);
+			formdata.append("tanggal_akhir_banding", data.tanggal_akhir_banding);
+			formdata.append("tanggal_surat_keberatan", data.tanggal_surat_keberatan);
+			data.dokumen.forEach((e) => {
+				formdata.append("dokumen", e);
 			});
+			data.dokumen_terima_keberatan.forEach((e) => {
+				formdata.append("dokumen_terima_keberatan", e);
+			});
+			const toastid = toast.loading("Please wait...");
+			const added = await addJawabanKeberatan(token, id, formdata, _csrf);
+			if (!added) {
+				toast.update(toastid, { render: "Gagal Menjawab Keberatan", type: "error", isLoading: false, autoClose: true, closeButton: true });
+			} else {
+				toast.update(toastid, { render: "Berhasil Menjawab Keberatan", type: "success", isLoading: false, autoClose: true, closeButton: true });
+				Router.push({
+					pathname: "/app/keberatan",
+				});
+			}
 		}
 	};
 	setTglTerimaKeberatan = (tglTerimaKeberatan) => {
@@ -255,12 +267,12 @@ class DetailKeberatan extends Component {
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data} />
+												<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 											</Col>
 										</Row>
 										<Row>
 											<Col lg={12}>
-												<PermohonanPT data={sanksi.data.pengajuan.keberatan} title="Permohonan Keberatan" />
+												<PermohonanPT data={sanksi.data.pengajuan.keberatan} title="Permohonan Keberatan" role={this.props.user.role.id} />
 											</Col>
 										</Row>
 										<Row>
@@ -518,7 +530,7 @@ class DetailKeberatan extends Component {
 					{sanksi.data && (
 						<Row>
 							<Col>
-								<Riwayat data={sanksi.data.jawaban?.keberatan ? sanksi.data.jawaban.keberatan : null} />
+								<Riwayat data={sanksi.data.jawaban?.keberatan ? sanksi.data.jawaban.keberatan : null} role={this.props.user.role.id} />
 							</Col>
 						</Row>
 					)}

+ 2 - 2
pages/app/naik-sanksi/detail.js

@@ -65,14 +65,14 @@ class Detail extends Component {
 						<Row>
 
 							<Col xl="9">
-								<DetailSanksi data={sanksi.data} />
+								<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 								<InputTanggal query={query} token={token} data={sanksi.data} listSanksi={this.state.listSanksi} />
 								<Card className="card-default">
 									<CardHeader>
 										<CardTitle>Riwayat</CardTitle>
 									</CardHeader>
 									<CardBody>
-										<TableRiwayat data={sanksi.data.riwayat_sanksi} perbaikan={sanksi.data.perbaikan} />
+										<TableRiwayat data={sanksi.data.riwayat_sanksi} perbaikan={sanksi.data.perbaikan} role={this.props.user.role.id}  />
 									</CardBody>
 								</Card>
 							</Col>

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

@@ -54,7 +54,7 @@ class DetailPelaporan extends Component {
 								<Card className="card-default">
 									<CardBody>
 										<Row>
-											<Col lg={12}>{<DetailLaporan data={pelaporan.data} />}</Col>
+											<Col lg={12}>{<DetailLaporan data={pelaporan.data} role={this.props.user.role.id} />}</Col>
 										</Row>
 									</CardBody>
 								</Card>

+ 47 - 24
pages/app/pelaporan/index.js

@@ -12,6 +12,7 @@ import Router from "next/router";
 import { createLog } from "@/actions/log";
 import swal from "sweetalert2";
 import { getCsrf } from "../../../actions/security";
+import Swal from "sweetalert2";
 
 class Pelaporan extends Component {
 	constructor(props) {
@@ -63,37 +64,59 @@ class Pelaporan extends Component {
 		if (prevState.graph !== this.state.graph) return true;
 	};
 	excelMenu = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pelaporan: true,
-		});
-		if (this.state.graph.data.jumlah_laporan.dikti && this.state.graph.data.jumlah_laporan.ditutup && this.state.graph.data.jumlah_laporan.lldikti) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pelaporan: true,
 			});
+			if (this.state.graph.data.jumlah_laporan.dikti && this.state.graph.data.jumlah_laporan.ditutup && this.state.graph.data.jumlah_laporan.lldikti) {
+				Router.push(url);
+			} else {
+				swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 	excelSemua = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pelaporan: true,
-			penjadwalan: true,
-			pemeriksaan: true,
-			sanksi: true,
-
-		});
-		if (this.state.graph.data.jumlah_laporan.dikti && this.state.graph.data.jumlah_laporan.ditutup && this.state.graph.data.jumlah_laporan.lldikti) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pelaporan: true,
+				penjadwalan: true,
+				pemeriksaan: true,
+				sanksi: true,
+
 			});
+			if (this.state.graph.data.jumlah_laporan.dikti && this.state.graph.data.jumlah_laporan.ditutup && this.state.graph.data.jumlah_laporan.lldikti) {
+				Router.push(url);
+			} else {
+				swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 	render() {

+ 44 - 22
pages/app/pemeriksaan/index.js

@@ -48,38 +48,60 @@ class Pemeriksaan extends Component {
 
 
 	excelMenu = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pemeriksaan: true,
-		});
-		if (this.state.graph.data.evaluasi.hasEvaluasi) {
-			Router.push(url);
-		} else {
+		if (this.props.user.role.id === 2024) {
 			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pemeriksaan: true,
 			});
+			if (this.state.graph.data.evaluasi.hasEvaluasi) {
+				Router.push(url);
+			} else {
+				swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 
 	excelSemua = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pelaporan: true,
-			penjadwalan: true,
-			pemeriksaan: true,
-			sanksi: true,
-
-		});
-		if (this.state.graph.data.evaluasi.hasEvaluasi) {
-			Router.push(url);
-		} else {
+		if (this.props.user.role.id === 2024) {
 			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pelaporan: true,
+				penjadwalan: true,
+				pemeriksaan: true,
+				sanksi: true,
+
 			});
+			if (this.state.graph.data.evaluasi.hasEvaluasi) {
+				Router.push(url);
+			} else {
+				swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 	excel = () => {

+ 2 - 2
pages/app/pemeriksaan/new.js

@@ -62,7 +62,7 @@ class PemeriksaanNew extends Component {
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailLaporan data={pelaporan.data} />
+												<DetailLaporan data={pelaporan.data} role={this.props.user.role.id} />
 												<InputEvaluasi query={query} token={token} changePelaporan={this.changePelaporan} data={pelaporan.data} />
 											</Col>
 										</Row>
@@ -82,7 +82,7 @@ class PemeriksaanNew extends Component {
 										<CardTitle>Riwayat Evaluasi</CardTitle>
 									</CardHeader>
 									<CardBody>
-										<TableRiwayat data={pelaporan.data} />
+										<TableRiwayat data={pelaporan.data} role={this.props.user.role.id} />
 									</CardBody>
 								</Card>
 							</Col>

+ 32 - 20
pages/app/pencabutan-sanksi/detail.js

@@ -18,6 +18,7 @@ import { connect } from "react-redux";
 import { Formik, Form, Field, ErrorMessage } from "formik";
 import * as Yup from "yup";
 import { getCsrf } from "../../../actions/security";
+import Swal from "sweetalert2";
 
 const checkIfFilesAreTooBig = (files) => {
 	let valid = true;
@@ -136,25 +137,36 @@ class JawabanPencabutanSanksi extends Component {
 	};
 
 	handleSimpan = async () => {
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		const { data } = this.state;
-		const { token, query } = this.props;
-		const formdata = new FormData();
-		formdata.append("status", data.status);
-		formdata.append("keterangan", data.keterangan);
-		this.state.files.forEach((e) => {
-			formdata.append("dokumen", e);
-		});
-		const toastid = toast.loading("Please wait...");
-		const added = await addJawabanCabutSanksi(token, query.id, formdata, _csrf);
-		if (!added) {
-			toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
 		} else {
-			toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			Router.push({
-				pathname: "/app/pencabutan-sanksi",
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { data } = this.state;
+			const { token, query } = this.props;
+			const formdata = new FormData();
+			formdata.append("status", data.status);
+			formdata.append("keterangan", data.keterangan);
+			this.state.files.forEach((e) => {
+				formdata.append("dokumen", e);
 			});
+			const toastid = toast.loading("Please wait...");
+			const added = await addJawabanCabutSanksi(token, query.id, formdata, _csrf);
+			if (!added) {
+				toast.update(toastid, { render: "Error", type: "error", isLoading: false, autoClose: true, closeButton: true });
+			} else {
+				toast.update(toastid, { render: "Success", type: "success", isLoading: false, autoClose: true, closeButton: true });
+				Router.push({
+					pathname: "/app/pencabutan-sanksi",
+				});
+			}
 		}
 	};
 
@@ -193,9 +205,9 @@ class JawabanPencabutanSanksi extends Component {
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data} />
+												<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 												{sanksi.data?.pengajuan?.cabut_sanksi &&
-													< PermohonanPT data={sanksi.data?.pengajuan?.cabut_sanksi} />
+													< PermohonanPT data={sanksi.data?.pengajuan?.cabut_sanksi} role={this.props.user.role.id} />
 												}
 
 												<p className="lead bb">Jawaban</p>
@@ -379,7 +391,7 @@ class JawabanPencabutanSanksi extends Component {
 					{sanksi.data && (
 						<Row>
 							<Col>
-								<Riwayat data={sanksi.data.jawaban?.cabut_sanksi} />
+								<Riwayat data={sanksi.data.jawaban?.cabut_sanksi} role={this.props.user.role.id} />
 							</Col>
 						</Row>
 					)}

+ 47 - 25
pages/app/penjadwalan/index.js

@@ -10,7 +10,7 @@ import Loader from "@/components/Common/Loader";
 import Link from "next/link";
 import Button from "reactstrap/lib/Button";
 import Router from "next/router";
-import swal from "sweetalert2";
+import Swal from "sweetalert2";
 
 
 class Penjadwalan extends Component {
@@ -46,37 +46,59 @@ class Penjadwalan extends Component {
 		if (prevState.graph !== this.state.graph) return true;
 	};
 	excelMenu = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			penjadwalan: true,
-		});
-		if (this.state.graph.data.jadwal.hasJadwal && this.state.graph.data.jadwal.notHasJadwal) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				penjadwalan: true,
 			});
+			if (this.state.graph.data.jadwal.hasJadwal && this.state.graph.data.jadwal.notHasJadwal) {
+				Router.push(url);
+			} else {
+				Swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 	excelSemua = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pelaporan: true,
-			penjadwalan: true,
-			pemeriksaan: true,
-			sanksi: true,
-
-		});
-		if (this.state.graph.data.jadwal.hasJadwal && this.state.graph.data.jadwal.notHasJadwal) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pelaporan: true,
+				penjadwalan: true,
+				pemeriksaan: true,
+				sanksi: true,
+
 			});
+			if (this.state.graph.data.jadwal.hasJadwal && this.state.graph.data.jadwal.notHasJadwal) {
+				Router.push(url);
+			} else {
+				Swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 

+ 2 - 2
pages/app/perbaikan/detail.js

@@ -56,7 +56,7 @@ class PemantauanDokumen extends Component {
 									<CardBody>
 										<Row>
 											<Col lg={12}>
-												<DetailSanksi data={sanksi.data} />
+												<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 											</Col>
 										</Row>
 									</CardBody>
@@ -68,7 +68,7 @@ class PemantauanDokumen extends Component {
 						<Col xl="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>
 					</Row>
 					<Row>
-						<Col>{sanksi.data && <Riwayat data={sanksi.data.perbaikan} />}</Col>
+						<Col>{sanksi.data && <Riwayat data={sanksi.data.perbaikan} role={this.props.user.role.id} />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>

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

@@ -60,7 +60,7 @@ class Detail extends Component {
 						<Row>
 
 							<Col xl="9">
-								<DetailSanksi data={sanksi.data} />
+								<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 								<InputTanggal query={query} token={token} data={sanksi.data} />
 							</Col>
 							<Col lg="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>

+ 2 - 2
pages/app/rekomendasi-delegasi/detail.js

@@ -62,13 +62,13 @@ class Detail extends Component {
 						<Row>
 
 							<Col xl="9">
-								<DetailSanksi data={sanksi.data} />
+								<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 								<Card className="card-default">
 									<CardHeader>
 										<CardTitle>Riwayat</CardTitle>
 									</CardHeader>
 									<CardBody>
-										<TableRiwayat data={sanksi.data} perbaikan={sanksi.data.perbaikan} />
+										<TableRiwayat data={sanksi.data} perbaikan={sanksi.data.perbaikan} role={this.props.user.role.id} />
 									</CardBody>
 								</Card>
 								<InputRekomendasi query={query} token={token} data={sanksi.data} />

+ 62 - 0
pages/app/riwayat/all_Laporan.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 Penjadwalan 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,);
+        this.setState({ laporanPembina, });
+        console.log(this.state.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.laporan} to="/app/pelaporan/detail" linkName="Detail" />}
+
+
+                    </Col>
+                </Row>
+            </ContentWrapper>
+        );
+    }
+}
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Penjadwalan);

+ 0 - 1
pages/app/riwayat/banding.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 0 - 1
pages/app/riwayat/cabutSanksi.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

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

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 2 - 3
pages/app/riwayat/index.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import ChartRadarB from "../../../components/Riwayat/ChartRadarB";
@@ -61,11 +60,11 @@ class Riwayat extends Component {
             <ChartRadarB />
           </Col>
           <Col lg="12">
-            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/riwayat/detail" jadwal="/app/riwayat/penjadwalan" pemeriksaan="/app/riwayat/pemeriksaan" sanksi="/app/riwayat/sanksi" keberatan="/app/riwayat/keberatan" banding="/app/riwayat/banding" perbaikan="/app/riwayat/perbaikan" cabutSanksi="/app/riwayat/cabutSanksi" linkName="Lihat" /> : <Loader />}
+            {jumlahStatusLaporan?.data ? <TableRadar listData={jumlahStatusLaporan.data} to="/app/riwayat/detail" jadwal="/app/riwayat/penjadwalan" all_Laporan="/app/riwayat/all_Laporan" pemeriksaan="/app/riwayat/pemeriksaan" sanksi="/app/riwayat/sanksi" keberatan="/app/riwayat/keberatan" banding="/app/riwayat/banding" perbaikan="/app/riwayat/perbaikan" cabutSanksi="/app/riwayat/cabutSanksi" linkName="Lihat" /> : <Loader />}
           </Col>
           <ChartData />
           <Col lg="12">
-            <TableRiwayatt />
+            <TableRiwayat />
           </Col>
         </Row>
       </ContentWrapper>

+ 0 - 1
pages/app/riwayat/keberatan.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 0 - 1
pages/app/riwayat/pemeriksaan.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 0 - 1
pages/app/riwayat/penjadwalan.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 0 - 1
pages/app/riwayat/perbaikan.js

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

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

@@ -9,7 +9,6 @@ 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 TableRiwayatt from "../../../components/Riwayat/TableRiwayatt";
 import TableRadar from "../../../components/Riwayat/TableRadar";
 import { getjumlahStatusLaporan } from "../../../actions/graph";
 import { getOneLaporan, getPelaporan, getlaporanByPembina } from "../../../actions/pelaporan";

+ 47 - 25
pages/app/sanksi/index.js

@@ -10,7 +10,7 @@ import Loader from "@/components/Common/Loader";
 import Link from "next/link";
 import Button from "reactstrap/lib/Button";
 import Router from "next/router";
-import swal from "sweetalert2";
+import Swal from "sweetalert2";
 
 
 class Sanksi extends Component {
@@ -46,37 +46,59 @@ class Sanksi extends Component {
 		if (prevState.graph !== this.state.graph) return true;
 	};
 	excelMenu = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			sanksi: true,
-		});
-		if (this.state.graph.data.sanksi.hasSanksi && this.state.graph.data.sanksi.notHasSanksi) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				sanksi: true,
 			});
+			if (this.state.graph.data.sanksi.hasSanksi && this.state.graph.data.sanksi.notHasSanksi) {
+				Router.push(url);
+			} else {
+				Swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 	excelSemua = () => {
-		const url = getExcel(this.props.token, "Laporan", {
-			tahun: this.state.tahun,
-			pelaporan: true,
-			penjadwalan: true,
-			pemeriksaan: true,
-			sanksi: true,
-
-		});
-		if (this.state.graph.data.sanksi.hasSanksi && this.state.graph.data.sanksi.notHasSanksi) {
-			Router.push(url);
-		} else {
-			swal.fire({
-				title: "Data Kosong",
-				icon: "error",
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
 				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			const url = getExcel(this.props.token, "Laporan", {
+				tahun: this.state.tahun,
+				pelaporan: true,
+				penjadwalan: true,
+				pemeriksaan: true,
+				sanksi: true,
+
 			});
+			if (this.state.graph.data.sanksi.hasSanksi && this.state.graph.data.sanksi.notHasSanksi) {
+				Router.push(url);
+			} else {
+				Swal.fire({
+					title: "Data Kosong",
+					icon: "error",
+					confirmButtonColor: "#3e3a8e",
+				});
+			}
 		}
 	};
 

+ 111 - 66
pages/app/sanksi/proses.js

@@ -24,6 +24,7 @@ import ComponentToPrint from "../../../components/Sanksi/SuratBA_A";
 import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
 import { updatePddikti } from "../../../actions/sanksi";
 import { ENV } from "../../../env";
+import Swal from "sweetalert2";
 
 
 
@@ -65,25 +66,40 @@ class ProsesSanksi extends Component {
 
 
 	handleAutoSave = async (data, activeStep) => {
+		if (this.props.user.role.id === 2024) {
+			""
+		} else {
+			const { query, token } = this.props;
+			const { id } = query;
+			const { dataSuratBA, dataUpload } = this.state
+			await inputAutoSave({ data: { PenetapanSanksi: { dataSuratBA, dataUpload, dataPelanggaran: data, activeStep } }, token, id, laporan: true })
+		}
 
-		const { query, token } = this.props;
-		const { id } = query;
-		const { dataSuratBA, dataUpload } = this.state
-		await inputAutoSave({ data: { PenetapanSanksi: { dataSuratBA, dataUpload, dataPelanggaran: data, activeStep } }, token, id, laporan: true })
 	}
 
 	done = async () => {
-		this.setState({
-			loading: true
-		})
-		const sanksi = await this.tambahSanksi()
-		if (sanksi && ENV === "production") {
-			await this.updatePddikti(sanksi.data._id)  //kirim sanksiID ke function updatePDDIKTI
-		}
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
+		} else {
+			this.setState({
+				loading: true
+			})
+			const sanksi = await this.tambahSanksi()
+			if (sanksi && ENV === "production") {
+				await this.updatePddikti(sanksi.data._id)  //kirim sanksiID ke function updatePDDIKTI
+			}
 
-		await Router.push({
-			pathname: "/app/sanksi",
-		});
+			await Router.push({
+				pathname: "/app/sanksi",
+			});
+		}
 	};
 
 	updatePddikti = async (sanksiId) => {
@@ -129,13 +145,13 @@ class ProsesSanksi extends Component {
 						formdata.append("dokumen_terima_sanksi", e);
 					});
 				}
-	
+
 				const sanksi = await createSanksi(token, id, formdata, _csrf)
-	
+
 				toast.update(toastid, { render: "Berhasil membuat sanksi", type: "success", isLoading: false, autoClose: true, closeButton: true });
 				return sanksi
 			}
-	
+
 			catch (error) {
 				toast.update(toastid, { render: error.response.data.message || error.message, type: "error", isLoading: false, autoClose: true, closeButton: true });
 				return null
@@ -147,7 +163,7 @@ class ProsesSanksi extends Component {
 				const formdata = new FormData();
 				formdata.append("no_sanksi", this.state.dataUpload.nomorSanksi);
 				formdata.append("keterangan", this.state.dataUpload.keterangan);
-	
+
 				formdata.append("from_date", this.state.dataUpload.awalTMT);
 				formdata.append("to_date", this.state.dataUpload.akhirTMT);
 				formdata.append("tanggal_terima_sanksi", this.state.dataUpload.terimaSuratSanksi);
@@ -163,41 +179,50 @@ class ProsesSanksi extends Component {
 						formdata.append("dokumen_terima_sanksi", e);
 					});
 				}
-	
+
 				const sanksi = await createSanksi(token, id, formdata, _csrf)
-	
+
 				toast.update(toastid, { render: "Berhasil membuat sanksi", type: "success", isLoading: false, autoClose: true, closeButton: true });
 				return sanksi
 			}
-	
+
 			catch (error) {
 				toast.update(toastid, { render: error.response.data.message || error.message, type: "error", isLoading: false, autoClose: true, closeButton: true });
 				return null
 			}
 		}
-		
-
-	}
 
 
+	}
 
 	handleDelegasi = async (data) => {
-
-		const getToken = await getCsrf();
-		const _csrf = getToken.token;
-		const { token, query } = this.props;
-		const { id } = query;
-		let update = null;
-		const toastid = toast.loading("Please wait...");
-		data.change_role = "true";
-		data.keterangan = "delegasi ke DIKTI"
-		update = await updateLaporan(token, id, data, _csrf);
-
-		if (!update) {
-			toast.update(toastid, { render: "Laporan gagal didelegasi", type: "error", isLoading: false, autoClose: true, closeButton: true });
+		if (this.props.user.role.id === 2024) {
+			Swal.fire({
+				icon: 'error',
+				title: 'Oops...',
+				html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+				confirmButtonColor: "#3e3a8e",
+				confirmButtonText: 'Oke'
+				// footer: '<a href="">Why do I have this issue?</a>'
+			})
 		} else {
-			toast.update(toastid, { render: "Laporan berhasil didelegasi", type: "success", isLoading: false, autoClose: true, closeButton: true });
-			Router.push("/app/sanksi");
+
+			const getToken = await getCsrf();
+			const _csrf = getToken.token;
+			const { token, query } = this.props;
+			const { id } = query;
+			let update = null;
+			const toastid = toast.loading("Please wait...");
+			data.change_role = "true";
+			data.keterangan = "delegasi ke DIKTI"
+			update = await updateLaporan(token, id, data, _csrf);
+
+			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 });
+				Router.push("/app/sanksi");
+			}
 		}
 	};
 
@@ -283,11 +308,18 @@ class ProsesSanksi extends Component {
 				});
 			}
 		}
-
-
-
 	}
 
+	handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
+
 	render() {
 		const { dataUpload, dataPelanggaran, pelaporan, dataSuratBA } = this.state
 		return (
@@ -449,25 +481,33 @@ class ProsesSanksi extends Component {
 												{this.state.listSanksi && <UploadSurat setUploadSuratSanksi={this.setUploadSuratSanksi} listSanksi={this.state.listSanksi} query={this.props.query} handleAutoSave={this.handleAutoSave} dataPelanggaran={this.state.dataPelanggaran} dataSuratBA={dataSuratBA} />}
 											</div>
 											<FormGroup row className="mt-3">
-												<label className="col-md-2 col-form-label">
+												<label className="col-md-4 col-form-label">
 													Dokumen Laporan Evaluasi dan Pembahasan
 												</label>
-												<div className="col-md-10">
+												<div className="col-md-8">
 
 													<div style={{ display: "none" }}>
 														<ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} handleAutoSave={this.handleAutoSave} dataPelanggaran={this.state.dataPelanggaran} setDataSuratBA={this.setDataSuratBA} dataLaporan={pelaporan} dataSuratBA={dataSuratBA} />
 													</div>
-													<ReactToPrint
-														trigger={() => {
-															return <span>
-
-																<Button color className="btn-labeled-4 mt-0">
-																	<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
-																</Button>
-															</span>
-														}}
-														content={() => this.componentRef}
-													/>
+													{this.props.user.role.id === 2024 ?
+														<Button color className="btn-labeled-4 mt-0" onClick={this.handleOpenAlert}>
+															<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+														</Button>
+														:
+														<ReactToPrint
+															trigger={() => {
+																return <span>
+																	<Button color className="btn-labeled-4 mt-0">
+																		<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+																	</Button>
+
+																</span>
+															}}
+															content={() => this.componentRef}
+														/>
+
+													}
+
 												</div>
 											</FormGroup>
 											<hr />
@@ -487,17 +527,22 @@ class ProsesSanksi extends Component {
 												<FormGroup row>
 													<Col md="4">Surat Berita Acara:</Col>
 													<Col md="8">
-
-														<ReactToPrint
-															trigger={() => {
-																return <span>
-																	<Button color className="btn-labeled-4 mt-0">
-																		<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
-																	</Button>
-																</span>
-															}}
-															content={() => this.componentRef}
-														/>
+														{this.props.user.role.id === 2024 ?
+															<Button color className="btn-labeled-4 mt-0" onClick={this.handleOpenAlert}>
+																<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+															</Button>
+															:
+															<ReactToPrint
+																trigger={() => {
+																	return <span>
+																		<Button color className="btn-labeled-4 mt-0">
+																			<h5 className="p-0 mt-2"><em className="fas fa-download mr-2" />Print dan Download</h5>
+																		</Button>
+																	</span>
+																}}
+																content={() => this.componentRef}
+															/>
+														}
 														<div style={{ display: "none" }}>
 															<ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} handleAutoSave={this.handleAutoSave} dataPelanggaran={this.state.dataPelanggaran} setDataSuratBA={this.setDataSuratBA} dataLaporan={pelaporan} dataSuratBA={dataSuratBA} />
 														</div>

+ 33 - 10
pages/app/tuntas/detail.js

@@ -10,6 +10,8 @@ import Loader from "@/components/Common/Loader";
 import { connect } from "react-redux";
 import { createLog } from "@/actions/log";
 import { getCsrf } from "../../../actions/security";
+import { getOneSanksi } from "../../../actions/sanksi";
+import DetailSanksi from "../../../components/PelaporanTuntas/DetailSanksi";
 
 class DetailPelaporan extends Component {
 	constructor(props) {
@@ -27,13 +29,23 @@ class DetailPelaporan extends Component {
 		const { token, query } = this.props;
 		const getTokenCsrf = await getCsrf();
 		const _csrf = getTokenCsrf.token;
-		const pelaporan = await getOneLaporan(this.props.token, query.id + "?aktif=false");
-		await createLog(token, { aktivitas: `Mengakses halaman detail Pelaporan Tuntas dengan No. Laporan ${pelaporan.data.no_laporan}`, menu: "Pelaporan", _csrf: _csrf });
-		this.setState({ pelaporan });
+		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");
+			await createLog(token, { aktivitas: `Mengakses halaman detail Pelaporan Tuntas dengan No. Laporan ${pelaporan?.data?.no_laporan}`, menu: "Pelaporan", _csrf: _csrf });
+			this.setState({ pelaporan });
+		}
+
+
 	};
 
 	render() {
-		const { pelaporan } = this.state;
+		const { query } = this.props
+		const { pelaporan, sanksi } = this.state;
 		return (
 			<ContentWrapper unwrap>
 				{/* <Header /> */}
@@ -50,19 +62,30 @@ class DetailPelaporan extends Component {
 					</div>
 					<Row>
 						<Col xl="9">
-							{pelaporan.data ? (
+							{query?.data === "sanksi" &&
+								<Card className="card-default">
+									<CardBody>
+										<Row>
+											<Col lg={12}>
+												{sanksi?.data && query?.data === "sanksi" ? <DetailSanksi data={sanksi.data} /> : <Loader />}
+											</Col>
+										</Row>
+									</CardBody>
+								</Card>
+							}
+							{query?.data === "laporan" &&
 								<Card className="card-default">
 									<CardBody>
 										<Row>
-											<Col lg={12}>{<DetailLaporan data={pelaporan.data} />}</Col>
+											<Col lg={12}>
+												{pelaporan?.data && query.data === "laporan" ? <DetailLaporan data={pelaporan.data} /> : <Loader />}</Col>
 										</Row>
 									</CardBody>
 								</Card>
-							) : (
-								<Loader />
-							)}
+							}
 						</Col>
-						<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>

+ 2 - 2
pages/app/turun-sanksi/detail.js

@@ -65,14 +65,14 @@ class Detail extends Component {
 						<Row>
 
 							<Col xl="9">
-								<DetailSanksi data={sanksi.data} />
+								<DetailSanksi data={sanksi.data} role={this.props.user.role.id}/>
 								<InputTanggal query={query} token={token} data={sanksi.data} listSanksi={this.state.listSanksi} />
 								<Card className="card-default">
 									<CardHeader>
 										<CardTitle>Riwayat</CardTitle>
 									</CardHeader>
 									<CardBody>
-										<TableRiwayat data={sanksi.data.riwayat_sanksi} perbaikan={sanksi.data.perbaikan} />
+										<TableRiwayat data={sanksi.data.riwayat_sanksi} perbaikan={sanksi.data.perbaikan}role={this.props.user.role.id} />
 									</CardBody>
 								</Card>
 							</Col>

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

@@ -25,7 +25,6 @@ class Sanksi extends Component {
 	static getInitialProps = ({ query }) => ({ query });
 
 	componentDidMount = async () => {
-
 		const { token, query } = this.props;
 		const sanksi = await getOneSanksi(token, query.id);
 		this.setState({ sanksi, pt: sanksi.data.laporan.pt });