Merge pull request #92 from bipproduction/amalia/5-agustus-24
Amalia/5 agustus 24
This commit is contained in:
1
.env
1
.env
@@ -5,3 +5,4 @@
|
|||||||
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
||||||
|
|
||||||
DATABASE_URL="postgresql://bip:Production_123d@localhost:5433/sistem_desa_mandiri?schema=public"
|
DATABASE_URL="postgresql://bip:Production_123d@localhost:5433/sistem_desa_mandiri?schema=public"
|
||||||
|
URL="http://localhost:3000"
|
||||||
@@ -257,7 +257,7 @@ model DivisionProject {
|
|||||||
idDivision String
|
idDivision String
|
||||||
title String
|
title String
|
||||||
desc String @db.Text
|
desc String @db.Text
|
||||||
status Int @default(0)
|
status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { ViewDetailDivision } from '@/module/division_new';
|
import { ViewDetailDivision } from '@/module/division_new';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
function Page() {
|
function Page({ params }: { params: { id: string } }) {
|
||||||
return (
|
return (
|
||||||
<ViewDetailDivision />
|
<ViewDetailDivision id={params.id}/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,4 +38,7 @@ export const API_ADDRESS = {
|
|||||||
|
|
||||||
// Division
|
// Division
|
||||||
"apiGetAllDivision": "/api/division/get?path=get-all-division",
|
"apiGetAllDivision": "/api/division/get?path=get-all-division",
|
||||||
|
"apiGetOneDivision": "/api/division/get?path=get-one-division",
|
||||||
|
"apiGetOneDetailDivision": "/api/division/get?path=get-one-detail-division",
|
||||||
|
"apiCreateDivision": "/api/division/post?path=create-division",
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import getAllDivision from "./get/getAllDivision";
|
import getAllDivision from "./get/getAllDivision";
|
||||||
import getOneDivision from "./get/getOneDivision";
|
import getOneDivision from "./get/getOneDivision";
|
||||||
|
import getOneDetailDivision from "./get/getOneDetailDivision";
|
||||||
import createDivision from "./post/createDivision";
|
import createDivision from "./post/createDivision";
|
||||||
import deleteDivision from "./post/deleteDivision";
|
import deleteDivision from "./post/deleteDivision";
|
||||||
import updateDivision from "./post/updateDivision";
|
import updateDivision from "./post/updateDivision";
|
||||||
@@ -30,4 +31,9 @@ export const API_INDEX_DIVISION = [
|
|||||||
method: "GET",
|
method: "GET",
|
||||||
bin: getOneDivision,
|
bin: getOneDivision,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "get-one-detail-division",
|
||||||
|
method: "GET",
|
||||||
|
bin: getOneDetailDivision,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
87
src/module/division_new/api/get/getOneDetailDivision.ts
Normal file
87
src/module/division_new/api/get/getOneDetailDivision.ts
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import { prisma } from '@/module/_global';
|
||||||
|
import { NextRequest } from "next/server";
|
||||||
|
|
||||||
|
export default async function getOneDetailDivision(req: NextRequest) {
|
||||||
|
try {
|
||||||
|
const searchParams = req.nextUrl.searchParams
|
||||||
|
const id = searchParams.get('divisionId');
|
||||||
|
|
||||||
|
console.log('aaaaa',id)
|
||||||
|
const division = await prisma.division.findUnique({
|
||||||
|
where: {
|
||||||
|
id: String(id),
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
name: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const member = await prisma.divisionMember.findMany({
|
||||||
|
where: {
|
||||||
|
idDivision: String(id),
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
idUser: true,
|
||||||
|
isLeader: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const tugas = await prisma.divisionProject.count({
|
||||||
|
where: {
|
||||||
|
idDivision: String(id),
|
||||||
|
status: {
|
||||||
|
lte: 1
|
||||||
|
},
|
||||||
|
isActive: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const dokumen = await prisma.divisionDocumentFolderFile.count({
|
||||||
|
where: {
|
||||||
|
idDivision: String(id),
|
||||||
|
isActive: true,
|
||||||
|
category: "FILE"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const diskusi = await prisma.divisionDisscussion.count({
|
||||||
|
where: {
|
||||||
|
idDivision: String(id),
|
||||||
|
isActive: true,
|
||||||
|
status: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const kalender = await prisma.divisionCalendar.count({
|
||||||
|
where: {
|
||||||
|
idDivision: String(id),
|
||||||
|
isActive: true,
|
||||||
|
dateStart: {
|
||||||
|
lte: new Date()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const allData = {
|
||||||
|
// division: division,
|
||||||
|
division:{name:id},
|
||||||
|
jumlah:{
|
||||||
|
tugas: 1,
|
||||||
|
dokumen: dokumen,
|
||||||
|
diskusi: diskusi,
|
||||||
|
kalender: kalender
|
||||||
|
},
|
||||||
|
member: member,
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.json(allData);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return Response.json(
|
||||||
|
{ message: "Internal Server Error", success: false },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,26 +1,40 @@
|
|||||||
import { prisma } from "@/module/_global";
|
import { prisma } from "@/module/_global";
|
||||||
|
import { funGetUserByCookies } from "@/module/auth";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { revalidatePath } from "next/cache";
|
||||||
|
|
||||||
export default async function createDivision(req: Request) {
|
export default async function createDivision(req: Request) {
|
||||||
try {
|
try {
|
||||||
const data = await req.json();
|
const sent = await req.json();
|
||||||
const insert = await prisma.division.create({
|
const user = await funGetUserByCookies();
|
||||||
|
|
||||||
|
const insertDivision = await prisma.division.create({
|
||||||
data: {
|
data: {
|
||||||
name: data.name,
|
name: sent.data.name,
|
||||||
idVillage: data.idVillage,
|
idVillage: String(user.idVillage),
|
||||||
idGroup: data.idGroup,
|
idGroup: sent.data.idGroup,
|
||||||
desc: data.desc,
|
desc: sent.data.desc,
|
||||||
createdBy: data.createdBy
|
createdBy: String(user.id)
|
||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true
|
id: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const dataMember = sent.member.map((v: any) => ({
|
||||||
|
..._.omit(v, ["isActive", "nik", "name", "phone", "email", "gender", "group", "position"]),
|
||||||
|
idUser: v.id,
|
||||||
|
idDivision: insertDivision.id,
|
||||||
|
isAdmin: sent.admin.some((i: any) => i == v.id)
|
||||||
|
}))
|
||||||
|
|
||||||
const insertMember = await prisma.divisionMember.createMany({
|
const insertMember = await prisma.divisionMember.createMany({
|
||||||
data: data.member
|
data: dataMember
|
||||||
})
|
})
|
||||||
|
|
||||||
return Response.json(insert, { status: 201 });
|
revalidatePath("/division");
|
||||||
|
|
||||||
|
return Response.json({ success: true, message: "Sukses menambahkan data divisi" }, { status: 201 });
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import NavbarAdminDivision from './ui/navbar_admin_division';
|
|||||||
|
|
||||||
export default function CreateAdminDivision({ data }: { data: any }) {
|
export default function CreateAdminDivision({ data }: { data: any }) {
|
||||||
return (
|
return (
|
||||||
<NavbarAdminDivision />
|
<NavbarAdminDivision data={data} onSuccess={() => { }} />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import { funGetUserByCookies } from "@/module/auth";
|
|||||||
import CreateAdminDivision from "./create_admin_division";
|
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";
|
||||||
|
|
||||||
|
|
||||||
export default function CreateDivision() {
|
export default function CreateDivision() {
|
||||||
@@ -74,12 +75,30 @@ export default function CreateDivision() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onChooseGroup(val: any) {
|
||||||
|
member.set([])
|
||||||
|
setBody({ ...body, idGroup: val })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
loadData();
|
loadData();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (isChooseAdmin) return <CreateAdminDivision data={body} />
|
if (isChooseAdmin) return <NavbarAdminDivision data={body} onSuccess={(val) => {
|
||||||
|
if (val) {
|
||||||
|
member.set([])
|
||||||
|
setBody({
|
||||||
|
...body,
|
||||||
|
idGroup: "",
|
||||||
|
name: "",
|
||||||
|
desc: "",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setChooseAdmin(false)
|
||||||
|
}} />
|
||||||
|
|
||||||
if (isChooseAnggota) return <NavbarCreateUsers grup={body.idGroup} onClose={() => { setChooseAnggota(false) }} />
|
if (isChooseAnggota) return <NavbarCreateUsers grup={body.idGroup} onClose={() => { setChooseAnggota(false) }} />
|
||||||
|
|
||||||
@@ -101,8 +120,10 @@ export default function CreateDivision() {
|
|||||||
label: pro.name
|
label: pro.name
|
||||||
}))}
|
}))}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
setBody({ ...body, idGroup: val })
|
onChooseGroup(val)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
value={body.idGroup}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -112,9 +133,10 @@ export default function CreateDivision() {
|
|||||||
size="md"
|
size="md"
|
||||||
required
|
required
|
||||||
radius={40}
|
radius={40}
|
||||||
|
value={body.name}
|
||||||
onChange={(val) => { setBody({ ...body, name: val.target.value }) }}
|
onChange={(val) => { setBody({ ...body, name: val.target.value }) }}
|
||||||
/>
|
/>
|
||||||
<Textarea size="md" placeholder="Deskripsi" label="Deskripsi" radius={10} onChange={(val) => { setBody({ ...body, desc: val }) }} />
|
<Textarea size="md" placeholder="Deskripsi" label="Deskripsi" value={body.desc} radius={10} onChange={(val) => { setBody({ ...body, desc: val.currentTarget.value }) }} />
|
||||||
<Box onClick={() => { onToChooseAnggota() }}>
|
<Box onClick={() => { onToChooseAnggota() }}>
|
||||||
<Group
|
<Group
|
||||||
justify="space-between"
|
justify="space-between"
|
||||||
@@ -124,7 +146,7 @@ export default function CreateDivision() {
|
|||||||
borderRadius: 10,
|
borderRadius: 10,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text>Tambah Anggota</Text>
|
<Text>Pilih Anggota</Text>
|
||||||
<IoIosArrowDropright size={25} />
|
<IoIosArrowDropright size={25} />
|
||||||
</Group>
|
</Group>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -9,18 +9,19 @@ import NavbarDetailDivision from '../ui/navbar_detail_division';
|
|||||||
|
|
||||||
export default function DetailDivision() {
|
export default function DetailDivision() {
|
||||||
return (
|
return (
|
||||||
<Box>
|
<></>
|
||||||
<NavbarDetailDivision />
|
// <Box>
|
||||||
<Box p={20}>
|
// <NavbarDetailDivision />
|
||||||
<Stack>
|
// <Box p={20}>
|
||||||
<CarouselDivision />
|
// <Stack>
|
||||||
<FeatureDetailDivision />
|
// <CarouselDivision />
|
||||||
<ListTaskOnDetailDivision />
|
// <FeatureDetailDivision />
|
||||||
<ListDocumentOnDetailDivision />
|
// <ListTaskOnDetailDivision />
|
||||||
<ListDiscussionOnDetailDivision />
|
// <ListDocumentOnDetailDivision />
|
||||||
</Stack>
|
// <ListDiscussionOnDetailDivision />
|
||||||
</Box>
|
// </Stack>
|
||||||
</Box>
|
// </Box>
|
||||||
|
// </Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { IoCalendarOutline } from "react-icons/io5";
|
|||||||
import { LuFileSignature } from "react-icons/lu";
|
import { LuFileSignature } from "react-icons/lu";
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
export default function FeatureDetailDivision() {
|
export default function FeatureDetailDivision({ id }: { id: string }) {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
return (
|
return (
|
||||||
<Box pt={10}>
|
<Box pt={10}>
|
||||||
@@ -21,29 +21,29 @@ export default function FeatureDetailDivision() {
|
|||||||
style={{
|
style={{
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
alignContent: "center"
|
alignContent: "center"
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box bg={'white'} style={{
|
<Box bg={'white'} style={{
|
||||||
border: `1px solid ${WARNA.bgHijauMuda}`,
|
border: `1px solid ${WARNA.bgHijauMuda}`,
|
||||||
borderRadius: 10,
|
borderRadius: 10,
|
||||||
padding: 10
|
padding: 10
|
||||||
}} onClick={() => router.push('/task')}>
|
}} onClick={() => router.push(id + '/task')}>
|
||||||
<Grid justify='center' align='center'>
|
<Grid justify='center' align='center'>
|
||||||
<Grid.Col span={"auto"}>
|
<Grid.Col span={"auto"}>
|
||||||
<ActionIcon variant="filled"
|
<ActionIcon variant="filled"
|
||||||
size={"xl"}
|
size={"xl"}
|
||||||
aria-label="Gradient action icon"
|
aria-label="Gradient action icon"
|
||||||
radius={100}
|
radius={100}
|
||||||
color={WARNA.bgHijauMuda}
|
color={WARNA.bgHijauMuda}
|
||||||
>
|
>
|
||||||
<LuClipboardEdit size={25} color={WARNA.biruTua} />
|
<LuClipboardEdit size={25} color={WARNA.biruTua} />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{base: 7, md: 9}}>
|
<Grid.Col span={{ base: 7, md: 9 }}>
|
||||||
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Tugas</Text>
|
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Tugas</Text>
|
||||||
<Group justify='space-between' align='center'>
|
<Group justify='space-between' align='center'>
|
||||||
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
||||||
<IoIosArrowRoundForward size={20} color='gray' />
|
<IoIosArrowRoundForward size={20} color='gray' />
|
||||||
</Group>
|
</Group>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -52,23 +52,23 @@ export default function FeatureDetailDivision() {
|
|||||||
border: `1px solid ${WARNA.bgHijauMuda}`,
|
border: `1px solid ${WARNA.bgHijauMuda}`,
|
||||||
borderRadius: 10,
|
borderRadius: 10,
|
||||||
padding: 10
|
padding: 10
|
||||||
}} onClick={() => router.push('/document')}>
|
}} onClick={() => router.push(id + '/document')}>
|
||||||
<Grid justify='center' align='center'>
|
<Grid justify='center' align='center'>
|
||||||
<Grid.Col span={"auto"}>
|
<Grid.Col span={"auto"}>
|
||||||
<ActionIcon variant="filled"
|
<ActionIcon variant="filled"
|
||||||
size={"xl"}
|
size={"xl"}
|
||||||
aria-label="Gradient action icon"
|
aria-label="Gradient action icon"
|
||||||
radius={100}
|
radius={100}
|
||||||
color={WARNA.bgHijauMuda}
|
color={WARNA.bgHijauMuda}
|
||||||
>
|
>
|
||||||
<BsFileEarmarkText size={25} color={WARNA.biruTua} />
|
<BsFileEarmarkText size={25} color={WARNA.biruTua} />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{base: 7, md: 9}}>
|
<Grid.Col span={{ base: 7, md: 9 }}>
|
||||||
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Dokumen</Text>
|
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Dokumen</Text>
|
||||||
<Group justify='space-between' align='center'>
|
<Group justify='space-between' align='center'>
|
||||||
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
||||||
<IoIosArrowRoundForward size={20} color='gray' />
|
<IoIosArrowRoundForward size={20} color='gray' />
|
||||||
</Group>
|
</Group>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -77,23 +77,23 @@ export default function FeatureDetailDivision() {
|
|||||||
border: `1px solid ${WARNA.bgHijauMuda}`,
|
border: `1px solid ${WARNA.bgHijauMuda}`,
|
||||||
borderRadius: 10,
|
borderRadius: 10,
|
||||||
padding: 10
|
padding: 10
|
||||||
}} onClick={() => router.push('/discussion')}>
|
}} onClick={() => router.push(id + '/discussion')}>
|
||||||
<Grid justify='center' align='center'>
|
<Grid justify='center' align='center'>
|
||||||
<Grid.Col span={"auto"}>
|
<Grid.Col span={"auto"}>
|
||||||
<ActionIcon variant="filled"
|
<ActionIcon variant="filled"
|
||||||
size={"xl"}
|
size={"xl"}
|
||||||
aria-label="Gradient action icon"
|
aria-label="Gradient action icon"
|
||||||
radius={100}
|
radius={100}
|
||||||
color={WARNA.bgHijauMuda}
|
color={WARNA.bgHijauMuda}
|
||||||
>
|
>
|
||||||
<GoCommentDiscussion size={25} color={WARNA.biruTua} />
|
<GoCommentDiscussion size={25} color={WARNA.biruTua} />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{base: 7, md: 9}}>
|
<Grid.Col span={{ base: 7, md: 9 }}>
|
||||||
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Diskusi</Text>
|
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Diskusi</Text>
|
||||||
<Group justify='space-between' align='center'>
|
<Group justify='space-between' align='center'>
|
||||||
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
||||||
<IoIosArrowRoundForward size={20} color='gray' />
|
<IoIosArrowRoundForward size={20} color='gray' />
|
||||||
</Group>
|
</Group>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -102,23 +102,23 @@ export default function FeatureDetailDivision() {
|
|||||||
border: `1px solid ${WARNA.bgHijauMuda}`,
|
border: `1px solid ${WARNA.bgHijauMuda}`,
|
||||||
borderRadius: 10,
|
borderRadius: 10,
|
||||||
padding: 10
|
padding: 10
|
||||||
}} onClick={() => router.push('/calender')}>
|
}} onClick={() => router.push(id + '/calender')}>
|
||||||
<Grid justify='center' align='center'>
|
<Grid justify='center' align='center'>
|
||||||
<Grid.Col span={"auto"}>
|
<Grid.Col span={"auto"}>
|
||||||
<ActionIcon variant="filled"
|
<ActionIcon variant="filled"
|
||||||
size={"xl"}
|
size={"xl"}
|
||||||
aria-label="Gradient action icon"
|
aria-label="Gradient action icon"
|
||||||
radius={100}
|
radius={100}
|
||||||
color={WARNA.bgHijauMuda}
|
color={WARNA.bgHijauMuda}
|
||||||
>
|
>
|
||||||
<IoCalendarOutline size={25} color={WARNA.biruTua} />
|
<IoCalendarOutline size={25} color={WARNA.biruTua} />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{base: 7, md: 9}}>
|
<Grid.Col span={{ base: 7, md: 9 }}>
|
||||||
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Kalender</Text>
|
<Text fz={15} c={WARNA.biruTua} fw={"bold"}>Kalender</Text>
|
||||||
<Group justify='space-between' align='center'>
|
<Group justify='space-between' align='center'>
|
||||||
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
<Text fz={10} c={"gray"}>23 Tugas</Text>
|
||||||
<IoIosArrowRoundForward size={20} color='gray' />
|
<IoIosArrowRoundForward size={20} color='gray' />
|
||||||
</Group>
|
</Group>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1,48 +1,54 @@
|
|||||||
"use client"
|
"use client"
|
||||||
import { LayoutNavbarNew, WARNA } from '@/module/_global';
|
import { API_ADDRESS, LayoutNavbarNew, WARNA } from '@/module/_global';
|
||||||
|
import { useHookstate } from '@hookstate/core';
|
||||||
import { Avatar, Box, Button, Checkbox, Divider, Flex, Group, Stack, Text, TextInput } from '@mantine/core';
|
import { Avatar, Box, Button, Checkbox, Divider, Flex, Group, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import React from 'react';
|
import React, { useState } from 'react';
|
||||||
import { HiMagnifyingGlass } from 'react-icons/hi2';
|
import { HiMagnifyingGlass } from 'react-icons/hi2';
|
||||||
|
import { globalMemberDivision } from '../../lib/val_division';
|
||||||
|
import toast from 'react-hot-toast';
|
||||||
|
|
||||||
const dataUser = [
|
export default function NavbarAdminDivision({ data, onSuccess }: { data: any, onSuccess: (val: any) => void }) {
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=3",
|
|
||||||
name: "Doni Setiawan",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=10",
|
|
||||||
name: "Ilham Udin",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=11",
|
|
||||||
name: "Didin Anang",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=21",
|
|
||||||
name: "Angga Saputra",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=32",
|
|
||||||
name: "Marcel Widianto",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
img: "https://i.pravatar.cc/1000?img=37",
|
|
||||||
name: "Bagas Nusantara",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function NavbarAdminDivision() {
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
const member = useHookstate(globalMemberDivision)
|
||||||
|
const [value, setValue] = useState<string[]>([]);
|
||||||
|
|
||||||
|
async function onSubmit() {
|
||||||
|
if (value.length === 0) {
|
||||||
|
return toast.error("Error! Silahkan pilih admin divisi")
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(API_ADDRESS.apiCreateDivision, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
data: data,
|
||||||
|
member: member.get(),
|
||||||
|
admin: value
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const errorData = await res.json();
|
||||||
|
|
||||||
|
if (res.status == 201) {
|
||||||
|
toast.success('Sukses! data tersimpan')
|
||||||
|
onSuccess(true)
|
||||||
|
} else {
|
||||||
|
toast.error(errorData.message);
|
||||||
|
onSuccess(false)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
toast.error('Error')
|
||||||
|
onSuccess(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<LayoutNavbarNew back="/division/create" title="Pilih Anggota" menu />
|
<LayoutNavbarNew title="Pilih Admin Divisi" menu />
|
||||||
<Box p={20}>
|
<Box p={20}>
|
||||||
<TextInput
|
<TextInput
|
||||||
styles={{
|
styles={{
|
||||||
@@ -58,27 +64,33 @@ export default function NavbarAdminDivision() {
|
|||||||
placeholder="Pencarian"
|
placeholder="Pencarian"
|
||||||
/>
|
/>
|
||||||
<Box pt={20}>
|
<Box pt={20}>
|
||||||
{dataUser.map((v, i) => {
|
<Checkbox.Group value={value} onChange={setValue}>
|
||||||
return (
|
{
|
||||||
<Box key={i}>
|
(member.length === 0) ? (
|
||||||
<Flex
|
<Text c="dimmed" ta={"center"} fs={"italic"}>Belum ada anggota</Text>
|
||||||
justify={"space-between"}
|
) : member.get().map((v: any, i: any) => {
|
||||||
align={"center"}
|
return (
|
||||||
>
|
<Box key={i}>
|
||||||
<Group>
|
<Flex
|
||||||
<Avatar src={v.img} alt="it's me" size="lg" />
|
justify={"space-between"}
|
||||||
<Box>
|
align={"center"}
|
||||||
<Text c={WARNA.biruTua} fw={"bold"}>
|
>
|
||||||
{v.name}
|
<Group>
|
||||||
</Text>
|
<Avatar src={v.img} alt="it's me" size="lg" />
|
||||||
</Box>
|
<Box>
|
||||||
</Group>
|
<Text c={WARNA.biruTua} fw={"bold"}>
|
||||||
<Checkbox />
|
{v.name}
|
||||||
</Flex>
|
</Text>
|
||||||
<Divider my={20} />
|
</Box>
|
||||||
</Box>
|
</Group>
|
||||||
);
|
<Checkbox value={v.id} />
|
||||||
})}
|
</Flex>
|
||||||
|
<Divider my={20} />
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</Checkbox.Group>
|
||||||
</Box>
|
</Box>
|
||||||
<Box mt="xl">
|
<Box mt="xl">
|
||||||
<Button
|
<Button
|
||||||
@@ -87,7 +99,7 @@ export default function NavbarAdminDivision() {
|
|||||||
size="lg"
|
size="lg"
|
||||||
radius={30}
|
radius={30}
|
||||||
fullWidth
|
fullWidth
|
||||||
onClick={() => router.push("/division")}
|
onClick={() => { onSubmit() }}
|
||||||
>
|
>
|
||||||
Simpan
|
Simpan
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { HiMagnifyingGlass } from 'react-icons/hi2';
|
|||||||
import { globalMemberDivision } from '../../lib/val_division';
|
import { globalMemberDivision } from '../../lib/val_division';
|
||||||
import { TypeUser } from '@/module/user';
|
import { TypeUser } from '@/module/user';
|
||||||
import { funGetUserByCookies } from '@/module/auth';
|
import { funGetUserByCookies } from '@/module/auth';
|
||||||
|
import toast from 'react-hot-toast';
|
||||||
|
|
||||||
const dataUser = [
|
const dataUser = [
|
||||||
{
|
{
|
||||||
@@ -46,22 +47,38 @@ const dataUser = [
|
|||||||
|
|
||||||
export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, onClose: (val: any) => void }) {
|
export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, onClose: (val: any) => void }) {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const [selectedFiles, setSelectedFiles] = useState<Record<number, boolean>>({});
|
|
||||||
const member = useHookstate(globalMemberDivision)
|
const member = useHookstate(globalMemberDivision)
|
||||||
|
const [selectedFiles, setSelectedFiles] = useState<any>([]);
|
||||||
const [dataMember, setDataMember] = useState<TypeUser>([])
|
const [dataMember, setDataMember] = useState<TypeUser>([])
|
||||||
|
|
||||||
const handleFileClick = (index: number) => {
|
const handleFileClick = (index: number) => {
|
||||||
setSelectedFiles((prevSelectedFiles) => ({
|
if (selectedFiles.some((i: any) => i.id == dataMember[index].id)) {
|
||||||
...prevSelectedFiles,
|
setSelectedFiles(selectedFiles.filter((i: any) => i.id != dataMember[index].id))
|
||||||
[index]: !prevSelectedFiles[index],
|
} else {
|
||||||
}));
|
setSelectedFiles([...selectedFiles, dataMember[index]])
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
async function loadData() {
|
async function loadData() {
|
||||||
const loadMember = await fetch(API_ADDRESS.apiGetAllUser + '&active=true&groupID=' + grup);
|
const loadMember = await fetch(API_ADDRESS.apiGetAllUser + '&active=true&groupID=' + grup);
|
||||||
const user = await funGetUserByCookies();
|
const user = await funGetUserByCookies();
|
||||||
const hasil = await loadMember.json()
|
const hasil = await loadMember.json()
|
||||||
setDataMember(hasil.filter((i: any) => i.id != user.id))
|
setDataMember(hasil.filter((i: any) => i.id != user.id))
|
||||||
|
|
||||||
|
// cek data member sebelumnya
|
||||||
|
if (member.length > 0) {
|
||||||
|
setSelectedFiles(JSON.parse(JSON.stringify(member.get())))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onSubmit() {
|
||||||
|
if (selectedFiles.length == 0) {
|
||||||
|
return toast.error("Error! silahkan pilih anggota")
|
||||||
|
}
|
||||||
|
member.set(selectedFiles)
|
||||||
|
onClose(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
@@ -93,7 +110,7 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
|
|||||||
verticalSpacing={{ base: "md", sm: "xl" }}
|
verticalSpacing={{ base: "md", sm: "xl" }}
|
||||||
>
|
>
|
||||||
{dataMember.map((v, index) => {
|
{dataMember.map((v, index) => {
|
||||||
const isSelected = selectedFiles[index];
|
const isSelected = selectedFiles.some((i: any) => i.id == dataMember[index].id);
|
||||||
return (
|
return (
|
||||||
<Box key={index} mb={10}>
|
<Box key={index} mb={10}>
|
||||||
<Box
|
<Box
|
||||||
@@ -125,7 +142,7 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
|
|||||||
size="lg"
|
size="lg"
|
||||||
radius={30}
|
radius={30}
|
||||||
fullWidth
|
fullWidth
|
||||||
onClick={() => { onClose(true) }}
|
onClick={() => { onSubmit() }}
|
||||||
>
|
>
|
||||||
Simpan
|
Simpan
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import { useState } from "react";
|
|||||||
import { HiMenu } from "react-icons/hi";
|
import { HiMenu } from "react-icons/hi";
|
||||||
import DrawerDetailDivision from "./drawer_detail_division";
|
import DrawerDetailDivision from "./drawer_detail_division";
|
||||||
|
|
||||||
export default function NavbarDetailDivision() {
|
export default function NavbarDetailDivision({ title }: { title: string }) {
|
||||||
const [openDrawer, setOpenDrawer] = useState(false)
|
const [openDrawer, setOpenDrawer] = useState(false)
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<LayoutNavbarNew back="" title={"Divisi kemasyarakatan"} menu={
|
<LayoutNavbarNew back="" title={title} menu={
|
||||||
<ActionIcon variant="light" onClick={() => (setOpenDrawer(true))} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
|
<ActionIcon variant="light" onClick={() => (setOpenDrawer(true))} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
|
||||||
<HiMenu size={20} color='white' />
|
<HiMenu size={20} color='white' />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
|
|||||||
@@ -1,9 +1,39 @@
|
|||||||
import React from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import DetailDivision from '../components/detail_division/detail_division';
|
import DetailDivision from '../components/detail_division/detail_division';
|
||||||
|
import { Box, Stack } from '@mantine/core';
|
||||||
|
import CarouselDivision from '../components/detail_division/carousel_division';
|
||||||
|
import FeatureDetailDivision from '../components/detail_division/feature_detail_division';
|
||||||
|
import ListDiscussionOnDetailDivision from '../components/detail_division/list_discussion';
|
||||||
|
import ListDocumentOnDetailDivision from '../components/detail_division/list_document';
|
||||||
|
import ListTaskOnDetailDivision from '../components/detail_division/list_task';
|
||||||
|
import NavbarDetailDivision from '../components/ui/navbar_detail_division';
|
||||||
|
import { API_ADDRESS } from '@/module/_global';
|
||||||
|
|
||||||
|
export default async function ViewDetailDivision({ id }: { id: string }) {
|
||||||
|
|
||||||
|
const res = await fetch(`${process.env.URL + API_ADDRESS.apiGetOneDetailDivision}&divisionId=${id}`);
|
||||||
|
console.log(process.env.URL + API_ADDRESS.apiGetOneDetailDivision+"&divisionId="+id)
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
console.log('amalia', data);
|
||||||
|
|
||||||
export default function ViewDetailDivision() {
|
|
||||||
return (
|
return (
|
||||||
<DetailDivision />
|
// <DetailDivision />
|
||||||
|
<Box>
|
||||||
|
<NavbarDetailDivision title={
|
||||||
|
// data?.division?.name
|
||||||
|
""
|
||||||
|
} />
|
||||||
|
<Box p={20}>
|
||||||
|
<Stack>
|
||||||
|
<CarouselDivision />
|
||||||
|
<FeatureDetailDivision id={id}/>
|
||||||
|
<ListTaskOnDetailDivision />
|
||||||
|
<ListDocumentOnDetailDivision />
|
||||||
|
<ListDiscussionOnDetailDivision />
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user