AppMenuItem.vue 2.0KB

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