- {JSON.stringify(isData, null, 1)}
- {JSON.stringify(isDataMember, null, 1)}
{/* 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..984f3d3 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],
@@ -46,7 +46,7 @@ export default function EditDetailTaskProject() {
try {
const res = await funGetDetailProject(param.id);
if (res.success) {
- setName(res.data.name)
+ setName(res.data.title)
setValue([
new Date(moment(res.data.dateStart).format('YYYY-MM-DD')),
new Date(moment(res.data.dateEnd).format('YYYY-MM-DD')),
diff --git a/src/module/project/ui/edit_task_project.tsx b/src/module/project/ui/edit_task_project.tsx
index db98f70..cc981a8 100644
--- a/src/module/project/ui/edit_task_project.tsx
+++ b/src/module/project/ui/edit_task_project.tsx
@@ -40,7 +40,7 @@ export default function EditTaskProject() {
try {
const res = await funGetOneProjectById(param.id, 'data');
if (res.success) {
- setName(res.data.name);
+ setName(res.data.title);
} else {
toast.error(res.message);
}
@@ -57,7 +57,7 @@ export default function EditTaskProject() {
return (
-
+
- {v.name}
+ {v.title}