diff --git a/src/app/(application)/project/page.tsx b/src/app/(application)/project/page.tsx index f4bccb4..7eabf7c 100644 --- a/src/app/(application)/project/page.tsx +++ b/src/app/(application)/project/page.tsx @@ -1,10 +1,14 @@ -import { ViewFilter } from '@/module/_global'; +import { ViewFilter, ViewFilterData } from '@/module/_global'; import { TabProject } from '@/module/project'; import React from 'react'; function Page({ searchParams }: { searchParams: { page: string } }) { if (searchParams.page == 'filter') return + + if (searchParams.page == 'filter-data') + return + return ( ); diff --git a/src/app/api/division/route.ts b/src/app/api/division/route.ts index 855b32e..5bee3c3 100644 --- a/src/app/api/division/route.ts +++ b/src/app/api/division/route.ts @@ -18,6 +18,7 @@ export async function GET(request: Request) { const roleUser = user.idUserRole const { searchParams } = new URL(request.url); const idGroup = searchParams.get("group"); + const kategori = searchParams.get("cat"); const name = searchParams.get('search'); const page = searchParams.get('page'); const active = searchParams.get("active"); @@ -30,6 +31,7 @@ export async function GET(request: Request) { } + // JIKA (ROLE BUKAN USER DAN COADMIN) ATAU SEMUA ROLE DG KATEGORI == SEMUA let kondisi: any = { isActive: active == 'false' ? false : true, idVillage: String(villaId), @@ -40,19 +42,23 @@ export async function GET(request: Request) { } } + + // JIKA ROLE = USER ATAU COADMIN DAN KATEGORI != SEMUA (DIVISI SAYA) if (roleUser != "supadmin" && roleUser != "cosupadmin" && roleUser != "admin") { - kondisi = { - isActive: active == 'false' ? false : true, - idVillage: String(villaId), - idGroup: grup, - name: { - contains: (name == undefined || name == "null") ? "" : name, - mode: "insensitive" - }, - DivisionMember: { - some: { - isActive: true, - idUser: String(user.id) + if (kategori != "semua") { + kondisi = { + isActive: active == 'false' ? false : true, + idVillage: String(villaId), + idGroup: grup, + name: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + }, + DivisionMember: { + some: { + isActive: true, + idUser: String(user.id) + } } } } diff --git a/src/app/api/project/route.ts b/src/app/api/project/route.ts index a0632ed..1c7a7dd 100644 --- a/src/app/api/project/route.ts +++ b/src/app/api/project/route.ts @@ -20,6 +20,7 @@ export async function GET(request: Request) { const status = searchParams.get('status'); const idGroup = searchParams.get("group"); const page = searchParams.get('page'); + const kategori = searchParams.get('cat'); const dataSkip = Number(page) * 10 - 10; const villageId = user.idVillage const userId = user.id @@ -41,6 +42,8 @@ export async function GET(request: Request) { return NextResponse.json({ success: false, message: "Gagal mendapatkan data kegiatan, data tidak ditemukan", }, { status: 404 }); } + + // JIKA (ROLE BUKAN USER DAN COADMIN) ATAU SEMUA ROLE DG KATEGORI == SEMUA let kondisi: any = { isActive: true, idVillage: String(villageId), @@ -52,19 +55,23 @@ export async function GET(request: Request) { status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0 } + + // JIKA ROLE = USER ATAU COADMIN DAN KATEGORI != SEMUA (KEGIATAN SAYA) if (roleUser != "supadmin" && roleUser != "cosupadmin" && roleUser != "admin") { - kondisi = { - isActive: true, - idVillage: String(villageId), - idGroup: grup, - title: { - contains: (name == undefined || name == "null") ? "" : name, - mode: "insensitive" - }, - status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0, - ProjectMember: { - some: { - idUser: String(userId) + if (kategori != "semua") { + kondisi = { + isActive: true, + idVillage: String(villageId), + idGroup: grup, + title: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + }, + status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0, + ProjectMember: { + some: { + idUser: String(userId) + } } } } diff --git a/src/module/_global/index.ts b/src/module/_global/index.ts index bedf570..a592424 100644 --- a/src/module/_global/index.ts +++ b/src/module/_global/index.ts @@ -27,6 +27,7 @@ import SkeletonUser from "./components/skeleton_user"; import SkeletonList from "./components/skeleton_list"; import { funViewDir } from "./fun/view_dir"; import { funSendWebPush } from "./fun/send_web_push"; +import ViewFilterData from "./view/view_filter_kategori_data"; export { WARNA }; export { LayoutLogin }; @@ -63,3 +64,4 @@ export { SkeletonList } export { keyWibu } export { funViewDir } export { funSendWebPush } +export { ViewFilterData } diff --git a/src/module/_global/view/view_filter_kategori_data.tsx b/src/module/_global/view/view_filter_kategori_data.tsx new file mode 100644 index 0000000..57923b6 --- /dev/null +++ b/src/module/_global/view/view_filter_kategori_data.tsx @@ -0,0 +1,84 @@ +'use client' +import { useHookstate } from "@hookstate/core"; +import { Box, Button, Divider, Group, rem, Text } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import { useRouter, useSearchParams } from "next/navigation"; +import { useState } from "react"; +import { FaCheck } from "react-icons/fa6"; +import { TEMA } from "../bin/val_global"; +import LayoutNavbarNew from "../layout/layout_navbar_new"; + +export default function ViewFilterData({ linkFilter }: { linkFilter: string }) { + const [selectedFilter, setSelectedFilter] = useState(''); + const data = [ + { + id: 1, + data: "data-saya", + name: "Kegiatan Saya", + }, + { + id: 2, + data: "semua", + name: "Semua Kegiatan", + }, + ] + const searchParams = useSearchParams() + const kategori = searchParams.get('cat') + const tema = useHookstate(TEMA) + + + + useShallowEffect(() => { + if (kategori == "null" || kategori == "undefined" || kategori == '') { + setSelectedFilter("data-saya") + } else { + setSelectedFilter(kategori) + } + }, [kategori]); + + const router = useRouter() + + return ( + + + + { + data.map((filter) => ( + + setSelectedFilter(filter.data)} + > + + {filter.name} + + {selectedFilter === filter.data && } + + + + )) + + } + + + + + + ); +} \ No newline at end of file diff --git a/src/module/division_new/ui/list_division.tsx b/src/module/division_new/ui/list_division.tsx index ca7882b..2aa4113 100644 --- a/src/module/division_new/ui/list_division.tsx +++ b/src/module/division_new/ui/list_division.tsx @@ -30,6 +30,7 @@ export default function ListDivision() { const [isRefresh, setRefresh] = useState(false) const notifLoadPage = useHookstate(globalNotifPage) const status = searchParams.get('active') + const kategori = searchParams.get('cat') const handleList = () => { @@ -43,7 +44,7 @@ export default function ListDivision() { if (isPage == 1) { setData([]) } - const response = await funGetAllDivision('?active=' + status + '&search=' + searchQuery + '&group=' + group + '&page=' + isPage) + const response = await funGetAllDivision('?active=' + status + '&search=' + searchQuery + '&group=' + group + '&page=' + isPage + '&cat=' + kategori); if (response.success) { setJumlah(response.total) setNameGroup(response.filter.name) @@ -72,7 +73,7 @@ export default function ListDivision() { useShallowEffect(() => { setPage(1) fetchData(true) - }, [status, searchQuery]) + }, [status, searchQuery, kategori]) @@ -156,7 +157,7 @@ export default function ListDivision() { - {roleLogin.get() == 'supadmin' && Filter by: {nameGroup}} + {roleLogin.get() == 'supadmin' && Filter : {nameGroup}} Total Divisi diff --git a/src/module/division_new/ui/tab_list_division.tsx b/src/module/division_new/ui/tab_list_division.tsx index 0f7ce8d..656a7a7 100644 --- a/src/module/division_new/ui/tab_list_division.tsx +++ b/src/module/division_new/ui/tab_list_division.tsx @@ -4,7 +4,7 @@ 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 { IoCloseCircleOutline, IoFileTrayOutline, IoFileTrayStackedOutline } from "react-icons/io5"; import ListDivision from "./list_division"; export default function TabListDivision() { @@ -13,6 +13,7 @@ export default function TabListDivision() { const searchParams = useSearchParams(); const status = searchParams.get("active"); const group = searchParams.get("group"); + const kategori = searchParams.get("cat"); const tema = useHookstate(TEMA) const roleLogin = useHookstate(globalRole) @@ -22,40 +23,72 @@ export default function TabListDivision() { variant="pills" color={tema.get().bgFiturHome} radius="xl" - defaultValue={status == "false" ? "false" : "true"} + defaultValue={status == "false" || kategori == "semua" ? "false" : "true"} > { - roleLogin.get() != '' ? - (roleLogin.get() != "user" && roleLogin.get() != "coadmin") && - - } - onClick={() => { - router.push("/division?active=true&group=" + group); + roleLogin.get() != '' + ? + (roleLogin.get() != "user" && roleLogin.get() != "coadmin") + ? + - Aktif - - } - onClick={() => { - router.push("/division?active=false&group=" + group); + } + onClick={() => { + router.push("/division?active=true&group=" + group); + }} + > + Aktif + + } + onClick={() => { + router.push("/division?active=false&group=" + group); + }} + > + Tidak Aktif + + + : + - Tidak Aktif - - + } + onClick={() => { + router.push("/division"); + }} + > + Divisi Saya + + } + onClick={() => { + router.push("/division?cat=semua"); + }} + > + Semua Divisi + + : <> } diff --git a/src/module/position/ui/list_position_active.tsx b/src/module/position/ui/list_position_active.tsx index cfd2929..7a2523f 100644 --- a/src/module/position/ui/list_position_active.tsx +++ b/src/module/position/ui/list_position_active.tsx @@ -78,7 +78,7 @@ export default function ListPositionActive() { placeholder="Pencarian" onChange={(e) => setSearchQuery(e.target.value)} /> - {roleLogin.get() == 'supadmin' && Filter by: {nameGroup}} + {roleLogin.get() == 'supadmin' && Filter : {nameGroup}} {loading ? Array(6).fill(null).map((_, i) => ( Filter by: {nameGroup}} + {roleLogin.get() == 'supadmin' && Filter : {nameGroup}} + {(roleLogin.get() == 'user' || roleLogin.get() == 'coadmin') && Filter : {(kategori == null || kategori == undefined || kategori == '') ? 'Kegiatan Saya' : 'Semua Kegiatan'}} Total Kegiatan diff --git a/src/module/project/ui/menu_drawer_project.tsx b/src/module/project/ui/menu_drawer_project.tsx index 11c3aaf..f91436e 100644 --- a/src/module/project/ui/menu_drawer_project.tsx +++ b/src/module/project/ui/menu_drawer_project.tsx @@ -1,8 +1,7 @@ -import { globalRole, TEMA, WARNA } from '@/module/_global'; +import { globalRole, TEMA } from '@/module/_global'; import { useHookstate } from '@hookstate/core'; import { Box, Flex, SimpleGrid, Stack, Text } from '@mantine/core'; import { useSearchParams } from 'next/navigation'; -import React, { useState } from 'react'; import { HiOutlineFilter } from 'react-icons/hi'; import { IoAddCircle } from 'react-icons/io5'; @@ -10,6 +9,7 @@ export default function MenuDrawerProject() { const roleLogin = useHookstate(globalRole) const searchParams = useSearchParams() const group = searchParams.get('group') + const kategori = searchParams.get('cat') const tema = useHookstate(TEMA) return ( @@ -37,6 +37,18 @@ export default function MenuDrawerProject() { } + + { + (roleLogin.get() == "user" || roleLogin.get() == "coadmin") && + window.location.href = "/project?page=filter-data&cat=" + kategori} justify={'center'} align={'center'} direction={'column'} > + + + + + Filter + + + } diff --git a/src/module/project/ui/tab_project.tsx b/src/module/project/ui/tab_project.tsx index 503109a..a5b0114 100644 --- a/src/module/project/ui/tab_project.tsx +++ b/src/module/project/ui/tab_project.tsx @@ -1,16 +1,16 @@ "use client" -import { globalRole, LayoutDrawer, LayoutNavbarNew, TEMA } from '@/module/_global'; +import { LayoutDrawer, LayoutNavbarNew, TEMA } from '@/module/_global'; +import { useHookstate } from '@hookstate/core'; import { ActionIcon, Box, Button, Flex, rem } from '@mantine/core'; -import React, { useState } from 'react'; -import { HiMenu } from 'react-icons/hi'; -import { RiProgress3Line } from "react-icons/ri"; import { useRouter, useSearchParams } from 'next/navigation'; -import { TbClockPause } from 'react-icons/tb'; +import { useState } from 'react'; +import { HiMenu } from 'react-icons/hi'; import { IoIosCheckmarkCircleOutline } from 'react-icons/io'; import { IoCloseCircleOutline } from 'react-icons/io5'; +import { RiProgress3Line } from "react-icons/ri"; +import { TbClockPause } from 'react-icons/tb'; import ListProject from './list_project'; import MenuDrawerProject from './menu_drawer_project'; -import { useHookstate } from '@hookstate/core'; export default function TabProject() { const [openDrawer, setOpenDrawer] = useState(false) @@ -18,8 +18,8 @@ export default function TabProject() { const searchParams = useSearchParams() const status = searchParams.get('status') const group = searchParams.get("group"); + const kategori = searchParams.get("cat"); const iconStyle = { width: rem(20), height: rem(20) }; - const roleLogin = useHookstate(globalRole) const tema = useHookstate(TEMA) const dataStatus = [ @@ -48,11 +48,10 @@ export default function TabProject() { return ( setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> - : <> } /> @@ -76,7 +75,7 @@ export default function TabProject() { : (status == null && item.id == "0") ? "white" : tema.get().utama } key={index} - onClick={() => { router.push("?status=" + item.id + "&group=" + group) }} + onClick={() => { router.push("?status=" + item.id + "&group=" + group+"&cat="+kategori) }} defaultValue={(status == "1" || status == "2" || status == "3") ? status : "0"} radius={"xl"} bg={ @@ -92,7 +91,6 @@ export default function TabProject() { - setOpenDrawer(false)}> diff --git a/src/module/user/member/ui/tab_list_member.tsx b/src/module/user/member/ui/tab_list_member.tsx index a6b0c47..8d7517b 100644 --- a/src/module/user/member/ui/tab_list_member.tsx +++ b/src/module/user/member/ui/tab_list_member.tsx @@ -128,7 +128,7 @@ export default function TabListMember() { onChange={(e) => setSearchQuery(e.target.value)} my={20} /> - {roleLogin.get() == 'supadmin' && Filter by: {nameGroup}} + {roleLogin.get() == 'supadmin' && Filter : {nameGroup}} {loading ? Array(6)