vxe-pc-ui 4.11.32 → 4.11.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/es/button/src/button-group.js +11 -5
  2. package/es/button/src/button.js +12 -4
  3. package/es/context-menu/src/context-menu.js +218 -3
  4. package/es/context-menu/style.css +1 -1
  5. package/es/context-menu/style.min.css +1 -1
  6. package/es/icon/style.css +1 -1
  7. package/es/style.css +1 -1
  8. package/es/style.min.css +1 -1
  9. package/es/tree/src/tree.js +1 -0
  10. package/es/ui/index.js +1 -1
  11. package/es/ui/src/log.js +1 -1
  12. package/es/vxe-context-menu/style.css +1 -1
  13. package/es/vxe-context-menu/style.min.css +1 -1
  14. package/lib/button/src/button-group.js +12 -7
  15. package/lib/button/src/button-group.min.js +1 -1
  16. package/lib/button/src/button.js +11 -4
  17. package/lib/button/src/button.min.js +1 -1
  18. package/lib/context-menu/src/context-menu.js +219 -2
  19. package/lib/context-menu/src/context-menu.min.js +1 -1
  20. package/lib/context-menu/style/style.css +1 -1
  21. package/lib/context-menu/style/style.min.css +1 -1
  22. package/lib/icon/style/style.css +1 -1
  23. package/lib/icon/style/style.min.css +1 -1
  24. package/lib/index.umd.js +248 -15
  25. package/lib/index.umd.min.js +1 -1
  26. package/lib/style.css +1 -1
  27. package/lib/style.min.css +1 -1
  28. package/lib/tree/src/tree.js +4 -0
  29. package/lib/tree/src/tree.min.js +1 -1
  30. package/lib/ui/index.js +1 -1
  31. package/lib/ui/index.min.js +1 -1
  32. package/lib/ui/src/log.js +1 -1
  33. package/lib/ui/src/log.min.js +1 -1
  34. package/lib/vxe-context-menu/style/style.css +1 -1
  35. package/lib/vxe-context-menu/style/style.min.css +1 -1
  36. package/package.json +1 -1
  37. package/packages/button/src/button-group.ts +14 -6
  38. package/packages/button/src/button.ts +13 -4
  39. package/packages/context-menu/src/context-menu.ts +216 -4
  40. package/packages/tree/src/tree.ts +1 -0
  41. package/styles/components/context-menu.scss +1 -1
  42. package/types/components/button-group.d.ts +9 -1
  43. package/types/components/button.d.ts +9 -1
  44. /package/es/icon/{iconfont.1767614230277.ttf → iconfont.1767662202838.ttf} +0 -0
  45. /package/es/icon/{iconfont.1767614230277.woff → iconfont.1767662202838.woff} +0 -0
  46. /package/es/icon/{iconfont.1767614230277.woff2 → iconfont.1767662202838.woff2} +0 -0
  47. /package/es/{iconfont.1767614230277.ttf → iconfont.1767662202838.ttf} +0 -0
  48. /package/es/{iconfont.1767614230277.woff → iconfont.1767662202838.woff} +0 -0
  49. /package/es/{iconfont.1767614230277.woff2 → iconfont.1767662202838.woff2} +0 -0
  50. /package/lib/icon/style/{iconfont.1767614230277.ttf → iconfont.1767662202838.ttf} +0 -0
  51. /package/lib/icon/style/{iconfont.1767614230277.woff → iconfont.1767662202838.woff} +0 -0
  52. /package/lib/icon/style/{iconfont.1767614230277.woff2 → iconfont.1767662202838.woff2} +0 -0
  53. /package/lib/{iconfont.1767614230277.ttf → iconfont.1767662202838.ttf} +0 -0
  54. /package/lib/{iconfont.1767614230277.woff → iconfont.1767662202838.woff} +0 -0
  55. /package/lib/{iconfont.1767614230277.woff2 → iconfont.1767662202838.woff2} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { ref, h, reactive, PropType, computed, VNode, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { getConfig, getIcon, getI18n, createEvent, useSize, globalEvents, renderEmptyElement } from '../../ui'
4
+ import { getConfig, getIcon, getI18n, createEvent, useSize, globalEvents, renderEmptyElement, GLOBAL_EVENT_KEYS } from '../../ui'
5
5
  import { getLastZIndex, nextSubZIndex, nextZIndex, getFuncText } from '../../ui/src/utils'
6
6
  import { getEventTargetNode, toCssUnit } from '../../ui/src/dom'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
@@ -81,6 +81,21 @@ export default defineVxeComponent({
81
81
  return options || []
82
82
  })
83
83
 
84
+ const computeAllFirstMenuList = computed(() => {
85
+ const menuGroups: VxeContextMenuDefines.MenuFirstOption[] = computeMenuGroups.value
86
+ const firstList = []
87
+ for (let i = 0; i < menuGroups.length; i++) {
88
+ const list = menuGroups[i]
89
+ for (let j = 0; j < list.length; j++) {
90
+ const firstItem = list[j]
91
+ if (hasValidItem(firstItem)) {
92
+ firstList.push(firstItem)
93
+ }
94
+ }
95
+ }
96
+ return firstList
97
+ })
98
+
84
99
  const computeTopAndLeft = computed(() => {
85
100
  const { x, y } = props
86
101
  return `${x}${y}`
@@ -179,7 +194,7 @@ export default defineVxeComponent({
179
194
  return children && children.some((child) => child.visible !== false)
180
195
  }
181
196
 
182
- const handleItemClickEvent = (evnt: MouseEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
197
+ const handleItemClickEvent = (evnt: MouseEvent | KeyboardEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
183
198
  if (!hasChildMenu(item)) {
184
199
  dispatchEvent('option-click', { option: item }, evnt)
185
200
  close()
@@ -188,7 +203,17 @@ export default defineVxeComponent({
188
203
 
189
204
  const handleItemMouseenterEvent = (evnt: MouseEvent, item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption, parentitem?: VxeContextMenuDefines.MenuFirstOption | null) => {
190
205
  reactData.activeOption = parentitem || item
191
- reactData.activeChildOption = parentitem ? item : null
206
+ if (parentitem) {
207
+ reactData.activeOption = parentitem
208
+ reactData.activeChildOption = item
209
+ } else {
210
+ reactData.activeOption = item
211
+ if (hasChildMenu(item)) {
212
+ reactData.activeChildOption = findFirstChildItem(item)
213
+ } else {
214
+ reactData.activeChildOption = null
215
+ }
216
+ }
192
217
  }
193
218
 
194
219
  const handleItemMouseleaveEvent = () => {
@@ -196,6 +221,178 @@ export default defineVxeComponent({
196
221
  reactData.activeChildOption = null
197
222
  }
198
223
 
224
+ const hasValidItem = (item: VxeContextMenuDefines.MenuFirstOption | VxeContextMenuDefines.MenuChildOption) => {
225
+ return !item.loading && !item.disabled && item.visible !== false
226
+ }
227
+
228
+ const findNextFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
229
+ for (let i = 0; i < allFirstList.length; i++) {
230
+ const item = allFirstList[i]
231
+ if (firstItem === item) {
232
+ const nextItem = allFirstList[i + 1]
233
+ if (nextItem) {
234
+ return nextItem
235
+ }
236
+ }
237
+ }
238
+ return XEUtils.first(allFirstList)
239
+ }
240
+
241
+ const findPrevFirstItem = (allFirstList: VxeContextMenuDefines.MenuFirstOption[], firstItem: VxeContextMenuDefines.MenuFirstOption) => {
242
+ for (let i = 0; i < allFirstList.length; i++) {
243
+ const item = allFirstList[i]
244
+ if (firstItem === item) {
245
+ if (i > 0) {
246
+ return allFirstList[i - 1]
247
+ }
248
+ }
249
+ }
250
+ return XEUtils.last(allFirstList)
251
+ }
252
+
253
+ const findFirstChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption) => {
254
+ const { children } = firstItem
255
+ if (children) {
256
+ for (let i = 0; i < children.length; i++) {
257
+ const item = children[i]
258
+ if (hasValidItem(item)) {
259
+ return item
260
+ }
261
+ }
262
+ }
263
+ return null
264
+ }
265
+
266
+ const findPrevChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
267
+ const { children } = firstItem
268
+ let prevValidItem = null
269
+ if (children) {
270
+ for (let i = 0; i < children.length; i++) {
271
+ const item = children[i]
272
+ if (childItem === item) {
273
+ break
274
+ }
275
+ if (hasValidItem(item)) {
276
+ prevValidItem = item
277
+ }
278
+ }
279
+ if (!prevValidItem) {
280
+ for (let len = children.length - 1; len >= 0; len--) {
281
+ const item = children[len]
282
+ if (hasValidItem(item)) {
283
+ return item
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return prevValidItem
289
+ }
290
+
291
+ const findNextChildItem = (firstItem: VxeContextMenuDefines.MenuFirstOption, childItem: VxeContextMenuDefines.MenuChildOption) => {
292
+ const { children } = firstItem
293
+ let firstValidItem = null
294
+ if (children) {
295
+ let isMetch = false
296
+ for (let i = 0; i < children.length; i++) {
297
+ const item = children[i]
298
+ if (!firstValidItem) {
299
+ if (hasValidItem(item)) {
300
+ firstValidItem = item
301
+ }
302
+ }
303
+ if (isMetch) {
304
+ if (hasValidItem(item)) {
305
+ return item
306
+ }
307
+ } else {
308
+ isMetch = childItem === item
309
+ }
310
+ }
311
+ }
312
+ return firstValidItem
313
+ }
314
+
315
+ const handleGlobalMousewheelEvent = (evnt: MouseEvent) => {
316
+ const { visible } = reactData
317
+ if (visible) {
318
+ const el = refElem.value
319
+ if (!getEventTargetNode(evnt, el, '').flag) {
320
+ close()
321
+ }
322
+ }
323
+ }
324
+
325
+ const handleGlobalKeydownEvent = (evnt: KeyboardEvent) => {
326
+ const { visible, childPos, activeOption, activeChildOption } = reactData
327
+ const allFirstMenuList = computeAllFirstMenuList.value
328
+ if (visible) {
329
+ const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
330
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
331
+ const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
332
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
333
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
334
+ // 回车选中
335
+ if (isEnter) {
336
+ if (activeOption || activeChildOption) {
337
+ evnt.preventDefault()
338
+ evnt.stopPropagation()
339
+ if (!activeChildOption && hasChildMenu(activeOption)) {
340
+ reactData.activeChildOption = findFirstChildItem(activeOption)
341
+ return
342
+ }
343
+ handleItemClickEvent(evnt, activeChildOption || activeOption)
344
+ return
345
+ }
346
+ }
347
+ // 方向键操作
348
+ if (activeChildOption) {
349
+ if (isUpArrow) {
350
+ evnt.preventDefault()
351
+ reactData.activeChildOption = findPrevChildItem(activeOption, activeChildOption)
352
+ } else if (isDwArrow) {
353
+ evnt.preventDefault()
354
+ reactData.activeChildOption = findNextChildItem(activeOption, activeChildOption)
355
+ } else if (isLeftArrow) {
356
+ evnt.preventDefault()
357
+ if (childPos === 'left') {
358
+ // 无操作
359
+ } else {
360
+ reactData.activeChildOption = null
361
+ }
362
+ } else if (isRightArrow) {
363
+ evnt.preventDefault()
364
+ if (childPos === 'left') {
365
+ reactData.activeChildOption = null
366
+ } else {
367
+ // 无操作
368
+ }
369
+ }
370
+ } else if (activeOption) {
371
+ evnt.preventDefault()
372
+ if (isUpArrow) {
373
+ reactData.activeOption = findPrevFirstItem(allFirstMenuList, activeOption)
374
+ } else if (isDwArrow) {
375
+ reactData.activeOption = findNextFirstItem(allFirstMenuList, activeOption)
376
+ } else {
377
+ if (hasChildMenu(activeOption)) {
378
+ if (childPos === 'left') {
379
+ if (isLeftArrow) {
380
+ reactData.activeChildOption = findFirstChildItem(activeOption)
381
+ }
382
+ } else {
383
+ if (isRightArrow) {
384
+ reactData.activeChildOption = findFirstChildItem(activeOption)
385
+ }
386
+ }
387
+ }
388
+ }
389
+ } else {
390
+ evnt.preventDefault()
391
+ reactData.activeOption = XEUtils.first(allFirstMenuList)
392
+ }
393
+ }
394
+ }
395
+
199
396
  const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
200
397
  const { visible } = reactData
201
398
  if (visible) {
@@ -206,6 +403,13 @@ export default defineVxeComponent({
206
403
  }
207
404
  }
208
405
 
406
+ const handleGlobalBlurEvent = () => {
407
+ const { visible } = reactData
408
+ if (visible) {
409
+ close()
410
+ }
411
+ }
412
+
209
413
  const tagPrivateMethods: ContextMenuPrivateMethods = {
210
414
  }
211
415
 
@@ -310,11 +514,13 @@ export default defineVxeComponent({
310
514
  menuList.forEach((firstItem, i) => {
311
515
  const { children } = firstItem
312
516
  const hasChildMenus = children && children.some((child) => child.visible !== false)
517
+ const isActiveFirst = activeOption === firstItem
313
518
  moVNs.push(
314
519
  h('div', {
315
520
  key: `${gIndex}_${i}`,
316
521
  class: ['vxe-context-menu--item-wrapper vxe-context-menu--first-item', firstItem.className || '', {
317
- 'is--active': activeOption === firstItem
522
+ 'is--active': isActiveFirst,
523
+ 'is--subactive': isActiveFirst && !!activeChildOption
318
524
  }]
319
525
  }, [
320
526
  hasChildMenus
@@ -369,11 +575,17 @@ export default defineVxeComponent({
369
575
  handleVisible()
370
576
 
371
577
  onMounted(() => {
578
+ globalEvents.on($xeContextMenu, 'mousewheel', handleGlobalMousewheelEvent)
579
+ globalEvents.on($xeContextMenu, 'keydown', handleGlobalKeydownEvent)
372
580
  globalEvents.on($xeContextMenu, 'mousedown', handleGlobalMousedownEvent)
581
+ globalEvents.on($xeContextMenu, 'blur', handleGlobalBlurEvent)
373
582
  })
374
583
 
375
584
  onBeforeUnmount(() => {
585
+ globalEvents.off($xeContextMenu, 'mousewheel')
586
+ globalEvents.off($xeContextMenu, 'keydown')
376
587
  globalEvents.off($xeContextMenu, 'mousedown')
588
+ globalEvents.off($xeContextMenu, 'blur')
377
589
  XEUtils.assign(reactData, createReactData())
378
590
  XEUtils.assign(internalData, createInternalData())
379
591
  })
@@ -1143,6 +1143,7 @@ export default defineVxeComponent({
1143
1143
  if (!lazy || !treeExpandLazyLoadedMaps[nodeid]) {
1144
1144
  handleBaseTreeExpand([node], expanded)
1145
1145
  }
1146
+ dispatchEvent('node-expand', { node, expanded }, evnt)
1146
1147
  }
1147
1148
 
1148
1149
  const updateCheckboxStatus = () => {
@@ -58,7 +58,7 @@
58
58
  }
59
59
  }
60
60
  .vxe-context-menu--first-item {
61
- &.is--active {
61
+ &.is--subactive {
62
62
  .vxe-context-menu--children-wrapper {
63
63
  display: block;
64
64
  }
@@ -74,7 +74,8 @@ export interface ButtonGroupPrivateMethods {
74
74
  export interface VxeButtonGroupPrivateMethods extends ButtonGroupPrivateMethods { }
75
75
 
76
76
  export type VxeButtonGroupEmits = [
77
- 'click'
77
+ 'click',
78
+ 'contextmenu'
78
79
  ]
79
80
 
80
81
  export namespace VxeButtonGroupDefines {
@@ -86,18 +87,25 @@ export namespace VxeButtonGroupDefines {
86
87
  name: VxeButtonPropTypes.Name
87
88
  option: VxeButtonProps & Record<string, any>
88
89
  }
90
+
91
+ export interface ContextmenuParams extends ButtonGroupEventParams {
92
+ $event: MouseEvent
93
+ }
89
94
  }
90
95
 
91
96
  export type VxeButtonGroupEventProps = {
92
97
  onClick?: VxeButtonGroupEvents.Click
98
+ onContextmenu?: VxeButtonGroupEvents.Contextmenu
93
99
  }
94
100
 
95
101
  export interface VxeButtonGroupListeners {
96
102
  click?: VxeButtonGroupEvents.Click
103
+ contextmenu?: VxeButtonGroupEvents.Contextmenu
97
104
  }
98
105
 
99
106
  export namespace VxeButtonGroupEvents {
100
107
  export type Click = (params: VxeButtonGroupDefines.ClickEventParams) => void
108
+ export type Contextmenu = (params: VxeButtonGroupDefines.ContextmenuParams) => void
101
109
  }
102
110
 
103
111
  export namespace VxeButtonGroupSlotTypes {
@@ -213,7 +213,8 @@ export type VxeButtonEmits = [
213
213
  'mouseenter',
214
214
  'mouseleave',
215
215
  'dropdown-click',
216
- 'dropdownClick'
216
+ 'dropdownClick',
217
+ 'contextmenu'
217
218
  ]
218
219
 
219
220
  export namespace VxeButtonDefines {
@@ -239,6 +240,10 @@ export namespace VxeButtonDefines {
239
240
  option: VxeButtonDefines.DownButtonOption | null
240
241
  }
241
242
  export interface DropdownClickEventParams extends ButtonEventParams, DropdownClickParams { }
243
+
244
+ export interface ContextmenuParams extends ButtonEventParams {
245
+ $event: MouseEvent
246
+ }
242
247
  }
243
248
 
244
249
  export type VxeButtonEventProps = {
@@ -246,6 +251,7 @@ export type VxeButtonEventProps = {
246
251
  onMouseenter?: VxeButtonEvents.Mouseenter
247
252
  onMouseleave?: VxeButtonEvents.Mouseleave
248
253
  onDropdownClick?: VxeButtonEvents.DropdownClick
254
+ onContextmenu?: VxeButtonEvents.Contextmenu
249
255
  }
250
256
 
251
257
  export interface VxeButtonListeners {
@@ -253,6 +259,7 @@ export interface VxeButtonListeners {
253
259
  mouseenter?: VxeButtonEvents.Mouseenter
254
260
  mouseleave?: VxeButtonEvents.Mouseleave
255
261
  dropdownClick?: VxeButtonEvents.DropdownClick
262
+ contextmenu?: VxeButtonEvents.Contextmenu
256
263
  }
257
264
 
258
265
  export namespace VxeButtonEvents {
@@ -260,6 +267,7 @@ export namespace VxeButtonEvents {
260
267
  export type Mouseenter = (params: VxeButtonDefines.MouseenterEventParams) => void
261
268
  export type Mouseleave = (params: VxeButtonDefines.MouseleaveEventParams) => void
262
269
  export type DropdownClick = (params: VxeButtonDefines.DropdownClickParams) => void
270
+ export type Contextmenu = (params: VxeButtonDefines.ContextmenuParams) => void
263
271
  }
264
272
 
265
273
  export namespace VxeButtonSlotTypes {