vxe-table 4.19.0-beta.2 → 4.19.0-beta.3

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 (121) hide show
  1. package/LICENSE +20 -20
  2. package/README.en.md +118 -118
  3. package/README.ja-JP.md +117 -117
  4. package/README.md +268 -268
  5. package/README.zh-TW.md +117 -117
  6. package/es/style.css +1 -1
  7. package/es/table/render/index.js +1 -1
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +2767 -2851
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/style.css +1 -1
  13. package/lib/table/render/index.js +1 -1
  14. package/lib/table/render/index.min.js +1 -1
  15. package/lib/ui/index.js +1 -1
  16. package/lib/ui/index.min.js +1 -1
  17. package/lib/ui/src/log.js +1 -1
  18. package/lib/ui/src/log.min.js +1 -1
  19. package/package.json +92 -92
  20. package/packages/colgroup/index.ts +22 -22
  21. package/packages/column/index.ts +22 -22
  22. package/packages/components.ts +43 -43
  23. package/packages/grid/index.ts +18 -18
  24. package/packages/grid/src/emits.ts +19 -19
  25. package/packages/grid/src/grid.ts +1768 -1768
  26. package/packages/grid/src/props.ts +23 -23
  27. package/packages/index.ts +4 -4
  28. package/packages/locale/lang/ar-EG.ts +840 -840
  29. package/packages/locale/lang/de-DE.ts +840 -840
  30. package/packages/locale/lang/en-US.ts +840 -840
  31. package/packages/locale/lang/es-ES.ts +840 -840
  32. package/packages/locale/lang/fr-FR.ts +840 -840
  33. package/packages/locale/lang/hu-HU.ts +840 -840
  34. package/packages/locale/lang/hy-AM.ts +840 -840
  35. package/packages/locale/lang/id-ID.ts +840 -840
  36. package/packages/locale/lang/it-IT.ts +840 -840
  37. package/packages/locale/lang/ja-JP.ts +840 -840
  38. package/packages/locale/lang/ko-KR.ts +840 -840
  39. package/packages/locale/lang/ms-MY.ts +840 -840
  40. package/packages/locale/lang/nb-NO.ts +840 -840
  41. package/packages/locale/lang/pt-BR.ts +840 -840
  42. package/packages/locale/lang/ru-RU.ts +840 -840
  43. package/packages/locale/lang/th-TH.ts +840 -840
  44. package/packages/locale/lang/ug-CN.ts +840 -840
  45. package/packages/locale/lang/uk-UA.ts +840 -840
  46. package/packages/locale/lang/uz-UZ.ts +840 -840
  47. package/packages/locale/lang/vi-VN.ts +840 -840
  48. package/packages/locale/lang/zh-CHT.ts +840 -840
  49. package/packages/locale/lang/zh-CN.ts +840 -840
  50. package/packages/locale/lang/zh-HK.ts +3 -3
  51. package/packages/locale/lang/zh-MO.ts +3 -3
  52. package/packages/locale/lang/zh-TC.ts +3 -3
  53. package/packages/locale/lang/zh-TW.ts +3 -3
  54. package/packages/table/index.ts +26 -26
  55. package/packages/table/module/custom/hook.ts +422 -422
  56. package/packages/table/module/custom/panel.ts +1512 -1512
  57. package/packages/table/module/edit/hook.ts +1064 -1064
  58. package/packages/table/module/export/export-panel.ts +567 -567
  59. package/packages/table/module/export/hook.ts +1654 -1654
  60. package/packages/table/module/export/import-panel.ts +266 -266
  61. package/packages/table/module/export/util.ts +24 -24
  62. package/packages/table/module/filter/hook.ts +468 -468
  63. package/packages/table/module/filter/panel.ts +301 -301
  64. package/packages/table/module/keyboard/hook.ts +494 -494
  65. package/packages/table/module/menu/hook.ts +325 -325
  66. package/packages/table/module/menu/panel.ts +201 -201
  67. package/packages/table/module/validator/hook.ts +631 -631
  68. package/packages/table/render/index.ts +1440 -1440
  69. package/packages/table/src/body.ts +935 -935
  70. package/packages/table/src/cell.ts +1290 -1290
  71. package/packages/table/src/column.ts +190 -190
  72. package/packages/table/src/columnInfo.ts +225 -225
  73. package/packages/table/src/emits.ts +125 -125
  74. package/packages/table/src/footer.ts +368 -368
  75. package/packages/table/src/group.ts +59 -59
  76. package/packages/table/src/header.ts +561 -561
  77. package/packages/table/src/props.ts +324 -324
  78. package/packages/table/src/store.ts +14 -14
  79. package/packages/table/src/table.ts +14274 -14274
  80. package/packages/table/src/use/cell-view.ts +44 -44
  81. package/packages/table/src/use/index.ts +1 -1
  82. package/packages/table/src/util.ts +1086 -1086
  83. package/packages/toolbar/index.ts +18 -18
  84. package/packages/toolbar/src/toolbar.ts +701 -701
  85. package/packages/ui/index.ts +532 -532
  86. package/packages/ui/src/anime.ts +52 -52
  87. package/packages/ui/src/comp.ts +3 -3
  88. package/packages/ui/src/dom.ts +264 -264
  89. package/packages/ui/src/log.ts +8 -8
  90. package/packages/ui/src/utils.ts +56 -56
  91. package/packages/ui/src/vn.ts +55 -55
  92. package/packages/v-x-e-table/index.d.ts +4 -4
  93. package/packages/v-x-e-table/index.ts +4 -4
  94. package/styles/all.scss +7 -7
  95. package/styles/base.scss +16 -16
  96. package/styles/components/grid.scss +89 -89
  97. package/styles/components/icon.scss +225 -225
  98. package/styles/components/old-icon.scss +715 -715
  99. package/styles/components/table-module/all.scss +6 -6
  100. package/styles/components/table-module/custom.scss +550 -550
  101. package/styles/components/table-module/export.scss +130 -130
  102. package/styles/components/table-module/filter.scss +130 -130
  103. package/styles/components/table-module/menu.scss +81 -81
  104. package/styles/components/table.scss +2679 -2679
  105. package/styles/components/toolbar.scss +119 -119
  106. package/styles/default.scss +2 -2
  107. package/styles/helpers/baseMixin.scss +95 -95
  108. package/styles/index.scss +4 -4
  109. package/styles/modules.scss +5 -5
  110. package/styles/theme/base.scss +93 -93
  111. package/styles/theme/dark.scss +49 -49
  112. package/styles/theme/light.scss +44 -44
  113. package/styles/variable.scss +43 -43
  114. package/types/all.d.ts +37 -37
  115. package/types/index.d.ts +4 -4
  116. /package/es/{iconfont.1778157083004.ttf → iconfont.1778318183872.ttf} +0 -0
  117. /package/es/{iconfont.1778157083004.woff → iconfont.1778318183872.woff} +0 -0
  118. /package/es/{iconfont.1778157083004.woff2 → iconfont.1778318183872.woff2} +0 -0
  119. /package/lib/{iconfont.1778157083004.ttf → iconfont.1778318183872.ttf} +0 -0
  120. /package/lib/{iconfont.1778157083004.woff → iconfont.1778318183872.woff} +0 -0
  121. /package/lib/{iconfont.1778157083004.woff2 → iconfont.1778318183872.woff2} +0 -0
