upd: project
Deskripsi: - upload file NO Issues
This commit is contained in:
@@ -200,6 +200,7 @@ model ProjectFile {
|
|||||||
idProject String
|
idProject String
|
||||||
name String
|
name String
|
||||||
extension String
|
extension String
|
||||||
|
idStorage String?
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
|||||||
@@ -91,7 +91,8 @@ export async function GET(request: Request, context: { params: { id: string } })
|
|||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
name: true,
|
name: true,
|
||||||
extension: true
|
extension: true,
|
||||||
|
idStorage: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from "@/module/_global";
|
import { DIR, funDeleteFile, funUploadFile, prisma } from "@/module/_global";
|
||||||
import { funGetUserByCookies } from "@/module/auth";
|
import { funGetUserByCookies } from "@/module/auth";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@@ -36,8 +36,7 @@ export async function DELETE(request: Request, context: { params: { id: string }
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const delStorage = await funDeleteFile({ fileId: String(dataRelasi?.idStorage) })
|
||||||
fs.unlink(`./public/file/project/${dataRelasi?.id}.${dataRelasi?.extension}`, (err) => { })
|
|
||||||
|
|
||||||
const deleteRelasi = await prisma.projectFile.delete({
|
const deleteRelasi = await prisma.projectFile.delete({
|
||||||
where: {
|
where: {
|
||||||
@@ -166,31 +165,27 @@ export async function POST(request: Request, context: { params: { id: string } }
|
|||||||
|
|
||||||
|
|
||||||
if (cekFile) {
|
if (cekFile) {
|
||||||
const root = path.join(process.cwd(), "./public/file/project/");
|
|
||||||
for (var pair of body.entries()) {
|
for (var pair of body.entries()) {
|
||||||
if (String(pair[0]).substring(0, 4) == "file") {
|
if (String(pair[0]).substring(0, 4) == "file") {
|
||||||
const file = body.get(pair[0]) as File
|
const file = body.get(pair[0]) as File
|
||||||
const fExt = file.name.split(".").pop()
|
const fExt = file.name.split(".").pop()
|
||||||
const fName = file.name.replace("." + fExt, "")
|
const fName = file.name.replace("." + fExt, "")
|
||||||
|
|
||||||
|
const upload = await funUploadFile({ file: file, dirId: DIR.project })
|
||||||
|
if (upload.success) {
|
||||||
|
const insertToTable = await prisma.projectFile.create({
|
||||||
|
data: {
|
||||||
|
idStorage: upload.data.id,
|
||||||
|
idProject: id,
|
||||||
|
name: fName,
|
||||||
|
extension: String(fExt),
|
||||||
|
|
||||||
const insertToTable = await prisma.projectFile.create({
|
},
|
||||||
data: {
|
select: {
|
||||||
idProject: id,
|
id: true
|
||||||
name: fName,
|
}
|
||||||
extension: String(fExt)
|
})
|
||||||
},
|
}
|
||||||
select: {
|
|
||||||
id: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const nameFix = insertToTable.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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { prisma } from "@/module/_global";
|
import { DIR, funUploadFile, prisma } from "@/module/_global";
|
||||||
import { funGetUserByCookies } from "@/module/auth";
|
import { funGetUserByCookies } from "@/module/auth";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
@@ -169,31 +169,22 @@ export async function POST(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cekFile) {
|
if (cekFile) {
|
||||||
const root = path.join(process.cwd(), "./public/file/project/");
|
|
||||||
for (var pair of body.entries()) {
|
for (var pair of body.entries()) {
|
||||||
if (String(pair[0]).substring(0, 4) == "file") {
|
if (String(pair[0]).substring(0, 4) == "file") {
|
||||||
const file = body.get(pair[0]) as File
|
const file = body.get(pair[0]) as File
|
||||||
const fExt = file.name.split(".").pop()
|
const fExt = file.name.split(".").pop()
|
||||||
const fName = file.name.replace("." + fExt, "")
|
const fName = file.name.replace("." + fExt, "")
|
||||||
|
const upload = await funUploadFile({ file: file, dirId: DIR.project })
|
||||||
|
if (upload.success) {
|
||||||
const insertToTable = await prisma.projectFile.create({
|
await prisma.projectFile.create({
|
||||||
data: {
|
data: {
|
||||||
idProject: data.id,
|
idStorage: upload.data.id,
|
||||||
name: fName,
|
idProject: data.id,
|
||||||
extension: String(fExt)
|
name: fName,
|
||||||
},
|
extension: String(fExt)
|
||||||
select: {
|
}
|
||||||
id: true
|
})
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
const nameFix = insertToTable.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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export default function LayoutModal({ opened, onClose, extension, fitur, file }:
|
|||||||
}}>
|
}}>
|
||||||
<div style={{ transform: `scale(${zoom})`, transformOrigin: 'center' }}>
|
<div style={{ transform: `scale(${zoom})`, transformOrigin: 'center' }}>
|
||||||
{
|
{
|
||||||
extension === 'pdf' ? <PdfToImage md={filePdf} /> :
|
extension === 'pdf' ? <PdfToImage md={`https://wibu-storage.wibudev.com/api/files/${file}`} /> :
|
||||||
<Image
|
<Image
|
||||||
radius="md"
|
radius="md"
|
||||||
style={{
|
style={{
|
||||||
@@ -63,7 +63,7 @@ export default function LayoutModal({ opened, onClose, extension, fitur, file }:
|
|||||||
maxHeight: '100%',
|
maxHeight: '100%',
|
||||||
}}
|
}}
|
||||||
fit="contain"
|
fit="contain"
|
||||||
src={`/api/file/img?cat=${fitur}&file=${file}&jenis=file`}
|
src={`https://wibu-storage.wibudev.com/api/files/${file}`}
|
||||||
alt={file}
|
alt={file}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ export interface IDataFileProject {
|
|||||||
id: string
|
id: string
|
||||||
name: string
|
name: string
|
||||||
extension: string
|
extension: string
|
||||||
|
idStorage:string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDataMemberProject {
|
export interface IDataMemberProject {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { LayoutNavbarNew, WARNA } from "@/module/_global";
|
import { LayoutNavbarNew, WARNA } from "@/module/_global";
|
||||||
import {
|
import {
|
||||||
|
ActionIcon,
|
||||||
Avatar,
|
Avatar,
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -19,9 +20,10 @@ import { useRouter } from "next/navigation";
|
|||||||
import toast from "react-hot-toast";
|
import toast from "react-hot-toast";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { IFormDateProject } from "../lib/type_project";
|
import { IFormDateProject } from "../lib/type_project";
|
||||||
|
import { HiChevronLeft } from "react-icons/hi2";
|
||||||
|
|
||||||
|
|
||||||
export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateProject) => void }) {
|
export default function ViewDateEndTask({ onClose, onSet }: {onClose: (val: boolean) => void, onSet: (val: IFormDateProject) => void }) {
|
||||||
const [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
|
const [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const [title, setTitle] = useState("")
|
const [title, setTitle] = useState("")
|
||||||
@@ -36,7 +38,7 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
|
|||||||
if (title == "")
|
if (title == "")
|
||||||
return toast.error("Error! harus memasukkan judul tugas")
|
return toast.error("Error! harus memasukkan judul tugas")
|
||||||
|
|
||||||
onClose(
|
onSet(
|
||||||
{
|
{
|
||||||
dateStart: value[0],
|
dateStart: value[0],
|
||||||
dateEnd: value[1],
|
dateEnd: value[1],
|
||||||
@@ -48,7 +50,13 @@ export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateP
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<LayoutNavbarNew title={"Tanggal Tugas"} menu />
|
<LayoutNavbarNew state={
|
||||||
|
<Box>
|
||||||
|
<ActionIcon variant="light" onClick={() => { onClose(true) }} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
|
||||||
|
<HiChevronLeft size={20} color='white' />
|
||||||
|
</ActionIcon>
|
||||||
|
</Box>
|
||||||
|
} title={"Tanggal Tugas"} menu />
|
||||||
<Box p={20}>
|
<Box p={20}>
|
||||||
<Group
|
<Group
|
||||||
justify="center"
|
justify="center"
|
||||||
|
|||||||
@@ -128,10 +128,7 @@ export default function CreateProject() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (openTugas) return <ViewDateEndTask onClose={(val) => {
|
if (openTugas) return <ViewDateEndTask onClose={(val) => { setOpenTugas(false) }} onSet={(val) => { setDataTask([...dataTask, val]); setOpenTugas(false) }} />;
|
||||||
setDataTask([...dataTask, val])
|
|
||||||
setOpenTugas(false)
|
|
||||||
}} />;
|
|
||||||
|
|
||||||
if (isChooseAnggota) return <CreateUsersProject grup={body.idGroup} onClose={() => { setChooseAnggota(false) }} />
|
if (isChooseAnggota) return <CreateUsersProject grup={body.idGroup} onClose={() => { setChooseAnggota(false) }} />
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ export default function ListFileDetailProject() {
|
|||||||
const param = useParams<{ id: string }>()
|
const param = useParams<{ id: string }>()
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const [idData, setIdData] = useState('')
|
const [idData, setIdData] = useState('')
|
||||||
|
const [idStorage, setIdStorage] = useState('')
|
||||||
const [nameData, setNameData] = useState('')
|
const [nameData, setNameData] = useState('')
|
||||||
const [openDrawer, setOpenDrawer] = useState(false)
|
const [openDrawer, setOpenDrawer] = useState(false)
|
||||||
const [isOpenModal, setOpenModal] = useState(false)
|
const [isOpenModal, setOpenModal] = useState(false)
|
||||||
@@ -52,6 +53,7 @@ export default function ListFileDetailProject() {
|
|||||||
toast.success(res.message)
|
toast.success(res.message)
|
||||||
getOneData()
|
getOneData()
|
||||||
setIdData("")
|
setIdData("")
|
||||||
|
setIdStorage("")
|
||||||
setOpenDrawer(false)
|
setOpenDrawer(false)
|
||||||
} else {
|
} else {
|
||||||
toast.error(res.message);
|
toast.error(res.message);
|
||||||
@@ -102,6 +104,7 @@ export default function ListFileDetailProject() {
|
|||||||
setNameData(item.name + '.' + item.extension)
|
setNameData(item.name + '.' + item.extension)
|
||||||
setExtension(item.extension)
|
setExtension(item.extension)
|
||||||
setIdData(item.id)
|
setIdData(item.id)
|
||||||
|
setIdStorage(item.idStorage)
|
||||||
setOpenDrawer(true)
|
setOpenDrawer(true)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -167,7 +170,7 @@ export default function ListFileDetailProject() {
|
|||||||
setOpenModal(false)
|
setOpenModal(false)
|
||||||
}} />
|
}} />
|
||||||
|
|
||||||
<LayoutModalViewFile opened={isOpenModalView} onClose={() => setOpenModalView(false)} file={idData + '.' + isExtension} extension={isExtension} fitur='project' />
|
<LayoutModalViewFile opened={isOpenModalView} onClose={() => setOpenModalView(false)} file={idStorage} extension={isExtension} fitur='project' />
|
||||||
</Box>
|
</Box>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user