From 8bbfbf698d5de1a6ab6282d785f6b0f8d4f46951 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Mon, 8 Jul 2024 11:58:49 +0700 Subject: [PATCH 01/10] chagne icon --- src/app/favicon.ico | Bin 1307 -> 6439 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 91e6db8b32c40a7d75f68e01bd0d48c0671a89de..a22a1990b8017ae96e61e2b6329afabbf39c3c8e 100644 GIT binary patch literal 6439 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 InfYh@2PPn6od5s; literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|Qe;fKP}kP{G2yzneP#ZSMRxGxf*PitiIbe)Wg` zm>BxEE96ak(9_=F@0|hfr$zkV)c$W`=)VT-*Zmv0R{!QS9+Jwab4hW`2g|G$CnMQdQ%nq3m)7YwA) z0FwYSvjCIh@fLa6#^df8r^30oLXQ2b`nJe~kfSTmvQ+gc-?RbT&|N#y2=JyD(Vq*YG3=~0nNqb;MA>UpID%YbfUO!9Vj zIo`|a6%Az1^K@|xu{fQau)sD!L`W?0h~7~ZEwyt;4rnN9s-Ep|K;xk| zH@mz}NodUo3AuXZd4_|?nQK=rU2_aPv}E=2e1mkpn1gR_wz(bSsGc#y$LH*`Gme1< zx9=Rf#I>sFrZ-z|hii_nDc^u0Rdzxbk{@lHSP`KR7UXX5-Op zJ*U>~{p;t~GsINg`{NMCwrv3`x43SbHYZ=Bw|?ZVoJtLAX7?LiQ&)$rZ`6#~&9|)j zZ(Hx|u$E#5(VV!Asjs)aeZf`s=FZmYqiG#YXREipxhpEzxkf>&>i)mG>}H2Wa_lxd zP4LNyvGH+qN(%b4@NT=gGEi`jYU^b!Q(f653JS`XXK81DpLq5Jmzn&@XK4u{=T4rD zo*o}?;>dyEk`m)pO=pkpIk4qmL{L=Nxg*C99EdOEiFH(E*N|dawTjiz#QkjA8?FR~ z?xv^^*3t~FSJF~}q9&%>6*Mz)v)?;RWMB2-&8xh-dv>y~SWsRZ|DT1=q;dgQU*}}C v{CP|v2Bo*YNJ?BvP&H2To820kc7c)MnHGysZLT9PC`oy``njxgN@xNAGuyJq From b0bbd80b768bc4c5c5c3d4b17e13040249008089 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Mon, 8 Jul 2024 11:58:57 +0700 Subject: [PATCH 02/10] change color --- src/configs/primaryColorConfig.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/configs/primaryColorConfig.js b/src/configs/primaryColorConfig.js index bb9ff6c..72445bf 100644 --- a/src/configs/primaryColorConfig.js +++ b/src/configs/primaryColorConfig.js @@ -2,9 +2,9 @@ const primaryColorConfig = [ { name: 'primary-1', - light: '#0A4EC3', - main: '#193695', - dark: '#034EB7' + light: '#0066FF', + main: '#0066FF', + dark: '#0066FF' } ] From 25743bebdc9e130be4b73af42d2cb0c6b6477f9d Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Mon, 8 Jul 2024 11:59:03 +0700 Subject: [PATCH 03/10] change cookie --- src/configs/themeConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/themeConfig.js b/src/configs/themeConfig.js index 53ac76e..27c680e 100644 --- a/src/configs/themeConfig.js +++ b/src/configs/themeConfig.js @@ -11,7 +11,7 @@ */ const themeConfig = { templateName: 'KASBON MANAGER', - settingsCookieName: 'materio-mui-next-free-demo', + settingsCookieName: 'kasbon-manager', mode: 'dark', // 'light', 'dark' layoutPadding: 24, // Common padding for header, content, footer layout components (in px) compactContentWidth: 1440, // in px From 5ef7ef1b7a2bb4ab000a123cd8dde164e4582f91 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:30:37 +0700 Subject: [PATCH 04/10] page change admin password --- src/app/api/reset-sandi/route.js | 55 +++++++++++++++++++ .../reset-password/resetpassword-admin.jsx | 15 +++++ 2 files changed, 70 insertions(+) create mode 100644 src/views/reset-password/resetpassword-admin.jsx diff --git a/src/app/api/reset-sandi/route.js b/src/app/api/reset-sandi/route.js index e69de29..e97b7e9 100644 --- a/src/app/api/reset-sandi/route.js +++ b/src/app/api/reset-sandi/route.js @@ -0,0 +1,55 @@ +// API Reset Password. Lokasi : /src/app/api/reset-sandi + +// API untuk reset password akun karyawan + +import { NextResponse } from "next/server" + +import bcrypt from 'bcrypt' + +import { getToken } from "next-auth/jwt" + +import prisma from "@/app/lib/prisma" + + +export const PUT = async (req) =>{ + const token = await getToken({req, secret: process.env.NEXTAUTH_SECRET}) + + console.log('Token: ', token) + + if(!token){ + console.log('Unauthorized Access : API Reset Sandi') + + return NextResponse.json({error:'Unauthorized Access'}, {status:401}) + } + + try{ + const {email, password} =await req.json() + + if(!email || !password){ + return NextResponse.json({error:"Data tidak boleh kosong!"}, {status:400}) + } + + const hashedPassword = await bcrypt.hash(password, 12) + + try{ + const user = await prisma.user.update({ + where: {email: email}, + data:{ + password: hashedPassword, + }, + }) + + return NextResponse.json({message:"Password Berhasil diganti", user }, {status:200}) + } + catch(error){ + console.error("Error memperbarui password :", error) + + return NextResponse.json({error:"Ada kesalahan ketika memperbarui Password"}, {status:500}) + } + }catch(error){ + console.error("Error tidak dapat parsing request body", error) + + return NextResponse.json({error: "Bad Request"}, {status:400}) + } +} + diff --git a/src/views/reset-password/resetpassword-admin.jsx b/src/views/reset-password/resetpassword-admin.jsx new file mode 100644 index 0000000..cb3cac0 --- /dev/null +++ b/src/views/reset-password/resetpassword-admin.jsx @@ -0,0 +1,15 @@ + + + +const ResetPasswordAdmin = () =>{ + + return( +
+ +
+ ) +} + +export default ResetPasswordAdmin + + From 8f8ae0bcf39179bfdff8c60898963be0e4296303 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:30:48 +0700 Subject: [PATCH 05/10] page reset karyawan password --- .../reset-password/resetpassword-karyawan.jsx | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/views/reset-password/resetpassword-karyawan.jsx diff --git a/src/views/reset-password/resetpassword-karyawan.jsx b/src/views/reset-password/resetpassword-karyawan.jsx new file mode 100644 index 0000000..64fd884 --- /dev/null +++ b/src/views/reset-password/resetpassword-karyawan.jsx @@ -0,0 +1,149 @@ +"use client" + +import { useState, useEffect, useRef } from 'react' + +import Card from '@mui/material/Card' +import Grid from '@mui/material/Grid' +import Button from '@mui/material/Button' +import TextField from '@mui/material/TextField' +import CardHeader from '@mui/material/CardHeader' +import CardContent from '@mui/material/CardContent' +import InputAdornment from '@mui/material/InputAdornment' +import Alert from '@mui/material/Alert' + +const ResetPasswordKaryawan = () => { + const [status, setStatus] = useState(null) + const [message, setMessage] = useState('') + const formRef = useRef(null) + + useEffect(() => { + if (status) { + const timer = setTimeout(() => { + setStatus(null) + setMessage('') + }, 5000) + + return () => clearTimeout(timer) + } + }, [status]) + + const handleSubmit = async (event) => { + event.preventDefault() + const data = new FormData(event.target) + + const email = data.get('email') + const password = data.get('password') + const konfirmasiPassword = data.get('konfirmasipassword') + + if (password !== konfirmasiPassword) { + setStatus('error') + setMessage('Password dan konfirmasi password tidak sama.') + formRef.current.reset() + + return + } + + const formData = { email, password } + + try { + const response = await fetch('/api/reset-sandi', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(formData), + }) + + const result = await response.json() + + if (response.ok) { + setStatus('success') + setMessage('Password berhasil diganti!') + formRef.current.reset() // Kosongkan form setelah berhasil diganti + } else { + setStatus('error') + setMessage(result.error || 'Terjadi kesalahan saat mengganti password.') + } + } catch (error) { + setStatus('error') + setMessage('Terjadi kesalahan saat mengganti password.') + } + } + + return ( +
+ + + + {status && ( + + {message} + + )} +
+ + + + + + ) + }} + /> + + + + + + ) + }} + /> + + + + + + ) + }} + /> + + + + + + +
+
+
+ ) +} + +export default ResetPasswordKaryawan From 4edb301ddf9fb6487b5a60b50742ec22601c857b Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:31:02 +0700 Subject: [PATCH 06/10] working API to change karyawan password --- .../dashboard/reset-password-akun/page.jsx | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/app/dashboard/reset-password-akun/page.jsx b/src/app/dashboard/reset-password-akun/page.jsx index d8e9be1..e214157 100644 --- a/src/app/dashboard/reset-password-akun/page.jsx +++ b/src/app/dashboard/reset-password-akun/page.jsx @@ -1,10 +1,37 @@ +'use client' +import { useEffect } from 'react' + +import { useRouter } from 'next/navigation' + +import { useSession } from 'next-auth/react' + +import ResetPasswordKaryawan from "@/views/reset-password/resetpassword-karyawan" const ResetPasswordAkun = () =>{ + const { data: session, status } = useSession() + const router = useRouter() + + useEffect(() => { + if (status === 'loading') return // Jangan lakukan apa pun saat sesi sedang dimuat + + if (!session) { + router.push('/error/401') + } + }, [session, status, router]) + + if (!session) { + return null + } + return(
- Halaman Reset Password Akun - +

Reset Password Akun

+
+
+ +
+
) } From f2131cd1e787d19b0f0f3073dfe137bf7fef8a79 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:50:23 +0700 Subject: [PATCH 07/10] update reset password karyawan --- src/views/reset-password/resetpassword-karyawan.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/reset-password/resetpassword-karyawan.jsx b/src/views/reset-password/resetpassword-karyawan.jsx index 64fd884..2a2a20e 100644 --- a/src/views/reset-password/resetpassword-karyawan.jsx +++ b/src/views/reset-password/resetpassword-karyawan.jsx @@ -58,7 +58,7 @@ const ResetPasswordKaryawan = () => { if (response.ok) { setStatus('success') - setMessage('Password berhasil diganti!') + setMessage('Password Karyawan berhasil diganti!') formRef.current.reset() // Kosongkan form setelah berhasil diganti } else { setStatus('error') From d63bae433b5619e5448cc47fea35bc80976e2b37 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:50:41 +0700 Subject: [PATCH 08/10] working page reset password admin --- .../reset-password/resetpassword-admin.jsx | 166 +++++++++++++++++- 1 file changed, 161 insertions(+), 5 deletions(-) diff --git a/src/views/reset-password/resetpassword-admin.jsx b/src/views/reset-password/resetpassword-admin.jsx index cb3cac0..0e85500 100644 --- a/src/views/reset-password/resetpassword-admin.jsx +++ b/src/views/reset-password/resetpassword-admin.jsx @@ -1,15 +1,171 @@ +"use client" +import { useState, useEffect, useRef } from 'react' +import Card from '@mui/material/Card' +import Grid from '@mui/material/Grid' +import Button from '@mui/material/Button' +import TextField from '@mui/material/TextField' +import CardHeader from '@mui/material/CardHeader' +import CardContent from '@mui/material/CardContent' +import InputAdornment from '@mui/material/InputAdornment' +import Alert from '@mui/material/Alert' -const ResetPasswordAdmin = () =>{ +const ResetPasswordAdmin = () => { + const [status, setStatus] = useState(null) + const [message, setMessage] = useState('') + const formRef = useRef(null) - return( -
+ useEffect(() => { + if (status) { + const timer = setTimeout(() => { + setStatus(null) + setMessage('') + }, 5000) + + return () => clearTimeout(timer) + } + }, [status]) + + const handleSubmit = async (event) => { + event.preventDefault() + const data = new FormData(event.target) + + const email = data.get('email') + const password = data.get('password') + const konfirmasiPassword = data.get('konfirmasipassword') + const masterKey = data.get('masterKey') + + if (password !== konfirmasiPassword) { + setStatus('error') + setMessage('Password dan konfirmasi password tidak sama.') + formRef.current.reset() + + return + } + + const formData = { email, password, masterKey } + try { + const response = await fetch('/api/reset-admin', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(formData), + }) + + const result = await response.json() + + if (response.ok) { + setStatus('success'); + setMessage('Password Admin berhasil diganti!'); + formRef.current.reset(); // Kosongkan form setelah berhasil diganti + } else if (response.status === 403) { + setStatus('error'); + setMessage('Master Key salah.'); + } else { + setStatus('error'); + setMessage(result.error || 'Terjadi kesalahan saat mengganti password.'); + } + } catch (error) { + setStatus('error'); + setMessage('Terjadi kesalahan saat mengganti password.'); + } + } + + return ( +
+ + + + {status && ( + + {message} + + )} +
+ + + + + + ) + }} + /> + + + + + + ) + }} + /> + + + + + + ) + }} + /> + +
+ + + + + ) + }} + /> + + + + +
+ +
+
) } export default ResetPasswordAdmin - - From f0e2a4881908aa7105b9cb2122f19c5dd8f7d0f8 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:50:56 +0700 Subject: [PATCH 09/10] working page reset password account --- src/app/dashboard/reset-password-akun/page.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/dashboard/reset-password-akun/page.jsx b/src/app/dashboard/reset-password-akun/page.jsx index e214157..f6d8a15 100644 --- a/src/app/dashboard/reset-password-akun/page.jsx +++ b/src/app/dashboard/reset-password-akun/page.jsx @@ -7,6 +7,8 @@ import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' import ResetPasswordKaryawan from "@/views/reset-password/resetpassword-karyawan" +import ResetPasswordAdmin from '@/views/reset-password/resetpassword-admin' + const ResetPasswordAkun = () =>{ const { data: session, status } = useSession() @@ -32,6 +34,9 @@ const ResetPasswordAkun = () =>{

