diff --git a/app/[locale]/(protected)/admin/media-tracking/component/table.tsx b/app/[locale]/(protected)/admin/media-tracking/component/table.tsx index 4589faac..ba3ba8be 100644 --- a/app/[locale]/(protected)/admin/media-tracking/component/table.tsx +++ b/app/[locale]/(protected)/admin/media-tracking/component/table.tsx @@ -26,6 +26,7 @@ import { } from "@/components/ui/table"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { + ChevronDown, ChevronLeft, ChevronRight, Eye, @@ -40,6 +41,7 @@ import { import { cn } from "@/lib/utils"; import { DropdownMenu, + DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, @@ -68,12 +70,16 @@ import SearchDocumentComponent from "@/components/form/media-tracking/search-doc import SearchAudioComponent from "@/components/form/media-tracking/search-audio-card"; import TrackingMediaModal from "./modal"; import { getMediaTracking } from "@/service/media-tracking/media-tracking"; +import { group } from "console"; +import router from "next/router"; +import { title } from "process"; +import { InputGroup, InputGroupText } from "@/components/ui/input-group"; +import { Input } from "@/components/ui/input"; const NewsTable = () => { const router = useRouter(); const asPath = usePathname(); const searchParams = useSearchParams(); - const [search, setSearch] = React.useState(""); const [showData, setShowData] = React.useState("10"); const [categories, setCategories] = React.useState(); const [dataTable, setDataTable] = React.useState([]); @@ -96,10 +102,11 @@ const NewsTable = () => { const [page, setPage] = React.useState(1); const [imageData, setImageData] = React.useState(); const [totalData, setTotalData] = React.useState(1); - const [totalPage, setTotalPage] = React.useState(1); + const [totalPage, setTotalPage] = React.useState(1); const [contentAll, setContentAll] = React.useState([]); const [formatFilter, setFormatFilter] = React.useState([]); const [totalContent, setTotalContent] = React.useState(); + const [search, setSearch] = React.useState(""); const group = searchParams?.get("group"); const title = searchParams?.get("title"); const categorie = searchParams?.get("category"); @@ -144,25 +151,22 @@ const NewsTable = () => { React.useEffect(() => { getDataTable(); - }, []); + }, [page, showData, search]); const getDataTable = async () => { - const res = await getMediaTracking({ page: page - 1, size: 10 }); + const res = await getMediaTracking(page - 1, search, showData); + const data = res?.data?.data; - console.log; - if (data) { - const startIndex = 10 * (page - 1); - let iterate = 0; - const newData = data.content.map((value: any) => { - iterate++; - value.no = startIndex + iterate; - return value; - }); - setDataTable(newData); - setTotalData(data.totalElements); - setTotalPage(data?.totalPages); - setTotalContent(data.totalElements); - } + const newData = data?.content; + + newData.forEach((item: any, index: number) => { + item.no = (page - 1) * Number(showData) + index + 1; + }); + + setDataTable(newData); + setTotalData(data?.totalElements); + setTotalPage(data?.totalPages); + setTotalContent(data.totalElements); }; async function getCategories() { @@ -203,33 +207,38 @@ const NewsTable = () => { router.push(`?category=&title=`); }; - async function getData() { - if (asPath?.includes("/polda/") == true) { - if (asPath?.split("/")[2] !== "[polda_name]") { - const filter = - categoryFilter?.length > 0 - ? categoryFilter?.sort().join(",") - : categorie || ""; + // async function getData() { + // if (asPath?.includes("/polda/") == true) { + // if (asPath?.split("/")[2] !== "[polda_name]") { + // const filter = + // categoryFilter?.length > 0 + // ? categoryFilter?.sort().join(",") + // : categorie || ""; - const name = title == undefined ? "" : title; - const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const filterGroup = group == undefined ? asPath.split("/")[2] : group; - loading(); - const response = await listDataAll("", name, filter, ""); - close(); - // setGetTotalPage(response?.data?.data?.totalPages); - // setContentImage(response?.data?.data?.content); - // setTotalContent(response?.data?.data?.totalElements); - const data = response?.data?.data; - const contentData = data?.content; - setImageData(contentData); - setTotalData(data?.totalElements); - setContentAll(response?.data?.data?.content); - setTotalPage(data?.totalPages); - setTotalContent(response?.data?.data?.totalElements); - } - } - } + // const name = title == undefined ? "" : title; + // const format = formatFilter == undefined ? "" : formatFilter?.join(","); + // const filterGroup = group == undefined ? asPath.split("/")[2] : group; + // loading(); + // const response = await listDataAll("", name, filter, ""); + // close(); + // // setGetTotalPage(response?.data?.data?.totalPages); + // // setContentImage(response?.data?.data?.content); + // // setTotalContent(response?.data?.data?.totalElements); + // const data = response?.data?.data; + // const contentData = data?.content; + // setImageData(contentData); + // setTotalData(data?.totalElements); + // setContentAll(response?.data?.data?.content); + // setTotalPage(data?.totalPages); + // setTotalContent(response?.data?.data?.totalElements); + // } + // } + // } + + const handleSearch = (e: React.ChangeEvent) => { + setSearch(e.target.value); + table.getColumn("judul")?.setFilterValue(e.target.value); + }; const handleKeyUp = () => { clearTimeout(typingTimer); @@ -255,50 +264,72 @@ const NewsTable = () => { Tracking Berita hari ini!

- getDataTable()} /> - {/* - - - - - - Form Tracking Berita - -
-
- - setSearchTitle(e.target.value)} - onKeyUp={handleKeyUp} - onKeyDown={handleKeyDown} - type="text" - placeholder="Search..." - className="pl-4 pr-4 py-1 w-full h-10 text-[15px] border focus:outline-none dark:text-white" - /> -
-
- - - - +
+ getDataTable()} /> +
+
+
+ + + + + + + + 1 - 10 Data + + + 1 - 50 Data + + + 1 - 100 Data + + + 1 - 250 Data + + + +
- - - - - -
*/} - +
+ + + + + + {table + .getAllColumns() + .filter((column) => column.getCanHide()) + .map((column) => { + return ( + + column.toggleVisibility(!!value) + } + > + {column.id} + + ); + })} + + +
+ + +
{table.getHeaderGroups().map((headerGroup) => ( diff --git a/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx b/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx index d17bdc2f..899f2124 100644 --- a/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx +++ b/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx @@ -59,12 +59,12 @@ const columns: ColumnDef[] = [ ), }, { - accessorKey: "static", + accessorKey: "isStaticBanner", header: "Static Banner", cell: ({ row }) => ( ), }, diff --git a/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx b/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx index b0fedb12..d6d4ef40 100644 --- a/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx +++ b/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx @@ -96,22 +96,9 @@ const BannerListTable = () => { let temp: any; const response = await listBanner(); - temp = response?.data?.data; - const response2 = await listStaticBanner(); - console.log("sadadddd", response2?.data?.data.length); - for (let i = 0; i < response2?.data?.data.length; i++) { - for (let j = 0; j < temp.length; j++) { - console.log("temp", j, temp[j].id); - if (response2?.data?.data[i].mediaUploadId === temp[j].id) { - temp[j].staticPage = true; - } else { - temp[j].staticPage = false; - } - } - } - - console.log("tesmasdasdasdasd", temp); - setGetData(temp); + const data = response?.data?.data?.content; + console.log("banner", data); + setGetData(data); close(); } diff --git a/app/[locale]/(protected)/admin/settings/category/component/column.tsx b/app/[locale]/(protected)/admin/settings/category/component/column.tsx index 078b9248..7f41bda2 100644 --- a/app/[locale]/(protected)/admin/settings/category/component/column.tsx +++ b/app/[locale]/(protected)/admin/settings/category/component/column.tsx @@ -45,19 +45,17 @@ const columns: ColumnDef[] = [ ), }, { - accessorKey: "contentType", + accessorKey: "mediaTypesString", header: "Tipe Konten", cell: ({ row }) => ( - {row.getValue("contentType")} + {row.getValue("mediaTypesString")} ), }, { - accessorKey: "isInternational", + accessorKey: "publishedLocation", header: "Wilayah", cell: ({ row }) => ( - - {row.getValue("isInternational") ? "INT" : "ID"} - + {row.getValue("publishedLocation")} ), }, { diff --git a/app/[locale]/(protected)/shared/curated-content/giat-routine/image/accept-assignment/detail/[id]/page.tsx b/app/[locale]/(protected)/shared/curated-content/giat-routine/image/accept-assignment/detail/[id]/page.tsx new file mode 100644 index 00000000..ba706f8b --- /dev/null +++ b/app/[locale]/(protected)/shared/curated-content/giat-routine/image/accept-assignment/detail/[id]/page.tsx @@ -0,0 +1,619 @@ +"use client"; +import React, { ChangeEvent, useEffect, useRef, useState } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import { Card, CardContent } from "@/components/ui/card"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { useParams, useRouter } from "next/navigation"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import Cookies from "js-cookie"; +import { postBlog } from "@/service/blog/blog"; +import { Textarea } from "@/components/ui/textarea"; +import { + DotSquare, + InboxIcon, + PaperclipIcon, + SmileIcon, + TrashIcon, +} from "lucide-react"; +import { + deleteMediaCurationMessage, + detailMedia, + getMediaCurationMessage, + saveMediaCurationMessage, +} from "@/service/curated-content/curated-content"; +import { Swiper, SwiperSlide } from "swiper/react"; +import "swiper/css"; +import "swiper/css/free-mode"; +import "swiper/css/navigation"; +import "swiper/css/pagination"; +import "swiper/css/thumbs"; +import "swiper/css"; +import "swiper/css/navigation"; +import { FreeMode, Navigation, Pagination, Thumbs } from "swiper/modules"; +import { Avatar, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { listData } from "@/service/landing/landing"; +import { + createAssignmentResponse, + deleteAssignmentResponse, + getAssignmentResponseList, +} from "@/service/task"; +import { getCookiesDecrypt } from "@/lib/utils"; +import { close, loading } from "@/lib/swal"; +import { Checkbox } from "@/components/ui/checkbox"; +import { formatDateToIndonesian, htmlToString } from "@/utils/globals"; +import { Link } from "@/i18n/routing"; +import { useTranslations } from "next-intl"; +import { Icon } from "@/components/ui/icon"; + +const detailSchema = z.object({ + title: z.string().min(1, { message: "Judul diperlukan" }), + categoryName: z.string().min(1, { message: "Judul diperlukan" }), + meta: z.string().min(1, { message: "Judul diperlukan" }), + description: z + .string() + .min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter." }), + // tags: z.string().min(1, { message: "Judul diperlukan" }), +}); + +type Category = { + id: string; + categoryName: string; +}; + +const formatDate = (dateString: string): string => { + const date = new Date(dateString); + + // Pastikan validitas tanggal + if (isNaN(date.getTime())) { + throw new Error("Invalid date format"); + } + + // Format tanggal + const day = date.getDate().toString().padStart(2, "0"); + const month = (date.getMonth() + 1).toString().padStart(2, "0"); + const year = date.getFullYear(); + // const hours = date.getHours().toString().padStart(2, "0"); + + // Gabungkan hasil format + return `${day}-${month}-${year} `; +}; + +export type curationDetail = { + id: number; + title: string; + categoryName: string; + htmlDescription: string; + updatedAt: string; + timezone: string; + clickCount: string; + creatorName: string; + uploadedBy: { + id: number; + fullname: string; + username: string | null; + email: string; + isActive: boolean; + isDefault: boolean; + isInternational: boolean; + userLevel: { + id: number; + name: string; + aliasName: string; + userGroupId: number; + }; + }; + publishedFor: string; // ID for selected radio button + publishedForObject: { + id: number; + name: string; + isInternal: boolean; + code: string; + }[]; + tags: string; + provinceId: string; + is_active: string; +}; + +const initialComments = [ + { + id: 1, + username: "Esther Howard", + date: "07-04-2023 20:00 WIB", + text: "Tolong untuk narasinya mengikuti 5W + 1H!", + avatar: "/images/avatar/avatar-3.png", // URL avatar atau path gambar pengguna + replies: [], // Komentar balasan + }, + { + id: 2, + username: "Brooklyn Simmons", + date: "07-04-2023 20:00 WIB", + text: "Ok Baik, Saya segera melakukan perbaikan. Terima kasih atas masukannya. 🙏", + avatar: "/images/avatar/avatar-5.png", // URL avatar atau path gambar pengguna + replies: [], // Komentar balasan + }, + { + id: 3, + username: "Leslie Alexander", + date: "07-04-2023 20:00 WIB", + text: "Sangat berguna. Terima Kasih!", + avatar: "/images/avatar/avatar-7.png", // URL avatar atau path gambar pengguna + replies: [], // Komentar balasan + }, +]; + +export default function DetailAcceptImage() { + const MySwal = withReactContent(Swal); + const { id } = useParams() as { id: string }; + const t = useTranslations("LandingPage"); + console.log(id); + const editor = useRef(null); + type DetailSchema = z.infer; + const userLevelNumber = getCookiesDecrypt("ulne"); + const userId = getCookiesDecrypt("uie"); + const [selectedFiles, setSelectedFiles] = useState([]); + const taskId = Cookies.get("taskId"); + const scheduleId = Cookies.get("scheduleId"); + const scheduleType = Cookies.get("scheduleType"); + const [selectedTarget, setSelectedTarget] = useState(""); + const [detail, setDetail] = useState(); + const [refresh] = useState(false); + const [detailThumb, setDetailThumb] = useState([]); + const [thumbsSwiper, setThumbsSwiper] = useState(null); + const [showInput, setShowInput] = useState(false); + const [selectedFileId, setSelectedFileId] = useState(null); + const [listData, setListData] = useState([]); + const [message, setMessage] = useState(""); + + const { + control, + handleSubmit, + setValue, + formState: { errors }, + } = useForm({ + resolver: zodResolver(detailSchema), + }); + + const [commentsData, setCommentsData] = useState(initialComments); + const [replyText, setReplyText] = useState(""); + const [replyingTo, setReplyingTo] = useState(null); + const [selectedValue, setSelectedValue] = useState(""); + + const handleReply = (commentId: number) => { + setReplyingTo(commentId); + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setMessage(e.target.value); + }; + + useEffect(() => { + async function initState() { + // loading(); + const response = await getMediaCurationMessage(selectedFileId); + console.log("data", response?.data?.data); + console.log("userLvl", userLevelNumber); + setListData(response?.data?.data); + close(); + } + + initState(); + }, [selectedFileId]); + + // const postData = () => { + // sendSuggestionParent(); + // }; + + const postData = async () => { + if (message?.length > 1 && selectedFileId) { + try { + const data = { + mediaUploadFileId: selectedFileId, + message, + parentId: null, + }; + + const response = await saveMediaCurationMessage(data); + console.log("Komentar terkirim:", response); + + const responseGet = await getMediaCurationMessage(selectedFileId); + setListData(responseGet?.data?.data); + + setMessage(""); + } catch (error) { + console.error("Error posting comment:", error); + } + } else { + console.log("Pesan atau file ID tidak valid."); + } + }; + + const sendReplyData = async (parentId: number) => { + const inputElement = document.querySelector( + `#input-comment-${parentId}` + ) as HTMLTextAreaElement; + + if (inputElement?.value?.length > 1 && selectedFileId) { + loading(); + const data = { + mediaUploadFileId: selectedFileId, + message: inputElement.value, + parentId, + }; + + console.log("Sending reply:", data); + const response = await saveMediaCurationMessage(data); + console.log(response); + + const responseGet = await getMediaCurationMessage(selectedFileId); + console.log("Updated comments:", responseGet?.data?.data); + setListData(responseGet?.data?.data); + + inputElement.value = ""; + close(); + setReplyingTo(null); + } + }; + + async function deleteDataSuggestion(dataId: any) { + loading(); + const response = await deleteMediaCurationMessage(dataId); + console.log(response); + const responseGet = await getMediaCurationMessage(selectedFileId); + console.log(responseGet?.data?.data); + setListData(responseGet?.data?.data); + close(); + } + + const deleteData = (dataId: any) => { + deleteDataSuggestion(dataId); + console.log(dataId); + }; + + useEffect(() => { + async function initState() { + if (id) { + const response = await detailMedia(id); + const details = response?.data?.data; + + setDetail(details); + setSelectedValue(details?.publishedFor || ""); + setSelectedFileId(details?.files[0]?.id); + const filesData = details.files || []; + const fileUrls = filesData.map((file: any) => ({ + id: file.id, + thumbnailFileUrl: file.thumbnailFileUrl || "default-image.jpg", + placements: file.placements || "", + })); + setDetailThumb(fileUrls); + } + } + initState(); + }, [id, refresh]); + + const handleFileClick = async (fileId: any) => { + setSelectedFileId(fileId); + try { + const response = await getMediaCurationMessage(fileId); + console.log("Data komentar:", response?.data?.data); + setListData(response?.data?.data); + } catch (error) { + console.error("Error fetching comments:", error); + } + }; + const handleValueChange = (value: string) => { + setSelectedValue(value); + }; + + return ( +
+ {detail !== undefined ? ( + +
+

Kurasi Detail

+ +
+
+
+
+
+ + {detailThumb?.map((data: any) => ( + handleFileClick(data.id)} + > + {`File + + ))} + +
+ + {detailThumb?.map((data: any) => ( + handleFileClick(data.id)} + > + {`File + + ))} + +
+
+
+
+
+
+

+ {t("by")}  + + {detail?.uploadedBy?.userLevel?.name} + +

+ {/*

+  | {t("updatedOn")} + {detail?.updatedAt} WIB  |  +

*/} +

+  | {t("updatedOn")}  + {formatDateToIndonesian(new Date(detail?.updatedAt))}{" "} + {detail?.timezone ? detail?.timezone : "WIB"} +   +

+

+  |  + +   {detail?.clickCount}   +

+
+
+

+ {t("creator")} + {detail?.creatorName} +

+
+
+ + {/* Keterangan */} +
+

+ {detail?.title} +

+
+
+
+
+ + +
+
+ +
+