123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <script>
  2. import Ripple from 'primevue/ripple'
  3. import { Link } from '@inertiajs/inertia-vue3'
  4. export default {
  5. name: 'Menuitem',
  6. inheritAttrs: false,
  7. components: {
  8. Link,
  9. },
  10. emits: ['click'],
  11. props: {
  12. item: null,
  13. template: null,
  14. exact: null,
  15. },
  16. methods: {
  17. onClick(event, navigate) {
  18. this.$emit('click', {
  19. originalEvent: event,
  20. item: this.item,
  21. navigate: navigate,
  22. })
  23. },
  24. linkClass(item) {
  25. return [
  26. 'p-menuitem-link',
  27. {
  28. 'p-disabled': this.disabled(item),
  29. },
  30. ]
  31. },
  32. visible() {
  33. return typeof this.item.visible === 'function' ? this.item.visible() : this.item.visible !== false
  34. },
  35. disabled(item) {
  36. return typeof item.disabled === 'function' ? item.disabled() : item.disabled
  37. },
  38. label() {
  39. return typeof this.item.label === 'function' ? this.item.label() : this.item.label
  40. },
  41. },
  42. computed: {
  43. containerClass() {
  44. return ['p-menuitem', this.item.class]
  45. },
  46. },
  47. directives: {
  48. ripple: Ripple,
  49. },
  50. }
  51. </script>
  52. <template>
  53. <li :class="containerClass" role="none" :style="item.style" v-if="visible()">
  54. <template v-if="!template">
  55. <Link
  56. v-if="item.to && !disabled(item)"
  57. v-ripple
  58. role="menuitem"
  59. :href="item.to"
  60. :class="linkClass(item)"
  61. @click="onClick($event, navigate)"
  62. >
  63. <span :class="['p-menuitem-icon', item.icon]"></span>
  64. <span class="p-menuitem-text">{{ label() }}</span>
  65. </Link>
  66. <a
  67. v-else
  68. :href="item.url"
  69. :class="linkClass(item)"
  70. @click="onClick"
  71. :target="item.target"
  72. role="menuitem"
  73. :tabindex="disabled(item) ? null : '0'"
  74. v-ripple
  75. >
  76. <span :class="['p-menuitem-icon', item.icon]"></span>
  77. <span class="p-menuitem-text">{{ label() }}</span>
  78. </a>
  79. </template>
  80. <component v-else :is="template" :item="item"></component>
  81. </li>
  82. </template>