From e7808fe7104aff654641fefc4b4770c155823edc Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 30 Jan 2025 14:39:00 +0800 Subject: [PATCH] rev: fitur unshare dokumen divisi Deskripsi: - unshare dokumen - modal drawer dokumen - update api - cuma bisa share 1 dokumen terpilih No Issues --- src/app/api/document/more/route.ts | 107 ++++++++++-------- src/module/document/lib/type_document.ts | 3 +- .../document/ui/drawer_info_document.tsx | 55 ++++----- src/module/document/ui/drawer_more.tsx | 2 +- .../document/ui/drawer_share_document.tsx | 14 ++- .../document/ui/navbar_document_division.tsx | 8 +- 6 files changed, 98 insertions(+), 91 deletions(-) diff --git a/src/app/api/document/more/route.ts b/src/app/api/document/more/route.ts index de13d09..1279bfc 100644 --- a/src/app/api/document/more/route.ts +++ b/src/app/api/document/more/route.ts @@ -214,6 +214,7 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); const idItem = searchParams.get("item"); + const category = searchParams.get("cat"); const cekItem = await prisma.divisionDocumentFolderFile.count({ where: { @@ -225,66 +226,72 @@ export async function GET(request: Request) { return NextResponse.json({ success: false, message: "Gagal mendapatkan dokumen, data tidak ditemukan" }, { status: 404 }); } - const data = await prisma.divisionDocumentFolderFile.findUnique({ - where: { - id: String(idItem), - }, - select: { - category: true, - name: true, - extension: true, - createdAt: true, - path: true, - Division: { - select: { - name: true - } + let fixData + if (category == 'share') { + const share = await prisma.divisionDocumentShare.findMany({ + where: { + idDocument: String(idItem), + isActive: true }, - User: { - select: { - name: true + select: { + idDivision: true, + Division: { + select: { + name: true + } } } - } - }) + }) - const dataPath = await prisma.divisionDocumentFolderFile.findUnique({ - where: { - id: data?.path - } - }) + fixData = share.map((v: any) => ({ + ..._.omit(v, ["idDivision", "Division"]), + id: v.idDivision, + name: v.Division.name + })) - const share = await prisma.divisionDocumentShare.findMany({ - where: { - idDocument: String(idItem), - isActive: true - }, - select: { - Division: { - select: { - name: true + } else { + const data = await prisma.divisionDocumentFolderFile.findUnique({ + where: { + id: String(idItem), + }, + select: { + category: true, + name: true, + extension: true, + createdAt: true, + path: true, + Division: { + select: { + name: true + } + }, + User: { + select: { + name: true + } } } + }) + + const dataPath = await prisma.divisionDocumentFolderFile.findUnique({ + where: { + id: data?.path + } + }) + + + fixData = { + category: data?.category, + name: data?.name, + extension: data?.extension, + createdAt: moment(data?.createdAt).format('DD MMMM YYYY'), + path: (dataPath?.name !== undefined && dataPath?.name !== null && dataPath?.name !== '') ? dataPath.name : "home", + division: data?.Division?.name, + createdBy: data?.User?.name } - }) - - - const dataUtama = { - category: data?.category, - name: data?.name, - extension: data?.extension, - createdAt: moment(data?.createdAt).format('DD MMMM YYYY'), - path: (dataPath?.name !== undefined && dataPath?.name !== null && dataPath?.name !== '') ? dataPath.name : "home", - division: data?.Division?.name, - createdBy: data?.User?.name } - const dataShare = share.map((v: any) => ({ - ..._.omit(v, ["Division"]), - division: v.Division.name - })) - - return NextResponse.json({ success: true, message: "Berhasil mendapatkan item", data: dataUtama, share: dataShare }, { status: 200 }); + return NextResponse.json({ success: true, message: "Berhasil mendapatkan item", data: fixData }, { status: 200 }); } catch (error) { console.error(error); diff --git a/src/module/document/lib/type_document.ts b/src/module/document/lib/type_document.ts index d9432aa..cc05512 100644 --- a/src/module/document/lib/type_document.ts +++ b/src/module/document/lib/type_document.ts @@ -23,7 +23,8 @@ export interface IInfoDocument { } export interface IInfoShare { - division: string + id: string + name: string } export interface IFormFolder { diff --git a/src/module/document/ui/drawer_info_document.tsx b/src/module/document/ui/drawer_info_document.tsx index 19cd6ff..1f394aa 100644 --- a/src/module/document/ui/drawer_info_document.tsx +++ b/src/module/document/ui/drawer_info_document.tsx @@ -4,17 +4,13 @@ import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import _ from "lodash"; import { useState } from "react"; import toast from "react-hot-toast"; -import { CiCalendarDate } from "react-icons/ci"; import { FcDocument, FcFolder, FcImageFile } from "react-icons/fc"; -import { GrLocationPin } from "react-icons/gr"; import { HiOutlineDocumentText } from "react-icons/hi2"; -import { MdOutlineCategory } from "react-icons/md"; -import { PiUsersThree } from "react-icons/pi"; -import { TbLockAccess } from "react-icons/tb"; +import { PiCalendarBlankLight, PiMapPinSimpleLight, PiShapesLight, PiShareNetworkLight, PiUsersThreeLight } from "react-icons/pi"; import { funGetInfoDocument } from "../lib/api_document"; import { IFormDetailMoreItem, IInfoDocument, IInfoShare } from "../lib/type_document"; -export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem[] }) { +export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem }) { const [dataInfo, setDataInfo] = useState(); const [dataShare, setDataShare] = useState([]) const [loading, setLoading] = useState(true); @@ -24,16 +20,17 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem async function getOneData(loading: boolean) { try { setLoading(loading); - const respon = await funGetInfoDocument("?item=" + data[0].id); + const respon = await funGetInfoDocument(`?item=${data.id}&cat=utama`); + const responShare = await funGetInfoDocument(`?item=${data.id}&cat=share`); if (respon.success) { setDataInfo(respon.data); - setDataShare(respon.share) + setDataShare(responShare.data) } else { toast.error(respon.message); } } catch (error) { console.error(error); - toast.error("Gagal mendapatkan item, coba lagi nanti"); + toast.error("Gagal mendapatkan data, coba lagi nanti"); } finally { setLoading(false); } @@ -61,7 +58,7 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem } - + > */} {loading ? ( ) : ( @@ -89,7 +86,7 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem - {dataInfo?.category == "FOLDER" ? dataInfo?.name : dataInfo?.name + '.' + dataInfo?.extension} + {dataInfo?.category == "FOLDER" ? dataInfo?.name : `${dataInfo?.name}.${dataInfo?.extension}`} @@ -98,7 +95,7 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem { !isMobile ? - + : '' } Tipe @@ -114,14 +111,14 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem { !isMobile ? - + : '' } Lokasi - {dataInfo?.path} + {dataInfo?.path} @@ -130,14 +127,14 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem { !isMobile ? - + : '' } Pemilik - {dataInfo?.division} + {dataInfo?.division} @@ -146,7 +143,7 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem { !isMobile ? - + : '' } Tanggal Dibuat @@ -163,25 +160,23 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem + : '' - } fz={15}>Yang Memiliki Akses + } fz={15}>Telah dibagikan ke divisi - } + icon={dataShare.length > 0 ? : <>} > - {dataInfo?.division} { - dataShare.map((i: any) => { - return ( - {i.division} - ) - }) + dataShare.length === 0 ? Tidak ada data : + dataShare.map((i: any) => { + return ( + {i.name} + ) + }) } @@ -189,7 +184,7 @@ export default function DrawerInfoDocument({ data }: { data: IFormDetailMoreItem )} - + {/* */} ); diff --git a/src/module/document/ui/drawer_more.tsx b/src/module/document/ui/drawer_more.tsx index 4a5817d..90d80a8 100644 --- a/src/module/document/ui/drawer_more.tsx +++ b/src/module/document/ui/drawer_more.tsx @@ -150,7 +150,7 @@ export default function DrawerMore({ data, share }: { data: IDataDocument[], sha setIsInfo(false)} title={'Informasi Dokumen'} size="lg"> - + ); diff --git a/src/module/document/ui/drawer_share_document.tsx b/src/module/document/ui/drawer_share_document.tsx index 77640ca..3da0e00 100644 --- a/src/module/document/ui/drawer_share_document.tsx +++ b/src/module/document/ui/drawer_share_document.tsx @@ -7,24 +7,23 @@ import { useParams } from "next/navigation"; import { useState } from "react"; import toast from "react-hot-toast"; import { FaCheck, FaUsers } from "react-icons/fa6"; -import { funShareDocument } from "../lib/api_document"; +import { funGetInfoDocument, funShareDocument } from "../lib/api_document"; import { IShareDivision } from "../lib/type_document"; import { globalRefreshDocument } from "../lib/val_document"; -export default function DrawerShareDocument({ data, }: { data: IShareDivision[]; }) { +export default function DrawerShareDocument({ data }: { data: IShareDivision[]; }) { const [selectedFiles, setSelectedFiles] = useState([]); const [isData, setData] = useState([]); const param = useParams<{ id: string }>(); const refresh = useHookstate(globalRefreshDocument); const tema = useHookstate(TEMA); const [loading, setLoading] = useState(true); + const [loadingBtn, setLoadingBtn] = useState(false) const isMobile2 = useMediaQuery("(max-width: 438px)"); async function onShare() { try { - if (selectedFiles.length == 0) { - return toast.error("Pilih divisi terlebih dahulu"); - } + setLoadingBtn(true) const respon = await funShareDocument({ dataDivision: selectedFiles, @@ -39,6 +38,8 @@ export default function DrawerShareDocument({ data, }: { data: IShareDivision[]; } catch (error) { console.error(error); toast.error("Gagal membagikan item, coba lagi nanti"); + } finally { + setLoadingBtn(false) } } @@ -48,8 +49,10 @@ export default function DrawerShareDocument({ data, }: { data: IShareDivision[]; const response = await funGetListDivisionByIdDivision( "?division=" + param.id ); + const shared = await funGetInfoDocument(`?item=${data[0].id}&cat=share`); if (response.success) { setData(response.data.filter((i: any) => i.id != param.id)); + setSelectedFiles(shared.data) } else { toast.error(response.message); } @@ -202,6 +205,7 @@ export default function DrawerShareDocument({ data, }: { data: IShareDivision[]; radius={30} fullWidth onClick={() => onShare()} + loading={loadingBtn} > Simpan diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index 701f082..3c1f1b4 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -434,16 +434,16 @@ export default function NavbarDocumentDivision() { 0 && !shareSelected + selectedFiles.length == 1 && !shareSelected ? () => setShare(true) : undefined } > - + 0 && !shareSelected + selectedFiles.length == 1 && !shareSelected ? "white" : "#656060" } @@ -453,7 +453,7 @@ export default function NavbarDocumentDivision() { fz={12} ta={"center"} c={ - selectedFiles.length > 0 && !shareSelected + selectedFiles.length == 1 && !shareSelected ? "white" : "#656060" }