영업용 pav
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

// ** 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)
}