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.
160 lines
4.8 KiB
160 lines
4.8 KiB
2 years ago
|
// ** 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)
|
||
|
}
|