From 3af672e1b633ec888a5111a64c9cba14d81c133c Mon Sep 17 00:00:00 2001 From: amel Date: Wed, 21 Aug 2024 12:26:33 +0800 Subject: [PATCH] upd: document divisi Deskripsi: - list document - create folder No Issues --- .../[id]/(fitur-division)/document/page.tsx | 11 +- src/app/api/document/route.ts | 126 ++++++++++++++++ .../components/list_documents_division.tsx | 80 ---------- .../components/ui/modal_create_folder.tsx | 11 -- .../document/view/view_document_division.tsx | 11 -- src/module/division_new/index.ts | 2 - .../ui/navbar_detail_division.tsx | 2 +- src/module/document/index.ts | 3 + src/module/document/lib/api_document.ts | 21 +++ src/module/document/lib/type_document.ts | 17 +++ src/module/document/lib/val_document.ts | 3 + .../ui/drawer_copy_documents.tsx | 0 .../ui/drawer_cut_documents.tsx | 0 .../ui/drawer_menu_document_division.tsx | 40 ++++- .../ui/drawer_more.tsx | 0 .../ui/navbar_document_division.tsx | 139 ++++++++++-------- 16 files changed, 282 insertions(+), 184 deletions(-) create mode 100644 src/app/api/document/route.ts delete mode 100644 src/module/division_new/_division_fitur/document/components/list_documents_division.tsx delete mode 100644 src/module/division_new/_division_fitur/document/components/ui/modal_create_folder.tsx delete mode 100644 src/module/division_new/_division_fitur/document/view/view_document_division.tsx create mode 100644 src/module/document/index.ts create mode 100644 src/module/document/lib/api_document.ts create mode 100644 src/module/document/lib/type_document.ts create mode 100644 src/module/document/lib/val_document.ts rename src/module/{division_new/_division_fitur/document/components => document}/ui/drawer_copy_documents.tsx (100%) rename src/module/{division_new/_division_fitur/document/components => document}/ui/drawer_cut_documents.tsx (100%) rename src/module/{division_new/_division_fitur/document/components => document}/ui/drawer_menu_document_division.tsx (77%) rename src/module/{division_new/_division_fitur/document/components => document}/ui/drawer_more.tsx (100%) rename src/module/{division_new/_division_fitur/document/components => document}/ui/navbar_document_division.tsx (76%) diff --git a/src/app/(application)/division/[id]/(fitur-division)/document/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/document/page.tsx index e0730cc..d9e6811 100644 --- a/src/app/(application)/division/[id]/(fitur-division)/document/page.tsx +++ b/src/app/(application)/division/[id]/(fitur-division)/document/page.tsx @@ -1,13 +1,12 @@ -import { ViewDocumentDivision } from '@/module/division_new'; -import ListDocumentsDivision from '@/module/division_new/_division_fitur/document/components/list_documents_division'; +import { NavbarDocumentDivision } from '@/module/document'; +import { Box } from '@mantine/core'; import React from 'react'; function Page({ searchParams }: { searchParams: any }) { - if (searchParams.page == "list-document") - return ; - return ( - + + + ); } diff --git a/src/app/api/document/route.ts b/src/app/api/document/route.ts new file mode 100644 index 0000000..54bfbc6 --- /dev/null +++ b/src/app/api/document/route.ts @@ -0,0 +1,126 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import _ from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + + +// GET ALL DOCUMENT +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 path = searchParams.get("path"); + + const cekDivision = await prisma.division.count({ + where: { + id: String(idDivision), + isActive: true + } + }) + + if (cekDivision == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + } + + + const data = await prisma.divisionDocumentFolderFile.findMany({ + where: { + isActive: true, + idDivision: String(idDivision), + path: (path == "undefined" || path == "null" || path == "" || path == null) ? "home" : path + }, + select: { + id: true, + category: true, + name: true, + extension: true, + path: true, + User: { + select: { + name: true + } + }, + createdAt: true, + updatedAt: true + }, + orderBy: { + name: 'asc' + } + }) + + const allData = data.map((v: any) => ({ + ..._.omit(v, ["User", "createdAt", "updatedAt"]), + createdBy: v.User.name, + createdAt: moment(v.createdAt).format("DD-MM-YYYY HH:mm"), + updatedAt: moment(v.updatedAt).format("DD-MM-YYYY HH:mm") + })) + + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data: allData, }, { 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 }); + } +} + + + +// CREATE FOLDER +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, path, idDivision } = (await request.json()); + + const cekDivision = await prisma.division.count({ + where: { + id: String(idDivision), + isActive: true + } + }) + + if (cekDivision == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + } + + 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 }); + } + } + + const data = await prisma.divisionDocumentFolderFile.create({ + data: { + name, + path, + idDivision, + category: "FOLDER", + extension: "folder", + createdBy: user.id, + }, + }); + + return NextResponse.json({ success: true, message: "Berhasil membuat folder baru" }, { status: 200 }); + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal membuat folder, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +}; \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/document/components/list_documents_division.tsx b/src/module/division_new/_division_fitur/document/components/list_documents_division.tsx deleted file mode 100644 index a91f975..0000000 --- a/src/module/division_new/_division_fitur/document/components/list_documents_division.tsx +++ /dev/null @@ -1,80 +0,0 @@ -"use client"; -import { LayoutNavbarNew } from "@/module/_global"; -import { - ActionIcon, - Box, - Checkbox, - Divider, - Flex, - Grid, - Group, - Text, -} from "@mantine/core"; -import React from "react"; -import { FcDocument, FcFolder, FcImageFile } from "react-icons/fc"; - -const dataDocuments = [ - { - id: 3, - name: "Berkas Kerja", - date: "18/06/2024 14.00 PM", - icon: , - }, - { - id: 3, - name: "Berkas Kerja", - date: "18/06/2024 14.00 PM", - icon: , - }, - { - id: 3, - name: "Image Kegiatan", - date: "18/06/2024 14.00 PM", - icon: , - }, - { - id: 3, - name: "Image Pelaksanaan", - date: "18/06/2024 14.00 PM", - icon: , - }, -]; - -export default function ListDocumentsDivision() { - return ( - - - - {dataDocuments.map((v, i) => { - return ( - - - - - - {v.icon} - - {v.name} - {v.date} - - - - - - - - - - - - - ); - })} - - - ); -} diff --git a/src/module/division_new/_division_fitur/document/components/ui/modal_create_folder.tsx b/src/module/division_new/_division_fitur/document/components/ui/modal_create_folder.tsx deleted file mode 100644 index 96d1713..0000000 --- a/src/module/division_new/_division_fitur/document/components/ui/modal_create_folder.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function ModalCreateFolder() { - return ( -
- ModalCreateFolder -
- ); -} - -export default ModalCreateFolder; diff --git a/src/module/division_new/_division_fitur/document/view/view_document_division.tsx b/src/module/division_new/_division_fitur/document/view/view_document_division.tsx deleted file mode 100644 index a970bbc..0000000 --- a/src/module/division_new/_division_fitur/document/view/view_document_division.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Box } from '@mantine/core'; -import React from 'react'; -import NavbarDocumentDivision from '../components/ui/navbar_document_division'; - -export default function ViewDocumentDivision() { - return ( - - - - ); -} \ No newline at end of file diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index 34294e4..effc601 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -7,7 +7,6 @@ import ViewDetailEventDivision from "./_division_fitur/calender/view/view_detail import ViewDivisionCalender from "./_division_fitur/calender/view/view_division_calender"; import ViewHistoryDivisionCalender from "./_division_fitur/calender/view/view_history_division_calender"; import ViewUpdateDivisionCalender from "./_division_fitur/calender/view/view_update_division_calender"; -import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division"; import CreateAdminDivision from "./ui/create_admin_division"; import CreateUsers from "./ui/create_users"; import ListDivision from './ui/list_division'; @@ -35,7 +34,6 @@ export { ViewHistoryDivisionCalender }; export { ViewDetailEventDivision }; export { ViewUpdateDivisionCalender }; export { UpdateUlangiEvent }; -export { ViewDocumentDivision }; export type { IFormDivision, IFormMemberDivision, IFormFixDivision, IDataDivison, IDataMemberDivision } export { ListDivision } export { CreateDivision } diff --git a/src/module/division_new/ui/navbar_detail_division.tsx b/src/module/division_new/ui/navbar_detail_division.tsx index f03631e..8cf3106 100644 --- a/src/module/division_new/ui/navbar_detail_division.tsx +++ b/src/module/division_new/ui/navbar_detail_division.tsx @@ -25,7 +25,7 @@ export default function NavbarDetailDivision() { } catch (error) { console.error(error); - toast.error("Gagal mendapatkan grup, coba lagi nanti"); + toast.error("Gagal mendapatkan divisi, coba lagi nanti"); } } diff --git a/src/module/document/index.ts b/src/module/document/index.ts new file mode 100644 index 0000000..1dcfcac --- /dev/null +++ b/src/module/document/index.ts @@ -0,0 +1,3 @@ +import NavbarDocumentDivision from "./ui/navbar_document_division"; + +export { NavbarDocumentDivision } diff --git a/src/module/document/lib/api_document.ts b/src/module/document/lib/api_document.ts new file mode 100644 index 0000000..d58e308 --- /dev/null +++ b/src/module/document/lib/api_document.ts @@ -0,0 +1,21 @@ +import { IFormFolder } from "./type_document"; + +export const funGetAllDocument = async (path?: string) => { + const response = await fetch(`/api/document${(path) ? path : ''}`, { next: { tags: ['document'] } }); + return await response.json().catch(() => null); +}; + + +export const funCreateFolder = async (data: IFormFolder) => { + if (data.name == "") + return { success: false, message: 'Nama folder tidak boleh kosong' } + + const response = await fetch("/api/document", { + 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 new file mode 100644 index 0000000..a798709 --- /dev/null +++ b/src/module/document/lib/type_document.ts @@ -0,0 +1,17 @@ +export interface IDataDocument { + id: string; + name: string; + extension: string; + category: string; + path: string; + createdBy: string; + createdAt: string; + updatedAt: string; +} + + +export interface IFormFolder { + name: string; + path: string; + idDivision: string +} \ No newline at end of file diff --git a/src/module/document/lib/val_document.ts b/src/module/document/lib/val_document.ts new file mode 100644 index 0000000..a4ed942 --- /dev/null +++ b/src/module/document/lib/val_document.ts @@ -0,0 +1,3 @@ +import { hookstate } from "@hookstate/core"; + +export const globalRefreshDocument = hookstate(false); \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/document/components/ui/drawer_copy_documents.tsx b/src/module/document/ui/drawer_copy_documents.tsx similarity index 100% rename from src/module/division_new/_division_fitur/document/components/ui/drawer_copy_documents.tsx rename to src/module/document/ui/drawer_copy_documents.tsx diff --git a/src/module/division_new/_division_fitur/document/components/ui/drawer_cut_documents.tsx b/src/module/document/ui/drawer_cut_documents.tsx similarity index 100% rename from src/module/division_new/_division_fitur/document/components/ui/drawer_cut_documents.tsx rename to src/module/document/ui/drawer_cut_documents.tsx diff --git a/src/module/division_new/_division_fitur/document/components/ui/drawer_menu_document_division.tsx b/src/module/document/ui/drawer_menu_document_division.tsx similarity index 77% rename from src/module/division_new/_division_fitur/document/components/ui/drawer_menu_document_division.tsx rename to src/module/document/ui/drawer_menu_document_division.tsx index ec590d1..4befdac 100644 --- a/src/module/division_new/_division_fitur/document/components/ui/drawer_menu_document_division.tsx +++ b/src/module/document/ui/drawer_menu_document_division.tsx @@ -1,25 +1,45 @@ "use clent" import { LayoutDrawer, WARNA } from '@/module/_global'; import { ActionIcon, Box, Button, Divider, Flex, Grid, Modal, SimpleGrid, Stack, Text, TextInput } from '@mantine/core'; -import { useRouter } from 'next/navigation'; +import { useParams, useRouter, useSearchParams } from 'next/navigation'; import React, { useState } from 'react'; import toast from 'react-hot-toast'; import { FaFolderClosed, FaRegImage } from 'react-icons/fa6'; import { HiDocumentText } from 'react-icons/hi2'; import { IoAddCircle, IoDocumentText } from 'react-icons/io5'; +import { funCreateFolder } from '../lib/api_document'; +import { useHookstate } from '@hookstate/core'; +import { globalRefreshDocument } from '../lib/val_document'; export default function DrawerMenuDocumentDivision() { const [openDrawerDocument, setOpenDrawerDocument] = useState(false) const [openModal, setOpenModal] = useState(false) const router = useRouter() + const param = useParams<{ id: string }>() + const searchParams = useSearchParams() + const path = searchParams.get('path') + const refresh = useHookstate(globalRefreshDocument) - function onCreate(val: boolean) { - if (val) { - toast.success("Sukses! Data tersimpan"); + const [bodyFolder, setBodyFolder] = useState({ + name: '', + path: (path == undefined || path == '' || path == null) ? 'home' : path, + idDivision: param.id + }) + + async function onCreateFolder() { + try { + const res = await funCreateFolder(bodyFolder) + if (res.success) { + refresh.set(true) + setOpenModal(false) + setOpenDrawerDocument(false) + } else { + toast.error(res.message); + } + } catch (error) { + console.error(error); + toast.error("Gagal membuat folder baru, coba lagi nanti"); } - setOpenDrawerDocument(false) - setOpenModal(false) - router.push('/document') } return ( @@ -77,6 +97,8 @@ export default function DrawerMenuDocumentDivision() { + + setBodyFolder({ ...bodyFolder, name: e.target.value })} /> @@ -107,7 +131,7 @@ export default function DrawerMenuDocumentDivision() { - + diff --git a/src/module/division_new/_division_fitur/document/components/ui/drawer_more.tsx b/src/module/document/ui/drawer_more.tsx similarity index 100% rename from src/module/division_new/_division_fitur/document/components/ui/drawer_more.tsx rename to src/module/document/ui/drawer_more.tsx diff --git a/src/module/division_new/_division_fitur/document/components/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx similarity index 76% rename from src/module/division_new/_division_fitur/document/components/ui/navbar_document_division.tsx rename to src/module/document/ui/navbar_document_division.tsx index 52100a6..a40d36e 100644 --- a/src/module/division_new/_division_fitur/document/components/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -3,8 +3,6 @@ import { LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global'; import { ActionIcon, Box, Button, Checkbox, Divider, Flex, Grid, Group, Modal, Select, SimpleGrid, Text, TextInput } from '@mantine/core'; import React, { useState } from 'react'; import { HiMenu } from 'react-icons/hi'; -import DrawerMenuDocumentDivision from './drawer_menu_document_division'; -import ListDocumentsDivision from '../list_documents_division'; import { FcDocument, FcFolder, FcImageFile } from 'react-icons/fc'; import { BsDownload } from 'react-icons/bs'; import { AiOutlineDelete } from 'react-icons/ai'; @@ -13,73 +11,35 @@ import { LuShare2 } from 'react-icons/lu'; import { MdOutlineMoreHoriz } from 'react-icons/md'; import LayoutModal from '@/module/_global/layout/layout_modal'; import toast from 'react-hot-toast'; +import { useParams, useRouter, useSearchParams } from 'next/navigation'; +import DrawerMenuDocumentDivision from './drawer_menu_document_division'; import DrawerMore from './drawer_more'; -import { useRouter } from 'next/navigation'; - -const dataDocuments = [ - { - id: 1, - name: 'Administrasi', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 2, - name: 'Administrasi', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Administrasi', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Berkas Kerja', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Berkas Kerja', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Image Kegiatan', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Image Pelaksanaan', - date: '18/06/2024 14.00 PM', - icon: - }, - { - id: 3, - name: 'Image Pelaksanaan', - date: '18/06/2024 14.00 PM', - icon: - }, -] +import { funGetDivisionById } from '@/module/division_new'; +import { useShallowEffect } from '@mantine/hooks'; +import { funGetAllDocument } from '../lib/api_document'; +import { IDataDocument } from '../lib/type_document'; +import { useHookstate } from '@hookstate/core'; +import { globalRefreshDocument } from '../lib/val_document'; export default function NavbarDocumentDivision() { const [isChecked, setIsChecked] = useState(false); const router = useRouter() - - const handleCheckboxChange = () => { - setIsChecked(!isChecked); - }; + const param = useParams<{ id: string }>() + const [name, setName] = useState('') const [isOpen, setOpen] = useState(false) - const [isDelete, setIsDelete] = useState(false) const [rename, setRename] = useState(false) const [share, setShare] = useState(false) const [more, setMore] = useState(false) + const searchParams = useSearchParams() + const path = searchParams.get('path') + const [dataDocument, setDataDocument] = useState([]) + const refresh = useHookstate(globalRefreshDocument) + + const handleCheckboxChange = () => { + setIsChecked(!isChecked); + }; + function onTrue(val: boolean) { if (val) { @@ -94,6 +54,38 @@ export default function NavbarDocumentDivision() { setRename(false) } + async function getOneData() { + try { + const respon = await funGetAllDocument("?division=" + param.id + "&path=" + path); + if (respon.success) { + setDataDocument(respon.data); + } else { + toast.error(respon.message); + } + + const res = await funGetDivisionById(param.id); + if (res.success) { + setName(res.data.division.name); + } else { + toast.error(res.message); + } + + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan divisi, coba lagi nanti"); + } + } + + function resetRefresh() { + refresh.set(false) + setOpen(false) + } + + useShallowEffect(() => { + getOneData() + resetRefresh() + }, [param.id, path, refresh.get()]) + return ( {isChecked && ( @@ -136,7 +128,8 @@ export default function NavbarDocumentDivision() { )} - setOpen(true)} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> @@ -145,19 +138,30 @@ export default function NavbarDocumentDivision() { /> - {dataDocuments.map((v, i) => { + {dataDocument.map((v, i) => { return ( - router.push('/document?page=list-document')}> + { + if (v.category == "FOLDER") + router.push('?path=' + v.id) + }} + > - {v.icon} + { + (v.category == "FOLDER") ? + : + (v.extension == "pdf" || v.extension == "csv") ? + : + + } - {v.name} - {v.date} + {(v.category == "FOLDER") ? v.name : v.name + '.' + v.extension} + {v.updatedAt} @@ -180,9 +184,14 @@ export default function NavbarDocumentDivision() { })} + + + setOpen(false)}> + + setIsDelete(false)} description="Apakah Anda yakin ingin menghapus data?" onYes={(val) => { onTrue(val) }} />