From ab8f0c1086b200f03274559bec5c38fd1781fcaa Mon Sep 17 00:00:00 2001 From: Sabda Yagra Date: Tue, 5 Aug 2025 11:41:42 +0700 Subject: [PATCH] fix: iklan admin --- .../admin/settings/iklan/component/table.tsx | 31 ++-- app/[locale]/(public)/image/filter/page.tsx | 23 ++- app/[locale]/(public)/video/filter/page.tsx | 25 +++- .../form/setting/form-add-iklan-update.tsx | 138 +++++++++++++++++- components/form/setting/form-add-iklan.tsx | 64 +++++++- .../landing-page/advertisement-placements.tsx | 76 +++++----- components/landing-page/search-section.tsx | 49 ++++++- 7 files changed, 337 insertions(+), 69 deletions(-) diff --git a/app/[locale]/(protected)/admin/settings/iklan/component/table.tsx b/app/[locale]/(protected)/admin/settings/iklan/component/table.tsx index e588bce4..87fc408b 100644 --- a/app/[locale]/(protected)/admin/settings/iklan/component/table.tsx +++ b/app/[locale]/(protected)/admin/settings/iklan/component/table.tsx @@ -53,7 +53,7 @@ import { InputGroup, InputGroupText } from "@/components/ui/input-group"; import { paginationBlog } from "@/service/blog/blog"; import { ticketingPagination } from "@/service/ticketing/ticketing"; import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; import TablePagination from "@/components/table/table-pagination"; import columns from "./column"; import { getPlanningPagination } from "@/service/agenda-setting/agenda-setting"; @@ -69,7 +69,7 @@ import { import { listEnableCategory } from "@/service/content/content"; import { Checkbox } from "@/components/ui/checkbox"; import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/routing"; +import { Link, useRouter } from "@/i18n/routing"; import { TambahIklanModal } from "@/components/form/setting/form-add-iklan"; const AdvertisementsList = () => { @@ -150,11 +150,7 @@ const AdvertisementsList = () => { async function fetchData() { try { loading(); - const res = await listDataAdvertisements( - page - 1, - showData, - "", - ); + const res = await listDataAdvertisements(page - 1, showData, ""); const data = res?.data?.data; const contentData = data?.content; contentData.forEach((item: any, index: number) => { @@ -208,12 +204,21 @@ const AdvertisementsList = () => { <>
- - - + + {dataTable.length == 4 && ( +

+ Jumlah Iklan Sudah Maksimal (4) +

+ )}
{/* */}
diff --git a/app/[locale]/(public)/image/filter/page.tsx b/app/[locale]/(public)/image/filter/page.tsx index ba3e4917..d3f663b0 100644 --- a/app/[locale]/(public)/image/filter/page.tsx +++ b/app/[locale]/(public)/image/filter/page.tsx @@ -855,10 +855,25 @@ const FilterPage = () => {
-

- {image?.categoryName?.toUpperCase() ?? - "Giat Pimpinan"} -

+
+

+ {image?.categoryName?.toUpperCase() ?? + "Giat Pimpinan"} +

+

+ {formatDateToIndonesian( + new Date(image?.createdAt) + )}{" "} + {image?.timezone ?? "WIB"} | + {" "} + {image.clickCount} +

+
+

{image?.title}

diff --git a/app/[locale]/(public)/video/filter/page.tsx b/app/[locale]/(public)/video/filter/page.tsx index 05365bb6..73b30617 100644 --- a/app/[locale]/(public)/video/filter/page.tsx +++ b/app/[locale]/(public)/video/filter/page.tsx @@ -871,12 +871,27 @@ const FilterPage = () => {
{video?.title}
*/} -
+
-

- {video?.categoryName?.toUpperCase() ?? - "Giat Pimpinan"} -

+
+

+ {video?.categoryName?.toUpperCase() ?? + "Giat Pimpinan"} +

+

+ {formatDateToIndonesian( + new Date(video?.createdAt) + )}{" "} + {video?.timezone ?? "WIB"} | + {" "} + {video?.clickCount} +

+
+

{video?.title}

diff --git a/components/form/setting/form-add-iklan-update.tsx b/components/form/setting/form-add-iklan-update.tsx index c4979d38..a691c31d 100644 --- a/components/form/setting/form-add-iklan-update.tsx +++ b/components/form/setting/form-add-iklan-update.tsx @@ -41,6 +41,9 @@ import FileUploader from "../shared/file-uploader"; import { Icon } from "@/components/ui/icon"; import { useParams } from "next/navigation"; import Link from "next/link"; +import { listDataAdvertisements } from "@/service/broadcast/broadcast"; +import { close } from "@/config/swal"; +import { useRouter } from "@/i18n/routing"; const calendarSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), @@ -64,6 +67,7 @@ interface Detail { export function TambahIklanUpdate() { const [open, setOpen] = React.useState(false); + const router = useRouter(); const MySwal = withReactContent(Swal); const t = useTranslations("Schedule"); const { id } = useParams() as { id: string }; @@ -124,8 +128,11 @@ export function TambahIklanUpdate() { setCheckedLevels(new Set(levelIds)); } + setValue("title", details.title); + setValue("description", details.description); + if (details?.placements) { - setSelectedPlacement(details.placements); // "left-bottom", etc. + setSelectedPlacement(details.placements); } } } @@ -209,6 +216,58 @@ export function TambahIklanUpdate() { })); }; + async function fetchExistingImageAsFile( + url: string, + filename = "existing-image.jpg" + ) { + const response = await fetch(url); + const blob = await response.blob(); + const contentType = blob.type || "image/jpeg"; + return new File([blob], filename, { type: contentType }); + } + + // const save = async (data: CalendarSchema) => { + // const unitMapping = { + // allUnit: "0", + // mabes: "1", + // polda: "2", + // satker: "4", + // internasional: "5", + // }; + // const assignmentToString = Object.keys(unitSelection) + // .filter((key) => unitSelection[key as keyof typeof unitSelection]) + // .map((key) => unitMapping[key as keyof typeof unitMapping]) + // .join(","); + + // const formMedia = new FormData(); + // if (detail?.id) { + // formMedia.append("id", detail.id.toString()); + // } + // formMedia.append("title", data.title); + // formMedia.append("placements", selectedPlacement); + // formMedia.append("description", data.description); + // formMedia.append("redirectLink", "https://new.netidhub.com"); + // formMedia.append("assignedToLevel", handlePoldaPolresChange()); + // if (imageFiles.length > 0) { + // formMedia.append("file", imageFiles[0]); + // } + + // console.log("Form Data Submitted:", formMedia); + + // loading(); + // const response = await postAdvertisements(formMedia); + // if (response?.error) { + // error(response?.message); + // return false; + // } + // close(); + + // Cookies.set("scheduleId", response?.data?.data.id, { + // expires: 1, + // }); + // }; + + // Ini fungsi save (dalam component TambahIklanUpdate) const save = async (data: CalendarSchema) => { const unitMapping = { allUnit: "0", @@ -224,28 +283,48 @@ export function TambahIklanUpdate() { const formMedia = new FormData(); if (detail?.id) { - formMedia.append("id", detail.id.toString()); // Kirim ID untuk update + formMedia.append("id", detail.id.toString()); } + formMedia.append("title", data.title); formMedia.append("placements", selectedPlacement); formMedia.append("description", data.description); formMedia.append("redirectLink", "https://new.netidhub.com"); formMedia.append("assignedToLevel", handlePoldaPolresChange()); - formMedia.append("file", imageFiles[0]); - console.log("Form Data Submitted:", formMedia); + if (imageFiles.length > 0) { + formMedia.append("file", imageFiles[0]); + } else if (detail?.id) { + const existingFile = await fetchExistingImageAsFile( + `https://netidhub.com/api/advertisements/viewer/${detail.id}`, + "existing-image.jpg" + ); + formMedia.append("file", existingFile); + } loading(); const response = await postAdvertisements(formMedia); + if (response?.error) { error(response?.message); return false; } + close(); + MySwal.fire({ + icon: "success", + title: "Berhasil", + text: "Iklan berhasil ditambahkan.", + confirmButtonText: "OK", + }).then(() => { + window.location.href = "/in/admin/settings/iklan"; + }); Cookies.set("scheduleId", response?.data?.data.id, { expires: 1, }); + + Cookies.set("scheduleId", response?.data?.data.id, { expires: 1 }); }; React.useEffect(() => { @@ -299,6 +378,46 @@ export function TambahIklanUpdate() { }; const handleRemoveFile = (id: number) => {}; + + React.useEffect(() => { + fetchData(); + // setPagination({ + // pageIndex: 0, + // pageSize: Number(showData), + // }); + }, []); + + const [disabledCheckbox, setDisabledCheckbox] = React.useState([]); + + async function fetchData() { + try { + loading(); + const res = await listDataAdvertisements(0, "10", ""); + const data = res?.data?.data?.content; + // const contentData = data?.content; + const temp = data.map((a: any) => { + if (a.placements == "left-top" && a.id !== Number(id)) { + return "0"; + } + if (a.placements == "left-bottom" && a.id !== Number(id)) { + return "1"; + } + if (a.placements == "right-top" && a.id !== Number(id)) { + return "2"; + } + if (a.placements == "right-bottom" && a.id !== Number(id)) { + return "3"; + } + }); + console.log("contentData : ", data); + + setDisabledCheckbox(temp); + + close(); + } catch (error) { + console.error("Error fetching tasks:", error); + } + } return (
@@ -313,9 +432,10 @@ export function TambahIklanUpdate() { { label: "Kiri - 2", value: "left-bottom" }, { label: "Kanan - 1", value: "right-top" }, { label: "Kanan - 2", value: "right-bottom" }, - ].map(({ label, value }) => ( + ].map(({ label, value }, index) => (