"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 } 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 } from "next/navigation"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Switch } from "@/components/ui/switch"; import Cookies from "js-cookie"; import { createMedia, getTagsBySubCategoryId, listEnableCategory, listEnableCategoryNew, publishMedia, rejectFiles, submitApproval, } from "@/service/content/content"; import { detailMedia, getDataApprovalByMediaUpload, } from "@/service/curated-content/curated-content"; import { Badge } from "@/components/ui/badge"; import { ChevronDown, ChevronUp, MailIcon } from "lucide-react"; 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 { DialogHeader, DialogFooter, Dialog, DialogContent, DialogTitle, DialogTrigger, DialogClose, } from "@/components/ui/dialog"; import { Textarea } from "@/components/ui/textarea"; import { close, loading, successCallback } from "@/config/swal"; import { getCookiesDecrypt } from "@/lib/utils"; import { Icon } from "@iconify/react/dist/iconify.js"; import { error } from "@/lib/swal"; import dynamic from "next/dynamic"; import { useRouter } from "@/i18n/routing"; import { useTranslations } from "next-intl"; import { UnitMapping } from "@/app/[locale]/(protected)/contributor/agenda-setting/unit-mapping"; import SuggestionModal from "@/components/modal/suggestions-modal"; import { formatDateToIndonesian } from "@/utils/globals"; import ApprovalHistoryModal from "@/components/modal/approval-history-modal"; import Image from "next/image"; import { getUserLevelForAssignments } from "@/service/task"; const imageSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), description: z .string() .min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter." }), creatorName: z.string().min(1, { message: "Creator diperlukan" }), // tags: z.string().min(1, { message: "Judul diperlukan" }), }); type Category = { id: string; name: string; }; type FileType = { id: number; url: string; thumbnailFileUrl: string; fileName: string; }; type Detail = { id: string; title: string; description: string; slug: string; category: { id: number; name: string; }; categoryName: string; creatorName: string; thumbnailLink: string; tags: string; statusName: string; isPublish: boolean; needApprovalFromLevel: number; files: FileType[]; uploadedById: number; }; const ViewEditor = dynamic( () => { return import("@/components/editor/view-editor"); }, { ssr: false } ); interface Destination { id: string; name: string; subDestination?: SubDestination[]; } interface SubDestination { id: string; name: string; } export default function FormImageDetail() { const MySwal = withReactContent(Swal); const router = useRouter(); const userId = getCookiesDecrypt("uie"); const userLevelId = getCookiesDecrypt("ulie"); const userLevelName = Cookies.get("state"); const roleId = getCookiesDecrypt("urie"); const [listDest, setListDest] = useState([]); const [modalOpen, setModalOpen] = useState(false); const { id } = useParams() as { id: string }; const editor = useRef(null); type ImageSchema = z.infer; const t = useTranslations("Form"); const [selectedFiles, setSelectedFiles] = useState([]); const taskId = Cookies.get("taskId"); const scheduleId = Cookies.get("scheduleId"); const scheduleType = Cookies.get("scheduleType"); const [status, setStatus] = useState(""); const [categories, setCategories] = useState([]); const [selectedCategory, setSelectedCategory] = useState(); const [tags, setTags] = useState([]); const [detail, setDetail] = useState(); const [refresh, setRefresh] = useState(false); const [selectedPublishers, setSelectedPublishers] = useState([]); const [description, setDescription] = useState(""); const [main, setMain] = useState([]); const [filePlacements, setFilePlacements] = useState([]); const [detailThumb, setDetailThumb] = useState([]); const [thumbsSwiper, setThumbsSwiper] = useState(null); const [isUserMabesApprover, setIsUserMabesApprover] = useState(false); const [approval, setApproval] = useState(); // State untuk setiap file secara individual const [fileUnitSelections, setFileUnitSelections] = useState< Array<{ semua: boolean; nasional: boolean; wilayah: boolean; international: boolean; polda: boolean; polres: boolean; satker: boolean; }> >([]); useEffect(() => { if (Number(userLevelId) === 216 && Number(roleId) === 3) { setIsUserMabesApprover(true); } }, [userLevelId, roleId]); // State untuk setiap file secara individual - checklist levels const [fileCheckedLevels, setFileCheckedLevels] = useState< Array> >([]); // State global untuk kompatibilitas (akan dihapus nanti) const [unitSelection, setUnitSelection] = useState({ semua: false, nasional: false, wilayah: false, international: false, polda: false, polres: false, satker: false, }); const [isLoading, setIsLoading] = useState(false); const [checkedLevels, setCheckedLevels] = useState>(new Set()); const [selectedTarget, setSelectedTarget] = useState(""); const [files, setFiles] = useState([]); const [rejectedFiles, setRejectedFiles] = useState([]); const [expandedPolda, setExpandedPolda] = useState>( {} ); // State untuk melacak apakah perubahan berasal dari checkbox utama const [isUpdatingFromMainCheckbox, setIsUpdatingFromMainCheckbox] = useState(false); // State untuk melacak jenis perubahan spesifik const [mainCheckboxChangeType, setMainCheckboxChangeType] = useState(""); const [wilayahPublish, setWilayahPublish] = React.useState({ semua: false, nasional: false, polda: false, polres: false, satker: false, international: false, }); const [selectedPolda, setSelectedPolda] = React.useState([]); let fileTypeId = "1"; const toggleExpand = (id: number) => { setExpandedPolda((prev) => ({ ...prev, [id]: !prev[id], })); }; useEffect(() => { if (detail?.assignedToTopLevel) { const outputSet = new Set( detail.assignedToTopLevel.split(",").map(Number) ); setUnitSelection({ semua: outputSet.has(0), nasional: outputSet.has(1), wilayah: outputSet.has(2), international: outputSet.has(3), polda: outputSet.has(4), polres: outputSet.has(5), satker: outputSet.has(6), }); } }, [detail?.fileTypeOutput]); // const handlePoldaPolresChange = () => { // return Array.from(checkedLevels).join(","); // Mengonversi Set ke string // }; useEffect(() => { async function fetchPoldaPolres() { setIsLoading(true); try { const response = await getUserLevelForAssignments(); setListDest(response?.data?.data.list); const initialExpandedState = response?.data?.data.list.reduce( (acc: any, polda: any) => { acc[polda.id] = false; return acc; }, {} ); setExpandedPolda(initialExpandedState); console.log("polres", initialExpandedState); } catch (error) { console.error("Error fetching Polda/Polres data:", error); } finally { setIsLoading(false); } } fetchPoldaPolres(); }, []); // useEffect untuk sinkronisasi checkbox modal dengan checkbox utama useEffect(() => { if ( listDest.length > 0 && isUpdatingFromMainCheckbox && mainCheckboxChangeType ) { syncModalWithMainCheckbox(); } }, [isUpdatingFromMainCheckbox, mainCheckboxChangeType]); // useEffect untuk update checkbox utama ketika pilihan modal berubah useEffect(() => { if (!isUpdatingFromMainCheckbox && listDest.length > 0) { updateMainCheckboxFromModalLegacy(); } }, [checkedLevels, isUpdatingFromMainCheckbox]); // Fungsi untuk update checkbox utama berdasarkan checkbox modal (global/legacy) const updateMainCheckboxFromModalLegacy = () => { if (!isUpdatingFromMainCheckbox && listDest.length > 0) { // Hitung item yang dipilih berdasarkan checkedLevels const checkedPoldaCount = listDest.filter( (item: any) => item.levelNumber === 2 && item.name !== "SATKER POLRI" && checkedLevels.has(Number(item.id)) ).length; const checkedPolresCount = listDest.reduce((total: number, item: any) => { if (item.subDestination && item.name !== "SATKER POLRI") { // Hanya hitung sub-item dari POLDA (bukan dari SATKER POLRI) return ( total + item.subDestination.filter((sub: any) => checkedLevels.has(Number(sub.id)) ).length ); } return total; }, 0); const satkerItem: any = listDest.find( (item: any) => item.name === "SATKER POLRI" ); const checkedSatkerCount = satkerItem ? (checkedLevels.has(Number(satkerItem.id)) ? 1 : 0) + (satkerItem.subDestination?.filter((sub: any) => checkedLevels.has(Number(sub.id)) ).length || 0) : 0; // Checkbox aktif jika ADA item yang dipilih dalam kategori tersebut const hasSelectedPolda = checkedPoldaCount > 0; const hasSelectedPolres = checkedPolresCount > 0; const hasSelectedSatker = checkedSatkerCount > 0; // Update unitSelection berdasarkan yang dipilih di modal setUnitSelection((prev) => { const newState = { ...prev }; // Update individual checkboxes newState.polda = hasSelectedPolda; newState.polres = hasSelectedPolres; newState.satker = hasSelectedSatker; // Update checkbox "semua" berdasarkan semua checkbox yang aktif newState.semua = newState.nasional && newState.wilayah && newState.international && hasSelectedPolda && hasSelectedPolres && hasSelectedSatker; return newState; }); } }; // Fungsi untuk sinkronisasi checkbox modal dengan checkbox utama const syncModalWithMainCheckbox = () => { if (isUpdatingFromMainCheckbox) { const newCheckedLevels = new Set(checkedLevels); // Handle checklist actions - menambahkan semua item ke modal if (mainCheckboxChangeType === "polda_checked") { // Checklist semua polda listDest.forEach((item: any) => { if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { newCheckedLevels.add(Number(item.id)); } }); } else if (mainCheckboxChangeType === "polres_checked") { // Checklist semua polres, tapi hanya yang poldanya sudah di-checklist // Jangan checklist sub-item SATKER POLRI listDest.forEach((item: any) => { if ( item.levelNumber === 2 && item.name !== "SATKER POLRI" && newCheckedLevels.has(Number(item.id)) ) { if (item.subDestination) { item.subDestination.forEach((polres: any) => { newCheckedLevels.add(Number(polres.id)); }); } } }); // Tidak perlu menghapus SATKER ketika POLRES di-checklist // Biarkan keduanya bisa aktif bersamaan // SATKER dan POLRES adalah konsep yang berbeda: // - SATKER: unit-unit seperti ITWASUM, BAINTELKAM, dll. // - POLRES: unit-unit seperti POLRES METRO JAKARTA PUSAT, dll. } else if (mainCheckboxChangeType === "satker_checked") { // Checklist satker const satkerItem: any = listDest.find( (item: any) => item.name === "SATKER POLRI" ); if (satkerItem) { newCheckedLevels.add(Number(satkerItem.id)); // Checklist semua sub-item yang ada di bawah SATKER (bukan POLRES) if (satkerItem.subDestination) { satkerItem.subDestination.forEach((sub: any) => { newCheckedLevels.add(Number(sub.id)); }); } } } else if (mainCheckboxChangeType === "semua_checked") { // Checklist semua item listDest.forEach((item: any) => { newCheckedLevels.add(Number(item.id)); // Checklist semua sub-item di bawah setiap item if (item.subDestination) { item.subDestination.forEach((sub: any) => { newCheckedLevels.add(Number(sub.id)); }); } }); } // Handle unchecklist actions - menghapus item dari modal else if (mainCheckboxChangeType === "polres_unchecked") { // Clear polres dari checkedLevels, tapi jangan hapus sub-item SATKER POLRI listDest.forEach((item: any) => { if (item.subDestination && item.name !== "SATKER POLRI") { item.subDestination.forEach((polres: any) => { newCheckedLevels.delete(Number(polres.id)); }); } }); } else if (mainCheckboxChangeType === "polda_unchecked") { // Clear polda dan polres dari checkedLevels, tapi jangan hapus SATKER POLRI listDest.forEach((item: any) => { if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { newCheckedLevels.delete(Number(item.id)); if (item.subDestination) { item.subDestination.forEach((polres: any) => { newCheckedLevels.delete(Number(polres.id)); }); } } }); } else if (mainCheckboxChangeType === "satker_unchecked") { // Clear satker dan semua sub-item di bawahnya dari checkedLevels const satkerItem: any = listDest.find( (item: any) => item.name === "SATKER POLRI" ); if (satkerItem) { newCheckedLevels.delete(Number(satkerItem.id)); if (satkerItem.subDestination) { satkerItem.subDestination.forEach((sub: any) => { newCheckedLevels.delete(Number(sub.id)); }); } } } else if (mainCheckboxChangeType === "semua_unchecked") { // Clear semua newCheckedLevels.clear(); } setCheckedLevels(newCheckedLevels); // Reset flag setelah sinkronisasi selesai setIsUpdatingFromMainCheckbox(false); setMainCheckboxChangeType(""); } }; // Fungsi untuk mengupdate state individual file const handleFileUnitChange = ( fileIndex: number, key: keyof typeof unitSelection, value: boolean ) => { setFileUnitSelections((prev) => { const newSelections = [...prev]; const currentSelection = { ...newSelections[fileIndex] }; if (key === "semua") { // Jika klik Semua, set semua value ke true/false currentSelection.semua = value; currentSelection.nasional = value; currentSelection.wilayah = value; currentSelection.international = value; currentSelection.polda = value; currentSelection.polres = value; currentSelection.satker = value; // Update fileCheckedLevels untuk sinkronisasi dengan modal setFileCheckedLevels((prevLevels) => { const newArray = [...prevLevels]; const currentFileLevels = new Set( newArray[fileIndex] || new Set() ); if (value) { // Checklist semua item di modal listDest.forEach((item: any) => { currentFileLevels.add(Number(item.id)); if (item.subDestination) { item.subDestination.forEach((sub: any) => { currentFileLevels.add(Number(sub.id)); }); } }); } else { // Unchecklist semua item di modal currentFileLevels.clear(); } newArray[fileIndex] = currentFileLevels; return newArray; }); } else { // Validasi khusus untuk POLRES - harus ada POLDA yang ter-checklist if (key === "polres" && value) { const currentFileCheckedLevels = fileCheckedLevels[fileIndex]; const hasSelectedPolda = currentFileCheckedLevels && listDest.some( (item: any) => item.levelNumber === 2 && item.name !== "SATKER POLRI" && currentFileCheckedLevels.has(Number(item.id)) ); if (!hasSelectedPolda) { alert( "Harap pilih POLDA di Modal terlebih dahulu sebelum mengaktifkan checkbox POLRES." ); return prev; // Batalkan perubahan } } // Update salah satu saja currentSelection[key] = value; // Cek apakah semua selain "semua" sudah dicentang const allChecked = [ "nasional", "wilayah", "international", "polda", "polres", "satker", ].every((k) => currentSelection[k as keyof typeof unitSelection]); currentSelection.semua = allChecked; } newSelections[fileIndex] = currentSelection; return newSelections; }); }; // Fungsi lama untuk kompatibilitas (akan dihapus nanti) const handleUnitChange = ( key: keyof typeof unitSelection, value: boolean ) => { // Set flag bahwa perubahan berasal dari checkbox utama setIsUpdatingFromMainCheckbox(true); setMainCheckboxChangeType(key + (value ? "_checked" : "_unchecked")); if (key === "semua") { // Jika klik Semua, set semua value ke true/false const newState = { semua: value, nasional: value, wilayah: value, international: value, polda: value, polres: value, satker: value, }; setUnitSelection(newState); } else { // Validasi khusus untuk POLRES if (key === "polres" && value) { // Cek apakah ada POLDA yang sudah dipilih di modal const hasSelectedPolda = listDest.some( (item: any) => item.levelNumber === 2 && item.name !== "SATKER POLRI" && checkedLevels.has(Number(item.id)) ); if (!hasSelectedPolda) { // Jika tidak ada POLDA yang dipilih, tampilkan peringatan dan batalkan alert( "Harap pilih POLDA di Modal terlebih dahulu sebelum mengaktifkan checkbox POLRES." ); // Reset flag karena perubahan dibatalkan setIsUpdatingFromMainCheckbox(false); setMainCheckboxChangeType(""); return; // Batalkan perubahan } } // Tidak ada validasi khusus untuk SATKER dan POLRES // Keduanya bisa aktif bersamaan // Update salah satu saja const updatedSelection = { ...unitSelection, [key]: value, }; // Cek apakah semua selain "semua" sudah dicentang const allChecked = [ "nasional", "wilayah", "international", "polda", "polres", "satker", ].every((k) => updatedSelection[k as keyof typeof unitSelection]); updatedSelection.semua = allChecked; setUnitSelection(updatedSelection); } }; const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(imageSchema), }); useEffect(() => { if ( userLevelId != undefined && roleId != undefined && userLevelId == "216" && roleId == "3" ) { setIsUserMabesApprover(true); } }, [userLevelId, roleId]); const handleCheckboxChange = (id: number) => { setSelectedPublishers((prev) => prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id] ); }; // Fungsi untuk mengupdate checklist levels untuk file tertentu const handleFileCheckboxChangePlacement = ( fileIndex: number, levelId: number ) => { setFileCheckedLevels((prev) => { const newArray = [...prev]; const currentFileLevels = new Set(newArray[fileIndex]); const isCurrentlyChecked = currentFileLevels.has(levelId); if (isCurrentlyChecked) { currentFileLevels.delete(levelId); // Jika ini adalah POLDA yang di-unchecklist, unchecklist juga semua polres di bawahnya const poldaItem = listDest.find( (item: any) => Number(item.id) === levelId ) as any; if ( poldaItem && poldaItem.subDestination && poldaItem.name !== "SATKER POLRI" ) { poldaItem.subDestination.forEach((polres: any) => { currentFileLevels.delete(Number(polres.id)); }); } // Jika ini adalah SATKER POLRI yang di-unchecklist, unchecklist juga semua sub-item di bawahnya if (poldaItem && poldaItem.name === "SATKER POLRI") { poldaItem.subDestination?.forEach((subItem: any) => { currentFileLevels.delete(Number(subItem.id)); }); } } else { currentFileLevels.add(levelId); // Jika ini adalah SATKER POLRI yang di-checklist, checklist juga semua sub-item di bawahnya const satkerItem = listDest.find( (item: any) => Number(item.id) === levelId ) as any; if (satkerItem && satkerItem.name === "SATKER POLRI") { // Checklist semua sub-item di bawah SATKER POLRI (bukan POLRES) satkerItem.subDestination?.forEach((subItem: any) => { currentFileLevels.add(Number(subItem.id)); }); } } newArray[fileIndex] = currentFileLevels; // Update checkbox utama berdasarkan perubahan di modal // Pindahkan ke sini agar state sudah ter-update setTimeout(() => updateMainCheckboxFromModal(fileIndex), 0); return newArray; }); }; // Fungsi untuk menangani "Pilih Semua" sub-items di bawah POLDA const handleSelectAllSubItems = (fileIndex: number, polda: any) => { setFileCheckedLevels((prev) => { const newArray = [...prev]; const currentFileLevels = new Set(newArray[fileIndex]); // Cek apakah semua sub-items sudah ter-checklist const allSubItemsChecked = polda.subDestination?.every((sub: any) => currentFileLevels.has(Number(sub.id)) ); if (allSubItemsChecked) { // Jika semua sudah ter-checklist, unchecklist semuanya polda.subDestination?.forEach((sub: any) => { currentFileLevels.delete(Number(sub.id)); }); } else { // Jika belum semua ter-checklist, checklist semuanya // Checklist POLDA juga jika belum ter-checklist if (!currentFileLevels.has(Number(polda.id))) { currentFileLevels.add(Number(polda.id)); } // Checklist semua sub-items polda.subDestination?.forEach((sub: any) => { currentFileLevels.add(Number(sub.id)); }); } newArray[fileIndex] = currentFileLevels; // Update checkbox utama berdasarkan perubahan di modal setTimeout(() => updateMainCheckboxFromModal(fileIndex), 0); return newArray; }); }; // Fungsi untuk mengupdate checkbox utama berdasarkan checklist di modal const updateMainCheckboxFromModal = (fileIndex: number) => { setFileUnitSelections((prev) => { const newSelections = [...prev]; const currentSelection = { ...newSelections[fileIndex] }; const currentFileLevels = fileCheckedLevels[fileIndex]; if (!currentFileLevels) return prev; // Hitung total POLDA yang ada (bukan SATKER POLRI) const totalPoldaCount = listDest.filter( (item: any) => item.levelNumber === 2 && item.name !== "SATKER POLRI" ).length; // Hitung berapa banyak POLDA yang ter-checklist (bukan SATKER POLRI) const checkedPoldaCount = listDest.reduce((total: number, item: any) => { if ( item.levelNumber === 2 && item.name !== "SATKER POLRI" && currentFileLevels.has(Number(item.id)) ) { return total + 1; } return total; }, 0); // Hitung total POLRES yang ada dari POLDA yang ter-checklist const totalPolresFromCheckedPolda = listDest.reduce( (total: number, item: any) => { if ( item.subDestination && item.name !== "SATKER POLRI" && currentFileLevels.has(Number(item.id)) ) { return total + item.subDestination.length; } return total; }, 0 ); // Hitung berapa banyak POLRES yang ter-checklist const checkedPolresCount = listDest.reduce((total: number, item: any) => { if (item.subDestination && item.name !== "SATKER POLRI") { // Hanya hitung sub-item dari POLDA (bukan dari SATKER POLRI) return ( total + item.subDestination.filter((sub: any) => currentFileLevels.has(Number(sub.id)) ).length ); } return total; }, 0); // Cek apakah SATKER POLRI ter-checklist const satkerItem = listDest.find( (item: any) => item.name === "SATKER POLRI" ); const isSatkerChecked = satkerItem && currentFileLevels.has(Number(satkerItem.id)); // Update checkbox berdasarkan kondisi // POLDA aktif jika ada minimal 1 POLDA ter-checklist currentSelection.polda = checkedPoldaCount > 0; // POLRES aktif jika ada minimal 1 POLRES ter-checklist currentSelection.polres = checkedPolresCount > 0; currentSelection.satker = Boolean(isSatkerChecked); // Update checkbox "semua" berdasarkan semua checkbox yang aktif currentSelection.semua = currentSelection.nasional && currentSelection.wilayah && currentSelection.international && currentSelection.polda && currentSelection.polres && currentSelection.satker; newSelections[fileIndex] = currentSelection; return newSelections; }); }; // Fungsi lama untuk kompatibilitas (akan dihapus nanti) const handleCheckboxChangePlacement = (levelId: number) => { setCheckedLevels((prev: Set) => { const updatedLevels = new Set(prev); const isCurrentlyChecked = updatedLevels.has(levelId); if (isCurrentlyChecked) { updatedLevels.delete(levelId); // Jika ini adalah POLDA yang di-unchecklist, unchecklist juga semua polres di bawahnya const poldaItem = listDest.find( (item: any) => Number(item.id) === levelId ) as any; if ( poldaItem && poldaItem.subDestination && poldaItem.name !== "SATKER POLRI" ) { poldaItem.subDestination.forEach((polres: any) => { updatedLevels.delete(Number(polres.id)); }); } // Jika ini adalah SATKER POLRI yang di-unchecklist, unchecklist juga semua sub-item di bawahnya if (poldaItem && poldaItem.name === "SATKER POLRI") { poldaItem.subDestination?.forEach((subItem: any) => { updatedLevels.delete(Number(subItem.id)); }); } } else { updatedLevels.add(levelId); // Jika ini adalah SATKER POLRI yang di-checklist, checklist juga semua sub-item di bawahnya const satkerItem = listDest.find( (item: any) => Number(item.id) === levelId ) as any; if (satkerItem && satkerItem.name === "SATKER POLRI") { // Checklist semua sub-item di bawah SATKER POLRI (bukan POLRES) satkerItem.subDestination?.forEach((subItem: any) => { updatedLevels.add(Number(subItem.id)); }); } } return updatedLevels; }); }; useEffect(() => { async function initState() { getCategories(); } initState(); }, []); const getCategories = async () => { try { const category = await listEnableCategoryNew(fileTypeId); const resCategory: Category[] = category?.data?.data?.content; setCategories(resCategory); console.log("data category", resCategory); if (scheduleId && scheduleType === "3") { const findCategory = resCategory.find((o) => o.name.toLowerCase().includes("pers rilis") ); if (findCategory) { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); const response = await getTagsBySubCategoryId(findCategory.id); setTags(response?.data?.data); } } } catch (error) { console.error("Failed to fetch categories:", error); } }; const setupPlacementCheck = (length: number) => { const temp = []; const unitSelections = []; const checkedLevelsArray = []; for (let i = 0; i < length; i++) { temp.push([]); // Inisialisasi state untuk setiap file unitSelections.push({ semua: false, nasional: false, wilayah: false, international: false, polda: false, polres: false, satker: false, }); // Inisialisasi checkedLevels untuk setiap file checkedLevelsArray.push(new Set()); } setFilePlacements(temp); setFileUnitSelections(unitSelections); setFileCheckedLevels(checkedLevelsArray); }; useEffect(() => { async function initState() { if (id) { const response = await detailMedia(id); const details = response?.data?.data; console.log("detail", details); setFiles(details?.files); setDetail(details); setMain({ type: details?.fileType.name, url: details?.files[0]?.url, names: details?.files[0]?.fileName, format: details?.files[0]?.format, }); setupPlacementCheck(details?.files?.length); if (details?.assignedToLevel) { const levels = new Set( details.assignedToLevel.split(",").map(Number) ); setCheckedLevels(levels); } if (details?.publishedForObject) { const publisherIds = details?.publishedForObject?.map( (obj: any) => obj.id ); setSelectedPublishers(publisherIds); } // Set the selected target to the category ID from details setSelectedTarget(String(details?.category?.id)); const filesData = details.files || []; const fileUrls = filesData.map((file: { thumbnailFileUrl: string }) => file.thumbnailFileUrl ? file.thumbnailFileUrl : "default-image.jpg" ); setDetailThumb(fileUrls); const approvals = await getDataApprovalByMediaUpload(details?.id); setApproval(approvals?.data?.data); } } initState(); }, [refresh, setValue]); const actionApproval = (e: string) => { const temp = []; for (const element of detail.files) { temp.push([]); } setFilePlacements(temp); setStatus(e); setFiles(detail.files); setDescription(""); setModalOpen(true); }; const submit = async () => { if ( (description?.length > 1 && Number(status) == 3) || Number(status) == 2 || Number(status) == 4 ) { save(); // MySwal.fire({ // title: "Simpan Approval", // text: "", // icon: "warning", // showCancelButton: true, // cancelButtonColor: "#d33", // confirmButtonColor: "#3085d6", // confirmButtonText: "Simpan", // }).then((result) => { // if (result.isConfirmed) { // save(); // } // }); } }; const getPlacement = () => { const temp = []; for (let i = 0; i < filePlacements?.length; i++) { if (filePlacements[i]?.length !== 0) { const now = filePlacements[i]; let nowArr = now?.join(",")?.replaceAll("wilayah", "polda"); nowArr = nowArr?.replaceAll("nasional", "mabes"); nowArr = nowArr?.replaceAll("semua", "all"); // Dapatkan checked levels untuk file ini const currentFileCheckedLevels = fileCheckedLevels[i] ? Array.from(fileCheckedLevels[i]) : []; const data = { mediaFileId: files[i]?.id, placements: nowArr, customLocationPlacements: currentFileCheckedLevels.join(","), }; temp.push(data); } } return temp; }; async function save() { // Gabungkan semua checkedLevels dari semua file const allCheckedLevels = new Set(); fileCheckedLevels.forEach((fileLevels) => { fileLevels.forEach((levelId) => { allCheckedLevels.add(levelId); }); }); const data = { mediaUploadId: id, statusId: status, message: description, files: isUserMabesApprover ? getPlacement() : [], }; console.log("Data Approval : ", data); setModalOpen(false); loading(); const response = await submitApproval(data); if (response?.error) { error(response.message); return false; } if (rejectedFiles) { const dataReject = { listFiles: rejectedFiles, }; const resReject = await rejectFiles(dataReject); if (resReject?.error) { error(resReject.message); return false; } } close(); submitApprovalSuccesss(); return false; } const setupPlacement = ( index: number, placement: string, checked: boolean ) => { let temp = [...filePlacements]; if (checked) { if (placement === "all") { temp[index] = ["all", "mabes", "polda", "international"]; // Update fileCheckedLevels untuk sinkronisasi dengan modal ketika "all" diklik setFileCheckedLevels((prevLevels) => { const newArray = [...prevLevels]; const currentFileLevels = new Set( newArray[index] || new Set() ); // Checklist semua item di modal listDest.forEach((item: any) => { currentFileLevels.add(Number(item.id)); if (item.subDestination) { item.subDestination.forEach((sub: any) => { currentFileLevels.add(Number(sub.id)); }); } }); newArray[index] = currentFileLevels; return newArray; }); // Update fileUnitSelections untuk checkbox tingkat utama setFileUnitSelections((prevSelections) => { const newSelections = [...prevSelections]; const currentSelection = { ...newSelections[index] }; // Set semua checkbox tingkat utama ke true currentSelection.nasional = true; currentSelection.wilayah = true; currentSelection.international = true; currentSelection.polda = true; currentSelection.polres = true; currentSelection.satker = true; currentSelection.semua = true; newSelections[index] = currentSelection; return newSelections; }); } else if (placement === "satker") { // Ketika satker di-checklist, HANYA tambahkan satker saja // JANGAN otomatis checklist polres const now = temp[index] || []; if (!now.includes("satker")) { now.push("satker"); } temp[index] = now; } else { const now = temp[index] || []; if (!now.includes(placement)) { now.push(placement); } // Hanya auto-checklist "all" jika polda, polres, dan mabes ter-checklist // JANGAN include satker dalam perhitungan auto "all" const nonSatkerItems = now.filter( (item) => item !== "satker" && item !== "all" ); if (nonSatkerItems.length === 3 && !now.includes("all")) { now.push("all"); } temp[index] = now; } } else { if (placement === "all") { temp[index] = []; // Update fileCheckedLevels untuk sinkronisasi dengan modal ketika "all" di-unchecklist setFileCheckedLevels((prevLevels) => { const newArray = [...prevLevels]; const currentFileLevels = new Set( newArray[index] || new Set() ); // Unchecklist semua item di modal currentFileLevels.clear(); newArray[index] = currentFileLevels; return newArray; }); // Update fileUnitSelections untuk checkbox tingkat utama setFileUnitSelections((prevSelections) => { const newSelections = [...prevSelections]; const currentSelection = { ...newSelections[index] }; // Set semua checkbox tingkat utama ke false currentSelection.nasional = false; currentSelection.wilayah = false; currentSelection.international = false; currentSelection.polda = false; currentSelection.polres = false; currentSelection.satker = false; currentSelection.semua = false; newSelections[index] = currentSelection; return newSelections; }); } else { const now = temp[index]?.filter((a) => a !== placement); console.log("now", now); temp[index] = now; // Hapus "all" jika tidak semua item ter-checklist if (now.includes("all")) { const nonSatkerItems = now.filter( (item) => item !== "satker" && item !== "all" ); if (nonSatkerItems.length < 3) { const newData = now.filter((b) => b !== "all"); temp[index] = newData; } } } } setFilePlacements(temp); // Update checklist levels di modal berdasarkan placement yang diubah updateModalChecklistLevels(index, placement, checked); }; // Fungsi untuk mengupdate checklist levels di modal berdasarkan placement const updateModalChecklistLevels = ( fileIndex: number, placement: string, checked: boolean ) => { if (!listDest || listDest.length === 0) return; setFileCheckedLevels((prev) => { const newArray = [...prev]; const currentFileLevels = new Set(newArray[fileIndex]); if (checked) { if (placement === "polda") { // Checklist semua POLDA (bukan SATKER POLRI) listDest.forEach((item: any) => { if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { currentFileLevels.add(Number(item.id)); } }); } else if (placement === "polres") { // Checklist POLRES hanya dari POLDA yang sudah ter-checklist listDest.forEach((item: any) => { if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { // Hanya checklist POLRES jika POLDA-nya sudah ter-checklist if (currentFileLevels.has(Number(item.id))) { if (item.subDestination) { item.subDestination.forEach((polres: any) => { currentFileLevels.add(Number(polres.id)); }); } } } }); } else if (placement === "satker") { // Checklist SATKER POLRI dan semua sub-item di bawahnya const satkerItem: any = listDest.find( (item: any) => item.name === "SATKER POLRI" ); if (satkerItem) { currentFileLevels.add(Number(satkerItem.id)); if (satkerItem.subDestination) { satkerItem.subDestination.forEach((sub: any) => { currentFileLevels.add(Number(sub.id)); }); } } } } else { if (placement === "polda") { // Unchecklist semua POLDA dan POLRES di bawahnya listDest.forEach((item: any) => { if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { currentFileLevels.delete(Number(item.id)); if (item.subDestination) { item.subDestination.forEach((polres: any) => { currentFileLevels.delete(Number(polres.id)); }); } } }); } else if (placement === "polres") { // Unchecklist semua POLRES listDest.forEach((item: any) => { if (item.subDestination && item.name !== "SATKER POLRI") { item.subDestination.forEach((polres: any) => { currentFileLevels.delete(Number(polres.id)); }); } }); } else if (placement === "satker") { // Unchecklist SATKER POLRI dan semua sub-item di bawahnya const satkerItem: any = listDest.find( (item: any) => item.name === "SATKER POLRI" ); if (satkerItem) { currentFileLevels.delete(Number(satkerItem.id)); if (satkerItem.subDestination) { satkerItem.subDestination.forEach((sub: any) => { currentFileLevels.delete(Number(sub.id)); }); } } } } newArray[fileIndex] = currentFileLevels; return newArray; }); }; function handleDeleteFileApproval(id: number) { const selectedFiles = files.filter((file) => file.id != id); setFiles(selectedFiles); const rejects = rejectedFiles; rejects.push(id); setRejectedFiles(rejects); } const handleMain = ( type: string, url: string, names: string, format: string ) => { console.log("Test 3 :", type, url, names, format); setMain({ type, url, names, format, }); return false; }; const submitApprovalSuccesss = () => { MySwal.fire({ title: "Sukses", text: "Data berhasil disimpan.", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push("/contributor/content/image"); } }); }; const publishToMabes = async () => { const res = await publishMedia(id); successCallback(); }; const [portraitMap, setPortraitMap] = useState({}); const handleImageLoad = (e: any, index: number) => { const { naturalWidth, naturalHeight } = e.target; const isPortrait = naturalHeight > naturalWidth; setPortraitMap((prev: any) => ({ ...prev, [index]: isPortrait, })); }; useEffect(() => { console.log("portrai", portraitMap); }, [portraitMap]); return (
{detail !== undefined ? (

{t("form-image", { defaultValue: "Form Image" })}

{/* Input Title */}
( )} /> {errors.title?.message && (

{errors.title.message}

)}
( )} /> {errors.description?.message && (

{errors.description.message}

)}
{detailThumb?.map((data: any) => ( {` ))}
{detailThumb?.map((data: any) => ( {` ))}
( )} /> {errors.creatorName?.message && (

{errors.creatorName.message}

)}
Thumbnail Gambar Utama
{detail?.tags ?.split(",") .map((tag: string, index: number) => ( {tag.trim()} ))}
handleCheckboxChange(5)} />
handleCheckboxChange(6)} />
handleCheckboxChange(7)} />
handleCheckboxChange(8)} />