@@ -1,325 +1,325 @@
1
- import { nextTick } from 'vue'
2
- import XEUtils from 'xe-utils'
3
- import { VxeUI } from '../../../ui'
4
- import { getDomNode, getAbsolutePos, getEventTargetNode } from '../../../ui/src/dom'
5
- import { isEnableConf, hasChildrenList } from '../../../ui/src/utils'
6
-
7
- import type { TableMenuMethods, TableMenuPrivateMethods } from '../../../../types'
8
-
9
- const { menus, hooks, globalEvents, GLOBAL_EVENT_KEYS } = VxeUI
10
-
11
- const tableMenuMethodKeys: (keyof TableMenuMethods)[] = ['closeMenu']
12
-
13
- hooks.add('tableMenuModule', {
14
- setupTable ($xeTable) {
15
- const { xID, props, reactData, internalData } = $xeTable
16
- const { refElem, refTableFilter, refTableMenu } = $xeTable.getRefMaps()
17
- const { computeMouseOpts, computeIsContentMenu, computeMenuOpts } = $xeTable.getComputeMaps()
18
-
19
- const $xeGrid = $xeTable.xeGrid
20
- const $xeGantt = $xeTable.xeGantt
21
- const $xeGGWrapper = $xeGrid || $xeGantt
22
-
23
- let menuMethods = {} as TableMenuMethods
24
- let menuPrivateMethods = {} as TableMenuPrivateMethods
25
-
26
- /**
27
- * 显示快捷菜单
28
- */
29
- const handleOpenMenuEvent = (evnt: any, type: 'header' | 'body' | 'footer', params: any) => {
30
- const { ctxMenuStore } = reactData
31
- const isContentMenu = computeIsContentMenu.value
32
- const menuOpts = computeMenuOpts.value
33
- const config = menuOpts[type]
34
- const { zIndex, transfer, visibleMethod } = menuOpts
35
- if (config) {
36
- const { options, disabled } = config
37
- if (disabled) {
38
- evnt.preventDefault()
39
- } else if (isContentMenu && options && options.length) {
40
- params.options = options
41
- $xeTable.preventEvent(evnt, 'event.showMenu', params, () => {
42
- if (!visibleMethod || visibleMethod(params)) {
43
- evnt.preventDefault()
44
- $xeTable.updateZindex()
45
- const el = $xeGGWrapper ? $xeGGWrapper.getRefMaps().refElem.value : refElem.value
46
- if (!el) {
47
- return
48
- }
49
- const tableRect = el.getBoundingClientRect()
50
- const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
51
-
52
- let top = evnt.clientY - tableRect.y
53
- let left = evnt.clientX - tableRect.x
54
- if (transfer) {
55
- top = evnt.clientY + scrollTop
56
- left = evnt.clientX + scrollLeft
57
- }
58
-
59
- const handleVisible = () => {
60
- internalData._currMenuParams = params
61
- Object.assign(ctxMenuStore, {
62
- visible: true,
63
- list: options,
64
- selected: null,
65
- selectChild: null,
66
- showChild: false,
67
- style: {
68
- zIndex: zIndex || internalData.tZindex,
69
- top: `${top}px`,
70
- left: `${left}px`
71
- }
72
- })
73
- nextTick(() => {
74
- const tableMenu = refTableMenu.value
75
- const ctxElem = tableMenu.getRefMaps().refElem.value
76
- const clientHeight = ctxElem.clientHeight
77
- const clientWidth = ctxElem.clientWidth
78
- const { boundingTop, boundingLeft } = getAbsolutePos(ctxElem)
79
- const offsetTop = boundingTop + clientHeight - visibleHeight
80
- const offsetLeft = boundingLeft + clientWidth - visibleWidth
81
- if (offsetTop > -10) {
82
- ctxMenuStore.style.top = `${Math.max(scrollTop + 2, top - clientHeight - 2)}px`
83
- }
84
- if (offsetLeft > -10) {
85
- ctxMenuStore.style.left = `${Math.max(scrollLeft + 2, left - clientWidth - 2)}px`
86
- }
87
- })
88
- }
89
- const { keyboard, row, column } = params
90
- if (keyboard && row && column) {
91
- $xeTable.scrollToRow(row, column).then(() => {
92
- const cell = $xeTable.getCellElement(row, column)
93
- if (cell) {
94
- const { boundingTop, boundingLeft } = getAbsolutePos(cell)
95
- top = boundingTop + scrollTop + Math.floor(cell.offsetHeight / 2)
96
- left = boundingLeft + scrollLeft + Math.floor(cell.offsetWidth / 2)
97
- }
98
- handleVisible()
99
- })
100
- } else {
101
- handleVisible()
102
- }
103
- } else {
104
- menuMethods.closeMenu()
105
- }
106
- })
107
- }
108
- }
109
- $xeTable.closeFilter()
110
- }
111
-
112
- menuMethods = {
113
- /**
114
- * 关闭快捷菜单
115
- */
116
- closeMenu () {
117
- Object.assign(reactData.ctxMenuStore, {
118
- visible: false,
119
- selected: null,
120
- selectChild: null,
121
- showChild: false
122
- })
123
- return nextTick()
124
- }
125
- }
126
-
127
- menuPrivateMethods = {
128
- /**
129
- * 处理菜单的移动
130
- */
131
- moveCtxMenu (evnt, ctxMenuStore, property, hasOper, operRest, menuList) {
132
- let selectItem
133
- const selectIndex = XEUtils.findIndexOf(menuList, item => ctxMenuStore[property] === item)
134
- if (hasOper) {
135
- if (operRest && hasChildrenList(ctxMenuStore.selected)) {
136
- ctxMenuStore.showChild = true
137
- } else {
138
- ctxMenuStore.showChild = false
139
- ctxMenuStore.selectChild = null
140
- }
141
- } else if (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)) {
142
- for (let len = selectIndex - 1; len >= 0; len--) {
143
- if (menuList[len].visible !== false) {
144
- selectItem = menuList[len]
145
- break
146
- }
147
- }
148
- ctxMenuStore[property] = selectItem || menuList[menuList.length - 1]
149
- } else if (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)) {
150
- for (let index = selectIndex + 1; index < menuList.length; index++) {
151
- if (menuList[index].visible !== false) {
152
- selectItem = menuList[index]
153
- break
154
- }
155
- }
156
- ctxMenuStore[property] = selectItem || menuList[0]
157
- } else if (ctxMenuStore[property] && (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER) || globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR))) {
158
- $xeTable.ctxMenuLinkEvent(evnt, ctxMenuStore[property])
159
- }
160
- },
161
- handleOpenMenuEvent,
162
- /**
163
- * 快捷菜单事件处理
164
- */
165
- handleGlobalContextmenuEvent (evnt) {
166
- const $xeGrid = $xeTable.xeGrid
167
- const $xeGantt = $xeTable.xeGantt
168
-
169
- const { mouseConfig, menuConfig } = props
170
- const { editStore, ctxMenuStore } = reactData
171
- const { visibleColumn } = internalData
172
- const tableFilter = refTableFilter.value
173
- const tableMenu = refTableMenu.value
174
- const mouseOpts = computeMouseOpts.value
175
- const menuOpts = computeMenuOpts.value
176
- const el = refElem.value
177
- const { selected } = editStore
178
- const layoutList = ['header', 'body', 'footer']
179
- if (isEnableConf(menuConfig)) {
180
- if (ctxMenuStore.visible && tableMenu && getEventTargetNode(evnt, tableMenu.getRefMaps().refElem.value).flag) {
181
- evnt.preventDefault()
182
- return
183
- }
184
- if (internalData._keyCtx) {
185
- const type = 'body'
186
- const params: any = { source: 'table', type, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, keyboard: true, columns: visibleColumn.slice(0), $event: evnt }
187
- // 如果开启单元格区域
188
- if (mouseConfig && mouseOpts.area) {
189
- const activeArea = $xeTable.getActiveCellArea()
190
- if (activeArea && activeArea.row && activeArea.column) {
191
- params.row = activeArea.row
192
- params.column = activeArea.column
193
- handleOpenMenuEvent(evnt, type, params)
194
- return
195
- }
196
- } else if (mouseConfig && mouseOpts.selected) {
197
- // 如果启用键盘导航且已选中单元格
198
- if (selected.row && selected.column) {
199
- params.row = selected.row
200
- params.column = selected.column
201
- handleOpenMenuEvent(evnt, type, params)
202
- return
203
- }
204
- }
205
- }
206
- // 分别匹配表尾、内容、表尾的快捷菜单
207
- for (let index = 0; index < layoutList.length; index++) {
208
- const layout = layoutList[index] as 'header' | 'body' | 'footer'
209
- const columnTargetNode = getEventTargetNode(evnt, el, `vxe-${layout}--column`, (target: any) => {
210
- // target=td|th,直接向上找 table 去匹配即可
211
- return target.parentNode.parentNode.parentNode.getAttribute('xid') === xID
212
- })
213
- const params: any = { source: 'table', type: layout, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, columns: visibleColumn.slice(0), $event: evnt }
214
- if (columnTargetNode.flag) {
215
- const cell = columnTargetNode.targetElem
216
- const columnNodeRest = $xeTable.getColumnNode(cell)
217
- const column = columnNodeRest ? columnNodeRest.item : null
218
- let typePrefix = `${layout}-`
219
- if (column) {
220
- Object.assign(params, { column, columnIndex: $xeTable.getColumnIndex(column), cell })
221
- }
222
- if (layout === 'body') {
223
- const rowNodeRest = $xeTable.getRowNode(cell.parentNode)
224
- const row = rowNodeRest ? rowNodeRest.item : null
225
- typePrefix = ''
226
- if (row) {
227
- params.row = row
228
- params.rowIndex = $xeTable.getRowIndex(row)
229
- }
230
- }
231
- const eventType = `${typePrefix}cell-menu` as 'cell-menu' | 'header-cell-menu' | 'footer-cell-menu'
232
- handleOpenMenuEvent(evnt, layout, params)
233
- $xeTable.dispatchEvent(eventType, params, evnt)
234
- return
235
- } else if (getEventTargetNode(evnt, el, `vxe-table--${layout}-wrapper`, target => target.getAttribute('xid') === xID).flag || (layout === 'body' && getEventTargetNode(evnt, el, 'vxe-table--empty-place-wrapper', target => target.getAttribute('xid') === xID).flag)) {
236
- if (menuOpts.trigger === 'cell') {
237
- evnt.preventDefault()
238
- } else {
239
- handleOpenMenuEvent(evnt, layout, params)
240
- }
241
- return
242
- }
243
- }
244
- }
245
- if (tableFilter && !getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value).flag) {
246
- $xeTable.closeFilter()
247
- }
248
- menuMethods.closeMenu()
249
- },
250
- ctxMenuMouseoverEvent (evnt, item, child) {
251
- const menuElem = evnt.currentTarget as HTMLDivElement
252
- const { ctxMenuStore } = reactData
253
- evnt.preventDefault()
254
- evnt.stopPropagation()
255
- ctxMenuStore.selected = item
256
- ctxMenuStore.selectChild = child
257
- if (!child) {
258
- ctxMenuStore.showChild = hasChildrenList(item)
259
- if (ctxMenuStore.showChild) {
260
- nextTick(() => {
261
- const childWrapperElem = menuElem.nextElementSibling as HTMLDivElement
262
- if (childWrapperElem) {
263
- const { boundingTop, boundingLeft, visibleHeight, visibleWidth } = getAbsolutePos(menuElem)
264
- const posTop = boundingTop + menuElem.offsetHeight
265
- const posLeft = boundingLeft + menuElem.offsetWidth
266
- let left = ''
267
- let right = ''
268
- // 是否超出右侧
269
- if (posLeft + childWrapperElem.offsetWidth > visibleWidth - 10) {
270
- left = 'auto'
271
- right = `${menuElem.offsetWidth}px`
272
- }
273
- // 是否超出底部
274
- let top = ''
275
- let bottom = ''
276
- if (posTop + childWrapperElem.offsetHeight > visibleHeight - 10) {
277
- top = 'auto'
278
- bottom = '0'
279
- }
280
- childWrapperElem.style.left = left
281
- childWrapperElem.style.right = right
282
- childWrapperElem.style.top = top
283
- childWrapperElem.style.bottom = bottom
284
- }
285
- })
286
- }
287
- }
288
- },
289
- ctxMenuMouseoutEvent (evnt, item) {
290
- const { ctxMenuStore } = reactData
291
- if (!item.children) {
292
- ctxMenuStore.selected = null
293
- }
294
- ctxMenuStore.selectChild = null
295
- },
296
- /**
297
- * 快捷菜单点击事件
298
- */
299
- ctxMenuLinkEvent (evnt, menu) {
300
- const $xeGrid = $xeTable.xeGrid
301
- const $xeGantt = $xeTable.xeGantt
302
-
303
- // 如果一级菜单有配置 code 则允许点击,否则不能点击
304
- if (!menu.loading && !menu.disabled && (menu.code || !menu.children || !menu.children.length)) {
305
- const gMenuOpts = menus.get(menu.code)
306
- const params = Object.assign({}, internalData._currMenuParams, { menu, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, $event: evnt })
307
- const tmMethod = gMenuOpts ? (gMenuOpts.tableMenuMethod || gMenuOpts.menuMethod) : null
308
- if (tmMethod) {
309
- tmMethod(params, evnt)
310
- }
311
- $xeTable.dispatchEvent('menu-click', params, evnt)
312
- menuMethods.closeMenu()
313
- }
314
- }
315
- }
316
-
317
- return { ...menuMethods, ...menuPrivateMethods }
318
- },
319
- setupGrid ($xeGrid) {
320
- return $xeGrid.extendTableMethods(tableMenuMethodKeys)
321
- },
322
- setupGantt ($xeGantt) {
323
- return $xeGantt.extendTableMethods(tableMenuMethodKeys)
324
- }
325
- })
1
+ import { nextTick } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+ import { VxeUI } from '../../../ui'
4
+ import { getDomNode, getAbsolutePos, getEventTargetNode } from '../../../ui/src/dom'
5
+ import { isEnableConf, hasChildrenList } from '../../../ui/src/utils'
6
+
7
+ import type { TableMenuMethods, TableMenuPrivateMethods } from '../../../../types'
8
+
9
+ const { menus, hooks, globalEvents, GLOBAL_EVENT_KEYS } = VxeUI
10
+
11
+ const tableMenuMethodKeys: (keyof TableMenuMethods)[] = ['closeMenu']
12
+
13
+ hooks.add('tableMenuModule', {
14
+ setupTable ($xeTable) {
15
+ const { xID, props, reactData, internalData } = $xeTable
16
+ const { refElem, refTableFilter, refTableMenu } = $xeTable.getRefMaps()
17
+ const { computeMouseOpts, computeIsContentMenu, computeMenuOpts } = $xeTable.getComputeMaps()
18
+
19
+ const $xeGrid = $xeTable.xeGrid
20
+ const $xeGantt = $xeTable.xeGantt
21
+ const $xeGGWrapper = $xeGrid || $xeGantt
22
+
23
+ let menuMethods = {} as TableMenuMethods
24
+ let menuPrivateMethods = {} as TableMenuPrivateMethods
25
+
26
+ /**
27
+ * 显示快捷菜单
28
+ */
29
+ const handleOpenMenuEvent = (evnt: any, type: 'header' | 'body' | 'footer', params: any) => {
30
+ const { ctxMenuStore } = reactData
31
+ const isContentMenu = computeIsContentMenu.value
32
+ const menuOpts = computeMenuOpts.value
33
+ const config = menuOpts[type]
34
+ const { zIndex, transfer, visibleMethod } = menuOpts
35
+ if (config) {
36
+ const { options, disabled } = config
37
+ if (disabled) {
38
+ evnt.preventDefault()
39
+ } else if (isContentMenu && options && options.length) {
40
+ params.options = options
41
+ $xeTable.preventEvent(evnt, 'event.showMenu', params, () => {
42
+ if (!visibleMethod || visibleMethod(params)) {
43
+ evnt.preventDefault()
44
+ $xeTable.updateZindex()
45
+ const el = $xeGGWrapper ? $xeGGWrapper.getRefMaps().refElem.value : refElem.value
46
+ if (!el) {
47
+ return
48
+ }
49
+ const tableRect = el.getBoundingClientRect()
50
+ const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
51
+
52
+ let top = evnt.clientY - tableRect.y
53
+ let left = evnt.clientX - tableRect.x
54
+ if (transfer) {
55
+ top = evnt.clientY + scrollTop
56
+ left = evnt.clientX + scrollLeft
57
+ }
58
+
59
+ const handleVisible = () => {
60
+ internalData._currMenuParams = params
61
+ Object.assign(ctxMenuStore, {
62
+ visible: true,
63
+ list: options,
64
+ selected: null,
65
+ selectChild: null,
66
+ showChild: false,
67
+ style: {
68
+ zIndex: zIndex || internalData.tZindex,
69
+ top: `${top}px`,
70
+ left: `${left}px`
71
+ }
72
+ })
73
+ nextTick(() => {
74
+ const tableMenu = refTableMenu.value
75
+ const ctxElem = tableMenu.getRefMaps().refElem.value
76
+ const clientHeight = ctxElem.clientHeight
77
+ const clientWidth = ctxElem.clientWidth
78
+ const { boundingTop, boundingLeft } = getAbsolutePos(ctxElem)
79
+ const offsetTop = boundingTop + clientHeight - visibleHeight
80
+ const offsetLeft = boundingLeft + clientWidth - visibleWidth
81
+ if (offsetTop > -10) {
82
+ ctxMenuStore.style.top = `${Math.max(scrollTop + 2, top - clientHeight - 2)}px`
83
+ }
84
+ if (offsetLeft > -10) {
85
+ ctxMenuStore.style.left = `${Math.max(scrollLeft + 2, left - clientWidth - 2)}px`
86
+ }
87
+ })
88
+ }
89
+ const { keyboard, row, column } = params
90
+ if (keyboard && row && column) {
91
+ $xeTable.scrollToRow(row, column).then(() => {
92
+ const cell = $xeTable.getCellElement(row, column)
93
+ if (cell) {
94
+ const { boundingTop, boundingLeft } = getAbsolutePos(cell)
95
+ top = boundingTop + scrollTop + Math.floor(cell.offsetHeight / 2)
96
+ left = boundingLeft + scrollLeft + Math.floor(cell.offsetWidth / 2)
97
+ }
98
+ handleVisible()
99
+ })
100
+ } else {
101
+ handleVisible()
102
+ }
103
+ } else {
104
+ menuMethods.closeMenu()
105
+ }
106
+ })
107
+ }
108
+ }
109
+ $xeTable.closeFilter()
110
+ }
111
+
112
+ menuMethods = {
113
+ /**
114
+ * 关闭快捷菜单
115
+ */
116
+ closeMenu () {
117
+ Object.assign(reactData.ctxMenuStore, {
118
+ visible: false,
119
+ selected: null,
120
+ selectChild: null,
121
+ showChild: false
122
+ })
123
+ return nextTick()
124
+ }
125
+ }
126
+
127
+ menuPrivateMethods = {
128
+ /**
129
+ * 处理菜单的移动
130
+ */
131
+ moveCtxMenu (evnt, ctxMenuStore, property, hasOper, operRest, menuList) {
132
+ let selectItem
133
+ const selectIndex = XEUtils.findIndexOf(menuList, item => ctxMenuStore[property] === item)
134
+ if (hasOper) {
135
+ if (operRest && hasChildrenList(ctxMenuStore.selected)) {
136
+ ctxMenuStore.showChild = true
137
+ } else {
138
+ ctxMenuStore.showChild = false
139
+ ctxMenuStore.selectChild = null
140
+ }
141
+ } else if (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)) {
142
+ for (let len = selectIndex - 1; len >= 0; len--) {
143
+ if (menuList[len].visible !== false) {
144
+ selectItem = menuList[len]
145
+ break
146
+ }
147
+ }
148
+ ctxMenuStore[property] = selectItem || menuList[menuList.length - 1]
149
+ } else if (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)) {
150
+ for (let index = selectIndex + 1; index < menuList.length; index++) {
151
+ if (menuList[index].visible !== false) {
152
+ selectItem = menuList[index]
153
+ break
154
+ }
155
+ }
156
+ ctxMenuStore[property] = selectItem || menuList[0]
157
+ } else if (ctxMenuStore[property] && (globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER) || globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR))) {
158
+ $xeTable.ctxMenuLinkEvent(evnt, ctxMenuStore[property])
159
+ }
160
+ },
161
+ handleOpenMenuEvent,
162
+ /**
163
+ * 快捷菜单事件处理
164
+ */
165
+ handleGlobalContextmenuEvent (evnt) {
166
+ const $xeGrid = $xeTable.xeGrid
167
+ const $xeGantt = $xeTable.xeGantt
168
+
169
+ const { mouseConfig, menuConfig } = props
170
+ const { editStore, ctxMenuStore } = reactData
171
+ const { visibleColumn } = internalData
172
+ const tableFilter = refTableFilter.value
173
+ const tableMenu = refTableMenu.value
174
+ const mouseOpts = computeMouseOpts.value
175
+ const menuOpts = computeMenuOpts.value
176
+ const el = refElem.value
177
+ const { selected } = editStore
178
+ const layoutList = ['header', 'body', 'footer']
179
+ if (isEnableConf(menuConfig)) {
180
+ if (ctxMenuStore.visible && tableMenu && getEventTargetNode(evnt, tableMenu.getRefMaps().refElem.value).flag) {
181
+ evnt.preventDefault()
182
+ return
183
+ }
184
+ if (internalData._keyCtx) {
185
+ const type = 'body'
186
+ const params: any = { source: 'table', type, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, keyboard: true, columns: visibleColumn.slice(0), $event: evnt }
187
+ // 如果开启单元格区域
188
+ if (mouseConfig && mouseOpts.area) {
189
+ const activeArea = $xeTable.getActiveCellArea()
190
+ if (activeArea && activeArea.row && activeArea.column) {
191
+ params.row = activeArea.row
192
+ params.column = activeArea.column
193
+ handleOpenMenuEvent(evnt, type, params)
194
+ return
195
+ }
196
+ } else if (mouseConfig && mouseOpts.selected) {
197
+ // 如果启用键盘导航且已选中单元格
198
+ if (selected.row && selected.column) {
199
+ params.row = selected.row
200
+ params.column = selected.column
201
+ handleOpenMenuEvent(evnt, type, params)
202
+ return
203
+ }
204
+ }
205
+ }
206
+ // 分别匹配表尾、内容、表尾的快捷菜单
207
+ for (let index = 0; index < layoutList.length; index++) {
208
+ const layout = layoutList[index] as 'header' | 'body' | 'footer'
209
+ const columnTargetNode = getEventTargetNode(evnt, el, `vxe-${layout}--column`, (target: any) => {
210
+ // target=td|th,直接向上找 table 去匹配即可
211
+ return target.parentNode.parentNode.parentNode.getAttribute('xid') === xID
212
+ })
213
+ const params: any = { source: 'table', type: layout, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, columns: visibleColumn.slice(0), $event: evnt }
214
+ if (columnTargetNode.flag) {
215
+ const cell = columnTargetNode.targetElem
216
+ const columnNodeRest = $xeTable.getColumnNode(cell)
217
+ const column = columnNodeRest ? columnNodeRest.item : null
218
+ let typePrefix = `${layout}-`
219
+ if (column) {
220
+ Object.assign(params, { column, columnIndex: $xeTable.getColumnIndex(column), cell })
221
+ }
222
+ if (layout === 'body') {
223
+ const rowNodeRest = $xeTable.getRowNode(cell.parentNode)
224
+ const row = rowNodeRest ? rowNodeRest.item : null
225
+ typePrefix = ''
226
+ if (row) {
227
+ params.row = row
228
+ params.rowIndex = $xeTable.getRowIndex(row)
229
+ }
230
+ }
231
+ const eventType = `${typePrefix}cell-menu` as 'cell-menu' | 'header-cell-menu' | 'footer-cell-menu'
232
+ handleOpenMenuEvent(evnt, layout, params)
233
+ $xeTable.dispatchEvent(eventType, params, evnt)
234
+ return
235
+ } else if (getEventTargetNode(evnt, el, `vxe-table--${layout}-wrapper`, target => target.getAttribute('xid') === xID).flag || (layout === 'body' && getEventTargetNode(evnt, el, 'vxe-table--empty-place-wrapper', target => target.getAttribute('xid') === xID).flag)) {
236
+ if (menuOpts.trigger === 'cell') {
237
+ evnt.preventDefault()
238
+ } else {
239
+ handleOpenMenuEvent(evnt, layout, params)
240
+ }
241
+ return
242
+ }
243
+ }
244
+ }
245
+ if (tableFilter && !getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value).flag) {
246
+ $xeTable.closeFilter()
247
+ }
248
+ menuMethods.closeMenu()
249
+ },
250
+ ctxMenuMouseoverEvent (evnt, item, child) {
251
+ const menuElem = evnt.currentTarget as HTMLDivElement
252
+ const { ctxMenuStore } = reactData
253
+ evnt.preventDefault()
254
+ evnt.stopPropagation()
255
+ ctxMenuStore.selected = item
256
+ ctxMenuStore.selectChild = child
257
+ if (!child) {
258
+ ctxMenuStore.showChild = hasChildrenList(item)
259
+ if (ctxMenuStore.showChild) {
260
+ nextTick(() => {
261
+ const childWrapperElem = menuElem.nextElementSibling as HTMLDivElement
262
+ if (childWrapperElem) {
263
+ const { boundingTop, boundingLeft, visibleHeight, visibleWidth } = getAbsolutePos(menuElem)
264
+ const posTop = boundingTop + menuElem.offsetHeight
265
+ const posLeft = boundingLeft + menuElem.offsetWidth
266
+ let left = ''
267
+ let right = ''
268
+ // 是否超出右侧
269
+ if (posLeft + childWrapperElem.offsetWidth > visibleWidth - 10) {
270
+ left = 'auto'
271
+ right = `${menuElem.offsetWidth}px`
272
+ }
273
+ // 是否超出底部
274
+ let top = ''
275
+ let bottom = ''
276
+ if (posTop + childWrapperElem.offsetHeight > visibleHeight - 10) {
277
+ top = 'auto'
278
+ bottom = '0'
279
+ }
280
+ childWrapperElem.style.left = left
281
+ childWrapperElem.style.right = right
282
+ childWrapperElem.style.top = top
283
+ childWrapperElem.style.bottom = bottom
284
+ }
285
+ })
286
+ }
287
+ }
288
+ },
289
+ ctxMenuMouseoutEvent (evnt, item) {
290
+ const { ctxMenuStore } = reactData
291
+ if (!item.children) {
292
+ ctxMenuStore.selected = null
293
+ }
294
+ ctxMenuStore.selectChild = null
295
+ },
296
+ /**
297
+ * 快捷菜单点击事件
298
+ */
299
+ ctxMenuLinkEvent (evnt, menu) {
300
+ const $xeGrid = $xeTable.xeGrid
301
+ const $xeGantt = $xeTable.xeGantt
302
+
303
+ // 如果一级菜单有配置 code 则允许点击,否则不能点击
304
+ if (!menu.loading && !menu.disabled && (menu.code || !menu.children || !menu.children.length)) {
305
+ const gMenuOpts = menus.get(menu.code)
306
+ const params = Object.assign({}, internalData._currMenuParams, { menu, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, $event: evnt })
307
+ const tmMethod = gMenuOpts ? (gMenuOpts.tableMenuMethod || gMenuOpts.menuMethod) : null
308
+ if (tmMethod) {
309
+ tmMethod(params, evnt)
310
+ }
311
+ $xeTable.dispatchEvent('menu-click', params, evnt)
312
+ menuMethods.closeMenu()
313
+ }
314
+ }
315
+ }
316
+
317
+ return { ...menuMethods, ...menuPrivateMethods }
318
+ },
319
+ setupGrid ($xeGrid) {
320
+ return $xeGrid.extendTableMethods(tableMenuMethodKeys)
321
+ },
322
+ setupGantt ($xeGantt) {
323
+ return $xeGantt.extendTableMethods(tableMenuMethodKeys)
324
+ }
325
+ })