From 6e59aca9d660c1514e3a51a03e63ed37d02f3828 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 15 Aug 2024 11:53:15 +0800 Subject: [PATCH] upd: task Deskripsi: - update database - task divisi No Issues --- prisma/schema.prisma | 91 +++++++++++-------- .../[id]/(fitur-division)/task/page.tsx | 7 +- src/app/api/division/route.ts | 1 - src/app/api/task/route.ts | 79 ++++++++++++++++ src/module/discussion/lib/api_discussion.ts | 1 - .../task/view/view_division_task.tsx | 14 --- src/module/division_new/index.ts | 2 - src/module/task/index.ts | 5 + src/module/task/lib/api_task.ts | 4 + src/module/task/lib/type_task.ts | 0 .../ui}/drawer_division_task.tsx | 0 .../ui}/list_division_task.tsx | 0 .../ui}/navbar_division_task.tsx | 0 .../ui}/tabs_division_task.tsx | 30 ++---- 14 files changed, 155 insertions(+), 79 deletions(-) create mode 100644 src/app/api/task/route.ts delete mode 100644 src/module/division_new/_division_fitur/task/view/view_division_task.tsx create mode 100644 src/module/task/index.ts create mode 100644 src/module/task/lib/api_task.ts create mode 100644 src/module/task/lib/type_task.ts rename src/module/{division_new/_division_fitur/task/component => task/ui}/drawer_division_task.tsx (100%) rename src/module/{division_new/_division_fitur/task/component => task/ui}/list_division_task.tsx (100%) rename src/module/{division_new/_division_fitur/task/component => task/ui}/navbar_division_task.tsx (100%) rename src/module/{division_new/_division_fitur/task/component => task/ui}/tabs_division_task.tsx (51%) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5d719d7..f350e28 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -252,54 +252,63 @@ model DivisionMember { } model DivisionProject { - id String @id @default(cuid()) - Division Division @relation(fields: [idDivision], references: [id]) - idDivision String - title String - desc String @db.Text - status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled - isActive Boolean @default(true) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + title String + desc String @db.Text + status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + DivisionProjectTask DivisionProjectTask[] + DivisionProjectMember DivisionProjectMember[] + DivisionProjectFile DivisionProjectFile[] } model DivisionProjectTask { - id String @id @default(cuid()) - Division Division @relation(fields: [idDivision], references: [id]) - idDivision String - title String - desc String @db.Text - status Int @default(0) - dateStart DateTime @db.Date - dateEnd DateTime @db.Date - isActive Boolean @default(true) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + DivisionProject DivisionProject @relation(fields: [idProject], references: [id]) + idProject String + title String + desc String @db.Text + status Int @default(0) // 0 = todo, 1 = done + dateStart DateTime @db.Date + dateEnd DateTime @db.Date + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model DivisionProjectMember { - id String @id @default(cuid()) - Division Division @relation(fields: [idDivision], references: [id]) - idDivision String - User User @relation(fields: [idUser], references: [id]) - idUser String - isLeader Boolean @default(false) - isActive Boolean @default(true) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + DivisionProject DivisionProject @relation(fields: [idProject], references: [id]) + idProject String + User User @relation(fields: [idUser], references: [id]) + idUser String + isLeader Boolean @default(false) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model DivisionProjectFile { - id String @id @default(cuid()) - Division Division @relation(fields: [idDivision], references: [id]) - idDivision String - name String - extension String - isActive Boolean @default(true) - User User @relation(fields: [createdBy], references: [id]) - createdBy String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(cuid()) + Division Division @relation(fields: [idDivision], references: [id]) + idDivision String + DivisionProject DivisionProject @relation(fields: [idProject], references: [id]) + idProject String + name String + extension String + isActive Boolean @default(true) + User User @relation(fields: [createdBy], references: [id]) + createdBy String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model DivisionDisscussion { @@ -364,6 +373,8 @@ model DivisionCalendar { desc String @db.Text dateStart DateTime @db.Date dateEnd DateTime @db.Date + timeStart DateTime @db.Time() + timeEnd DateTime @db.Time() repeatEventTyper String reminderInterval String status Int @default(0) @@ -382,6 +393,8 @@ model DivisionCalendarReminder { idCalendar String dateStart DateTime @db.Date dateEnd DateTime @db.Date + timeStart DateTime @db.Time() + timeEnd DateTime @db.Time() status Int @default(0) isActive Boolean @default(true) createdAt DateTime @default(now()) diff --git a/src/app/(application)/division/[id]/(fitur-division)/task/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/task/page.tsx index f37ddba..45b8f15 100644 --- a/src/app/(application)/division/[id]/(fitur-division)/task/page.tsx +++ b/src/app/(application)/division/[id]/(fitur-division)/task/page.tsx @@ -1,9 +1,12 @@ -import { ViewDivisionTask } from '@/module/division_new'; +import { NavbarDivisionTask, TabsDivisionTask } from '@/module/task'; import React from 'react'; function Page() { return ( - +
+ + +
); } diff --git a/src/app/api/division/route.ts b/src/app/api/division/route.ts index e3a68b1..58f107f 100644 --- a/src/app/api/division/route.ts +++ b/src/app/api/division/route.ts @@ -55,7 +55,6 @@ export async function GET(request: Request) { jumlah_member: v.DivisionMember.length })) - console.log(allData) return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data: allData, }, { status: 200 }); diff --git a/src/app/api/task/route.ts b/src/app/api/task/route.ts new file mode 100644 index 0000000..9b053bd --- /dev/null +++ b/src/app/api/task/route.ts @@ -0,0 +1,79 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import _, { ceil } from "lodash"; +import { NextResponse } from "next/server"; + +// GET ALL DATA TUGAS DIVISI +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 name = searchParams.get('search'); + const divisi = searchParams.get('division'); + const status = searchParams.get('status'); + + const cek = await prisma.division.count({ + where: { + isActive: true, + id: String(divisi) + } + }) + + if (cek == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan", }, { status: 404 }); + } + + const data = await prisma.divisionProject.findMany({ + where: { + isActive: true, + idDivision: String(divisi), + status: (status == "0" || status == "1" || status == "2" || status == "3") ? Number(status) : 0, + title: { + contains: (name == undefined || name == "null") ? "" : name, + mode: "insensitive" + } + }, + select: { + id: true, + title: true, + desc: true, + status: true, + DivisionProjectTask: { + where: { + isActive: true + }, + select: { + title: true + } + }, + DivisionProjectMember: { + where: { + isActive: true + }, + select: { + idUser: true + } + } + } + }); + + const formatData = data.map((v: any) => ({ + ..._.omit(v, ["DivisionProjectTask", "DivisionProjectMember"]), + progress: ceil(v.DivisionProjectTask.filter((i: any) => i.status === 1).length / v.DivisionProjectTask.length), + member: v.DivisionProjectMember.length + })) + + console.log('amalia', formatData) + + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data, }, { 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 }); + } +} \ No newline at end of file diff --git a/src/module/discussion/lib/api_discussion.ts b/src/module/discussion/lib/api_discussion.ts index ca9619c..bffbd08 100644 --- a/src/module/discussion/lib/api_discussion.ts +++ b/src/module/discussion/lib/api_discussion.ts @@ -26,7 +26,6 @@ export const funGetDiscussionById = async (path: string) => { } export const funEditStatusDiscussion = async (path: string, data: IStatusDiscussion) => { - console.log('masuk sini') const response = await fetch(`/api/discussion/${path}`, { method: "DELETE", headers: { diff --git a/src/module/division_new/_division_fitur/task/view/view_division_task.tsx b/src/module/division_new/_division_fitur/task/view/view_division_task.tsx deleted file mode 100644 index 436ffbe..0000000 --- a/src/module/division_new/_division_fitur/task/view/view_division_task.tsx +++ /dev/null @@ -1,14 +0,0 @@ -'use client' -import NavbarDivisionTask from "../component/navbar_division_task"; -import TabsDivisionTask from "../component/tabs_division_task"; - -export default function ViewDivisionTask() { - - - return ( -
- - -
- ); -} \ No newline at end of file diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index 06016c7..341aabf 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -11,7 +11,6 @@ import ViewUpdateDivisionCalender from "./_division_fitur/calender/view/view_upd import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division"; import ViewCreateTaskDivision from "./_division_fitur/task/view/view_create_division_task"; import ViewDetailDivisionTask from "./_division_fitur/task/view/view_detail_division_task"; -import ViewDivisionTask from "./_division_fitur/task/view/view_division_task"; import ViewUpdateProgressDivisionTask from "./_division_fitur/task/view/view_update_progress_division_task"; import CreateAdminDivision from "./ui/create_admin_division"; import CreateUsers from "./ui/create_users"; @@ -31,7 +30,6 @@ import ReportDivisionId from './ui/report_division_id'; export { CreateUsers }; export { CreateAdminDivision }; -export { ViewDivisionTask }; export { ViewDetailDivisionTask }; export { ViewUpdateProgressDivisionTask }; export { ViewDivisionCalender }; diff --git a/src/module/task/index.ts b/src/module/task/index.ts new file mode 100644 index 0000000..31eceb8 --- /dev/null +++ b/src/module/task/index.ts @@ -0,0 +1,5 @@ +import NavbarDivisionTask from "./ui/navbar_division_task"; +import TabsDivisionTask from "./ui/tabs_division_task"; + +export { NavbarDivisionTask } +export { TabsDivisionTask } \ No newline at end of file diff --git a/src/module/task/lib/api_task.ts b/src/module/task/lib/api_task.ts new file mode 100644 index 0000000..59e21ca --- /dev/null +++ b/src/module/task/lib/api_task.ts @@ -0,0 +1,4 @@ +export const funGetAllTask = async (path?: string) => { + const response = await fetch(`/api/task${(path) ? path : ''}`, { next: { tags: ['task'] } }); + return await response.json().catch(() => null); +} \ No newline at end of file diff --git a/src/module/task/lib/type_task.ts b/src/module/task/lib/type_task.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/module/division_new/_division_fitur/task/component/drawer_division_task.tsx b/src/module/task/ui/drawer_division_task.tsx similarity index 100% rename from src/module/division_new/_division_fitur/task/component/drawer_division_task.tsx rename to src/module/task/ui/drawer_division_task.tsx diff --git a/src/module/division_new/_division_fitur/task/component/list_division_task.tsx b/src/module/task/ui/list_division_task.tsx similarity index 100% rename from src/module/division_new/_division_fitur/task/component/list_division_task.tsx rename to src/module/task/ui/list_division_task.tsx diff --git a/src/module/division_new/_division_fitur/task/component/navbar_division_task.tsx b/src/module/task/ui/navbar_division_task.tsx similarity index 100% rename from src/module/division_new/_division_fitur/task/component/navbar_division_task.tsx rename to src/module/task/ui/navbar_division_task.tsx diff --git a/src/module/division_new/_division_fitur/task/component/tabs_division_task.tsx b/src/module/task/ui/tabs_division_task.tsx similarity index 51% rename from src/module/division_new/_division_fitur/task/component/tabs_division_task.tsx rename to src/module/task/ui/tabs_division_task.tsx index 30d18cb..de627df 100644 --- a/src/module/division_new/_division_fitur/task/component/tabs_division_task.tsx +++ b/src/module/task/ui/tabs_division_task.tsx @@ -5,47 +5,37 @@ import { IoCloseCircleOutline } from "react-icons/io5"; import { RiProgress3Line } from "react-icons/ri"; import { TbClockPause } from "react-icons/tb"; import ListDivisionTask from "./list_division_task"; +import { useParams, useSearchParams } from "next/navigation"; export default function TabsDivisionTask() { const iconStyle = { width: rem(20), height: rem(20) }; + const param = useParams<{ id: string }>() + const searchParams = useSearchParams() + const status = searchParams.get('status') return ( - + - }> + }> Segera - }> + }> Dikerjakan - }> + }> Selesai - }> + }> Batal - - - - - - - - - - - - - - - + )