yazid138 3 роки тому
батько
коміт
ecdfc9188f

+ 30 - 8
actions/PT.js

@@ -1,8 +1,8 @@
-import { get } from "@/config/request";
+import axios from "@/config/axios";
 
-export const getPT = async (params) => {
+export const getPT = async (token, params) => {
 	try {
-		let url = "/perguruan-tinggi";
+		let url = "/pt";
 		if (params) {
 			url += "?";
 			if (params.id) {
@@ -11,10 +11,14 @@ export const getPT = async (params) => {
 				const parseURL = [];
 				if (params.search) parseURL.push(`search=${params.search}`);
 				if (params.pembina) parseURL.push(`pembina=${params.pembina}`);
-				url += parseURL.join('&')
+				url += parseURL.join("&");
 			}
 		}
-		const response = await get(url);
+		const response = await axios.get(url, {
+			headers: {
+				Authorization: token,
+			},
+		});
 		return response.data;
 	} catch (error) {
 		console.log("error", error);
@@ -22,16 +26,34 @@ export const getPT = async (params) => {
 	}
 };
 
-export const getPembina = async (params) => {
+export const getOnePT = async (token, pt_id) => {
 	try {
-		let url = "/perguruan-tinggi/lembaga";
+		const response = await axios.get(`/pt/${pt_id}`, {
+			headers: {
+				Authorization: token,
+			},
+		});
+		return response.data;
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};
+
+export const getPembina = async (token, params) => {
+	try {
+		let url = "/lembaga";
 		if (params) {
 			url += "?";
 			if (params.search) {
 				url += `search=${params.search}`;
 			}
 		}
-		const response = await get(url);
+		const response = await axios.get(url, {
+			headers: {
+				Authorization: token,
+			},
+		});
 		return response.data;
 	} catch (error) {
 		console.log("error", error);

+ 10 - 14
actions/auth.js

@@ -2,22 +2,18 @@ import { get } from "../config/request";
 import axiosAPI from "../config/axios";
 
 export const login = async (username, password) => {
-	try {
-		const data = {
-			username,
-			password,
-		};
+	const data = {
+		username,
+		password,
+	};
 
-		const response = await axiosAPI.post("/login", data, {
-			headers: {
-				"Content-Type": "application/json",
-			},
-		});
+	const response = await axiosAPI.post("/auth/login", data, {
+		headers: {
+			"Content-Type": "application/json",
+		},
+	});
 
-		return response.data;
-	} catch (error) {
-		if (error.response) return error.response.data;
-	}
+	return response.data;
 };
 
 export const refreshToken = async () => {

+ 8 - 4
actions/log.js

@@ -1,10 +1,14 @@
 import { get } from "../config/request";
+import axios from "@/config/axios";
 
-export const getLog = async ({ ptId, isPT }) => {
+export const getLog = async (token, ptId) => {
 	try {
-		let url = `/log?ptId=${ptId}`;
-		if (isPT) url += `&isPT=true`;
-		const res = await get(url);
+		let url = `/pemantauan/${ptId}`;
+		const res = await axios.get(url, {
+			headers: {
+				Authorization: token,
+			},
+		});
 		return res.data;
 	} catch (error) {
 		console.log("error", error);

+ 13 - 3
actions/pelaporan.js

@@ -1,9 +1,9 @@
 import { get, post, del, put } from "../config/request";
 import axiosAPI from "../config/axios";
 
-export const getPelaporan = async (query = {}) => {
+export const getPelaporan = async (token, query = {}) => {
 	try {
-		let url = "/pelaporan";
+		let url = "/laporan";
 		if (query != null) {
 			const { number, ptId, penjadwalan, pemeriksaan, active, role, orgId } = query;
 			url += "?";
@@ -20,7 +20,17 @@ export const getPelaporan = async (query = {}) => {
 			url += parseURL.join("&");
 		}
 
-		const res = await get(url);
+		const res = await axiosAPI.get(url, { headers: { Authorization: token } });
+		return res.data;
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};
+
+export const getOneLaporan = async (token, id) => {
+	try {
+		const res = await axiosAPI.get(`/laporan/${id}`, { headers: { Authorization: token } });
 		return res.data;
 	} catch (error) {
 		console.log("error", error);

+ 1 - 1
components/Layout/Head.js

@@ -7,7 +7,7 @@ const defaultDescription = "";
 const Head = (props) => (
 	<NextHead>
 		<meta charSet="UTF-8" />
-		<title>PTB-DiktiRistek</title>
+		<title>DiktiRistek</title>
 		<meta name="description" content={props.description || defaultDescription} />
 		<meta name="viewport" content="width=device-width, initial-scale=1" />
 		<link rel="icon" href="/static/img/logo-single.png" />

+ 3 - 1
components/Layout/Header.js

@@ -57,7 +57,8 @@ class Header extends Component {
 
 	handleLogout = async (e) => {
 		e.preventDefault();
-		await logout();
+		// await logout();
+		this.props.tokenNull();
 		// if (cek.success) {
 		Router.push({ pathname: "/app" });
 		// }
@@ -223,6 +224,7 @@ Header.propTypes = {
 const mapStateToProps = (state) => ({ settings: state.settings });
 const mapDispatchToProps = (dispatch) => ({
 	actions: bindActionCreators(actions, dispatch),
+	tokenNull: () => dispatch({ type: "SET_TOKEN", payload: null }),
 });
 
 export default connect(mapStateToProps, mapDispatchToProps)(Header);

+ 1 - 1
components/Layout/Sidebar.js

@@ -148,7 +148,7 @@ class Sidebar extends Component {
 	async componentDidMount() {
 		// const user = await getUser();
 		const user = this.props.user;
-		this.menu = user.peran[0].peran.id === 2022 ? MenuPT : user.peran[0].peran.id === 2021 ? MenuLLDIKTI : Menu;
+		this.menu = user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : Menu;
 		// prepare the flags to handle menu collapsed states
 		this.buildCollapseList();
 

+ 2 - 3
components/Layout/SidebarUserBlock.js

@@ -8,13 +8,12 @@ class SidebarUserBlock extends Component {
 	state = {
 		showUserBlock: true,
 		user: {},
-		role: "",
+		role: {},
 	};
 
 	async componentDidMount() {
-		// const user = await getUser();
 		const user = this.props.user;
-		this.setState({ user, role: user.peran[0].peran });
+		this.setState({ user, role: user.role });
 	}
 
 	componentDidUpdate(oldProps) {

+ 17 - 21
components/Main/DetailLaporan.js

@@ -3,49 +3,45 @@ import Scrollable from "@/components/Common/Scrollable";
 import moment from "moment";
 import { Col, FormGroup } from "reactstrap";
 import { useSelector } from "react-redux";
-import { getPT } from "@/actions/PT";
-import { API_URL } from "@/env";
 
 function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 	const user = useSelector((state) => state.user);
 
 	return (
 		<>
-			{(!data.user_id.isPrivate || user.peran[0].peran.id === 2020) && (
+			{(!data.user.isPrivate || user.role.id === 2020) && (
 				<>
-					{noTitle ? "" : <p className="lead bb">Identitas Pelapor - {data.user_id.isPublic ? "Umum" : "Internal"}</p>}
+					{noTitle ? "" : <p className="lead bb">Identitas Pelapor - {data.user.isPublic ? "Umum" : "Internal"}</p>}
 					<FormGroup row>
 						<Col md="4">Nama Pelapor:</Col>
 						<Col md="8">
-							<strong>{data.user_id.nama}</strong>
+							<strong>{data.user.nama}</strong>
 						</Col>
 					</FormGroup>
 					<FormGroup row>
 						<Col md="4">Nomor yang dapat dihubungi:</Col>
 						<Col md="8">
-							<strong>{data.user_id.no_hp}</strong>
+							<strong>{data.user.no_hp}</strong>
 						</Col>
 					</FormGroup>
 					<FormGroup row>
 						<Col md="4">Email:</Col>
 						<Col md="8">
-							<strong>{data.user_id.email}</strong>
+							<strong>{data.user.email}</strong>
 						</Col>
 					</FormGroup>
 
-					{data.user_id.isPublic && (
+					{data.user.isPublic && (
 						<>
 							<FormGroup row>
 								<Col md="4">Alamat:</Col>
 								<Col md="8">
-									<strong>{data.user_id.alamat}</strong>
+									<strong>{data.user.alamat}</strong>
 								</Col>
 							</FormGroup>
 							<FormGroup row>
 								<Col md="4">Foto Kartu Identitas:</Col>
-								<Col md="8">
-									<img src={API_URL + data.user_id.files[0].path} height={200} alt="Foto Identitas" />
-								</Col>
+								<Col md="8">{/* <img src={API_URL + data.user_id.files[0].path} height={200} alt="Foto Identitas" /> */}</Col>
 							</FormGroup>
 						</>
 					)}
@@ -56,7 +52,7 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 				<FormGroup row>
 					<Col md="4">Nomor Laporan:</Col>
 					<Col md="8">
-						<strong>{data._number}</strong>
+						<strong>{data.no_laporan}</strong>
 					</Col>
 				</FormGroup>
 				<FormGroup row>
@@ -81,7 +77,7 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 					<Col md="4">Keterangan Laporan:</Col>
 					<Col md="8">
 						<Scrollable height="100px" className="list-group">
-							<p>{data.description}</p>
+							<p>{data.keterangan}</p>
 						</Scrollable>
 					</Col>
 				</FormGroup>
@@ -91,30 +87,30 @@ function DetailLaporan({ data, noTitle = false, noStatus = false }) {
 						<strong>{moment(data.createdAt).format("D MMMM YYYY")}</strong>
 					</Col>
 				</FormGroup>
-				{!noStatus && data.status ? (
+				{/* {!noStatus && data.status ? (
 					<FormGroup row>
 						<Col md="4">Status:</Col>
 						<Col md="8">
-							<div className="badge badge-info">{data.status}</div>
+							<div className="badge badge-info">{data.role_data}</div>
 						</Col>
 					</FormGroup>
 				) : (
 					""
-				)}
+				)} */}
 				<FormGroup row>
-					<Col md="4">File Pendukung:</Col>
+					<Col md="4">Dokumen Pendukung:</Col>
 					<Col md="8">
 						<Scrollable height="120px" className="list-group">
 							<table className="table table-bordered bg-transparent">
 								<tbody>
-									{data.files.map((e, index) => (
+									{data.dokumen.map((e, index) => (
 										<tr key={`files-${index}`}>
 											<td>
 												<em className="fa-lg far fa-file-code"></em>
 											</td>
 											<td>
-												<a className="text-muted" href={API_URL + e.path} target="_blank" download={e.name}>
-													{e.name}
+												<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+													{e.judul}
 												</a>
 											</td>
 										</tr>

+ 23 - 28
components/Main/Login.js

@@ -46,42 +46,36 @@ class Login extends Component {
 	};
 
 	onSubmit = async (e) => {
-		const form = e.target;
-		const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));
+		try {
+			const form = e.target;
+			const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));
 
-		const { errors, hasError } = FormValidator.bulkValidate(inputs);
+			const { errors, hasError } = FormValidator.bulkValidate(inputs);
 
-		this.setState({
-			[form.name]: {
-				...this.state[form.name],
-				errors,
-			},
-		});
+			this.setState({
+				[form.name]: {
+					...this.state[form.name],
+					errors,
+				},
+			});
 
-		console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
-		e.preventDefault();
-		if (!hasError) {
-			const { username, password } = this.state.formLogin;
-			const auth = await login(username, password);
-			if (auth.success) {
-				axiosAPI.defaults.headers.Authorization = `Bearer ${auth.access_token}`;
-				const dataUser = await getUser();
-				this.props.setUser(dataUser.data);
-				if (dataUser.data.peran[0].peran.id === 2022) {
-					const org_id = dataUser.data.peran[0].organisasi.id;
-					const pt = await getPT({ id: org_id });
-					if (pt?.success) {
-						this.props.setPT(pt.data);
-					}
-					Router.push({ pathname: "/app/pt/pemantauan" });
+			console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
+			e.preventDefault();
+			if (!hasError) {
+				const { username, password } = this.state.formLogin;
+				const auth = await login(username, password);
+				this.props.setToken(auth.data.token);
+				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" });
 				} else {
 					Router.push({ pathname: "/app/pemantauan" });
 				}
-			} else {
-				this.setState({ error: auth.message || auth.error });
 			}
+		} catch (error) {
+			this.setState({ error: error.response.data.message || error.response });
 		}
-		// e.preventDefault();
 	};
 
 	/* Simplify error check */
@@ -132,6 +126,7 @@ class Login extends Component {
 const mapStateToProps = (state) => ({ user: state.user });
 const mapDispatchToProps = (dispatch) => ({
 	setUser: (payload) => dispatch({ type: "SET_USER", payload }),
+	setToken: (payload) => dispatch({ type: "SET_TOKEN", payload }),
 	setPT: (payload) => dispatch({ type: "SET_PT", payload }),
 });
 

+ 5 - 5
components/Main/TableLaporan.js

@@ -24,32 +24,32 @@ function TableLaporan({ listData, to, linkName, status = false, noBy = false })
 								{listData.map((data) => {
 									return (
 										<tr key={data._id}>
-											<td>{data._number}</td>
+											<td>{data.no_laporan}</td>
 											<td className="text-nowrap">
 												<div className="media align-items-center">
 													<div className="media-body d-flex">
 														<div>
 															<h4 className="m-0">{data.pt.nama}</h4>
-															<p>{data.description.length > 35 ? data.description.substring(0, 35) + "..." : data.description}</p>
+															<p>{data.keterangan.length > 35 ? data.keterangan.substring(0, 35) + "..." : data.keterangan}</p>
 														</div>
 													</div>
 												</div>
 											</td>
 											{status ? (
 												<td>
-													<div className="badge badge-info">{data.status}</div>
+													<div className="badge badge-info">{data.role_data}</div>
 												</td>
 											) : (
 												""
 											)}
-											{!noBy && <td>{data.user_id.isPrivate ? "" : data.user_id.nama}</td>}
+											{!noBy && <td>{data.user.isPrivate ? "" : data.user.nama}</td>}
 											<td>{moment(data.createdAt).fromNow()}</td>
 											<td>
 												<div className="ml-auto">
 													<Link
 														href={{
 															pathname: to,
-															query: { ptId: data.pt_id, number: data._number },
+															query: { id: data._id },
 														}}
 													>
 														<Button color="primary" size="sm">

+ 11 - 7
components/Main/Timeline.js

@@ -22,24 +22,28 @@ function Timeline({ data, noFile = false }) {
 											<div className="arrow"></div>
 											<div className="popover-body">
 												<div className="d-flex align-items-center mb-3">
-													<img className="mr-3 rounded-circle thumb48" src={`/static/img${data.role === "PT" ? "/univ-avatar.png" : data.role === "UMUM" ? "/user/user.png" : "/logo-single.png"}`} alt="Avatar" />
+													<img
+														className="mr-3 rounded-circle thumb48"
+														src={`/static/img${data.user.role.id === "2022" ? "/univ-avatar.png" : data.user.role.id === "2023" ? "/user/user.png" : "/logo-single.png"}`}
+														alt="Avatar"
+													/>
 													<p className="m-0">
-														<strong>{data.role_name}</strong>
+														<strong>{data.user.nama}</strong>
 														<br />
-														{data.description}
+														{data.keterangan}
 														<br />
 														<p className="text-muted">{moment(data.createdAt).format("hh:mm")}</p>
 													</p>
 												</div>
-												{!noFile && data.files.length ? (
+												{!noFile && data.dokumen.length ? (
 													<>
 														<p className="text-muted my-2">Dokumen</p>
-														{data.files.map((e) => (
+														{data.dokumen.map((e) => (
 															<div className="media bb p-2">
 																<div className="media-body">
 																	<p className="m-0">
-																		<a href={API_URL + e.path} target="_blank" download={e.name}>
-																			<strong>{e.name}</strong>
+																		<a href={e.path} target="_blank" download={e.judul}>
+																			<strong>{e.judul}</strong>
 																		</a>
 																	</p>
 																</div>

+ 1 - 35
config/axios.js

@@ -1,43 +1,9 @@
 import axios from "axios";
-// import jwt_decode from "jwt-decode";
-// require("dotenv").config();
 import { API_URL } from "@/env";
 
 const axiosAPI = axios.create({
-	baseURL: API_URL || "http://localhost:5000",
+	baseURL: API_URL || "http://localhost:5000/v1",
 	withCredentials: true,
 });
 
-// axiosJWT.interceptors.request.use(
-// 	async (config) => {
-// 		// const response = await refreshToken();
-// 		// const decoded = jwt_decode(response.access_token);
-// 		// const expire = decoded.exp;
-// 		// const currentDate = Date.now();
-// 		// if (expire * 1000 < currentDate) {
-// 		const response = await refreshToken();
-// 		// console.log(response);
-// 		if (response.success) config.headers.Authorization = `Bearer ${response.access_token}`;
-// 		// config.withCredentials = true;
-// 		return config;
-// 		// }
-// 	},
-// 	async (error) => {
-// 		const originalConfig = err.config;
-// 		// if (error.response.status === 403 || error.response.status === 401) {
-// 		try {
-// 			const response = await refreshToken();
-// 			if (response.success) {
-// 				// axiosJWT.defaults.headers.Authorization = `Bearer ${response.access_token}`;
-// 				originalConfig.headers.Authorization = `Bearer ${response.access_token}`;
-// 				return axiosJWT(originalConfig);
-// 			}
-// 		} catch (error) {
-// 			return Promise.reject(error);
-// 		}
-// 		// }
-// 		return Promise.reject(error);
-// 	}
-// );
-
 export default axiosAPI;

+ 2 - 2
env.js

@@ -1,3 +1,3 @@
 // export const TOKEN=77aecfec-10ac-3b4f-ab59-3fbfbeed6324
-// export const API_URL = "http://localhost:5000";
-export const API_URL = "https://api.sidali.sixsenz.net";
+export const API_URL = "http://localhost:5000/v1";
+// export const API_URL = "https://api.sidali.sixsenz.net";

+ 8 - 5
pages/app/pelaporan/detail.js

@@ -1,12 +1,13 @@
 import React, { Component } from "react";
 import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
-import { getPelaporan } from "@/actions/pelaporan";
+import { getOneLaporan } from "@/actions/pelaporan";
 import DetailLaporan from "@/components/Main/DetailLaporan";
 import Link from "next/link";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Card, CardBody } from "reactstrap";
 import Loader from "@/components/Common/Loader";
+import { connect } from "react-redux";
 
 class DetailPelaporan extends Component {
 	constructor(props) {
@@ -22,12 +23,13 @@ class DetailPelaporan extends Component {
 
 	componentDidMount = async () => {
 		const { query } = this.props;
-		const pelaporan = await getPelaporan({ ptId: query.ptId, number: query.number });
+		const pelaporan = await getOneLaporan(this.props.token, query.id);
 		this.setState({ pelaporan });
 	};
 
 	render() {
 		const { pelaporan } = this.state;
+		console.log(pelaporan);
 		return (
 			<ContentWrapper unwrap>
 				{/* <Header /> */}
@@ -46,7 +48,7 @@ class DetailPelaporan extends Component {
 								<Card className="card-default">
 									<CardBody>
 										<Row>
-											<Col lg={12}>{<DetailLaporan data={pelaporan.data[0]} />}</Col>
+											<Col lg={12}>{<DetailLaporan data={pelaporan.data} />}</Col>
 										</Row>
 									</CardBody>
 								</Card>
@@ -54,7 +56,7 @@ class DetailPelaporan extends Component {
 								<Loader />
 							)}
 						</Col>
-						<Col xl="3">{pelaporan.data ? <DetailPT data={pelaporan.data[0].pt} /> : <Loader />}</Col>
+						<Col xl="3">{pelaporan.data ? <DetailPT data={pelaporan.data.pt} /> : <Loader />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -62,4 +64,5 @@ class DetailPelaporan extends Component {
 	}
 }
 
-export default DetailPelaporan;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(DetailPelaporan);

+ 2 - 5
pages/app/pelaporan/index.js

@@ -17,10 +17,7 @@ class Pelaporan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { organisasi, peran } = this.props.user.peran[0];
-		const query = { role: peran.id === 2021 ? "lldikti" : "dikti" };
-		if (peran.id === 2021) query.orgId = organisasi.id;
-		const pelaporan = await getPelaporan(query);
+		const pelaporan = await getPelaporan(this.props.token);
 		this.setState({ pelaporan });
 	};
 
@@ -49,5 +46,5 @@ class Pelaporan extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Pelaporan);

+ 7 - 6
pages/app/pelaporan/new.js

@@ -3,8 +3,8 @@ import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
 import InputData from "@/components/Pelaporan/InputData";
 import Link from "next/link";
-import { getPT } from "@/actions/PT";
-
+import { getOnePT } from "@/actions/PT";
+import { connect } from "react-redux";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Card, CardHeader, CardBody } from "reactstrap";
 import Loader from "@/components/Common/Loader";
@@ -22,8 +22,8 @@ class PelaporanNew extends Component {
 	};
 
 	componentDidMount = async () => {
-		const { query } = this.props;
-		const pt = await getPT({ id: query.ptId });
+		const { query, token } = this.props;
+		const pt = await getOnePT(token, query.ptId);
 		this.setState({ pt });
 	};
 
@@ -57,7 +57,7 @@ class PelaporanNew extends Component {
 								</CardBody>
 							</Card>
 						</Col>
-						<Col xl="3">{pt?.data ? <DetailPT data={pt.data[0]} /> : <Loader />}</Col>
+						<Col xl="3">{pt?.data ? <DetailPT data={pt.data} /> : <Loader />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -65,4 +65,5 @@ class PelaporanNew extends Component {
 	}
 }
 
-export default PelaporanNew;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(PelaporanNew);

+ 8 - 8
pages/app/pelaporan/search.js

@@ -19,7 +19,7 @@ class Search extends Component {
 	};
 
 	componentDidMount = async () => {
-		const dataPembina = await getPembina();
+		const dataPembina = await getPembina(this.props.token);
 		this.setState({ pembina: dataPembina.data });
 	};
 
@@ -51,9 +51,9 @@ class Search extends Component {
 	};
 
 	fetchData = async () => {
-		const pembina = this.props.user.peran[0].peran.id === 2021 ? this.props.user.peran[0].organisasi.id : this.state.selectedOptionMulti.join(",");
+		const pembina = this.props.user.role.id === 2021 ? this.props.user.lembaga.id : this.state.selectedOptionMulti.map((e) => e.value).join(",");
 		const searchValue = document.getElementById("searchInput").value;
-		const jsonData = await getPT({ search: searchValue, pembina });
+		const jsonData = await getPT(this.props.token, { search: searchValue, pembina });
 		this.setState({ data: jsonData.data });
 	};
 
@@ -92,7 +92,7 @@ class Search extends Component {
 											{pt.sk_pendirian} - {pt.website} - {pt.email}
 										</small>
 										<p>{pt.alamat.jalan}</p>
-										{this.props.user.peran[0].peran.id === 2021 ? "" : <p>Pembina: {pt.pembina.nama}</p>}
+										{this.props.user.role.id === 2021 ? "" : <p>Pembina: {pt.pembina.nama}</p>}
 									</div>
 									<div className="ml-auto">
 										<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
@@ -124,14 +124,14 @@ class Search extends Component {
 					</div>
 				</div>
 				<Row>
-					<Col lg={this.props.user.peran[0].peran.id === 2021 ? 12 : 9}>
+					<Col lg={this.props.user.role.id === 2021 ? 12 : 9}>
 						<div className="form-group mb-4">
 							<input className="form-control mb-2" type="text" id="searchInput" placeholder="Pencarian Nama Perguruan Tinggi" />
 							<div className="d-flex">
 								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
 									Search
 								</button>
-								<div className="ml-auto">{this.props.user.peran[0].peran.id === 2021 && `Pembina: ${this.props.user.peran[0].organisasi.nama}`}</div>
+								<div className="ml-auto">{this.props.user.role.id === 2021 && `Pembina: ${this.props.user.lembaga.nama}`}</div>
 							</div>
 						</div>
 						<div className="card card-default">
@@ -150,7 +150,7 @@ class Search extends Component {
 							</div>
 						</div>
 					</Col>
-					{this.props.user.peran[0].peran.id === 2021 ? (
+					{this.props.user.role.id === 2021 ? (
 						""
 					) : (
 						<Col lg="3">
@@ -171,5 +171,5 @@ class Search extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Search);

+ 9 - 9
pages/app/pemantauan/index.js

@@ -18,7 +18,7 @@ class Search extends Component {
 	};
 
 	componentDidMount = async () => {
-		const dataPembina = await getPembina();
+		const dataPembina = await getPembina(this.props.token);
 		if (dataPembina) this.setState({ pembina: dataPembina.data });
 	};
 
@@ -50,9 +50,9 @@ class Search extends Component {
 	};
 
 	fetchData = async () => {
-		const pembina = this.props.user.peran[0].peran.id === 2021 ? this.props.user.peran[0].organisasi.id : this.state.selectedOptionMulti.join(",");
+		const pembina = this.props.user.role.id === 2021 ? null : this.state.selectedOptionMulti.map((e) => e.value).join(",");
 		const searchValue = document.getElementById("searchInput").value;
-		const jsonData = await getPT({ search: searchValue, pembina });
+		const jsonData = await getPT(this.props.token, { search: searchValue, pembina });
 		this.setState({ data: jsonData.data ? jsonData.data : [] });
 	};
 
@@ -75,7 +75,7 @@ class Search extends Component {
 			this.state.data &&
 			this.state.data.map((pt, index) => {
 				return (
-					<tr>
+					<tr key={index}>
 						<td>
 							<label>{index + 1}</label>
 						</td>
@@ -91,7 +91,7 @@ class Search extends Component {
 											{pt.sk_pendirian} - {pt.website} - {pt.email}
 										</small>
 										<p>{pt.alamat.jalan}</p>
-										{this.props.user.peran[0].peran.id === 2021 ? "" : <p>Pembina: {pt.pembina.nama}</p>}
+										{this.props.user.role.id === 2021 ? "" : <p>Pembina: {pt.pembina.nama}</p>}
 									</div>
 									<div className="ml-auto">
 										<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
@@ -118,14 +118,14 @@ class Search extends Component {
 					</div>
 				</div>
 				<Row>
-					<Col lg={this.props.user.peran[0].peran.id === 2021 ? 12 : 9}>
+					<Col lg={this.props.user.role.id === 2021 ? 12 : 9}>
 						<div className="form-group mb-4">
 							<input className="form-control mb-2" type="text" id="searchInput" placeholder="Pencarian Nama Perguruan Tinggi" />
 							<div className="d-flex">
 								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
 									Search
 								</button>
-								<div className="ml-auto">{this.props.user.peran[0].peran.id === 2021 && `Pembina: ${this.props.user.peran[0].organisasi.nama}`}</div>
+								<div className="ml-auto">{this.props.user.role.id === 2021 && `Pembina: ${this.props.user.lembaga.nama}`}</div>
 							</div>
 						</div>
 						{/* START card */}
@@ -148,7 +148,7 @@ class Search extends Component {
 						</div>
 						{/* END card */}
 					</Col>
-					{this.props.user.peran[0].peran.id === 2021 ? (
+					{this.props.user.role.id === 2021 ? (
 						""
 					) : (
 						<Col lg="3">
@@ -169,5 +169,5 @@ class Search extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Search);

+ 9 - 7
pages/app/pemantauan/timeline.js

@@ -5,9 +5,10 @@ import DetailPT from "@/components/Main/DetailPT";
 import { getLog } from "@/actions/log";
 import { Row, Col } from "reactstrap";
 import Timeline from "@/components/Main/Timeline";
-import { getPT } from "@/actions/PT";
+import { getOnePT } from "@/actions/PT";
 import Link from "next/link";
 import Loader from "@/components/Common/Loader";
+import { connect } from "react-redux";
 
 class Pemantauan extends Component {
 	constructor(props) {
@@ -23,10 +24,10 @@ class Pemantauan extends Component {
 	}
 
 	componentDidMount = async () => {
-		const { query } = this.props;
-		const log = await getLog({ ptId: query.ptId });
+		const { query, token } = this.props;
+		const log = await getLog(token, query.ptId);
 		this.setState({ log });
-		const pt = await getPT({ id: query.ptId });
+		const pt = await getOnePT(token, query.ptId);
 		this.setState({ pt });
 	};
 
@@ -37,7 +38,7 @@ class Pemantauan extends Component {
 			<ContentWrapper unwrap>
 				<div className="p-3">
 					<div className="content-heading">
-						<div>Pemantauan {pt?.data && pt.data[0].nama}</div>
+						<div>Pemantauan {pt?.data && pt.data.nama}</div>
 						<div className="ml-auto">
 							<Link href="/app/pemantauan">
 								<button className="btn btn-sm btn-secondary text-sm">&lt; back</button>
@@ -46,7 +47,7 @@ class Pemantauan extends Component {
 					</div>
 					<Row>
 						<Col xl="9">{log?.data ? <Timeline data={log.data} /> : <Loader />}</Col>
-						<Col xl="3">{pt?.data ? <DetailPT data={pt.data[0]} /> : <Loader />}</Col>
+						<Col xl="3">{pt?.data ? <DetailPT data={pt.data} /> : <Loader />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -54,4 +55,5 @@ class Pemantauan extends Component {
 	}
 }
 
-export default Pemantauan;
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
+export default connect(mapStateToProps)(Pemantauan);

+ 0 - 0
pages/app/pt/dokumen-perbaikan/detail.js → pages/pt/dokumen-perbaikan/detail.js


+ 0 - 0
pages/app/pt/dokumen-perbaikan/index.js → pages/pt/dokumen-perbaikan/index.js


+ 0 - 0
pages/app/pt/jawaban-banding/detail.js → pages/pt/jawaban-banding/detail.js


+ 0 - 0
pages/app/pt/jawaban-banding/index.js → pages/pt/jawaban-banding/index.js


+ 0 - 0
pages/app/pt/jawaban-keberatan/detail.js → pages/pt/jawaban-keberatan/detail.js


+ 0 - 0
pages/app/pt/jawaban-keberatan/index.js → pages/pt/jawaban-keberatan/index.js


+ 0 - 0
pages/app/pt/jawaban-pencabutan-sanksi/detail.js → pages/pt/jawaban-pencabutan-sanksi/detail.js


+ 0 - 0
pages/app/pt/jawaban-pencabutan-sanksi/index.js → pages/pt/jawaban-pencabutan-sanksi/index.js


+ 0 - 0
pages/app/pt/keberatan/detail.js → pages/pt/keberatan/detail.js


+ 0 - 0
pages/app/pt/keberatan/index.js → pages/pt/keberatan/index.js


+ 13 - 17
pages/app/pt/pemantauan.js → pages/pt/pemantauan.js

@@ -2,7 +2,8 @@ import React, { Component } from "react";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import Header from "@/components/Main/Header";
 import DetailPT from "@/components/Main/DetailPT";
-import { getLog } from "@/actions/log";
+import { getLogPT } from "@/actions/log";
+import { getPT } from "@/actions/PT";
 import { getPelaporan } from "@/actions/pelaporan";
 import { Row, Col } from "reactstrap";
 import Timeline from "@/components/PT/Timeline";
@@ -14,32 +15,27 @@ class Pemantauan extends Component {
 		super(props);
 		this.state = {
 			log: [],
-			pelaporan: {},
+			pt: {},
 		};
 	}
 
 	componentDidMount = async () => {
-		const { user } = this.props;
-		const log = await getLog({ ptId: user.peran[0].organisasi.id, isPT: true });
-		const pelaporan = await getPelaporan({ ptId: user.peran[0].organisasi.id });
-		this.setState({ log, pelaporan });
+		const { token } = this.props;
+		// const log = await getLogPT(token);
+		const pt = await getPT(token);
+		// const pelaporan = await getPelaporan({ ptId: user.peran[0].organisasi.id });
+		this.setState({ pt });
 	};
 
 	render() {
-		const { log, pelaporan } = this.state;
+		const { log, pt } = this.state;
 		return (
 			<ContentWrapper unwrap>
-				<Header data={this.props.pt[0]} />
+				{pt?.data ? <Header data={pt.data} /> : <Loader />}
 				<div className="p-3">
 					<Row>
-						{log && pelaporan.data ? (
-							<Col xl="9">
-								<Timeline data={log} dataPelaporan={pelaporan.data[0]} />
-							</Col>
-						) : (
-							<Loader />
-						)}
-						<Col xl="3">{this.props.pt && <DetailPT data={this.props.pt[0]} />}</Col>
+						{/* {log && pelaporan.data ? <Col xl="9"><Timeline data={log} /></Col> : <Loader />} */}
+						<Col xl="3">{pt.data && <DetailPT data={pt.data} />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -47,5 +43,5 @@ class Pemantauan extends Component {
 	}
 }
 
-const mapStateToProps = (state) => ({ user: state.user, pt: state.pt });
+const mapStateToProps = (state) => ({ user: state.user, token: state.token });
 export default connect(mapStateToProps)(Pemantauan);

+ 0 - 0
pages/app/pt/pencabutan-sanksi/detail.js → pages/pt/pencabutan-sanksi/detail.js


+ 0 - 0
pages/app/pt/pencabutan-sanksi/index.js → pages/pt/pencabutan-sanksi/index.js


+ 11 - 0
store/actions/token.js

@@ -0,0 +1,11 @@
+export const LOGIN_SUCCESS = "LOGIN_SUCCESS";
+export const LOGIN_FAIL = "LOGIN_FAIL";
+
+
+export const login = (username, password) => (dispatch) => {
+	let data = dataUser.filter((value) => value.username === username && value.password === password);
+	if (!data.length) dispatch({ type: LOGIN_FAIL });
+	data = data[0];
+	localStorage.setItem("userInfo", JSON.stringify(data));
+	dispatch({ type: LOGIN_SUCCESS, payload: data });
+};

+ 0 - 1
store/actions/user.js

@@ -1,7 +1,6 @@
 export const LOGIN_SUCCESS = "LOGIN_SUCCESS";
 export const LOGIN_FAIL = "LOGIN_FAIL";
 
-import dataUser from "@/json/dataUser";
 
 export const login = (username, password) => (dispatch) => {
 	let data = dataUser.filter((value) => value.username === username && value.password === password);

+ 2 - 0
store/reducers/reducers.js

@@ -7,6 +7,7 @@ import { pelaporanListReducer, pelaporanCreateReducer } from "./pelaporan.reduce
 import { penjadwalanCreateReducer } from "./penjadwalan.reducers.js";
 import { userReducer } from "./user.reducer";
 import { ptReducer } from "./pt.reducer";
+import { tokenReducer } from "./token.reducer";
 
 export default combineReducers({
 	settings: settingsReducer,
@@ -17,4 +18,5 @@ export default combineReducers({
 	penjadwalanAdd: penjadwalanCreateReducer,
 	user: userReducer,
 	pt: ptReducer,
+	token: tokenReducer,
 });

+ 8 - 0
store/reducers/token.reducer.js

@@ -0,0 +1,8 @@
+export const tokenReducer = (state = {}, action) => {
+	switch (action.type) {
+		case "SET_TOKEN":
+			return (state = action.payload);
+		default:
+			return state;
+	}
+};