diff --git a/logs/backend/combined-2025-02-06.log b/logs/backend/combined-2025-02-06.log index 407422c1..4fb64325 100644 --- a/logs/backend/combined-2025-02-06.log +++ b/logs/backend/combined-2025-02-06.log @@ -1 +1,5 @@ {"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-06T02:49:36.302Z"} +{"level":"info","message":"Server status code: 201","timestamp":"2025-02-06T04:29:03.189Z"} +{"level":"info","message":"Success upload job_image: {\"id\":\"cm6su8iqb003dhcxkig4t2tpt\",\"name\":\"cr.jpeg\",\"path\":\"/cm0ur1yxw000056nsjlr6187p/2025/02/06/cr.jpeg\",\"mime\":\"image/jpeg\",\"ext\":\".jpeg\",\"desc\":null,\"size\":187018,\"active\":true,\"createdAt\":\"2025-02-06T04:29:03.057Z\",\"updatedAt\":\"2025-02-06T04:29:03.059Z\",\"userId\":\"cm0ur1yxw000056nsjlr6187p\",\"dirId\":\"cm0ypp6zl0003kp7jf59zuvjy\"}","timestamp":"2025-02-06T04:29:03.208Z"} +{"clientVersion":"6.3.0","level":"error","message":"Eror get data \nInvalid `prisma.job.findMany()` invocation:\n\n{\n orderBy: {\n updatedAt: \"desc\"\n },\n where: {\n masterStatusId: \"2\",\n isActive: true,\n title: {\n mode: \"insensitive\",\n+ contains: String\n }\n },\n include: {\n Author: true\n }\n}\n\nArgument `contains` must not be null.","name":"PrismaClientValidationError","originalColumn":12,"originalLine":10682,"stack":"PrismaClientValidationError: \nInvalid `prisma.job.findMany()` invocation:\n\n{\n orderBy: {\n updatedAt: \"desc\"\n },\n where: {\n masterStatusId: \"2\",\n isActive: true,\n title: {\n mode: \"insensitive\",\n+ contains: String\n }\n },\n include: {\n Author: true\n }\n}\n\nArgument `contains` must not be null.\n at new PrismaClientValidationError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:148:2395)\n at Hl (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:156:1379)\n at handleRequestError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:7006)\n at handleAndLogRequestError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6687)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6394)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-06T04:39:51.823Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-06T09:29:21.573Z"} diff --git a/logs/backend/error-2025-02-06.log b/logs/backend/error-2025-02-06.log index 407422c1..d76d0740 100644 --- a/logs/backend/error-2025-02-06.log +++ b/logs/backend/error-2025-02-06.log @@ -1 +1,3 @@ {"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-06T02:49:36.302Z"} +{"clientVersion":"6.3.0","level":"error","message":"Eror get data \nInvalid `prisma.job.findMany()` invocation:\n\n{\n orderBy: {\n updatedAt: \"desc\"\n },\n where: {\n masterStatusId: \"2\",\n isActive: true,\n title: {\n mode: \"insensitive\",\n+ contains: String\n }\n },\n include: {\n Author: true\n }\n}\n\nArgument `contains` must not be null.","name":"PrismaClientValidationError","originalColumn":12,"originalLine":10682,"stack":"PrismaClientValidationError: \nInvalid `prisma.job.findMany()` invocation:\n\n{\n orderBy: {\n updatedAt: \"desc\"\n },\n where: {\n masterStatusId: \"2\",\n isActive: true,\n title: {\n mode: \"insensitive\",\n+ contains: String\n }\n },\n include: {\n Author: true\n }\n}\n\nArgument `contains` must not be null.\n at new PrismaClientValidationError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:148:2395)\n at Hl (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:156:1379)\n at handleRequestError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:7006)\n at handleAndLogRequestError (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6687)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/@prisma/client/runtime/binary.js:258:6394)\n at processTicksAndRejections (native:7:39)","timestamp":"2025-02-06T04:39:51.823Z"} +{"digest":"DYNAMIC_SERVER_USAGE","level":"error","message":"Error get data detail event: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error","originalColumn":16,"originalLine":1069,"stack":"Error: Dynamic server usage: Page couldn't be rendered statically because it used `request.url`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error\n at new eS (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:26724)\n at e_ (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:27574)\n at i (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32507)\n at get (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:32603)\n at (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1217)\n at GET (/Users/lukman/Documents/projects/BIP/hipmi/.next/server/app/api/event/check-peserta/route.js:1:1084)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:39714)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js:14:33303)\n at (/Users/lukman/Documents/projects/BIP/hipmi/node_modules/next/dist/server/lib/trace/tracer.js:121:36)\n at run (node:async_hooks:64:22)","timestamp":"2025-02-06T09:29:21.573Z"} diff --git a/src/app/api/admin/job/[status]/route.ts b/src/app/api/admin/job/[status]/route.ts new file mode 100644 index 00000000..d7993b63 --- /dev/null +++ b/src/app/api/admin/job/[status]/route.ts @@ -0,0 +1,112 @@ +import { Job_Status } from '@/app_modules/job'; +import { prisma } from "@/app/lib"; +import _, { take } from "lodash"; +import { NextResponse } from "next/server"; +import backendLogger from '@/util/backendLogger'; +import moment from 'moment'; + +export async function GET(request: Request, { params }: { + params: { status: string } +} +) { + const method = request.method; + if (method !== 'GET') { + return NextResponse.json({ + success: false, + message: "Method not allowed" + }, + { status: 405 } + ) + } + const { status } = params; + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const page = searchParams.get("page"); + const takeData = 10 + const skipData = Number(page) * takeData - takeData; + + + try { + let fixData; + const fixStatus = _.startCase(status); + + if (!page) { + fixData = await prisma.job.findMany({ + orderBy: { + updatedAt: "desc" + }, + where: { + isActive: true, + isArsip: false, + MasterStatus: { + name: fixStatus + }, + title: { + contains: search ? search : "", + mode: "insensitive" + } + + }, + include: { + Author: true, + }, + + }) + } else { + fixData = await prisma.job.findMany({ + take: takeData, + skip: skipData, + orderBy: { + updatedAt: "desc" + }, + where: { + isActive: true, + isArsip: false, + MasterStatus: { + name: fixStatus + }, + title: { + contains: search ? search : "", + mode: "insensitive" + } + }, + include: { + Author: true, + }, + }) + + const nCount = await prisma.job.count({ + where: { + isActive: true, + isArsip: false, + title: { + contains: search ? search : "", + mode: "insensitive" + } + } + }) + + fixData = { + data: fixData, + nPage: _.ceil(nCount / takeData) + } + } + return NextResponse.json({ + success: true, + message: "Data found", + data: fixData, + + }, + { status: 200 } + ) + } catch (error) { + backendLogger.error("Eror get data", error) + return NextResponse.json({ + success: false, + message: "Data not found", + reason: (error as Error).message + }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/src/app/api/admin/voting/[status]/route.ts b/src/app/api/admin/voting/[status]/route.ts new file mode 100644 index 00000000..6cd1d589 --- /dev/null +++ b/src/app/api/admin/voting/[status]/route.ts @@ -0,0 +1,109 @@ +import { prisma } from "@/app/lib"; +import _ from "lodash"; +import moment from "moment"; +import { NextResponse } from "next/server"; + +export async function GET(request: Request, + { params }: { params: { status: string } } +) { + const method = request.method; + if (method !== "GET") { + return NextResponse.json({ + success: false, + message: "Method not allowed" + }, + { status: 405 } + ) + } + + const { status } = params; + const { searchParams } = new URL(request.url); + const search = searchParams.get("search"); + const page = searchParams.get("page"); + const takeData = 10; + const skipData = Number(page) * takeData - takeData; + + try { + let fixData; + const fixStatus = _.startCase(status); + + if (!page && !search) { + fixData = await prisma.voting.findMany({ + orderBy: { + updatedAt: "desc" + }, + where: { + isActive: true, + isArsip: false, + Voting_Status: { + name: fixStatus + } + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true + } + } + } + }, + Voting_Status: true, + Voting_Kontributor: true, + Voting_DaftarNamaVote: true, + } + }) + } else if (!page && search) { + fixData = await prisma.voting.findMany({ + orderBy: { + updatedAt: "desc" + }, + where: { + isActive: true, + isArsip: false, + Voting_Status: { + name: fixStatus + }, + title: { + contains: search, + mode: "insensitive" + } + }, + include: { + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + name: true + } + } + } + }, + Voting_Status: true, + Voting_Kontributor: true, + Voting_DaftarNamaVote: true, + } + }) + } else if (page && !search) { + if (fixStatus === "Publish") { + const getAllData = await prisma.voting.findMany({ + where: { + isActive: true, + Voting_Status: { + name: fixStatus + }, + isArsip: false + } + }); + + } + } + } catch (error) { + + } +} \ No newline at end of file diff --git a/src/app/dev/admin/job/child/publish/page.tsx b/src/app/dev/admin/job/child/publish/page.tsx index 28a18d68..a0458805 100644 --- a/src/app/dev/admin/job/child/publish/page.tsx +++ b/src/app/dev/admin/job/child/publish/page.tsx @@ -3,11 +3,11 @@ import adminJob_getListPublish from "@/app_modules/admin/job/fun/get/get_list_pu import { AdminJob_getListTableByStatusId } from "@/app_modules/admin/job/fun/get/get_list_table_by_status_id"; export default async function Page() { - const listPublish = await adminJob_getListPublish({page: 1}) + return ( <> - + ); } \ No newline at end of file diff --git a/src/app/dev/admin/job/child/review/page.tsx b/src/app/dev/admin/job/child/review/page.tsx index 84fd487f..519350aa 100644 --- a/src/app/dev/admin/job/child/review/page.tsx +++ b/src/app/dev/admin/job/child/review/page.tsx @@ -2,11 +2,10 @@ import { AdminJob_TableReview } from "@/app_modules/admin/job"; import adminJob_getListReview from "@/app_modules/admin/job/fun/get/get_list_review"; export default async function Page() { - const dataReview = await adminJob_getListReview({ page: 1 }); return ( <> - + ); } diff --git a/src/app_modules/admin/event/table_status/table_reject.tsx b/src/app_modules/admin/event/table_status/table_reject.tsx index 0678bfe9..93994f86 100644 --- a/src/app_modules/admin/event/table_status/table_reject.tsx +++ b/src/app_modules/admin/event/table_status/table_reject.tsx @@ -47,7 +47,7 @@ export default function AdminEvent_TableReject() { function TableStatus() { const router = useRouter(); const [data, setData] = useState(null); - const [isNPage, setNPage] = useState(1); + const [isNPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); diff --git a/src/app_modules/admin/job/_view/view_table_review.tsx b/src/app_modules/admin/job/_view/view_table_review.tsx index b0d2b677..b29b816c 100644 --- a/src/app_modules/admin/job/_view/view_table_review.tsx +++ b/src/app_modules/admin/job/_view/view_table_review.tsx @@ -46,15 +46,14 @@ import adminJob_getListReview from "../fun/get/get_list_review"; import { useAtom } from "jotai"; import { AccentColor } from "@/app_modules/_global/color"; import { AdminColor, MainColor } from "@/app_modules/_global/color/color_pallet"; +import { clientLogger } from "@/util/clientLogger"; +import { apiGetAdminJobByStatus } from "../lib/api_fetch_admin_job"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminJob_ViewTavleReview({ - listReview, -}: { - listReview: any; -}) { +export default function AdminJob_ViewTavleReview() { const router = useRouter(); - const [data, setData] = useState(listReview.data); - const [nPage, setNPage] = useState(listReview.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); const [publish, setPublish] = useState(false); @@ -70,153 +69,159 @@ export default function AdminJob_ViewTavleReview({ const [isShowReload, setIsShowReload] = useState(false); useShallowEffect(() => { - if (isAdminJob_TriggerReview) { - setIsShowReload(true); + loadInitialData(); + }, [activePage, isSearch]); + + + const loadInitialData = async () => { + try { + const response = await apiGetAdminJobByStatus({ + status: "Review", + page: `${activePage}`, + search: isSearch + }) + + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invliad data format recieved", response) + setData([]); + } + } catch (error) { + clientLogger.error("Error get data table publish", error); + setData([]); } - }, [isAdminJob_TriggerReview, setIsShowReload]); - - // useShallowEffect(() => { - // onLoadData({ - // onSuccessLoad(val) { - // setData(val.data); - // setNPage(val.nPage); - // }, - // }); - // }, [setData, setNPage]); - // async function onLoadData({ - // onSuccessLoad, - // }: { - // onSuccessLoad: (val: any) => any; - // }) { - // const loadData = await adminJob_getListReview({ page: 1 }); - // onSuccessLoad(loadData); - // } - + } async function onLoadData() { - const loadData = await adminJob_getListReview({ page: 1 }); - setData(loadData.data as any); - setNPage(loadData.nPage); + loadInitialData(); setIsLoading(false); setIsShowReload(false); setIsAdminJob_TriggerReview(false); } - async function onSearch(s: string) { - setSearch(s); + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); setActivePage(1); - const loadData = await adminJob_getListReview({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminJob_getListReview({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); } - const rowTable = data?.map((e, i) => ( - - -
- {e?.Author?.username} -
- - - - {e.title} - - - -
- {e.imageId ? ( - - ) : ( -
- - Tidak ada poster - + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data
- )} -
- - - -
- - - - -
- - - - - - - + + + ) + } + return data.map((e, i) => ( + + +
+ {e?.Author?.username} +
+ + + + {e.title} + + + +
+ {e.imageId ? ( + + ) : ( +
+ + Tidak ada poster + +
+ )} +
+ + + +
+ + + + +
+ + + + + + + + - - - - )); + + + )); + } + return ( <> @@ -306,7 +311,7 @@ export default function AdminJob_ViewTavleReview({ - + } /> + {!data ? ( + + ) : ( + + {isShowReload && ( + + +
+ +
+
+
+ )} - - {isShowReload && ( - - -
- -
-
-
- )} + + -
- - - - - - - - - - - {rowTable} -
-
Author
-
- Judul - -
Poster
-
- Syarat Ketentuan - - Deskripsi - -
Aksi
-
-
-
- { - onPageClick(val); - }} - /> -
-
+ > + + + +
Author
+ + + Judul + + +
Poster
+ + + Syarat Ketentuan + + + Deskripsi + + +
Aksi
+ + + + {renderTableBody()} + + +
+ { + onPageClick(val); + }} + /> +
+
+ )}
); diff --git a/src/app_modules/admin/job/child/publish/index.tsx b/src/app_modules/admin/job/child/publish/index.tsx index 6cbce6b4..2659850d 100644 --- a/src/app_modules/admin/job/child/publish/index.tsx +++ b/src/app_modules/admin/job/child/publish/index.tsx @@ -17,135 +17,163 @@ import { Text, TextInput, } from "@mantine/core"; -import { IconPhotoCheck, IconSearch } from "@tabler/icons-react"; +import { IconPhotoCheck, IconSearch, IconSettingsSearch } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; import adminJob_getListPublish from "../../fun/get/get_list_publish"; import { RouterAdminGlobal } from "@/app/lib"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetAdminJobByStatus } from "../../lib/api_fetch_admin_job"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export default function AdminJob_TablePublish({ - dataPublish, -}: { - dataPublish: any; -}) { +export default function AdminJob_TablePublish() { return ( <> - + ); } -function TableStatus({ dataPublish }: { dataPublish: any }) { +function TableStatus() { const router = useRouter(); - const [data, setData] = useState(dataPublish.data); - const [nPage, setNPage] = useState(dataPublish.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); const [isLoadingShowImage, setLoadingShowImage] = useState(false); const [dataId, setDataId] = useState(""); - async function onSearch(s: string) { - setSearch(s); + useShallowEffect(() => { + loadInitialData(); + }, [activePage, isSearch]) + + const loadInitialData = async () => { + try { + const response = await apiGetAdminJobByStatus({ + status: "Publish", + page: `${activePage}`, + search: isSearch + }) + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error("Invalid data format recieved", response) + setData([]) + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error) + setData([]) + } + } + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); setActivePage(1); - const loadData = await adminJob_getListPublish({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminJob_getListPublish({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); } - const TableRows = data?.map((e, i) => ( - - -
- {e?.Author?.username} -
- - -
- - {e?.isArsip ? ( - Arsip - ) : ( - Publish - )} - -
- - - - {e.title} - - - -
- {e.imageId ? ( - - ) : ( -
- - Tidak ada poster - + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data
- )} -
- - - -
- - - - -
- - - - )); + + + ) + } + return data?.map((e, i) => ( + + +
+ {e?.Author?.username} +
+ + +
+ + {e?.isArsip ? ( + Arsip + ) : ( + Publish + )} + +
+ + + + {e.title} + + + +
+ {e.imageId ? ( + + ) : ( +
+ + Tidak ada poster + +
+ )} +
+ + + +
+ + + + +
+ + + + )); + } return ( <> @@ -165,52 +193,55 @@ function TableStatus({ dataPublish }: { dataPublish: any }) { /> } /> + {!data ? ( + + ) : ( + + + - -
- - - - - - - - - - - {TableRows} -
-
Author
-
-
Status
-
- Judul - -
Poster
-
- Syarat Ketentuan - - Deskripsi -
-
-
- { - onPageClick(val); - }} - /> -
-
+ > + + + +
Author
+ + +
Status
+ + + Judul + + +
Poster
+ + + Syarat Ketentuan + + + Deskripsi + + + + {renderTableBody()} + + +
+ { + onPageClick(val); + }} + /> +
+ + )} ); diff --git a/src/app_modules/admin/job/child/reject/index.tsx b/src/app_modules/admin/job/child/reject/index.tsx index 571a9b00..5a07a6aa 100644 --- a/src/app_modules/admin/job/child/reject/index.tsx +++ b/src/app_modules/admin/job/child/reject/index.tsx @@ -31,6 +31,9 @@ import { WibuRealtime } from "wibu-pkg"; import { AdminJob_funEditCatatanById } from "../../fun/edit/fun_edit_catatan_by_id"; import adminJob_getListReject from "../../fun/get/get_list_reject"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { apiGetAdminJobByStatus } from "../../lib/api_fetch_admin_job"; +import { clientLogger } from "@/util/clientLogger"; +import { useShallowEffect } from "@mantine/hooks"; export default function AdminJob_TableReject({ dataReject, @@ -41,16 +44,16 @@ export default function AdminJob_TableReject({ <> - + ); } -function TableStatus({ listReject }: { listReject: any }) { +function TableStatus() { const router = useRouter(); - const [data, setData] = useState(listReject.data); - const [nPage, setNPage] = useState(listReject.nPage); + const [data, setData] = useState(null); + const [nPage, setNPage] = useState(1); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); @@ -59,119 +62,148 @@ function TableStatus({ listReject }: { listReject: any }) { const [isLoading, setIsLoading] = useState(false); const [catatan, setCatatan] = useState(""); - async function onSearch(s: string) { - setSearch(s); - const loadData = await adminJob_getListReject({ - page: 1, - search: s, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + useShallowEffect(() => { + loadInitialData(); + }, [activePage, isSearch]); + const loadInitialData = async () => { + try { + const response = await apiGetAdminJobByStatus({ + status: "Reject", + page: `${activePage}`, + search: isSearch + }); + + if (response?.success && response?.data.data) { + setData(response.data.data); + setNPage(response.data.nPage || 1); + } else { + console.error('Invalid data format recieved:', response) + setData([]); + } + } catch (error) { + clientLogger.error("Invalid data format recieced:", error); + setData([]) + } + } + + const onSearch = async (searchTerm: string) => { + setSearch(searchTerm); setActivePage(1); } - async function onPageClick(p: any) { - setActivePage(p); - const loadData = await adminJob_getListReject({ - search: isSearch, - page: p, - }); - setData(loadData.data as any); - setNPage(loadData.nPage); + const onPageClick = (page: number) => { + setActivePage(page); } - const rowTable = data?.map((e, i) => ( - - -
- {e?.Author?.username} -
- - - - {e.title} - - - -
- {e.imageId ? ( - - ) : ( -
- - Tidak ada poster - + const renderTableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data
- )} -
- - - -
- - - - -
- - - - - {e.catatan} - - - - - - - )); + + + ) + } + return data?.map((e, i) => ( + + +
+ {e?.Author?.username} +
+ + + + {e.title} + + + +
+ {e.imageId ? ( + + ) : ( +
+ + Tidak ada poster + +
+ )} +
+ + + +
+ + + + +
+ + + + + {e.catatan} + + + + + + + )); + } return ( <> @@ -253,7 +285,7 @@ function TableStatus({ listReject }: { listReject: any }) { p={"md"} w={"100%"} h={"100%"} - + > @@ -280,7 +312,7 @@ function TableStatus({ listReject }: { listReject: any }) { - {rowTable} + {renderTableBody()}
diff --git a/src/app_modules/admin/job/child/review/index.tsx b/src/app_modules/admin/job/child/review/index.tsx index 4d877cdd..8b00718a 100644 --- a/src/app_modules/admin/job/child/review/index.tsx +++ b/src/app_modules/admin/job/child/review/index.tsx @@ -4,16 +4,12 @@ import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/_admin_glob import { Stack } from "@mantine/core"; import { AdminJob_ViewTavleReview } from "../../_view"; -export default function AdminJob_TableReview({ - dataReview, -}: { - dataReview: any; -}) { +export default function AdminJob_TableReview() { return ( <> - + ); diff --git a/src/app_modules/admin/job/lib/api_fetch_admin_job.ts b/src/app_modules/admin/job/lib/api_fetch_admin_job.ts index f12548a7..cac078d5 100644 --- a/src/app_modules/admin/job/lib/api_fetch_admin_job.ts +++ b/src/app_modules/admin/job/lib/api_fetch_admin_job.ts @@ -1,9 +1,10 @@ export { - apiGetJobStatusCountDashboard, - apiGetJobArsipCount + apiGetAdminJobStatusCountDashboard as apiGetJobStatusCountDashboard , + apiGetAdminJobArsipCount as apiGetJobArsipCount, + apiGetAdminJobByStatus } -const apiGetJobStatusCountDashboard = async ({ name }: { +const apiGetAdminJobStatusCountDashboard = async ({ name }: { name: "Publish" | "Review" | "Reject"; }) => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); @@ -21,7 +22,7 @@ const apiGetJobStatusCountDashboard = async ({ name }: { return await response.json().catch(() => null) } -const apiGetJobArsipCount = async () => { +const apiGetAdminJobArsipCount = async () => { const { token } = await fetch("/api/get-cookie").then((res) => res.json()); if (!token) return await token.json().catch(() => null); @@ -36,4 +37,31 @@ const apiGetJobArsipCount = async () => { }); return await response.json().catch(() => null) -}; \ No newline at end of file +}; +const apiGetAdminJobByStatus = async ({ + status, + page, + search +}: { + status: "Publish" | "Review" | "Reject"; + page: string; + search: string; +}) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const isPage = page ? `?page=${page}` : ""; + const isSearch = search ? `&search=${search}` : ""; + const response = await fetch( + `/api/admin/job/${status}${isPage}${isSearch}`, + { + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}` + } + } + ) + return await response.json().catch(() => null) +} \ No newline at end of file diff --git a/src/app_modules/home/view_home_new.tsx b/src/app_modules/home/view_home_new.tsx index c8728cf0..9397b7e9 100644 --- a/src/app_modules/home/view_home_new.tsx +++ b/src/app_modules/home/view_home_new.tsx @@ -85,7 +85,7 @@ export default function HomeViewNew() { - ) : dataUser.profile === undefined ? ( + ) : dataUser?.profile === undefined ? ( - ) : dataUser.profile === undefined ? ( + ) : dataUser?.profile === undefined ? (