From daa5d87b0238c9ab93e8005f44337cb4954aecfa Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 11:27:47 +0800 Subject: [PATCH 1/6] upd: diskusi Deskripsi: - pembatasan user role - log user No Issues --- src/app/api/discussion/[id]/comment/route.ts | 9 ++++++++- src/app/api/discussion/[id]/route.ts | 14 ++++++++++++-- src/app/api/discussion/route.ts | 7 +++++++ src/module/discussion/ui/detail_discussion.tsx | 16 +++++++++++----- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/app/api/discussion/[id]/comment/route.ts b/src/app/api/discussion/[id]/comment/route.ts index 13089aa..338ef78 100644 --- a/src/app/api/discussion/[id]/comment/route.ts +++ b/src/app/api/discussion/[id]/comment/route.ts @@ -1,8 +1,9 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import { NextResponse } from "next/server"; -// CREATE COMENT BY ID +// CREATE COMENT BY ID KOMENTAR export async function POST(request: Request, context: { params: { id: string } }) { try { const user = await funGetUserByCookies() @@ -34,9 +35,15 @@ export async function POST(request: Request, context: { params: { id: string } } comment: comment, idDisscussion: id, createdBy: user.id + }, + select: { + id: true } }) + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User menambah komentar pada diskusi', table: 'divisionDisscussionComment', data: data.id }) + return NextResponse.json({ success: true, message: "Berhasil menambah komentar", data: data, }, { status: 200 }); } catch (error) { diff --git a/src/app/api/discussion/[id]/route.ts b/src/app/api/discussion/[id]/route.ts index 00d0936..bbd9246 100644 --- a/src/app/api/discussion/[id]/route.ts +++ b/src/app/api/discussion/[id]/route.ts @@ -1,6 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; -import { stat } from "fs"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import moment from "moment"; import "moment/locale/id"; @@ -95,7 +95,7 @@ export async function GET(request: Request, context: { params: { id: string } }) } -// ONE OR CLOSE DISCUSSION +// OPEN OR CLOSE DISCUSSION export async function DELETE(request: Request, context: { params: { id: string } }) { try { const user = await funGetUserByCookies() @@ -131,6 +131,10 @@ export async function DELETE(request: Request, context: { params: { id: string } status: newStatus } }); + + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate status diskusi', table: 'divisionDisscussion', data: id }) + return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 }); } catch (error) { @@ -167,6 +171,9 @@ export async function PUT(request: Request, context: { params: { id: string } }) isActive: false } }); + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus data diskusi', table: 'divisionDisscussion', data: id }) + return NextResponse.json({ success: true, message: "Berhasil menghapus diskusi" }, { status: 200 }); } catch (error) { console.error(error); @@ -203,6 +210,9 @@ export async function POST(request: Request, context: { params: { id: string } } desc: desc } }); + + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data diskusi', table: 'divisionDisscussion', data: id }) return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 }); } catch (error) { diff --git a/src/app/api/discussion/route.ts b/src/app/api/discussion/route.ts index 46e9be1..c00992d 100644 --- a/src/app/api/discussion/route.ts +++ b/src/app/api/discussion/route.ts @@ -4,6 +4,7 @@ import _ from "lodash"; import moment from "moment"; import { NextResponse } from "next/server"; import "moment/locale/id"; +import { createLogUser } from "@/module/user"; // GET ALL DISCUSSION DIVISION ACTIVE = TRUE @@ -116,8 +117,14 @@ export async function POST(request: Request) { desc, createdBy: user.id }, + select: { + id: true + } }); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data diskusi', table: 'divisionDisscussion', data: data.id }) + return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi", data, }, { status: 200 }); } catch (error) { console.error(error); diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index ee87f58..d92d028 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -52,19 +52,25 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv getData() }, [refresh.get()]) + async function reloadData() { + try { + const response = await funGetDiscussionById(id) + setData(response.data) + } catch (error) { + console.error(error) + } + } + const sendComent = async () => { try { if (isComent.trim() == "") { return toast.error("Masukkan Komentar Anda") } - const response = await funCreateComent(id, { - comment: isComent, - idDiscussion: param.detail - }) + const response = await funCreateComent(id, { comment: isComent, idDiscussion: param.detail }) if (response.success) { setIsComent("") - getData() + reloadData() } else { toast.error(response.message) } From fc64f53edeeb9eb7a4345072f3f3f8e00d2fae4b Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 11:32:43 +0800 Subject: [PATCH 2/6] upd: grup Deskripsi: - log user pada seluruh API NO Issues --- src/app/api/group/[id]/route.ts | 27 +++++++++++---------------- src/app/api/group/route.ts | 8 ++++++++ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/app/api/group/[id]/route.ts b/src/app/api/group/[id]/route.ts index a3a23ec..2c9652f 100644 --- a/src/app/api/group/[id]/route.ts +++ b/src/app/api/group/[id]/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import { NextResponse } from "next/server"; export const dynamic = 'force-dynamic' @@ -75,14 +76,11 @@ export async function DELETE(request: Request, context: { params: { id: string } }, }); - return NextResponse.json( - { - success: true, - message: "Grup berhasil diedit", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengedit status data grup', table: 'group', data: id }) + + return NextResponse.json( { success: true, message: "Grup berhasil diedit", data, }, { status: 200 } ); + } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -123,14 +121,11 @@ export async function PUT(request: Request, context: { params: { id: string } }) }, }); - return NextResponse.json( - { - success: true, - message: "Grup berhasil diedit", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengedit data grup', table: 'group', data: id }) + + return NextResponse.json( { success: true, message: "Grup berhasil diedit", data, }, { status: 200 } ); + } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/app/api/group/route.ts b/src/app/api/group/route.ts index 4987ff4..7a6c886 100644 --- a/src/app/api/group/route.ts +++ b/src/app/api/group/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import { revalidatePath, revalidateTag } from "next/cache"; import { NextResponse } from "next/server"; @@ -56,6 +57,9 @@ export async function POST(request: Request) { name, idVillage: String(villaId) }, + select: { + id: true + } }); revalidatePath('/api/group?active=true', "page") @@ -63,6 +67,10 @@ export async function POST(request: Request) { revalidatePath('/group?active=true', 'page') revalidateTag('group') + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data grup', table: 'group', data: data.id }) + + return NextResponse.json({ success: true, message: "Berhasil menambahkan grup", data, }, { status: 200 }); } catch (error) { console.error(error); From 6a33333ecf57bf788b3a517abd9e0dc1b6362e1f Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 16:47:08 +0800 Subject: [PATCH 3/6] upd: diskusi Deskripsi: - role user - log user NO Issues --- src/app/api/discussion/[id]/route.ts | 3 ++- src/module/discussion/ui/detail_discussion.tsx | 14 ++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/app/api/discussion/[id]/route.ts b/src/app/api/discussion/[id]/route.ts index bbd9246..a87bcd3 100644 --- a/src/app/api/discussion/[id]/route.ts +++ b/src/app/api/discussion/[id]/route.ts @@ -68,10 +68,11 @@ export async function GET(request: Request, context: { params: { id: string } }) const username = data?.User.name const user_img = data?.User.img const createdAt = moment(data?.createdAt).format("ll") + const isCreator = data?.createdBy == user.id - const result = { ...userMember, username, createdAt, user_img } + const result = { ...userMember, username, createdAt, user_img, isCreator } const omitData = _.omit(result, ["User"]) diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index d92d028..4215192 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -3,7 +3,6 @@ import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Inp import { globalRole, LayoutDrawer, LayoutNavbarNew, SkeletonDetailDiscussionComment, SkeletonDetailDiscussionMember, SkeletonSingle, WARNA } from "@/module/_global"; import { GrChatOption } from "react-icons/gr"; import { LuSendHorizonal } from "react-icons/lu"; -import NavbarDetailDiscussion from "@/module/discussion/ui/navbar_detail_discussion"; import { useState } from "react"; import { funCreateComent, funGetAllDiscussion, funGetDiscussionById } from "../lib/api_discussion"; import { useShallowEffect } from "@mantine/hooks"; @@ -16,8 +15,7 @@ import { useHookstate } from "@hookstate/core"; import { globalRefreshDiscussion } from "../lib/val_discussion"; import { HiMenu } from "react-icons/hi"; import DrawerDetailDiscussion from "./drawer_detail_discussion"; -import { funGetUserByCookies } from "@/module/auth"; -import { funGetDivisionById } from "@/module/division_new"; +import {globalIsAdminDivision } from "@/module/division_new"; export default function DetailDiscussion({ id, idDivision }: { id: string, idDivision: string }) { const [isData, setData] = useState() @@ -27,20 +25,16 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv const router = useRouter() const refresh = useHookstate(globalRefreshDiscussion) const roleLogin = useHookstate(globalRole) - const [isAdmin, setAdmin] = useState(false) const [isCreator, setCreator] = useState(false) + const adminLogin = useHookstate(globalIsAdminDivision) const getData = async () => { try { setIsLoad(true) const response = await funGetDiscussionById(id) - const res = await funGetDivisionById(param.id); - const login = await funGetUserByCookies() - const cek = res.data.member.some((i: any) => i.idUser == login.id && i.isAdmin == true) - setAdmin(cek) setData(response.data) setIsLoad(false) - setCreator(response.data.createdBy == login.id) + setCreator(response.data.isCreator) } catch (error) { console.error(error) } finally { @@ -88,7 +82,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv {/* */} setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> From 6ba2c0fc796993ca356690c4efe03d5af0bcfc4f Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 16:48:25 +0800 Subject: [PATCH 4/6] upd: global admin Deskripsi: - variable global untuk task NO Issues --- .../(application)/division/[id]/layout.tsx | 12 ++++++ src/app/api/task/[id]/member/route.ts | 22 ++++------- src/app/api/task/[id]/route.ts | 38 ++++++++----------- src/app/api/task/detail/[id]/route.ts | 37 +++++++----------- src/app/api/task/file/[id]/route.ts | 15 +++----- src/app/api/task/route.ts | 4 ++ src/module/division_new/index.ts | 6 ++- src/module/division_new/lib/val_division.ts | 3 +- src/module/division_new/ui/wrap_division.tsx | 28 ++++++++++++++ 9 files changed, 94 insertions(+), 71 deletions(-) create mode 100644 src/app/(application)/division/[id]/layout.tsx create mode 100644 src/module/division_new/ui/wrap_division.tsx diff --git a/src/app/(application)/division/[id]/layout.tsx b/src/app/(application)/division/[id]/layout.tsx new file mode 100644 index 0000000..f6b429c --- /dev/null +++ b/src/app/(application)/division/[id]/layout.tsx @@ -0,0 +1,12 @@ +import { WrapLayoutDivision } from "@/module/division_new"; +import _ from "lodash" + +export default async function Layout({ children }: { children: React.ReactNode }) { + return ( + <> + + {children} + + + ); +} \ No newline at end of file diff --git a/src/app/api/task/[id]/member/route.ts b/src/app/api/task/[id]/member/route.ts index 5792e65..caf5f77 100644 --- a/src/app/api/task/[id]/member/route.ts +++ b/src/app/api/task/[id]/member/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -43,14 +44,11 @@ export async function POST(request: Request, context: { params: { id: string } } }) } + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User menambahkan anggota tugas divisi', table: 'divisionProject', data: id }) - return NextResponse.json( - { - success: true, - message: "Berhasil menambahkan anggota tugas", - }, - { status: 200 } - ); + + return NextResponse.json( { success: true, message: "Berhasil menambahkan anggota tugas", }, { status: 200 } ); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal menambah anggota tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -92,14 +90,10 @@ export async function DELETE(request: Request, context: { params: { id: string } } }) + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User mengeluarkan anggota dari tugas divisi', table: 'divisionProject', data: id }) - return NextResponse.json( - { - success: true, - message: "Berhasil mengeluarkan anggota", - }, - { status: 200 } - ); + return NextResponse.json( { success: true, message: "Berhasil mengeluarkan anggota", }, { status: 200 } ); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/app/api/task/[id]/route.ts b/src/app/api/task/[id]/route.ts index b489e7f..1b613c4 100644 --- a/src/app/api/task/[id]/route.ts +++ b/src/app/api/task/[id]/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import moment from "moment"; import "moment/locale/id" @@ -184,16 +185,15 @@ export async function POST(request: Request, context: { params: { id: string } } dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')), dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')), }, + select: { + id: true + } }); - return NextResponse.json( - { - success: true, - message: "Detail tugas berhasil ditambahkan", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User menambahkan detail tugas divisi', table: 'divisionProjectTask', data: create.id }) + + return NextResponse.json({ success: true, message: "Detail tugas berhasil ditambahkan", data, }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -238,13 +238,10 @@ export async function DELETE(request: Request, context: { params: { id: string } } }); - return NextResponse.json( - { - success: true, - message: "Tugas berhasil dibatalkan", - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User membatalkan tugas divisi', table: 'divisionProject', data: id }) + + return NextResponse.json({ success: true, message: "Tugas berhasil dibatalkan", }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal membatalkan tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -287,13 +284,10 @@ export async function PUT(request: Request, context: { params: { id: string } }) } }); - return NextResponse.json( - { - success: true, - message: "Tugas berhasil diedit", - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data tugas divisi', table: 'divisionProject', data: id }) + + return NextResponse.json( { success: true, message: "Tugas berhasil diedit", }, { status: 200 } ); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/app/api/task/detail/[id]/route.ts b/src/app/api/task/detail/[id]/route.ts index 461c0ae..4989183 100644 --- a/src/app/api/task/detail/[id]/route.ts +++ b/src/app/api/task/detail/[id]/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import moment from "moment"; import { NextResponse } from "next/server"; @@ -67,14 +68,10 @@ export async function DELETE(request: Request, context: { params: { id: string } } }) - return NextResponse.json( - { - success: true, - message: "Tugas berhasil dihapus", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus detail task divisi', table: 'divisionProjectTask', data: id }) + + return NextResponse.json({ success: true, message: "Tugas berhasil dihapus", data, }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal menghapus tugas divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -146,14 +143,10 @@ export async function PUT(request: Request, context: { params: { id: string } }) } }) - return NextResponse.json( - { - success: true, - message: "Status detail tugas berhasil diupdate", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate status detail task divisi', table: 'divisionProjectTask', data: id }) + + return NextResponse.json({ success: true, message: "Status detail tugas berhasil diupdate", data, }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengupdate status detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); @@ -230,14 +223,10 @@ export async function POST(request: Request, context: { params: { id: string } } }, }); - return NextResponse.json( - { - success: true, - message: "Detail tugas berhasil diedit", - data, - }, - { status: 200 } - ); + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data detail task divisi', table: 'divisionProjectTask', data: id }) + + return NextResponse.json({ success: true, message: "Detail tugas berhasil diedit", data, }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/app/api/task/file/[id]/route.ts b/src/app/api/task/file/[id]/route.ts index e0d8c1f..429e74a 100644 --- a/src/app/api/task/file/[id]/route.ts +++ b/src/app/api/task/file/[id]/route.ts @@ -4,6 +4,7 @@ import _ from "lodash"; import { NextResponse } from "next/server"; import fs from "fs"; import path from "path"; +import { createLogUser } from "@/module/user"; // HAPUS DETAIL FILE, HAPUS FILE DI ASSETS DAN DATABASE (BUKAN PAKE ISACTIVE) export async function DELETE(request: Request, context: { params: { id: string } }) { @@ -55,15 +56,10 @@ export async function DELETE(request: Request, context: { params: { id: string } }, }); + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User menghpus file divisi', table: 'divisionProject', data: String(dataRelasi?.idProject) }) - return NextResponse.json( - { - success: true, - message: "File berhasil dihapus", - data, - }, - { status: 200 } - ); + return NextResponse.json({ success: true, message: "File berhasil dihapus", data, }, { status: 200 }); } catch (error) { console.error(error); @@ -155,7 +151,8 @@ export async function POST(request: Request, context: { params: { id: string } } }) } - + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User meambahkan file tugas divisi baru', table: 'divisionProject', data: id }) return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 }); } catch (error) { diff --git a/src/app/api/task/route.ts b/src/app/api/task/route.ts index d49eafd..76d524a 100644 --- a/src/app/api/task/route.ts +++ b/src/app/api/task/route.ts @@ -5,6 +5,7 @@ import { NextResponse } from "next/server"; import path from "path"; import fs from "fs"; import moment from "moment"; +import { createLogUser } from "@/module/user"; // GET ALL DATA TUGAS DIVISI @@ -196,6 +197,9 @@ export async function POST(request: Request) { }) } + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat tugas divisi baru', table: 'divisionProject', data: data.id }) + return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 }); diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index 033e9b5..d9724fc 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -15,6 +15,8 @@ import EditDivision from './ui/edit_division'; import CreateReport from './ui/create_report'; import ReportDivisionId from './ui/report_division_id'; import { funGetDivisionById, funGetListDivisionByIdDivision, funGetSearchMemberDivision } from './lib/api_division'; +import { globalIsAdminDivision } from './lib/val_division'; +import WrapLayoutDivision from './ui/wrap_division'; export { CreateUsers }; export { CreateAdminDivision }; @@ -34,4 +36,6 @@ export { CreateReport } export { ReportDivisionId } export { funGetDivisionById } export { funGetListDivisionByIdDivision } -export { funGetSearchMemberDivision } \ No newline at end of file +export { funGetSearchMemberDivision } +export { globalIsAdminDivision } +export { WrapLayoutDivision } \ No newline at end of file diff --git a/src/module/division_new/lib/val_division.ts b/src/module/division_new/lib/val_division.ts index 2d769e0..e756a7e 100644 --- a/src/module/division_new/lib/val_division.ts +++ b/src/module/division_new/lib/val_division.ts @@ -1,4 +1,5 @@ import { hookstate } from "@hookstate/core"; import { IFormMemberDivision } from "./type_division"; -export const globalMemberDivision = hookstate([]); \ No newline at end of file +export const globalMemberDivision = hookstate([]); +export const globalIsAdminDivision = hookstate(false) \ No newline at end of file diff --git a/src/module/division_new/ui/wrap_division.tsx b/src/module/division_new/ui/wrap_division.tsx new file mode 100644 index 0000000..53e5dd2 --- /dev/null +++ b/src/module/division_new/ui/wrap_division.tsx @@ -0,0 +1,28 @@ +'use client' +import { useHookstate } from "@hookstate/core"; +import { useShallowEffect } from "@mantine/hooks"; +import { globalIsAdminDivision } from "../lib/val_division"; +import { funGetDivisionById } from "../lib/api_division"; +import { useParams } from "next/navigation"; +import { funGetUserByCookies } from "@/module/auth"; + +export default function WrapLayoutDivision({ children }: { children: React.ReactNode }) { + const isAdmin = useHookstate(globalIsAdminDivision) + const param = useParams<{ id: string }>() + + const getData = async () => { + const res = await funGetDivisionById(param.id); + const login = await funGetUserByCookies() + const cek = res.data.member.some((i: any) => i.idUser == login.id && i.isAdmin == true) + isAdmin.set(cek) + } + + useShallowEffect(() => { + getData() + }, []) + return ( + <> + {children} + + ); +} \ No newline at end of file From 0a8d88207848b5b7735a7af4eb8de31f1245b378 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 16:49:02 +0800 Subject: [PATCH 5/6] upd: task Deskripsi: - role user - log user No Issues --- .../task/ui/detail_list_anggota_task.tsx | 27 ++++-- src/module/task/ui/list_division_task.tsx | 5 +- .../task/ui/navbar_detail_division_task.tsx | 92 ++++++++++--------- src/module/task/ui/navbar_division_task.tsx | 12 ++- src/module/task/ui/tabs_division_task.tsx | 30 +++--- 5 files changed, 93 insertions(+), 73 deletions(-) diff --git a/src/module/task/ui/detail_list_anggota_task.tsx b/src/module/task/ui/detail_list_anggota_task.tsx index 1f303e4..b1fc81b 100644 --- a/src/module/task/ui/detail_list_anggota_task.tsx +++ b/src/module/task/ui/detail_list_anggota_task.tsx @@ -1,5 +1,5 @@ 'use client' -import { LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global"; +import { globalRole, LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global"; import { Box, Group, Flex, Avatar, Text, SimpleGrid, Stack, Grid } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useParams, useRouter } from "next/navigation"; @@ -10,6 +10,8 @@ import { IDataMemberTaskDivision } from "../lib/type_task"; import { FaUser } from "react-icons/fa6"; import { IoIosCloseCircle } from "react-icons/io"; import LayoutModal from "@/module/_global/layout/layout_modal"; +import { useHookstate } from "@hookstate/core"; +import { globalIsAdminDivision } from "@/module/division_new"; export default function ListAnggotaDetailTask() { @@ -20,6 +22,8 @@ export default function ListAnggotaDetailTask() { const [isOpenModal, setOpenModal] = useState(false) const [dataChoose, setDataChoose] = useState({ id: '', name: '' }) const router = useRouter() + const roleLogin = useHookstate(globalRole) + const adminLogin = useHookstate(globalIsAdminDivision) async function getOneData() { try { @@ -140,15 +144,18 @@ export default function ListAnggotaDetailTask() { Lihat profil - - { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} > - - - - - Keluarkan anggota - - + { + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") || adminLogin.get() ? + { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} > + + + + + Keluarkan anggota + + + : <> + } diff --git a/src/module/task/ui/list_division_task.tsx b/src/module/task/ui/list_division_task.tsx index 76130c1..02bbea4 100644 --- a/src/module/task/ui/list_division_task.tsx +++ b/src/module/task/ui/list_division_task.tsx @@ -1,5 +1,5 @@ import { WARNA } from "@/module/_global"; -import { ActionIcon, Avatar, Badge, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core"; +import { ActionIcon, Avatar, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useState } from "react"; import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiOutlineListBullet, HiSquares2X2 } from "react-icons/hi2"; @@ -67,6 +67,7 @@ export default function ListDivisionTask() { radius={30} leftSection={} placeholder="Pencarian" + onChange={(val) => setSearchQuery(val.target.value)} /> @@ -181,7 +182,7 @@ export default function ListDivisionTask() { - +{v.member - 1} + {(v.member == 0) ? "0" : "+" + (v.member - 1)} diff --git a/src/module/task/ui/navbar_detail_division_task.tsx b/src/module/task/ui/navbar_detail_division_task.tsx index f7f2356..3159ec9 100644 --- a/src/module/task/ui/navbar_detail_division_task.tsx +++ b/src/module/task/ui/navbar_detail_division_task.tsx @@ -1,5 +1,5 @@ 'use client' -import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; +import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; import { ActionIcon, Box, Flex, SimpleGrid, Stack, Text } from "@mantine/core"; import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; @@ -10,12 +10,16 @@ import { HiMenu } from "react-icons/hi"; import { IoAddCircle } from "react-icons/io5"; import { FaFileCirclePlus, FaPencil, FaUsers } from "react-icons/fa6"; import { MdCancel } from "react-icons/md"; +import { globalIsAdminDivision } from "@/module/division_new"; +import { useHookstate } from "@hookstate/core"; export default function NavbarDetailDivisionTask() { const router = useRouter() const param = useParams<{ id: string, detail: string }>() const [name, setName] = useState('') const [isOpen, setOpen] = useState(false) + const roleLogin = useHookstate(globalRole) + const adminLogin = useHookstate(globalIsAdminDivision) async function getOneData() { try { @@ -75,22 +79,6 @@ export default function NavbarDetailDivisionTask() { - { - router.push(param.detail + '/add-member') - }} - > - - - - - Tambah anggota - - - - { router.push(param.detail + '/edit') }} - > - - - - - Edit - - + { + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") || adminLogin.get() ? + <> + { router.push(param.detail + '/add-member') }} > + + + + + Tambah anggota + + + + { router.push(param.detail + '/edit') }} > + + + + + Edit + + + + { router.push(param.detail + '/cancel') }} > + + + + + Batal + + + : <> + + } - { router.push(param.detail + '/cancel') }} - > - - - - - Batal - - diff --git a/src/module/task/ui/navbar_division_task.tsx b/src/module/task/ui/navbar_division_task.tsx index 1fbcbe4..dee616f 100644 --- a/src/module/task/ui/navbar_division_task.tsx +++ b/src/module/task/ui/navbar_division_task.tsx @@ -1,21 +1,27 @@ 'use client' -import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; +import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; import { ActionIcon } from "@mantine/core"; import { useState } from "react"; import { HiMenu } from "react-icons/hi"; import DrawerDivisionTask from "./drawer_division_task"; import { useParams } from "next/navigation"; +import { useHookstate } from "@hookstate/core"; +import { globalIsAdminDivision } from "@/module/division_new"; export default function NavbarDivisionTask() { const [openDrawer, setOpenDrawer] = useState(false) - const param = useParams<{ id: string}>() + const param = useParams<{ id: string }>() + const roleLogin = useHookstate(globalRole) + const adminLogin = useHookstate(globalIsAdminDivision) + return ( <> setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + : <> } /> setOpenDrawer(false)}> diff --git a/src/module/task/ui/tabs_division_task.tsx b/src/module/task/ui/tabs_division_task.tsx index 1519ae6..69b2c48 100644 --- a/src/module/task/ui/tabs_division_task.tsx +++ b/src/module/task/ui/tabs_division_task.tsx @@ -17,26 +17,26 @@ export default function TabsDivisionTask() { const dataStatus = [ { - id: "0", - title: "Segera", - icon: + id: "0", + title: "Segera", + icon: }, { - id: "1", - title: "Dikerjakan", - icon: + id: "1", + title: "Dikerjakan", + icon: }, { - id: "2", - title: "Selesai", - icon: + id: "2", + title: "Selesai", + icon: }, { - id: "3", - title: "Batal", - icon: + id: "3", + title: "Batal", + icon: } - ] + ] return ( @@ -77,7 +77,7 @@ export default function TabsDivisionTask() { color={ status == item.id ? "white" - : WARNA.biruTua + : (status == null && item.id == "0") ? "white" : WARNA.biruTua } onClick={() => { router.push("?status=" + item.id) }} defaultValue={(status == "1" || status == "2" || status == "3") ? status : "0"} @@ -85,7 +85,7 @@ export default function TabsDivisionTask() { bg={ status == item.id ? "#FF9861" - : "transparent" + : (status == null && item.id == "0") ? "#FF9861" : "transparent" } > {item.icon} From 9ad2556554a4647604011417407fb4c628d62ed5 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 10 Sep 2024 17:23:46 +0800 Subject: [PATCH 6/6] upd: dokumen Deskripsi: - log user - kyk nya ga ada pembatasan deh NO Issues --- src/app/api/document/more/route.ts | 4 ++++ src/app/api/document/route.ts | 13 +++++++++++++ src/app/api/document/upload/route.ts | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/src/app/api/document/more/route.ts b/src/app/api/document/more/route.ts index 032ce71..89b5bfc 100644 --- a/src/app/api/document/more/route.ts +++ b/src/app/api/document/more/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -65,6 +66,9 @@ export async function POST(request: Request) { }) } + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User memindahkan file atau folder', table: 'divisionDocumentFolderFile', data: '' }) + return NextResponse.json({ success: true, message: "Berhasil memindahkan item" }, { status: 200 }); } catch (error) { diff --git a/src/app/api/document/route.ts b/src/app/api/document/route.ts index 64123de..c34cd03 100644 --- a/src/app/api/document/route.ts +++ b/src/app/api/document/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; import _ from "lodash"; import moment from "moment"; import { NextResponse } from "next/server"; @@ -281,8 +282,14 @@ export async function POST(request: Request) { extension: "folder", createdBy: user.id, }, + select: { + id: true + } }); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat folder baru', table: 'divisionDocumentFolderFile', data: data.id }) + return NextResponse.json({ success: true, message: "Berhasil membuat folder baru" }, { status: 200 }); } catch (error) { console.error(error); @@ -339,6 +346,9 @@ export async function PUT(request: Request) { }) + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengubah nama file atau folder', table: 'divisionDocumentFolderFile', data: id }) + return NextResponse.json({ success: true, message: "Berhasil mengubah nama item" }, { status: 200 }); } catch (error) { @@ -370,6 +380,9 @@ export async function DELETE(request: Request) { }) } + // create log user + const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus file atau folder', table: 'divisionDocumentFolderFile', data: '' }) + return NextResponse.json({ success: true, message: "Berhasil menghapus item" }, { status: 200 }); } catch (error) { diff --git a/src/app/api/document/upload/route.ts b/src/app/api/document/upload/route.ts index 1739032..eb9095b 100644 --- a/src/app/api/document/upload/route.ts +++ b/src/app/api/document/upload/route.ts @@ -4,6 +4,7 @@ import _ from "lodash"; import { NextResponse } from "next/server"; import fs from "fs"; import path from "path"; +import { createLogUser } from "@/module/user"; // UPLOAD FILE @@ -92,6 +93,9 @@ export async function POST(request: Request) { // Tulis file ke sistem fs.writeFileSync(filePath, buffer); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User mengupload file baru', table: 'divisionDocumentFolderFile', data: dataInsert.id }) + return NextResponse.json({ success: true, message: "Berhasil upload file" }, { status: 200 }); } catch (error) { console.error(error);