48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import get from "lodash.get";
|
|
export const filterMenuByPermission = (menuConfig: any[], permision: any[]) => {
|
|
const userPermissions = permision?.length
|
|
? permision.map((e) => get(e, "name"))
|
|
: [];
|
|
return menuConfig
|
|
.map((menu) => {
|
|
// Filter children berdasarkan permission user
|
|
const filteredChildren = menu.children?.filter((child: any) =>
|
|
child.permision.some((perm: any) => userPermissions.includes(perm))
|
|
);
|
|
|
|
// Periksa apakah menu utama atau salah satu child memiliki permission yang sesuai
|
|
const hasPermission =
|
|
menu.permision.some((perm: any) => userPermissions.includes(perm)) ||
|
|
(filteredChildren && filteredChildren.length > 0);
|
|
|
|
// Jika cocok, kembalikan menu dengan children yang sudah difilter
|
|
if (hasPermission) {
|
|
return {
|
|
...menu,
|
|
children: filteredChildren,
|
|
};
|
|
}
|
|
return null; // Tidak menyertakan menu yang tidak memiliki permission
|
|
})
|
|
.filter((menu) => menu !== null); // Hapus menu yang null
|
|
};
|
|
|
|
export const getFirstMenuWithUrl = (menuConfig: any[]): any | null => {
|
|
for (const menu of menuConfig) {
|
|
// Jika menu memiliki href langsung, kembalikan menu tersebut
|
|
if (menu.href) {
|
|
return menu?.href;
|
|
}
|
|
|
|
// Jika menu memiliki children, cari secara rekursif
|
|
if (menu.children) {
|
|
const childWithUrl = getFirstMenuWithUrl(menu.children);
|
|
if (childWithUrl) {
|
|
return childWithUrl;
|
|
}
|
|
}
|
|
}
|
|
// Jika tidak ada menu dengan URL, kembalikan null
|
|
return null;
|
|
};
|