diff --git a/app/[locale]/(public)/regional/filter/page.tsx b/app/[locale]/(public)/regional/filter/page.tsx index 67819ec0..06965b6b 100644 --- a/app/[locale]/(public)/regional/filter/page.tsx +++ b/app/[locale]/(public)/regional/filter/page.tsx @@ -29,6 +29,7 @@ import FilterImageComponent from "@/components/landing-page/filter-all/image-fil import FilterVideoComponent from "@/components/landing-page/filter-all/video-filter-card"; import FilterDocumentComponent from "@/components/landing-page/filter-all/document-filter-card"; import FilterAudioComponent from "@/components/landing-page/filter-all/audio-filter-card"; +import FilterIndeksComponent from "@/components/landing-page/filter-all/indeks-filter-card"; import { useTranslations } from "next-intl"; export default function FilterPage() { @@ -734,6 +735,13 @@ export default function FilterPage() { endDateString={endDateString} monthYearFilter={monthYearFilter} /> + diff --git a/components/form/content/image-update-form.tsx b/components/form/content/image-update-form.tsx index 4717ca3d..ee3668c1 100644 --- a/components/form/content/image-update-form.tsx +++ b/components/form/content/image-update-form.tsx @@ -49,16 +49,6 @@ import { getCsrfToken } from "@/service/auth"; import { Upload } from "tus-js-client"; import { useTranslations } from "next-intl"; import { htmlToString } from "@/utils/globals"; -import { getUserLevelForAssignments } from "@/service/task"; -import { - Dialog, - DialogClose, - DialogContent, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { v4 as uuidv4 } from "uuid"; const imageSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), @@ -121,21 +111,9 @@ const CustomEditor = dynamic( ); interface FileWithPreview extends File { - id: string; preview: string; } -interface Destination { - id: string; - name: string; - subDestination?: SubDestination[]; -} - -interface SubDestination { - id: string; - name: string; -} - export default function FormImageUpdate() { const MySwal = withReactContent(Swal); const router = useRouter(); @@ -176,525 +154,6 @@ export default function FormImageUpdate() { setThumbnailFile(file); } }; - const [fileUnitSelections, setFileUnitSelections] = useState< - Array<{ - semua: boolean; - nasional: boolean; - wilayah: boolean; - international: boolean; - polda: boolean; - polres: boolean; - satker: boolean; - }> - >([]); - // 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 [checkedLevels, setCheckedLevels] = useState>(new Set()); - const [listDest, setListDest] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [expandedPolda, setExpandedPolda] = useState>( - {} - ); - const [fileCheckedLevels, setFileCheckedLevels] = useState< - Array> - >([]); - const [isUpdatingFromMainCheckbox, setIsUpdatingFromMainCheckbox] = - useState(false); - const [mainCheckboxChangeType, setMainCheckboxChangeType] = - useState(""); - - 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 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 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; - }); - }; - - const toggleExpand = (id: number) => { - setExpandedPolda((prev) => ({ - ...prev, - [id]: !prev[id], - })); - }; - - // 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; - }); - }; const options: Option[] = [ { id: "all", name: "SEMUA" }, @@ -707,22 +166,22 @@ export default function FormImageUpdate() { const [selectedTarget, setSelectedTarget] = useState( detail?.category.id ); - // const [unitSelection, setUnitSelection] = useState({ - // allUnit: false, - // mabes: false, - // polda: false, - // polres: false, - // }); + const [unitSelection, setUnitSelection] = useState({ + allUnit: false, + mabes: false, + polda: false, + polres: false, + }); let fileTypeId = "1"; const { getRootProps, getInputProps } = useDropzone({ onDrop: (acceptedFiles) => { + // setFiles(acceptedFiles.map((file) => Object.assign(file))); setFiles((prevFiles) => [ ...prevFiles, ...acceptedFiles.map((file) => Object.assign(file, { - id: uuidv4(), // generate unique id preview: URL.createObjectURL(file), }) ), @@ -733,23 +192,6 @@ export default function FormImageUpdate() { }, }); - // const { getRootProps, getInputProps } = useDropzone({ - // onDrop: (acceptedFiles) => { - // // setFiles(acceptedFiles.map((file) => Object.assign(file))); - // setFiles((prevFiles) => [ - // ...prevFiles, - // ...acceptedFiles.map((file) => - // Object.assign(file, { - // preview: URL.createObjectURL(file), - // }) - // ), - // ]); - // }, - // accept: { - // "image/*": [], - // }, - // }); - const { control, handleSubmit, @@ -913,33 +355,6 @@ export default function FormImageUpdate() { } }; - const [filePlacements, setFilePlacements] = useState([]); - - 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; - }; - const save = async (data: ImageSchema) => { loading(); const finalTags = tags.join(", "); @@ -959,37 +374,37 @@ export default function FormImageUpdate() { tags: finalTags, isYoutube: false, isInternationalMedia: false, - files: getPlacement(), }; - console.log("Form Data Submitted:", requestData); const response = await createMedia(requestData); + console.log("Form Data Submitted:", requestData); if (response?.error) { error(response?.message); return false; } - // Upload thumbnail const formMedia = new FormData(); const thumbnail = thumbnailFile || files[0]; formMedia.append("file", thumbnail); + const responseThumbnail = await uploadThumbnail(id, formMedia); - if (responseThumbnail?.error) { + if (responseThumbnail?.error == true) { error(responseThumbnail?.message); return false; } - // Upload files (progress) - const progressInfoArr = files.map((item) => ({ - percentage: 0, - fileName: item.name, - })); + const progressInfoArr = []; + for (const item of files) { + progressInfoArr.push({ percentage: 0, fileName: item.name }); + } + progressInfo = progressInfoArr; setIsStartUpload(true); setProgressList(progressInfoArr); close(); - + // showProgress(); + console.log("files:", files); files.map(async (item: any, index: number) => { await uploadResumableFile( index, @@ -1251,282 +666,64 @@ export default function FormImageUpdate() { } const [tempFile, setTempFile] = useState([]); + const [filePlacements, setFilePlacements] = useState([]); - const setupPlacement = ( - index: number, - placement: string, - checked: boolean - ) => { - let temp = [...filePlacements]; - if (checked) { - if (placement === "all") { - temp[index] = ["all", "mabes", "polda", "international"]; + const setupPlacement = (id: number | string, placement: PlacementType) => { + console.log(`FileDestination.leng:: ${id}_${placement}`); + const arrayFile: FilePlacement[] = []; - // Update fileCheckedLevels untuk sinkronisasi dengan modal ketika "all" diklik - setFileCheckedLevels((prevLevels) => { - const newArray = [...prevLevels]; - const currentFileLevels = new Set( - newArray[index] || new Set() - ); + for (let i = 0; i < tempFile?.length; i++) { + const element = tempFile[i]; - // 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 (element.id == id) { + const findPlacementIdx = filePlacements.findIndex( + (o) => Number(o.mediaFileId) === Number(id) ); - 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() - ); + if (findPlacementIdx > -1) { + const findPlacement = filePlacements[findPlacementIdx]; - // 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; + if (findPlacement?.placements?.includes(placement)) { + if (placement === "all") { + findPlacement.placements = undefined; + } else { + findPlacement.placements = findPlacement.placements.filter( + (val) => val !== placement + ); + if (findPlacement.placements?.includes("all")) { + findPlacement.placements = findPlacement.placements.filter( + (val) => val !== "all" + ); + } + } + } else if (placement === "all") { + findPlacement.placements = [ + "all", + "mabes", + "polda", + "international", + ]; + } else if (findPlacement.placements) { + findPlacement.placements = [...findPlacement.placements, placement]; + } else { + findPlacement.placements = [placement]; } + } else { + const file: FilePlacement = { + mediaFileId: Number(element.id), + placements: [placement], + }; + + arrayFile.push(file); } } } - setFilePlacements(temp); - // Update checklist levels di modal berdasarkan placement yang diubah - updateModalChecklistLevels(index, placement, checked); + const finalPlacements = [...filePlacements, ...arrayFile]; + setFilePlacements(finalPlacements); + console.log("FileDestination.leng::", finalPlacements); }; - // 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; - }); - }; - - // const setupPlacement = (id: number | string, placement: PlacementType) => { - // console.log(`FileDestination.leng:: ${id}_${placement}`); - // const arrayFile: FilePlacement[] = []; - - // for (let i = 0; i < tempFile?.length; i++) { - // const element = tempFile[i]; - - // if (element.id == id) { - // const findPlacementIdx = filePlacements.findIndex( - // (o) => Number(o.mediaFileId) === Number(id) - // ); - - // if (findPlacementIdx > -1) { - // const findPlacement = filePlacements[findPlacementIdx]; - - // if (findPlacement?.placements?.includes(placement)) { - // if (placement === "all") { - // findPlacement.placements = undefined; - // } else { - // findPlacement.placements = findPlacement.placements.filter( - // (val) => val !== placement - // ); - // if (findPlacement.placements?.includes("all")) { - // findPlacement.placements = findPlacement.placements.filter( - // (val) => val !== "all" - // ); - // } - // } - // } else if (placement === "all") { - // findPlacement.placements = [ - // "all", - // "mabes", - // "polda", - // "international", - // ]; - // } else if (findPlacement.placements) { - // findPlacement.placements = [...findPlacement.placements, placement]; - // } else { - // findPlacement.placements = [placement]; - // } - // } else { - // const file: FilePlacement = { - // mediaFileId: Number(element.id), - // placements: [placement], - // }; - - // arrayFile.push(file); - // } - // } - // } - - // const finalPlacements = [...filePlacements, ...arrayFile]; - // setFilePlacements(finalPlacements); - // console.log("FileDestination.leng::", finalPlacements); - // }; - const handleCheckboxChangeImage = (fileId: number, value: string) => { setSelectedOptions((prev: any) => { const currentSelections = prev[fileId] || []; @@ -1742,7 +939,7 @@ export default function FormImageUpdate() { ) : null} {files.length > 0 && ( -
+
)} - {/* {files.length > 0 && ( -
- -
- {files.map((file: any, index: any) => ( -
- {file.fileName} -
- -
-
- - Pengaturan Distribusi -
- -
-
-

- 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) - ); - }} - /> - -
- ))} -
-
- - {fileUnitSelections[index]?.wilayah && ( -
-

- Detail Wilayah: -

- -
- {[ - { 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) - ); - }} - /> - -
- ))} - -
- - - - - - - - Daftar Wilayah POLDA dan - POLRES - - -
- {listDest.map( - (polda: any) => ( -
-
- - {polda.subDestination && ( - - )} -
- - {polda.subDestination && - expandedPolda[ - polda.id - ] && ( -
-
- {(() => { - const allSubItemsChecked = - polda.subDestination?.every( - ( - sub: any - ) => - fileCheckedLevels[ - index - ]?.has( - Number( - sub.id - ) - ) - ); - return ( - - ); - })()} -
-
- {polda.subDestination.map( - ( - sub: any - ) => ( - - ) - )} -
-
- )} -
- ) - )} -
-
- - - - - - -
-
-
-
-
-
- )} -
-
-
-
- ))} -
-
- )} */} @@ -2381,3 +1214,2388 @@ export default function FormImageUpdate() { ); } + +// Yang EROR +// "use client"; +// import React, { +// ChangeEvent, +// Fragment, +// 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, useRouter } 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 { register } from "module"; +// import { Switch } from "@/components/ui/switch"; +// import Cookies from "js-cookie"; +// import { +// createMedia, +// deleteFile, +// deleteMedia, +// getTagsBySubCategoryId, +// listEnableCategory, +// uploadThumbnail, +// } from "@/service/content/content"; +// import { detailMedia } from "@/service/curated-content/curated-content"; +// import { Badge } from "@/components/ui/badge"; +// import { CloudUpload, MailIcon } from "lucide-react"; +// import dynamic from "next/dynamic"; +// import { useDropzone } from "react-dropzone"; +// import { Icon } from "@iconify/react/dist/iconify.js"; +// import Image from "next/image"; +// import { error, loading } from "@/lib/swal"; +// import { getCsrfToken } from "@/service/auth"; +// import { Upload } from "tus-js-client"; +// import { useTranslations } from "next-intl"; +// import { htmlToString } from "@/utils/globals"; +// import { getUserLevelForAssignments } from "@/service/task"; +// import { +// Dialog, +// DialogClose, +// DialogContent, +// DialogHeader, +// DialogTitle, +// DialogTrigger, +// } from "@/components/ui/dialog"; +// import { v4 as uuidv4 } from "uuid"; + +// 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 PlacementType = "all" | "mabes" | "polda" | "international" | string; + +// interface FilePlacement { +// mediaFileId: number; +// placements?: PlacementType[]; +// } + +// interface TempFileItem { +// id: number | string; +// } + +// type Detail = { +// id: string; +// title: string; +// description: string; +// htmldescription: string; +// slug: string; +// categoryId: number; +// category: { +// id: string; +// name: string; +// }; +// publishedFor: string; + +// publishedForObject: { +// id: number; +// name: string; +// }; +// creatorName: string; +// categoryName: string; +// thumbnailLink: string; +// tags: string; +// }; + +// type Option = { +// id: string; +// name: string; +// }; + +// const CustomEditor = dynamic( +// () => { +// return import("@/components/editor/custom-editor"); +// }, +// { ssr: false } +// ); + +// interface FileWithPreview extends File { +// id: string; +// preview: string; +// } + +// interface Destination { +// id: string; +// name: string; +// subDestination?: SubDestination[]; +// } + +// interface SubDestination { +// id: string; +// name: string; +// } + +// export default function FormImageUpdate() { +// const MySwal = withReactContent(Swal); +// const router = useRouter(); +// const { id } = useParams() as { id: string }; +// console.log(id); +// const editor = useRef(null); +// type ImageSchema = z.infer; +// let progressInfo: any = []; +// let counterUpdateProgress = 0; +// const [progressList, setProgressList] = useState([]); +// let uploadPersen = 0; +// const [isStartUpload, setIsStartUpload] = useState(false); +// const [counterProgress, setCounterProgress] = useState(0); +// const t = useTranslations("Form"); +// const [selectedFiles, setSelectedFiles] = useState([]); +// const taskId = Cookies.get("taskId"); +// const scheduleId = Cookies.get("scheduleId"); +// const scheduleType = Cookies.get("scheduleType"); +// 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 [articleBody, setArticleBody] = useState(""); +// const [files, setFiles] = useState([]); +// const [filesTemp, setFilesTemp] = useState([]); +// const [publishedFor, setPublishedFor] = useState([]); +// const [thumbnailFile, setThumbnailFile] = useState(null); +// const inputRef = useRef(null); +// const [selectedOptions, setSelectedOptions] = useState<{ +// [fileId: number]: string[]; +// }>({}); + +// const handleThumbnailChange = (e: React.ChangeEvent) => { +// const file = e.target.files?.[0]; +// if (file) { +// setThumbnailFile(file); +// } +// }; +// const [fileUnitSelections, setFileUnitSelections] = useState< +// Array<{ +// semua: boolean; +// nasional: boolean; +// wilayah: boolean; +// international: boolean; +// polda: boolean; +// polres: boolean; +// satker: boolean; +// }> +// >([]); +// // 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 [checkedLevels, setCheckedLevels] = useState>(new Set()); +// const [listDest, setListDest] = useState([]); +// const [isLoading, setIsLoading] = useState(false); +// const [expandedPolda, setExpandedPolda] = useState>( +// {} +// ); +// const [fileCheckedLevels, setFileCheckedLevels] = useState< +// Array> +// >([]); +// const [isUpdatingFromMainCheckbox, setIsUpdatingFromMainCheckbox] = +// useState(false); +// const [mainCheckboxChangeType, setMainCheckboxChangeType] = +// useState(""); + +// 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 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 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; +// }); +// }; + +// const toggleExpand = (id: number) => { +// setExpandedPolda((prev) => ({ +// ...prev, +// [id]: !prev[id], +// })); +// }; + +// // 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; +// }); +// }; + +// const options: Option[] = [ +// { id: "all", name: "SEMUA" }, +// { id: "5", name: "UMUM" }, +// { id: "6", name: "JOURNALIS" }, +// { id: "7", name: "POLRI" }, +// { id: "8", name: "KSP" }, +// ]; + +// const [selectedTarget, setSelectedTarget] = useState( +// detail?.category.id +// ); +// // const [unitSelection, setUnitSelection] = useState({ +// // allUnit: false, +// // mabes: false, +// // polda: false, +// // polres: false, +// // }); + +// let fileTypeId = "1"; + +// const { getRootProps, getInputProps } = useDropzone({ +// onDrop: (acceptedFiles) => { +// setFiles((prevFiles) => [ +// ...prevFiles, +// ...acceptedFiles.map((file) => +// Object.assign(file, { +// id: uuidv4(), // generate unique id +// preview: URL.createObjectURL(file), +// }) +// ), +// ]); +// }, +// accept: { +// "image/*": [], +// }, +// }); + +// // const { getRootProps, getInputProps } = useDropzone({ +// // onDrop: (acceptedFiles) => { +// // // setFiles(acceptedFiles.map((file) => Object.assign(file))); +// // setFiles((prevFiles) => [ +// // ...prevFiles, +// // ...acceptedFiles.map((file) => +// // Object.assign(file, { +// // preview: URL.createObjectURL(file), +// // }) +// // ), +// // ]); +// // }, +// // accept: { +// // "image/*": [], +// // }, +// // }); + +// const { +// control, +// handleSubmit, +// setValue, +// formState: { errors }, +// } = useForm({ +// resolver: zodResolver(imageSchema), +// }); + +// useEffect(() => { +// async function initState() { +// getCategories(); +// } + +// initState(); +// }, []); + +// const handleAddTag = (e: React.KeyboardEvent) => { +// if (e.key === "Enter" && e.currentTarget.value.trim()) { +// e.preventDefault(); +// const newTag = e.currentTarget.value.trim(); +// if (!tags.includes(newTag)) { +// setTags((prevTags) => [...prevTags, newTag]); +// if (inputRef.current) { +// inputRef.current.value = ""; +// } +// } +// } +// }; + +// const handleRemoveTag = (index: number) => { +// setTags((prevTags) => prevTags.filter((_, i) => i !== index)); +// }; + +// const handleEditTag = (index: number, newValue: string) => { +// setTags((prevTags) => +// prevTags.map((tag, i) => (i === index ? newValue : tag)) +// ); +// }; + +// const getCategories = async () => { +// try { +// const category = await listEnableCategory(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); +// } +// }; + +// useEffect(() => { +// async function initState() { +// if (id) { +// const response = await detailMedia(id); +// const details = response?.data?.data; + +// setDetail(details); + +// setSelectedTarget(String(details.category.id)); +// setTempFile(details?.files); + +// setValue("title", details.title); +// setValue("description", details.htmlDescription); +// setValue("creatorName", details.creatorName); + +// setTimeout(() => { +// setValue("title", details.title); +// setValue("description", details.htmlDescription); +// setValue("creatorName", details.creatorName); +// }, 500); + +// if (details?.files) { +// setFiles(details.files); + +// const initialOptions: { [key: number]: string[] } = {}; +// details.files.forEach((file: any) => { +// if (file.placements) { +// initialOptions[file.id] = mapPlacementsToOptions(file.placements); +// } +// }); +// setSelectedOptions(initialOptions); +// } + +// if (details?.files) { +// const formattedFiles = details.files.map((file: any) => ({ +// ...file, +// id: file.id, +// fileName: file.fileName, +// size: file.size, +// thumbnailFileUrl: file.thumbnailFileUrl, +// url: file.url, +// })); + +// setFiles(formattedFiles); +// } + +// if (details?.publishedFor) { +// // Split string "7" to an array ["7"] if needed +// setPublishedFor(details.publishedFor.split(",")); +// } + +// if (details?.tags) { +// setTags(details.tags.split(",").map((tag: string) => tag.trim())); +// } +// } +// } +// initState(); +// }, [id, setValue]); + +// const mapPlacementsToOptions = (placements: string): string[] => { +// const mapping: Record = { +// all: "all", +// mabes: "nasional", +// polda: "wilayah", +// polres: "internasional", +// }; + +// if (placements.trim() === "all") { +// return ["all", "nasional", "wilayah", "internasional"]; +// } + +// const options = placements +// .split(",") +// .map((p) => mapping[p.trim()]) +// .filter(Boolean); + +// const allSelected = ["nasional", "wilayah", "internasional"].every((opt) => +// options.includes(opt) +// ); + +// return allSelected ? ["all", ...options] : options; +// }; + +// const handleCheckboxChange = (id: string) => { +// if (id === "all") { +// const allOptions = options +// .filter((opt) => opt.id !== "all") +// .map((opt) => opt.id); +// setPublishedFor( +// publishedFor.length === allOptions.length ? [] : allOptions +// ); +// } else { +// setPublishedFor((prev) => +// prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id] +// ); +// } +// }; + +// const [filePlacements, setFilePlacements] = useState([]); + +// 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; +// }; + +// const save = async (data: ImageSchema) => { +// loading(); +// const finalTags = tags.join(", "); +// const requestData = { +// ...data, +// id: detail?.id, +// title: data.title, +// description: htmlToString(data.description), +// htmlDescription: data.description, +// fileTypeId, +// categoryId: selectedTarget, +// subCategoryId: selectedTarget, +// uploadedBy: "2b7c8d83-d298-4b19-9f74-b07924506b58", +// statusId: "1", +// publishedFor: publishedFor.join(","), +// creatorName: data.creatorName, +// tags: finalTags, +// isYoutube: false, +// isInternationalMedia: false, +// files: getPlacement(), +// }; + +// console.log("Form Data Submitted:", requestData); +// const response = await createMedia(requestData); +// if (response?.error) { +// error(response?.message); +// return false; +// } + +// // Upload thumbnail +// const formMedia = new FormData(); +// const thumbnail = thumbnailFile || files[0]; +// formMedia.append("file", thumbnail); +// const responseThumbnail = await uploadThumbnail(id, formMedia); + +// if (responseThumbnail?.error) { +// error(responseThumbnail?.message); +// return false; +// } + +// // Upload files (progress) +// const progressInfoArr = files.map((item) => ({ +// percentage: 0, +// fileName: item.name, +// })); +// setIsStartUpload(true); +// setProgressList(progressInfoArr); + +// close(); + +// files.map(async (item: any, index: number) => { +// await uploadResumableFile( +// index, +// String(id), +// item, +// fileTypeId == "2" || fileTypeId == "4" ? item.duration : "0" +// ); +// }); + +// MySwal.fire({ +// title: "Sukses", +// text: "Data berhasil disimpan.", +// icon: "success", +// confirmButtonColor: "#3085d6", +// confirmButtonText: "OK", +// }).then(() => { +// router.push("/in/contributor/content/image"); +// }); +// }; + +// async function uploadResumableFile( +// idx: number, +// id: string, +// file: any, +// duration: string +// ) { +// console.log(idx, id, file, duration); + +// // const placements = getPlacement(file.placements); +// // console.log("Placementttt: : ", placements); + +// const resCsrf = await getCsrfToken(); +// const csrfToken = resCsrf?.data?.token; +// console.log("CSRF TOKEN : ", csrfToken); +// const headers = { +// "X-XSRF-TOKEN": csrfToken, +// }; + +// if (!file.secondaryUrl || file.secondaryUrl == "") { +// const upload = new Upload(file, { +// endpoint: `${process.env.NEXT_PUBLIC_API}/media/file/upload`, +// headers: headers, +// retryDelays: [0, 3000, 6000, 12_000, 24_000], +// chunkSize: 20_000, +// metadata: { +// mediaid: id, +// filename: file.name, +// filetype: file.type, +// duration, +// isWatermark: "true", +// }, +// onBeforeRequest: function (req) { +// var xhr = req.getUnderlyingObject(); +// xhr.withCredentials = true; +// }, +// onError: async (e: any) => { +// console.log("Error upload :", e); +// error(e); +// }, +// onChunkComplete: ( +// chunkSize: any, +// bytesAccepted: any, +// bytesTotal: any +// ) => { +// const uploadPersen = Math.floor((bytesAccepted / bytesTotal) * 100); +// progressInfo[idx].percentage = uploadPersen; +// counterUpdateProgress++; +// console.log(counterUpdateProgress); +// setProgressList(progressInfo); +// setCounterProgress(counterUpdateProgress); +// }, +// onSuccess: async () => { +// uploadPersen = 100; +// progressInfo[idx].percentage = 100; +// counterUpdateProgress++; +// setCounterProgress(counterUpdateProgress); +// successTodo(); +// }, +// }); + +// upload.start(); +// } +// } + +// const onSubmit = (data: ImageSchema) => { +// MySwal.fire({ +// title: "Simpan Data", +// text: "Apakah Anda yakin ingin menyimpan data ini?", +// icon: "warning", +// showCancelButton: true, +// cancelButtonColor: "#d33", +// confirmButtonColor: "#3085d6", +// confirmButtonText: "Simpan", +// }).then((result) => { +// if (result.isConfirmed) { +// save(data); +// } +// }); +// }; + +// const successSubmit = (redirect: string) => { +// MySwal.fire({ +// title: "Sukses", +// text: "Data berhasil disimpan.", +// icon: "success", +// confirmButtonColor: "#3085d6", +// confirmButtonText: "OK", +// }).then(() => { +// router.push(redirect); +// }); +// }; + +// function successTodo() { +// let counter = 0; +// for (const element of progressInfo) { +// if (element.percentage == 100) { +// counter++; +// } +// } +// if (counter == progressInfo.length) { +// setIsStartUpload(false); +// // hideProgress(); +// Cookies.remove("idCreate"); +// successSubmit("/in/contributor/content/image/"); +// } +// } + +// const handleRemoveAllFiles = () => { +// setFiles([]); +// }; + +// // const renderFilePreview = (file: FileWithPreview) => { +// // if (file?.type?.startsWith("image")) { +// // return ( +// // {file.name} +// // ); +// // } else { +// // return ; +// // } +// // }; + +// const renderFilePreview = (file: FileWithPreview | any) => { +// if (file?.preview || file instanceof File) { +// return ( +// {file.name} +// ); +// } else if (file.thumbnailFileUrl) { +// return ( +// {file.fileName} +// ); +// } else { +// return ; +// } +// }; + +// const handleRemoveFile = (file: FileWithPreview) => { +// const uploadedFiles = files; +// const filtered = uploadedFiles.filter((i) => i.name !== file.name); +// setFiles([...filtered]); +// }; + +// // const fileList = files.map((file: any) => ( +// //
+// //
+// //
{renderFilePreview(file)}
+// //
+// //
+// // {file.fileName || file.name} +// //
+// //
+// // {Math.round(file.size / 100) / 10 > 1000 ? ( +// // <>{(Math.round(file.size / 100) / 10000).toFixed(1)} +// // ) : ( +// // <>{(Math.round(file.size / 100) / 10).toFixed(1)} +// // )} +// // {" kb"} +// //
+// //
+// //
+ +// // +// //
+// // )); + +// const fileList = files.map((file: any) => ( +//
+//
+//
{renderFilePreview(file)}
+//
+//
+// {file.fileName || file.name} +//
+//
+// {Math.round(file.size / 100) / 10 > 1000 ? ( +// <>{(Math.round(file.size / 100) / 10000).toFixed(1)} +// ) : ( +// <>{(Math.round(file.size / 100) / 10).toFixed(1)} +// )} +// {" kb"} +//
+//
+//
+ +// +//
+// )); +// type PlacementType = "all" | "mabes" | "polda" | "international" | string; + +// interface FilePlacement { +// mediaFileId: number; +// placements?: PlacementType[]; +// } + +// interface TempFileItem { +// id: number | string; +// // tambahkan properti lain kalau ada +// } + +// const [tempFile, setTempFile] = useState([]); + +// 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; +// }); +// }; + +// // const setupPlacement = (id: number | string, placement: PlacementType) => { +// // console.log(`FileDestination.leng:: ${id}_${placement}`); +// // const arrayFile: FilePlacement[] = []; + +// // for (let i = 0; i < tempFile?.length; i++) { +// // const element = tempFile[i]; + +// // if (element.id == id) { +// // const findPlacementIdx = filePlacements.findIndex( +// // (o) => Number(o.mediaFileId) === Number(id) +// // ); + +// // if (findPlacementIdx > -1) { +// // const findPlacement = filePlacements[findPlacementIdx]; + +// // if (findPlacement?.placements?.includes(placement)) { +// // if (placement === "all") { +// // findPlacement.placements = undefined; +// // } else { +// // findPlacement.placements = findPlacement.placements.filter( +// // (val) => val !== placement +// // ); +// // if (findPlacement.placements?.includes("all")) { +// // findPlacement.placements = findPlacement.placements.filter( +// // (val) => val !== "all" +// // ); +// // } +// // } +// // } else if (placement === "all") { +// // findPlacement.placements = [ +// // "all", +// // "mabes", +// // "polda", +// // "international", +// // ]; +// // } else if (findPlacement.placements) { +// // findPlacement.placements = [...findPlacement.placements, placement]; +// // } else { +// // findPlacement.placements = [placement]; +// // } +// // } else { +// // const file: FilePlacement = { +// // mediaFileId: Number(element.id), +// // placements: [placement], +// // }; + +// // arrayFile.push(file); +// // } +// // } +// // } + +// // const finalPlacements = [...filePlacements, ...arrayFile]; +// // setFilePlacements(finalPlacements); +// // console.log("FileDestination.leng::", finalPlacements); +// // }; + +// const handleCheckboxChangeImage = (fileId: number, value: string) => { +// setSelectedOptions((prev: any) => { +// const currentSelections = prev[fileId] || []; +// if (value === "all") { +// if (currentSelections.includes("all")) { +// return { ...prev, [fileId]: [] }; +// } +// return { +// ...prev, +// [fileId]: ["all", "nasional", "wilayah", "internasional"], +// }; +// } else { +// const updatedSelections = currentSelections.includes(value) +// ? currentSelections.filter((option: any) => option !== value) +// : [...currentSelections, value]; + +// const isAllSelected = ["nasional", "wilayah", "internasional"].every( +// (opt) => updatedSelections.includes(opt) +// ); +// return { +// ...prev, +// [fileId]: isAllSelected +// ? ["all", ...updatedSelections] +// : updatedSelections.filter((opt: any) => opt !== "all"), +// }; +// } +// }); +// }; + +// function success() { +// MySwal.fire({ +// title: "Sukses", +// icon: "success", +// confirmButtonColor: "#3085d6", +// confirmButtonText: "OK", +// }).then((result) => { +// if (result.isConfirmed) { +// // window.location.reload(); +// } +// }); +// } + +// const handleDeleteFile = (id: number) => { +// MySwal.fire({ +// title: "Hapus file", +// text: "Apakah Anda yakin ingin menghapus file ini?", +// icon: "warning", +// showCancelButton: true, +// cancelButtonColor: "#3085d6", +// confirmButtonColor: "#d33", +// confirmButtonText: "Hapus", +// }).then((result) => { +// if (result.isConfirmed) { +// doDelete(id); +// } +// }); +// }; + +// async function doDelete(id: number) { +// const data = { id }; + +// try { +// const response = await deleteFile(data); +// if (response?.error) { +// error(response.message); +// return; +// } +// setFiles((prevFiles: any) => +// prevFiles.filter((file: any) => file.id !== id) +// ); +// success(); +// } catch (err) { +// error("Terjadi kesalahan saat menghapus file"); +// } +// } + +// return ( +//
+// {detail !== undefined ? ( +//
+// +//
+//

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

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

