diff --git a/src/app/api/document/more/route.ts b/src/app/api/document/more/route.ts index f4a77c7..8127fab 100644 --- a/src/app/api/document/more/route.ts +++ b/src/app/api/document/more/route.ts @@ -1,6 +1,8 @@ +import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import { NextResponse } from "next/server"; + // MOVE ITEM export async function POST(request: Request) { try { @@ -9,6 +11,35 @@ export async function POST(request: Request) { return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); } + const { path, dataItem } = (await request.json()); + + + if (path != "home") { + const cekPath = await prisma.divisionDocumentFolderFile.count({ + where: { + isActive: true, + id: path + } + }) + + if (cekPath == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan path, data tidak ditemukan" }, { status: 404 }); + } + } + + for (let i = 0; i < dataItem.length; i++) { + const id = dataItem[i].id; + const cekFile = await prisma.divisionDocumentFolderFile.update({ + where: { + id: id + }, + data: { + path: path + } + }) + } + + return NextResponse.json({ success: true, message: "Berhasil memindahkan item" }, { status: 200 }); } catch (error) { console.log(error); diff --git a/src/app/api/document/route.ts b/src/app/api/document/route.ts index 331595d..0667c34 100644 --- a/src/app/api/document/route.ts +++ b/src/app/api/document/route.ts @@ -17,6 +17,7 @@ export async function GET(request: Request) { const { searchParams } = new URL(request.url); const idDivision = searchParams.get("division"); const path = searchParams.get("path"); + const category = searchParams.get("category"); const cekDivision = await prisma.division.count({ where: { @@ -43,14 +44,26 @@ export async function GET(request: Request) { } + let kondisi: any = { + isActive: true, + idDivision: String(idDivision), + path: (path == "undefined" || path == "null" || path == "" || path == null) ? "home" : path + } + + if (category == "folder") { + kondisi = { + isActive: true, + idDivision: String(idDivision), + path: (path == "undefined" || path == "null" || path == "" || path == null) ? "home" : path, + category: "FOLDER" + } + } + + const data = await prisma.divisionDocumentFolderFile.findMany({ - where: { - isActive: true, - idDivision: String(idDivision), - path: (path == "undefined" || path == "null" || path == "" || path == null) ? "home" : path - }, + where: kondisi, select: { id: true, category: true, diff --git a/src/module/document/lib/api_document.ts b/src/module/document/lib/api_document.ts index afc3e86..de4f8b5 100644 --- a/src/module/document/lib/api_document.ts +++ b/src/module/document/lib/api_document.ts @@ -1,4 +1,4 @@ -import { IFormEditItem, IFormFolder } from "./type_document"; +import { IFormEditItem, IFormFolder, IFormMoreItem } from "./type_document"; export const funGetAllDocument = async (path?: string) => { const response = await fetch(`/api/document${(path) ? path : ''}`, { next: { tags: ['document'] } }); @@ -43,4 +43,15 @@ export const funDeleteDocument = async (data: []) => { body: JSON.stringify(data), }); return await response.json().catch(() => null); +}; + +export const funMoveDocument = async (data: IFormMoreItem) => { + const response = await fetch("/api/document/more", { + method: "POST", + 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 9f2dbb0..d5b06cd 100644 --- a/src/module/document/lib/type_document.ts +++ b/src/module/document/lib/type_document.ts @@ -23,4 +23,14 @@ export interface IFormEditItem { path: string idDivision: string extension: string +} + +export interface IFormDetailMoreItem { + id: string + name: string +} + +export interface IFormMoreItem { + path: string, + dataItem: IFormDetailMoreItem[] } \ No newline at end of file diff --git a/src/module/document/ui/drawer_cut_documents.tsx b/src/module/document/ui/drawer_cut_documents.tsx index 7677160..69298ea 100644 --- a/src/module/document/ui/drawer_cut_documents.tsx +++ b/src/module/document/ui/drawer_cut_documents.tsx @@ -3,12 +3,16 @@ import { Box, Button, Divider, Flex, Grid, Group, Modal, Text, TextInput } from import React, { useState } from 'react'; import toast from 'react-hot-toast'; import { FcDocument, FcFolder, FcImageFile } from 'react-icons/fc'; -import { funCreateFolder, funGetAllDocument } from '../lib/api_document'; +import { funCreateFolder, funGetAllDocument, funMoveDocument } from '../lib/api_document'; import { useParams } from 'next/navigation'; -import { IDataDocument } from '../lib/type_document'; +import { IDataDocument, IFormDetailMoreItem } from '../lib/type_document'; import { useShallowEffect } from '@mantine/hooks'; +import { FaFolder } from 'react-icons/fa6'; +import { IoMdFolder } from 'react-icons/io'; +import { MdFolder } from 'react-icons/md'; -export default function DrawerCutDocuments() { + +export default function DrawerCutDocuments({ onChoosePath, data }: { data: IFormDetailMoreItem[], onChoosePath: (val: string) => void }) { const [opened, setOpened] = useState(false); const param = useParams<{ id: string }>() const [path, setPath] = useState('home') @@ -36,10 +40,9 @@ export default function DrawerCutDocuments() { setOpened(false) } - async function getOneData() { try { - const respon = await funGetAllDocument("?division=" + param.id + "&path=" + path); + const respon = await funGetAllDocument("?division=" + param.id + "&path=" + path + "&category=folder"); if (respon.success) { setDataDocument(respon.data); } else { @@ -66,29 +69,35 @@ export default function DrawerCutDocuments() { - + {dataDocument.map((v, i) => { + const found = data.some((i: any) => i.id == v.id) return ( - setPath(v.id)}> + { + if (!found) { + setPath(v.id) + } + }}> { - (v.category == "FOLDER") ? - : - (v.extension == "pdf" || v.extension == "csv") ? - : - + (found) ? + : + } {(v.category == "FOLDER") ? v.name : v.name + '.' + v.extension} + { + (found) && Tidak bisa memilih folder ini + } diff --git a/src/module/document/ui/drawer_more.tsx b/src/module/document/ui/drawer_more.tsx index 9db2302..6f35338 100644 --- a/src/module/document/ui/drawer_more.tsx +++ b/src/module/document/ui/drawer_more.tsx @@ -4,10 +4,36 @@ import React, { useState } from "react"; import { LuFolders, LuFolderSymlink } from "react-icons/lu"; import DrawerCutDocuments from "./drawer_cut_documents"; import DrawerCopyDocuments from "./drawer_copy_documents"; +import { IFormDetailMoreItem } from "../lib/type_document"; +import toast from "react-hot-toast"; +import { funMoveDocument } from "../lib/api_document"; +import { useHookstate } from "@hookstate/core"; +import { globalRefreshDocument } from "../lib/val_document"; -export default function DrawerMore() { +export default function DrawerMore({ data }: { data: IFormDetailMoreItem[] }) { const [isCut, setIsCut] = useState(false) const [isCopy, setIsCopy] = useState(false) + const refresh = useHookstate(globalRefreshDocument) + + + async function onMoveItem(path: string) { + try { + const res = await funMoveDocument({ path, dataItem: data }) + if (res.success) { + toast.success(res.message) + refresh.set(true) + } else { + toast.error(res.message) + } + } catch (error) { + console.log(error) + toast.error("Gagal memindahkan item, coba lagi nanti") + } + setIsCut(false) + } + + + return ( @@ -35,11 +61,9 @@ export default function DrawerMore() { setIsCut(false)} title={'Pilih Lokasi Pemindahan'} size="lg"> - + { onMoveItem(val) }} /> - - setIsCopy(false)} title={'Pilih Lokasi Salin'} size="lg"> diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index 0f0a319..97b5e96 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -166,6 +166,8 @@ export default function NavbarDocumentDivision() { function resetRefresh() { refresh.set(false) setOpen(false) + setMore(false) + handleBatal() } useShallowEffect(() => { @@ -397,8 +399,11 @@ export default function NavbarDocumentDivision() { + + + setMore(false)}> - + );