+
+ +
) } From 7c0659c0125048f0327506a806971b1c7e4d58f4 Mon Sep 17 00:00:00 2001 From: Gesang Paudra J Date: Tue, 9 Jul 2024 11:51:08 +0700 Subject: [PATCH 10/10] Working API reset Password Admin --- src/app/api/reset-admin/route.js | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/app/api/reset-admin/route.js diff --git a/src/app/api/reset-admin/route.js b/src/app/api/reset-admin/route.js new file mode 100644 index 0000000..a1b8b1e --- /dev/null +++ b/src/app/api/reset-admin/route.js @@ -0,0 +1,60 @@ +// API Reset Password. Lokasi : /src/app/api/reset-sandi + +// API untuk reset password akun karyawan + +import { NextResponse } from "next/server" + +import bcrypt from 'bcrypt' + +import { getToken } from "next-auth/jwt" + +import prisma from "@/app/lib/prisma" + + +export const PUT = async (req) =>{ + const token = await getToken({req, secret: process.env.NEXTAUTH_SECRET}) + const resetKey = process.env.ADMIN_KEY + + console.log('Token: ', token) + + if(!token){ + console.log('Unauthorized Access : API Reset Sandi') + + return NextResponse.json({error:'Unauthorized Access'}, {status:401}) + } + + try{ + const {email, password, masterKey} =await req.json() + + if(!email || !password || !masterKey){ + return NextResponse.json({error:"Data tidak boleh kosong!"}, {status:400}) + } + + if (masterKey !== resetKey) { + return NextResponse.json({ error: "Master Key salah!" }, { status: 403 }); + } + + const hashedPassword = await bcrypt.hash(password, 12) + + try{ + const user = await prisma.user.update({ + where: {email: email}, + data:{ + password: hashedPassword, + }, + }) + + return NextResponse.json({message:"Password Berhasil diganti", user }, {status:200}) + } + catch(error){ + console.error("Error memperbarui password :", error) + + return NextResponse.json({error:"Ada kesalahan ketika memperbarui Password"}, {status:500}) + } + }catch(error){ + console.error("Error tidak dapat parsing request body", error) + + return NextResponse.json({error: "Bad Request"}, {status:400}) + } +} +