Merge pull request #97 from bipproduction/amalia/7-agustus-24
upd: new group
This commit is contained in:
@@ -1,9 +1,13 @@
|
|||||||
import { ViewGroup } from '@/module/group';
|
import { NavbarGroup, TabListGroup } from '@/module/group';
|
||||||
|
import { Box } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<ViewGroup />
|
<Box>
|
||||||
|
<NavbarGroup />
|
||||||
|
<TabListGroup />
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
138
src/app/api/group/[id]/route.ts
Normal file
138
src/app/api/group/[id]/route.ts
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
import { prisma } from "@/module/_global";
|
||||||
|
import { funGetUserByCookies } from "@/module/auth";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
|
export const dynamic = 'force-dynamic'
|
||||||
|
export const revalidate = true
|
||||||
|
export async function GET(request: Request, context: { params: { id: string } }) {
|
||||||
|
try {
|
||||||
|
const { id } = context.params;
|
||||||
|
const user = await funGetUserByCookies()
|
||||||
|
if (user.id == undefined) {
|
||||||
|
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await prisma.group.findUnique({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
message: "Gagal mendapatkan grup, data tidak ditemukan",
|
||||||
|
},
|
||||||
|
{ status: 404 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: true,
|
||||||
|
message: "Berhasil mendapatkan grup",
|
||||||
|
data,
|
||||||
|
},
|
||||||
|
{ status: 200 }
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal mendapatkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function DELETE(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.group.count({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (data == 0) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
message: "Edit grup gagal, data tidak ditemukan",
|
||||||
|
},
|
||||||
|
{ status: 404 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const update = await prisma.group.update({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
isActive: !isActive,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: true,
|
||||||
|
message: "Grup berhasil diedit",
|
||||||
|
data,
|
||||||
|
},
|
||||||
|
{ status: 200 }
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal mendapatkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function PUT(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 { name } = (await request.json());
|
||||||
|
const data = await prisma.group.count({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (data == 0) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
message: "Edit grup gagal, data tidak ditemukan",
|
||||||
|
},
|
||||||
|
{ status: 404 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const update = await prisma.group.update({
|
||||||
|
where: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
name: name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: true,
|
||||||
|
message: "Grup berhasil diedit",
|
||||||
|
data,
|
||||||
|
},
|
||||||
|
{ status: 200 }
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal mendapatkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
71
src/app/api/group/route.ts
Normal file
71
src/app/api/group/route.ts
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import { prisma } from "@/module/_global";
|
||||||
|
import { funGetUserByCookies } from "@/module/auth";
|
||||||
|
import { revalidatePath, revalidateTag } from "next/cache";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
|
export const dynamic = 'force-dynamic'
|
||||||
|
export const revalidate = true
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
try {
|
||||||
|
const user = await funGetUserByCookies()
|
||||||
|
if (user.id == undefined) {
|
||||||
|
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const villaId = user.idVillage
|
||||||
|
const { searchParams } = new URL(request.url);
|
||||||
|
const isActive = searchParams.get("active");
|
||||||
|
const name = searchParams.get('search');
|
||||||
|
|
||||||
|
const data = await prisma.group.findMany({
|
||||||
|
where: {
|
||||||
|
isActive: isActive == 'false' ? false : true,
|
||||||
|
idVillage: String(villaId),
|
||||||
|
name: {
|
||||||
|
contains: (name == undefined || name == null) ? "" : name,
|
||||||
|
mode: "insensitive"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
name: true,
|
||||||
|
isActive: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return NextResponse.json({ success: true, message: "Berhasil mendapatkan grup", data, }, { status: 200 });
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal mendapatkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
try {
|
||||||
|
const user = await funGetUserByCookies()
|
||||||
|
if (user.id == undefined) {
|
||||||
|
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const { name } = (await request.json());
|
||||||
|
const villaId = user.idVillage
|
||||||
|
const data = await prisma.group.create({
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
idVillage: String(villaId)
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
revalidatePath('/api/group?active=true', "page")
|
||||||
|
revalidatePath('/api/group?active=false', 'page')
|
||||||
|
revalidatePath('/group?active=true', 'page')
|
||||||
|
revalidateTag('group')
|
||||||
|
|
||||||
|
return NextResponse.json({ success: true, message: "Berhasil menambahkan grup", data, }, { status: 200 });
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal menambahkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { API_ADDRESS, LayoutNavbarNew, WARNA } from "@/module/_global";
|
import { API_ADDRESS, LayoutNavbarNew, WARNA } from "@/module/_global";
|
||||||
import { TypeGroup } from "@/module/group";
|
|
||||||
import { useHookstate } from "@hookstate/core";
|
import { useHookstate } from "@hookstate/core";
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
@@ -25,11 +24,11 @@ import CreateAdminDivision from "./create_admin_division";
|
|||||||
import CreateUsers from "./create_users";
|
import CreateUsers from "./create_users";
|
||||||
import NavbarCreateUsers from "./ui/navbar_create_users";
|
import NavbarCreateUsers from "./ui/navbar_create_users";
|
||||||
import NavbarAdminDivision from "./ui/navbar_admin_division";
|
import NavbarAdminDivision from "./ui/navbar_admin_division";
|
||||||
|
import { IDataGroup } from "@/module/group";
|
||||||
|
|
||||||
export default function CreateDivision() {
|
export default function CreateDivision() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [dataGroup, setDataGroup] = useState<TypeGroup>();
|
const [dataGroup, setDataGroup] = useState<IDataGroup[]>([]);
|
||||||
const [roleUser, setRoleUser] = useState<any>("")
|
const [roleUser, setRoleUser] = useState<any>("")
|
||||||
const [isChooseAnggota, setChooseAnggota] = useState(false)
|
const [isChooseAnggota, setChooseAnggota] = useState(false)
|
||||||
const [isChooseAdmin, setChooseAdmin] = useState(false)
|
const [isChooseAdmin, setChooseAdmin] = useState(false)
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
import { TypeGroup } from './lib/type_group';
|
import { IDataGroup, IFormGroup, IStatusGroup } from './lib/type_group';
|
||||||
import { apiGroup } from "./api/api_group";
|
import { apiGroup } from "./api/api_group";
|
||||||
import ViewGroup from "./view/view_group";
|
import { funCreateGroup, funEditGroup, funEditStatusGroup, funGetAllGroup, funGetGroupById } from './lib/api_group';
|
||||||
|
import NavbarGroup from './ui/navbar_group';
|
||||||
|
import TabListGroup from './ui/tab_list_group';
|
||||||
|
|
||||||
export { ViewGroup };
|
|
||||||
export { apiGroup };
|
export { apiGroup };
|
||||||
export type { TypeGroup }
|
export type { IDataGroup, IFormGroup, IStatusGroup }
|
||||||
|
export { funGetAllGroup, funGetGroupById, funCreateGroup, funEditStatusGroup, funEditGroup }
|
||||||
|
export { NavbarGroup }
|
||||||
|
export { TabListGroup }
|
||||||
|
|||||||
48
src/module/group/lib/api_group.ts
Normal file
48
src/module/group/lib/api_group.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import { IFormGroup, IStatusGroup } from "./type_group";
|
||||||
|
|
||||||
|
export const funGetAllGroup = async (path?: string) => {
|
||||||
|
const response = await fetch(`/api/group${(path) ? path : ''}`, { next: { tags: ['group'] } });
|
||||||
|
return await response.json().catch(() => null);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const funGetGroupById = async (path: string) => {
|
||||||
|
const response = await fetch(`/api/group/${path}`);
|
||||||
|
return await response.json().catch(() => null);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const funCreateGroup = async (data: IFormGroup) => {
|
||||||
|
if (data.name.length < 3)
|
||||||
|
return { success: false, message: 'Minimal 3 karakter' }
|
||||||
|
|
||||||
|
const response = await fetch("/api/group", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
return await response.json().catch(() => null);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const funEditStatusGroup = async (path: string, data: IStatusGroup) => {
|
||||||
|
const response = await fetch(`/api/group/${path}`, {
|
||||||
|
method: "DELETE",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
return await response.json().catch(() => null);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const funEditGroup = async (path: string, data: IFormGroup) => {
|
||||||
|
const response = await fetch(`/api/group/${path}`, {
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
return await response.json().catch(() => null);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -1,5 +1,13 @@
|
|||||||
export type TypeGroup = {
|
export interface IDataGroup {
|
||||||
id: string
|
id: string
|
||||||
name: string
|
name: string
|
||||||
isActive: boolean
|
isActive: boolean
|
||||||
}[]
|
}[]
|
||||||
|
|
||||||
|
export interface IFormGroup {
|
||||||
|
name : string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IStatusGroup {
|
||||||
|
isActive: boolean;
|
||||||
|
}
|
||||||
@@ -12,32 +12,29 @@ import {
|
|||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { IoAddCircle } from "react-icons/io5";
|
import { IoAddCircle } from "react-icons/io5";
|
||||||
|
import { funCreateGroup } from "../lib/api_group";
|
||||||
|
import toast from "react-hot-toast";
|
||||||
|
|
||||||
export default function DrawerGroup({
|
export default function DrawerGroup({ onSuccess, }: { onSuccess: (val: boolean) => void; }) {
|
||||||
onSuccess,
|
|
||||||
}: {
|
|
||||||
onSuccess: (val: boolean) => void;
|
|
||||||
}) {
|
|
||||||
const [openDrawerGroup, setOpenDrawerGroup] = useState(false);
|
const [openDrawerGroup, setOpenDrawerGroup] = useState(false);
|
||||||
const [namaGroup, setNamaGroup] = useState("");
|
const [namaGroup, setNamaGroup] = useState("");
|
||||||
|
|
||||||
|
|
||||||
async function onCreate() {
|
async function createData() {
|
||||||
try {
|
try {
|
||||||
const res = await fetch(API_ADDRESS.apiCreateGroup, {
|
const response = await funCreateGroup({ name: namaGroup })
|
||||||
method: "POST",
|
|
||||||
headers: {
|
if (response.success) {
|
||||||
"Content-Type": "application/json",
|
toast.success(response.message);
|
||||||
},
|
setOpenDrawerGroup(false)
|
||||||
body: JSON.stringify({
|
onSuccess(true)
|
||||||
name: namaGroup,
|
} else {
|
||||||
}),
|
toast.error(response.message)
|
||||||
});
|
}
|
||||||
setOpenDrawerGroup(false);
|
|
||||||
onSuccess(true);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
onSuccess(false);
|
toast.error("Gagal menambahkan grup, coba lagi nanti");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +81,7 @@ export default function DrawerGroup({
|
|||||||
size="lg"
|
size="lg"
|
||||||
radius={30}
|
radius={30}
|
||||||
fullWidth
|
fullWidth
|
||||||
onClick={onCreate}
|
onClick={createData}
|
||||||
>
|
>
|
||||||
Simpan
|
Simpan
|
||||||
</Button>
|
</Button>
|
||||||
@@ -10,49 +10,46 @@ import {
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { HiOutlineOfficeBuilding } from "react-icons/hi";
|
import { HiOutlineOfficeBuilding } from "react-icons/hi";
|
||||||
import { HiMagnifyingGlass } from "react-icons/hi2";
|
import { HiMagnifyingGlass } from "react-icons/hi2";
|
||||||
import EditDrawerGroup from "./ui/edit_drawer_group";
|
import EditDrawerGroup from "./edit_drawer_group";
|
||||||
import toast from "react-hot-toast";
|
import toast from "react-hot-toast";
|
||||||
import { useShallowEffect } from "@mantine/hooks";
|
import { useShallowEffect } from "@mantine/hooks";
|
||||||
|
import { funGetAllGroup } from "../lib/api_group";
|
||||||
|
import { IDataGroup } from "../lib/type_group";
|
||||||
|
|
||||||
type dataGroup = {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
isActive: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function ListGroupActive({ status }: { status: boolean }) {
|
export default function ListGroupActive({ status }: { status: boolean }) {
|
||||||
const [openDrawer, setOpenDrawer] = useState(false);
|
const [openDrawer, setOpenDrawer] = useState(false);
|
||||||
const [valChoose, setValChoose] = useState("");
|
const [valChoose, setValChoose] = useState("");
|
||||||
const [isData, setData] = useState<dataGroup[]>([]);
|
const [isData, setData] = useState<IDataGroup[]>([]);
|
||||||
const [selectId, setSelectId] = useState<string | null>(null);
|
const [selectId, setSelectId] = useState<string | null>(null);
|
||||||
const [active, setActive] = useState<boolean | null>(null);
|
const [active, setActive] = useState<boolean | null>(null);
|
||||||
const [searchQuery, setSearchQuery] = useState('')
|
const [searchQuery, setSearchQuery] = useState('')
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
const getData = async () => {
|
const fetchData = async () => {
|
||||||
try {
|
try {
|
||||||
setData([]);
|
setData([]);
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const res = await fetch(
|
|
||||||
`${API_ADDRESS.apiGetAllGroup}&villageId=121212&active=${status}&name=${searchQuery}`
|
const response = await funGetAllGroup('?active=' + status + '&search=' + searchQuery)
|
||||||
);
|
|
||||||
const data = await res.json();
|
if (response.success) {
|
||||||
setData(data);
|
setData(response?.data)
|
||||||
|
} else {
|
||||||
|
toast.error(response.message);
|
||||||
|
}
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof Error) {
|
toast.error("Gagal mendapatkan grup, coba lagi nanti");
|
||||||
console.error(error);
|
console.error(error);
|
||||||
toast.error("Terjadi kesalahan");
|
|
||||||
} else {
|
|
||||||
console.error("Error tidak diketahui");
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
getData();
|
fetchData();
|
||||||
}, [status, searchQuery]);
|
}, [status, searchQuery]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -120,6 +117,7 @@ export default function ListGroupActive({ status }: { status: boolean }) {
|
|||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
||||||
<LayoutDrawer
|
<LayoutDrawer
|
||||||
opened={openDrawer}
|
opened={openDrawer}
|
||||||
onClose={() => setOpenDrawer(false)}
|
onClose={() => setOpenDrawer(false)}
|
||||||
@@ -131,7 +129,7 @@ export default function ListGroupActive({ status }: { status: boolean }) {
|
|||||||
onUpdated={(val) => {
|
onUpdated={(val) => {
|
||||||
if (val) {
|
if (val) {
|
||||||
toast.success("Sukses! data tersimpan");
|
toast.success("Sukses! data tersimpan");
|
||||||
getData();
|
// fetchData();
|
||||||
}
|
}
|
||||||
setOpenDrawer(false);
|
setOpenDrawer(false);
|
||||||
}}
|
}}
|
||||||
@@ -4,7 +4,6 @@ import { ActionIcon, } from '@mantine/core';
|
|||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { HiMenu } from "react-icons/hi";
|
import { HiMenu } from "react-icons/hi";
|
||||||
import DrawerGroup from './drawer_group';
|
import DrawerGroup from './drawer_group';
|
||||||
import toast from 'react-hot-toast';
|
|
||||||
|
|
||||||
export default function NavbarGroup() {
|
export default function NavbarGroup() {
|
||||||
const [isOpen, setOpen] = useState(false)
|
const [isOpen, setOpen] = useState(false)
|
||||||
@@ -18,10 +17,7 @@ export default function NavbarGroup() {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<LayoutDrawer opened={isOpen} title={'Menu'} onClose={() => setOpen(false)}>
|
<LayoutDrawer opened={isOpen} title={'Menu'} onClose={() => setOpen(false)}>
|
||||||
<DrawerGroup onSuccess={() => {
|
<DrawerGroup onSuccess={() => { setOpen(false) }} />
|
||||||
setOpen(false)
|
|
||||||
toast.success('Sukses! data tersimpan')
|
|
||||||
}} />
|
|
||||||
</LayoutDrawer>
|
</LayoutDrawer>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
@@ -39,7 +39,6 @@ export default function TabListGroup() {
|
|||||||
</Tabs.Panel>
|
</Tabs.Panel>
|
||||||
|
|
||||||
<Tabs.Panel value="tidak-aktif">
|
<Tabs.Panel value="tidak-aktif">
|
||||||
{/* <ListGroupNonActive /> */}
|
|
||||||
<ListGroupActive status={false} />
|
<ListGroupActive status={false} />
|
||||||
</Tabs.Panel>
|
</Tabs.Panel>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import NavbarGroup from '../components/ui/navbar_group';
|
|
||||||
import { Box } from '@mantine/core';
|
|
||||||
import ListGroupActive from '../components/list_group_active';
|
|
||||||
import TabListGroup from '../components/tab_list_group';
|
|
||||||
|
|
||||||
export default function ViewGroup() {
|
|
||||||
return (
|
|
||||||
<Box>
|
|
||||||
<NavbarGroup />
|
|
||||||
<TabListGroup/>
|
|
||||||
</Box>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user