{t("information", { defaultValue: "Information" })}:

{detail?.statusName}

Komentar

{approval?.message}

{" "} {approval?.approvalBy?.fullname} |{" "} {formatDateToIndonesian(approval?.approvalDate)}

{/* {detail?.isPublish == false ? (
) : ( "" )} */} {(detail?.isPublish == false && detail.isPublishOnPolda == true) || (detail?.isPublish == false && detail?.isInternationalMedia == true && Number(detail?.statusId) == 2) ? (
{userLevelName?.includes("MABES") && ( )}
) : ( "" )} {/* {detail?.isPublish == true ? ( ) : ( "" )} */} {t("leave-comment", { defaultValue: "Kelola Persetujuan Konten", })}
{status == "2" && files?.map((file, index) => (
{/* Header File */}
{`files-${index handleImageLoad(e, index)} className={`h-[80px] object-cover ${ portraitMap[index] ? "w-auto" : "!w-[120px]" }`} />

File {index + 1}

{file.fileName}

{isUserMabesApprover ? ( "" ) : (

Selesai

)}
{/* Section Pengaturan Distribusi */} {isUserMabesApprover ? (
Pengaturan Distribusi
{/* Checkbox Tingkat Utama */}

Tingkat Distribusi:

{[ { key: "semua", label: "Semua" }, { key: "nasional", label: "Nasional" }, { key: "wilayah", label: "Wilayah" }, { key: "international", label: "Internasional", }, ].map((item, idx) => (
{ handleFileUnitChange( index, item.key as keyof typeof unitSelection, value as boolean ); setupPlacement( index, item.key, Boolean(value) ); }} />
))}
{/* Detail Wilayah */} {fileUnitSelections[index]?.wilayah && (

Detail Wilayah:

{/* Checkbox Sub-kategori dengan tombol Kustom sejajar */}
{[ { key: "polda", label: "POLDA" }, { key: "polres", label: "POLRES" }, { key: "satker", label: "SATKER" }, ].map((item, idx) => (
{ handleFileUnitChange( index, item.key as keyof typeof unitSelection, value as boolean ); setupPlacement( index, item.key, Boolean(value) ); }} />
))} {/* Tombol Kustom sejajar dengan checkbox */}
Daftar Wilayah POLDA dan POLRES
{listDest.map((polda: any) => (
{/* Header POLDA */}
{polda.subDestination && ( )}
{/* Sub-items */} {polda.subDestination && expandedPolda[polda.id] && (
{/* Tombol Pilih Semua untuk sub-items */}
{(() => { const allSubItemsChecked = polda.subDestination?.every( (sub: any) => fileCheckedLevels[ index ]?.has( Number( sub.id ) ) ); return ( ); })()}
{polda.subDestination.map( (sub: any) => ( ) )}
)}
))}
)}
) : ( "" )}
))}
{/* Section Komentar */}