+// {errors.title.message} +//

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

+// {errors.description.message} +//

+// )} +//
+//
+// +// {/* */} +// +//
+// +//
+// +//

+// {/* Drop files here or click to upload. */} +// {t("drag-file", { defaultValue: "Drag File" })} +//

+//
+// {t("upload-file-max", { +// defaultValue: "Upload File Max", +// })} +//
+//
+//
+// {files.length ? ( +// +//
{fileList}
+//
+//
+// +//
+// +//
+//
+// {/* */} +//
+//
+// ) : null} +// {files.length > 0 && ( +//
+// +//
+// {files.map((file: any) => ( +//
+// {file.fileName} +//
+// +//
+// +//
+//
+// +//
+//
+// +//
+//
+// +//
+//
+//
+// ))} +//
+//
+// )} +// {/* {files.length > 0 && ( +//
+// +//
+// {files.map((file: any, index: any) => ( +//
+// {file.fileName} +//
+// +//
+//
+// +// Pengaturan Distribusi +//
+ +//
+//
+//

+// 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) +// ); +// }} +// /> +// +//
+// ))} +//
+//
+ +// {fileUnitSelections[index]?.wilayah && ( +//
+//

+// Detail Wilayah: +//

+ +//
+// {[ +// { 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) +// ); +// }} +// /> +// +//
+// ))} + +//
+// +// +// +// +// +// +// +// Daftar Wilayah POLDA dan +// POLRES +// +// +//
+// {listDest.map( +// (polda: any) => ( +//
+//
+// +// {polda.subDestination && ( +// +// )} +//
+ +// {polda.subDestination && +// expandedPolda[ +// polda.id +// ] && ( +//
+//
+// {(() => { +// const allSubItemsChecked = +// polda.subDestination?.every( +// ( +// sub: any +// ) => +// fileCheckedLevels[ +// index +// ]?.has( +// Number( +// sub.id +// ) +// ) +// ); +// return ( +// +// ); +// })()} +//
+//
+// {polda.subDestination.map( +// ( +// sub: any +// ) => ( +// +// ) +// )} +//
+//
+// )} +//
+// ) +// )} +//
+//
+// +// +// +// +// +// +//
+//
+//
+//
+//
+//
+// )} +//
+//
+//
+//
+// ))} +//
+//
+// )} */} +//
+//
+//
+//
+//
+//
+// +//
+//
+// +// ( +// +// )} +// /> +// {errors.creatorName?.message && ( +//

