diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 0748a9d..ef686fc 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -166,7 +166,7 @@ model Project {
idVillage String
Group Group @relation(fields: [idGroup], references: [id])
idGroup String
- name String
+ title String
status Int @default(0) // 0 = pending, 1 = ongoing, 2 = done, 3 = cancelled
desc String? @db.Text
reason String? @db.Text
@@ -208,9 +208,9 @@ model ProjectTask {
id String @id @default(cuid())
Project Project @relation(fields: [idProject], references: [id])
idProject String
- name String
+ title String
desc String?
- status Int @default(0) // 0 = pending, 1 = ongoing
+ status Int @default(0) // 0 = todo, 1 = done
dateStart DateTime @db.Date
dateEnd DateTime @db.Date
isActive Boolean @default(true)
diff --git a/src/app/(application)/project/create/page.tsx b/src/app/(application)/project/create/page.tsx
index 41b26fa..3aac089 100644
--- a/src/app/(application)/project/create/page.tsx
+++ b/src/app/(application)/project/create/page.tsx
@@ -1,15 +1,12 @@
-import { CreateUsersProject, ViewCreateProject, ViewDateEndTask, ViewFileSave } from "@/module/project";
+import { CreateProject, ViewFileSave } from "@/module/project";
import React from "react";
function Page({ searchParams }: { searchParams: any }) {
- if (searchParams.page == "task")
- return ;
- if (searchParams.page == "create-users")
- return
+
if (searchParams.page == "file-save")
return
- return ;
+ return ;
}
export default Page;
diff --git a/src/app/api/project/[id]/route.ts b/src/app/api/project/[id]/route.ts
index 589c3e0..f08b29f 100644
--- a/src/app/api/project/[id]/route.ts
+++ b/src/app/api/project/[id]/route.ts
@@ -59,7 +59,7 @@ export async function GET(request: Request, context: { params: { id: string } })
},
select: {
id: true,
- name: true,
+ title: true,
desc: true,
status: true,
dateStart: true,
@@ -159,7 +159,7 @@ export async function POST(request: Request, context: { params: { id: string } }
const dataCreate = await prisma.projectTask.create({
data: {
- name,
+ title: name,
idProject: id,
dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')),
dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')),
@@ -249,7 +249,7 @@ export async function PUT(request: Request, context: { params: { id: string } })
id
},
data: {
- name
+ title: name
}
})
diff --git a/src/app/api/project/detail/[id]/route.ts b/src/app/api/project/detail/[id]/route.ts
index 8ca266e..fb9a956 100644
--- a/src/app/api/project/detail/[id]/route.ts
+++ b/src/app/api/project/detail/[id]/route.ts
@@ -174,7 +174,7 @@ export async function POST(request: Request, context: { params: { id: string } }
id
},
data: {
- name: name,
+ title: name,
dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')),
dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')),
}
diff --git a/src/app/api/project/route.ts b/src/app/api/project/route.ts
index 7464663..994d373 100644
--- a/src/app/api/project/route.ts
+++ b/src/app/api/project/route.ts
@@ -29,7 +29,7 @@ export async function GET(request: Request) {
idVillage: String(villageId),
idGroup: String(groupId),
createdBy: String(userId),
- name: {
+ title: {
contains: (name == undefined || name == "null") ? "" : name,
mode: "insensitive"
},
@@ -37,7 +37,7 @@ export async function GET(request: Request) {
},
select: {
id: true,
- name: true,
+ title: true,
desc: true,
status: true,
ProjectMember: {
@@ -73,16 +73,15 @@ export async function POST(request: Request) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
- const { idVillage, idGroup, name, task, member, file } = (await request.json())
+ const { idGroup, title, task, member, file } = (await request.json())
const userId = user.id
-
+
const data = await prisma.project.create({
data: {
- idVillage: String(idVillage),
+ idVillage: String(user.idVillage),
idGroup: String(idGroup),
- name: name,
- desc: "",
+ title,
createdBy: String(userId)
},
select: {
@@ -94,7 +93,7 @@ export async function POST(request: Request) {
const dataProject = task.map((v: any) => ({
..._.omit(v, ["dateStart", "dateEnd", "name"]),
idProject: data.id,
- name: v.name,
+ title: v.title,
dateStart: new Date(moment(v.dateStart).format('YYYY-MM-DD')),
dateEnd: new Date(moment(v.dateEnd).format('YYYY-MM-DD')),
}))
@@ -109,7 +108,6 @@ export async function POST(request: Request) {
..._.omit(v, ["idUser", "name"]),
idProject: data.id,
idUser: v.idUser,
- name: v.name
}))
const insertMember = await prisma.projectMember.createMany({
@@ -121,31 +119,31 @@ export async function POST(request: Request) {
if (file.length > 0) {
file.map((v: any, index: any) => {
- const f: any = file[index].get('file')
- const fName = f.name
- const fExt = fName.split(".").pop()
- // funUploadFile(fName, f)
-
- const dataFile = {
- name: fName,
- extension: fExt,
- idProject: data.id,
- }
-
- fileFix.push(dataFile)
+ const f: any = file[index].get('file')
+ const fName = f.name
+ const fExt = fName.split(".").pop()
+ // funUploadFile(fName, f)
+
+ const dataFile = {
+ name: fName,
+ extension: fExt,
+ idProject: data.id,
+ }
+
+ fileFix.push(dataFile)
})
-
+
const insertFile = await prisma.divisionProjectFile.createMany({
- data: fileFix
+ data: fileFix
})
-
- }
+
+ }
- return NextResponse.json({ success: true, message: "Berhasil mendapatkan divisi", data: data, }, { status: 200 });
+ return NextResponse.json({ success: true, message: "Berhasil membuat proyek", data: data, }, { status: 200 });
} catch (error) {
console.error(error);
- return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
+ return NextResponse.json({ success: false, message: "Gagal membuat proyek, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}
\ No newline at end of file
diff --git a/src/module/project/components/create_date_end_task.tsx b/src/module/project/components/create_date_end_task.tsx
deleted file mode 100644
index 60392be..0000000
--- a/src/module/project/components/create_date_end_task.tsx
+++ /dev/null
@@ -1,187 +0,0 @@
-"use client";
-import { LayoutNavbarNew, WARNA } from "@/module/_global";
-import {
- Avatar,
- Box,
- Button,
- Flex,
- Group,
- Input,
- SimpleGrid,
- Stack,
- Text,
-} from "@mantine/core";
-import React, { useState } from "react";
-import { DatePicker } from "@mantine/dates";
-import moment from "moment";
-import { IoIosArrowDropright } from "react-icons/io";
-import { useRouter } from "next/navigation";
-
-const dataTugas = [
- {
- id: 1,
- name: "Iqbal Ramadan",
- image: "https://i.pravatar.cc/1000?img=5",
- email: "iqbal.ramadan@gmail.com",
- },
- {
- id: 2,
- name: "Doni Setiawan",
- image: "https://i.pravatar.cc/1000?img=10",
- email: "doni.setiawan@gmail.com",
- },
- {
- id: 3,
- name: "Rangga Agung",
- image: "https://i.pravatar.cc/1000?img=51",
- email: "rangga.agung@gmail.com",
- },
- {
- id: 4,
- name: "Ramadan Sananta",
- image: "https://i.pravatar.cc/1000?img=15",
- email: "ramadan@gmail.com",
- },
- {
- id: 5,
- name: "Imam Baroni",
- image: "https://i.pravatar.cc/1000?img=22",
- email: "imam.baroni@gmail.com",
- },
-];
-
-export default function ViewDateEndTask({ kategori }: { kategori: string }) {
- const [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
- const router = useRouter()
-
- return (
-
-
-
-
-
-
-
-
- Tanggal Mulai
-
- {value[0] ? `${value[0].toLocaleDateString()}` : ""}
-
-
-
- Tanggal Berakhir
-
- {value[1] ? `${value[1].toLocaleDateString()}` : ""}
-
-
-
-
-
- router.push(`/${kategori}/create?page=create-users`)}>
-
- Tambah Anggota
-
-
-
-
-
-
- Anggota Terpilih
- Total 10 Anggota
-
-
-
-
-
- Divisi Kerohanian
-
- {dataTugas.map((v, i) => {
- return (
-
-
-
-
-
- {v.name}
-
-
- {v.email}
-
-
-
-
- Anggota
-
-
- );
- })}
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/module/project/components/create_project.tsx b/src/module/project/components/create_project.tsx
deleted file mode 100644
index 18d6ba0..0000000
--- a/src/module/project/components/create_project.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-"use client";
-import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global";
-import { Box, Button, Center, Flex, Group, Select, Stack, Text, TextInput } from "@mantine/core";
-import { useRouter } from "next/navigation";
-import React, { useState } from "react";
-import { IoIosArrowDropright } from "react-icons/io";
-import { BsFiletypeCsv } from "react-icons/bs";
-import ResultsDateAndTask from "./results_date-and_task";
-import ResultsFile from "./results_file";
-import LayoutModal from "@/module/_global/layout/layout_modal";
-import toast from "react-hot-toast";
-
-export default function CreateProject({ searchParams }: { searchParams: any }) {
- const router = useRouter();
- const [openDrawer, setOpenDrawer] = useState(false);
- const [isModal, setModal] = useState(false)
-
- function onTrue(val: boolean) {
- if (val) {
- toast.success("Sukses! Data tersimpan");
- router.push('/project')
- }
- setModal(false)
- }
-
- return (
-
-
-
-
-
-
- router.push("/project/create?page=task")}>
-
- Tambah Tanggal & Tugas
-
-
-
- setOpenDrawer(true)}
- >
- Upload File
-
-
-
- {
- (searchParams.anggota == 'yes') &&
- <>
-
- >
- }
-
- {(searchParams.files == 'yes') &&
- <>
-
- >
- }
-
- {
- (searchParams.button == 'yes') &&
- <>
-
-
-
- >
- }
-
-
-
-
- setOpenDrawer(false)}
- title={"Pilih File"}
- >
-
- ""}>
-
-
-
-
-
-
- Pilih file
-
- diperangkat
-
- router.push("/project/create?page=file-save")}>
-
-
-
-
-
-
- Pilih file yang
-
- sudah ada
-
-
-
-
- setModal(false)}
- description="Apakah Anda yakin ingin mengubah data?"
- onYes={(val) => { onTrue(val) }} />
-
- );
-}
diff --git a/src/module/project/components/create_users_project.tsx b/src/module/project/components/create_users_project.tsx
deleted file mode 100644
index f996ec5..0000000
--- a/src/module/project/components/create_users_project.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-"use client"
-import { LayoutNavbarNew, WARNA } from "@/module/_global";
-import {
- Anchor,
- Avatar,
- Box,
- Button,
- Checkbox,
- Divider,
- Flex,
- Group,
- Text,
- TextInput,
-} from "@mantine/core";
-import { useRouter } from "next/navigation";
-import React from "react";
-import { HiMagnifyingGlass } from "react-icons/hi2";
-const DateUsers = [
- {
- id: 1,
- name: "Iqbal Ramadan",
- image: "https://i.pravatar.cc/1000?img=5",
- },
- {
- id: 2,
- name: "Doni Setiawan",
- image: "https://i.pravatar.cc/1000?img=10",
- },
- {
- id: 3,
- name: "Rangga Agung",
- image: "https://i.pravatar.cc/1000?img=51",
- },
- {
- id: 4,
- name: "Ramadan Sananta",
- image: "https://i.pravatar.cc/1000?img=15",
- },
- {
- id: 5,
- name: "Imam Baroni",
- image: "https://i.pravatar.cc/1000?img=22",
- },
-];
-
-export default function CreateUsersProject({ kategori }: { kategori: string }) {
- const router = useRouter()
- return (
-
-
-
- }
- placeholder="Pencarian"
- />
-
-
- Pilih Semua Divisi
-
-
-
-
-
- Divisi Kerohanian
-
- Pilih Semua
-
-
- {DateUsers.map((v, i) => {
- return (
-
-
-
-
-
- {v.name}
-
-
-
-
-
-
- );
- })}
-
-
-
-
-
-
- );
-}
diff --git a/src/module/project/components/detail_project/detail_project.tsx b/src/module/project/components/detail_project/detail_project.tsx
index eda087d..aabd533 100644
--- a/src/module/project/components/detail_project/detail_project.tsx
+++ b/src/module/project/components/detail_project/detail_project.tsx
@@ -16,8 +16,8 @@ import {
import React from "react";
import { HiMiniPresentationChartBar } from "react-icons/hi2";
import { IoIosArrowDropright } from "react-icons/io";
-import ResultsDateAndTask from "../results_date-and_task";
-import ResultsFile from "../results_file";
+import ResultsDateAndTask from "../../ui/results_date-and_task";
+import ResultsFile from "../../ui/results_file";
import { AiOutlineFileSync } from "react-icons/ai";
import { useRouter } from "next/navigation";
import { LuClipboardEdit } from "react-icons/lu";
@@ -181,7 +181,7 @@ export default function DetailProject() {
-
+ {/* */}
Anggota Terpilih
diff --git a/src/module/project/components/results_file.tsx b/src/module/project/components/results_file.tsx
deleted file mode 100644
index 1a3c0d3..0000000
--- a/src/module/project/components/results_file.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { WARNA } from '@/module/_global';
-import { Box, Group, Text } from '@mantine/core';
-import React from 'react';
-import { BsFiletypeCsv } from 'react-icons/bs';
-
-export default function ResultsFile() {
- return (
-
- File
-
-
-
-
- Proyek Laporan Permasyarakatan
-
-
-
-
-
- Proyek Laporan Permasyarakatan
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/src/module/project/index.ts b/src/module/project/index.ts
index a7c48ee..da4b362 100644
--- a/src/module/project/index.ts
+++ b/src/module/project/index.ts
@@ -1,7 +1,6 @@
-import ViewCreateProject from "./view/view_create_project";
-import ViewDateEndTask from "./components/create_date_end_task";
+import ViewDateEndTask from "./ui/create_date_end_task";
import ViewProject from "./view/view_project";
-import CreateUsersProject from "./components/create_users_project";
+import CreateUsersProject from "./ui/create_users_project";
import ViewFileSave from "./view/view_file_save";
import ViewDetailProject from "./view/view_detail_project";
import ViewUpdateProgres from "./view/view_update_progres";
@@ -21,9 +20,9 @@ import ListAnggotaDetailProject from "./ui/list_anggota_detail_project";
import AddDetailTaskProject from "./ui/add_detail_task_project";
import CancelProject from "./ui/cancel_project";
import AddMemberDetailProject from "./ui/add_member_detail_project";
+import CreateProject from "./ui/create_project";
export { ViewProject }
-export { ViewCreateProject }
export { ViewDateEndTask }
export { CreateUsersProject }
export { ViewFileSave }
@@ -43,4 +42,5 @@ export { EditTaskProject }
export { EditDetailTaskProject }
export { AddDetailTaskProject }
export { CancelProject }
-export { AddMemberDetailProject }
\ No newline at end of file
+export { AddMemberDetailProject }
+export { CreateProject }
\ No newline at end of file
diff --git a/src/module/project/lib/api_project.ts b/src/module/project/lib/api_project.ts
index 5e2fdfa..37dde08 100644
--- a/src/module/project/lib/api_project.ts
+++ b/src/module/project/lib/api_project.ts
@@ -7,6 +7,9 @@ export const funGetAllProject = async (path?: string) => {
}
export const funCreateProject = async (data: IFormProject) => {
+ if (data.title.length < 3)
+ return { success: false, message: 'Nama proyek minimal 3 karakter' }
+
const response = await fetch(`/api/project`, {
method: "POST",
headers: {
diff --git a/src/module/project/lib/type_project.ts b/src/module/project/lib/type_project.ts
index 2aa360c..0492b5a 100644
--- a/src/module/project/lib/type_project.ts
+++ b/src/module/project/lib/type_project.ts
@@ -1,6 +1,6 @@
export interface IDataProject {
id: string
- name: string
+ title: string
desc: string
status: number
member: number
@@ -29,8 +29,8 @@ export interface IDataMemberProject {
}
export interface IFormProject {
- idDivision: string,
- name: string,
+ title: string,
+ idGroup: string,
task: IFormDateProject[] | [],
member: IFormMemberProject[] | [],
file: FormData[] | []
@@ -39,7 +39,7 @@ export interface IFormProject {
export interface IFormDateProject {
dateStart: Date,
dateEnd: Date,
- name: string,
+ title: string,
}
export interface IFormMemberProject {
@@ -64,4 +64,9 @@ export interface IDataMemberProjectDetail {
idUser: string,
isLeader: string,
name: string
+}
+
+export interface IListFileTaskProject {
+ name: string,
+ extension: string
}
\ No newline at end of file
diff --git a/src/module/project/lib/val_project.ts b/src/module/project/lib/val_project.ts
index bc014c2..1566b5b 100644
--- a/src/module/project/lib/val_project.ts
+++ b/src/module/project/lib/val_project.ts
@@ -1,6 +1,8 @@
import { hookstate } from "@hookstate/core";
+import { IFormMemberProject } from "./type_project";
export const globalRefreshProject = hookstate(false)
+export const globalMemberProject = hookstate([]);
export const valStatusDetailProject = [
{
diff --git a/src/module/project/ui/create_date_end_task.tsx b/src/module/project/ui/create_date_end_task.tsx
new file mode 100644
index 0000000..2681de9
--- /dev/null
+++ b/src/module/project/ui/create_date_end_task.tsx
@@ -0,0 +1,116 @@
+"use client";
+import { LayoutNavbarNew, WARNA } from "@/module/_global";
+import {
+ Avatar,
+ Box,
+ Button,
+ Flex,
+ Group,
+ Input,
+ SimpleGrid,
+ Stack,
+ Text,
+} from "@mantine/core";
+import React, { useState } from "react";
+import { DatePicker } from "@mantine/dates";
+import { useRouter } from "next/navigation";
+import toast from "react-hot-toast";
+import moment from "moment";
+import { IFormDateProject } from "../lib/type_project";
+
+
+export default function ViewDateEndTask({ onClose }: { onClose: (val: IFormDateProject) => void }) {
+ const [value, setValue] = useState<[Date | null, Date | null]>([null, null]);
+ const router = useRouter()
+ const [title, setTitle] = useState("")
+
+ function onSubmit() {
+ if (value[0] == null || value[1] == null)
+ return toast.error("Error! harus memilih tanggal")
+
+ if (title == "")
+ return toast.error("Error! harus memasukkan judul tugas")
+
+ onClose(
+ {
+ dateStart: value[0],
+ dateEnd: value[1],
+ title: title
+ }
+ )
+
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ Tanggal Mulai
+
+ {value[0] ? `${moment(value[0]).format('DD-MM-YYYY')}` : ""}
+
+
+
+ Tanggal Berakhir
+
+ {value[1] ? `${moment(value[1]).format('DD-MM-YYYY')}` : ""}
+
+
+
+
+ setTitle(e.target.value)}
+ />
+
+
+
+
+
+
+ );
+}
diff --git a/src/module/project/ui/create_project.tsx b/src/module/project/ui/create_project.tsx
new file mode 100644
index 0000000..7094d3d
--- /dev/null
+++ b/src/module/project/ui/create_project.tsx
@@ -0,0 +1,416 @@
+"use client";
+import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global";
+import { Avatar, Box, Button, Center, Flex, Group, Select, SimpleGrid, Stack, Text, TextInput } from "@mantine/core";
+import { useRouter, useSearchParams } from "next/navigation";
+import React, { useRef, useState } from "react";
+import { IoIosArrowDropright } from "react-icons/io";
+import { BsFiletypeCsv } from "react-icons/bs";
+import ResultsDateAndTask from "./results_date-and_task";
+import ResultsFile from "./results_file";
+import LayoutModal from "@/module/_global/layout/layout_modal";
+import toast from "react-hot-toast";
+import { funGetAllGroup, IDataGroup } from "@/module/group";
+import { funGetUserByCookies } from "@/module/auth";
+import { useShallowEffect } from "@mantine/hooks";
+import { useHookstate } from "@hookstate/core";
+import { globalMemberProject } from "../lib/val_project";
+import ViewDateEndTask from "./create_date_end_task";
+import { IFormDateProject, IFormMemberProject, IListFileTaskProject } from "../lib/type_project";
+import CreateUsersProject from "./create_users_project";
+import { FaTrash } from "react-icons/fa6";
+import { Dropzone } from "@mantine/dropzone";
+import _ from "lodash";
+import { funCreateProject } from "../lib/api_project";
+
+export default function CreateProject() {
+ const router = useRouter();
+ const [openDrawer, setOpenDrawer] = useState(false)
+ const [openDrawerFile, setOpenDrawerFile] = useState(false)
+ const [openDrawerTask, setOpenDrawerTask] = useState(false)
+ const [isModal, setModal] = useState(false)
+ const [dataGroup, setDataGroup] = useState([]);
+ const [roleUser, setRoleUser] = useState("")
+ const [isChooseAnggota, setChooseAnggota] = useState(false)
+ const member = useHookstate(globalMemberProject)
+ const memberValue = member.get() as IFormMemberProject[]
+ const [openTugas, setOpenTugas] = useState(false)
+ const [dataTask, setDataTask] = useState([])
+ const openRef = useRef<() => void>(null)
+ const [fileForm, setFileForm] = useState([])
+ const [listFile, setListFile] = useState([])
+ const [indexDelFile, setIndexDelFile] = useState(0)
+ const [indexDelTask, setIndexDelTask] = useState(0)
+ const [body, setBody] = useState({
+ idGroup: "",
+ title: "",
+ desc: "",
+ });
+
+ function deleteFile(index: number) {
+ setListFile([...listFile.filter((val, i) => i !== index)])
+ setFileForm([...fileForm.filter((val, i) => i !== index)])
+ setOpenDrawerFile(false)
+ }
+
+ function deleteTask(index: number) {
+ setDataTask([...dataTask.filter((val, i) => i !== index)])
+ setOpenDrawerTask(false)
+ }
+
+ async function loadData() {
+ const loadGroup = await funGetAllGroup('?active=true')
+ if (loadGroup.success) {
+ setDataGroup(loadGroup.data);
+ } else {
+ toast.error(loadGroup.message);
+ }
+
+ const loadUser = await funGetUserByCookies();
+ setRoleUser(loadUser.idUserRole)
+ }
+
+ function onToChooseAnggota() {
+ if (roleUser == "supadmin" && body.idGroup == "")
+ return toast.error("Error! grup harus diisi")
+ setChooseAnggota(true)
+ }
+
+ function onChooseGroup(val: any) {
+ member.set([])
+ setBody({ ...body, idGroup: val })
+ }
+
+ useShallowEffect(() => {
+ loadData();
+ }, []);
+
+
+ async function onSubmit() {
+ try {
+ const response = await funCreateProject({ title: body.title, idGroup: body.idGroup, task: dataTask, file: fileForm, member: memberValue })
+
+ if (response.success) {
+ toast.success(response.message)
+ setBody({
+ idGroup: "",
+ title: "",
+ desc: "",
+ })
+ member.set([])
+ setFileForm([])
+ setListFile([])
+ setDataTask([])
+ } else {
+ toast.error(response.message)
+ }
+ } catch (error) {
+ console.log(error)
+ toast.error("Gagal menambahkan tugas divisi, coba lagi nanti");
+ }
+ }
+
+
+
+ if (openTugas) return {
+ setDataTask([...dataTask, val])
+ setOpenTugas(false)
+ }} />;
+
+ if (isChooseAnggota) return { setChooseAnggota(false) }} />
+
+
+ return (
+
+
+
+
+ {
+ (roleUser == "supadmin") && (
+
+ {
+ dataTask.length > 0 &&
+
+ Tanggal & Tugas
+ {
+ dataTask.map((v, i) => {
+ return (
+ {
+ setIndexDelTask(i)
+ setOpenDrawerTask(true)
+ }}>
+
+
+ )
+ })
+ }
+
+ }
+
+ {
+ listFile.length > 0 &&
+
+ File
+
+ {
+ listFile.map((v, i) => {
+ return (
+ {
+ setIndexDelFile(i)
+ setOpenDrawerFile(true)
+ }}>
+
+
+ )
+ })
+ }
+
+
+ }
+
+ {
+ member.length > 0 &&
+
+
+ Anggota Terpilih
+ Total {member.length} Anggota
+
+
+
+
+ {member.get().map((v: any, i: any) => {
+ return (
+
+
+
+
+
+ {v.name}
+
+
+
+
+ Anggota
+
+
+ );
+ })}
+
+
+
+
+ }
+
+
+
+
+
+
+
+
+ {/* Drawer pilih file */}
+ setOpenDrawer(false)}
+ title={"Pilih File"}
+ >
+
+ {
+ if (!files || _.isEmpty(files))
+ return toast.error('Tidak ada file yang dipilih')
+ const fd = new FormData();
+ fd.append("file", files[0]);
+ setFileForm([...fileForm, fd])
+ 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
+
+
+ router.push("/project/create?page=file-save")}>
+
+
+
+
+
+
+ Pilih file yang
+
+ sudah ada
+
+
+
+
+
+
+ {/* Drawer hapus file */}
+ setOpenDrawerFile(false)}
+ title={""}
+ >
+
+
+ deleteFile(indexDelFile)}>
+
+
+
+
+ Hapus File
+
+
+
+
+
+
+
+ {/* Drawer hapus tugas */}
+ setOpenDrawerTask(false)}
+ title={""}
+ >
+
+
+ deleteTask(indexDelTask)}>
+
+
+
+
+ Hapus Tugas
+
+
+
+
+
+
+
+ setModal(false)}
+ description="Apakah Anda yakin ingin menambahkan data?"
+ onYes={(val) => {
+ if (val) {
+ onSubmit()
+ }
+ setModal(false)
+ }} />
+
+ );
+}
diff --git a/src/module/project/ui/create_users_project.tsx b/src/module/project/ui/create_users_project.tsx
new file mode 100644
index 0000000..113b241
--- /dev/null
+++ b/src/module/project/ui/create_users_project.tsx
@@ -0,0 +1,146 @@
+"use client"
+import { LayoutNavbarNew, WARNA } from '@/module/_global';
+import { useHookstate } from '@hookstate/core';
+import { Avatar, Box, Button, Center, Input, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import { useRouter } from 'next/navigation';
+import React, { useState } from 'react';
+import { HiMagnifyingGlass } from 'react-icons/hi2';
+import { funGetAllmember, TypeUser } from '@/module/user';
+import { funGetUserByCookies } from '@/module/auth';
+import toast from 'react-hot-toast';
+import { globalMemberProject } from '../lib/val_project';
+
+
+export default function CreateUsersProject({ grup, onClose }: { grup?: string, onClose: (val: any) => void }) {
+ const router = useRouter()
+ const member = useHookstate(globalMemberProject)
+ const [selectedFiles, setSelectedFiles] = useState([]);
+ const [dataMember, setDataMember] = useState([])
+ const [loading, setLoading] = useState(true)
+ const [openTugas, setOpenTugas] = useState(false)
+
+ const handleFileClick = (index: number) => {
+ if (selectedFiles.some((i: any) => i.idUser == dataMember[index].id)) {
+ setSelectedFiles(selectedFiles.filter((i: any) => i.idUser != dataMember[index].id))
+ } else {
+ setSelectedFiles([...selectedFiles, { idUser: dataMember[index].id, name: dataMember[index].name }])
+ }
+ };
+
+
+ async function loadData(search: string) {
+ setLoading(true)
+ const res = await funGetAllmember('?active=true&group=' + grup + '&search=' + search);
+ const user = await funGetUserByCookies();
+
+ if (res.success) {
+ setDataMember(res.data.filter((i: any) => i.id != user.id))
+
+ // cek data member sebelumnya
+ if (member.length > 0) {
+ setSelectedFiles(JSON.parse(JSON.stringify(member.get())))
+ }
+ } else {
+ toast.error(res.message)
+ }
+ setLoading(false)
+ }
+
+
+ function onSubmit() {
+ if (selectedFiles.length == 0) {
+ return toast.error("Error! silahkan pilih anggota")
+ }
+ member.set(selectedFiles)
+ onClose(true)
+ }
+
+ useShallowEffect(() => {
+ loadData("")
+ }, []);
+
+ return (
+
+
+
+
+ }
+ placeholder="Pencarian"
+ onChange={(e) => loadData(e.target.value)}
+ />
+
+ {loading ?
+
+ {Array(6)
+ .fill(null)
+ .map((_, i) => (
+
+
+
+ ))}
+
+ :
+
+ {dataMember.map((v, index) => {
+ const isSelected = selectedFiles.some((i: any) => i.idUser == dataMember[index].id);
+ return (
+
+ handleFileClick(index)}
+ >
+
+
+
+
+ {v.name}
+
+
+
+ );
+ })}
+
+ }
+
+
+
+
+
+
+
+ );
+}
+
diff --git a/src/module/project/ui/edit_detail_task_project.tsx b/src/module/project/ui/edit_detail_task_project.tsx
index ceadc09..25a1ef1 100644
--- a/src/module/project/ui/edit_detail_task_project.tsx
+++ b/src/module/project/ui/edit_detail_task_project.tsx
@@ -25,7 +25,7 @@ export default function EditDetailTaskProject() {
try {
const res = await funEditDetailProject(param.id, {
- name: name,
+ title: name,
dateStart: value[0],
dateEnd: value[1],
diff --git a/src/module/project/ui/list_project.tsx b/src/module/project/ui/list_project.tsx
index f0569dd..faef45a 100644
--- a/src/module/project/ui/list_project.tsx
+++ b/src/module/project/ui/list_project.tsx
@@ -110,7 +110,7 @@ export default function ListProject() {
- {v.name}
+ {v.title}
- {v.name}
+ {v.title}
diff --git a/src/module/project/components/results_date-and_task.tsx b/src/module/project/ui/results_date-and_task.tsx
similarity index 78%
rename from src/module/project/components/results_date-and_task.tsx
rename to src/module/project/ui/results_date-and_task.tsx
index 619b2fc..e7025e6 100644
--- a/src/module/project/components/results_date-and_task.tsx
+++ b/src/module/project/ui/results_date-and_task.tsx
@@ -2,11 +2,12 @@ import { WARNA } from '@/module/_global';
import { Box, Group, SimpleGrid, Text } from '@mantine/core';
import React from 'react';
import { AiOutlineFileSync } from "react-icons/ai";
+import { IFormDateProject } from '../lib/type_project';
+import moment from 'moment';
-export default function ResultsDateAndTask() {
+export default function ResultsDateAndTask(data: IFormDateProject) {
return (
-
- Tanggal & Tugas
+
- Proyek Laporan Permasyarakatan
+ {data.title}
@@ -32,7 +33,7 @@ export default function ResultsDateAndTask() {
h={45}
style={{ borderRadius: 10, border: `1px solid ${"#D6D8F6"}` }}
>
- 16 Juni 2024
+ {moment(data.dateStart).format('DD-MM-YYYY')}
@@ -43,7 +44,7 @@ export default function ResultsDateAndTask() {
h={45}
style={{ borderRadius: 10, border: `1px solid ${"#D6D8F6"}` }}
>
- 20 Juni 2024
+ {moment(data.dateEnd).format('DD-MM-YYYY')}
diff --git a/src/module/project/ui/results_file.tsx b/src/module/project/ui/results_file.tsx
new file mode 100644
index 0000000..099b512
--- /dev/null
+++ b/src/module/project/ui/results_file.tsx
@@ -0,0 +1,24 @@
+import { WARNA } from '@/module/_global';
+import { Box, Group, Text } from '@mantine/core';
+import React from 'react';
+import { BsFiletypeCsv, BsFiletypeHeic, BsFiletypeJpg, BsFiletypePdf, BsFiletypePng } from 'react-icons/bs';
+import { IListFileTaskProject } from '../lib/type_project';
+
+export default function ResultsFile({ name, extension }: IListFileTaskProject) {
+ return (
+
+
+ {extension == "pdf" && }
+ {extension == "csv" && }
+ {extension == "png" && }
+ {extension == "jpg" || extension == "jpeg" && }
+ {extension == "heic" && }
+ {name}
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/module/project/view/view_create_project.tsx b/src/module/project/view/view_create_project.tsx
deleted file mode 100644
index 380c5b8..0000000
--- a/src/module/project/view/view_create_project.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import CreateProject from '../components/create_project';
-
-export default function ViewCreateProject({ searchParams }: { searchParams: any }) {
- return (
-
- );
-}
-