andi hai 1 ano
pai
achega
2bf68cfa5c

+ 1 - 1
components/Banding/Riwayat.js

@@ -31,7 +31,7 @@ function Riwayat({ data, role }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>{data.status}</td>
 									<td>
 										{data.dokumen.map((e) => (

+ 1 - 1
components/Keberatan/Riwayat.js

@@ -33,7 +33,7 @@ function Riwayat({ data, role }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>{data.status}</td>
 									<td>{data.keterangan}</td>
 									<td>

+ 220 - 16
components/Layout/SidebarUserBlock.js

@@ -1,19 +1,40 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
-import { Collapse } from "reactstrap";
-
+import { Collapse, Dropdown, DropdownMenu, DropdownToggle, DropdownItem, UncontrolledDropdown, ModalHeader, ModalBody, ModalFooter, Modal, FormFeedback, Button } from "reactstrap";
+import classNames from 'classnames';
+import PhoneInput from 'react-phone-input-2'
+import 'react-phone-input-2/lib/style.css'
+import OtpInput from 'react-otp-input';
 import { connect } from "react-redux";
+import { createotp, getkontakpt, createkontak } from "../../actions/auth";
+import swal from "sweetalert2";
+
+
+
 
 class SidebarUserBlock extends Component {
 	state = {
 		showUserBlock: true,
 		user: {},
 		role: {},
+		ddOpen: false,
+		ddselected: false,
+		phone: "",
+		otp: "",
+		modalOTP: false,
+		modalPhone: false
 	};
 
-	async componentDidMount() {
+	componentDidMount = async () => {
+		const { token } = this.props;
 		const user = this.props.user;
+
+		const kontakPT = await getkontakpt(token);
+		const oldPhone = kontakPT?.data.map((data) => (data.no_hp)).toString()
 		this.setState({ user, role: user.role });
+		if (oldPhone) {
+			this.setState({ phone: oldPhone })
+		}
 	}
 
 	componentDidUpdate(oldProps) {
@@ -21,28 +42,211 @@ class SidebarUserBlock extends Component {
 			this.setState({ showUserBlock: this.props.showUserBlock });
 		}
 	}
+	toggleDropDown = () => this.setState({
+		ddOpen: !this.state.ddOpen
+	})
+	toggleDropItem = () =>
+		this.setState({
+			ddselected: !this.state.ddselected
+		})
+	handleSubmitTelepon = async () => {
+		this.setState({ loadingProses: true })
+		const { token } = this.props
+		await createotp({ no_hp: this.state.phone }, token)
+
+
+		this.setState({ modalPhone: false, modalOTP: true })
+	}
 
+	otpClose = () => {
+		this.setState({ modalOTP: false, ddselected: false })
+		// localStorage.setItem("closeverif", "true");
+	}
+	handleSubmitOtp = async () => {
+		const { token } = this.props
+		const create = await createkontak({ otp: this.state.otp, no_hp: this.state.phone }, token)
+		if (create.error) {
+			swal.fire({
+				title: create.error.message,
+				icon: "error",
+				content: create.error.message,
+				confirmButtonColor: "#3e3a8e",
+			});
+		} else {
+			swal.fire({
+				title: "Data berhasil dikirim",
+				icon: "success",
+				confirmButtonColor: "#3e3a8e",
+			});
+			this.setState({ ddselected: false, modalOTP: false })
+		}
+
+	}
 	render() {
 		const { user, role } = this.state;
 		return (
 			<Collapse id="user-block" isOpen={this.state.showUserBlock}>
-				<div>
-					<div className="item user-block">
-						{/* User picture */}
-						<div className="user-block-picture">
-							<div className="user-block-status">
-								<img className="rounded-circle" src={role.id === 2022 ? "/static/img/univ-avatar.png" : "/static/img/logo-single.png"} alt="Avatar" width="60" height="60" />
-								<div className="circle bg-success circle-lg"></div>
+				<Modal isOpen={this.state.ddselected} style={{ width: '400px' }}>
+					<ModalBody>
+						<div className="modalLoginPT-a">
+							<img
+								className="icon-triangle-onModalPT mt-0"
+								src="/static/img/Frame_10.png"
+							></img>
+
+							<h4 className=" font-color-black mt-1">Edit Nomor Telepon Perguruan Tinggi</h4>
+						</div>
+
+						<div className="modalLoginPT-b">
+							<label className=" font-weight-bold h6">
+								Nomor Telepon :
+							</label>
+							<div className="border-2">
+								<PhoneInput
+									country={'id'}
+									value={this.state.kontakPT?.data.map((data) => (data.no_hp)) || this.state.phone}
+									onChange={phone => this.setState({ phone })} />
 							</div>
 						</div>
-						{/* Name and Job */}
-						<div className="user-block-info">
-							<span className="user-block-name">{user.nama}</span>
-							<span className="user-block-role">{role.nama}</span>
+						<div className="">
+							<Button className="btn-v2 float-left mr-2 ml-4" style={{ width: "40%" }} color onClick={this.otpClose}>
+								<span className=" font-color-black">
+									Batal
+								</span>
+							</Button>
+							<Button className="btn-login float-right mr-4" style={{ width: "40%" }} color onClick={this.handleSubmitTelepon}>
+								{this.state.loadingProses ?
+									(
+										<div class="d-flex justify-content-center">
+											<span
+												class="spinner-border spinner-border-sm text-white"
+												role="status"
+											></span>
+											<span className="font-color-white">
+												&nbsp; Diproses...
+											</span>
+										</div>
+									) : (
+										<span className="font-color-white">
+											Simpan
+										</span>
+									)}
+							</Button>
 						</div>
-					</div>
+					</ModalBody>
+				</Modal>
+				<Modal isOpen={this.state.modalOTP} style={{ width: '400px' }} >
+					<ModalBody>
+						<div className="modalLoginPT-a">
+							<img
+								className="icon-triangle-onModalPT mt-auto mb-auto"
+								src="/static/img/Frame_10.png"
+							></img>
+
+							<h3 className=" font-color-black">Masukan Kode OTP</h3>
+						</div>
+
+						{/* <div className="modalLoginPT-b"> */}
+
+						<div className=" mt-5 mb-5">
+							<OtpInput
+								invalid={this.state.error}
+								value={this.state.otp}
+								onChange={(otp) => { this.setState({ otp }) }}
+								numInputs={4}
+								renderSeparator={<span className=" font-color-black font-weight-bold mr-2 ml-2">-</span>}
+								renderInput={(props) => <input {...props} style={{ width: "50px", height: "50px", textAlign: "center", marginLeft: "auto", marginRight: "auto", borderRadius: "7px", fontSize: "30px" }} />}
+
+							/>   <p className="  mt-3">
+								*Kode OTP terkirim ke nomor WA {this.state.phone}
+							</p>
+							<FormFeedback invalid={this.state.error}>
+								Kode verifikasi harus diisi
+							</FormFeedback>
+						</div>
+
+						<div>
+							<Button className="btn-v2 float-left mr-2 ml-4" style={{ width: "40%" }} color onClick={this.otpClose}>
+								<span className=" font-color-black">
+									Batal
+								</span>
+							</Button>
+							<Button className="btn-login float-right mr-4" style={{ width: "40%" }} color onClick={this.handleSubmitOtp}
+							>
+								<span className=" font-color-white">
+									Kirim
+								</span>
+							</Button>
+						</div>
+					</ModalBody>
+
+				</Modal>
+				<div>
+					{role.id === 2022 ? (
+						<div className="item user-block">
+							{/* User picture */}
+							<div className="user-block-picture">
+								<div className="user-block-status">
+									<img className="rounded-circle" src={role.id === 2022 ? "/static/img/univ-avatar.png" : "/static/img/logo-single.png"} alt="Avatar" width="60" height="60" />
+									<div className="circle bg-success circle-lg"></div>
+								</div>
+							</div>
+							{/* Name and Job */}
+							<div className="user-block-info">
+								<span className="user-block-name">
+									<div className="col ">
+										<div className=" d-inline-flex justify-content-center">
+											<span className="font-color-black font-weight-bold text-center">{user.nama}</span>
+										</div>
+										{/* <div className=" d-inline-flex ml-1">
+											<Dropdown isOpen={this.state.ddOpen} toggle={this.toggleDropDown}>
+												<DropdownToggle data-toggle="dropdown" tag="span">
+													<span style={{ width: "20px" }} >
+														<img className="" src="/static/img/Down.png"></img>
+													</span>
+												</DropdownToggle>
+												<DropdownMenu positionFixed={true}  >
+													<DropdownItem onClick={this.toggleDropItem}>
+														<span className=" font-color-black font-weight-bold">
+															Edit Nomor Telepon
+														</span>
+													</DropdownItem>
+												</DropdownMenu>
+											</Dropdown>
+										</div> */}
+
+
+									</div>
+								</span>
+								<span className="user-block-role">{role.nama}</span>
+							</div>
+						</div>
+					) :
+						(
+							<div className="item user-block">
+								{/* User picture */}
+								<div className="user-block-picture">
+									<div className="user-block-status">
+										<img className="rounded-circle" src={role.id === 2022 ? "/static/img/univ-avatar.png" : "/static/img/logo-single.png"} alt="Avatar" width="60" height="60" />
+										<div className="circle bg-success circle-lg"></div>
+									</div>
+								</div>
+								{/* Name and Job */}
+								<div className="user-block-info">
+									<span className="user-block-name">
+										<div className="col ">
+											<div className=" d-inline-flex justify-content-center">
+												<h6 className="font-color-black font-weight-bold text-center">{user.nama}</h6>
+											</div>
+										</div>
+									</span>
+									<span className="user-block-role">{role.nama}</span>
+								</div>
+							</div>
+						)}
+
 				</div>
-			</Collapse>
+			</Collapse >
 		);
 	}
 }

+ 11 - 11
components/Main/DetailLaporan.js

@@ -17,20 +17,20 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 	};
 	return (
 		<>
-			{(!data.user.isPrivate || user?.role.id === 2020) && (
+			{(!data.user?.isPrivate || user?.role?.id === 2020) && (
 				<>
 					{noTitle ? (
 						""
 					) : (
 						<div className="header-1">
-							<h2 className="card-title-1">Identitas Pelapor - {data.user.isPublic ? "Umum" : "Internal"}</h2>
+							<h2 className="card-title-1">Identitas Pelapor - {data.user?.isPublic ? "Umum" : "Internal"}</h2>
 						</div>
 					)}
-					{data.user.nama && (
+					{data.user?.nama && (
 						<FormGroup row>
 							<Col md="4">Nama Pelapor:</Col>
 							<Col md="8">
-								<strong>{data.user.nama}</strong>
+								<strong>{data.user?.nama}</strong>
 							</Col>
 						</FormGroup>
 					)}
@@ -38,22 +38,22 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 						<Col md="4">Nomor yang dapat dihubungi:</Col>
 						<Col md="8">
 							<strong>
-								{data.user.no_hp} {data.user.verified && "(Terverifikasi)"}
+								{data.user?.no_hp} {data.user?.verified && "(Terverifikasi)"}
 							</strong>
 						</Col>
 					</FormGroup>
-					{data.user.email && (
+					{data.user?.email && (
 						<FormGroup row>
 							<Col md="4">Email:</Col>
 							<Col md="8">
-								<strong>{data.user.email}</strong>
+								<strong>{data.user?.email}</strong>
 							</Col>
 						</FormGroup>
 					)}
 
-					{data.user.isPublic && (
+					{data.user?.isPublic && (
 						<>
-							{data.user.alamat && (
+							{data.user?.alamat && (
 								<FormGroup row>
 									<Col md="4">Alamat:</Col>
 									<Col md="8">
@@ -65,13 +65,13 @@ function DetailLaporan({ data, noTitle = false, noStatus = false, role }) {
 								<FormGroup row>
 									<Col md="4">Foto Kartu Identitas:</Col>
 									<Col md="8">
-										<img src={data.user.foto.path} height={200} alt="Foto Identitas" />
+										<img src={data.user?.foto.path} height={200} alt="Foto Identitas" />
 									</Col>
 								</FormGroup>
 							)}
 						</>
 					)}
-					{data.user.isPrivate && (
+					{data.user?.isPrivate && (
 						<FormGroup row>
 							<Col md="4">Dirahasiakan</Col>
 							<Col md="8">

+ 228 - 27
components/Main/DetailPT.js

@@ -1,31 +1,232 @@
-function DetailPT({ data }) {
-	return (
-		<div className="card card-default">
-			<div className="card-body">
-				<div className="text-center">
-					<h3 className="mt-0">{data.nama}</h3>
-					<p>{data.sk_pendirian}</p>
-					<p>Pembina: {data.pembina.nama}</p>
-					<p>{`${data.alamat.jalan} ${data.alamat.rt ? `rt ${data.alamat.rt}` : ""} ${data.alamat.rw ? `rt ${data.alamat.rw}` : ""}, ${data.alamat.kab_kota.nama}, ${data.propinsi.nama}`}</p>
+import React, { Component } from "react";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Header from "@/components/Main/Header";
+import { getLogPT } from "@/actions/log";
+import { getPT } from "@/actions/PT";
+import { Row, Col, ModalHeader, ModalBody, ModalFooter, Modal, FormFeedback, Button } from "reactstrap";
+import Timeline from "@/components/Main/Timeline";
+import { connect } from "react-redux";
+import Loader from "@/components/Common/Loader";
+import { createotp, getkontakpt, createkontak } from "../../actions/auth";
+import PhoneInput from 'react-phone-input-2'
+import 'react-phone-input-2/lib/style.css'
+import OtpInput from 'react-otp-input';
+import { ToastContainer, toast } from "react-toastify";
+import swal from "sweetalert2";
+
+
+class DetailPT extends Component {
+	state = {
+		phone: "",
+		ddselected: false,
+		modalOTP: false,
+		loadingProses: false,
+		otp: ""
+	}
+
+
+
+	componentDidMount = async () => {
+		const { token } = this.props;
+
+		const kontakPT = await getkontakpt(token);
+		const oldPhone = kontakPT?.data.map((data) => (data.no_hp)).toString()
+		if (oldPhone) {
+			this.setState({ phone: oldPhone })
+		}
+	}
+	OpenEditNoTelp = () => this.setState({
+		ddselected: !this.state.ddselected
+	})
+	handleSubmitTelepon = async () => {
+		this.setState({ loadingProses: true })
+		const { token } = this.props
+		await createotp({ no_hp: this.state.phone }, token)
+
+
+		this.setState({ modalPhone: false, modalOTP: true })
+	}
+	otpClose = () => {
+		this.setState({ modalOTP: false, ddselected: false, loadingProses: false, otp: "" })
+		// localStorage.setItem("closeverif", "true");
+	}
+	handleSubmitOtp = async () => {
+		const { token } = this.props
+		const create = await createkontak({ otp: this.state.otp, no_hp: this.state.phone }, token)
+		if (create.error) {
+			swal.fire({
+				title: create.error.message,
+				icon: "error",
+				content: create.error.message,
+				confirmButtonColor: "#3e3a8e",
+			});
+		} else {
+			swal.fire({
+				title: "Data berhasil dikirim",
+				icon: "success",
+				confirmButtonColor: "#3e3a8e",
+			});
+			this.setState({ ddselected: false, modalOTP: false, loadingProses: false, otp: "" })
+		}
+
+	}
+	render() {
+		const { data } = this.props;
+		return (
+			<div className="card card-default">
+				<Modal isOpen={this.state.ddselected} style={{ width: '400px' }}>
+					<ModalBody>
+						<div className="modalLoginPT-a">
+							<img
+								className="icon-triangle-onModalPT mt-0"
+								src="/static/img/Frame_10.png"
+							></img>
+
+							<h4 className=" font-color-black mt-1">Edit Nomor Telepon Perguruan Tinggi</h4>
+						</div>
+
+						<div className="modalLoginPT-b">
+							<label className=" font-weight-bold h6">
+								Nomor Telepon :
+							</label>
+							<div className="border-2">
+								<PhoneInput
+									country={'id'}
+									value={this.state.kontakPT?.data.map((data) => (data.no_hp)) || this.state.phone}
+									onChange={phone => this.setState({ phone })} />
+							</div>
+						</div>
+						<div className="">
+							<Button className="btn-v2 float-left mr-2 ml-4" style={{ width: "40%" }} color onClick={this.otpClose}>
+								<span className=" font-color-black">
+									Batal
+								</span>
+							</Button>
+							<Button className="btn-login float-right mr-4" style={{ width: "40%" }} color onClick={this.handleSubmitTelepon}>
+								{this.state.loadingProses ?
+									(
+										<div class="d-flex justify-content-center">
+											<span
+												class="spinner-border spinner-border-sm text-white"
+												role="status"
+											></span>
+											<span className="font-color-white">
+												&nbsp; Diproses...
+											</span>
+										</div>
+									) : (
+										<span className="font-color-white">
+											Simpan
+										</span>
+									)}
+							</Button>
+						</div>
+					</ModalBody>
+				</Modal>
+				<Modal isOpen={this.state.modalOTP} style={{ width: '400px' }} >
+					<ModalBody>
+						<div className="modalLoginPT-a">
+							<img
+								className="icon-triangle-onModalPT mt-auto mb-auto"
+								src="/static/img/Frame_10.png"
+							></img>
+
+							<h3 className=" font-color-black">Masukan Kode OTP</h3>
+						</div>
+
+						{/* <div className="modalLoginPT-b"> */}
+
+						<div className=" mt-5 mb-5">
+							<OtpInput
+								invalid={this.state.error}
+								value={this.state.otp}
+								onChange={(otp) => { this.setState({ otp }) }}
+								numInputs={4}
+								renderSeparator={<span className=" font-color-black font-weight-bold mr-2 ml-2">-</span>}
+								renderInput={(props) => <input {...props} style={{ width: "50px", height: "50px", textAlign: "center", marginLeft: "auto", marginRight: "auto", borderRadius: "7px", fontSize: "30px" }} />}
+
+							/>   <p className="  mt-3">
+								*Kode OTP terkirim ke nomor WA {this.state.phone}
+							</p>
+							<FormFeedback invalid={this.state.error}>
+								Kode verifikasi harus diisi
+							</FormFeedback>
+						</div>
+
+						<div>
+							<Button className="btn-v2 float-left mr-2 ml-4" style={{ width: "40%" }} color onClick={this.otpClose}>
+								<span className=" font-color-black">
+									Batal
+								</span>
+							</Button>
+							<Button className="btn-login float-right mr-4" style={{ width: "40%" }} color onClick={this.handleSubmitOtp}
+							>
+								<span className=" font-color-white">
+									Kirim
+								</span>
+							</Button>
+						</div>
+					</ModalBody>
+
+				</Modal>
+				<div className="card-body">
+					<div className="text-center">
+						<h3 className="mt-0">{data.nama}</h3>
+						<p>{data.sk_pendirian}</p>
+						<p>Pembina: {data.pembina.nama}</p>
+						<p>{`${data.alamat.jalan} ${data.alamat.rt ? `rt ${data.alamat.rt}` : ""} ${data.alamat.rw ? `rt ${data.alamat.rw}` : ""}, ${data.alamat.kab_kota.nama}, ${data.propinsi.nama}`}</p>
+					</div>
+					<hr />
+					<ul className="list-unstyled px-4">
+						<li>
+							<em className="fa fa-globe fa-fw mr-3"></em>
+							<a href={`https://${data.website}`}>{data.website}</a>
+						</li>
+						<li>
+							<em className="fa fa-phone fa-fw mr-3"></em>
+							{data.telepon}
+						</li>
+						<li>
+							<em className="fa fa-at fa-fw mr-3"></em>
+							<a href={`mailto:${data.email}`}>{data.email}</a>
+						</li>
+					</ul>
+					{this.props.user.role.id === 2022 ?
+						<div>
+							<hr />
+							<label >
+								Nomor Telepon :
+							</label>
+							<button onClick={this.OpenEditNoTelp} className=" float-right bg-transparent border-0 color-3e3a8e">
+								Edit
+							</button>
+							<div >
+								<div className=" no-hpPT mt-2">
+									<div className=" inline">
+										<span style={{ fontSize: "16px" }} className="  font-color-black font-weight-bold">
+											+62
+										</span>
+										<span style={{ width: "10px", position: "" }} >
+											<img style={{ width: "15px" }} src="/static/img/Down.png"></img>
+										</span>
+										<div style={{ fontSize: "14px" }} className=" inline ml-2 font-weight-normal font-color-black font-weight-bold">
+											{this.state.phone.substring(2, 20)}
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+						: ""
+					}
+
+
+
 				</div>
-				<hr />
-				<ul className="list-unstyled px-4">
-					<li>
-						<em className="fa fa-globe fa-fw mr-3"></em>
-						<a href={`https://${data.website}`}>{data.website}</a>
-					</li>
-					<li>
-						<em className="fa fa-phone fa-fw mr-3"></em>
-						{data.telepon}
-					</li>
-					<li>
-						<em className="fa fa-at fa-fw mr-3"></em>
-						<a href={`mailto:${data.email}`}>{data.email}</a>
-					</li>
-				</ul>
 			</div>
-		</div>
-	);
+		);
+	}
 }
 
-export default DetailPT;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(DetailPT);
+

+ 12 - 4
components/PT/CabutSanksi/Riwayat.js

@@ -1,10 +1,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, role }) {
-	const { cabut_sanksi } = data;
+	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>
@@ -22,9 +30,9 @@ function Riwayat({ data, role }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data?.createdAt).format("DD MMMM YYYY")}</td>
 									<td>
-										{data.dokumen?.map((e) => (
+										{data?.dokumen?.map((e) => (
 											<>
 												<em className="fa-lg far fa-file-code"></em>
 												{role === 2024 ?

+ 16 - 16
components/PT/DocPerbaikan/Riwayat.js

@@ -11,7 +11,7 @@ function Riwayat({ data }) {
 			</CardHeader>
 			<CardBody>
 				<Datatable options={{ responsive: true }}>
-					<table className="table table-striped my-4 w-100">
+					<table className="table table-striped my-4 w-100" data-order='[[0, "desc"]]'> 
 						<thead>
 							<tr>
 								<th>Tanggal</th>
@@ -22,21 +22,21 @@ function Riwayat({ data }) {
 						<tbody>
 							{data.length
 								? data.map((value) => (
-										<tr>
-											<td>{moment(value.createAt).format("DD MMMM YYYY")}</td>
-											<td>{value.keterangan}</td>
-											<td>
-												{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>
-													</>
-												))}
-											</td>
-										</tr>
-								  ))
+									<tr>
+										<td>{moment(value.createdAt).format("DD MMMM YYYY")}</td>
+										<td>{value.keterangan}</td>
+										<td>
+											{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>
+												</>
+											))}
+										</td>
+									</tr>
+								))
 								: ""}
 						</tbody>
 					</table>

+ 1 - 1
components/PT/JawabanKeberatan/Riwayat.js

@@ -20,7 +20,7 @@ function Riwayat({ data }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>
 										{data.dokumen.map((e) => (
 											<>

+ 1 - 1
components/PT/Keberatan/Riwayat.js

@@ -20,7 +20,7 @@ function Riwayat({ data }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>
 										{data.dokumen.map((e) => (
 											<>

+ 1 - 1
components/PT/Riwayat.js

@@ -21,7 +21,7 @@ function Riwayat({ data }) {
 							{data?.length
 								? data.map((value) => (
 										<tr>
-											<td>{moment(value.createAt).format("DD MMMM YYYY")}</td>
+											<td>{moment(value.createdAt).format("DD MMMM YYYY")}</td>
 											<td>
 												{value.dokumen.map((e) => (
 													<>

+ 1 - 1
components/PencabutanSanksi/Riwayat.js

@@ -33,7 +33,7 @@ function Riwayat({ data, role }) {
 						<tbody>
 							{data ? (
 								<tr>
-									<td>{moment(data.createAt).format("DD MMMM YYYY")}</td>
+									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>{data.status}</td>
 									<td>{data.keterangan}</td>
 									<td>

+ 4 - 5
components/Riwayat/TableRiwayat.js

@@ -27,10 +27,10 @@ class TableRiwayat extends Component {
         this.setState({ dataRiwayat });
     }
     onFilter = async () => {
-        // const date1 = moment(this.state.fromDate).format("YYYY-MM-DD")
-        // const date2 = moment(this.state.toDate).format("YYYY-MM-DD")
-        // const dataRiwayat = await getLog2(this.props.token, { fromDate: date1, toDate: date2 })
-        // this.setState({ dataRiwayat });
+        const date1 = moment(this.state.fromDate).format("YYYY-MM-DD")
+        const date2 = moment(this.state.toDate).format("YYYY-MM-DD")
+        const dataRiwayat = await getLog2(this.props.token, { fromDate: date1, toDate: date2 })
+        this.setState({ dataRiwayat });
         this.setState({ updateTable: true });
         setTimeout(() => {
             this.setState({ updateTable: false });
@@ -50,7 +50,6 @@ class TableRiwayat extends Component {
 
 
     render() {
-        console.log(this.state.dataRiwayat)
         return (
             <div className="card b ">
 

+ 0 - 1
components/Sanksi/Ringkasan.js

@@ -39,7 +39,6 @@ export class Ringkasan extends Component {
 
 	render() {
 		const { dataLaporan, dataPelanggaran, dataUpload } = this.props
-		console.log(dataUpload)
 		return (
 			<>
 				<Row>

+ 35 - 25
components/Sanksi/UploadSurat.js

@@ -4,6 +4,8 @@ import Select from "react-select";
 import { addDays, addMonths } from 'date-fns';
 import Datetime from "react-datetime";
 import moment from "moment";
+import { getAutoSave } from "@/actions/autosave";
+
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -60,6 +62,8 @@ export class UploadSurat extends Component {
 		this.setState(prevState => ({
 			files: [...prevState.files, ...selectFile]
 		}))
+		this.props.setUploadSuratSanksi(this.state);
+
 	};
 	onDropTandaTerimaSS = (filesTandaTerimaSS) => {
 		this.setState({
@@ -76,9 +80,9 @@ export class UploadSurat extends Component {
 	componentDidMount = async () => {
 		const { query, token } = this.props;
 		const { id } = query;
-		// const getDataSave = await getAutoSave({ id, laporan: true });
-		// const autosaveDataUpload = getDataSave.data?.PenetapanSanksi?.dataUpload;
-		// this.setState(autosaveDataUpload)
+		const getDataSave = await getAutoSave({ id, laporan: true });
+		const autosaveDataUpload = getDataSave.data?.PenetapanSanksi?.dataUpload;
+		this.setState(autosaveDataUpload)
 	}
 
 	clearFiles = (e) => {
@@ -104,9 +108,9 @@ export class UploadSurat extends Component {
 		this.props.setUploadSuratSanksi(this.state);
 	};
 
-	// handleAutoSave = () => {
-	// 	this.props.handleAutoSave()
-	// }
+	handleAutoSave = () => {
+		this.props.handleAutoSave()
+	}
 
 	setUploadSuratSanksi = () => {
 		this.props.setUploadSuratSanksi(this.state);
@@ -153,32 +157,37 @@ export class UploadSurat extends Component {
 			this.setState({ awalTMT: "", akhirTMT: "", tglAkhirKeberatan: "", terimaSuratSanksi: "" })
 		}
 	}
+	removeFile = file => () => {
+		const files = this.state.files
+		const newFiles = [...files]
+		newFiles.splice(newFiles.indexOf(file), 1)
+		this.setState({
+			files: newFiles,
+		}, () => this.props.setUploadSuratSanksi(this.state));
+
+
+	}
+	removeFileTandaTerimaSS = file => () => {
+		const filesTandaTerimaSS = this.state.filesTandaTerimaSS
+		const newFiles = [...filesTandaTerimaSS]
+		newFiles.splice(newFiles.indexOf(file), 1)
+		this.setState({
+			filesTandaTerimaSS: newFiles,
+		}, () => this.props.setUploadSuratSanksi(this.state));
+	}
 	render() {
 		const { files, terimaSuratSanksi, tglAkhirKeberatan, filesTandaTerimaSS, tidakPerluTMTCheck } = this.state;
-		const removeFile = file => () => {
-			const newFiles = [...files]
-			newFiles.splice(newFiles.indexOf(file), 1)
-			this.setState({
-				files: newFiles,
-			});
-		}
-		const removeFileTandaTerimaSS = file => () => {
-			const newFiles = [...filesTandaTerimaSS]
-			newFiles.splice(newFiles.indexOf(file), 1)
-			this.setState({
-				filesTandaTerimaSS: newFiles,
-			});
-		}
+
 		const thumbs = files.map((file, index) => (
 			<p>
-				<em className="far fa-file" />&nbsp;&nbsp;{file.name}
-				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFile(file)} />
+				<em className="far fa-file" />&nbsp;&nbsp;{file.path}
+				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={this.removeFile(file)} />
 			</p>
 		));
 		const thumbsTandaTerimaSS = filesTandaTerimaSS.map((file, index) => (
 			<p>
-				<em className="far fa-file" />&nbsp;&nbsp;{file.name}
-				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={removeFileTandaTerimaSS(file)} />
+				<em className="far fa-file" />&nbsp;&nbsp;{file.path}
+				<button className="bg-transparent button-transparent border-0 fas fa-trash text-danger float-right" onClick={this.removeFileTandaTerimaSS(file)} />
 			</p>
 		));
 		return (
@@ -245,7 +254,7 @@ export class UploadSurat extends Component {
 										}}
 										closeOnSelect={true}
 										isValidDate={(e) => {
-											return !this.state.listSanksi?.find(z => z.value === "Sanksi Administratif Berat - Pencabutan izin Program Studi" || z.value === "Sanksi Administratif Berat - Pembubaran PTN atau pencabutan izin PTS") ? e.isBefore(addMonths(new Date(this.state.awalTMT), 6)) && e.isAfter(new Date(this.state.awalTMT)) : false
+											return !this.state.listSanksi?.find(z => z.value === "Sanksi Administratif Berat - Pencabutan izin Program Studi" || z.value === "Sanksi Administratif Berat - Pembubaran PTN atau pencabutan izin PTS") ? e.isBefore(addMonths(new Date(this.state.awalTMT), 6).getTime() + 86400000) && e.isAfter(new Date(this.state.awalTMT) ) : false
 										}}
 									// isValidDate={(e) => {
 									// 	return e.isAfter(moment(new Date) && e.isBefore(moment(new Date)))
@@ -277,6 +286,7 @@ export class UploadSurat extends Component {
 					<label className="col-md-4 col-form-label">List sanksi </label>
 					<div className="col-md-8">
 						<Select
+							value={this.state.listSanksi}
 							options={this.props.listSanksi.map(e => ({ value: `Sanksi Administratif ${e.split(";")[0]} - ${e.split(";")[1]}` }))}
 							isMulti
 							formatOptionLabel={formatOptionLabel}

+ 6 - 3
pages/app/pemantauan/timeline.js

@@ -66,7 +66,7 @@ class Pemantauan extends Component {
 								<div className="card-body">
 									{pelaporan.data?.length ? (
 										<Datatable options={{ responsive: false }}>
-											<table className="table w-100">
+											<table className="table w-100" data-order='[[0, "desc"]]'>
 												<thead>
 													<tr>
 														<th>Tanggal</th>
@@ -80,7 +80,10 @@ class Pemantauan extends Component {
 													{pelaporan.data.map((data) => {
 														return (
 															<tr key={data._id}>
-																<td>{moment(data.createdAt).format("DD/MM/YYYY")}</td>
+
+																<td>
+																	<p style={{ display: "none" }}>{data.createdAt}</p>
+																	{moment(data.createdAt).format("DD/MM/YYYY")}</td>
 																<td>{data.no_laporan}</td>
 
 																<td className="text-nowrap">
@@ -94,7 +97,7 @@ class Pemantauan extends Component {
 																</td>
 
 																<td>
-																	{data.user.isPrivate ? "" : data.user.nama} - {data.role_asal}
+																	{data.user?.isPrivate ? "" : data.user?.nama} - {data.role_asal}
 																</td>
 
 																<td>

+ 15 - 8
pages/app/sanksi/proses.js

@@ -264,7 +264,8 @@ class ProsesSanksi extends Component {
 	};
 
 	setUploadSuratSanksi = (data) => {
-		this.setState({ dataUpload: data });
+		this.setState({ dataUpload: data }, () => this.handleAutoSave());
+
 
 
 	};
@@ -279,7 +280,7 @@ class ProsesSanksi extends Component {
 
 
 	};
-	validasiSanksiOn5 = (activeStep) => {
+	validasiSanksiOn5 = (empat, lima) => () => {
 		const dataPelanggaran = this.state.dataPelanggaran
 		if (dataPelanggaran?.data === undefined) {
 			swal.fire({
@@ -291,14 +292,16 @@ class ProsesSanksi extends Component {
 			this.setState({
 				activeStep: "4"
 			});
+			this.handleAutoSave(this.state.dataPelanggaran, empat)
 		}
 		else {
 			this.setState({
 				activeStep: "5"
 			});
+			this.handleAutoSave(this.state.dataPelanggaran, lima)
 		}
 	}
-	validasiSanksiOn6 = (activeStep) => {
+	validasiSanksiOn6 = (empat, enam) => () => {
 		const dataPelanggaran = this.state.dataPelanggaran
 		if (dataPelanggaran?.data === undefined) {
 			swal.fire({
@@ -310,11 +313,15 @@ class ProsesSanksi extends Component {
 			this.setState({
 				activeStep: "4"
 			});
+			this.handleAutoSave(this.state.dataPelanggaran, empat)
+
 		}
 		else {
 			this.setState({
 				activeStep: "6"
 			});
+			this.handleAutoSave(this.state.dataPelanggaran, enam)
+
 		}
 	}
 	validation = (activeStep) => {
@@ -396,7 +403,7 @@ class ProsesSanksi extends Component {
 				swal.fire({
 					title: "Data belum lengkap",
 					icon: "error",
-					html:'Mohon diisi terlebih dahulu sebelum melanjutkan ke tahap berikutnya',
+					html: 'Mohon diisi terlebih dahulu sebelum melanjutkan ke tahap berikutnya',
 					confirmButtonColor: "#3e3a8e",
 				});
 				this.setState({
@@ -420,7 +427,7 @@ class ProsesSanksi extends Component {
 			) {
 				swal.fire({
 					title: "Data belum lengkap",
-					html:'Mohon diisi terlebih dahulu sebelum melanjutkan ke tahap berikutnya',
+					html: 'Mohon diisi terlebih dahulu sebelum melanjutkan ke tahap berikutnya',
 					icon: "error",
 					confirmButtonColor: "#3e3a8e",
 				});
@@ -517,7 +524,7 @@ class ProsesSanksi extends Component {
 													active: this.state.activeStep === "5",
 												})}
 												// onClick={this.toggleStep("5")}
-												onClick={this.validasiSanksiOn5}
+												onClick={this.validasiSanksiOn5("4", "5")}
 												disabled={thisclose === "Ditutup"}
 											>
 												<h4 className="text-left my-3">5. Berita Acara Pleno</h4>
@@ -530,7 +537,7 @@ class ProsesSanksi extends Component {
 													active: this.state.activeStep === "6",
 												})}
 												// onClick={this.toggleStep("6")}
-												onClick={this.validasiSanksiOn6}
+												onClick={this.validasiSanksiOn6("4", "6")}
 												disabled={thisclose === "Ditutup"}
 											>
 												<h4 className="text-left my-3">6. Penetapan Sanksi</h4>
@@ -618,7 +625,7 @@ class ProsesSanksi extends Component {
 												<Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("3")}>
 													<span className="font-color-white">Previous</span>
 												</Button>
-												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.validasiSanksiOn5}>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.validasiSanksiOn5("4", "5")}>
 													<span className="font-color-white">Next</span>
 												</Button>
 											</div>

+ 2 - 2
pages/pt/pemantauan.js

@@ -79,7 +79,7 @@ class Pemantauan extends Component {
 	
 	}
 	render() {
-		const { log, pt } = this.state;
+		const { log, pt } = this.state; 
 
 		return (
 			<ContentWrapper unwrap>
@@ -194,7 +194,7 @@ class Pemantauan extends Component {
 						) : (
 							<Loader />
 						)}
-						<Col xl="3">{pt.data && <DetailPT data={pt.data} />}</Col>
+						<Col xl="3">{pt.data && <DetailPT data={pt.data}  />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>

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

@@ -28,7 +28,7 @@ class PencabutanSanksi extends Component {
 					<span className="font-color-white">Permohonan Pencabutan Sanksi</span>
 				</div>
 				<Row>
-					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "Tidak ada Sanksi" : <Loader />}</Col>
+					<Col lg={12}>{sanksi.data?.length ? <TableSanksi listData={sanksi.data} to="/pt/pencabutan-sanksi/detail" linkName="Detail" /> : sanksi.data ? "Silahkan upload dokumen perbaikan sebelum melakukan permohonan" : <Loader />}</Col>
 				</Row>
 			</ContentWrapper>
 		);

BIN=BIN
public/static/img/Down.png


+ 9 - 4
styles/app/app/mycss.scss

@@ -212,9 +212,7 @@ border-radius: 4px;
 
     .icon-triangle-onModalPT {
       margin-top: 10px;
-      float: left;
-
-// margin-right: 30px;    
+      float: left; 
     }
    
     .modalLoginPT-a{
@@ -232,4 +230,11 @@ border-radius: 4px;
     //   color: rgb(104, 7, 60);
     //   height: 50px !important;
     //   width: 200px !important;
-    // }
+    // }
+    .no-hpPT{
+      padding: 7px;
+      border-style: solid;
+      border-width: 1px;
+      border-color: #b7b7bc;
+      border-radius: 8px;
+    }