From f5cc008775c54816d9e89d28c0f1efab3f694717 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 22 Oct 2024 14:05:57 +0800 Subject: [PATCH 1/4] upd: nonactive divisi Deskripsi: - api status divisi - api list divisi by status - tampilan tab list divisi NO Issues --- src/app/(application)/division/page.tsx | 12 +- src/app/api/division/[id]/detail/route.ts | 10 +- src/app/api/division/[id]/route.ts | 6 +- src/app/api/division/[id]/status/route.ts | 48 ++++++++ src/app/api/division/route.ts | 9 +- src/module/division_new/index.ts | 6 +- src/module/division_new/lib/api_division.ts | 13 +- .../division_new/ui/information_division.tsx | 115 ++++++++++++++---- src/module/division_new/ui/list_division.tsx | 29 ++--- .../division_new/ui/navbar_list_division.tsx | 30 +++++ .../division_new/ui/tab_list_division.tsx | 65 ++++++++++ src/module/user/member/ui/list_member.tsx | 10 +- 12 files changed, 286 insertions(+), 67 deletions(-) create mode 100644 src/app/api/division/[id]/status/route.ts create mode 100644 src/module/division_new/ui/navbar_list_division.tsx create mode 100644 src/module/division_new/ui/tab_list_division.tsx diff --git a/src/app/(application)/division/page.tsx b/src/app/(application)/division/page.tsx index 2e17ed4..a828285 100644 --- a/src/app/(application)/division/page.tsx +++ b/src/app/(application)/division/page.tsx @@ -1,14 +1,18 @@ import { ViewFilter } from '@/module/_global'; -import { CreateReport, ListDivision } from '@/module/division_new'; -import React from 'react'; +import { CreateReport, NavbarListDivision, TabListDivision } from '@/module/division_new'; +import { Box } from '@mantine/core'; function Page({ searchParams }: { searchParams: { page: string } }) { if (searchParams.page == "filter") - return + return if (searchParams.page == "report") return + return ( - + + + + ); } diff --git a/src/app/api/division/[id]/detail/route.ts b/src/app/api/division/[id]/detail/route.ts index da6d7f5..b018447 100644 --- a/src/app/api/division/[id]/detail/route.ts +++ b/src/app/api/division/[id]/detail/route.ts @@ -23,7 +23,7 @@ export async function GET(request: Request, context: { params: { id: string } }) const data = await prisma.division.findUnique({ where: { id: String(id), - isActive: true + // isActive: true } }); @@ -179,7 +179,7 @@ export async function GET(request: Request, context: { params: { id: string } }) catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } @@ -232,7 +232,7 @@ export async function DELETE(request: Request, context: { params: { id: string } ); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } @@ -286,7 +286,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) ); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mengubah status admin divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mengubah status admin divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } @@ -337,6 +337,6 @@ export async function POST(request: Request, context: { params: { id: string } } return NextResponse.json({ success: true, message: "Berhasil menambahkan anggota divisi" }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal menambahkan anggota divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal menambahkan anggota divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } }; \ No newline at end of file diff --git a/src/app/api/division/[id]/route.ts b/src/app/api/division/[id]/route.ts index eb81f1c..efe6316 100644 --- a/src/app/api/division/[id]/route.ts +++ b/src/app/api/division/[id]/route.ts @@ -17,7 +17,7 @@ export async function GET(request: Request, context: { params: { id: string } }) const data = await prisma.division.findUnique({ where: { id: String(id), - isActive: true + // isActive: true } }); @@ -63,7 +63,7 @@ export async function GET(request: Request, context: { params: { id: string } }) } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } @@ -117,6 +117,6 @@ export async function PUT(request: Request, context: { params: { id: string } }) ); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mengedit divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mengedit divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } \ No newline at end of file diff --git a/src/app/api/division/[id]/status/route.ts b/src/app/api/division/[id]/status/route.ts new file mode 100644 index 0000000..6e17164 --- /dev/null +++ b/src/app/api/division/[id]/status/route.ts @@ -0,0 +1,48 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import { createLogUser } from "@/module/user"; +import { NextResponse } from "next/server"; + +export async function POST(request: Request, context: { params: { id: string } }) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + const { id } = context.params; + const { isActive } = (await request.json()); + const data = await prisma.division.count({ + where: { + id: id, + }, + }); + + if (data == 0) { + return NextResponse.json( + { + success: false, + message: "Edit status divisi gagal, data tidak ditemukan", + }, + { status: 404 } + ); + } + + const update = await prisma.division.update({ + where: { + id: id, + }, + data: { + isActive: !isActive, + }, + }); + + // create log user + const log = await createLogUser({ act: 'UPDATE', desc: 'User mengedit status data divisi', table: 'division', data: id }) + + return NextResponse.json({ success: true, message: "Status divisi berhasil diupdate", }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengubah status divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/division/route.ts b/src/app/api/division/route.ts index 28528ba..38f2b72 100644 --- a/src/app/api/division/route.ts +++ b/src/app/api/division/route.ts @@ -20,6 +20,7 @@ export async function GET(request: Request) { const idGroup = searchParams.get("group"); const name = searchParams.get('search'); const page = searchParams.get('page'); + const active = searchParams.get("active"); const dataSkip = Number(page) * 10 - 10; if (idGroup == "null" || idGroup == undefined) { @@ -30,7 +31,7 @@ export async function GET(request: Request) { let kondisi: any = { - isActive: true, + isActive: active == 'false' ? false : true, idVillage: String(villaId), idGroup: grup, name: { @@ -41,7 +42,7 @@ export async function GET(request: Request) { if (roleUser != "supadmin" && roleUser != "cosupadmin" && roleUser != "admin") { kondisi = { - isActive: true, + isActive: active == 'false' ? false : true, idVillage: String(villaId), idGroup: grup, name: { @@ -104,7 +105,7 @@ export async function GET(request: Request) { } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } } @@ -226,6 +227,6 @@ export async function POST(request: Request) { return NextResponse.json({ success: true, message: "Berhasil menambahkan divisi", notif: dataNotif, }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal menambahkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal menambahkan divisi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } }; \ No newline at end of file diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index d9724fc..90951ea 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -17,6 +17,8 @@ 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'; +import TabListDivision from './ui/tab_list_division'; +import NavbarListDivision from './ui/navbar_list_division'; export { CreateUsers }; export { CreateAdminDivision }; @@ -38,4 +40,6 @@ export { funGetDivisionById } export { funGetListDivisionByIdDivision } export { funGetSearchMemberDivision } export { globalIsAdminDivision } -export { WrapLayoutDivision } \ No newline at end of file +export { WrapLayoutDivision } +export { TabListDivision } +export { NavbarListDivision } \ No newline at end of file diff --git a/src/module/division_new/lib/api_division.ts b/src/module/division_new/lib/api_division.ts index 94c6fe5..7bbcb64 100644 --- a/src/module/division_new/lib/api_division.ts +++ b/src/module/division_new/lib/api_division.ts @@ -87,4 +87,15 @@ export const funGetReportDivision = async (path?: string) => { export const funGetSearchMemberDivision = async (path: string, id: string) => { const response = await fetch(`/api/division/${id}/member/${(path) ? path : ''}`, { next: { tags: ['division'] } }); return await response.json().catch(() => null); -} \ No newline at end of file +} + +export const funUpdateStatusDivision = async (path: string, data: { isActive: boolean }) => { + const response = await fetch(`/api/division/${path}/status`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + return await response.json().catch(() => null); +} diff --git a/src/module/division_new/ui/information_division.tsx b/src/module/division_new/ui/information_division.tsx index f5d17fa..929e530 100644 --- a/src/module/division_new/ui/information_division.tsx +++ b/src/module/division_new/ui/information_division.tsx @@ -1,24 +1,26 @@ "use client" -import { globalRole, LayoutDrawer, LayoutNavbarNew, SkeletonList, SkeletonSingle, TEMA } from '@/module/_global'; -import { ActionIcon, Avatar, Box, Button, Divider, Flex, Grid, Group, Skeleton, Stack, Text } from '@mantine/core'; +import { globalRole, LayoutDrawer, LayoutNavbarNew, SkeletonList, TEMA } from '@/module/_global'; +import LayoutModal from '@/module/_global/layout/layout_modal'; +import { funGetUserByCookies } from '@/module/auth'; +import { useHookstate } from '@hookstate/core'; +import { ActionIcon, Avatar, Box, Divider, Flex, Grid, Group, SimpleGrid, Skeleton, Stack, Text } from '@mantine/core'; import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; import { useParams, useRouter } from 'next/navigation'; -import React, { useState } from 'react'; +import { useState } from 'react'; import toast from 'react-hot-toast'; import { AiOutlineUserAdd } from 'react-icons/ai'; -import { FaUserTie } from 'react-icons/fa6'; -import { IoIosCloseCircle } from 'react-icons/io'; -import { LuClipboardEdit } from 'react-icons/lu'; -import { funDeleteMemberDivision, funEditStatusAdminDivision, funGetDivisionById } from '../lib/api_division'; +import { FaPencil, FaToggleOff, FaUserTie } from 'react-icons/fa6'; +import { HiMenu } from 'react-icons/hi'; +import { IoIosCloseCircle, IoIosWarning } from 'react-icons/io'; +import { funDeleteMemberDivision, funEditStatusAdminDivision, funGetDivisionById, funUpdateStatusDivision } from '../lib/api_division'; import { IDataMemberDivision } from '../lib/type_division'; -import LayoutModal from '@/module/_global/layout/layout_modal'; -import { useHookstate } from '@hookstate/core'; -import { funGetUserByCookies } from '@/module/auth'; export default function InformationDivision() { const router = useRouter() const [openDrawer, setDrawer] = useState(false) + const [openDrawerInfo, setDrawerInfo] = useState(false) + const [valActive, setValActive] = useState(true) const param = useParams<{ id: string }>() const [name, setName] = useState('') const [deskripsi, setDeskripsi] = useState('') @@ -28,11 +30,13 @@ export default function InformationDivision() { const [valChooseMemberStatus, setChooseMemberStatus] = useState(false) const [valChooseMemberName, setChooseMemberName] = useState("") const [isOpenModal, setOpenModal] = useState(false) + const [isOpenModalStatus, setOpenModalStatus] = useState(false) const roleLogin = useHookstate(globalRole) const [isAdmin, setAdmin] = useState(false) const isMobile = useMediaQuery('(max-width: 455px)'); const isMobile2 = useMediaQuery("(max-width: 438px)"); const tema = useHookstate(TEMA) + const [loadingStatus, setLoadingStatus] = useState(false) async function getOneData() { try { @@ -43,6 +47,7 @@ export default function InformationDivision() { setName(res.data.division.name); setDeskripsi(res.data.division.desc); setMember(res.data.member) + setValActive(res.data.division.isActive) const cek = res.data.member.some((i: any) => i.idUser == login.id && i.isAdmin == true) setAdmin(cek) } else { @@ -105,20 +110,53 @@ export default function InformationDivision() { } } + async function editStatusDivisi() { + try { + setLoadingStatus(true) + const res = await funUpdateStatusDivision(param.id, { isActive: valActive }) + if (res.success) { + toast.success(res.message) + getOneData() + } else { + toast.error(res.message) + } + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan divisi, coba lagi nanti"); + } finally { + setDrawerInfo(false) + setLoadingStatus(false) + setOpenModalStatus(false) + } + } + return ( { - router.push('/division/edit/' + param.id) - }} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> - + { setDrawerInfo(true) }} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + : <> } /> + { + !valActive ? + + + + + Divisi dinonaktifkan + + + + : <> + } + Deskripsi Divisi : - ((roleLogin.get() != 'user' && roleLogin.get() != 'coadmin') || isAdmin) ? + (((roleLogin.get() != 'user' && roleLogin.get() != 'coadmin') || isAdmin) && valActive) ? router.push('/division/add-member/' + param.id)}> @@ -223,17 +261,17 @@ export default function InformationDivision() { setDrawer(false)} title={valChooseMemberName}> - editStatusAdmin()}> + valActive ? editStatusAdmin() : undefined}> - + - {(valChooseMemberStatus == false) ? "Jadikan admin" : "Memberhentikan sebagai admin"} + {(valChooseMemberStatus == false) ? "Jadikan admin" : "Memberhentikan sebagai admin"} - setOpenModal(true)}> + valActive ? setOpenModal(true) : undefined}> - + - Keluarkan dari divisi + Keluarkan dari divisi @@ -247,6 +285,41 @@ export default function InformationDivision() { deleteMember() } }} /> + + setDrawerInfo(false)} title={"Menu"}> + + + + router.push('/division/edit/' + param.id)} justify={'center'} align={'center'} direction={'column'} > + + + + + Edit Divisi + + + { setOpenModalStatus(true) }} justify={'center'} align={'center'} direction={'column'} > + + + + + {valActive ? "Non Aktifkan Divisi" : "Aktifkan Divisi"} + + + + + + + + setOpenModalStatus(false)} + description="Apakah Anda yakin ingin mangubah status aktifasi divisi?" + onYes={(val) => { + if (!val) { + setOpenModalStatus(false) + } else { + editStatusDivisi() + } + }} /> ); } diff --git a/src/module/division_new/ui/list_division.tsx b/src/module/division_new/ui/list_division.tsx index da33735..f38041e 100644 --- a/src/module/division_new/ui/list_division.tsx +++ b/src/module/division_new/ui/list_division.tsx @@ -17,7 +17,6 @@ import DrawerDivision from './drawer_division'; export default function ListDivision() { const [isList, setIsList] = useState(false) const router = useRouter() - const [openDrawer, setOpenDrawer] = useState(false) const [data, setData] = useState([]) const [jumlah, setJumlah] = useState(0) const [searchQuery, setSearchQuery] = useState('') @@ -32,6 +31,7 @@ export default function ListDivision() { const paddingLift = useMediaQuery('(max-width: 505px)') const [isRefresh, setRefresh] = useState(false) const notifLoadPage = useHookstate(globalNotifPage) + const status = searchParams.get('active') const handleList = () => { @@ -40,12 +40,12 @@ export default function ListDivision() { const fetchData = async (loading: boolean) => { try { - + setLoading(loading); if (isPage == 1) { setData([]) } - const response = await funGetAllDivision('?search=' + searchQuery + '&group=' + group + '&page=' + isPage) + const response = await funGetAllDivision('?active=' + status + '&search=' + searchQuery + '&group=' + group + '&page=' + isPage) if (response.success) { setJumlah(response.total) setNameGroup(response.filter.name) @@ -65,14 +65,10 @@ export default function ListDivision() { } }; - function searchDivision(search: string) { - setSearchQuery(search) - setPage(1) - } - useShallowEffect(() => { + setPage(1) fetchData(true) - }, [searchQuery]) + }, [status, searchQuery]) useShallowEffect(() => { @@ -121,15 +117,7 @@ export default function ListDivision() { return ( - (setOpenDrawer(true))} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> - - - } /> - - + { isRefresh && } placeholder="Pencarian" value={searchQuery} - onChange={(val) => { searchDivision(val.target.value) }} + onChange={(val) => { setSearchQuery(val.target.value) }} /> @@ -289,9 +277,6 @@ export default function ListDivision() { )} - setOpenDrawer(false)}> - - ); } \ No newline at end of file diff --git a/src/module/division_new/ui/navbar_list_division.tsx b/src/module/division_new/ui/navbar_list_division.tsx new file mode 100644 index 0000000..d09a152 --- /dev/null +++ b/src/module/division_new/ui/navbar_list_division.tsx @@ -0,0 +1,30 @@ +'use client' +import { globalRole, LayoutDrawer, LayoutNavbarNew, TEMA } from "@/module/_global"; +import { useHookstate } from "@hookstate/core"; +import { ActionIcon } from "@mantine/core"; +import { useState } from "react"; +import { HiMenu } from "react-icons/hi"; +import DrawerDivision from "./drawer_division"; + +export default function NavbarListDivision() { + const roleLogin = useHookstate(globalRole) + const tema = useHookstate(TEMA) + const [openDrawer, setOpenDrawer] = useState(false) + + return ( + <> + (setOpenDrawer(true))} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + : <> + } /> + setOpenDrawer(false)}> + + + + ) +} \ No newline at end of file diff --git a/src/module/division_new/ui/tab_list_division.tsx b/src/module/division_new/ui/tab_list_division.tsx new file mode 100644 index 0000000..0f7ce8d --- /dev/null +++ b/src/module/division_new/ui/tab_list_division.tsx @@ -0,0 +1,65 @@ +"use client"; +import { globalRole, TEMA } from "@/module/_global"; +import { useHookstate } from "@hookstate/core"; +import { Box, rem, Tabs } from "@mantine/core"; +import { useRouter, useSearchParams } from "next/navigation"; +import { IoMdCheckmarkCircleOutline } from "react-icons/io"; +import { IoCloseCircleOutline } from "react-icons/io5"; +import ListDivision from "./list_division"; + +export default function TabListDivision() { + const iconStyle = { width: rem(20), height: rem(20) }; + const router = useRouter(); + const searchParams = useSearchParams(); + const status = searchParams.get("active"); + const group = searchParams.get("group"); + const tema = useHookstate(TEMA) + const roleLogin = useHookstate(globalRole) + + return ( + + + { + roleLogin.get() != '' ? + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") && + + } + onClick={() => { + router.push("/division?active=true&group=" + group); + }} + > + Aktif + + } + onClick={() => { + router.push("/division?active=false&group=" + group); + }} + > + Tidak Aktif + + + : <> + } + + + + ); +} diff --git a/src/module/user/member/ui/list_member.tsx b/src/module/user/member/ui/list_member.tsx index 4f70e1d..c47f79c 100644 --- a/src/module/user/member/ui/list_member.tsx +++ b/src/module/user/member/ui/list_member.tsx @@ -1,13 +1,11 @@ "use client"; -import { TEMA, WARNA } from "@/module/_global"; -import { Box, rem, Tabs, TextInput } from "@mantine/core"; -import React from "react"; -import { HiMagnifyingGlass, HiMiniUser } from "react-icons/hi2"; +import { TEMA } from "@/module/_global"; +import { useHookstate } from "@hookstate/core"; +import { Box, rem, Tabs } from "@mantine/core"; +import { useRouter, useSearchParams } from "next/navigation"; import { IoMdCheckmarkCircleOutline } from "react-icons/io"; import { IoCloseCircleOutline } from "react-icons/io5"; import TabListMember from "./tab_list_member"; -import { useRouter, useSearchParams } from "next/navigation"; -import { useHookstate } from "@hookstate/core"; export default function ListMember() { const iconStyle = { width: rem(20), height: rem(20) }; From 794b10cc7a402ac34567f1af9e5ef8925c73ac50 Mon Sep 17 00:00:00 2001 From: amel Date: Wed, 23 Oct 2024 14:36:10 +0800 Subject: [PATCH 2/4] fix: position Deskripsi: - fix ukuran drawer tambah jabatan - ukuran form tambah grup No Issues --- src/module/_global/layout/layout_drawer.tsx | 2 +- src/module/group/ui/drawer_group.tsx | 12 ++------- .../position/ui/drawer_list_position.tsx | 27 +++++++++---------- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/module/_global/layout/layout_drawer.tsx b/src/module/_global/layout/layout_drawer.tsx index 804a922..02fb060 100644 --- a/src/module/_global/layout/layout_drawer.tsx +++ b/src/module/_global/layout/layout_drawer.tsx @@ -8,7 +8,7 @@ export default function LayoutDrawer({ opened, onClose, title, children, size }: const tema = useHookstate(TEMA) return ( - {title}} onClose={onClose} position={"bottom"} size={(size == 'lg') ? '80%' : '40%' } + {title}} onClose={onClose} position={"bottom"} size={(size == 'lg') ? '80%' : (size == 'md') ? '45%' : '40%'} styles={{ content: { backgroundColor: "white", diff --git a/src/module/group/ui/drawer_group.tsx b/src/module/group/ui/drawer_group.tsx index abba7e1..99d70c3 100644 --- a/src/module/group/ui/drawer_group.tsx +++ b/src/module/group/ui/drawer_group.tsx @@ -1,14 +1,6 @@ import { LayoutDrawer, TEMA } from "@/module/_global"; import { useHookstate } from "@hookstate/core"; -import { - Box, - Button, - Flex, - SimpleGrid, - Stack, - Text, - TextInput -} from "@mantine/core"; +import { Box, Button, Flex, SimpleGrid, Stack, Text, TextInput } from "@mantine/core"; import { useState } from "react"; import toast from "react-hot-toast"; import { IoAddCircle } from "react-icons/io5"; @@ -102,7 +94,7 @@ export default function DrawerGroup({ onSuccess, }: { onSuccess: (val: boolean) borderColor: tema.get().utama, }, }} - size="lg" + size="md" radius={10} label="Grup" required diff --git a/src/module/position/ui/drawer_list_position.tsx b/src/module/position/ui/drawer_list_position.tsx index 82a60ae..390d685 100644 --- a/src/module/position/ui/drawer_list_position.tsx +++ b/src/module/position/ui/drawer_list_position.tsx @@ -1,16 +1,16 @@ -import { WARNA, LayoutDrawer, globalRole, TEMA, keyWibu } from "@/module/_global"; +import { globalRole, keyWibu, LayoutDrawer, TEMA } from "@/module/_global"; import { funGetAllGroup, IDataGroup } from "@/module/group"; -import { Box, Stack, SimpleGrid, Flex, TextInput, Button, Text, Select } from "@mantine/core"; +import { useHookstate } from "@hookstate/core"; +import { Box, Button, Flex, Select, SimpleGrid, Stack, Text, TextInput } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useRouter, useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import toast from "react-hot-toast"; import { IoAddCircle } from "react-icons/io5"; import { RiFilter2Line } from "react-icons/ri"; -import { funCreatePosition } from "../lib/api_position"; -import { useHookstate } from "@hookstate/core"; -import { globalRefreshPosition } from "../lib/val_posisition"; import { useWibuRealtime } from "wibu-realtime"; +import { funCreatePosition } from "../lib/api_position"; +import { globalRefreshPosition } from "../lib/val_posisition"; export default function DrawerListPosition({ onCreated }: { onCreated: (val: boolean) => void }) { @@ -99,7 +99,7 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo nilai = false } - if (roleLogin.get() == "supadmin" && listData.idGroup == "") { + if (roleLogin.get() == "supadmin" && (listData.idGroup == "" || String(listData.idGroup) == "null")) { setTouched(touched => ({ ...touched, idGroup: true })) nilai = false } @@ -117,7 +117,7 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo } } else if (kategori == 'idGroup') { setListData({ ...listData, idGroup: val }) - if (val == "") { + if (val == "" || String(val) == "null") { setTouched({ ...touched, idGroup: true }) } else { setTouched({ ...touched, idGroup: false }) @@ -152,8 +152,8 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo } - setOpenDrawerGroup(false)} title={'Tambah Jabatan'}> - + setOpenDrawerGroup(false)} title={'Tambah Jabatan'} size="md"> + { roleLogin.get() == "supadmin" &&