+// {errors.creatorName.message} +//

+// )} +//
+//
+// {/*
+// +// +// Thumbnail Gambar Utama +// +//
*/} +//
+// + +// { +// const file = e.target.files?.[0]; +// if (file) { +// setThumbnailFile(file); +// } +// }} +// className="dark:border dark:border-gray-500 dark:rounded-lg" +// /> + +// +// Thumbnail Preview +// +//
+ +//
+//
+// +// +//
+// {tags.map((tag, index) => ( +// +// handleEditTag(index, e.target.value)} +// className="bg-black text-white border-none focus:outline-none w-auto" +// /> +// +// +// ))} +//
+// {/*
+// {detail?.tags?.split(",").map((tag, index) => ( +// +// {tag.trim()} +// +// ))} +//
*/} +//
+//
+//
+//
+// +// {options.map((option: Option) => ( +//
+// opt.id !== "all").length +// : publishedFor.includes(option.id) +// } +// onCheckedChange={() => handleCheckboxChange(option.id)} +// /> +// +//
+// ))} +//
+//
+//
+// +//

+// {t("suggestion-box", { defaultValue: "Suggestion Box" })} (0) +//

+//
+//
+//

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

+// {/*

{detail?.status}

*/} +//
+//
+//
+//
+// +//
+//
+// +//
+//
+//
+//
+// ) : ( +// "" +// )} +//
+// ); +// } diff --git a/lib/menus.ts b/lib/menus.ts index d6bd7912..17cbef5c 100644 --- a/lib/menus.ts +++ b/lib/menus.ts @@ -3214,9 +3214,9 @@ export function getMenuList(pathname: string, t: any): Group[] { children: [], }, { - href: "/supervisor/ticketing/4", + href: "/supervisor/ticketing/3", label: "Instagram", - active: pathname.includes("/ticketing/4"), + active: pathname.includes("/ticketing/3"), icon: "ri:chat-private-line", children: [], }, @@ -3230,73 +3230,73 @@ export function getMenuList(pathname: string, t: any): Group[] { { href: "/supervisor/ticketing/5", label: "Youtube", - active: pathname.includes("/ticketing/youtube"), + active: pathname.includes("/ticketing/5"), icon: "ri:share-forward-2-fill", children: [], }, + // { + // href: "/", + // label: "Tiktok", + // active: pathname.includes("/ticketing/tiktok"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "Kolom Komentar", + // active: pathname.includes("/ticketing/comment"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "Hubungi Kami", + // active: pathname.includes("/ticketing/contact-us"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "Play Store", + // active: pathname.includes("/ticketing/play-store"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "App Store", + // active: pathname.includes("/ticketing/app-store"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "Web Humas", + // active: pathname.includes("/ticketing/web-humas"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, + // { + // href: "/", + // label: "e-PPID", + // active: pathname.includes("/ticketing/e-ppid"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, { - href: "/", - label: "Tiktok", - active: pathname.includes("/ticketing/tiktok"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "Kolom Komentar", - active: pathname.includes("/ticketing/comment"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "Hubungi Kami", - active: pathname.includes("/ticketing/contact-us"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "Play Store", - active: pathname.includes("/ticketing/play-store"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "App Store", - active: pathname.includes("/ticketing/app-store"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "Web Humas", - active: pathname.includes("/ticketing/web-humas"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "e-PPID", - active: pathname.includes("/ticketing/e-ppid"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", + href: "/supervisor/ticketing/6", label: "Emergency Issues", - active: pathname.includes("/ticketing/emergency-issues"), - icon: "ri:share-forward-2-fill", - children: [], - }, - { - href: "/", - label: "Campaignpool", - active: pathname.includes("/ticketing/campaignpool"), + active: pathname.includes("/ticketing/6"), icon: "ri:share-forward-2-fill", children: [], }, + // { + // href: "/", + // label: "Campaignpool", + // active: pathname.includes("/ticketing/campaignpool"), + // icon: "ri:share-forward-2-fill", + // children: [], + // }, ], }, ],