diff --git a/src/app/api/task/[id]/route.ts b/src/app/api/task/[id]/route.ts index 1ae287f..6dc4e93 100644 --- a/src/app/api/task/[id]/route.ts +++ b/src/app/api/task/[id]/route.ts @@ -72,8 +72,8 @@ export async function GET(request: Request, context: { params: { id: string } }) const fix = dataProgress.map((v: any) => ({ ..._.omit(v, ["dateStart", "dateEnd"]), - dateStart: moment(v.dateStart).format("DD MMMM YYYY"), - dateEnd: moment(v.dateEnd).format("DD MMMM YYYY"), + dateStart: moment(v.dateStart).format("DD-MM-YYYY"), + dateEnd: moment(v.dateEnd).format("DD-MM-YYYY"), })) allData = fix diff --git a/src/module/division_new/ui/list_discussion.tsx b/src/module/division_new/ui/list_discussion.tsx index 9f7b45c..7f25a2c 100644 --- a/src/module/division_new/ui/list_discussion.tsx +++ b/src/module/division_new/ui/list_discussion.tsx @@ -19,6 +19,7 @@ export default function ListDiscussionOnDetailDivision() { const [loading, setLoading] = useState(true); const isMobile = useMediaQuery('(max-width: 399px)'); const tema = useHookstate(TEMA) + const isMobile2 = useMediaQuery("(max-width: 438px)"); async function fetchData() { try { @@ -81,23 +82,40 @@ export default function ListDiscussionOnDetailDivision() { return ( router.push(`${param.id}/discussion/${v.id}`)} > - - - - + + + + + + {v.desc} - - + + setTouched({ ...touched, title: true })} error={ touched.title && ( - title == "" ? "Tahapan Tidak Boleh Kosong" : null + title == "" ? "Judul Tahapan Tidak Boleh Kosong" : null ) } /> diff --git a/src/module/task/ui/add_member_detail_task.tsx b/src/module/task/ui/add_member_detail_task.tsx index bdd3a28..2b812c5 100644 --- a/src/module/task/ui/add_member_detail_task.tsx +++ b/src/module/task/ui/add_member_detail_task.tsx @@ -1,5 +1,5 @@ "use client" -import { LayoutNavbarNew, SkeletonSingle, TEMA } from "@/module/_global"; +import { LayoutNavbarNew, SkeletonList, SkeletonSingle, TEMA } from "@/module/_global"; import { funGetDivisionById, funGetSearchMemberDivision, IDataMemberDivision } from "@/module/division_new"; import { ActionIcon, @@ -19,7 +19,7 @@ import { Text, TextInput, } from "@mantine/core"; -import { useShallowEffect } from "@mantine/hooks"; +import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import { useParams, useRouter } from "next/navigation"; import React, { useState } from "react"; import toast from "react-hot-toast"; @@ -44,6 +44,7 @@ export default function AddMemberDetailTask() { const [onClickSearch, setOnClickSearch] = useState(false) const [searchQuery, setSearchQuery] = useState('') const tema = useHookstate(TEMA) + const isMobile2 = useMediaQuery("(max-width: 438px)"); async function getData() { @@ -211,7 +212,7 @@ export default function AddMemberDetailTask() { borderBottom: `1px solid ${"#E0DFDF"}` }}> {selectedFiles.length > 0 ? ( - + {selectedFiles.map((v: any, i: any) => { return ( @@ -255,43 +256,56 @@ export default function AddMemberDetailTask() { .fill(null) .map((_, i) => ( - + )) : - - {isData.map((v, i) => { - const isSelected = selectedFiles.some((i: any) => i?.idUser == v.idUser); - const found = isDataMember.some((i: any) => i.idUser == v.idUser) - return ( - (!found) ? handleFileClick(i) : null}> - - - - - - - - {v.name} - {(found) ? "sudah menjadi anggota" : ""} + (isData.length === 0) ? + + Tidak ada anggota + + : + + {isData.map((v, i) => { + const isSelected = selectedFiles.some((i: any) => i?.idUser == v.idUser); + const found = isDataMember.some((i: any) => i.idUser == v.idUser) + return ( + (!found) ? handleFileClick(i) : null}> + + + + + + + + {v.name} + {(found) ? "sudah menjadi anggota" : ""} + + {isSelected ? : null} - {isSelected ? : null} - - - - - + + + + + - - ); - })} - + ); + })} + } - } title={"Tanggal Tugas"} menu /> + } title={"Tanggal dan Tugas"} menu /> setTouched({ ...touched, title: true })} - error={touched.title && title == "" ? "Judul Tugas Tidak Boleh Kosong" : null} + error={touched.title && title == "" ? "Judul Tahapan Tidak Boleh Kosong" : null} /> diff --git a/src/module/task/ui/create_task.tsx b/src/module/task/ui/create_task.tsx index a981570..2c6b186 100644 --- a/src/module/task/ui/create_task.tsx +++ b/src/module/task/ui/create_task.tsx @@ -113,7 +113,7 @@ export default function CreateTask() { borderRadius: 10, }, }} - placeholder="Nama Tugas" + placeholder="Judul Tugas" size="md" label="Judul Tugas" value={title} @@ -125,7 +125,7 @@ export default function CreateTask() { required error={ touched.title && ( - title == "" ? "Nama Tidak Boleh Kosong" : null + title == "" ? "Judul Tugas Tidak Boleh Kosong" : null ) } /> diff --git a/src/module/task/ui/create_users_project.tsx b/src/module/task/ui/create_users_project.tsx index afd1c67..ab44a50 100644 --- a/src/module/task/ui/create_users_project.tsx +++ b/src/module/task/ui/create_users_project.tsx @@ -1,5 +1,5 @@ "use client" -import { LayoutNavbarNew, SkeletonSingle, TEMA } from "@/module/_global"; +import { LayoutNavbarNew, SkeletonList, SkeletonSingle, TEMA } from "@/module/_global"; import { funGetDivisionById, funGetSearchMemberDivision, IDataMemberDivision } from "@/module/division_new"; import { useHookstate } from "@hookstate/core"; import { @@ -15,10 +15,11 @@ import { Indicator, rem, Skeleton, + Stack, Text, TextInput, } from "@mantine/core"; -import { useShallowEffect } from "@mantine/hooks"; +import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import { useParams, useRouter } from "next/navigation"; import React, { useState } from "react"; import toast from "react-hot-toast"; @@ -41,6 +42,7 @@ export default function CreateUsersProject({ onClose }: { onClose: (val: any) => const [onClickSearch, setOnClickSearch] = useState(false) const [searchQuery, setSearchQuery] = useState('') const tema = useHookstate(TEMA) + const isMobile2 = useMediaQuery("(max-width: 438px)"); async function getData() { @@ -192,7 +194,7 @@ export default function CreateUsersProject({ onClose }: { onClose: (val: any) => borderBottom: `1px solid ${"#E0DFDF"}` }}> {selectedFiles.length > 0 ? ( - + {selectedFiles.map((v: any, i: any) => { return ( @@ -242,28 +244,41 @@ export default function CreateUsersProject({ onClose }: { onClose: (val: any) => .fill(null) .map((_, i) => ( - + )) : + (isData.length === 0) ? + + Tidak ada anggota + + : isData.map((v, i) => { const isSelected = selectedFiles.some((i: any) => i?.idUser == v.idUser); return ( handleFileClick(i)}> - {v.name} + {v.name} {isSelected ? : null} diff --git a/src/module/task/ui/detail_list_anggota_task.tsx b/src/module/task/ui/detail_list_anggota_task.tsx index 4f1dc8e..1841852 100644 --- a/src/module/task/ui/detail_list_anggota_task.tsx +++ b/src/module/task/ui/detail_list_anggota_task.tsx @@ -26,6 +26,26 @@ export default function ListAnggotaDetailTask() { const adminLogin = useHookstate(globalIsAdminDivision) const isMobile = useMediaQuery('(max-width: 369px)'); const tema = useHookstate(TEMA) + const [reason, setReason] = useState("") + + async function getOneDataCancel() { + try { + const res = await funGetTaskDivisionById(param.detail, 'data'); + if (res.success) { + setReason(res.data.reason); + } else { + toast.error(res.message); + } + + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan data tugas divisi, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getOneDataCancel(); + }, [param.detail]) async function getOneData() { try { @@ -101,7 +121,9 @@ export default function ListAnggotaDetailTask() { { setDataChoose({ id: v.idUser, name: v.name }) + reason == null ? setOpenDrawer(true) + : setOpenDrawer(false) }} > diff --git a/src/module/task/ui/detail_list_file_task.tsx b/src/module/task/ui/detail_list_file_task.tsx index 8947058..d8d4c9f 100644 --- a/src/module/task/ui/detail_list_file_task.tsx +++ b/src/module/task/ui/detail_list_file_task.tsx @@ -25,6 +25,26 @@ export default function ListFileDetailTask() { const [isOpenModalView, setOpenModalView] = useState(false) const [isExtension, setExtension] = useState('') const tema = useHookstate(TEMA) + const [reason, setReason] = useState("") + + async function getOneDataCancel() { + try { + const res = await funGetTaskDivisionById(param.detail, 'data'); + if (res.success) { + setReason(res.data.reason); + } else { + toast.error(res.message); + } + + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan data tugas divisi, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getOneDataCancel(); + }, [param.detail]) async function getOneData() { try { @@ -116,12 +136,13 @@ export default function ListFileDetailTask() { {item.extension == "pdf" && } {item.extension == "csv" && } {item.extension == "png" && } - {(item.extension == "jpg" || item.extension == "jpeg") && } + {item.extension == "jpg" && } + {item.extension == "jpeg" && } {item.extension == "heic" && } - {item.name + '.' + item.extension} + {item.name + '.' + item.extension} @@ -149,12 +170,16 @@ export default function ListFileDetailTask() { - { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} > + { + reason == null ? + setOpenModal(true) + : setOpenModal(false) + }} justify={'center'} align={'center'} direction={'column'} > - + - Hapus file + Hapus file diff --git a/src/module/task/ui/detail_list_tugas_task.tsx b/src/module/task/ui/detail_list_tugas_task.tsx index 8cf32d7..09c2419 100644 --- a/src/module/task/ui/detail_list_tugas_task.tsx +++ b/src/module/task/ui/detail_list_tugas_task.tsx @@ -26,6 +26,27 @@ export default function ListTugasDetailTask() { const router = useRouter() const refresh = useHookstate(globalRefreshTask) const tema = useHookstate(TEMA) + const [reason, setReason] = useState("") + + async function getOneDataCancel() { + try { + const res = await funGetTaskDivisionById(param.detail, 'data'); + if (res.success) { + setReason(res.data.reason); + } else { + toast.error(res.message); + } + + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan data tugas divisi, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getOneDataCancel(); + }, [param.detail]) + async function getOneData() { try { setLoading(true) @@ -97,13 +118,16 @@ export default function ListTugasDetailTask() { style={{ borderRadius: 10, border: `1px solid ${"#D6D8F6"}`, - padding: 20, }} + pl={20} + pr={20} > { loading ? <> - + + + : isData.length === 0 ? Tidak ada tugas : @@ -113,8 +137,10 @@ export default function ListTugasDetailTask() { { setIdData(item.id) setStatusData(item.status) - setOpenDrawer(true) - }}> + reason == null ? + setOpenDrawer(true) + : setOpenDrawer(false) + }} my={18}> @@ -137,7 +163,7 @@ export default function ListTugasDetailTask() { - + Tanggal Mulai - + ) }) @@ -179,10 +205,10 @@ export default function ListTugasDetailTask() { style={{ alignContent: 'flex-start', alignItems: 'flex-start', - }} + }} > { setOpenDrawerStatus(true) }} justify={'center'} align={'center'} direction={'column'} - pb={20} + pb={20} > diff --git a/src/module/task/ui/detail_progress_task.tsx b/src/module/task/ui/detail_progress_task.tsx index f7c1e6d..f200f7f 100644 --- a/src/module/task/ui/detail_progress_task.tsx +++ b/src/module/task/ui/detail_progress_task.tsx @@ -1,6 +1,6 @@ 'use client' import { TEMA } from "@/module/_global"; -import { Box, Grid, ActionIcon, Progress, Text, Skeleton } from "@mantine/core"; +import { Box, Grid, ActionIcon, Progress, Text, Skeleton, Group } from "@mantine/core"; import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import { useParams } from "next/navigation"; import toast from "react-hot-toast"; @@ -9,6 +9,7 @@ import { funGetTaskDivisionById } from "../lib/api_task"; import { useState } from "react"; import { globalRefreshTask } from "../lib/val_task"; import { useHookstate } from "@hookstate/core"; +import { IoIosWarning } from "react-icons/io"; export default function ProgressDetailTask() { const [valProgress, setValProgress] = useState(0) @@ -16,8 +17,29 @@ export default function ProgressDetailTask() { const param = useParams<{ id: string, detail: string }>() const refresh = useHookstate(globalRefreshTask) const [loading, setLoading] = useState(true) - const isMobile = useMediaQuery('(max-width: 369px)'); + const isMobile = useMediaQuery('(max-width: 369px)'); const tema = useHookstate(TEMA) + const [reason, setReason] = useState("") + + async function getOneDataCancel() { + try { + const res = await funGetTaskDivisionById(param.detail, 'data'); + if (res.success) { + setReason(res.data.reason); + } else { + toast.error(res.message); + } + + } catch (error) { + console.error(error); + toast.error("Gagal mendapatkan data tugas divisi, coba lagi nanti"); + } + } + + useShallowEffect(() => { + getOneDataCancel(); + }, [param.detail]) + async function getOneData() { try { @@ -56,6 +78,22 @@ export default function ProgressDetailTask() { return ( + {reason !== null ? + ( + + + + + Tugas dibatalkan + + {reason} + + + ) + : null + } {loading ? : @@ -74,14 +112,14 @@ export default function ProgressDetailTask() { aria-label="Gradient action icon" radius={100} // gradient={{ from: "#DFDA7C", to: "#F2AF46", deg: 174 }} - bg={tema.get().bgFiturDivision} + bg={tema.get().bgFiturHome} > - Kemajuan Kegiatan {valProgress}% + Kemajuan Tugas {valProgress}% - + { setTitle(e.target.value) }} diff --git a/src/module/task/ui/list_division_task.tsx b/src/module/task/ui/list_division_task.tsx index 99546ad..81f1fdd 100644 --- a/src/module/task/ui/list_division_task.tsx +++ b/src/module/task/ui/list_division_task.tsx @@ -1,4 +1,4 @@ -import { currentScroll, TEMA } from "@/module/_global"; +import { currentScroll, SkeletonList, TEMA } from "@/module/_global"; import { ActionIcon, Avatar, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; @@ -117,70 +117,80 @@ export default function ListDivisionTask() { - {loading ? - - - - : - - Total Kegiatan - - {totalData} - - - } + + Total Tugas + + {totalData} + + {isList ? ( - {isData.map((v, i) => { - return ( - - - - router.push(`task/${v.id}`)}> -
- - - -
-
-
- - - - - {v.title} - - + { + loading ? + Array(3) + .fill(null) + .map((_, i) => ( + + + + )) + : + _.isEmpty(isData) + ? + + Tidak ada Tugas + + : + isData.map((v, i) => { + return ( + + + + router.push(`task/${v.id}`)}> +
+ + + +
+
+
+ + + + + {v.title} + + + + +
+
-
-
- -
- ); - })} + ); + })}
) : ( diff --git a/src/module/task/ui/navbar_detail_division_task.tsx b/src/module/task/ui/navbar_detail_division_task.tsx index d5d74b1..d4bf3f4 100644 --- a/src/module/task/ui/navbar_detail_division_task.tsx +++ b/src/module/task/ui/navbar_detail_division_task.tsx @@ -21,12 +21,14 @@ export default function NavbarDetailDivisionTask() { const roleLogin = useHookstate(globalRole) const adminLogin = useHookstate(globalIsAdminDivision) const tema = useHookstate(TEMA) + const [reason, setReason] = useState("") async function getOneData() { try { const res = await funGetTaskDivisionById(param.detail, 'data'); if (res.success) { setName(res.data.title); + setReason(res.data.reason); } else { toast.error(res.message); } @@ -41,7 +43,6 @@ export default function NavbarDetailDivisionTask() { getOneData(); }, [param.detail]) - return ( <> { - router.push(param.detail + '/add-task') + reason == null ? + router.push(param.detail + '/add-task') + : null }} pb={20} > - + - Tambah Tugas + Tambah Tugas @@ -90,14 +93,16 @@ export default function NavbarDetailDivisionTask() { cursor: 'pointer' }} onClick={() => { - router.push(param.detail + '/add-file') + reason == null ? + router.push(param.detail + '/add-file') + : null }} > - + - Tambah file + Tambah file
@@ -108,12 +113,16 @@ export default function NavbarDetailDivisionTask() { style={{ cursor: 'pointer' }} - onClick={() => { router.push(param.detail + '/add-member') }} > + onClick={() => { + reason == null ? + router.push(param.detail + '/add-member') + : null + }} > - + - Tambah anggota + Tambah anggota
@@ -121,12 +130,16 @@ export default function NavbarDetailDivisionTask() { style={{ cursor: 'pointer' }} - onClick={() => { router.push(param.detail + '/edit') }} > + onClick={() => { + reason == null ? + router.push(param.detail + '/edit') + : null + }} > - + - Edit + Edit @@ -134,12 +147,16 @@ export default function NavbarDetailDivisionTask() { style={{ cursor: 'pointer' }} - onClick={() => { router.push(param.detail + '/cancel') }} > + onClick={() => { + reason == null ? + router.push(param.detail + '/cancel') + : null + }} > - + - Batal + Batal : <> diff --git a/src/module/task/ui/navbar_division_task.tsx b/src/module/task/ui/navbar_division_task.tsx index 8998ddb..9b044bf 100644 --- a/src/module/task/ui/navbar_division_task.tsx +++ b/src/module/task/ui/navbar_division_task.tsx @@ -17,7 +17,7 @@ export default function NavbarDivisionTask() { return ( <> - setOpenDrawer(true)} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings">