You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
4.8 KiB
159 lines
4.8 KiB
// ** React Imports |
|
import { useContext } from 'react' |
|
import { AbilityContext } from '@src/utility/context/Can' |
|
|
|
/** |
|
* Return which component to render based on it's data/context |
|
* @param {Object} item nav menu item |
|
*/ |
|
export const resolveVerticalNavMenuItemComponent = item => { |
|
if (item.header) return 'VerticalNavMenuSectionHeader' |
|
if (item.children) return 'VerticalNavMenuGroup' |
|
return 'VerticalNavMenuLink' |
|
} |
|
|
|
/** |
|
* Return which component to render based on it's data/context |
|
* @param {Object} item nav menu item |
|
*/ |
|
export const resolveHorizontalNavMenuItemComponent = item => { |
|
if (item.children) return 'HorizontalNavMenuGroup' |
|
return 'HorizontalNavMenuLink' |
|
} |
|
|
|
/** |
|
* Check if nav-link is active |
|
* @param {Object} link nav-link object |
|
*/ |
|
// export const isNavLinkActive = (link, currentURL, match) => { |
|
// // return currentURL === link || (URLParams && Object.keys(URLParams).length && currentURLFilter === item.navLink) |
|
// const getFirstObjProp = obj => obj[Object.keys(obj)[0]] |
|
// return ( |
|
// currentURL === link || |
|
// (match !== null && match !== undefined && match.url === `${link}/${getFirstObjProp(match.params)}`) |
|
// ) |
|
// } |
|
|
|
export const isNavLinkActive = (link, currentURL, routerProps) => { |
|
return ( |
|
currentURL === link || |
|
(routerProps && routerProps.meta && routerProps.meta.navLink && routerProps.meta.navLink === link) |
|
) |
|
// return currentURL === link |
|
} |
|
|
|
/** |
|
* Check if nav group is |
|
* @param {Array} children Group children |
|
*/ |
|
// export const isNavGroupActive = (children, currentURL, match) => { |
|
// return children.some(child => { |
|
// // If child have children => It's group => Go deeper(recursive) |
|
// if (child.children) { |
|
// return isNavGroupActive(child.children, currentURL, match) |
|
// } |
|
// // else it's link => Check for matched Route |
|
// return isNavLinkActive(child.navLink, currentURL, match) |
|
// }) |
|
// } |
|
export const isNavGroupActive = (children, currentURL, routerProps) => { |
|
return children.some(child => { |
|
// If child have children => It's group => Go deeper(recursive) |
|
if (child.children) { |
|
return isNavGroupActive(child.children, currentURL, routerProps) |
|
} |
|
// else it's link => Check for matched Route |
|
return isNavLinkActive(child.navLink, currentURL, routerProps) |
|
}) |
|
} |
|
|
|
/** |
|
* Search for parent object |
|
* @param {Array} navigation Group children |
|
* @param {string} currentURL current URL |
|
*/ |
|
// export const search = (navigation, currentURL, match) => { |
|
// let result |
|
// navigation.some(child => { |
|
// let children |
|
// // If child have children => It's group => Go deeper(recursive) |
|
// if (child.children && (children = search(child.children, currentURL, match))) { |
|
// return (result = { |
|
// id: child.id, |
|
// children |
|
// }) |
|
// } |
|
|
|
// // else it's link => Check for matched Route |
|
// if (isNavLinkActive(child.navLink, currentURL, match)) { |
|
// return (result = { |
|
// id: child.id |
|
// }) |
|
// } |
|
// }) |
|
// return result |
|
// } |
|
|
|
export const search = (navigation, currentURL, routerProps) => { |
|
let result |
|
navigation.some(child => { |
|
let children |
|
// If child have children => It's group => Go deeper(recursive) |
|
if (child.children && (children = search(child.children, currentURL, routerProps))) { |
|
return (result = { |
|
id: child.id, |
|
children |
|
}) |
|
} |
|
|
|
// else it's link => Check for matched Route |
|
if (isNavLinkActive(child.navLink, currentURL, routerProps)) { |
|
return (result = { |
|
id: child.id |
|
}) |
|
} |
|
}) |
|
return result |
|
} |
|
|
|
/** |
|
* Loop through nested object |
|
* @param {object} obj nested object |
|
*/ |
|
export const getAllParents = (obj, match) => { |
|
const res = [] |
|
const recurse = (obj, current) => { |
|
for (const key in obj) { |
|
const value = obj[key] |
|
if (value !== undefined) { |
|
if (value && typeof value === 'object') { |
|
recurse(value, key) |
|
} else { |
|
if (key === match) { |
|
res.push(value) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
recurse(obj) |
|
return res |
|
} |
|
|
|
export const canViewMenuGroup = item => { |
|
const ability = useContext(AbilityContext) |
|
// ! This same logic is used in canViewHorizontalNavMenuGroup and canViewHorizontalNavMenuHeaderGroup. So make sure to update logic in them as well |
|
const hasAnyVisibleChild = item.children && item.children.some(i => ability.can(i.action, i.resource)) |
|
|
|
// ** If resource and action is defined in item => Return based on children visibility (Hide group if no child is visible) |
|
// ** Else check for ability using provided resource and action along with checking if has any visible child |
|
if (!(item.action && item.resource)) { |
|
return hasAnyVisibleChild |
|
} |
|
return ability.can(item.action, item.resource) && hasAnyVisibleChild |
|
} |
|
|
|
export const canViewMenuItem = item => { |
|
const ability = useContext(AbilityContext) |
|
return ability.can(item.action, item.resource) |
|
}
|
|
|