From 799fe8c9f294923a8c1c17ea3be9f3ba8ae1fdeb Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 23 Dec 2024 14:33:16 +0800 Subject: [PATCH 1/8] fix: drawer detail diskusi --- .../discussion/ui/detail_discussion.tsx | 2 +- .../ui/drawer_detail_discussion.tsx | 25 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index 123d376..403e5a0 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -107,7 +107,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv return ( {/* */} - setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> diff --git a/src/module/discussion/ui/drawer_detail_discussion.tsx b/src/module/discussion/ui/drawer_detail_discussion.tsx index d2fb230..053e9d6 100644 --- a/src/module/discussion/ui/drawer_detail_discussion.tsx +++ b/src/module/discussion/ui/drawer_detail_discussion.tsx @@ -91,18 +91,9 @@ export default function DrawerDetailDiscussion({ onSuccess, id, status, idDivisi - setValModal(true)} justify={'center'} align={'center'} direction={'column'} > - - - - - Hapus - - - window.location.href = `/division/${param.id}/discussion/update/${param.detail}`} justify={'center'} align={'center'} direction={'column'} > @@ -112,8 +103,7 @@ export default function DrawerDetailDiscussion({ onSuccess, id, status, idDivisi - setValModalStatus(true)} > - + setValModalStatus(true)} > {status === 1 ? ( <> @@ -134,8 +124,17 @@ export default function DrawerDetailDiscussion({ onSuccess, id, status, idDivisi )} + + + setValModal(true)} justify={'center'} align={'center'} direction={'column'} > + + + + + Hapus + From 756c2248fe22df08b3c69ea69d27ca27ef170430 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 23 Dec 2024 16:49:38 +0800 Subject: [PATCH 2/8] upd: pembatasan jika bukan member divisi pada fitur tugas divisi No Issues --- src/module/division_new/index.ts | 4 +- src/module/division_new/lib/val_division.ts | 3 +- src/module/division_new/ui/wrap_division.tsx | 5 ++- src/module/task/ui/detail_list_file_task.tsx | 34 +++++++++------- src/module/task/ui/detail_list_tugas_task.tsx | 40 ++++++++++++++----- .../task/ui/navbar_detail_division_task.tsx | 24 ++++++----- 6 files changed, 72 insertions(+), 38 deletions(-) diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index 90951ea..1aa62bb 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -15,7 +15,7 @@ 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 { globalIsAdminDivision, globalIsMemberDivision } from './lib/val_division'; import WrapLayoutDivision from './ui/wrap_division'; import TabListDivision from './ui/tab_list_division'; import NavbarListDivision from './ui/navbar_list_division'; @@ -39,7 +39,7 @@ export { ReportDivisionId } export { funGetDivisionById } export { funGetListDivisionByIdDivision } export { funGetSearchMemberDivision } -export { globalIsAdminDivision } +export { globalIsAdminDivision, globalIsMemberDivision } export { WrapLayoutDivision } export { TabListDivision } export { NavbarListDivision } \ 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 e756a7e..8800463 100644 --- a/src/module/division_new/lib/val_division.ts +++ b/src/module/division_new/lib/val_division.ts @@ -2,4 +2,5 @@ import { hookstate } from "@hookstate/core"; import { IFormMemberDivision } from "./type_division"; export const globalMemberDivision = hookstate([]); -export const globalIsAdminDivision = hookstate(false) \ No newline at end of file +export const globalIsAdminDivision = hookstate(false) +export const globalIsMemberDivision = 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 index 53e5dd2..deb4719 100644 --- a/src/module/division_new/ui/wrap_division.tsx +++ b/src/module/division_new/ui/wrap_division.tsx @@ -1,20 +1,23 @@ 'use client' import { useHookstate } from "@hookstate/core"; import { useShallowEffect } from "@mantine/hooks"; -import { globalIsAdminDivision } from "../lib/val_division"; +import { globalIsAdminDivision, globalIsMemberDivision } 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 isMember = useHookstate(globalIsMemberDivision) 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) + const cekMember = res.data.member.some((i: any) => i.idUser == login.id) isAdmin.set(cek) + isMember.set(cekMember) } useShallowEffect(() => { diff --git a/src/module/task/ui/detail_list_file_task.tsx b/src/module/task/ui/detail_list_file_task.tsx index 8182695..50364d4 100644 --- a/src/module/task/ui/detail_list_file_task.tsx +++ b/src/module/task/ui/detail_list_file_task.tsx @@ -1,5 +1,5 @@ 'use client' -import { keyWibu, LayoutDrawer, LayoutModalViewFile, TEMA } from "@/module/_global"; +import { globalRole, keyWibu, LayoutDrawer, LayoutModalViewFile, TEMA } from "@/module/_global"; import LayoutModal from "@/module/_global/layout/layout_modal"; import { useHookstate } from "@hookstate/core"; import { Box, Center, Flex, Grid, Group, SimpleGrid, Skeleton, Stack, Text } from "@mantine/core"; @@ -12,8 +12,11 @@ import { FaTrash } from "react-icons/fa6"; import { useWibuRealtime } from "wibu-realtime"; import { funDeleteFileTask, funGetTaskDivisionById } from "../lib/api_task"; import { IDataFileTaskDivision } from "../lib/type_task"; +import { globalIsMemberDivision } from "@/module/division_new"; export default function ListFileDetailTask() { + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const [isData, setData] = useState([]) const [loading, setLoading] = useState(true) const param = useParams<{ id: string, detail: string }>() @@ -193,19 +196,22 @@ export default function ListFileDetailTask() { Lihat file - - { - reason == null ? - setOpenModal(true) - : setOpenModal(false) - }} justify={'center'} align={'center'} direction={'column'} > - - - - - Hapus file - - + { + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> + : + { + reason == null ? + setOpenModal(true) + : setOpenModal(false) + }} justify={'center'} align={'center'} direction={'column'} > + + + + + Hapus file + + + } diff --git a/src/module/task/ui/detail_list_tugas_task.tsx b/src/module/task/ui/detail_list_tugas_task.tsx index 1ea4fef..aff1535 100644 --- a/src/module/task/ui/detail_list_tugas_task.tsx +++ b/src/module/task/ui/detail_list_tugas_task.tsx @@ -1,8 +1,8 @@ 'use client' -import { keyWibu, LayoutDrawer, SkeletonDetailListTugasTask, TEMA } from "@/module/_global" +import { globalRole, keyWibu, LayoutDrawer, SkeletonDetailListTugasTask, TEMA } from "@/module/_global" import LayoutModal from "@/module/_global/layout/layout_modal" import { useHookstate } from "@hookstate/core" -import { Box, Center, Checkbox, Divider, Flex, Grid, Group, SimpleGrid, Stack, Text } from "@mantine/core" +import { Box, Center, Checkbox, Divider, Flex, Grid, Group, SimpleGrid, Stack, Text, Loader } from "@mantine/core" import { useShallowEffect } from "@mantine/hooks" import "moment/locale/id" import { useParams, useRouter } from "next/navigation" @@ -14,8 +14,11 @@ import { useWibuRealtime } from "wibu-realtime" import { funDeleteDetailTask, funGetTaskDivisionById, funUpdateStatusDetailTask } from "../lib/api_task" import { IDataListTaskDivision } from "../lib/type_task" import { globalRefreshTask, valStatusDetailTask } from "../lib/val_task" +import { globalIsMemberDivision } from "@/module/division_new" export default function ListTugasDetailTask() { + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const [openDrawer, setOpenDrawer] = useState(false) const [openDrawerStatus, setOpenDrawerStatus] = useState(false) const [isOpenModal, setOpenModal] = useState(false) @@ -29,6 +32,8 @@ export default function ListTugasDetailTask() { const refresh = useHookstate(globalRefreshTask) const tema = useHookstate(TEMA) const [reason, setReason] = useState("") + const [loadingStatus, setLoadingStatus] = useState(false) + const [pilihStatus, setPilihStatus] = useState(0) const [dataRealTime, setDataRealtime] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, project: "sdm" @@ -105,6 +110,8 @@ export default function ListTugasDetailTask() { async function onUpdateStatus(val: number) { try { + setPilihStatus(val) + setLoadingStatus(true) const res = await funUpdateStatusDetailTask(idData, { status: val, idProject: param.detail }); if (res.success) { setDataRealtime([{ @@ -123,6 +130,9 @@ export default function ListTugasDetailTask() { } catch (error) { console.error(error); toast.error("Gagal mengubah status tugas divisi, coba lagi nanti"); + } finally { + setLoadingStatus(false) + setOpenModal(false) } } @@ -162,11 +172,15 @@ export default function ListTugasDetailTask() { return ( { - setIdData(item.id) - setStatusData(item.status) - reason == null ? - setOpenDrawer(true) - : setOpenDrawer(false) + if ((roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get()) { + setOpenDrawer(false) + } else { + setIdData(item.id) + setStatusData(item.status) + reason == null ? + setOpenDrawer(true) + : setOpenDrawer(false) + } }} my={18}> { return ( - { onUpdateStatus(item.value) }}> + { + if (!loadingStatus) { + onUpdateStatus(item.value) + } + }}> - {statusData === item.value ? : ""} + { + loadingStatus && pilihStatus == item.value ? + : + statusData === item.value ? : "" + } diff --git a/src/module/task/ui/navbar_detail_division_task.tsx b/src/module/task/ui/navbar_detail_division_task.tsx index 021888d..1ca37c6 100644 --- a/src/module/task/ui/navbar_detail_division_task.tsx +++ b/src/module/task/ui/navbar_detail_division_task.tsx @@ -1,6 +1,6 @@ 'use client' import { globalRole, keyWibu, LayoutDrawer, LayoutNavbarNew, TEMA } from "@/module/_global"; -import { globalIsAdminDivision } from "@/module/division_new"; +import { globalIsAdminDivision, globalIsMemberDivision } from "@/module/division_new"; import { useHookstate } from "@hookstate/core"; import { ActionIcon, Box, Flex, SimpleGrid, Stack, Text } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; @@ -21,6 +21,7 @@ export default function NavbarDetailDivisionTask() { const [isOpen, setOpen] = useState(false) const roleLogin = useHookstate(globalRole) const adminLogin = useHookstate(globalIsAdminDivision) + const memberDivision = useHookstate(globalIsMemberDivision) const tema = useHookstate(TEMA) const [reason, setReason] = useState("") const [dataRealTime, setDataRealtime] = useWibuRealtime({ @@ -58,16 +59,17 @@ export default function NavbarDetailDivisionTask() { return ( <> { setOpen(true) }} - > - - + ((roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get()) ? <> : + { setOpen(true) }} + > + + } /> From 9bf8294a6c4dcd466e420d520a6791774e7bee30 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 23 Dec 2024 17:16:39 +0800 Subject: [PATCH 3/8] upd: dokumen divisi Deskripsi: - update pembatasan jika user bukan member divisi No Issues --- .../document/ui/navbar_document_division.tsx | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index 9ddbd38..80af889 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -1,7 +1,7 @@ "use client"; -import { keyWibu, LayoutDrawer, LayoutModalViewFile, LayoutNavbarNew, TEMA, } from "@/module/_global"; +import { globalRole, keyWibu, LayoutDrawer, LayoutModalViewFile, LayoutNavbarNew, TEMA, } from "@/module/_global"; import LayoutModal from "@/module/_global/layout/layout_modal"; -import { funGetDivisionById } from "@/module/division_new"; +import { funGetDivisionById, globalIsMemberDivision } from "@/module/division_new"; import { useHookstate } from "@hookstate/core"; import { ActionIcon, Box, Breadcrumbs, Button, Checkbox, Divider, Flex, Grid, Group, Indicator, Menu, Modal, rem, SimpleGrid, Skeleton, Text, TextInput } from "@mantine/core"; import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; @@ -27,6 +27,8 @@ import DrawerMore from "./drawer_more"; import DrawerShareDocument from "./drawer_share_document"; export default function NavbarDocumentDivision() { + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const router = useRouter(); const param = useParams<{ id: string }>(); const [isOpenModalView, setOpenModalView] = useState(false); @@ -497,16 +499,18 @@ export default function NavbarDocumentDivision() { back={`/division/${param.id}/`} title={name} menu={ - setOpen(true)} - variant="light" - bg={tema.get().bgIcon} - size="lg" - radius="lg" - aria-label="Settings" - > - - + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> + : + setOpen(true)} + variant="light" + bg={tema.get().bgIcon} + size="lg" + radius="lg" + aria-label="Settings" + > + + } /> @@ -777,13 +781,18 @@ export default function NavbarDocumentDivision() { {v.updatedAt} - handleCheckboxChange(i)} - /> + { + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> + : + handleCheckboxChange(i)} + /> + } + From 44b6314c493eb7440d0f260376862b50808cbf66 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 23 Dec 2024 17:51:30 +0800 Subject: [PATCH 4/8] upd: diskusi divisi Deskripsi: - update pembatasan user jika bukan member No Issues --- src/module/discussion/ui/detail_discussion.tsx | 7 ++++--- src/module/discussion/ui/navbar_list_discussion.tsx | 13 +++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index 403e5a0..5731dfa 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -1,6 +1,6 @@ "use client" import { globalRole, keyWibu, LayoutDrawer, LayoutNavbarNew, TEMA } from "@/module/_global"; -import { globalIsAdminDivision } from "@/module/division_new"; +import { globalIsAdminDivision, globalIsMemberDivision } from "@/module/division_new"; import { useHookstate } from "@hookstate/core"; import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, rem, Skeleton, Spoiler, Text, TextInput } from "@mantine/core"; import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; @@ -28,6 +28,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv const [isCreator, setCreator] = useState(false) const [isUser, setUser] = useState('') const adminLogin = useHookstate(globalIsAdminDivision) + const memberDivision = useHookstate(globalIsMemberDivision) const tema = useHookstate(TEMA) const router = useRouter() const isMobile = useMediaQuery('(max-width: 369px)'); @@ -323,7 +324,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv }} size="md" placeholder="Kirim Komentar" - disabled={isData?.status === 2} + disabled={(isData?.status === 2 || (!memberDivision.get() && (roleLogin.get() == "user" || roleLogin.get() == "coadmin")))} onChange={(e) => setIsComent(e.target.value)} value={isComent} maxLength={300} @@ -334,7 +335,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv
+ variant="subtle" aria-label="submit" disabled={(isData?.status === 2 || (!memberDivision.get() && (roleLogin.get() == "user" || roleLogin.get() == "coadmin")))}>
diff --git a/src/module/discussion/ui/navbar_list_discussion.tsx b/src/module/discussion/ui/navbar_list_discussion.tsx index 35d654b..9d5112b 100644 --- a/src/module/discussion/ui/navbar_list_discussion.tsx +++ b/src/module/discussion/ui/navbar_list_discussion.tsx @@ -1,23 +1,28 @@ 'use client' -import { LayoutNavbarNew, LayoutDrawer, TEMA } from "@/module/_global"; +import { LayoutNavbarNew, LayoutDrawer, TEMA, globalRole } from "@/module/_global"; import { ActionIcon } from "@mantine/core"; import { HiMenu } from "react-icons/hi"; import { useState } from "react"; import DrawerListDiscussion from "./drawer_list_discussion"; import { useParams } from "next/navigation"; import { useHookstate } from "@hookstate/core"; +import { globalIsMemberDivision } from "@/module/division_new"; export default function NavbarListDiscussion() { const [openDrawer, setOpenDrawer] = useState(false) + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const param = useParams<{ id: string }>() const tema = useHookstate(TEMA) return ( <> setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> - - + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> + : + setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + + } /> setOpenDrawer(false)}> From 6993502d6a4cbcc3482ac231f6272ac2ee1cd791 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 23 Dec 2024 17:54:21 +0800 Subject: [PATCH 5/8] upd: version api --- src/app/api/version-app/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/version-app/route.ts b/src/app/api/version-app/route.ts index 811ea45..68f3c0f 100644 --- a/src/app/api/version-app/route.ts +++ b/src/app/api/version-app/route.ts @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; export async function GET(request: Request) { try { - return NextResponse.json({ success: true, version: "0.2.7", tahap: "beta" }, { status: 200 }); + return NextResponse.json({ success: true, version: "0.2.8", tahap: "beta" }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, version: "Gagal mendapatkan version, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); From a97106be6434cda79889621ee60bf8febd93d6dc Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 24 Dec 2024 10:50:13 +0800 Subject: [PATCH 6/8] upd: calender divisi Deskripsi: - update akses user yg bukan anggota divisi pada fitur calender No Issues --- .../calender/ui/dawer_division_calender.tsx | 28 +++++++++++-------- .../calender/ui/detail_event_division.tsx | 14 +++++++--- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/module/calender/ui/dawer_division_calender.tsx b/src/module/calender/ui/dawer_division_calender.tsx index 909a278..5f210e6 100644 --- a/src/module/calender/ui/dawer_division_calender.tsx +++ b/src/module/calender/ui/dawer_division_calender.tsx @@ -1,4 +1,5 @@ -import { TEMA } from '@/module/_global'; +import { globalRole, TEMA } from '@/module/_global'; +import { globalIsMemberDivision } from '@/module/division_new'; import { useHookstate } from '@hookstate/core'; import { Box, Flex, SimpleGrid, Stack, Text } from '@mantine/core'; import { useParams } from 'next/navigation'; @@ -7,22 +8,25 @@ import { AiOutlineFileSearch } from 'react-icons/ai'; import { IoAddCircle } from 'react-icons/io5'; export default function DawerDivisionCalender() { + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const param = useParams<{ id: string }>() const tema = useHookstate(TEMA) return ( - - window.location.href = `/division/${param.id}/calender/create`} justify={'center'} align={'center'} direction={'column'} > - - - - - Tambah Acara - - + + { + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> : + window.location.href = `/division/${param.id}/calender/create`} justify={'center'} align={'center'} direction={'column'} > + + + + + Tambah Acara + + + } window.location.href = `/division/${param.id}/calender/history`} justify={'center'} align={'center'} direction={'column'} > diff --git a/src/module/calender/ui/detail_event_division.tsx b/src/module/calender/ui/detail_event_division.tsx index d7db21b..a118117 100644 --- a/src/module/calender/ui/detail_event_division.tsx +++ b/src/module/calender/ui/detail_event_division.tsx @@ -1,5 +1,5 @@ 'use client' -import { keyWibu, LayoutDrawer, LayoutNavbarNew, SkeletonList, TEMA } from '@/module/_global'; +import { globalRole, keyWibu, LayoutDrawer, LayoutNavbarNew, SkeletonList, TEMA } from '@/module/_global'; import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; import { ActionIcon, Avatar, Box, Center, CopyButton, Divider, Flex, Grid, Group, SimpleGrid, Spoiler, Stack, Text, Tooltip } from '@mantine/core'; @@ -21,6 +21,7 @@ import { funDeleteMemberCalender, funGetOneCalender } from '../lib/api_calender' import { IDataDetailByIdCalender, IDataDetailByIdMember } from '../lib/type_calender'; import DrawerDetailEvent from './drawer_detail_event'; import SkeletonDetailEvent from './skeleton_detail_event'; +import { globalIsMemberDivision } from '@/module/division_new'; export default function DetailEventDivision() { const param = useParams<{ id: string, detail: string }>() @@ -34,6 +35,8 @@ export default function DetailEventDivision() { const router = useRouter() const [dataChoose, setDataChoose] = useState({ id: '', name: '' }) const tema = useHookstate(TEMA) + const roleLogin = useHookstate(globalRole) + const memberDivision = useHookstate(globalIsMemberDivision) const isMobile2 = useMediaQuery("(max-width: 460px)"); const isMobile = useMediaQuery('(max-width: 369px)'); const [loadingDelete, setLoadingDelete] = useState(false) @@ -105,9 +108,12 @@ export default function DetailEventDivision() { return ( setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> - - } /> + menu={ + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberDivision.get() ? <> + : + setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + + } /> {loading ? From 0fc6c2a3b0fe4dbc094dc1c5bf0ee67d38b5f898 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 24 Dec 2024 12:14:34 +0800 Subject: [PATCH 7/8] upd: tulisan anggota pada tugas divisi --- src/module/task/ui/detail_list_anggota_task.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/task/ui/detail_list_anggota_task.tsx b/src/module/task/ui/detail_list_anggota_task.tsx index 415f6c1..61aa72d 100644 --- a/src/module/task/ui/detail_list_anggota_task.tsx +++ b/src/module/task/ui/detail_list_anggota_task.tsx @@ -114,7 +114,7 @@ export default function ListAnggotaDetailTask() { return ( - Anggota Terpilih + Anggota Total {isData.length} Anggota From 46e76ed4631324ff8d55491f4fd17e1a5f0659ff Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 24 Dec 2024 12:15:29 +0800 Subject: [PATCH 8/8] upd: projects Deskripsi: - membatasi akses user yang bukan anggota project No Issues --- src/app/(application)/project/[id]/layout.tsx | 11 +++++ src/module/project/index.ts | 4 +- src/module/project/lib/val_project.ts | 1 + .../ui/list_anggota_detail_project.tsx | 2 +- .../project/ui/list_file_detail_project.tsx | 33 +++++++++------ .../project/ui/list_tugas_detail_project.tsx | 40 ++++++++++++++----- .../project/ui/navbar_detail_project.tsx | 24 ++++++----- src/module/project/ui/wrap_project.tsx | 28 +++++++++++++ 8 files changed, 108 insertions(+), 35 deletions(-) create mode 100644 src/app/(application)/project/[id]/layout.tsx create mode 100644 src/module/project/ui/wrap_project.tsx diff --git a/src/app/(application)/project/[id]/layout.tsx b/src/app/(application)/project/[id]/layout.tsx new file mode 100644 index 0000000..c3f8779 --- /dev/null +++ b/src/app/(application)/project/[id]/layout.tsx @@ -0,0 +1,11 @@ +import { WrapLayoutProject } from "@/module/project"; + +export default async function Layout({ children }: { children: React.ReactNode }) { + return ( + <> + + {children} + + + ); +} \ No newline at end of file diff --git a/src/module/project/index.ts b/src/module/project/index.ts index 090f969..1c33e04 100644 --- a/src/module/project/index.ts +++ b/src/module/project/index.ts @@ -14,6 +14,7 @@ import CancelProject from "./ui/cancel_project"; import AddMemberDetailProject from "./ui/add_member_detail_project"; import CreateProject from "./ui/create_project"; import AddFileDetailProject from "./ui/add_file_detail_project"; +import WrapLayoutProject from "./ui/wrap_project"; export { ViewDateEndTask } export { CreateUsersProject } @@ -29,4 +30,5 @@ export { AddDetailTaskProject } export { CancelProject } export { AddMemberDetailProject } export { CreateProject } -export { AddFileDetailProject } \ No newline at end of file +export { AddFileDetailProject } +export { WrapLayoutProject } \ No newline at end of file diff --git a/src/module/project/lib/val_project.ts b/src/module/project/lib/val_project.ts index 1566b5b..70c2d24 100644 --- a/src/module/project/lib/val_project.ts +++ b/src/module/project/lib/val_project.ts @@ -3,6 +3,7 @@ import { IFormMemberProject } from "./type_project"; export const globalRefreshProject = hookstate(false) export const globalMemberProject = hookstate([]); +export const globalIsMemberProject = hookstate(false) export const valStatusDetailProject = [ { diff --git a/src/module/project/ui/list_anggota_detail_project.tsx b/src/module/project/ui/list_anggota_detail_project.tsx index e5b5220..b1a78cb 100644 --- a/src/module/project/ui/list_anggota_detail_project.tsx +++ b/src/module/project/ui/list_anggota_detail_project.tsx @@ -111,7 +111,7 @@ export default function ListAnggotaDetailProject() { return ( - Anggota Terpilih + Anggota Total {isData.length} Anggota diff --git a/src/module/project/ui/list_file_detail_project.tsx b/src/module/project/ui/list_file_detail_project.tsx index 2e0c424..9a65f43 100644 --- a/src/module/project/ui/list_file_detail_project.tsx +++ b/src/module/project/ui/list_file_detail_project.tsx @@ -1,5 +1,5 @@ 'use client' -import { keyWibu, LayoutDrawer, LayoutModalViewFile, TEMA } from '@/module/_global'; +import { globalRole, keyWibu, LayoutDrawer, LayoutModalViewFile, TEMA } from '@/module/_global'; import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; import { Box, Flex, Grid, Group, SimpleGrid, Skeleton, Stack, Text } from '@mantine/core'; @@ -12,6 +12,7 @@ import { FaTrash } from 'react-icons/fa6'; import { useWibuRealtime } from 'wibu-realtime'; import { funDeleteFileProject, funGetOneProjectById } from '../lib/api_project'; import { IDataFileProject } from '../lib/type_project'; +import { globalIsMemberProject } from '../lib/val_project'; export default function ListFileDetailProject() { const [isData, setData] = useState([]) @@ -26,6 +27,8 @@ export default function ListFileDetailProject() { const [isOpenModalView, setOpenModalView] = useState(false) const [isExtension, setExtension] = useState('') const tema = useHookstate(TEMA) + const roleLogin = useHookstate(globalRole) + const memberProject = useHookstate(globalIsMemberProject) const isMobile = useMediaQuery("(max-width: 350px)"); const [reason, setReason] = useState("") const [dataRealTime, setDataRealtime] = useWibuRealtime({ @@ -212,18 +215,22 @@ export default function ListFileDetailProject() { - { - reason == null ? - setOpenModal(true) - : setOpenModal(false) - }} justify={'center'} align={'center'} direction={'column'} > - - - - - Hapus file - - + { + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberProject.get() ? <> + : + { + reason == null ? + setOpenModal(true) + : setOpenModal(false) + }} justify={'center'} align={'center'} direction={'column'} > + + + + + Hapus file + + + } diff --git a/src/module/project/ui/list_tugas_detail_project.tsx b/src/module/project/ui/list_tugas_detail_project.tsx index 2e8fd48..c14c45a 100644 --- a/src/module/project/ui/list_tugas_detail_project.tsx +++ b/src/module/project/ui/list_tugas_detail_project.tsx @@ -1,8 +1,8 @@ 'use client' -import { keyWibu, LayoutDrawer, SkeletonDetailListTugasTask, TEMA } from '@/module/_global'; +import { globalRole, keyWibu, LayoutDrawer, SkeletonDetailListTugasTask, TEMA } from '@/module/_global'; import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; -import { Box, Center, Checkbox, Divider, Flex, Grid, Group, SimpleGrid, Stack, Text } from '@mantine/core'; +import { Box, Center, Checkbox, Divider, Flex, Grid, Group, SimpleGrid, Stack, Text, Loader } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -12,7 +12,7 @@ import { FaCheck, FaPencil, FaTrash } from 'react-icons/fa6'; import { useWibuRealtime } from 'wibu-realtime'; import { funDeleteDetailProject, funGetOneProjectById, funUpdateStatusProject } from '../lib/api_project'; import { IDataListTaskProject } from '../lib/type_project'; -import { globalRefreshProject, valStatusDetailProject } from '../lib/val_project'; +import { globalIsMemberProject, globalRefreshProject, valStatusDetailProject } from '../lib/val_project'; export default function ListTugasDetailProject() { const [isData, setData] = useState([]) @@ -27,6 +27,10 @@ export default function ListTugasDetailProject() { const [loadingDelete, setLoadingDelete] = useState(false) const router = useRouter() const tema = useHookstate(TEMA) + const roleLogin = useHookstate(globalRole) + const memberProject = useHookstate(globalIsMemberProject) + const [loadingStatus, setLoadingStatus] = useState(false) + const [pilihStatus, setPilihStatus] = useState(0) const [reason, setReason] = useState("") const [dataRealTime, setDataRealtime] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, @@ -102,6 +106,8 @@ export default function ListTugasDetailProject() { async function onUpdateStatus(val: number) { try { + setLoadingStatus(true) + setPilihStatus(val) const res = await funUpdateStatusProject(idData, { status: val, idProject: param.id }); if (res.success) { setDataRealtime([{ @@ -120,6 +126,8 @@ export default function ListTugasDetailProject() { } catch (error) { console.error(error); toast.error("Gagal update status tugas Kegiatan, coba lagi nanti"); + } finally { + setLoadingStatus(false) } } @@ -158,11 +166,15 @@ export default function ListTugasDetailProject() { return ( { - setIdData(item.id) - setStatusData(item.status) - reason == null ? - setOpenDrawer(true) - : setOpenDrawer(false) + if (!memberProject.get() && ((roleLogin.get() == "user" || roleLogin.get() == "coadmin"))) { + setOpenDrawer(false) + } else { + setIdData(item.id) + setStatusData(item.status) + reason == null ? + setOpenDrawer(true) + : setOpenDrawer(false) + } }} my={18}> { return ( - { onUpdateStatus(item.value) }}> + { + if (!loadingStatus) { + onUpdateStatus(item.value) + } + }}> - {statusData === item.value ? : ""} + { + loadingStatus && pilihStatus == item.value ? + : + statusData === item.value ? : "" + } diff --git a/src/module/project/ui/navbar_detail_project.tsx b/src/module/project/ui/navbar_detail_project.tsx index dcbaba7..2444f20 100644 --- a/src/module/project/ui/navbar_detail_project.tsx +++ b/src/module/project/ui/navbar_detail_project.tsx @@ -12,6 +12,7 @@ import { IoAddCircle } from 'react-icons/io5'; import { MdCancel } from 'react-icons/md'; import { useWibuRealtime } from 'wibu-realtime'; import { funGetOneProjectById } from '../lib/api_project'; +import { globalIsMemberProject } from '../lib/val_project'; export default function NavbarDetailProject() { const router = useRouter() @@ -20,6 +21,7 @@ export default function NavbarDetailProject() { const [grup, setGrup] = useState("") const [isOpen, setOpen] = useState(false) const roleLogin = useHookstate(globalRole) + const memberProject = useHookstate(globalIsMemberProject) const tema = useHookstate(TEMA) const [reason, setReason] = useState("") const [dataRealTime, setDataRealtime] = useWibuRealtime({ @@ -57,16 +59,18 @@ export default function NavbarDetailProject() { return ( <> { setOpen(true) }} - > - - + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && !memberProject.get() ? <> + : + { setOpen(true) }} + > + + } /> setOpen(false)}> diff --git a/src/module/project/ui/wrap_project.tsx b/src/module/project/ui/wrap_project.tsx new file mode 100644 index 0000000..f1e6643 --- /dev/null +++ b/src/module/project/ui/wrap_project.tsx @@ -0,0 +1,28 @@ +'use client' +import { useHookstate } from "@hookstate/core"; +import { useShallowEffect } from "@mantine/hooks"; +import { useParams } from "next/navigation"; +import { funGetUserByCookies } from "@/module/auth"; +import { globalIsMemberProject } from "../lib/val_project"; +import { funGetOneProjectById } from "../lib/api_project"; + +export default function WrapLayoutProject({ children }: { children: React.ReactNode }) { + const isMember = useHookstate(globalIsMemberProject) + const param = useParams<{ id: string }>() + + const getData = async () => { + const res = await funGetOneProjectById(param.id, 'member'); + const login = await funGetUserByCookies() + const cekMember = res.data.some((i: any) => i.idUser == login.id) + isMember.set(cekMember) + } + + useShallowEffect(() => { + getData() + }, []) + return ( + <> + {children} + + ); +} \ No newline at end of file