From 46964678c2db85a51ff72a7be89cb75829767363 Mon Sep 17 00:00:00 2001 From: Sabda Yagra Date: Wed, 7 Jan 2026 23:03:38 +0700 Subject: [PATCH] fix: all error in admin --- .../content/image/components/columns.tsx | 131 +++++++++++++----- .../components/pending-approval-columns.tsx | 4 +- .../content/image/components/table-image.tsx | 4 +- .../(admin)/admin/content/image/page.tsx | 2 +- .../form/content/image/image-detail-form.tsx | 74 +++++++--- components/form/content/image/image-form.tsx | 8 +- components/form/sign-up.tsx | 55 +++++++- components/landing-page/header.tsx | 2 +- components/landing-page/media-update.tsx | 31 ++--- components/landing-page/navbar.tsx | 2 +- 10 files changed, 228 insertions(+), 85 deletions(-) diff --git a/app/[locale]/(admin)/admin/content/image/components/columns.tsx b/app/[locale]/(admin)/admin/content/image/components/columns.tsx index 00afed8..4386755 100644 --- a/app/[locale]/(admin)/admin/content/image/components/columns.tsx +++ b/app/[locale]/(admin)/admin/content/image/components/columns.tsx @@ -66,7 +66,10 @@ const useTableColumns = () => { accessorKey: "createdAt", header: "Upload Date", cell: ({ row }) => { - const createdAt = row.getValue("createdAt") as string | number | undefined; + const createdAt = row.getValue("createdAt") as + | string + | number + | undefined; const formattedDate = createdAt && !isNaN(new Date(createdAt).getTime()) ? format(new Date(createdAt), "dd-MM-yyyy HH:mm:ss") @@ -98,7 +101,8 @@ const useTableColumns = () => { cell: ({ row }) => { const isPublish = row.original.isPublish; const isPublishOnPolda = row.original.isPublishOnPolda; - const creatorGroupParentLevelId = row.original.creatorGroupParentLevelId; + const creatorGroupParentLevelId = + row.original.creatorGroupParentLevelId; let displayText = "-"; if (isPublish && !isPublishOnPolda) { @@ -124,40 +128,101 @@ const useTableColumns = () => { ); }, }, + // { + // accessorKey: "statusName", + // header: "Status", + // cell: ({ row }) => { + // const statusId = Number(row.original?.statusId); + // const reviewedAtLevel = row.original?.reviewedAtLevel || ""; + // const creatorGroupLevelId = Number(row.original?.creatorGroupLevelId); + // const needApprovalFromLevel = Number(row.original?.needApprovalFromLevel); + + // const userHasReviewed = reviewedAtLevel.includes(`:${userLevelId}:`); + // const isCreator = creatorGroupLevelId === Number(userLevelId); + + // const isWaitingForReview = statusId === 2 && !userHasReviewed && !isCreator; + // const isApprovalNeeded = statusId === 1 && needApprovalFromLevel === Number(userLevelId); + + // const label = + // isWaitingForReview || isApprovalNeeded + // ? "Menunggu Review" + // : statusId === 2 + // ? "Diterima" + // : row.original?.statusName; + + // const colors: Record = { + // "Menunggu Review": "bg-orange-100 text-orange-600", + // Diterima: "bg-green-100 text-green-600", + // default: "bg-red-200 text-red-600", + // }; + + // const statusStyles = colors[label] || colors.default; + + // return ( + // + // {label} + // + // ); + // }, + // }, { accessorKey: "statusName", header: "Status", cell: ({ row }) => { - const statusId = Number(row.original?.statusId); - const reviewedAtLevel = row.original?.reviewedAtLevel || ""; - const creatorGroupLevelId = Number(row.original?.creatorGroupLevelId); - const needApprovalFromLevel = Number(row.original?.needApprovalFromLevel); + const { + statusId, + statusName, + isPublish, + reviewedAtLevel = "", + creatorGroupLevelId, + needApprovalFromLevel, + } = row.original; + + const userLevelId = Number(getCookiesDecrypt("ulie")); const userHasReviewed = reviewedAtLevel.includes(`:${userLevelId}:`); - const isCreator = creatorGroupLevelId === Number(userLevelId); + const isCreator = Number(creatorGroupLevelId) === userLevelId; - const isWaitingForReview = statusId === 2 && !userHasReviewed && !isCreator; - const isApprovalNeeded = statusId === 1 && needApprovalFromLevel === Number(userLevelId); + + if (isPublish) { + return ( +
+ + Published + +
+ ); + } + + let label = statusName || "Menunggu Review"; - const label = - isWaitingForReview || isApprovalNeeded - ? "Menunggu Review" - : statusId === 2 - ? "Diterima" - : row.original?.statusName; + if (statusId === 2 && !userHasReviewed && !isCreator) { + label = "Menunggu Review"; + } else if (statusId === 1 && needApprovalFromLevel === userLevelId) { + label = "Menunggu Review"; + } else if (statusId === 2) { + label = "Diterima"; + } const colors: Record = { "Menunggu Review": "bg-orange-100 text-orange-600", - Diterima: "bg-green-100 text-green-600", - default: "bg-red-200 text-red-600", + Diterima: "bg-blue-100 text-blue-600", + Published: "bg-green-100 text-green-700", + Unknown: "bg-gray-100 text-gray-600", + default: "bg-gray-100 text-gray-600", }; - const statusStyles = colors[label] || colors.default; - return ( - - {label} - +
+ + {label} + +
); }, }, @@ -215,7 +280,9 @@ const useTableColumns = () => { React.useEffect(() => { if (userLevelId !== undefined && roleId !== undefined) { - setIsMabesApprover(Number(userLevelId) === 216 && Number(roleId) === 3); + setIsMabesApprover( + Number(userLevelId) === 216 && Number(roleId) === 3 + ); } }, [userLevelId, roleId]); @@ -224,7 +291,7 @@ const useTableColumns = () => { diff --git a/components/form/content/image/image-detail-form.tsx b/components/form/content/image/image-detail-form.tsx index 6d33720..a07473d 100644 --- a/components/form/content/image/image-detail-form.tsx +++ b/components/form/content/image/image-detail-form.tsx @@ -323,12 +323,8 @@ export default function FormImageDetail() { try { const response = await getArticleDetail(Number(id)); const details = response?.data?.data; - console.log("detail", details); - - // Map the new API response to the expected format const mappedDetail: Detail = { ...details, - // Map legacy fields for backward compatibility category: details.categories && details.categories.length > 0 ? { @@ -339,19 +335,17 @@ export default function FormImageDetail() { creatorName: details.createdByName, thumbnailLink: details.thumbnailUrl, statusName: getStatusName(details.statusId), - needApprovalFromLevel: 0, // This might need to be updated based on your business logic + needApprovalFromLevel: 0, uploadedById: details.createdById, files: details.files || [], }; - // Map files from new API structure to expected format const mappedFiles = (mappedDetail.files || []).map((file: any) => ({ id: file.id, url: file.fileUrl || file.url, thumbnailFileUrl: file.fileThumbnail || file.thumbnailFileUrl || file.fileUrl, fileName: file.fileName || file.fileName, - // Keep original API fields for reference ...file, })); @@ -360,7 +354,7 @@ export default function FormImageDetail() { if (mappedFiles && mappedFiles.length > 0) { setMain({ - type: "image", // Default type for articles + type: "image", url: mappedFiles[0]?.url || mappedDetail.thumbnailUrl, names: mappedFiles[0]?.fileName || "image", format: getFileExtension(mappedFiles[0]?.fileName || "jpg"), @@ -368,19 +362,22 @@ export default function FormImageDetail() { setupPlacementCheck(mappedFiles.length); } - // Set the selected target to the category ID from details setSelectedTarget(String(mappedDetail.categoryId)); - const fileUrls = mappedFiles.map( - (file: any) => - file.thumbnailFileUrl || - file.url || - mappedDetail.thumbnailUrl || - "default-image.jpg" + const fileUrls = (mappedFiles || []).map( + (file) => file.thumbnailFileUrl || file.url || "default-image.jpg" ); + setDetailThumb(fileUrls); - // Note: You might need to update this API call as well + if (details?.publishedForObject?.length > 0) { + const publisherIds = details.publishedForObject + .map((obj: any) => Number(obj.id)) + .filter((id: number) => id === 5 || id === 6); + + setSelectedPublishers(publisherIds); + } + const approvals = await getDataApprovalByMediaUpload(mappedDetail.id); setApproval(approvals?.data?.data); } catch (error) { @@ -391,7 +388,6 @@ export default function FormImageDetail() { initState(); }, [refresh, setValue]); - // Helper function to get status name from status ID const getStatusName = (statusId: number): string => { const statusMap: { [key: number]: string } = { 1: "Menunggu Review", @@ -669,7 +665,7 @@ export default function FormImageDetail() { navigation={false} className="h-[480px] object-cover w-full" > - {detailThumb?.map((data: any, index: number) => ( + {/* {detailThumb?.map((data: any, index: number) => ( {`Image + ))} */} + {detailThumb?.map((url: string, index: number) => ( + + {`Image + ))}
@@ -761,24 +766,34 @@ export default function FormImageDetail() {
- handleCheckboxChange(5)} className="border" + /> */} + +
- handleCheckboxChange(6)} className="border" + /> */} +
-
@@ -847,7 +862,7 @@ export default function FormImageDetail() { )} */} - + Leave Comment @@ -859,7 +874,7 @@ export default function FormImageDetail() { className="flex flex-row gap-5 items-center w-full" >
- {file.fileAlt */} + {file.fileAlt handleImageLoad(e, index)} + className={`h-[100px] object-contain ${ + portraitMap[index] ? "w-auto" : "w-[200px]" + }`} />
diff --git a/components/form/content/image/image-form.tsx b/components/form/content/image/image-form.tsx index f17172f..d43edc1 100644 --- a/components/form/content/image/image-form.tsx +++ b/components/form/content/image/image-form.tsx @@ -378,6 +378,7 @@ export default function FormImage() { }; const res = await generateDataArticle(request); + console.log("AI RESPONSE FULL:", res); close(); if (res?.error) { @@ -385,7 +386,12 @@ export default function FormImage() { return false; } - const newArticleId = res?.data?.data?.id; + // const newArticleId = res?.data?.data?.id; + const newArticleId = + res?.data?.data?.id || + res?.data?.data?.articleId || + res?.data?.data?.uuid; + setIsGeneratedArticle(true); setArticleIds((prevIds: string[]) => { diff --git a/components/form/sign-up.tsx b/components/form/sign-up.tsx index e11f07e..8ada1c3 100644 --- a/components/form/sign-up.tsx +++ b/components/form/sign-up.tsx @@ -94,7 +94,7 @@ export default function SignUp() { // Kontributor (sementara ikut umum) if (role === "kontributor") { - await handleCreateUserUmum(e); + await handleCreateUserKontributor(e); return; } @@ -134,6 +134,59 @@ export default function SignUp() { return password.length >= 8; }; + const handleCreateUserKontributor = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!firstNameKontributor.trim() || !lastNameKontributor.trim()) { + MySwal.fire( + "Peringatan", + "Nama depan dan belakang wajib diisi", + "warning" + ); + return; + } + + if (!validateEmail(email)) { + MySwal.fire("Peringatan", "Email tidak valid", "warning"); + return; + } + + if (!validatePassword(kontributorPassword)) { + MySwal.fire("Peringatan", "Password minimal 8 karakter", "warning"); + return; + } + + const fullName = `${firstNameKontributor} ${lastNameKontributor}`; + + const payload = { + address: "", + clientId: "78356d32-52fa-4dfc-b836-6cebf4e3eead", + email, + fullName, + password: kontributorPassword, + phoneNumber: whatsappKontributor, + username: fullName.toLowerCase().replace(/\s+/g, "-"), + userLevelId: 1, + userRoleId: 5, // MISAL role kontributor + }; + + try { + setIsLoading(true); + const res = await createUser(payload); + + if (res?.error) { + MySwal.fire("Gagal", res?.message || "Gagal mendaftar", "error"); + } else { + MySwal.fire("Berhasil", "Akun kontributor berhasil dibuat", "success"); + router.push("/auth"); + } + } catch (err) { + MySwal.fire("Error", "Terjadi kesalahan server", "error"); + } finally { + setIsLoading(false); + } + }; + const handleCreateUserUmum = async (e: React.FormEvent) => { e.preventDefault(); diff --git a/components/landing-page/header.tsx b/components/landing-page/header.tsx index d8a7246..7ac8011 100644 --- a/components/landing-page/header.tsx +++ b/components/landing-page/header.tsx @@ -323,7 +323,7 @@ function Card({
-
+
{item.clientName} diff --git a/components/landing-page/media-update.tsx b/components/landing-page/media-update.tsx index 57962c6..1422b33 100644 --- a/components/landing-page/media-update.tsx +++ b/components/landing-page/media-update.tsx @@ -329,15 +329,7 @@ export default function MediaUpdate() { } }; - function SafeImage({ - src, - alt, - href, - }: { - src?: string; - alt?: string; - href: string; - }) { + function SafeImage({ src, alt }: { src?: string; alt?: string }) { const [imgSrc, setImgSrc] = useState(src || DEFAULT_IMAGE); useEffect(() => { @@ -345,15 +337,13 @@ export default function MediaUpdate() { }, [src]); return ( - - {alt setImgSrc(DEFAULT_IMAGE)} - /> - + {alt setImgSrc(DEFAULT_IMAGE)} + /> ); } @@ -504,7 +494,6 @@ export default function MediaUpdate() { {/* -
+
- {item.clientName || "Tanpa Kategori"} + {item.clientName} {item.categories diff --git a/components/landing-page/navbar.tsx b/components/landing-page/navbar.tsx index 57d9e20..2106658 100644 --- a/components/landing-page/navbar.tsx +++ b/components/landing-page/navbar.tsx @@ -187,7 +187,7 @@ export default function Navbar() {