161 lines
4.4 KiB
JavaScript

import productionSidebarItems from './sidebars/production'
import inventorySidebarItems from './sidebars/inventory'
import salesSidebarItems from './sidebars/sales'
import financeSidebarItems from './sidebars/finance'
import managementSidebarItems from './sidebars/management'
import developerSidebarItems from './sidebars/developer'
const SIDEBARS = {
production: {
key: 'production',
label: 'Production',
iconKey: 'production',
items: productionSidebarItems
},
inventory: {
key: 'inventory',
label: 'Inventory',
iconKey: 'inventory',
items: inventorySidebarItems
},
sales: {
key: 'sales',
label: 'Sales',
iconKey: 'sales',
items: salesSidebarItems,
routeAliases: {
'/dashboard/sales/listingvarients': 'listings'
}
},
finance: {
key: 'finance',
label: 'Finance',
iconKey: 'finance',
items: financeSidebarItems
},
management: {
key: 'management',
label: 'Management',
iconKey: 'settings',
items: managementSidebarItems
},
developer: {
key: 'developer',
label: 'Developer',
iconKey: 'developer',
items: developerSidebarItems
}
}
const splitPath = (path) => path.split('/').filter(Boolean)
const isPathPrefixMatch = (candidatePath, pathname) => {
const candidateParts = splitPath(candidatePath)
const pathParts = splitPath(pathname)
if (candidateParts.length > pathParts.length) return false
for (let i = 0; i < candidateParts.length; i++) {
if (candidateParts[i] !== pathParts[i]) return false
}
return true
}
const getFilteredItems = (items = [], includeDev = false) =>
items
.filter((item) => item?.devOnly !== true || includeDev)
.map((item) => {
if (item?.children && Array.isArray(item.children)) {
return { ...item, children: getFilteredItems(item.children, includeDev) }
}
return { ...item }
})
const flattenPathEntries = (items = [], acc = []) => {
items.forEach((item) => {
if (item?.type === 'divider') return
if (item?.path) {
acc.push({ path: item.path, key: item.key })
}
if (item?.children && Array.isArray(item.children)) {
flattenPathEntries(item.children, acc)
}
})
return acc
}
const findDefaultKey = (items = []) => {
for (const item of items) {
if (item?.type === 'divider') continue
if (item?.children && item.children.length > 0) {
const childKey = findDefaultKey(item.children)
if (childKey) return childKey
}
if (item?.key) return item.key
}
return ''
}
const toMenuItems = (items = []) =>
items.map((item) => {
if (item?.type === 'divider') return { type: 'divider' }
const menuItem = {
key: item.key,
label: item.label,
iconKey: item.iconKey
}
if (item?.path) {
menuItem.path = item.path
}
if (item?.children && Array.isArray(item.children)) {
menuItem.children = toMenuItems(item.children)
}
return menuItem
})
export const getSidebar = (sidebarKey) => SIDEBARS[sidebarKey] || null
export const getSidebarItems = (sidebarKey, options = {}) => {
const sidebar = getSidebar(sidebarKey)
if (!sidebar) return []
const { includeDev = false } = options
return getFilteredItems(sidebar.items, includeDev)
}
export const getSidebarSelectedKey = (sidebarKey, pathname, options = {}) => {
const sidebar = getSidebar(sidebarKey)
if (!sidebar) return ''
const items = getSidebarItems(sidebarKey, options)
const pathEntries = flattenPathEntries(items)
const aliasEntries = Object.entries(sidebar.routeAliases || {}).map(
([path, key]) => ({ path, key })
)
const match = [...pathEntries, ...aliasEntries]
.filter((entry) => isPathPrefixMatch(entry.path, pathname))
.sort((a, b) => splitPath(b.path).length - splitPath(a.path).length)[0]
return match?.key || findDefaultKey(items)
}
export const getSidebarMenuSections = (options = {}) => {
const { includeDev = false } = options
return Object.values(SIDEBARS)
.filter((sidebar) => includeDev || sidebar.key !== 'developer')
.map((sidebar) => ({
key: sidebar.key,
label: sidebar.label,
iconKey: sidebar.iconKey,
items: toMenuItems(getSidebarItems(sidebar.key, { includeDev }))
}))
}
export const getSidebarDefaultPath = (sidebarKey, options = {}) => {
const items = getSidebarItems(sidebarKey, options)
const first = flattenPathEntries(items)[0]
return first?.path || '/dashboard/production/overview'
}