From 9fc973d15130fd95d94f824b075af3cdac9898e9 Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Tue, 19 Aug 2025 10:01:29 +0700 Subject: [PATCH] update : selection box user levels on agenda-settings and task --- .../agenda-setting/event-modal.tsx | 471 ++++++++++++++++-- components/form/task/task-form.tsx | 262 ++++++++-- 2 files changed, 638 insertions(+), 95 deletions(-) diff --git a/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx b/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx index 9840e9b4..57445c81 100644 --- a/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx +++ b/app/[locale]/(protected)/contributor/agenda-setting/event-modal.tsx @@ -108,8 +108,8 @@ const EventModal = ({ const router = useRouter(); const pathname = usePathname(); const [isLoading, setIsLoading] = useState(false); - const [checkedLevels, setCheckedLevels] = useState(new Set()); - const [expandedPolda, setExpandedPolda] = useState([{}]); + const [checkedLevels, setCheckedLevels] = useState>(new Set()); + const [expandedPolda, setExpandedPolda] = useState>({}); const [audioFile, setAudioFile] = useState(null); const [isRecording, setIsRecording] = useState(false); const [timer, setTimer] = useState(120); @@ -151,7 +151,13 @@ const EventModal = ({ satker: false, international: false, }); - const levelNumber = getCookiesDecrypt("ulne"); + + // State untuk melacak apakah perubahan berasal dari checkbox Jenis Agenda + const [isUpdatingFromJenisAgenda, setIsUpdatingFromJenisAgenda] = useState(false); + // State untuk melacak jenis perubahan spesifik + const [jenisAgendaChangeType, setJenisAgendaChangeType] = useState(""); + + const levelNumber = Number(getCookiesDecrypt("ulne")) || 0; const userLevelId = getCookiesDecrypt("ulie"); const poldaState = Cookies.get("state"); const [agendaType, setAgendaType] = React.useState(""); @@ -253,15 +259,242 @@ const EventModal = ({ fetchDetailData(); }, [event, setValue]); + // useEffect untuk sinkronisasi checkbox modal dengan Jenis Agenda + useEffect(() => { + if (listDest.length > 0 && isUpdatingFromJenisAgenda && jenisAgendaChangeType) { + syncModalWithJenisAgenda(); + } + }, [isUpdatingFromJenisAgenda, jenisAgendaChangeType]); + + // useEffect untuk update wilayahPublish ketika pilihan modal berubah + useEffect(() => { + if (!isUpdatingFromJenisAgenda && listDest.length > 0) { + updateWilayahPublishFromModal(); + } + }, [checkedLevels, isUpdatingFromJenisAgenda]); + + // Fungsi untuk update wilayahPublish berdasarkan checkbox modal + const updateWilayahPublishFromModal = () => { + // Hanya update jika tidak sedang dalam proses update dari Jenis Agenda + if (!isUpdatingFromJenisAgenda && 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) { + 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 arrays untuk backend + const newSelectedPolda = listDest + .filter((item: any) => + item.levelNumber === 2 && + item.name !== "SATKER POLRI" && + checkedLevels.has(Number(item.id)) + ) + .map((item: any) => String(item.id)); + + const newSelectedPolres: string[] = []; + listDest.forEach((item: any) => { + if (item.subDestination) { + item.subDestination.forEach((sub: any) => { + if (checkedLevels.has(Number(sub.id))) { + newSelectedPolres.push(String(sub.id)); + } + }); + } + }); + + const newSelectedSatker: string[] = []; + if (satkerItem) { + if (checkedLevels.has(Number(satkerItem.id))) { + newSelectedSatker.push(String(satkerItem.id)); + } + if (satkerItem.subDestination) { + satkerItem.subDestination.forEach((sub: any) => { + if (checkedLevels.has(Number(sub.id))) { + newSelectedSatker.push(String(sub.id)); + } + }); + } + } + + // Update state arrays + setSelectedPolda(newSelectedPolda); + setSelectedPolres(newSelectedPolres); + setSelectedSatker(newSelectedSatker); + + // Update wilayahPublish berdasarkan yang dipilih di modal + setWilayahPublish(prev => { + const newState = { ...prev }; + + // Update individual checkboxes + newState.polda = hasSelectedPolda; + newState.polres = hasSelectedPolres; + newState.satker = hasSelectedSatker; + + // Update checkbox "semua" berdasarkan level user + if (levelNumber === 1) { + // Level 1: semua checkbox harus aktif (nasional, polda, polres, satker, international) + newState.semua = newState.nasional && hasSelectedPolda && hasSelectedPolres && hasSelectedSatker && newState.international; + } else if (levelNumber === 2) { + // Level 2: hanya polres yang perlu aktif + newState.semua = hasSelectedPolres; + } else { + newState.semua = false; + } + + return newState; + }); + + // Update agendaType berdasarkan checkbox yang aktif + const selectedKeys = []; + if (hasSelectedPolda) selectedKeys.push(wilayahValueMap.polda); + if (hasSelectedPolres) selectedKeys.push(wilayahValueMap.polres); + if (hasSelectedSatker) selectedKeys.push(wilayahValueMap.satker); + + setAgendaType(selectedKeys.join(",")); + } + }; + + // Fungsi untuk sinkronisasi checkbox modal dengan Jenis Agenda + const syncModalWithJenisAgenda = () => { + // Hanya jalankan sinkronisasi jika perubahan berasal dari checkbox Jenis Agenda + if (isUpdatingFromJenisAgenda) { + const newCheckedLevels = new Set(checkedLevels); + + // Handle checklist actions - menambahkan semua item ke modal + if (jenisAgendaChangeType === "polda_checked") { + // Checklist semua polda + listDest.forEach((item: any) => { + if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { + newCheckedLevels.add(Number(item.id)); + } + }); + } else if (jenisAgendaChangeType === "polres_checked") { + // Checklist semua polres, tapi hanya yang poldanya sudah di-checklist + 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)); + }); + } + } + }); + } else if (jenisAgendaChangeType === "satker_checked") { + // Checklist satker + const satkerItem: any = listDest.find((item: any) => item.name === "SATKER POLRI"); + if (satkerItem) { + newCheckedLevels.add(Number(satkerItem.id)); + if (satkerItem.subDestination) { + satkerItem.subDestination.forEach((sub: any) => { + newCheckedLevels.add(Number(sub.id)); + }); + } + } + } + // Handle unchecklist actions - menghapus item dari modal + else if (jenisAgendaChangeType === "polres_unchecked") { + // Clear polres dari checkedLevels + listDest.forEach((item: any) => { + if (item.subDestination) { + item.subDestination.forEach((polres: any) => { + newCheckedLevels.delete(Number(polres.id)); + }); + } + }); + } else if (jenisAgendaChangeType === "polda_unchecked") { + // Clear polda dan polres dari checkedLevels + listDest.forEach((item: any) => { + if (item.levelNumber === 2 && item.name !== "SATKER POLRI") { + newCheckedLevels.delete(Number(item.id)); + // Juga clear polres dari polda ini + if (item.subDestination) { + item.subDestination.forEach((polres: any) => { + newCheckedLevels.delete(Number(polres.id)); + }); + } + } + }); + setWilayahPublish(prev => ({ ...prev, polres: false })); + } else if (jenisAgendaChangeType === "satker_unchecked") { + // Clear satker 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)); + }); + } + } + } + + setCheckedLevels(newCheckedLevels); + + // Reset flag setelah sinkronisasi selesai + setIsUpdatingFromJenisAgenda(false); + setJenisAgendaChangeType(""); + } + }; + useEffect(() => { setIsDatePickerOpen(false); }, [onClose]); + useEffect(() => { + async function fetchPoldaPolres() { + 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); + } catch (error) { + console.error("Error fetching Polda/Polres data:", error); + } + } + fetchPoldaPolres(); + }, []); + const handleCheckboxChange = (levelId: number) => { setCheckedLevels((prev) => { const updatedLevels = new Set(prev); - if (updatedLevels.has(levelId)) { + 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.subDestination.forEach((polres: any) => { + updatedLevels.delete(Number(polres.id)); + }); + } } else { updatedLevels.add(levelId); } @@ -279,6 +512,10 @@ const EventModal = ({ }; const toggleWilayah = (key: string) => { + // Set flag bahwa perubahan berasal dari checkbox Jenis Agenda + setIsUpdatingFromJenisAgenda(true); + setJenisAgendaChangeType(key + (wilayahPublish[key as keyof typeof wilayahPublish] ? "_unchecked" : "_checked")); + setWilayahPublish((prev: any) => { let newState = { ...prev }; if (key === "semua") { @@ -294,15 +531,96 @@ const EventModal = ({ if (newChecked) { setAgendaType("0,1,2,3,4,5"); + // Checklist semua item di modal ketika "semua" di-checklist + const allCheckedLevels = new Set(); + listDest.forEach((item: any) => { + allCheckedLevels.add(Number(item.id)); + if (item.subDestination) { + item.subDestination.forEach((sub: any) => { + allCheckedLevels.add(Number(sub.id)); + }); + } + }); + setCheckedLevels(allCheckedLevels); } else { setAgendaType(""); + // Clear semua pilihan modal ketika "semua" di-unchecklist + setCheckedLevels(new Set()); } return newState; } + // Validasi khusus untuk POLRES + if (key === "polres" && !prev[key]) { + // 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 + setIsUpdatingFromJenisAgenda(false); + setJenisAgendaChangeType(""); + return prev; // Batalkan perubahan + } + } + newState[key] = !prev[key]; - newState.semua = false; + + // Jika checkbox di-unchecklist, clear pilihan modal yang sesuai + if (prev[key]) { + const newCheckedLevels = new Set(checkedLevels); + if (key === "polda") { + // Clear polda dan polres + 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 (key === "polres") { + // Clear polres + listDest.forEach((item: any) => { + if (item.subDestination) { + item.subDestination.forEach((polres: any) => { + newCheckedLevels.delete(Number(polres.id)); + }); + } + }); + } else if (key === "satker") { + // Clear satker + 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)); + }); + } + } + } + setCheckedLevels(newCheckedLevels); + } + + // Update checkbox "semua" berdasarkan status semua checkbox lainnya + // Untuk level 1: semua, nasional, polda, polres, satker, international harus aktif + // Untuk level 2: semua, polres harus aktif + if (levelNumber === 1) { + newState.semua = newState.nasional && newState.polda && newState.polres && newState.satker && newState.international; + } else if (levelNumber === 2) { + newState.semua = newState.polres; + } else { + newState.semua = false; + } const selectedKeys = Object.entries(newState) .filter(([k, v]) => v && k !== "semua") @@ -452,7 +770,7 @@ const EventModal = ({ const onDeleteEventAction = async () => { try { - } catch (error) {} + } catch (error) { } }; const handleOpenDeleteModal = (eventId: string) => { @@ -632,7 +950,7 @@ const EventModal = ({ ); }; - const handleRemoveFile = (id: number) => {}; + const handleRemoveFile = (id: number) => { }; async function doDelete(id: any) { loading(); @@ -800,7 +1118,8 @@ const EventModal = ({ - {roleId === 1 && ( + {levelNumber === 1 && ( + <>
- )} -
Polda - {wilayahPublish.polda && ( - - setSelectedPolda(data) - } - /> - )}
- {(roleId === 1 || roleId === 4 || roleId === 3) && ( + + )} + + {(levelNumber === 1 || levelNumber === 2) && (
Polres - {wilayahPublish.polres && ( - - setSelectedPolres(data) - } - /> - )}
)} - {(roleId === 1 || roleId === 2) && ( + + {levelNumber === 1 && ( + <>
Satker - {wilayahPublish.satker && ( - - setSelectedSatker(data) - } - /> - )}
- )} - {roleId === 1 && (
+ )} + +
+ + + + + + + + Daftar Wilayah Polda dan Polres + + +
+ {listDest?.map((polda: any) => ( +
+ + {expandedPolda[polda.id] && ( +
+ + {polda?.subDestination?.map((polres: any) => ( + + ))} +
+ )} +
+ ))} +
+
+
+
@@ -1102,8 +1482,7 @@ const EventModal = ({ type="button" onClick={onPlayPause} disabled={isPlaying} - className={`flex items-center gap-2 ${ - isPlaying + className={`flex items-center gap-2 ${isPlaying ? "bg-gray-300 cursor-not-allowed" : "bg-primary text-white" } p-2 rounded`} diff --git a/components/form/task/task-form.tsx b/components/form/task/task-form.tsx index fa8ef43c..7a360d0d 100644 --- a/components/form/task/task-form.tsx +++ b/components/form/task/task-form.tsx @@ -122,7 +122,7 @@ export default function FormTask() { const [detail, setDetail] = useState(); const [refresh] = useState(false); // const [listDest, setListDest] = useState([]); - const [checkedLevels, setCheckedLevels] = useState(new Set()); + const [checkedLevels, setCheckedLevels] = useState>(new Set()); const [expandedPolda, setExpandedPolda] = useState([{}]); const [isLoading, setIsLoading] = useState(false); const [audioFile, setAudioFile] = useState(null); @@ -146,6 +146,12 @@ export default function FormTask() { polres: false, satker: false, }); + + // State untuk melacak apakah perubahan berasal dari checkbox Penerima Tugas + const [isUpdatingFromPenerimaTugas, setIsUpdatingFromPenerimaTugas] = useState(false); + // State untuk melacak jenis perubahan spesifik + const [penerimaTugasChangeType, setPenerimaTugasChangeType] = useState(""); + const [links, setLinks] = useState([""]); const { register, @@ -194,13 +200,26 @@ export default function FormTask() { const handleCheckboxChange = (levelId: number) => { setCheckedLevels((prev) => { const updatedLevels = new Set(prev); - if (updatedLevels.has(levelId)) { + 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); + if (poldaItem && poldaItem.subDestination) { + poldaItem.subDestination.forEach((polres: any) => { + updatedLevels.delete(Number(polres.id)); + }); + } } else { updatedLevels.add(levelId); } return updatedLevels; }); + + // Update unitSelection berdasarkan perubahan di modal + updateUnitSelectionFromModal(); }; const handlePoldaPolresChange = () => { @@ -211,6 +230,10 @@ export default function FormTask() { key: keyof typeof unitSelection, value: boolean ) => { + // Set flag bahwa perubahan berasal dari checkbox Penerima Tugas + setIsUpdatingFromPenerimaTugas(true); + setPenerimaTugasChangeType(key + (value ? "_checked" : "_unchecked")); + if (key === "allUnit") { const newState = { allUnit: value, @@ -220,8 +243,23 @@ export default function FormTask() { satker: value, }; setUnitSelection(newState); - console.log("QQQ", newState); } else { + // Validasi khusus untuk POLRES + if (key === "polres" && value) { + // Cek apakah ada POLDA yang sudah dichecklist di modal + const hasCheckedPolda = listDest.some((item: any) => + item.levelNumber === 2 && + item.name !== "SATKER POLRI" && + checkedLevels.has(Number(item.id)) + ); + + if (!hasCheckedPolda) { + // Jika tidak ada POLDA yang dichecklist di modal, tampilkan peringatan dan batalkan + alert("Harap pilih POLDA di Modal terlebih dahulu sebelum mengaktifkan checkbox POLRES."); + return; // Batalkan perubahan + } + } + const updatedSelection = { ...unitSelection, [key]: value, @@ -234,7 +272,6 @@ export default function FormTask() { updatedSelection.allUnit = allChecked; setUnitSelection(updatedSelection); - console.log("AAA", updatedSelection); } }; @@ -348,25 +385,141 @@ export default function FormTask() { } }; + // useEffect untuk sinkronisasi checkbox modal dengan Penerima Tugas useEffect(() => { - const updated = new Set(checkedLevels); - - if (unitSelection.polda) { - listDest.forEach((polda) => { - updated.add(polda.id); // hanya id polda - }); + if (listDest.length > 0) { + syncModalWithPenerimaTugas(); } + }, [unitSelection, listDest]); - if (unitSelection.polres) { - listDest.forEach((polda) => { - polda?.subDestination?.forEach((polres: any) => { - updated.add(polres.id); // hanya id polres + // Fungsi untuk update unitSelection berdasarkan checkbox modal + const updateUnitSelectionFromModal = () => { + setTimeout(() => { + // Hitung total item yang tersedia untuk setiap kategori + const totalPolda = listDest.filter((item: any) => + item.levelNumber === 2 && item.name !== "SATKER POLRI" + ).length; + + const totalPolres = listDest.reduce((total: number, item: any) => { + if (item.subDestination) { + return total + item.subDestination.length; + } + return total; + }, 0); + + const satkerItem = listDest.find((item: any) => item.name === "SATKER POLRI"); + const totalSatker = satkerItem ? (1 + (satkerItem.subDestination?.length || 0)) : 0; + + // Hitung item yang dichecklist untuk setiap kategori + 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) { + return total + item.subDestination.filter((sub: any) => checkedLevels.has(Number(sub.id))).length; + } + return total; + }, 0); + + const checkedSatkerCount = satkerItem ? ( + (checkedLevels.has(Number(satkerItem.id)) ? 1 : 0) + + (satkerItem.subDestination?.filter((sub: any) => checkedLevels.has(Number(sub.id))).length || 0) + ) : 0; + + // Checkbox hanya aktif jika SEMUA item dalam kategori tersebut dichecklist + const hasCheckedPolda = totalPolda > 0 && checkedPoldaCount === totalPolda; + const hasCheckedPolres = totalPolres > 0 && checkedPolresCount === totalPolres; + const hasCheckedSatker = totalSatker > 0 && checkedSatkerCount === totalSatker; + + // Update unitSelection berdasarkan checkbox yang aktif di modal + setUnitSelection(prev => ({ + ...prev, + polda: hasCheckedPolda, + polres: hasCheckedPolres, + satker: hasCheckedSatker, + // allUnit hanya true jika semua kategori terpenuhi + allUnit: hasCheckedPolda && hasCheckedPolres && hasCheckedSatker + })); + }, 0); + }; + + // Fungsi untuk sinkronisasi checkbox modal dengan Penerima Tugas + const syncModalWithPenerimaTugas = () => { + // Hanya jalankan sinkronisasi jika perubahan berasal dari checkbox Penerima Tugas + if (isUpdatingFromPenerimaTugas) { + // Khusus untuk unchecklist POLRES: hanya unchecklist polres, pertahankan polda + if (penerimaTugasChangeType === "polres_unchecked") { + const newCheckedLevels = new Set(checkedLevels); + + // Hapus semua polres dari modal, tapi pertahankan polda + listDest.forEach((item: any) => { + if (item.subDestination && item.levelNumber === 2 && item.name !== "SATKER POLRI") { + item.subDestination.forEach((polres: any) => { + newCheckedLevels.delete(Number(polres.id)); + }); + } }); - }); + + setCheckedLevels(newCheckedLevels); + } + // Untuk perubahan lainnya, jalankan logika normal + else if (unitSelection.polda || unitSelection.polres || unitSelection.satker) { + // Mulai dengan checkbox yang sudah ada untuk mempertahankan pilihan manual user + const newCheckedLevels = new Set(checkedLevels); + + listDest.forEach((item: any) => { + // Jika polda dichecklist, checklist semua polda (levelNumber 2, bukan SATKER POLRI) + if (unitSelection.polda && item.levelNumber === 2 && item.name !== "SATKER POLRI") { + newCheckedLevels.add(Number(item.id)); + } + + // Jika satker dichecklist, checklist SATKER POLRI dan sub-itemnya + if (unitSelection.satker && item.name === "SATKER POLRI") { + newCheckedLevels.add(Number(item.id)); + if (item.subDestination) { + item.subDestination.forEach((sub: any) => { + newCheckedLevels.add(Number(sub.id)); + }); + } + } + + // Jika polres dichecklist + if (unitSelection.polres && item.subDestination) { + // Jika checkbox POLDA di Penerima Tugas juga aktif, checklist semua polres + if (unitSelection.polda && item.levelNumber === 2 && item.name !== "SATKER POLRI") { + item.subDestination.forEach((polres: any) => { + newCheckedLevels.add(Number(polres.id)); + }); + } + // Jika checkbox POLDA di Penerima Tugas tidak aktif, tapi ada POLDA yang dichecklist di modal + else if (!unitSelection.polda && item.levelNumber === 2 && item.name !== "SATKER POLRI") { + // Cek apakah POLDA ini sudah dichecklist di modal + if (checkedLevels.has(Number(item.id))) { + // Jika ya, checklist semua polres dari POLDA ini + item.subDestination.forEach((polres: any) => { + newCheckedLevels.add(Number(polres.id)); + }); + } + } + } + }); + + setCheckedLevels(newCheckedLevels); + } else { + // Jika tidak ada unitSelection yang aktif, unchecklist semua item di modal + setCheckedLevels(new Set()); + } + + // Reset flag setelah sinkronisasi selesai + setTimeout(() => { + setIsUpdatingFromPenerimaTugas(false); + setPenerimaTugasChangeType(""); + }, 100); } - - setCheckedLevels(updated); - }, [unitSelection.polda, unitSelection.polres, listDest]); + }; const onSubmit = (data: TaskSchema) => { MySwal.fire({ @@ -604,7 +757,6 @@ export default function FormTask() {
{Object.keys(unitSelection).map((key) => { - const isDisabled = key === "polres" && !unitSelection.polda; return (
handleUnitChange( key as keyof typeof unitSelection, @@ -621,7 +772,7 @@ export default function FormTask() { } />
); @@ -639,30 +790,22 @@ export default function FormTask() { Daftar Wilayah Polda dan Polres
- {listDest.map((polda: any) => { - const poldaChecked = unitSelection.polda; // kontrol polda luar - const polresChecked = unitSelection.polres; // kontrol polres luar - - const isPoldaDisabled = poldaChecked; // lock checkbox polda dialog jika polda luar dicentang - const isPolresDisabled = polresChecked; // lock checkbox polres dialog jika polres luar dicentang - - return ( + {listDest.map((polda: any) => (
- {expandedPolda[polda.id] && (
+ {polda?.subDestination?.map((polres: any) => (
)}
- ); - })} + ))}