diff --git a/src/app/api/division/more/route.ts b/src/app/api/division/more/route.ts new file mode 100644 index 0000000..8b36bbe --- /dev/null +++ b/src/app/api/division/more/route.ts @@ -0,0 +1,50 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + +// GET LIST DIVISI BY ID DIVISI (CONTOH : UNTUK SHARE DOKUMEN) +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 { searchParams } = new URL(request.url); + const idDivision = searchParams.get("division"); + const name = searchParams.get('search'); + + const dataDivision = await prisma.division.findUnique({ + where: { + id: String(idDivision), + isActive: true + } + }) + + if (!dataDivision) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan", }, { status: 404 }); + } + + const data = await prisma.division.findMany({ + where: { + isActive: true, + idGroup: dataDivision.idGroup, + name: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + } + }, + select: { + id: true, + name: true, + } + }); + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data }, { status: 200 }); + + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/document/more/route.ts b/src/app/api/document/more/route.ts index 60cead8..639fa65 100644 --- a/src/app/api/document/more/route.ts +++ b/src/app/api/document/more/route.ts @@ -1,5 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; +import _ from "lodash"; import { NextResponse } from "next/server"; @@ -184,4 +185,43 @@ export async function PUT(request: Request) { console.log(error); return NextResponse.json({ success: false, message: "Gagal salin item, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } +}; + + +// SHARE ITEM +export async function DELETE(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 { dataDivision, dataItem } = (await request.json()); + + + for (let i = 0; i < dataItem.length; i++) { + const del = await prisma.divisionDocumentShare.deleteMany({ + where: { + idDocument: dataItem[i].id + } + }) + + const omitData = dataDivision.map((v: any) => ({ + ..._.omit(v, ["name", "id"]), + idDivision: v.id, + idDocument: dataItem[i].id + })) + + const insert = await prisma.divisionDocumentShare.createMany({ + data: omitData + }) + + } + + + return NextResponse.json({ success: true, message: "Berhasil membagikan item" }, { status: 200 }); + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal membagikan item, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } }; \ No newline at end of file diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index effc601..1d9750a 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -22,7 +22,7 @@ import CreateAnggotaDivision from './ui/create_anggota_division'; import EditDivision from './ui/edit_division'; import CreateReport from './ui/create_report'; import ReportDivisionId from './ui/report_division_id'; -import { funGetDivisionById } from './lib/api_division'; +import { funGetDivisionById, funGetListDivisionByIdDivision } from './lib/api_division'; export { CreateUsers }; export { CreateAdminDivision }; @@ -49,3 +49,4 @@ export { EditDivision } export { CreateReport } export { ReportDivisionId } export { funGetDivisionById } +export { funGetListDivisionByIdDivision } diff --git a/src/module/division_new/lib/api_division.ts b/src/module/division_new/lib/api_division.ts index 5da0723..3142169 100644 --- a/src/module/division_new/lib/api_division.ts +++ b/src/module/division_new/lib/api_division.ts @@ -70,4 +70,11 @@ export const funAddDivisionMember = async (path: string, data: IFormMemberDivisi body: JSON.stringify(data), }); return await response.json().catch(() => null); +} + + + +export const funGetListDivisionByIdDivision = async (path: string) => { + const response = await fetch(`/api/division/more${path}`); + return await response.json().catch(() => null); } \ No newline at end of file diff --git a/src/module/document/lib/api_document.ts b/src/module/document/lib/api_document.ts index 93f419f..6d9cfad 100644 --- a/src/module/document/lib/api_document.ts +++ b/src/module/document/lib/api_document.ts @@ -1,4 +1,4 @@ -import { IFormEditItem, IFormFolder, IFormMoreCopyItem, IFormMoreItem } from "./type_document"; +import { IFormEditItem, IFormFolder, IFormMoreCopyItem, IFormMoreItem, IShareDocument } from "./type_document"; export const funGetAllDocument = async (path?: string) => { const response = await fetch(`/api/document${(path) ? path : ''}`, { next: { tags: ['document'] } }); @@ -65,4 +65,16 @@ export const funCopyDocument = async (data: IFormMoreCopyItem) => { body: JSON.stringify(data), }); return await response.json().catch(() => null); +}; + + +export const funShareDocument = async (data: IShareDocument) => { + const response = await fetch("/api/document/more", { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + return await response.json().catch(() => null); }; \ No newline at end of file diff --git a/src/module/document/lib/type_document.ts b/src/module/document/lib/type_document.ts index 635bb18..d29e46c 100644 --- a/src/module/document/lib/type_document.ts +++ b/src/module/document/lib/type_document.ts @@ -44,4 +44,15 @@ export interface IFormMoreCopyItem { idDivision: string, path: string, dataItem: IDataDocument[] +} + + +export interface IShareDivision { + id: string + name: string +} + +export interface IShareDocument { + dataDivision: IShareDivision[], + dataItem: IShareDivision[] } \ No newline at end of file diff --git a/src/module/document/ui/drawer_share_document.tsx b/src/module/document/ui/drawer_share_document.tsx new file mode 100644 index 0000000..a0faaf0 --- /dev/null +++ b/src/module/document/ui/drawer_share_document.tsx @@ -0,0 +1,127 @@ +import { WARNA } from "@/module/_global"; +import { funGetListDivisionByIdDivision, IDataDivison } from "@/module/division_new"; +import { IDataMemberTaskDivision } from "@/module/task/lib/type_task"; +import { Box, Select, Button, Avatar, Divider, Flex, Group, Stack, Text, ActionIcon } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import { useParams } from "next/navigation"; +import { useState } from "react"; +import toast from "react-hot-toast"; +import { FaCheck, FaUsers } from "react-icons/fa6"; +import { IShareDivision } from "../lib/type_document"; +import { funShareDocument } from "../lib/api_document"; +import { useHookstate } from "@hookstate/core"; +import { globalRefreshDocument } from "../lib/val_document"; + +export default function DrawerShareDocument({ data }: { data: IShareDivision[]}) { + const [selectedFiles, setSelectedFiles] = useState([]) + const [isData, setData] = useState([]) + const param = useParams<{ id: string }>() + const refresh = useHookstate(globalRefreshDocument) + + + + async function onShare() { + try { + if (selectedFiles.length == 0) { + return toast.error('Pilih divisi terlebih dahulu') + } + + + const respon = await funShareDocument({ dataDivision: selectedFiles, dataItem: data }) + if (respon.success) { + toast.success(respon.message) + refresh.set(true) + } else { + toast.error(respon.message) + } + } catch (error) { + console.log(error) + toast.error("Gagal membagikan item, coba lagi nanti"); + } + } + + async function getData() { + try { + const response = await funGetListDivisionByIdDivision('?division=' + param.id) + if (response.success) { + setData(response.data.filter((i: any) => i.id != param.id)) + } else { + toast.error(response.message); + } + + } catch (error) { + toast.error("Gagal mendapatkan divisi, coba lagi nanti"); + console.error(error); + } + } + + + useShallowEffect(() => { + getData() + }, []); + + const handleFileClick = (index: number) => { + if (selectedFiles.some((i: any) => i.id == isData[index].id)) { + setSelectedFiles(selectedFiles.filter((i: any) => i.id != isData[index].id)) + } else { + setSelectedFiles([...selectedFiles, { id: isData[index].id, name: isData[index].name }]) + } + }; + + return ( + + + {isData.map((v, i) => { + const isSelected = selectedFiles.some((i: any) => i?.id == v.id); + return ( + handleFileClick(i)} > + + + + + + + + {v.name} + + + + + {isSelected ? : ""} + + + + + ); + })} + + + + + + + + ) +} \ No newline at end of file diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index cae6f92..3237717 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -22,6 +22,7 @@ import { useHookstate } from '@hookstate/core'; import { globalRefreshDocument } from '../lib/val_document'; import { RiListCheck } from 'react-icons/ri'; import { GoChevronRight } from 'react-icons/go'; +import DrawerShareDocument from './drawer_share_document'; export default function NavbarDocumentDivision() { const router = useRouter() @@ -172,6 +173,7 @@ export default function NavbarDocumentDivision() { refresh.set(false) setOpen(false) setMore(false) + setShare(false) handleBatal() } @@ -266,11 +268,11 @@ export default function NavbarDocumentDivision() { - } separatorMargin="md" mt="xs"> + } separatorMargin="md" mt="xs" style={{ cursor: 'pointer' }}> { dataJalur.map((v, i) => { return ( - router.push('?path=' + v.id)} key={i} style={{ cursor: 'pointer' }}> + router.push('?path=' + v.id)} key={i}> {v.name} ) @@ -386,36 +388,7 @@ export default function NavbarDocumentDivision() { setShare(false)} size='lg'> - -