Blame view

prestige-vue-4.0.0/src/layout/AppSubmenu.vue 6.27 KB
5b5ab7e5   함상기   20240409
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  <template>
      <ul v-if="items" role="menu">
          <template v-for="(item, i) of items">
              <li
                  :key="item.label || i"
                  role="none"
                  v-if="visible(item) && !item.separator"
                  :class="[
                      {
                          'active-rootmenuitem': activeIndex === i && root && layoutMode === 'horizontal' && !item.disabled,
                          'active-menuitem': 
                              (
                                  ($route.meta.breadcrumb && item.label === $route.meta.breadcrumb[0].parent && layoutMode === 'horizontal')
                                  || ($route.meta.breadcrumb && item.label === $route.meta.breadcrumb[0].label && layoutMode === 'horizontal')
                                  || (activeIndex === i && layoutMode !== 'horizontal')
                                  || (activeIndex === i && !root && layoutMode === 'horizontal')
                              ) 
                              && !item.disabled,
                      },
                  ]"
              >
                  <router-link
                      v-if="item.to"
                      :to="item.to"
                      :style="item.style"
                      :class="[item.class, 'p-ripple', { 'p-disabled': item.disabled }]"
                      :target="item.target"
                      exact
                      @click="onMenuItemClick($event, item, i)"
                      @mouseenter="onMenuItemMouseEnter(i)"
                      role="menuitem"
                      v-ripple
                  >
                      <i :class="['layout-menuitem-icon', item.icon]"></i>
                      <span v-if="item.i18n" class="layout-menuitem-text">{{ $t(item.i18n) }}</span>
                      <span v-else-if="item" class="layout-menuitem-text">{{ item.label }}</span>
                      <i v-if="item.items" class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
                      <Badge v-if="item.badge" :value="item.badge"></Badge>
                  </router-link>
                  <a
                      v-if="!item.to"
                      :href="item.url || '#'"
                      :style="item.style"
                      :class="[item.class, 'p-ripple', { 'p-disabled': item.disabled }]"
                      :target="item.target"
                      @mouseenter="onMenuItemMouseEnter(i)"
                      @click="onMenuItemClick($event, item, i)"
                      role="menuitem"
                      v-ripple
                  >
                      <i :class="['layout-menuitem-icon', item.icon]"></i>
                      <span v-if="item.i18n" class="layout-menuitem-text">{{ $t(item.i18n) }}</span>
                      <span v-else-if="item" class="layout-menuitem-text">{{ item.label }}</span>
                      <i v-if="item.items" class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
                      <Badge v-if="item.badge" :value="item.badge"></Badge>
                  </a>
                  <transition name="layout-submenu-container">
                      <appsubmenu
                          v-show="activeIndex === i"
                          :items="visible(item) && item.items"
                          :menuActive="menuActive"
                          :layoutMode="layoutMode"
                          :parentMenuItemActive="activeIndex === i"
                          @menuitem-click="$emit('menuitem-click', $event)"
                      ></appsubmenu>
                  </transition>
              </li>
              <li class="p-menu-separator" :style="item.style" v-if="visible(item) && item.separator" :key="'separator' + i" role="separator"></li>
          </template>
      </ul>
  </template>
  <script>
  import EventBus from './event-bus';
  
  export default {
      name: 'appsubmenu',
      emits: ['menuitem-click', 'root-menuitem-click'],
      props: {
          items: Array,
          layoutMode: String,
          menuActive: Boolean,
          root: {
              type: Boolean,
              default: false,
          },
          parentMenuItemActive: {
              type: Boolean,
              default: false,
          },
      },
      data() {
          return {
              activeIndex: null,
          };
      },
      mounted() {
          EventBus.on('reset-active-index', () => {
              if (this.layoutMode === 'horizontal') {
                  this.activeIndex = null;
              }
          });
      },
      methods: {
          onMenuItemClick(event, item, index) {
              if (item.disabled) {
                  event.preventDefault();
                  return;
              }
  
              //execute command
              if (item.command) {
                  item.command({ originalEvent: event, item: item });
                  event.preventDefault();
              }
  
              this.activeIndex = this.activeIndex === index ? null : index;
  
              if (item.items) {
                  event.preventDefault();
              }
  
              if (this.root) {
                  this.$emit('root-menuitem-click', {
                      originalEvent: event,
                  });
              } else {
                  const ink = this.getInk(event.currentTarget);
                  if (ink) {
                      this.removeClass(ink, 'p-ink-active');
                  }
              }
  
              this.$emit('menuitem-click', {
                  originalEvent: event,
                  item: item,
              });
          },
          getInk(el) {
              for (let i = 0; i < el.children.length; i++) {
                  if (typeof el.children[i].className === 'string' && el.children[i].className.indexOf('p-ink') !== -1) {
                      return el.children[i];
                  }
              }
              return null;
          },
          removeClass(element, className) {
              if (element.classList) element.classList.remove(className);
              else element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
          },
          isMobile() {
              return window.innerWidth <= 991;
          },
          onMenuItemMouseEnter(index) {
              if (this.root && this.menuActive && this.layoutMode === 'horizontal' && !this.isMobile()) {
                  this.activeIndex = index;
              }
          },
          visible(item) {
              return typeof item.visible === 'function' ? item.visible() : item.visible !== false;
          },
      },
  };
  </script>
  
  <style scoped></style>