From d474d7611b6ad0bbf606a78fe9b04c50270140c1 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Wed, 19 Feb 2025 16:22:34 +0800 Subject: [PATCH] fix job deskrispi: - fix status job --- src/app/api/job/status/[name]/route.ts | 87 ++++++++ src/app/dev/job/main/status/[id]/page.tsx | 14 +- .../{api_master.ts => api_fetch_master.ts} | 0 src/app_modules/_global/lib/index.ts | 2 + .../_global/lib/list_status_app.ts | 18 ++ .../_view/detail/view_daftar_transaksi.tsx | 2 +- .../sponsor/metode_pembayaran/index.tsx | 2 +- .../job/component/api_fetch_job.ts | 47 +++++ src/app_modules/job/index.ts | 4 +- src/app_modules/job/main/status/publish.tsx | 69 ++++--- src/app_modules/job/main/status/review.tsx | 69 ++++--- src/app_modules/job/main/status/ui_status.tsx | 74 +++++++ .../job/main/status/view_status.tsx | 186 +++++++++--------- .../katalog/portofolio/create/view.tsx | 2 +- .../portofolio/edit/data/ui_edit_data.tsx | 2 +- 15 files changed, 412 insertions(+), 166 deletions(-) create mode 100644 src/app/api/job/status/[name]/route.ts rename src/app_modules/_global/lib/{api_master.ts => api_fetch_master.ts} (100%) create mode 100644 src/app_modules/_global/lib/list_status_app.ts create mode 100644 src/app_modules/job/component/api_fetch_job.ts create mode 100644 src/app_modules/job/main/status/ui_status.tsx diff --git a/src/app/api/job/status/[name]/route.ts b/src/app/api/job/status/[name]/route.ts new file mode 100644 index 00000000..cef2610b --- /dev/null +++ b/src/app/api/job/status/[name]/route.ts @@ -0,0 +1,87 @@ +import { funGetUserIdByToken } from "@/app_modules/_global/fun/get"; +import backendLogger from "@/util/backendLogger"; +import _ from "lodash"; +import { redirect } from "next/navigation"; +import { NextResponse } from "next/server"; +export async function GET( + request: Request, + { params }: { params: { name: string } } +) { + try { + let fixData; + const { name } = params; + const { searchParams } = new URL(request.url); + const page = searchParams.get("page"); + const takeData = 10 + const skipData = Number(page) * takeData - takeData; + + const userLoginId = await funGetUserIdByToken(); + + if (!userLoginId) { + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data", + reason: "Unauthorized", + }, + { + status: 401, + } + ); + } + + + if (!page) { + fixData = await prisma.job.findMany({ + orderBy: { + updatedAt: "desc", + }, + where: { + authorId: userLoginId, + isActive: true, + isArsip: false, + }, + include: { + Author: true, + MasterStatus: true, + }, + }); + } else { + const fixStatusName = _.startCase(name); + fixData = await prisma.job.findMany({ + take: takeData, + skip: skipData, + orderBy: { + updatedAt: "desc", + }, + where: { + authorId: userLoginId, + isActive: true, + MasterStatus: { + name: fixStatusName || name, + }, + }, + include: { + Author: true, + MasterStatus: true, + }, + }); + } + + return NextResponse.json({ + success: true, + message: "Berhasil mendapatkan data", + data: fixData, + }); + } catch (error) { + backendLogger.error("Error Get Data Job", error); + return NextResponse.json( + { + success: false, + message: "Gagal mendapatkan data", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/dev/job/main/status/[id]/page.tsx b/src/app/dev/job/main/status/[id]/page.tsx index 7ba51670..dc2c7552 100644 --- a/src/app/dev/job/main/status/[id]/page.tsx +++ b/src/app/dev/job/main/status/[id]/page.tsx @@ -2,22 +2,12 @@ import { Job_Status } from "@/app_modules/job"; import { job_funGetAllByStatusId } from "@/app_modules/job/fun"; import { job_funGetMasterStatus } from "@/app_modules/job/fun/get/get_master_status"; -export default async function Page({ params }: { params: { id: string } }) { - let statusId = params.id; +export default async function Page() { - const dataJob = await job_funGetAllByStatusId({ - page: 1, - statusId: statusId, - }); - const listStatus = await job_funGetMasterStatus(); return ( <> - + ); } diff --git a/src/app_modules/_global/lib/api_master.ts b/src/app_modules/_global/lib/api_fetch_master.ts similarity index 100% rename from src/app_modules/_global/lib/api_master.ts rename to src/app_modules/_global/lib/api_fetch_master.ts diff --git a/src/app_modules/_global/lib/index.ts b/src/app_modules/_global/lib/index.ts index 78b13e14..cc44a0ac 100644 --- a/src/app_modules/_global/lib/index.ts +++ b/src/app_modules/_global/lib/index.ts @@ -1,3 +1,5 @@ +import { globalStatusApp } from "./list_status_app"; import { MAX_SIZE } from "./max_size"; export { MAX_SIZE }; +export { globalStatusApp }; diff --git a/src/app_modules/_global/lib/list_status_app.ts b/src/app_modules/_global/lib/list_status_app.ts new file mode 100644 index 00000000..6d89e6a4 --- /dev/null +++ b/src/app_modules/_global/lib/list_status_app.ts @@ -0,0 +1,18 @@ +export const globalStatusApp = [ + { + id: "1", + name: "Publish", + }, + { + id: "2", + name: "Review", + }, + { + id: "3", + name: "Draft", + }, + { + id: "4", + name: "Reject", + }, +]; diff --git a/src/app_modules/admin/investasi/_view/detail/view_daftar_transaksi.tsx b/src/app_modules/admin/investasi/_view/detail/view_daftar_transaksi.tsx index 1602a917..6f175b95 100644 --- a/src/app_modules/admin/investasi/_view/detail/view_daftar_transaksi.tsx +++ b/src/app_modules/admin/investasi/_view/detail/view_daftar_transaksi.tsx @@ -32,7 +32,7 @@ import { useShallowEffect } from "@mantine/hooks"; import { apiGetAdminAllTransaksiById, apiGetAdminStatusTransaksi } from "../../_lib/api_fetch_admin_investasi"; import { clientLogger } from "@/util/clientLogger"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -import { apiGetMasterStatusTransaksi } from "@/app_modules/_global/lib/api_master"; +import { apiGetMasterStatusTransaksi } from "@/app_modules/_global/lib/api_fetch_master"; export function AdminInvestasi_ViewDaftarTransaksi() { const params = useParams<{ id: string }>(); diff --git a/src/app_modules/event/detail/sponsor/metode_pembayaran/index.tsx b/src/app_modules/event/detail/sponsor/metode_pembayaran/index.tsx index 45545d57..8ac18bc3 100644 --- a/src/app_modules/event/detail/sponsor/metode_pembayaran/index.tsx +++ b/src/app_modules/event/detail/sponsor/metode_pembayaran/index.tsx @@ -3,7 +3,7 @@ import { RouterEvent } from "@/lib/router_hipmi/router_event"; import { AccentColor, MainColor } from "@/app_modules/_global/color"; import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; -import { apiGetMasterBank } from "@/app_modules/_global/lib/api_master"; +import { apiGetMasterBank } from "@/app_modules/_global/lib/api_fetch_master"; import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { gs_event_bank_id, diff --git a/src/app_modules/job/component/api_fetch_job.ts b/src/app_modules/job/component/api_fetch_job.ts new file mode 100644 index 00000000..5002fd5e --- /dev/null +++ b/src/app_modules/job/component/api_fetch_job.ts @@ -0,0 +1,47 @@ +export { apiGetJobByStatus }; + +const apiGetJobByStatus = async ({ + status, + page, +}: { + status?: string; + page: string; +}) => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + console.log("status > ", status); + + // Send PUT request to update portfolio logo + const isPage = `?page=${page}` + const response = await fetch(`/api/job/status/${status}${isPage}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error( + "Error updating portfolio logo:", + errorData?.message || "Unknown error" + ); + + return null; + } + + return await response.json(); + } catch (error) { + console.error("Error updating portfolio medsos:", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; diff --git a/src/app_modules/job/index.ts b/src/app_modules/job/index.ts index 6bfefbb0..cb9a7bac 100644 --- a/src/app_modules/job/index.ts +++ b/src/app_modules/job/index.ts @@ -1,7 +1,7 @@ import Job_ViewBeranda from "./main/beranda/view_beranda"; import LayoutJob_Main from "./main/layout"; import Job_ViewSplash from "./splash/view_splash"; -import Job_ViewStatus from "./main/status/view_status"; +import Job_UiStatus from "./main/status/ui_status"; import Job_ViewArsip from "./main/arsip/view_arsip"; import Job_Create from "./create/view"; import LayoutJob_Create from "./create/layout"; @@ -26,7 +26,7 @@ export { Job_ViewBeranda, LayoutJob_Main, Job_ViewSplash, - Job_ViewStatus as Job_Status, + Job_UiStatus as Job_Status, Job_ViewArsip as Job_Arsip, Job_Create, LayoutJob_Create, diff --git a/src/app_modules/job/main/status/publish.tsx b/src/app_modules/job/main/status/publish.tsx index 7b4d618a..8656ee28 100644 --- a/src/app_modules/job/main/status/publish.tsx +++ b/src/app_modules/job/main/status/publish.tsx @@ -8,43 +8,58 @@ import { ScrollOnly } from "next-scroll-loader"; import { useState } from "react"; import ComponentJob_CardStatus from "../../component/card/card_view"; import job_getAllStatusPublish from "../../fun/get/status/get_list_publish"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetJobByStatus } from "../../component/api_fetch_job"; -export default function Job_Publish({ listPublish }: { listPublish: any }) { - const [data, setData] = useState(listPublish); +export default function Job_Publish({ nameStatus }: { nameStatus: string }) { + const [data, setData] = useState(null); const [activePage, setActivePage] = useState(1); + useShallowEffect(() => { + handleLoadData(); + }, []); + + const handleLoadData = async () => { + try { + // const response = await apiGetJobByStatus({ status: nameStatus }); + // if (response.success) { + // console.log(response.data); + // } + } catch (error) {} + }; + return ( <> {_.isEmpty(data) ? ( ) : ( - // --- Main component --- // - ( -
- -
- )} - data={data} - setData={setData} - moreData={async () => { - const loadData = await job_getAllStatusPublish({ - page: activePage + 1, - }); + "Publish" + // ( + //
+ // + //
+ // )} + // data={data} + // setData={setData} + // moreData={async () => { + // const loadData = await job_getAllStatusPublish({ + // page: activePage + 1, + // }); - setActivePage((val) => val + 1); + // setActivePage((val) => val + 1); - return loadData; - }} - > - {(item) => ( - - )} -
+ // return loadData; + // }} + // > + // {(item) => ( + // + // )} + //
)} ); diff --git a/src/app_modules/job/main/status/review.tsx b/src/app_modules/job/main/status/review.tsx index c427d981..6821804a 100644 --- a/src/app_modules/job/main/status/review.tsx +++ b/src/app_modules/job/main/status/review.tsx @@ -8,43 +8,58 @@ import { ScrollOnly } from "next-scroll-loader"; import { useState } from "react"; import ComponentJob_CardStatus from "../../component/card/card_view"; import job_getAllStatusReview from "../../fun/get/status/get_list_review"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetJobByStatus } from "../../component/api_fetch_job"; -export default function Job_Review({ listReview }: { listReview: any[] }) { - const [data, setData] = useState(listReview); +export default function Job_Review({ nameStatus }: { nameStatus: string }) { + const [data, setData] = useState(null); const [activePage, setActivePage] = useState(1); + useShallowEffect(() => { + handleLoadData(); + }, []); + + const handleLoadData = async () => { + try { + // const response = await apiGetJobByStatus({ status: nameStatus }); + // if (response.success) { + // console.log(response.data); + // } + } catch (error) {} + }; + return ( <> {_.isEmpty(data) ? ( ) : ( - // --- Main component --- // - ( -
- -
- )} - data={data} - setData={setData} - moreData={async () => { - const loadData = await job_getAllStatusReview({ - page: activePage + 1, - }); + "Review" + // ( + //
+ // + //
+ // )} + // data={data} + // setData={setData} + // moreData={async () => { + // const loadData = await job_getAllStatusReview({ + // page: activePage + 1, + // }); - setActivePage((val) => val + 1); + // setActivePage((val) => val + 1); - return loadData; - }} - > - {(item) => ( - - )} -
+ // return loadData; + // }} + // > + // {(item) => ( + // + // )} + //
)} ); diff --git a/src/app_modules/job/main/status/ui_status.tsx b/src/app_modules/job/main/status/ui_status.tsx new file mode 100644 index 00000000..0f25e43a --- /dev/null +++ b/src/app_modules/job/main/status/ui_status.tsx @@ -0,0 +1,74 @@ +"use client"; + +import { MainColor } from "@/app_modules/_global/color"; +import { globalStatusApp } from "@/app_modules/_global/lib"; +import { RouterJob } from "@/lib/router_hipmi/router_job"; +import { Stack, Tabs } from "@mantine/core"; +import { useParams, useRouter } from "next/navigation"; +import Job_NewViewStatus from "./view_status"; + +export default function Job_UiStatus() { + const router = useRouter(); + const param = useParams<{ id: string }>(); + const statusId = param.id; + + // const [changeStatus, setChangeStatus] = useState(statusId); + // const [nameStatus, setNameStatus] = useState(""); + + // async function onChangeStatus({ statusId }: { statusId: string }) { + // router.replace(RouterJob.status({ id: statusId })); + // const cek = globalStatusApp.find((e) => e.id === statusId); + + // setNameStatus(cek?.name); + // } + + return ( + <> + { + router.replace(RouterJob.status({ id: val })); + }} + styles={{ + tabsList: { + backgroundColor: MainColor.darkblue, + position: "sticky", + top: 0, + zIndex: 99, + }, + panel: { + paddingTop: 10, + }, + }} + > + + + {globalStatusApp.map((e) => ( + + {e.name} + + ))} + + + + + + + ); +} diff --git a/src/app_modules/job/main/status/view_status.tsx b/src/app_modules/job/main/status/view_status.tsx index 502d47e3..1e5c7cd4 100644 --- a/src/app_modules/job/main/status/view_status.tsx +++ b/src/app_modules/job/main/status/view_status.tsx @@ -1,107 +1,105 @@ "use client"; +import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data"; +import { globalStatusApp } from "@/app_modules/_global/lib"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { RouterJob } from "@/lib/router_hipmi/router_job"; -import { AccentColor, MainColor } from "@/app_modules/_global/color"; -import { MODEL_NEW_DEFAULT_MASTER } from "@/app_modules/model_global/interface"; -import { Stack, Tabs } from "@mantine/core"; -import { useRouter } from "next/navigation"; +import { clientLogger } from "@/util/clientLogger"; +import { Center, Loader, Stack } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import _ from "lodash"; +import { ScrollOnly } from "next-scroll-loader"; +import { useParams } from "next/navigation"; import { useState } from "react"; -import Job_Draft from "./draft"; -import Job_Publish from "./publish"; -import Job_Reject from "./reject"; -import Job_Review from "./review"; +import { apiGetJobByStatus } from "../../component/api_fetch_job"; +import ComponentJob_CardStatus from "../../component/card/card_view"; -export default function Job_ViewStatus({ - statusId, - dataJob, - listStatus, -}: { - statusId: string; - dataJob: any[]; - listStatus: MODEL_NEW_DEFAULT_MASTER[]; -}) { - const router = useRouter(); - const [changeStatus, setChangeStatus] = useState(statusId); +export default function Job_NewViewStatus() { + const param = useParams<{ id: string }>(); + const [data, setData] = useState(null); + const [activePage, setActivePage] = useState(1); - // const listTabs = [ - // { - // id: 1, - // path: , - // value: "Publish", - // }, - // { - // id: 2, - // path: , - // value: "Review", - // }, - // { - // id: 3, - // path: , - // value: "Draft", - // }, - // { - // id: 4, - // path: , - // value: "Reject", - // }, - // ]; + useShallowEffect(() => { + handleLoadData(); + }, []); - async function onChangeStatus({ statusId }: { statusId: string }) { - router.replace(RouterJob.status({ id: statusId })); - } + const handleLoadData = async () => { + try { + const cek = globalStatusApp.find((e) => e.id === param.id); + const response = await apiGetJobByStatus({ + status: cek?.name, + page: `${activePage}`, + }); + if (response.success) { + console.log(response.data); + setData(response.data); + } + } catch (error) { + clientLogger.error("Error get job", error); + } + }; + + const hanldeMoreData = async () => { + try { + const cek = globalStatusApp.find((e) => e.id === param.id); + const nextPage = activePage + 1; + const response = await apiGetJobByStatus({ + status: cek?.name, + page: `${nextPage}`, + }); + if (response.success) { + setActivePage(nextPage); + return response.data; + } + } catch (error) { + clientLogger.error("Error get job", error); + } + }; + + if (!data) + return ( + <> + + + + + + ); return ( <> - { - setChangeStatus(val); - onChangeStatus({ statusId: val }); - }} - styles={{ - tabsList: { - backgroundColor: MainColor.darkblue, - position: "sticky", - top: 0, - zIndex: 99, - }, - panel: { - paddingTop: 10, - }, - }} - > - - - {listStatus.map((e) => ( - - {e.name} - - ))} - - {statusId === "1" && } - {statusId === "2" && } - {statusId === "3" && } - {statusId === "4" && } - - + {_.isEmpty(data) ? ( + + ) : ( + ( +
+ +
+ )} + data={data} + setData={setData as any} + moreData={hanldeMoreData} + > + {(item) => ( + + )} +
+ )} ); } diff --git a/src/app_modules/katalog/portofolio/create/view.tsx b/src/app_modules/katalog/portofolio/create/view.tsx index 2b622d15..8a3eaaf9 100644 --- a/src/app_modules/katalog/portofolio/create/view.tsx +++ b/src/app_modules/katalog/portofolio/create/view.tsx @@ -37,7 +37,7 @@ import "react-international-phone/style.css"; import { Portofolio_ComponentButtonSelanjutnya } from "../component"; import { useParams } from "next/navigation"; import { useShallowEffect } from "@mantine/hooks"; -import { apiGetMasterBidangBisnis } from "@/app_modules/_global/lib/api_master"; +import { apiGetMasterBidangBisnis } from "@/app_modules/_global/lib/api_fetch_master"; import { MODEL_PORTOFOLIO_BIDANG_BISNIS } from "../model/interface"; import { clientLogger } from "@/util/clientLogger"; diff --git a/src/app_modules/katalog/portofolio/edit/data/ui_edit_data.tsx b/src/app_modules/katalog/portofolio/edit/data/ui_edit_data.tsx index d8c6261e..a13f0674 100644 --- a/src/app_modules/katalog/portofolio/edit/data/ui_edit_data.tsx +++ b/src/app_modules/katalog/portofolio/edit/data/ui_edit_data.tsx @@ -3,7 +3,7 @@ import { MainColor } from "@/app_modules/_global/color/color_pallet"; import ComponentGlobal_ErrorInput from "@/app_modules/_global/component/error_input"; import ComponentGlobal_InputCountDown from "@/app_modules/_global/component/input_countdown"; -import { apiGetMasterBidangBisnis } from "@/app_modules/_global/lib/api_master"; +import { apiGetMasterBidangBisnis } from "@/app_modules/_global/lib/api_fetch_master"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal";