/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ // /* eslint-disable react-hooks/exhaustive-deps */ // /* eslint-disable @typescript-eslint/no-explicit-any */ // 'use client' // import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID'; // import colors from '@/con/colors'; // import { Box, Image, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; // import { OrganizationChart } from 'primereact/organizationchart'; // import { useEffect } from 'react'; // import { useProxy } from 'valtio/utils'; // import BackButton from '../../desa/layanan/_com/BackButto'; // function Page() { // return ( // // // // // Struktur PPID // // // ); // } // function StrukturOrganisasiPPID() { // const stateOrganisasi = useProxy(stateStrukturPPID.pegawai) // useEffect(() => { // stateOrganisasi.findMany.load() // }, []) // if (!stateOrganisasi.findMany.data || stateOrganisasi.findMany.data.length === 0) { // return ( // // // // ); // } // // Step 1: Group pegawai berdasarkan posisiId // const posisiMap = new Map(); // for (const pegawai of stateOrganisasi.findMany.data) { // const posisiId = pegawai.posisi.id; // if (!posisiMap.has(posisiId)) { // posisiMap.set(posisiId, { // ...pegawai.posisi, // pegawaiList: [], // children: [] // }); // } // posisiMap.get(posisiId)!.pegawaiList.push(pegawai); // } // // Step 2: Buat struktur pohon berdasarkan parentId // const root: any[] = []; // posisiMap.forEach((posisi) => { // if (posisi.parentId) { // const parent = posisiMap.get(posisi.parentId); // if (parent) { // parent.children.push(posisi); // } // } else { // root.push(posisi); // } // }); // // Step 3: Ubah struktur ke format OrganizationChart // function toOrgChartFormat(node: any): any { // return { // expanded: true, // type: 'person', // styleClass: 'p-person', // data: { // name: node.pegawaiList?.[0]?.namaLengkap || 'Tidak ada pegawai', // status: node.nama, // image: node.pegawaiList?.[0]?.image?.link || '/img/default.png' // }, // children: node.children.map(toOrgChartFormat) // }; // } // const chartData = root.map(toOrgChartFormat); // return ( // // // // // // ); // } // function nodeTemplate(node: any) { // const imageSrc = node?.data?.image || '/img/default.png'; // const name = node?.data?.name || 'Tanpa Nama'; // const status = node?.data?.status || 'Tidak ada deskripsi'; // return ( // // // {name} // {name} // {status} // // // ); // } // export default Page; 'use client' import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID' import { Box, Button, Card, Center, Container, Group, Image, Loader, Paper, Stack, Text, Title, Tooltip, Transition, } from '@mantine/core' import { IconRefresh, IconSearch, IconUsers } from '@tabler/icons-react' import { OrganizationChart } from 'primereact/organizationchart' import { useEffect } from 'react' import { useProxy } from 'valtio/utils' import BackButton from '../../desa/layanan/_com/BackButto' import colors from '@/con/colors' export default function Page() { return ( Struktur Organisasi PPID Gambaran visual peran dan pegawai yang ditugaskan. Arahkan kursor untuk melihat detail atau klik node untuk fokus tampilan. ) } function StrukturOrganisasiPPID() { const stateOrganisasi: any = useProxy(stateStrukturPPID.pegawai) useEffect(() => { void stateOrganisasi.findMany.load() }, []) const isLoading = !stateOrganisasi.findMany.data && stateOrganisasi.findMany.loading !== false if (isLoading) { return (
Memuat struktur organisasi… Mengambil data pegawai dan posisi. Mohon tunggu sebentar.
) } if ( !stateOrganisasi.findMany.data || stateOrganisasi.findMany.data.length === 0 ) { return (
Data pegawai belum tersedia Belum ada data pegawai yang tercatat untuk PPID. Silakan coba muat ulang atau periksa sumber data.
) } const posisiMap = new Map() for (const pegawai of stateOrganisasi.findMany.data) { const posisiId = pegawai.posisi.id if (!posisiMap.has(posisiId)) { posisiMap.set(posisiId, { ...pegawai.posisi, pegawaiList: [], children: [], }) } posisiMap.get(posisiId)!.pegawaiList.push(pegawai) } const root: any[] = [] posisiMap.forEach((posisi) => { if (posisi.parentId) { const parent = posisiMap.get(posisi.parentId) if (parent) { parent.children.push(posisi) } else { root.push(posisi) } } else { root.push(posisi) } }) function toOrgChartFormat(node: any): any { return { expanded: true, type: 'person', styleClass: 'p-person', data: { name: node.pegawaiList?.[0]?.namaLengkap || 'Belum ditugaskan', title: node.nama || 'Tanpa jabatan', image: node.pegawaiList?.[0]?.image?.link || '/img/default.png', description: node.deskripsi || '', positionId: node.id || null, }, children: node.children?.map(toOrgChartFormat) || [], } } const chartData = root.map(toOrgChartFormat) return ( ) } function nodeTemplate(node: any) { const imageSrc = node?.data?.image || '/img/default.png' const name = node?.data?.name || 'Tanpa Nama' const title = node?.data?.title || 'Tanpa Jabatan' const description = node?.data?.description || '' return ( {(styles) => ( {name} {name} {title} {description || 'Belum ada deskripsi.'} )} ) }