Merge pull request #117 from bipproduction/amalia/15-agustus-24
upd: task
This commit is contained in:
@@ -252,54 +252,63 @@ model DivisionMember {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model DivisionProject {
|
model DivisionProject {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
Division Division @relation(fields: [idDivision], references: [id])
|
Division Division @relation(fields: [idDivision], references: [id])
|
||||||
idDivision String
|
idDivision String
|
||||||
title String
|
title String
|
||||||
desc String @db.Text
|
desc String @db.Text
|
||||||
status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled
|
status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
DivisionProjectTask DivisionProjectTask[]
|
||||||
|
DivisionProjectMember DivisionProjectMember[]
|
||||||
|
DivisionProjectFile DivisionProjectFile[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model DivisionProjectTask {
|
model DivisionProjectTask {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
Division Division @relation(fields: [idDivision], references: [id])
|
Division Division @relation(fields: [idDivision], references: [id])
|
||||||
idDivision String
|
idDivision String
|
||||||
title String
|
DivisionProject DivisionProject @relation(fields: [idProject], references: [id])
|
||||||
desc String @db.Text
|
idProject String
|
||||||
status Int @default(0)
|
title String
|
||||||
dateStart DateTime @db.Date
|
desc String @db.Text
|
||||||
dateEnd DateTime @db.Date
|
status Int @default(0) // 0 = todo, 1 = done
|
||||||
isActive Boolean @default(true)
|
dateStart DateTime @db.Date
|
||||||
createdAt DateTime @default(now())
|
dateEnd DateTime @db.Date
|
||||||
updatedAt DateTime @updatedAt
|
isActive Boolean @default(true)
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
model DivisionProjectMember {
|
model DivisionProjectMember {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
Division Division @relation(fields: [idDivision], references: [id])
|
Division Division @relation(fields: [idDivision], references: [id])
|
||||||
idDivision String
|
idDivision String
|
||||||
User User @relation(fields: [idUser], references: [id])
|
DivisionProject DivisionProject @relation(fields: [idProject], references: [id])
|
||||||
idUser String
|
idProject String
|
||||||
isLeader Boolean @default(false)
|
User User @relation(fields: [idUser], references: [id])
|
||||||
isActive Boolean @default(true)
|
idUser String
|
||||||
createdAt DateTime @default(now())
|
isLeader Boolean @default(false)
|
||||||
updatedAt DateTime @updatedAt
|
isActive Boolean @default(true)
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
model DivisionProjectFile {
|
model DivisionProjectFile {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
Division Division @relation(fields: [idDivision], references: [id])
|
Division Division @relation(fields: [idDivision], references: [id])
|
||||||
idDivision String
|
idDivision String
|
||||||
name String
|
DivisionProject DivisionProject @relation(fields: [idProject], references: [id])
|
||||||
extension String
|
idProject String
|
||||||
isActive Boolean @default(true)
|
name String
|
||||||
User User @relation(fields: [createdBy], references: [id])
|
extension String
|
||||||
createdBy String
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
User User @relation(fields: [createdBy], references: [id])
|
||||||
updatedAt DateTime @updatedAt
|
createdBy String
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
model DivisionDisscussion {
|
model DivisionDisscussion {
|
||||||
@@ -364,6 +373,8 @@ model DivisionCalendar {
|
|||||||
desc String @db.Text
|
desc String @db.Text
|
||||||
dateStart DateTime @db.Date
|
dateStart DateTime @db.Date
|
||||||
dateEnd DateTime @db.Date
|
dateEnd DateTime @db.Date
|
||||||
|
timeStart DateTime @db.Time()
|
||||||
|
timeEnd DateTime @db.Time()
|
||||||
repeatEventTyper String
|
repeatEventTyper String
|
||||||
reminderInterval String
|
reminderInterval String
|
||||||
status Int @default(0)
|
status Int @default(0)
|
||||||
@@ -382,6 +393,8 @@ model DivisionCalendarReminder {
|
|||||||
idCalendar String
|
idCalendar String
|
||||||
dateStart DateTime @db.Date
|
dateStart DateTime @db.Date
|
||||||
dateEnd DateTime @db.Date
|
dateEnd DateTime @db.Date
|
||||||
|
timeStart DateTime @db.Time()
|
||||||
|
timeEnd DateTime @db.Time()
|
||||||
status Int @default(0)
|
status Int @default(0)
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
import { ViewDivisionTask } from '@/module/division_new';
|
import { NavbarDivisionTask, TabsDivisionTask } from '@/module/task';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<ViewDivisionTask />
|
<div>
|
||||||
|
<NavbarDivisionTask />
|
||||||
|
<TabsDivisionTask />
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ export async function GET(request: Request) {
|
|||||||
jumlah_member: v.DivisionMember.length
|
jumlah_member: v.DivisionMember.length
|
||||||
}))
|
}))
|
||||||
|
|
||||||
console.log(allData)
|
|
||||||
|
|
||||||
return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data: allData, }, { status: 200 });
|
return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data: allData, }, { status: 200 });
|
||||||
|
|
||||||
|
|||||||
79
src/app/api/task/route.ts
Normal file
79
src/app/api/task/route.ts
Normal file
@@ -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 });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,7 +26,6 @@ export const funGetDiscussionById = async (path: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const funEditStatusDiscussion = async (path: string, data: IStatusDiscussion) => {
|
export const funEditStatusDiscussion = async (path: string, data: IStatusDiscussion) => {
|
||||||
console.log('masuk sini')
|
|
||||||
const response = await fetch(`/api/discussion/${path}`, {
|
const response = await fetch(`/api/discussion/${path}`, {
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
headers: {
|
headers: {
|
||||||
|
|||||||
@@ -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 (
|
|
||||||
<div>
|
|
||||||
<NavbarDivisionTask />
|
|
||||||
<TabsDivisionTask />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,6 @@ import ViewUpdateDivisionCalender from "./_division_fitur/calender/view/view_upd
|
|||||||
import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division";
|
import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division";
|
||||||
import ViewCreateTaskDivision from "./_division_fitur/task/view/view_create_division_task";
|
import ViewCreateTaskDivision from "./_division_fitur/task/view/view_create_division_task";
|
||||||
import ViewDetailDivisionTask from "./_division_fitur/task/view/view_detail_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 ViewUpdateProgressDivisionTask from "./_division_fitur/task/view/view_update_progress_division_task";
|
||||||
import CreateAdminDivision from "./ui/create_admin_division";
|
import CreateAdminDivision from "./ui/create_admin_division";
|
||||||
import CreateUsers from "./ui/create_users";
|
import CreateUsers from "./ui/create_users";
|
||||||
@@ -31,7 +30,6 @@ import ReportDivisionId from './ui/report_division_id';
|
|||||||
|
|
||||||
export { CreateUsers };
|
export { CreateUsers };
|
||||||
export { CreateAdminDivision };
|
export { CreateAdminDivision };
|
||||||
export { ViewDivisionTask };
|
|
||||||
export { ViewDetailDivisionTask };
|
export { ViewDetailDivisionTask };
|
||||||
export { ViewUpdateProgressDivisionTask };
|
export { ViewUpdateProgressDivisionTask };
|
||||||
export { ViewDivisionCalender };
|
export { ViewDivisionCalender };
|
||||||
|
|||||||
5
src/module/task/index.ts
Normal file
5
src/module/task/index.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import NavbarDivisionTask from "./ui/navbar_division_task";
|
||||||
|
import TabsDivisionTask from "./ui/tabs_division_task";
|
||||||
|
|
||||||
|
export { NavbarDivisionTask }
|
||||||
|
export { TabsDivisionTask }
|
||||||
4
src/module/task/lib/api_task.ts
Normal file
4
src/module/task/lib/api_task.ts
Normal file
@@ -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);
|
||||||
|
}
|
||||||
0
src/module/task/lib/type_task.ts
Normal file
0
src/module/task/lib/type_task.ts
Normal file
@@ -5,47 +5,37 @@ import { IoCloseCircleOutline } from "react-icons/io5";
|
|||||||
import { RiProgress3Line } from "react-icons/ri";
|
import { RiProgress3Line } from "react-icons/ri";
|
||||||
import { TbClockPause } from "react-icons/tb";
|
import { TbClockPause } from "react-icons/tb";
|
||||||
import ListDivisionTask from "./list_division_task";
|
import ListDivisionTask from "./list_division_task";
|
||||||
|
import { useParams, useSearchParams } from "next/navigation";
|
||||||
|
|
||||||
export default function TabsDivisionTask() {
|
export default function TabsDivisionTask() {
|
||||||
const iconStyle = { width: rem(20), height: rem(20) };
|
const iconStyle = { width: rem(20), height: rem(20) };
|
||||||
|
const param = useParams<{ id: string }>()
|
||||||
|
const searchParams = useSearchParams()
|
||||||
|
const status = searchParams.get('status')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box p={20}>
|
<Box p={20}>
|
||||||
<Tabs variant="pills" color='#FF9861' radius="xl" defaultValue="segera">
|
<Tabs variant="pills" color='#FF9861' radius="xl" defaultValue={(status == "1" || status == "2" || status == "3") ? status : "0"}>
|
||||||
<Tabs.List grow bg={"white"} style={{
|
<Tabs.List grow bg={"white"} style={{
|
||||||
border: `1px solid ${"#EDEDED"}`,
|
border: `1px solid ${"#EDEDED"}`,
|
||||||
padding: 5,
|
padding: 5,
|
||||||
borderRadius: 100
|
borderRadius: 100
|
||||||
}}>
|
}}>
|
||||||
<Tabs.Tab value="segera" w={"23%"} leftSection={<TbClockPause style={iconStyle} />}>
|
<Tabs.Tab value="0" w={"23%"} leftSection={<TbClockPause style={iconStyle} />}>
|
||||||
Segera
|
Segera
|
||||||
</Tabs.Tab>
|
</Tabs.Tab>
|
||||||
<Tabs.Tab value="dikerjakan" w={"28%"} leftSection={<RiProgress3Line style={iconStyle} />}>
|
<Tabs.Tab value="1" w={"28%"} leftSection={<RiProgress3Line style={iconStyle} />}>
|
||||||
Dikerjakan
|
Dikerjakan
|
||||||
</Tabs.Tab>
|
</Tabs.Tab>
|
||||||
<Tabs.Tab value="selesai" w={"23%"} leftSection={<IoIosCheckmarkCircleOutline style={iconStyle} />}>
|
<Tabs.Tab value="2" w={"23%"} leftSection={<IoIosCheckmarkCircleOutline style={iconStyle} />}>
|
||||||
Selesai
|
Selesai
|
||||||
</Tabs.Tab>
|
</Tabs.Tab>
|
||||||
<Tabs.Tab value="batal" w={"20%"} leftSection={<IoCloseCircleOutline style={iconStyle} />}>
|
<Tabs.Tab value="3" w={"20%"} leftSection={<IoCloseCircleOutline style={iconStyle} />}>
|
||||||
Batal
|
Batal
|
||||||
</Tabs.Tab>
|
</Tabs.Tab>
|
||||||
</Tabs.List>
|
</Tabs.List>
|
||||||
|
|
||||||
<Tabs.Panel value="segera">
|
<ListDivisionTask status="segera" />
|
||||||
<ListDivisionTask status="segera" />
|
|
||||||
</Tabs.Panel>
|
|
||||||
|
|
||||||
<Tabs.Panel value="dikerjakan">
|
|
||||||
<ListDivisionTask status="dikerjakan" />
|
|
||||||
</Tabs.Panel>
|
|
||||||
|
|
||||||
<Tabs.Panel value="selesai">
|
|
||||||
<ListDivisionTask status="selesai" />
|
|
||||||
</Tabs.Panel>
|
|
||||||
|
|
||||||
<Tabs.Panel value="batal">
|
|
||||||
<ListDivisionTask status="batal" />
|
|
||||||
</Tabs.Panel>
|
|
||||||
</Tabs>
|
</Tabs>
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user