From 9977cb909e0f7d555559949b5759639933dfba20 Mon Sep 17 00:00:00 2001 From: lukman Date: Thu, 29 Aug 2024 10:26:21 +0800 Subject: [PATCH 1/3] test --- src/module/home/view/view_search.tsx | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/module/home/view/view_search.tsx diff --git a/src/module/home/view/view_search.tsx b/src/module/home/view/view_search.tsx new file mode 100644 index 0000000..74d8054 --- /dev/null +++ b/src/module/home/view/view_search.tsx @@ -0,0 +1,57 @@ +"use client" +import { LayoutNavbarNew, WARNA } from '@/module/_global'; +import { Box, TextInput } from '@mantine/core'; +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 ( + <> + } /> + + } + placeholder="Pencarian" + onChange={(e) => setSearch(e.target.value)} + /> + {/*
{JSON.stringify(dataUser, null, 1)}
+
{JSON.stringify(dataProject, null, 1)}
+
{JSON.stringify(dataDivision, null, 1)}
*/} + +
+ + ); +} + From 390c46e2da83127275d390187fb3fc58b86b5c3f Mon Sep 17 00:00:00 2001 From: lukman Date: Thu, 29 Aug 2024 09:59:01 +0800 Subject: [PATCH 2/3] upate --- src/module/home/view/view_search.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/module/home/view/view_search.tsx b/src/module/home/view/view_search.tsx index 74d8054..a967d7e 100644 --- a/src/module/home/view/view_search.tsx +++ b/src/module/home/view/view_search.tsx @@ -46,9 +46,9 @@ export default function ViewSearch() { placeholder="Pencarian" onChange={(e) => setSearch(e.target.value)} /> - {/*
{JSON.stringify(dataUser, null, 1)}
+
{JSON.stringify(dataUser, null, 1)}
{JSON.stringify(dataProject, null, 1)}
-
{JSON.stringify(dataDivision, null, 1)}
*/} +
{JSON.stringify(dataDivision, null, 1)}
From e2df0beb9f9a7bd91bcaac4824282c79eb5b032e Mon Sep 17 00:00:00 2001 From: lukman Date: Thu, 29 Aug 2024 15:52:54 +0800 Subject: [PATCH 3/3] feat : update filter dll Deskripsi - position - project - announcement - calneder - division - document - home No Issue --- src/app/api/position/route.ts | 18 +-- src/app/api/project/route.ts | 11 +- src/module/_global/view/view_filter.tsx | 79 +++++++---- .../announcement/ui/drawer_announcement.tsx | 16 --- .../announcement/ui/list_announcement.tsx | 3 +- .../calender/ui/detail_event_division.tsx | 54 ++++---- .../discussion/ui/detail_discussion.tsx | 14 +- src/module/division_new/ui/list_division.tsx | 27 ++++ .../document/ui/navbar_document_division.tsx | 8 +- src/module/home/lib/type_search.ts | 16 +++ src/module/home/ui/view_search.tsx | 130 ++++++++++++++++-- .../position/ui/drawer_list_position.tsx | 2 +- .../position/ui/list_position_active.tsx | 119 ++++++++++------ src/module/position/ui/tab_list_position.tsx | 5 +- src/module/project/ui/list_project.tsx | 30 +++- src/module/user/member/ui/tab_list_member.tsx | 87 ++++++++---- 16 files changed, 444 insertions(+), 175 deletions(-) diff --git a/src/app/api/position/route.ts b/src/app/api/position/route.ts index cb1b019..37dde56 100644 --- a/src/app/api/position/route.ts +++ b/src/app/api/position/route.ts @@ -9,9 +9,9 @@ import { NextResponse } from "next/server"; export async function GET(request: Request) { try { - let grupFix + let grup const { searchParams } = new URL(request.url); - const groupID = searchParams.get('group'); + const idGroup = searchParams.get("group"); const active = searchParams.get('active'); const name = searchParams.get('search') const user = await funGetUserByCookies() @@ -19,15 +19,15 @@ export async function GET(request: Request) { return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); } - if (groupID == "null") { - grupFix = user.idGroup - } else { - grupFix = groupID - } + if (idGroup == "null" || idGroup == undefined) { + grup = user.idGroup + } else { + grup = idGroup + } const cek = await prisma.group.count({ where: { - id: String(grupFix), + id: grup, isActive: true } }) @@ -38,7 +38,7 @@ export async function GET(request: Request) { const positions = await prisma.position.findMany({ where: { - idGroup: String(grupFix), + idGroup: grup, isActive: (active == "true" ? true : false), name: { contains: (name == undefined || name == null) ? "" : name, diff --git a/src/app/api/project/route.ts b/src/app/api/project/route.ts index 0a0ef8f..e945ca3 100644 --- a/src/app/api/project/route.ts +++ b/src/app/api/project/route.ts @@ -16,18 +16,25 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); + let grup const name = searchParams.get('search'); const status = searchParams.get('status'); + const idGroup = searchParams.get("group"); const villageId = user.idVillage - const groupId = user.idGroup const userId = user.id + if (idGroup == "null" || idGroup == undefined) { + grup = user.idGroup + } else { + grup = idGroup + } + const data = await prisma.project.findMany({ where: { isActive: true, idVillage: String(villageId), - idGroup: String(groupId), + idGroup: grup, createdBy: String(userId), title: { contains: (name == undefined || name == "null") ? "" : name, diff --git a/src/module/_global/view/view_filter.tsx b/src/module/_global/view/view_filter.tsx index 566d41d..fbc45b4 100644 --- a/src/module/_global/view/view_filter.tsx +++ b/src/module/_global/view/view_filter.tsx @@ -1,5 +1,5 @@ 'use client' -import { Box, Group, Divider, Button, Text } from "@mantine/core"; +import { Box, Group, Divider, Button, Text, Skeleton, rem } from "@mantine/core"; import { useEffect, useState } from "react"; import { FaCheck } from "react-icons/fa6"; import { WARNA } from "../fun/WARNA"; @@ -13,6 +13,7 @@ export default function ViewFilter({ linkFilter }: { linkFilter: string }) { const [selectedFilter, setSelectedFilter] = useState(null); const [checked, setChecked] = useState([]); const [searchParams, setSearchParams] = useState({ groupId: '' }); + const [loading, setLoading] = useState(true) const handleFilterClick = (id: string) => { setSelectedFilter(id); @@ -20,15 +21,19 @@ export default function ViewFilter({ linkFilter }: { linkFilter: string }) { async function getAllGroupFilter() { try { + setLoading(true) const response = await funGetAllGroup('?active=true') if (response.success) { setChecked(response.data); + setLoading(false) } else { toast.error(response.message); } } catch (error) { console.error(error); toast.error("Gagal mendapatkan grup, coba lagi nanti"); + } finally { + setLoading(false); } } @@ -48,34 +53,52 @@ export default function ViewFilter({ linkFilter }: { linkFilter: string }) { - {checked.map((filter) => ( - - handleFilterClick(filter.id)} - > - - {filter.name} - - {selectedFilter === filter.id && } - - - - ))} - + {loading ? ( + Array(5) + .fill(null) + .map((_, i) => ( + + + + + + )) + ) : + ( + checked.map((filter) => ( + + handleFilterClick(filter.id)} + > + + {filter.name} + + {selectedFilter === filter.id && } + + + + )) + ) + } + + + ); } \ No newline at end of file diff --git a/src/module/announcement/ui/drawer_announcement.tsx b/src/module/announcement/ui/drawer_announcement.tsx index 2d7d6d5..3422417 100644 --- a/src/module/announcement/ui/drawer_announcement.tsx +++ b/src/module/announcement/ui/drawer_announcement.tsx @@ -29,22 +29,6 @@ export default function DrawerAnnouncement() { Tambah Pengumuman - - { - router.push('/announcement?page=filter') - }} - > - - - - - Filter - - diff --git a/src/module/announcement/ui/list_announcement.tsx b/src/module/announcement/ui/list_announcement.tsx index 3704671..f87f0e5 100644 --- a/src/module/announcement/ui/list_announcement.tsx +++ b/src/module/announcement/ui/list_announcement.tsx @@ -4,11 +4,12 @@ import { ActionIcon, Box, Center, Divider, Grid, Group, Spoiler, Stack, Text, Te import React, { useState } from 'react'; import { TfiAnnouncement } from "react-icons/tfi"; import { HiMagnifyingGlass } from 'react-icons/hi2'; -import { useRouter } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useShallowEffect } from '@mantine/hooks'; import { IListDataAnnouncement } from '../lib/type_announcement'; import { funGetAllAnnouncement } from '../lib/api_announcement'; import toast from 'react-hot-toast'; +import { funGetAllGroup, IDataGroup } from '@/module/group'; export default function ListAnnouncement() { diff --git a/src/module/calender/ui/detail_event_division.tsx b/src/module/calender/ui/detail_event_division.tsx index 9f716a5..99fd43a 100644 --- a/src/module/calender/ui/detail_event_division.tsx +++ b/src/module/calender/ui/detail_event_division.tsx @@ -54,7 +54,7 @@ export default function DetailEventDivision() { {loading ? - + : - {isDataAnggota.map((v, i) => { - return ( - - - - - - {v.name} - - - {v.email} - - - - - ); - })} + {isLengthMember == 0? ( + + Tidak ada anggota + + ) : + + {isDataAnggota.map((v, i) => { + return ( + + + + + + {v.name} + + + {v.email} + + + + + ); + })} + + } diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index 68658be..ec23fa4 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -1,5 +1,5 @@ "use client" -import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Skeleton, Spoiler, Text, TextInput } from "@mantine/core"; +import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Input, rem, Skeleton, Spoiler, Text, TextInput } from "@mantine/core"; import { SkeletonDetailDiscussionComment, SkeletonDetailDiscussionMember, SkeletonSingle, WARNA } from "@/module/_global"; import { GrChatOption } from "react-icons/gr"; import { LuSendHorizonal } from "react-icons/lu"; @@ -64,7 +64,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv return ( - <> + {isLoad ? @@ -244,12 +244,13 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv }) } + {isLoad ? : - + {300 - isComent.length} karakter tersisa @@ -291,8 +292,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv } - - + ) } diff --git a/src/module/division_new/ui/list_division.tsx b/src/module/division_new/ui/list_division.tsx index 1a40c3d..355865c 100644 --- a/src/module/division_new/ui/list_division.tsx +++ b/src/module/division_new/ui/list_division.tsx @@ -11,6 +11,7 @@ import { useShallowEffect } from '@mantine/hooks'; import { IDataDivison } from '../lib/type_division'; import { funGetAllDivision } from '../lib/api_division'; import toast from 'react-hot-toast'; +import { funGetAllGroup, IDataGroup } from '@/module/group'; export default function ListDivision() { const [isList, setIsList] = useState(false) @@ -58,7 +59,30 @@ export default function ListDivision() { fetchData(searchQuery) }, [searchQuery]) + const [checked, setChecked] = useState([]); + const groupNameMap = (groupId: string) => { + const groupName = checked.find((group) => group.id === groupId)?.name; + return groupName || '-'; + }; + + async function getAllGroupFilter() { + try { + const response = await funGetAllGroup('?active=true') + if (response.success) { + setChecked(response.data); + } else { + toast.error(response.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan grup, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getAllGroupFilter(); + }, []); return ( @@ -66,6 +90,7 @@ export default function ListDivision() { menu={ (setOpenDrawer(true))} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> } /> + @@ -96,6 +121,8 @@ export default function ListDivision() { + {/* {group && Filter by: {group}} */} + {group && Filter by: {groupNameMap(group)}} {loading ? <> diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index 7d8f917..d72e2d6 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -1,6 +1,6 @@ 'use client' import { LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; -import { ActionIcon, Anchor, Box, Breadcrumbs, Button, Checkbox, Divider, Flex, Grid, Group, Indicator, Modal, Select, SimpleGrid, Text, TextInput } from '@mantine/core'; +import { ActionIcon, Anchor, Box, Breadcrumbs, Button, Checkbox, Divider, Flex, Grid, Group, Indicator, Modal, rem, Select, SimpleGrid, Text, TextInput } from '@mantine/core'; import React, { useState } from 'react'; import { HiMenu } from 'react-icons/hi'; import { FcDocument, FcFolder, FcImageFile } from 'react-icons/fc'; @@ -216,7 +216,8 @@ export default function NavbarDocumentDivision() { {(selectedFiles.length > 0 || dariSelectAll) && ( <> - @@ -234,7 +235,8 @@ export default function NavbarDocumentDivision() { - diff --git a/src/module/home/lib/type_search.ts b/src/module/home/lib/type_search.ts index e69de29..d2100d7 100644 --- a/src/module/home/lib/type_search.ts +++ b/src/module/home/lib/type_search.ts @@ -0,0 +1,16 @@ +export interface IDataUserSearch { + id: string + name: string + email: string +} + +export interface IDataDivisionSearch { + id: string + title: string +} + +export interface IDataProjectSearch { + id: string + name: string + desc: string + } diff --git a/src/module/home/ui/view_search.tsx b/src/module/home/ui/view_search.tsx index 74d8054..93a6fd2 100644 --- a/src/module/home/ui/view_search.tsx +++ b/src/module/home/ui/view_search.tsx @@ -1,16 +1,17 @@ "use client" import { LayoutNavbarNew, WARNA } from '@/module/_global'; -import { Box, TextInput } from '@mantine/core'; +import { ActionIcon, Box, Divider, Grid, Group, Text, TextInput } from '@mantine/core'; import React, { useState } from 'react'; -import { HiMagnifyingGlass } from 'react-icons/hi2'; +import { HiMagnifyingGlass, HiMiniUser } from 'react-icons/hi2'; import { funGetSearchAll } from '../lib/api_search'; import { useShallowEffect } from '@mantine/hooks'; +import { IDataDivisionSearch, IDataProjectSearch, IDataUserSearch } from '../lib/type_search'; export default function ViewSearch() { const [search, setSearch] = useState(''); - const [dataUser, setDataUser] = useState([]); - const [dataProject, setDataProject] = useState([]); - const [dataDivision, setDataDivision] = useState([]); + const [dataUser, setDataUser] = useState([]); + const [dataProject, setDataProject] = useState([]); + const [dataDivision, setDataDivision] = useState([]); async function featchSearch() { try { @@ -25,7 +26,9 @@ export default function ViewSearch() { } useShallowEffect(() => { - featchSearch() + if (search !== '') { + featchSearch() + } }, [search]) return ( @@ -46,10 +49,117 @@ export default function ViewSearch() { placeholder="Pencarian" onChange={(e) => setSearch(e.target.value)} /> - {/*
{JSON.stringify(dataUser, null, 1)}
-
{JSON.stringify(dataProject, null, 1)}
-
{JSON.stringify(dataDivision, null, 1)}
*/} - + {dataUser.length || dataProject.length || dataDivision.length > 0 ? ( + + + + ANGGOTA + {dataUser.length > 0 ? ( + + {dataUser.map((v, i) => { + return ( + + + + + + + + + {v.name} + {v.email} + + + + + ) + })} + + ) : + Tidak Ada Anggota + } + + DIVISI + + {dataDivision.length > 0 ? ( + + {dataDivision.map((v, i) => { + return ( + + + + + + + + + {v.name.toUpperCase()} + + + {v.desc} + + + ) + })} + + ) : + Tidak Ada Divisi + } + + + + KEGIATAN + + {dataProject.length > 0 ? ( + + {dataProject.map((v, i) => { + return ( + + + + + + + + + {v.title.toUpperCase()} + + + + + ) + })} + + ) + : Tidak Ada Kegiatan + } + + + + + ) + : null + }
); diff --git a/src/module/position/ui/drawer_list_position.tsx b/src/module/position/ui/drawer_list_position.tsx index 0f890a6..6d6671e 100644 --- a/src/module/position/ui/drawer_list_position.tsx +++ b/src/module/position/ui/drawer_list_position.tsx @@ -82,7 +82,7 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo Tambah Jabatan
- router.push('/position?page=filter')}> + router.push('/position?active=true&page=filter')}> diff --git a/src/module/position/ui/list_position_active.tsx b/src/module/position/ui/list_position_active.tsx index c6e6701..14e1bed 100644 --- a/src/module/position/ui/list_position_active.tsx +++ b/src/module/position/ui/list_position_active.tsx @@ -12,6 +12,7 @@ import { funGetAllPosition } from "../lib/api_position"; import { IDataPosition } from "../lib/type_position"; import { useHookstate } from "@hookstate/core"; import { globalRefreshPosition } from "../lib/val_posisition"; +import { funGetAllGroup, IDataGroup } from "@/module/group"; export default function ListPositionActive() { @@ -29,7 +30,7 @@ export default function ListPositionActive() { async function getAllPosition() { try { - setDataPosition([]); + // setDataPosition([]); setLoading(true) const res = await funGetAllPosition('?active=' + status + '&group=' + group + '&search=' + searchQuery) setDataPosition(res.data); @@ -46,6 +47,31 @@ export default function ListPositionActive() { getAllPosition(); }, [status, group, searchQuery, refresh.get()]) + const [checked, setChecked] = useState([]); + + const groupNameMap = (groupId: string) => { + const groupName = checked.find((group) => group.id === groupId)?.name; + return groupName || '-'; + }; + + async function getAllGroupFilter() { + try { + const response = await funGetAllGroup('?active=true') + if (response.success) { + setChecked(response.data); + } else { + toast.error(response.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan grup, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getAllGroupFilter(); + }, []); + return ( )) : - _.isEmpty(isDataPosition) ? - - Tidak ada jabatan - - : - isDataPosition.map((v, i) => { - return ( - - { - setData(v.name); - setOpenDrawer(true); - setSelectId(v.id); - setActive(v.isActive); - }} - > - - + {group && Filter by: {groupNameMap(group)}} + {isDataPosition.length == 0 ? + + Tidak ada jabatan + + : + + {isDataPosition.map((v, i) => { + return ( + + { + setData(v.name); + setOpenDrawer(true); + setSelectId(v.id); + setActive(v.isActive); + }} > - - + + + + + + + + {v.name} + + + {v.group} + + + - - - {v.name} - - - {v.group} - - - -
- ); - }) + ); + })} +
} +
} @@ -26,7 +27,7 @@ export default function TabListPosition() { value="true" w={"45%"} leftSection={} - onClick={() => { router.push("/position?active=true") }} + onClick={() => { router.push("/position?active=true&group=" + group) }} > Aktif @@ -34,7 +35,7 @@ export default function TabListPosition() { value="false" w={"53%"} leftSection={} - onClick={() => { router.push("/position?active=false") }} + onClick={() => { router.push("/position?active=false&group=" + group) }} > Tidak Aktif diff --git a/src/module/project/ui/list_project.tsx b/src/module/project/ui/list_project.tsx index 3e6315c..38d442c 100644 --- a/src/module/project/ui/list_project.tsx +++ b/src/module/project/ui/list_project.tsx @@ -10,6 +10,7 @@ import { funGetAllProject } from '../lib/api_project'; import toast from 'react-hot-toast'; import { useShallowEffect } from '@mantine/hooks'; import { IDataProject } from '../lib/type_project'; +import { funGetAllGroup, IDataGroup } from '@/module/group'; export default function ListProject() { const [isList, setIsList] = useState(false) @@ -18,6 +19,7 @@ export default function ListProject() { const [loading, setLoading] = useState(true); const searchParams = useSearchParams() const status = searchParams.get('status') + const group = searchParams.get('group') const [searchQuery, setSearchQuery] = useState('') const fetchData = async () => { @@ -25,7 +27,7 @@ export default function ListProject() { setData([]); setLoading(true); - const response = await funGetAllProject('?status=' + status + '&search=' + searchQuery) + const response = await funGetAllProject('?status=' + status + '&search=' + searchQuery + '&group=' + group) if (response.success) { setData(response?.data) @@ -51,6 +53,31 @@ export default function ListProject() { setIsList(!isList) } + const [checked, setChecked] = useState([]); + + const groupNameMap = (groupId: string) => { + const groupName = checked.find((group) => group.id === groupId)?.name; + return groupName || '-'; + }; + + async function getAllGroupFilter() { + try { + const response = await funGetAllGroup('?active=true') + if (response.success) { + setChecked(response.data); + } else { + toast.error(response.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan grup, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getAllGroupFilter(); + }, []); + return ( @@ -82,6 +109,7 @@ export default function ListProject() { + {group && Filter by: {groupNameMap(group)}} Total Kegiatan diff --git a/src/module/user/member/ui/tab_list_member.tsx b/src/module/user/member/ui/tab_list_member.tsx index f724052..96d46e7 100644 --- a/src/module/user/member/ui/tab_list_member.tsx +++ b/src/module/user/member/ui/tab_list_member.tsx @@ -7,6 +7,8 @@ import { useEffect, useState } from "react" import { HiMagnifyingGlass, HiMiniUser } from "react-icons/hi2" import { IListMember } from "../lib/type_member" import { funGetAllmember } from "../lib/api_member" +import { funGetAllGroup, IDataGroup } from "@/module/group" +import toast from "react-hot-toast" export default function TabListMember() { @@ -36,6 +38,31 @@ export default function TabListMember() { getAllUser() }, [status, searchQuery]) + const [checked, setChecked] = useState([]); + + const groupNameMap = (groupId: string) => { + const groupName = checked.find((group) => group.id === groupId)?.name; + return groupName || '-'; + }; + + async function getAllGroupFilter() { + try { + const response = await funGetAllGroup('?active=true') + if (response.success) { + setChecked(response.data); + } else { + toast.error(response.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan grup, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getAllGroupFilter(); + }, []); + return ( <> @@ -63,35 +90,39 @@ export default function TabListMember() { )) : - dataMember.length == 0 ? - - Tidak ada anggota - - : - dataMember.map((v, i) => { - return ( - - { - router.push(`/member/${v.id}`) - }}> - - - - - - - - {v.name} - {v.group + ' - ' + v.position} - - + + {group && Filter by: {groupNameMap(group)}} + {dataMember.length == 0 ? + + Tidak ada anggota + + : + dataMember.map((v, i) => { + return ( + + { + router.push(`/member/${v.id}`) + }}> + + + + + + + + {v.name} + {v.group + ' - ' + v.position} + + + + - - - ) - }) + ) + }) + } + }