AppSidebarNav.js 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { h, defineComponent, resolveComponent } from 'vue'
  2. import { Link } from '@inertiajs/inertia-vue3'
  3. import nav from '@/utils/nav'
  4. const SidebarNav = defineComponent({
  5. props: ['url'],
  6. setup(props) {
  7. const renderItem = (item, url) => {
  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: 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, props.url)),
  68. }
  69. )
  70. },
  71. })
  72. export default SidebarNav