// interface SelectedMenu { // id: string; // module: string; // name: string; // id_parent: string; // order_number: number; // icon: string; // application: string; // status: string; // } import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components'; import { apiConfig } from '@/config/api.config'; import { useCallApi } from '@/hooks'; import { ColumnDef } from '@tanstack/react-table'; import React, { createContext, useCallback, useMemo, useState } from 'react'; import { Toaster } from 'sonner'; import ListToolbar from '../blocks/ListToolbar'; interface MenuProps { id: string; module: string; name: string; id_parent: string; order_number: number; icon: string; status: string; } const initialState = { id: '', module: '', name: '', link: '', id_parent: '', order_number: 0, icon: '', status: '' }; interface ContextProps { menus: MenuProps[]; showEditDialog: boolean; handleEditDialog: (show: boolean, selected_postoAdms: object | null) => void; showAddDialog: boolean; handleAddDialog: (show: boolean) => void; showDeleteDialog: boolean; handleDeleteDialog: (show: boolean, selected_postoAdms: object | null) => void; selectedMenu: object | null; getMenusLists: ( limit: number, page: number, with_deleted: boolean, order_field: any, order_direction: any ) => Promise<{ data: MenuProps[]; totalCount: number } | undefined>; setSelectedMenu: (data: object) => void; parents: any; } const initialProps: ContextProps = { menus: [], showAddDialog: false, handleAddDialog: (show: boolean) => {}, showEditDialog: false, handleEditDialog: (show: boolean, selected_menu: object | null) => {}, showDeleteDialog: false, handleDeleteDialog: (show: boolean, selected_menu: object | null) => {}, selectedMenu: initialState, getMenusLists: async () => ({ data: [], totalCount: 0 }), setSelectedMenu: (data: object) => {}, parents: [] }; const ManageMenusContext = createContext(initialProps); const API_URL = apiConfig.service_dashboard; const ManageMenusContextProvider = ({ children }: { children: React.ReactNode }) => { const [menus, setMenus] = useState([]); const [showAddDialog, setShowAddDialog] = useState(false); const [showEditDialog, setShowEditDialog] = useState(false); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [selectedMenu, setSelectedMenu] = useState(initialState); const [parents, setParents] = useState([]); const { GetData } = useCallApi(); const handleAddDialog = useCallback((show: boolean) => { setShowAddDialog(show); }, []); const handleEditDialog = useCallback((show: boolean, selected_menu: object | null) => { if (show) setSelectedMenu(selected_menu); setShowEditDialog(show); }, []); const handleDeleteDialog = useCallback((show: boolean, selected_menu: object | null) => { if (show) setSelectedMenu(selected_menu); setShowDeleteDialog(show); }, []); const columns = useMemo[]>( () => [ { accessorFn: (row) => row.module, id: 'module', header: ({ column }) => , enableSorting: true, enableHiding: false, meta: { headerClassName: 'w-[200px]' } }, { accessorFn: (row) => row.parentName, id: 'menu', header: ({ column }) => , enableSorting: false, enableHiding: false, meta: { headerClassName: 'w-[200px]' } }, { accessorFn: (row) => row.name, id: 'name', header: ({ column }) => , enableSorting: false, enableHiding: false, meta: { headerClassName: 'w-[200px]' } }, { accessorFn: (row) => row.link, id: 'link', header: ({ column }) => , enableSorting: false, enableHiding: false, meta: { headerClassName: 'w-[250px]' } }, { accessorFn: (row) => row.status, id: 'status', header: ({ column }) => , enableSorting: false, enableHiding: false, meta: { headerClassName: 'w-[100px]', cellClassName: 'text-center' } }, { id: 'actions', header: ({ column }) => , enableSorting: false, enableHiding: false, cell: (data) => { const row = data.row.original; return ( <> ); }, meta: { headerClassName: 'w-[100px]', cellClassName: 'text-center' } } ], [handleEditDialog, handleDeleteDialog] ); const flattenChildren = (parent: any, parentIdx: number, depth = 0, parentName = '') => { let result: any[] = []; if (parent.link === '/') { if (!parents.find((el: any) => el.id === parent.id)) setParents((el: any) => [...el, { id: parent.id, name: parent.name }]); // GET PARENTS // Menambahkan parent ke dalam result meskipun tidak memiliki children result.push({ id: parent.id, module: parent.module, parentName: parentName || parent.name, name: parent.name, link: parent.link, id_parent: parent.id_parent, status: parent.status, order_number: parent.order_number }); } // Jika parent tidak memiliki children, langsung return hasil yang sudah ada if (!parent.children || parent.children.length === 0) { return result; } const childrenFlattened = parent.children.flatMap((child: any, childIdx: number) => { if (child.children && child.children.length > 0) { return flattenChildren(child, parentIdx * 100 + childIdx, depth + 1, child.name); } return { id: child.id, module: parent.module, parentName: parentName || parent.name, name: child.name, link: child.link, id_parent: child.id_parent, status: child.status, order_number: child.order_number }; }); // Gabungkan parent dengan children yang sudah diflatten return [...result, ...childrenFlattened]; }; const getMenusLists = async (page: number, limit: number, sorting: any, filter: any) => { try { sorting = sorting.length === 0 ? [{ id: 'name', desc: false }] : sorting; filter = filter.length === 0 ? {} : { any: filter[0].value?.toLowerCase() }; const response = await GetData(`${API_URL}/menus/list`, { limit, page: page + 1, with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc ? 'DESC' : 'ASC', filter: JSON.stringify(filter) }); if (!response?.data.list) return { data: [], totalCount: 0 }; const transformedData = response.data.list.flatMap((row: any, parentIdx: number) => flattenChildren(row, parentIdx) ); const total_count = transformedData.length; const paginatedData = transformedData.slice(page * limit, (page + 1) * limit); console.log(response.data); // setMenus(transformedData); return { data: paginatedData, totalCount: total_count }; } catch (error) { console.error('Error fetching Menus', error); return { data: [], totalCount: 0 }; } }; return ( } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} serverSide={true} onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) => getMenusLists(pageIndex, pageSize, sorting, columnFilters) } > {children} ); }; export { ManageMenusContextProvider, ManageMenusContext }; export type { MenuProps };