AppSidebarNav.js 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { h, defineComponent, resolveComponent, onMounted } from 'vue'
  2. import { Link, usePage } from '@inertiajs/inertia-vue3'
  3. import nav from '@/utils/nav'
  4. const SidebarNav = defineComponent({
  5. setup() {
  6. const page = usePage
  7. const renderItem = (item) => {
  8. if (item.items) {
  9. h(
  10. resolveComponent('CNavGroup'),
  11. {},
  12. {
  13. toggleContent: () => [
  14. h(resolveComponent('CIcon'), {
  15. customClassName: 'nav-icon',
  16. icon: item.icon,
  17. }),
  18. item.name,
  19. ],
  20. default: () => item.items.renderItem(child),
  21. }
  22. )
  23. }
  24. return item.to
  25. ? h(
  26. resolveComponent(item.component),
  27. {},
  28. {
  29. default: () =>
  30. h(
  31. Link,
  32. {
  33. href: item.to,
  34. class: ['nav-link', { active: page.url === item.to }],
  35. },
  36. {
  37. default: () => [
  38. item.icon &&
  39. h(resolveComponent('CIcon'), {
  40. customClassName: 'nav-icon',
  41. name: item.icon,
  42. }),
  43. item.name,
  44. item.badge &&
  45. h(
  46. resolveComponent('CBadge'),
  47. {
  48. class: 'ms-auto',
  49. color: item.badge.color,
  50. },
  51. {
  52. default: () => item.badge.text,
  53. }
  54. ),
  55. ],
  56. }
  57. ),
  58. }
  59. )
  60. : h(resolveComponent(item.component), {}, { default: () => item.name })
  61. }
  62. return () =>
  63. h(
  64. resolveComponent('CSidebarNav'),
  65. {},
  66. {
  67. default: () => nav.map((item) => renderItem(item)),
  68. }
  69. )
  70. },
  71. })
  72. export default SidebarNav