tambah menu sideBarMenu , middleware definepagemeta

This commit is contained in:
2025-07-10 12:06:56 +07:00
parent 1b05076317
commit c37759cc8f
16 changed files with 244 additions and 149 deletions

No files matched your search

-64
View File
@@ -1,64 +0,0 @@
import type { SidebarItem } from '~/types/menuAkses/sidebar'
import type { PageAccess } from '~/types/menuAkses/access'
interface SidebarItemWithPermissions extends SidebarItem {
permissions: string[];
}
export function mergeSidebar(menuItems: SidebarItem[], allowedPages: PageAccess[]): SidebarItem[] {
const result: SidebarItem[] = []
for (const item of menuItems) {
// Jika punya anak (children)
//console.log('item', item);
//console.log('allowedPages', allowedPages);
if (Array.isArray(item.children)) {
const filteredChildren = mergeSidebar(item.children, allowedPages)
//console.log('ada array item', item);
// console.log('filteredChildren', filteredChildren);
if (filteredChildren.length > 0) {
result.push({
...item,
children: filteredChildren
})
}
//console.log('result', result);
}
// Jika punya path, cocokkan dengan json dummy / backend
else if (item.to) {
const matchPage = allowedPages.find(page => page.title === item.title && page.path === item.to) //cocokkan title dan path link halaman
//console.log('match', matchPage,matchPage?.permissions);
if (matchPage && matchPage.permissions?.includes('view')) {
result.push({
...item,
permissions: matchPage?.permissions,
} as SidebarItemWithPermissions)
}
}
}
return result
}
export function mergeSidebarIcon(staticIcon: any[], IconAccess: any[]) {
const result : any[] = []
for (const item of staticIcon) {
const matchIcon = IconAccess.find(icon => icon.id === item.id)
//console.log('matchIcon', matchIcon);
if (matchIcon) {
result.push({
...item,
})
}
}
return result
}
@@ -0,0 +1,5 @@
import { useAccess } from "~/composables/useAccess";
export function usePagePermission(dataUser : string) {
}
+38 -33
View File
@@ -1,47 +1,52 @@
import { useHakAksesStore } from '@/stores/sidebarMenuAkses/useMenuAksesStore'
import { mergeSidebar, mergeSidebarIcon } from '~/composables/sidebarMenu/mergeSidebar';
import { mergeSidebar, mergeSidebarIcon } from '~/utils/sidebarMenu/mergeSidebar';
import sidebarRole from "@/stores/rolePages"; // data dummy
import sidebarItems from '~/components/layout/full/vertical-sidebar/sidebarItem'; //sidebar static dari template
import MiniSideIcons from '~/components/layout/full/vertical-sidebar/MinIconItems';
export function useSidebarAccess(data: any) {
export function useSidebarAccess(dataUser : string) {
const akses = useHakAksesStore()
const sidebarMenu = shallowRef(sidebarItems);
const sidebarMiniSideIcons = shallowRef(MiniSideIcons);
const userRole = "admin";
//console.log('sidebarMenu', sidebarMenu.value);
//userRole = superadmin admin user
const userRole = dataUser;
const roleSidebarItems = sidebarRole.filter(item => item.role === userRole);
const mergedPages = mergeSidebar(sidebarMenu.value, roleSidebarItems[0].pages)
data = mergeSidebarIcon(sidebarMiniSideIcons.value, roleSidebarItems[0].pages)
console.log('mergedPages useSidebarAccess', mergedPages);
return data
//mergeSidebar (menu awal, menu role user)
const mergedPages = mergeSidebar(sidebarMenu.value, roleSidebarItems[0].pages)
//Merge Icon dari sidebarMenu api
let mergedIcons = null;
if (mergedPages !== null) {
//sidebarMiniSideIcons.value = mergedPages
//mergeSidebarIcon (icon awal, icon role user)
mergedIcons = mergeSidebarIcon(sidebarMiniSideIcons.value, mergedPages)
}else{
mergedIcons = sidebarMiniSideIcons.value
}
//console.log('mergedPages useSidebarAccess', mergedPages,mergedIcons);
//insert ke store Pinia
akses.setAccess({ role: userRole, pages: roleSidebarItems[0].pages, icons:mergedIcons })
akses.setMergedSidebar(mergedPages)
//console.log('tes masuk storeMenu', akses.$state)
const getPagesUser = akses.pageAccess
const getMergedPages = akses.mergedSidebar
const getMergedIcons = akses.iconItem
return {
getPagesUser,
getMergedPages,
getMergedIcons,
}
}
// export function useAccess() {
// const store = useHakAksesStore()
// const getRole = () => store.role
// const getPages = () => store.pageAccess
// const getPermissionsByPath = (path: string): string[] => {
// const match = store.pageAccess.find(p => p.path === path)
// return match?.permissions || []
// }
// return {
// getRole,
// getPages,
// getPermissionsByPath
// }
// }
+47 -8
View File
@@ -1,10 +1,49 @@
//import { sidebarMeta } from '@/components/layout/sidebar'
import { mergeSidebar } from '~/composables/sidebarMenu/mergeSidebar'
import { useSidebarAccess } from '~/composables/sidebarMenu/useSidebarAkses'
import { useRoute } from "vue-router";
import { useSidebarAccess } from "~/composables/sidebarMenu/useSidebarAkses";
import { useHakAksesStore } from "@/stores/sidebarMenuAkses/useMenuAksesStore";
import type { PageAccess } from "~/types/menuAkses/access";
export const useAccess = () => {
const result = useSidebarAccess("tes")
export const useAccess = (pageRoute: string , userRole: string) => {
//const route = useRoute();
const getRole = "admin";
//const meta = route.path; //halaman yang sedang diakses
const meta = pageRoute
return result
}
// const getPermissions = ['view'] // belum ambil data
const aksesMenu = useHakAksesStore();
//untuk merge akses menu dan akses ke store
const getMenuStore = useSidebarAccess(getRole);
//console.log("masuk akses", getMenuStore);
const getPagesUser = aksesMenu.pageAccess;
const getMergedPages = aksesMenu.mergedSidebar;
//const result = useSidebarAccess(getRole);
console.log("route dari useAccess", meta);
//console.log("mergerpage", getMergedPages);meta masih salah
//mencari permision per page
const cariPage: PageAccess[] = getPagesUser;
let getPermisionPage = null;
//console.log('cariPage', cariPage);
if (cariPage.length > 0) {
const found = cariPage.find((p) => p.path === meta);
//console.log("permisionPage", found);
if (found?.permissions) {
getPermisionPage = found.permissions;
}
}
//set permission ke pinia
aksesMenu.setPermissionPage(getPermisionPage);
return {
getRole, // role
getPagesUser, // akses menu per role
getMergedPages, // hasil merge akses menu
getPermisionPage, // permission per page
};
};
-25
View File
@@ -1,25 +0,0 @@
// // composables/useAuth.ts
// import { useCookie } from '#app'
// export const useAuth = () => {
// const user = useState('auth_user', () => null)
// const token = useCookie('auth_token')
// const setUser = (data: any, tokenValue: string) => {
// user.value = data
// token.value = tokenValue
// }
// const logout = () => {
// user.value = null
// token.value = null
// }
// return {
// user,
// token,
// setUser,
// logout,
// isLoggedIn: computed(() => !!user.value)
// }
// }