Refactor #3965 - For Menu

This commit is contained in:
Tuğçe Küçükoğlu 2023-05-29 12:09:48 +03:00
parent 67ec99ccd3
commit ce413c9a91
4 changed files with 163 additions and 121 deletions

View file

@ -1,18 +1,29 @@
<template>
<li v-if="visible()" :id="id" :class="containerClass()" role="menuitem" :style="item.style" :aria-label="label()" :aria-disabled="disabled()" v-bind="getPTOptions('menuitem')">
<div class="p-menuitem-content" @click="onItemClick($event)" v-bind="getPTOptions('content')">
<li
v-if="visible()"
:id="id"
:class="[getCXOptions('menuitem'), item.class]"
role="menuitem"
:style="item.style"
:aria-label="label()"
:aria-disabled="disabled()"
v-bind="getPTOptions('menuitem')"
:data-p-focused="isItemFocused()"
:data-p-disabled="disabled() || false"
>
<div :class="getCXOptions('content')" @click="onItemClick($event)" v-bind="getPTOptions('content')">
<template v-if="!templates.item">
<router-link v-if="item.to && !disabled()" v-slot="{ navigate, href, isActive, isExactActive }" :to="item.to" custom>
<a v-ripple :href="href" :class="linkClass({ isActive, isExactActive })" tabindex="-1" aria-hidden="true" @click="onItemActionClick($event, navigate)" v-bind="getPTOptions('action')">
<component v-if="templates.itemicon" :is="templates.itemicon" :item="item" :class="iconClass" />
<span v-else-if="item.icon" :class="iconClass" v-bind="getPTOptions('icon')" />
<span class="p-menuitem-text" v-bind="getPTOptions('label')">{{ label() }}</span>
<a v-ripple :href="href" :class="getCXOptions('action', { isActive, isExactActive })" tabindex="-1" aria-hidden="true" @click="onItemActionClick($event, navigate)" v-bind="getPTOptions('action')">
<component v-if="templates.itemicon" :is="templates.itemicon" :item="item" :class="[getCXOptions('icon'), item.icon]" />
<span v-else-if="item.icon" :class="[getCXOptions('icon'), item.icon]" v-bind="getPTOptions('icon')" />
<span :class="getCXOptions('label')" v-bind="getPTOptions('label')">{{ label() }}</span>
</a>
</router-link>
<a v-else v-ripple :href="item.url" :class="linkClass()" :target="item.target" tabindex="-1" aria-hidden="true" v-bind="getPTOptions('action')">
<component v-if="templates.itemicon" :is="templates.itemicon" :item="item" :class="iconClass" />
<span v-else-if="item.icon" :class="iconClass" v-bind="getPTOptions('icon')" />
<span class="p-menuitem-text" v-bind="getPTOptions('label')">{{ label() }}</span>
<a v-else v-ripple :href="item.url" :class="getCXOptions('action')" :target="item.target" tabindex="-1" aria-hidden="true" v-bind="getPTOptions('action')">
<component v-if="templates.itemicon" :is="templates.itemicon" :item="item" :class="[getCXOptions('icon'), item.icon]" />
<span v-else-if="item.icon" :class="[getCXOptions('icon'), item.icon]" v-bind="getPTOptions('icon')" />
<span :class="getCXOptions('label')" v-bind="getPTOptions('label')">{{ label() }}</span>
</a>
</template>
<component v-else :is="templates.item" :item="item"></component>
@ -21,13 +32,13 @@
</template>
<script>
import BaseComponent from 'primevue/basecomponent';
import Ripple from 'primevue/ripple';
import { ObjectUtils } from 'primevue/utils';
import BaseMenu from './BaseMenu.vue';
export default {
name: 'Menuitem',
extends: BaseComponent,
extends: BaseMenu,
inheritAttrs: false,
emits: ['item-click'],
props: {
@ -48,6 +59,12 @@ export default {
}
});
},
getCXOptions(key, params) {
return this.cx(key, {
...params,
context: this
});
},
isItemFocused() {
return this.focusedOptionId === this.id;
},
@ -60,18 +77,6 @@ export default {
command && command({ originalEvent: event, item: this.item.item });
this.$emit('item-click', { originalEvent: event, item: this.item, id: this.id });
},
containerClass() {
return ['p-menuitem', this.item.class, { 'p-focus': this.id === this.focusedOptionId, 'p-disabled': this.disabled() }];
},
linkClass(routerProps) {
return [
'p-menuitem-link',
{
'router-link-active': routerProps && routerProps.isActive,
'router-link-active-exact': this.exact && routerProps && routerProps.isExactActive
}
];
},
visible() {
return typeof this.item.visible === 'function' ? this.item.visible() : this.item.visible !== false;
},
@ -82,11 +87,6 @@ export default {
return typeof this.item.label === 'function' ? this.item.label() : this.item.label;
}
},
computed: {
iconClass() {
return ['p-menuitem-icon', this.item.icon];
}
},
directives: {
ripple: Ripple
}