From e01dbed1eb7adbefb50b165d95a37aca819463cf Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 12 Sep 2024 14:24:18 +0800 Subject: [PATCH 1/4] upd: dokumen Deskripsi: - upload file - view file No Issues --- prisma/schema.prisma | 1 + src/app/api/document/route.ts | 2 + src/app/api/document/upload/route.ts | 50 +++++++++---------- src/module/document/lib/type_document.ts | 1 + .../ui/drawer_menu_document_division.tsx | 5 +- .../document/ui/navbar_document_division.tsx | 8 +-- 6 files changed, 35 insertions(+), 32 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 43b4898..83e6a62 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -364,6 +364,7 @@ model DivisionDocumentFolderFile { id String @id @default(cuid()) Division Division @relation(fields: [idDivision], references: [id]) idDivision String + idStorage String? category String @default("FOLDER") // FOLDER OR FILE name String extension String diff --git a/src/app/api/document/route.ts b/src/app/api/document/route.ts index c34cd03..f45bf14 100644 --- a/src/app/api/document/route.ts +++ b/src/app/api/document/route.ts @@ -129,6 +129,7 @@ export async function GET(request: Request) { formatDataShare = dataShare.map((v: any) => ({ ..._.omit(v, ["DivisionDocumentFolderFile"]), + idStorage: '', id: v.DivisionDocumentFolderFile.id, category: v.DivisionDocumentFolderFile.category, name: v.DivisionDocumentFolderFile.name, @@ -156,6 +157,7 @@ export async function GET(request: Request) { category: true, name: true, extension: true, + idStorage: true, path: true, User: { select: { diff --git a/src/app/api/document/upload/route.ts b/src/app/api/document/upload/route.ts index eb9095b..6dd776f 100644 --- a/src/app/api/document/upload/route.ts +++ b/src/app/api/document/upload/route.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/module/_global"; +import { DIR, funUploadFile, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -70,33 +70,29 @@ export async function POST(request: Request) { const fExt = file.name.split(".").pop() const fName = file.name.replace("." + fExt, "") + const upload = await funUploadFile({ file: file, dirId: DIR.document }) + if (upload.success) { + const dataInsert = await prisma.divisionDocumentFolderFile.create({ + data: { + name: fName, + path: idPath, + idDivision, + category: "FILE", + extension: String(fExt), + createdBy: user.id, + idStorage: upload.data.id + }, + select: { + id: true + } + }); - const dataInsert = await prisma.divisionDocumentFolderFile.create({ - data: { - name: fName, - path: idPath, - idDivision, - category: "FILE", - extension: String(fExt), - createdBy: user.id, - }, - select: { - id: true - } - }); - - const root = path.join(process.cwd(), "./public/file/dokumen/"); - const nameFix = dataInsert.id + '.' + fExt - const filePath = path.join(root, nameFix) - // Konversi ArrayBuffer ke Buffer - const buffer = Buffer.from(await file.arrayBuffer()); - // Tulis file ke sistem - fs.writeFileSync(filePath, buffer); - - // create log user - const log = await createLogUser({ act: 'CREATE', desc: 'User mengupload file baru', table: 'divisionDocumentFolderFile', data: dataInsert.id }) - - return NextResponse.json({ success: true, message: "Berhasil upload file" }, { status: 200 }); + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User mengupload file baru', table: 'divisionDocumentFolderFile', data: dataInsert.id }) + return NextResponse.json({ success: true, message: "Berhasil upload file" }, { status: 200 }); + } else { + return NextResponse.json({ success: false, message: "Gagal upload file, coba lagi nanti" }, { status: 400 }); + } } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal upload file, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/module/document/lib/type_document.ts b/src/module/document/lib/type_document.ts index 14992f9..25e7638 100644 --- a/src/module/document/lib/type_document.ts +++ b/src/module/document/lib/type_document.ts @@ -1,4 +1,5 @@ export interface IDataDocument { + idStorage: string; id: string; name: string; extension: string; diff --git a/src/module/document/ui/drawer_menu_document_division.tsx b/src/module/document/ui/drawer_menu_document_division.tsx index 18b0a31..2e3139d 100644 --- a/src/module/document/ui/drawer_menu_document_division.tsx +++ b/src/module/document/ui/drawer_menu_document_division.tsx @@ -114,7 +114,10 @@ export default function DrawerMenuDocumentDivision() { maxSize={3 * 1024 ** 2} accept={['text/csv', 'image/png', 'image/jpeg', 'image/heic', 'application/pdf']} onReject={(files) => { - return toast.error('File yang diizinkan: .csv, .png, .jpg, .heic, .pdf dengan ukuran maksimal 3 MB') + refresh.set(true) + setOpenModal(false) + setOpenDrawerDocument(false) + toast.error('File yang diizinkan: .csv, .png, .jpg, .heic, .pdf dengan ukuran maksimal 3 MB') }} > openRef.current?.()}> diff --git a/src/module/document/ui/navbar_document_division.tsx b/src/module/document/ui/navbar_document_division.tsx index 79d7126..8e09dec 100644 --- a/src/module/document/ui/navbar_document_division.tsx +++ b/src/module/document/ui/navbar_document_division.tsx @@ -30,7 +30,7 @@ export default function NavbarDocumentDivision() { const param = useParams<{ id: string }>() const [isOpenModalView, setOpenModalView] = useState(false) const [isExtension, setExtension] = useState('') - const [idData, setIdData] = useState('') + const [idStorage, setIdStorage] = useState('') const [name, setName] = useState('') const [isOpen, setOpen] = useState(false) const [isDelete, setIsDelete] = useState(false) @@ -337,7 +337,7 @@ export default function NavbarDocumentDivision() { router.push('?path=' + v.id) } else if (v.category == "FILE" && selectedFiles.length == 0 && !dariSelectAll) { setExtension(v.extension) - setIdData(v.id) + setIdStorage(v.idStorage) setOpenModalView(true) } @@ -380,7 +380,7 @@ export default function NavbarDocumentDivision() { router.push('?path=' + v.id) } else if (v.category == "FILE" && selectedFiles.length == 0 && !dariSelectAll) { setExtension(v.extension) - setIdData(v.id) + setIdStorage(v.idStorage) setOpenModalView(true) } @@ -485,7 +485,7 @@ export default function NavbarDocumentDivision() { - setOpenModalView(false)} file={idData + '.' + isExtension} extension={isExtension} fitur='dokumen' /> + setOpenModalView(false)} file={idStorage} extension={isExtension} fitur='dokumen' /> ); } From ad6bd2cbfb626fcb82786a257c890cb140423a8c Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 12 Sep 2024 15:39:09 +0800 Subject: [PATCH 2/4] upd: task divisi Deskripsi: - upload file - view file No Issues --- prisma/schema.prisma | 1 + src/app/api/task/[id]/route.ts | 6 +- src/app/api/task/file/[id]/route.ts | 57 ++--- src/app/api/task/route.ts | 45 ++-- src/module/task/lib/type_task.ts | 3 +- src/module/task/ui/create_date_end_task.tsx | 46 ++-- src/module/task/ui/create_task.tsx | 249 ++++++++++--------- src/module/task/ui/create_users_project.tsx | 26 +- src/module/task/ui/detail_list_file_task.tsx | 5 +- 9 files changed, 226 insertions(+), 212 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 83e6a62..181d275 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -452,6 +452,7 @@ model ContainerFileDivision { id String @id @default(cuid()) Division Division @relation(fields: [idDivision], references: [id]) idDivision String + idStorage String? name String extension String isActive Boolean @default(true) diff --git a/src/app/api/task/[id]/route.ts b/src/app/api/task/[id]/route.ts index 1b613c4..1ae287f 100644 --- a/src/app/api/task/[id]/route.ts +++ b/src/app/api/task/[id]/route.ts @@ -90,7 +90,8 @@ export async function GET(request: Request, context: { params: { id: string } }) select: { id: true, name: true, - extension: true + extension: true, + idStorage: true } } } @@ -101,6 +102,7 @@ export async function GET(request: Request, context: { params: { id: string } }) nameInStorage: v.ContainerFileDivision.id, name: v.ContainerFileDivision.name, extension: v.ContainerFileDivision.extension, + idStorage: v.ContainerFileDivision.idStorage, })) allData = fix @@ -287,7 +289,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) // create log user const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data tugas divisi', table: 'divisionProject', data: id }) - return NextResponse.json( { success: true, message: "Tugas berhasil diedit", }, { status: 200 } ); + return NextResponse.json({ success: true, message: "Tugas berhasil diedit", }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mengedit tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/app/api/task/file/[id]/route.ts b/src/app/api/task/file/[id]/route.ts index 429e74a..7796b3f 100644 --- a/src/app/api/task/file/[id]/route.ts +++ b/src/app/api/task/file/[id]/route.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/module/_global"; +import { DIR, funDeleteFile, funUploadFile, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -42,7 +42,7 @@ export async function DELETE(request: Request, context: { params: { id: string } } }) - fs.unlink(`./public/file/task/${dataFile?.id}.${dataFile?.extension}`, (err) => { }) + await funDeleteFile({ fileId: String(dataFile?.idStorage) }) const deleteRelasi = await prisma.divisionProjectFile.delete({ where: { @@ -57,7 +57,7 @@ export async function DELETE(request: Request, context: { params: { id: string } }); // create log user - const log = await createLogUser({ act: 'DELETE', desc: 'User menghpus file divisi', table: 'divisionProject', data: String(dataRelasi?.idProject) }) + const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus file tugas divisi', table: 'divisionProject', data: String(dataRelasi?.idProject) }) return NextResponse.json({ success: true, message: "File berhasil dihapus", data, }, { status: 200 }); @@ -115,34 +115,29 @@ export async function POST(request: Request, context: { params: { id: string } } const fName = file.name.replace("." + fExt, "") - const insertToContainer = await prisma.containerFileDivision.create({ - data: { - idDivision: String(dataProject?.idDivision), - name: fName, - extension: String(fExt) - }, - select: { - id: true + const upload = await funUploadFile({ file: file, dirId: DIR.task }) + if (upload.success) { + const insertToContainer = await prisma.containerFileDivision.create({ + data: { + idDivision: String(dataProject?.idDivision), + name: fName, + extension: String(fExt), + idStorage: upload.data.id + }, + select: { + id: true + } + }) + + const dataFile = { + idProject: id, + idDivision: dataProject?.idDivision, + idFile: insertToContainer.id, + createdBy: user.id, } - }) - const nameFix = insertToContainer.id + '.' + fExt - const filePath = path.join(root, nameFix) - // Konversi ArrayBuffer ke Buffer - const buffer = Buffer.from(await file.arrayBuffer()); - // Tulis file ke sistem - fs.writeFileSync(filePath, buffer); - - - const dataFile = { - idProject: id, - idDivision: dataProject?.idDivision, - idFile: insertToContainer.id, - createdBy: user.id, + fileFix.push(dataFile) } - - - fileFix.push(dataFile) } } @@ -152,12 +147,12 @@ export async function POST(request: Request, context: { params: { id: string } } } // create log user - const log = await createLogUser({ act: 'CREATE', desc: 'User meambahkan file tugas divisi baru', table: 'divisionProject', data: id }) - return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 }); + const log = await createLogUser({ act: 'CREATE', desc: 'User menambahkan file tugas divisi baru', table: 'divisionProject', data: id }) + return NextResponse.json({ success: true, message: "Berhasil menambahkan file" }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal membuat tugas divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal menambahkan filae, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } } diff --git a/src/app/api/task/route.ts b/src/app/api/task/route.ts index 76d524a..3093cf6 100644 --- a/src/app/api/task/route.ts +++ b/src/app/api/task/route.ts @@ -1,4 +1,4 @@ -import { prisma } from "@/module/_global"; +import { DIR, funUploadFile, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _, { ceil } from "lodash"; import { NextResponse } from "next/server"; @@ -153,42 +153,35 @@ export async function POST(request: Request) { let fileFix: any[] = [] if (cekFile) { - const root = path.join(process.cwd(), "./public/file/task/"); for (var pair of body.entries()) { if (String(pair[0]).substring(0, 4) == "file") { const file = body.get(pair[0]) as File const fExt = file.name.split(".").pop() const fName = file.name.replace("." + fExt, "") + const upload = await funUploadFile({ file: file, dirId: DIR.task }) + if (upload.success) { + const insertToContainer = await prisma.containerFileDivision.create({ + data: { + idDivision: idDivision, + name: fName, + extension: String(fExt), + idStorage: upload.data.id + }, + select: { + id: true + } + }) - const insertToContainer = await prisma.containerFileDivision.create({ - data: { + const dataFile = { + idProject: data.id, idDivision: idDivision, - name: fName, - extension: String(fExt) - }, - select: { - id: true + idFile: insertToContainer.id, + createdBy: user.id, } - }) - const nameFix = insertToContainer.id + '.' + fExt - const filePath = path.join(root, nameFix) - // Konversi ArrayBuffer ke Buffer - const buffer = Buffer.from(await file.arrayBuffer()); - // Tulis file ke sistem - fs.writeFileSync(filePath, buffer); - - - const dataFile = { - idProject: data.id, - idDivision: idDivision, - idFile: insertToContainer.id, - createdBy: user.id, + fileFix.push(dataFile) } - - - fileFix.push(dataFile) } } diff --git a/src/module/task/lib/type_task.ts b/src/module/task/lib/type_task.ts index 8fe2363..bcadba5 100644 --- a/src/module/task/lib/type_task.ts +++ b/src/module/task/lib/type_task.ts @@ -68,5 +68,6 @@ export interface IDataFileTaskDivision { id: string name: string extension: string, - nameInStorage: string + nameInStorage: string, + idStorage: string } \ No newline at end of file diff --git a/src/module/task/ui/create_date_end_task.tsx b/src/module/task/ui/create_date_end_task.tsx index 573b126..f84295c 100644 --- a/src/module/task/ui/create_date_end_task.tsx +++ b/src/module/task/ui/create_date_end_task.tsx @@ -1,6 +1,7 @@ "use client"; import { LayoutNavbarNew, WARNA } from "@/module/_global"; import { + ActionIcon, Avatar, Box, Button, @@ -19,9 +20,10 @@ import { useParams, useRouter } from "next/navigation"; import toast from "react-hot-toast"; import { IFormDateTask } from "../lib/type_task"; import moment from "moment"; +import { HiChevronLeft } from "react-icons/hi2"; -export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateTask) => void }) { +export default function ViewDateEndTask({ onClose, onSet }: {onClose: (val: boolean) => void, onSet: (val: IFormDateTask) => void }) { const [value, setValue] = useState<[Date | null, Date | null]>([null, null]); const router = useRouter() const param = useParams<{ id: string }>() @@ -37,7 +39,7 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateT if (title == "") return toast.error("Error! harus memasukkan judul tugas") - onClose( + onSet( { dateStart: value[0], dateEnd: value[1], @@ -49,7 +51,13 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateT return ( - + + { onClose(true) }} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + + } title={"Tanggal Tugas"} menu /> - - - + + + ); } diff --git a/src/module/task/ui/create_task.tsx b/src/module/task/ui/create_task.tsx index e6e8e81..576ff01 100644 --- a/src/module/task/ui/create_task.tsx +++ b/src/module/task/ui/create_task.tsx @@ -76,7 +76,7 @@ export default function CreateTask() { if (response.success) { toast.success(response.message) - // setTitle("") + setTitle("") member.set([]) setFileForm([]) setListFile([]) @@ -92,7 +92,7 @@ export default function CreateTask() { } - if (openTugas) return { + if (openTugas) return { setOpenTugas(false) }} onSet={(val) => { setDataTask([...dataTask, val]) setOpenTugas(false) }} />; @@ -148,7 +148,10 @@ export default function CreateTask() { border: `1px solid ${"#D6D8F6"}`, borderRadius: 10, }} - onClick={() => setOpenDrawer(true)} + onClick={() => + // setOpenDrawer(true) + openRef.current?.() + } > Upload File @@ -168,103 +171,103 @@ export default function CreateTask() { - { - dataTask.length > 0 && - - Tanggal & Tugas - { - dataTask.map((v, i) => { - return ( - { - setIndexDelTask(i) - setOpenDrawerTask(true) - }}> - - - ) - }) - } - - } - - { - listFile.length > 0 && - - File - + { + dataTask.length > 0 && + + Tanggal & Tugas { - listFile.map((v, i) => { + dataTask.map((v, i) => { return ( { - setIndexDelFile(i) - setOpenDrawerFile(true) + setIndexDelTask(i) + setOpenDrawerTask(true) }}> - + ) }) } - - } + } - - { - member.length > 0 && - - - Anggota Terpilih - Total {member.length} Anggota - - - - - {member.get().map((v: any, i: any) => { + { + listFile.length > 0 && + + File + + { + listFile.map((v, i) => { return ( - - - - - - - - {v.name} - - - - - - - Anggota - - - - - + { + setIndexDelFile(i) + setOpenDrawerFile(true) + }}> + + + ) + }) + } + + + } + + + { + member.length > 0 && + + + Anggota Terpilih + Total {member.length} Anggota + + + + + {member.get().map((v: any, i: any) => { + return ( + + + + + + + + {v.name} + + + + + + + Anggota + + + + + + - - ); - })} + ); + })} + - - } + } + { + if (!files || _.isEmpty(files)) + return toast.error('Tidak ada file yang dipilih') + setFileForm([...fileForm, files[0]]) + setListFile([...listFile, { name: files[0].name, extension: files[0].type.split("/")[1] }]) + }} + activateOnClick={false} + maxSize={3 * 1024 ** 2} + accept={['text/csv', 'image/png', 'image/jpeg', 'image/heic', 'application/pdf']} + onReject={(files) => { + return toast.error('File yang diizinkan: .csv, .png, .jpg, .heic, .pdf dengan ukuran maksimal 3 MB') + }} + > + {/* Drawer pilih file */} - setOpenDrawer(false)} title={"Pilih File"} > - { - if (!files || _.isEmpty(files)) - return toast.error('Tidak ada file yang dipilih') - setFileForm([...fileForm, files[0]]) - setListFile([...listFile, { name: files[0].name, extension: files[0].type.split("/")[1] }]) - }} - activateOnClick={false} - maxSize={3 * 1024 ** 2} - accept={['text/csv', 'image/png', 'image/jpeg', 'image/heic', 'application/pdf']} - onReject={(files) => { - return toast.error('File yang diizinkan: .csv, .png, .jpg, .heic, .pdf dengan ukuran maksimal 3 MB') - }} - > - openRef.current?.()}> - -
- -
-
- - Pilih file - - diperangkat + + openRef.current?.()}> + +
+ +
-
- {/* router.push("/task/create?page=file-save")}> + + Pilih file + + diperangkat + + + router.push("/task/create?page=file-save")}> sudah ada - */} +
-
+ */} diff --git a/src/module/task/ui/create_users_project.tsx b/src/module/task/ui/create_users_project.tsx index b56e2fb..9428b6b 100644 --- a/src/module/task/ui/create_users_project.tsx +++ b/src/module/task/ui/create_users_project.tsx @@ -26,7 +26,7 @@ import { globalMemberTask } from "../lib/val_task"; import { FaCheck } from "react-icons/fa6"; import { RiListCheck } from "react-icons/ri"; import { BsListCheck } from "react-icons/bs"; -import { HiMagnifyingGlass } from "react-icons/hi2"; +import { HiChevronLeft, HiMagnifyingGlass } from "react-icons/hi2"; import { IoArrowBackOutline, IoClose } from "react-icons/io5"; import { Carousel } from "@mantine/carousel"; @@ -119,21 +119,27 @@ export default function CreateUsersProject({ onClose }: { onClose: (val: any) => async function fetchGetMember(val: string) { setSearchQuery(val) try { - const res = await funGetSearchMemberDivision('?search=' + val, param.id); - if (res.success) { - setData(res.data) - } else { - toast.error(res.message); - } + const res = await funGetSearchMemberDivision('?search=' + val, param.id); + if (res.success) { + setData(res.data) + } else { + toast.error(res.message); + } } catch (error) { - console.error(error); + console.error(error); } - } + } return ( + { onClose(true) }} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + + } title="Pilih Anggota" menu={ diff --git a/src/module/task/ui/detail_list_file_task.tsx b/src/module/task/ui/detail_list_file_task.tsx index b6ac373..a2e72c4 100644 --- a/src/module/task/ui/detail_list_file_task.tsx +++ b/src/module/task/ui/detail_list_file_task.tsx @@ -18,6 +18,7 @@ export default function ListFileDetailTask() { const [openDrawer, setOpenDrawer] = useState(false) const [isOpenModal, setOpenModal] = useState(false) const [idData, setIdData] = useState('') + const [idDataStorage, setIdDataStorage] = useState('') const [nameStorage, setNameStorage] = useState('') const [nameData, setNameData] = useState('') const [isOpenModalView, setOpenModalView] = useState(false) @@ -52,6 +53,7 @@ export default function ListFileDetailTask() { toast.success(res.message) getOneData() setIdData("") + setIdDataStorage("") setOpenDrawer(false) } else { toast.error(res.message); @@ -102,6 +104,7 @@ export default function ListFileDetailTask() { setExtension(item.extension) setNameStorage(item.nameInStorage) setIdData(item.id) + setIdDataStorage(item.idStorage) setOpenDrawer(true) }} > @@ -167,7 +170,7 @@ export default function ListFileDetailTask() { setOpenModal(false) }} /> - setOpenModalView(false)} file={nameStorage + '.' + isExtension} extension={isExtension} fitur='task' /> + setOpenModalView(false)} file={idDataStorage} extension={isExtension} fitur='task' />
) } \ No newline at end of file From b3f1e13d102c0fa60d3c49359e2157438d863e89 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 12 Sep 2024 15:55:45 +0800 Subject: [PATCH 3/4] fix: wrap layout --- src/module/_global/components/wrap_layout.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/module/_global/components/wrap_layout.tsx b/src/module/_global/components/wrap_layout.tsx index da1831a..ab53be2 100644 --- a/src/module/_global/components/wrap_layout.tsx +++ b/src/module/_global/components/wrap_layout.tsx @@ -2,13 +2,15 @@ import { useHookstate } from "@hookstate/core"; import { globalRole } from "../bin/val_global"; import { useShallowEffect } from "@mantine/hooks"; +import { useEffect } from "react"; export default function WrapLayout({ children, role }: { children: React.ReactNode, role: any }) { const roleLogin = useHookstate(globalRole) - useShallowEffect(() => { + useEffect(() => { roleLogin.set(role) - }, []) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [role]) return ( <> {children} From 4d2516b9b0d8b99ea80cd9ec2af618b75c03a129 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 12 Sep 2024 17:27:48 +0800 Subject: [PATCH 4/4] upd: palet tema warna Deskripsi: - update tb database - update seeder No Issues --- prisma/schema.prisma | 18 +++++++++++++++ prisma/seed.ts | 38 +++++++++++++++++++++++++++---- src/module/seeder/data/theme.json | 22 ++++++++++++++++++ src/module/seeder/index.ts | 3 ++- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/module/seeder/data/theme.json diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 181d275..9a14f90 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -47,6 +47,7 @@ model UserRole { model Village { id String @id @default(cuid()) + idTheme String? name String desc String @db.Text isActive Boolean @default(true) @@ -57,6 +58,7 @@ model Village { Announcement Announcement[] Project Project[] Division Division[] + ColorTheme ColorTheme[] } model Group { @@ -460,3 +462,19 @@ model ContainerFileDivision { updatedAt DateTime @updatedAt DivisionProjectFile DivisionProjectFile[] } + +model ColorTheme { + id String @id @default(cuid()) + Village Village? @relation(fields: [idVillage], references: [id]) + idVillage String? + name String + utama String + bgUtama String + bgIcon String + bgFiturHome String + bgFiturDivision String + bgTotalKegiatan String + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/prisma/seed.ts b/prisma/seed.ts index e55648c..b55d1ae 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,4 +1,4 @@ -import { seederAdmin, seederAdminRole, seederDesa, seederGroup, seederPosition, seederUser, seederUserRole } from '@/module/seeder'; +import { seederAdmin, seederAdminRole, seederDesa, seederGroup, seederPosition, seederTheme, seederUser, seederUserRole } from '@/module/seeder'; import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient() @@ -43,6 +43,34 @@ async function main() { }) } + // THEME + for (let data of seederTheme) { + await prisma.colorTheme.upsert({ + where: { + id: data.id + }, + update: { + name: data.name, + utama: data.utama, + bgUtama: data.bgUtama, + bgIcon: data.bgIcon, + bgFiturHome: data.bgFiturHome, + bgFiturDivision: data.bgFiturDivisi, + bgTotalKegiatan: data.bgTotalKegiatan + }, + create: { + id: data.id, + name: data.name, + utama: data.utama, + bgUtama: data.bgUtama, + bgIcon: data.bgIcon, + bgFiturHome: data.bgFiturHome, + bgFiturDivision: data.bgFiturDivisi, + bgTotalKegiatan: data.bgTotalKegiatan + } + }) + } + // DESA for (let data of seederDesa) { await prisma.village.upsert({ @@ -51,12 +79,14 @@ async function main() { }, update: { name: data.name, - desc: data.desc + desc: data.desc, + idTheme: "theme1" }, create: { id: data.id, name: data.name, - desc: data.desc + desc: data.desc, + idTheme: "theme1" } }) } @@ -127,7 +157,7 @@ async function main() { idUserRole: data.idUserRole, nik: data.nik, name: data.name, - phone: data.phone, + // phone: data.phone, email: data.email, gender: data.gender }, diff --git a/src/module/seeder/data/theme.json b/src/module/seeder/data/theme.json new file mode 100644 index 0000000..9ee758e --- /dev/null +++ b/src/module/seeder/data/theme.json @@ -0,0 +1,22 @@ +[ + { + "id": "theme1", + "name": "Tema 1", + "utama": "#19345E", + "bgUtama": "#F4F9FD", + "bgIcon": "#384288", + "bgFiturHome": "#FCAA4B", + "bgFiturDivisi": "#FCAA4B", + "bgTotalKegiatan": "#DCEED8" + }, + { + "id": "theme2", + "name": "Tema 2", + "utama": "#508D4E", + "bgUtama": "#F4F9FD", + "bgIcon": "#3C8754", + "bgFiturHome": "#FCAA4B", + "bgFiturDivisi": "#FCAA4B", + "bgTotalKegiatan": "#DCEED8" + } +] \ No newline at end of file diff --git a/src/module/seeder/index.ts b/src/module/seeder/index.ts index 6f7e816..401ebb1 100644 --- a/src/module/seeder/index.ts +++ b/src/module/seeder/index.ts @@ -5,5 +5,6 @@ import seederUser from "./data/user.json"; import seederDesa from "./data/desa.json"; import seederGroup from "./data/group.json"; import seederPosition from "./data/position.json"; +import seederTheme from "./data/theme.json"; -export { seederAdminRole, seederAdmin, seederDesa, seederGroup, seederPosition, seederUserRole, seederUser, } \ No newline at end of file +export { seederAdminRole, seederAdmin, seederDesa, seederGroup, seederPosition, seederUserRole, seederUser, seederTheme } \ No newline at end of file