diff --git a/src/app/api/home/search/route.ts b/src/app/api/home/search/route.ts new file mode 100644 index 0000000..fd9c017 --- /dev/null +++ b/src/app/api/home/search/route.ts @@ -0,0 +1,103 @@ + + +// SEARCH USER, DIVISION, PROJECT + +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const userId = await funGetUserByCookies() + if (userId.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + let kondisi: any, kondisiProject: any + + // klo perbekel == semua grup + if (userId.idUserRole == "supadmin") { + kondisi = { + isActive: true, + idVillage: userId.idVillage, + Group: { + isActive: true, + }, + name: { + contains: (search == undefined || search == null) ? "" : search, + mode: "insensitive" + } + } + + kondisiProject = { + isActive: true, + idVillage: userId.idVillage, + Group: { + isActive: true, + }, + title: { + contains: (search == undefined || search == null) ? "" : search, + mode: "insensitive" + } + } + } else { + kondisi = { + idVillage: userId.idVillage, + isActive: true, + idGroup: userId.idGroup, + name: { + contains: (search == undefined || search == null) ? "" : search, + mode: "insensitive" + } + } + + kondisiProject = { + idVillage: userId.idVillage, + isActive: true, + idGroup: userId.idGroup, + title: { + contains: (search == undefined || search == null) ? "" : search, + mode: "insensitive" + } + } + } + + const user = await prisma.user.findMany({ + where: kondisi, + select: { + id: true, + name: true, + email: true + } + }) + + const divisions = await prisma.division.findMany({ + where: kondisi, + select: { + id: true, + name: true, + desc: true + } + }) + + const projects = await prisma.project.findMany({ + where: kondisiProject, + select: { + id: true, + title: true, + } + }) + + const allDataSearch = { + user: user, + division: divisions, + project: projects + } + return NextResponse.json({ success: true, data: allDataSearch }, { status: 200 }); + + } catch (error) { + return NextResponse.json({ success: false, message: error }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/module/home/lib/api_search.ts b/src/module/home/lib/api_search.ts new file mode 100644 index 0000000..406c010 --- /dev/null +++ b/src/module/home/lib/api_search.ts @@ -0,0 +1,6 @@ + + +export const funGetSearchAll = async (path?: string) => { + const response = await fetch(`/api/home/search${(path) ? path : ''}`, { next: { tags: ['search'] } }); + return await response.json().catch(() => null); +} \ No newline at end of file diff --git a/src/module/home/lib/type_search.ts b/src/module/home/lib/type_search.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/module/home/ui/view_search.tsx b/src/module/home/ui/view_search.tsx index 3ff017a..a967d7e 100644 --- a/src/module/home/ui/view_search.tsx +++ b/src/module/home/ui/view_search.tsx @@ -1,9 +1,33 @@ +"use client" import { LayoutNavbarNew, WARNA } from '@/module/_global'; import { Box, TextInput } from '@mantine/core'; -import React from 'react'; +import React, { useState } from 'react'; import { HiMagnifyingGlass } from 'react-icons/hi2'; +import { funGetSearchAll } from '../lib/api_search'; +import { useShallowEffect } from '@mantine/hooks'; export default function ViewSearch() { + const [search, setSearch] = useState(''); + const [dataUser, setDataUser] = useState([]); + const [dataProject, setDataProject] = useState([]); + const [dataDivision, setDataDivision] = useState([]); + + async function featchSearch() { + try { + const res = await funGetSearchAll('?search=' + search); + setDataUser(res.data.user); + setDataProject(res.data.project); + setDataDivision(res.data.division); + } catch (error) { + console.error(error) + throw new Error("Error") + } + } + + useShallowEffect(() => { + featchSearch() + }, [search]) + return ( <> } /> @@ -20,7 +44,12 @@ export default function ViewSearch() { radius={30} leftSection={} placeholder="Pencarian" + onChange={(e) => setSearch(e.target.value)} /> +
{JSON.stringify(dataUser, null, 1)}
+
{JSON.stringify(dataProject, null, 1)}
+
{JSON.stringify(dataDivision, null, 1)}
+ );