vxe-pc-ui 4.15.13 → 4.15.14
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.
- package/dist/all.esm.js +708 -139
- package/dist/style.css +1 -1
- package/dist/style.min.css +1 -1
- package/es/button/style.css +11 -0
- package/es/button/style.min.css +1 -1
- package/es/checkbox/src/button.js +3 -1
- package/es/checkbox/src/group.js +6 -1
- package/es/checkbox-button/style.css +151 -8
- package/es/checkbox-button/style.min.css +1 -1
- package/es/icon/style.css +1 -1
- package/es/icon-picker/src/icon-picker.js +145 -46
- package/es/icon-picker/style.css +29 -5
- package/es/icon-picker/style.min.css +1 -1
- package/es/language/ar-EG.js +3 -0
- package/es/language/de-DE.js +3 -0
- package/es/language/en-US.js +3 -0
- package/es/language/es-ES.js +3 -0
- package/es/language/fr-FR.js +3 -0
- package/es/language/hu-HU.js +3 -0
- package/es/language/hy-AM.js +3 -0
- package/es/language/id-ID.js +3 -0
- package/es/language/it-IT.js +3 -0
- package/es/language/ja-JP.js +3 -0
- package/es/language/ko-KR.js +3 -0
- package/es/language/ms-MY.js +3 -0
- package/es/language/nb-NO.js +3 -0
- package/es/language/pt-BR.js +3 -0
- package/es/language/ru-RU.js +3 -0
- package/es/language/th-TH.js +3 -0
- package/es/language/ug-CN.js +3 -0
- package/es/language/uk-UA.js +3 -0
- package/es/language/uz-UZ.js +3 -0
- package/es/language/vi-VN.js +3 -0
- package/es/language/zh-CHT.js +3 -0
- package/es/language/zh-CN.js +3 -0
- package/es/list/src/list.js +14 -1
- package/es/radio/src/button.js +3 -1
- package/es/radio/src/group.js +6 -1
- package/es/radio-button/style.css +151 -8
- package/es/radio-button/style.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/tree/src/tree.js +441 -18
- package/es/tree/src/util.js +15 -0
- package/es/ui/index.js +5 -2
- package/es/ui/src/log.js +1 -1
- package/es/vxe-button/style.css +11 -0
- package/es/vxe-button/style.min.css +1 -1
- package/es/vxe-checkbox-button/style.css +151 -8
- package/es/vxe-checkbox-button/style.min.css +1 -1
- package/es/vxe-icon-picker/style.css +29 -5
- package/es/vxe-icon-picker/style.min.css +1 -1
- package/es/vxe-radio-button/style.css +151 -8
- package/es/vxe-radio-button/style.min.css +1 -1
- package/lib/button/style/style.css +11 -0
- package/lib/button/style/style.min.css +1 -1
- package/lib/checkbox/src/button.js +3 -1
- package/lib/checkbox/src/button.min.js +1 -1
- package/lib/checkbox/src/group.js +6 -0
- package/lib/checkbox/src/group.min.js +1 -1
- package/lib/checkbox-button/style/style.css +151 -8
- package/lib/checkbox-button/style/style.min.css +1 -1
- package/lib/icon/style/style.css +1 -1
- package/lib/icon/style/style.min.css +1 -1
- package/lib/icon-picker/src/icon-picker.js +143 -29
- package/lib/icon-picker/src/icon-picker.min.js +1 -1
- package/lib/icon-picker/style/style.css +29 -5
- package/lib/icon-picker/style/style.min.css +1 -1
- package/lib/index.umd.js +731 -49
- package/lib/index.umd.min.js +1 -1
- package/lib/language/ar-EG.js +3 -0
- package/lib/language/ar-EG.min.js +1 -1
- package/lib/language/ar-EG.umd.js +3 -0
- package/lib/language/de-DE.js +3 -0
- package/lib/language/de-DE.min.js +1 -1
- package/lib/language/de-DE.umd.js +3 -0
- package/lib/language/en-US.js +3 -0
- package/lib/language/en-US.min.js +1 -1
- package/lib/language/en-US.umd.js +3 -0
- package/lib/language/es-ES.js +3 -0
- package/lib/language/es-ES.min.js +1 -1
- package/lib/language/es-ES.umd.js +3 -0
- package/lib/language/fr-FR.js +3 -0
- package/lib/language/fr-FR.min.js +1 -1
- package/lib/language/fr-FR.umd.js +3 -0
- package/lib/language/hu-HU.js +3 -0
- package/lib/language/hu-HU.min.js +1 -1
- package/lib/language/hu-HU.umd.js +3 -0
- package/lib/language/hy-AM.js +3 -0
- package/lib/language/hy-AM.min.js +1 -1
- package/lib/language/hy-AM.umd.js +3 -0
- package/lib/language/id-ID.js +3 -0
- package/lib/language/id-ID.min.js +1 -1
- package/lib/language/id-ID.umd.js +3 -0
- package/lib/language/it-IT.js +3 -0
- package/lib/language/it-IT.min.js +1 -1
- package/lib/language/it-IT.umd.js +3 -0
- package/lib/language/ja-JP.js +3 -0
- package/lib/language/ja-JP.min.js +1 -1
- package/lib/language/ja-JP.umd.js +3 -0
- package/lib/language/ko-KR.js +3 -0
- package/lib/language/ko-KR.min.js +1 -1
- package/lib/language/ko-KR.umd.js +3 -0
- package/lib/language/ms-MY.js +3 -0
- package/lib/language/ms-MY.min.js +1 -1
- package/lib/language/ms-MY.umd.js +3 -0
- package/lib/language/nb-NO.js +3 -0
- package/lib/language/nb-NO.min.js +1 -1
- package/lib/language/nb-NO.umd.js +3 -0
- package/lib/language/pt-BR.js +3 -0
- package/lib/language/pt-BR.min.js +1 -1
- package/lib/language/pt-BR.umd.js +3 -0
- package/lib/language/ru-RU.js +3 -0
- package/lib/language/ru-RU.min.js +1 -1
- package/lib/language/ru-RU.umd.js +3 -0
- package/lib/language/th-TH.js +3 -0
- package/lib/language/th-TH.min.js +1 -1
- package/lib/language/th-TH.umd.js +3 -0
- package/lib/language/ug-CN.js +3 -0
- package/lib/language/ug-CN.min.js +1 -1
- package/lib/language/ug-CN.umd.js +3 -0
- package/lib/language/uk-UA.js +3 -0
- package/lib/language/uk-UA.min.js +1 -1
- package/lib/language/uk-UA.umd.js +3 -0
- package/lib/language/uz-UZ.js +3 -0
- package/lib/language/uz-UZ.min.js +1 -1
- package/lib/language/uz-UZ.umd.js +3 -0
- package/lib/language/vi-VN.js +3 -0
- package/lib/language/vi-VN.min.js +1 -1
- package/lib/language/vi-VN.umd.js +3 -0
- package/lib/language/zh-CHT.js +3 -0
- package/lib/language/zh-CHT.min.js +1 -1
- package/lib/language/zh-CHT.umd.js +3 -0
- package/lib/language/zh-CN.js +3 -0
- package/lib/language/zh-CN.min.js +1 -1
- package/lib/language/zh-CN.umd.js +3 -0
- package/lib/list/src/list.js +19 -1
- package/lib/list/src/list.min.js +1 -1
- package/lib/radio/src/button.js +3 -1
- package/lib/radio/src/button.min.js +1 -1
- package/lib/radio/src/group.js +7 -1
- package/lib/radio/src/group.min.js +1 -1
- package/lib/radio-button/style/style.css +151 -8
- package/lib/radio-button/style/style.min.css +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/tree/src/tree.js +525 -14
- package/lib/tree/src/tree.min.js +1 -1
- package/lib/tree/src/util.js +16 -0
- package/lib/tree/src/util.min.js +1 -1
- package/lib/ui/index.js +5 -2
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-button/style/style.css +11 -0
- package/lib/vxe-button/style/style.min.css +1 -1
- package/lib/vxe-checkbox-button/style/style.css +151 -8
- package/lib/vxe-checkbox-button/style/style.min.css +1 -1
- package/lib/vxe-icon-picker/style/style.css +29 -5
- package/lib/vxe-icon-picker/style/style.min.css +1 -1
- package/lib/vxe-radio-button/style/style.css +151 -8
- package/lib/vxe-radio-button/style/style.min.css +1 -1
- package/package.json +1 -1
- package/packages/checkbox/src/button.ts +3 -1
- package/packages/checkbox/src/group.ts +6 -1
- package/packages/icon-picker/src/icon-picker.ts +157 -48
- package/packages/language/ar-EG.ts +3 -0
- package/packages/language/de-DE.ts +3 -0
- package/packages/language/en-US.ts +3 -0
- package/packages/language/es-ES.ts +3 -0
- package/packages/language/fr-FR.ts +3 -0
- package/packages/language/hu-HU.ts +3 -0
- package/packages/language/hy-AM.ts +3 -0
- package/packages/language/id-ID.ts +3 -0
- package/packages/language/it-IT.ts +3 -0
- package/packages/language/ja-JP.ts +3 -0
- package/packages/language/ko-KR.ts +3 -0
- package/packages/language/ms-MY.ts +3 -0
- package/packages/language/nb-NO.ts +3 -0
- package/packages/language/pt-BR.ts +3 -0
- package/packages/language/ru-RU.ts +3 -0
- package/packages/language/th-TH.ts +3 -0
- package/packages/language/ug-CN.ts +3 -0
- package/packages/language/uk-UA.ts +3 -0
- package/packages/language/uz-UZ.ts +3 -0
- package/packages/language/vi-VN.ts +3 -0
- package/packages/language/zh-CHT.ts +3 -0
- package/packages/language/zh-CN.ts +3 -0
- package/packages/list/src/list.ts +14 -1
- package/packages/radio/src/button.ts +3 -1
- package/packages/radio/src/group.ts +6 -1
- package/packages/tree/src/tree.ts +443 -14
- package/packages/tree/src/util.ts +17 -1
- package/packages/ui/index.ts +4 -1
- package/styles/components/button.scss +24 -69
- package/styles/components/checkbox-button.scss +65 -13
- package/styles/components/icon-picker.scss +37 -11
- package/styles/components/radio-button.scss +65 -13
- package/styles/helpers/themeStatus.scss +58 -0
- package/types/all.d.ts +205 -0
- package/types/components/checkbox-group.d.ts +3 -1
- package/types/components/checkbox.d.ts +1 -1
- package/types/components/icon-picker.d.ts +27 -4
- package/types/components/list.d.ts +2 -2
- package/types/components/radio-group.d.ts +3 -1
- package/types/components/tree.d.ts +36 -0
- /package/es/icon/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
- /package/es/icon/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
- /package/es/icon/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
- /package/es/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
- /package/es/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
- /package/es/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
- /package/lib/icon/style/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
- /package/lib/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
- /package/lib/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
- /package/lib/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, h, reactive, PropType, computed, VNode, watch, onBeforeUnmount, nextTick, onMounted, provide } from 'vue'
|
|
2
2
|
import { defineVxeComponent } from '../../ui/src/comp'
|
|
3
3
|
import { VxeUI, createEvent, useSize, globalEvents, globalResize, renderEmptyElement } from '../../ui'
|
|
4
|
-
import { calcTreeLine } from './util'
|
|
4
|
+
import { calcTreeLine, getItemCacheObj } from './util'
|
|
5
5
|
import { createComponentLog } from '../../ui/src/log'
|
|
6
6
|
import { getCrossTreeDragNodeInfo } from './store'
|
|
7
7
|
import XEUtils from 'xe-utils'
|
|
@@ -13,7 +13,7 @@ import VxeLoadingComponent from '../../loading'
|
|
|
13
13
|
|
|
14
14
|
import type { TreeReactData, VxeTreeEmits, VxeTreePropTypes, TreeInternalData, TreePrivateRef, VxeTreeDefines, VxeTreePrivateComputed, TreePrivateMethods, TreeMethods, ValueOf, VxeTreeConstructor, VxeTreePrivateMethods, VxeComponentStyleType } from '../../../types'
|
|
15
15
|
|
|
16
|
-
const { errLog } = createComponentLog('tree')
|
|
16
|
+
const { warnLog, errLog } = createComponentLog('tree')
|
|
17
17
|
|
|
18
18
|
const { menus, getConfig, getI18n, getIcon } = VxeUI
|
|
19
19
|
|
|
@@ -47,6 +47,9 @@ function createInternalData (): TreeInternalData {
|
|
|
47
47
|
rowHeight: 0
|
|
48
48
|
},
|
|
49
49
|
|
|
50
|
+
removeRowMaps: {},
|
|
51
|
+
insertRowMaps: {},
|
|
52
|
+
|
|
50
53
|
// prevDragNode: null,
|
|
51
54
|
// prevDragToChild: false,
|
|
52
55
|
// prevDragPos: ''
|
|
@@ -70,15 +73,17 @@ function createReactData ():TreeReactData {
|
|
|
70
73
|
treeList: [],
|
|
71
74
|
updateExpandedFlag: 1,
|
|
72
75
|
updateCheckboxFlag: 1,
|
|
76
|
+
insertRowFlag: 1,
|
|
77
|
+
removeRowFlag: 1,
|
|
73
78
|
dragNode: null,
|
|
74
79
|
dragTipText: ''
|
|
75
80
|
}
|
|
76
81
|
}
|
|
77
82
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
let crossTreeDragNodeObj: {
|
|
84
|
+
$oldTree: VxeTreeConstructor & VxeTreePrivateMethods
|
|
85
|
+
$newTree: (VxeTreeConstructor & VxeTreePrivateMethods) | null
|
|
86
|
+
} | null = null
|
|
82
87
|
|
|
83
88
|
export default defineVxeComponent({
|
|
84
89
|
name: 'VxeTree',
|
|
@@ -216,6 +221,8 @@ export default defineVxeComponent({
|
|
|
216
221
|
'node-dragstart',
|
|
217
222
|
'node-dragover',
|
|
218
223
|
'node-dragend',
|
|
224
|
+
'node-remove-dragend',
|
|
225
|
+
'node-insert-dragend',
|
|
219
226
|
'node-expand',
|
|
220
227
|
'node-menu',
|
|
221
228
|
'menu-click'
|
|
@@ -1402,6 +1409,147 @@ export default defineVxeComponent({
|
|
|
1402
1409
|
recalculate()
|
|
1403
1410
|
}
|
|
1404
1411
|
|
|
1412
|
+
const insertTreeNode = (newRecords: any[], isAppend: boolean) => {
|
|
1413
|
+
const { treeFullData, nodeMaps } = internalData
|
|
1414
|
+
const keyField = computeKeyField.value
|
|
1415
|
+
const parentField = computeParentField.value
|
|
1416
|
+
const childrenField = computeChildrenField.value
|
|
1417
|
+
const mapChildrenField = computeMapChildrenField.value
|
|
1418
|
+
const funcName = isAppend ? 'push' : 'unshift'
|
|
1419
|
+
newRecords.forEach((item) => {
|
|
1420
|
+
const parentRowId = item[parentField]
|
|
1421
|
+
const nodeid = getNodeId(item)
|
|
1422
|
+
const matchObj = parentRowId ? XEUtils.findTree(treeFullData, (item) => parentRowId === item[keyField], { children: mapChildrenField }) : null
|
|
1423
|
+
const itemRest = getItemCacheObj(item)
|
|
1424
|
+
if (matchObj) {
|
|
1425
|
+
const { item: parentItem } = matchObj
|
|
1426
|
+
const parentRest = nodeMaps[getNodeId(parentItem)]
|
|
1427
|
+
const parentLevel = parentRest ? parentRest.level : 0
|
|
1428
|
+
let pChilds = parentItem[childrenField]
|
|
1429
|
+
let pMapChilds = parentItem[mapChildrenField]
|
|
1430
|
+
if (!XEUtils.isArray(pChilds)) {
|
|
1431
|
+
pChilds = parentItem[childrenField] = []
|
|
1432
|
+
}
|
|
1433
|
+
if (!XEUtils.isArray(pMapChilds)) {
|
|
1434
|
+
pMapChilds = parentItem[mapChildrenField] = []
|
|
1435
|
+
}
|
|
1436
|
+
itemRest.parent = parentItem
|
|
1437
|
+
itemRest.items = pChilds
|
|
1438
|
+
itemRest.level = parentLevel
|
|
1439
|
+
pChilds[funcName](item)
|
|
1440
|
+
pMapChilds[funcName](item)
|
|
1441
|
+
} else {
|
|
1442
|
+
if (parentRowId) {
|
|
1443
|
+
warnLog('vxe.error.unableInsert')
|
|
1444
|
+
}
|
|
1445
|
+
treeFullData[funcName](item)
|
|
1446
|
+
}
|
|
1447
|
+
nodeMaps[nodeid] = itemRest
|
|
1448
|
+
})
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
const handleInsertNodeAt = (records: any[], targetNodeOrNodeid: any, isInsertNextNode?: any) => {
|
|
1452
|
+
const { transform } = props
|
|
1453
|
+
const { treeFullData, nodeMaps } = internalData
|
|
1454
|
+
const keyField = computeKeyField.value
|
|
1455
|
+
const parentField = computeParentField.value
|
|
1456
|
+
const childrenField = computeChildrenField.value
|
|
1457
|
+
const mapChildrenField = computeMapChildrenField.value
|
|
1458
|
+
if (!transform) {
|
|
1459
|
+
errLog('vxe.error.reqSupportProp', ['insert() | insertAt() | insertNextAt()', 'transform'])
|
|
1460
|
+
return Promise.resolve({ node: null, nodes: [] })
|
|
1461
|
+
}
|
|
1462
|
+
if (!XEUtils.isArray(records)) {
|
|
1463
|
+
records = [records]
|
|
1464
|
+
}
|
|
1465
|
+
let targetNode = targetNodeOrNodeid
|
|
1466
|
+
if (XEUtils.isString(targetNodeOrNodeid) || XEUtils.isNumber(targetNodeOrNodeid)) {
|
|
1467
|
+
const nodeRest = nodeMaps[targetNodeOrNodeid]
|
|
1468
|
+
if (nodeRest) {
|
|
1469
|
+
targetNode = nodeRest.item
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
if (!records.length) {
|
|
1473
|
+
return Promise.resolve({ node: null, nodes: [] })
|
|
1474
|
+
}
|
|
1475
|
+
const newRecords = records.map(record => XEUtils.assign({ [mapChildrenField]: [], [childrenField]: [] }, record))
|
|
1476
|
+
const treeRecords = XEUtils.toArrayTree(newRecords, { key: keyField, parentKey: parentField, children: childrenField })
|
|
1477
|
+
|
|
1478
|
+
if (XEUtils.eqNull(targetNode)) {
|
|
1479
|
+
insertTreeNode(newRecords, false)
|
|
1480
|
+
} else {
|
|
1481
|
+
if (targetNode === -1) {
|
|
1482
|
+
insertTreeNode(newRecords, true)
|
|
1483
|
+
} else {
|
|
1484
|
+
const matchMapObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: mapChildrenField })
|
|
1485
|
+
if (matchMapObj) {
|
|
1486
|
+
const { parent: parentNode } = matchMapObj
|
|
1487
|
+
const parentMapChilds = parentNode ? parentNode[mapChildrenField] : treeFullData
|
|
1488
|
+
const parentRest = nodeMaps[getNodeId(parentNode)]
|
|
1489
|
+
const parentLevel = parentRest ? parentRest.level : 0
|
|
1490
|
+
treeRecords.forEach((row, i) => {
|
|
1491
|
+
if (parentNode) {
|
|
1492
|
+
if (row[parentField] !== parentNode[keyField]) {
|
|
1493
|
+
errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, `${parentField}=${parentNode[keyField]}`])
|
|
1494
|
+
row[parentField] = parentNode[keyField]
|
|
1495
|
+
}
|
|
1496
|
+
} else {
|
|
1497
|
+
if (row[parentField] !== null) {
|
|
1498
|
+
if (!XEUtils.eqNull(row[parentField])) {
|
|
1499
|
+
errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, 'null'])
|
|
1500
|
+
}
|
|
1501
|
+
row[parentField] = null
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
let targetIndex = matchMapObj.index + i
|
|
1505
|
+
if (isInsertNextNode) {
|
|
1506
|
+
targetIndex = targetIndex + 1
|
|
1507
|
+
}
|
|
1508
|
+
parentMapChilds.splice(targetIndex, 0, row)
|
|
1509
|
+
})
|
|
1510
|
+
XEUtils.eachTree(treeRecords, (item) => {
|
|
1511
|
+
const nodeid = getNodeId(item)
|
|
1512
|
+
const nodeRest = getItemCacheObj(item)
|
|
1513
|
+
nodeRest.level = parentLevel
|
|
1514
|
+
if (item[childrenField]) {
|
|
1515
|
+
item[mapChildrenField] = item[childrenField]
|
|
1516
|
+
}
|
|
1517
|
+
nodeMaps[nodeid] = nodeRest
|
|
1518
|
+
}, { children: childrenField })
|
|
1519
|
+
// 源
|
|
1520
|
+
if (parentNode) {
|
|
1521
|
+
const matchObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: childrenField })
|
|
1522
|
+
if (matchObj) {
|
|
1523
|
+
const parentChilds = matchObj.items
|
|
1524
|
+
let targetIndex = matchObj.index
|
|
1525
|
+
if (isInsertNextNode) {
|
|
1526
|
+
targetIndex = targetIndex + 1
|
|
1527
|
+
}
|
|
1528
|
+
parentChilds.splice(targetIndex, 0, ...treeRecords)
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
} else {
|
|
1532
|
+
warnLog('vxe.error.unableInsert')
|
|
1533
|
+
insertTreeNode(newRecords, true)
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
reactData.insertRowFlag++
|
|
1538
|
+
cacheNodeMap()
|
|
1539
|
+
handleData(true)
|
|
1540
|
+
updateAfterDataIndex()
|
|
1541
|
+
updateCheckboxStatus()
|
|
1542
|
+
if (reactData.scrollYLoad) {
|
|
1543
|
+
updateYSpace()
|
|
1544
|
+
}
|
|
1545
|
+
return nextTick().then(() => {
|
|
1546
|
+
return {
|
|
1547
|
+
node: newRecords.length ? newRecords[newRecords.length - 1] : null,
|
|
1548
|
+
nodes: newRecords
|
|
1549
|
+
}
|
|
1550
|
+
})
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1405
1553
|
const treeMethods: TreeMethods = {
|
|
1406
1554
|
dispatchEvent,
|
|
1407
1555
|
getNodeId,
|
|
@@ -1802,7 +1950,91 @@ export default defineVxeComponent({
|
|
|
1802
1950
|
}
|
|
1803
1951
|
return recalculate()
|
|
1804
1952
|
},
|
|
1805
|
-
clearScroll
|
|
1953
|
+
clearScroll,
|
|
1954
|
+
insert (records) {
|
|
1955
|
+
return handleInsertNodeAt(records, null)
|
|
1956
|
+
},
|
|
1957
|
+
insertAt (records, targetNodeOrNodeid) {
|
|
1958
|
+
return handleInsertNodeAt(records, targetNodeOrNodeid)
|
|
1959
|
+
},
|
|
1960
|
+
insertNextAt (records, targetNodeOrNodeid) {
|
|
1961
|
+
return handleInsertNodeAt(records, targetNodeOrNodeid, true)
|
|
1962
|
+
},
|
|
1963
|
+
remove (nodes) {
|
|
1964
|
+
const { transform } = props
|
|
1965
|
+
const { treeFullData } = internalData
|
|
1966
|
+
const childrenField = computeChildrenField.value
|
|
1967
|
+
const mapChildrenField = computeMapChildrenField.value
|
|
1968
|
+
if (!transform) {
|
|
1969
|
+
errLog('vxe.error.reqSupportProp', ['remove()', 'transform'])
|
|
1970
|
+
return Promise.resolve({ node: null, nodes: [] })
|
|
1971
|
+
}
|
|
1972
|
+
let delList: any[] = []
|
|
1973
|
+
if (!nodes) {
|
|
1974
|
+
nodes = treeFullData
|
|
1975
|
+
} else if (!XEUtils.isArray(nodes)) {
|
|
1976
|
+
nodes = [nodes]
|
|
1977
|
+
}
|
|
1978
|
+
if (!nodes.length) {
|
|
1979
|
+
return Promise.resolve({ node: null, nodes: [] })
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
// 从数据源中移除
|
|
1983
|
+
if (treeFullData === nodes) {
|
|
1984
|
+
nodes = delList = treeFullData.slice(0)
|
|
1985
|
+
internalData.treeFullData = []
|
|
1986
|
+
} else {
|
|
1987
|
+
nodes.forEach((item: any) => {
|
|
1988
|
+
const nodeid = getNodeId(item)
|
|
1989
|
+
const matchMapObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: mapChildrenField })
|
|
1990
|
+
if (matchMapObj) {
|
|
1991
|
+
const rItems = matchMapObj.items.splice(matchMapObj.index, 1)
|
|
1992
|
+
delList.push(rItems[0])
|
|
1993
|
+
}
|
|
1994
|
+
const matchObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: childrenField })
|
|
1995
|
+
if (matchObj) {
|
|
1996
|
+
const rItems = matchObj.items.splice(matchObj.index, 1)
|
|
1997
|
+
delList.push(rItems[0])
|
|
1998
|
+
}
|
|
1999
|
+
})
|
|
2000
|
+
}
|
|
2001
|
+
reactData.removeRowFlag++
|
|
2002
|
+
reactData.insertRowFlag++
|
|
2003
|
+
cacheNodeMap()
|
|
2004
|
+
handleData(true)
|
|
2005
|
+
updateAfterDataIndex()
|
|
2006
|
+
updateCheckboxStatus()
|
|
2007
|
+
if (reactData.scrollYLoad) {
|
|
2008
|
+
updateYSpace()
|
|
2009
|
+
}
|
|
2010
|
+
return nextTick().then(() => {
|
|
2011
|
+
return recalculate()
|
|
2012
|
+
}).then(() => {
|
|
2013
|
+
return { node: delList.length ? delList[delList.length - 1] : null, nodes: delList }
|
|
2014
|
+
})
|
|
2015
|
+
},
|
|
2016
|
+
getInsertRecords () {
|
|
2017
|
+
const { insertRowMaps } = internalData
|
|
2018
|
+
const insertRecords: any[] = []
|
|
2019
|
+
XEUtils.each(insertRowMaps, (row) => {
|
|
2020
|
+
insertRecords.push(row)
|
|
2021
|
+
})
|
|
2022
|
+
return insertRecords
|
|
2023
|
+
},
|
|
2024
|
+
getRemoveRecords () {
|
|
2025
|
+
const { removeRowMaps } = internalData
|
|
2026
|
+
const removeRecords: any[] = []
|
|
2027
|
+
XEUtils.each(removeRowMaps, (row) => {
|
|
2028
|
+
removeRecords.push(row)
|
|
2029
|
+
})
|
|
2030
|
+
return removeRecords
|
|
2031
|
+
}
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
const handleNodeDragEndClearStatus = () => {
|
|
2035
|
+
clearNodeDragData()
|
|
2036
|
+
clearCrossTreeDragStatus()
|
|
2037
|
+
recalculate()
|
|
1806
2038
|
}
|
|
1807
2039
|
|
|
1808
2040
|
const clearNodeDropOrigin = () => {
|
|
@@ -1857,7 +2089,7 @@ export default defineVxeComponent({
|
|
|
1857
2089
|
}
|
|
1858
2090
|
|
|
1859
2091
|
const clearCrossTreeDragStatus = () => {
|
|
1860
|
-
|
|
2092
|
+
crossTreeDragNodeObj = null
|
|
1861
2093
|
crossTreeDragNodeInfo.node = null
|
|
1862
2094
|
}
|
|
1863
2095
|
|
|
@@ -2242,6 +2474,18 @@ export default defineVxeComponent({
|
|
|
2242
2474
|
const { dragNode } = reactData
|
|
2243
2475
|
const { nodeMaps, prevDragNode, prevDragPos, prevDragToChild } = internalData
|
|
2244
2476
|
const hasChildField = computeHasChildField.value
|
|
2477
|
+
const dragConfig = computeDragOpts.value
|
|
2478
|
+
const { isCrossDrag, isCrossTreeDrag } = dragConfig
|
|
2479
|
+
// 跨树拖拽
|
|
2480
|
+
if (isCrossTreeDrag && crossTreeDragNodeObj) {
|
|
2481
|
+
const { $newTree } = crossTreeDragNodeObj
|
|
2482
|
+
if ($newTree && $newTree.xID !== $xeTree.xID) {
|
|
2483
|
+
if (isCrossDrag) {
|
|
2484
|
+
$newTree.handleCrossTreeNodeDragInsertEvent(evnt)
|
|
2485
|
+
}
|
|
2486
|
+
return
|
|
2487
|
+
}
|
|
2488
|
+
}
|
|
2245
2489
|
if (lazy && prevDragToChild) {
|
|
2246
2490
|
// 懒加载
|
|
2247
2491
|
const newNodeid = getNodeId(prevDragNode)
|
|
@@ -2322,17 +2566,194 @@ export default defineVxeComponent({
|
|
|
2322
2566
|
/**
|
|
2323
2567
|
* 处理跨树拖拽完成
|
|
2324
2568
|
*/
|
|
2325
|
-
handleCrossTreeNodeDragFinishEvent () {
|
|
2569
|
+
handleCrossTreeNodeDragFinishEvent (evnt: DragEvent) {
|
|
2570
|
+
const { treeList } = reactData
|
|
2571
|
+
const { nodeMaps } = internalData
|
|
2572
|
+
const dragOpts = computeDragOpts.value
|
|
2573
|
+
const { animation, isCrossTreeDrag } = dragOpts
|
|
2574
|
+
const mapChildrenField = computeMapChildrenField.value
|
|
2575
|
+
const el = refElem.value
|
|
2576
|
+
if (!el) {
|
|
2577
|
+
return
|
|
2578
|
+
}
|
|
2579
|
+
if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
|
|
2580
|
+
const { node: dragNode } = crossTreeDragNodeInfo
|
|
2581
|
+
if (dragNode) {
|
|
2582
|
+
const dragNodeid = getNodeId(dragNode)
|
|
2583
|
+
const dragNodeRest = nodeMaps[dragNodeid]
|
|
2584
|
+
let dragNodeHeight = 0
|
|
2585
|
+
let rsIndex = -1
|
|
2586
|
+
if (dragNodeRest) {
|
|
2587
|
+
if (animation) {
|
|
2588
|
+
const oldItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`)
|
|
2589
|
+
const targetItemEl = oldItemEl
|
|
2590
|
+
if (targetItemEl) {
|
|
2591
|
+
dragNodeHeight = targetItemEl.offsetHeight
|
|
2592
|
+
}
|
|
2593
|
+
}
|
|
2594
|
+
rsIndex = dragNodeRest.$index
|
|
2595
|
+
}
|
|
2596
|
+
const dragRangeList = rsIndex > -1 && rsIndex < treeList.length - 1 ? treeList.slice(rsIndex + 1) : []
|
|
2597
|
+
const dragList = XEUtils.toTreeArray([dragNode], {
|
|
2598
|
+
updated: true,
|
|
2599
|
+
children: mapChildrenField
|
|
2600
|
+
})
|
|
2601
|
+
$xeTree.remove(dragList).then(() => {
|
|
2602
|
+
if (animation && dragNodeHeight && dragRangeList.length) {
|
|
2603
|
+
const wrapperEl = el
|
|
2604
|
+
const dtClss: string[] = []
|
|
2605
|
+
dragRangeList.forEach(item => {
|
|
2606
|
+
const nodeid = getNodeId(item)
|
|
2607
|
+
dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`)
|
|
2608
|
+
})
|
|
2609
|
+
const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
|
|
2610
|
+
moveRowAnimateToTb(dtTrList, dragNodeHeight)
|
|
2611
|
+
}
|
|
2612
|
+
})
|
|
2613
|
+
dispatchEvent('node-remove-dragend', {
|
|
2614
|
+
node: dragNode
|
|
2615
|
+
}, evnt)
|
|
2616
|
+
handleNodeDragEndClearStatus()
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2326
2619
|
},
|
|
2327
2620
|
/**
|
|
2328
2621
|
* 处理跨树拖至新的空树
|
|
2329
2622
|
*/
|
|
2330
|
-
|
|
2623
|
+
handleCrossTreeNodeDragoverEmptyEvent (evnt: DragEvent) {
|
|
2624
|
+
const { treeList } = reactData
|
|
2625
|
+
const dragOpts = computeDragOpts.value
|
|
2626
|
+
const { isCrossTreeDrag } = dragOpts
|
|
2627
|
+
if (isCrossTreeDrag && crossTreeDragNodeObj && !treeList.length) {
|
|
2628
|
+
const { $oldTree, $newTree } = crossTreeDragNodeObj
|
|
2629
|
+
if ($oldTree) {
|
|
2630
|
+
const oldTreeReactData = $oldTree as unknown as TreeReactData
|
|
2631
|
+
if ($oldTree.xID !== $xeTree.xID) {
|
|
2632
|
+
if ($newTree && $newTree.xID !== $xeTree.xID) {
|
|
2633
|
+
$newTree.hideCrossTreeNodeDropClearStatus()
|
|
2634
|
+
}
|
|
2635
|
+
evnt.preventDefault()
|
|
2636
|
+
$oldTree.hideCrossTreeNodeDropClearStatus()
|
|
2637
|
+
crossTreeDragNodeObj.$newTree = $xeTree
|
|
2638
|
+
internalData.prevDragNode = null
|
|
2639
|
+
reactData.dragTipText = oldTreeReactData.dragTipText
|
|
2640
|
+
showDropTip(evnt, evnt.currentTarget as HTMLDivElement, true, '')
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2331
2644
|
},
|
|
2332
2645
|
/**
|
|
2333
2646
|
* 处理跨树拖插入
|
|
2334
2647
|
*/
|
|
2335
|
-
|
|
2648
|
+
handleCrossTreeNodeDragInsertEvent (evnt: DragEvent) {
|
|
2649
|
+
const { prevDragNode, prevDragPos, prevDragToChild } = internalData
|
|
2650
|
+
const dragOpts = computeDragOpts.value
|
|
2651
|
+
const { animation, isSelfToChildDrag, isCrossTreeDrag, dragEndMethod, dragToChildMethod } = dragOpts
|
|
2652
|
+
const parentField = computeParentField.value
|
|
2653
|
+
const mapChildrenField = computeMapChildrenField.value
|
|
2654
|
+
const childrenField = computeChildrenField.value
|
|
2655
|
+
// 跨表拖拽
|
|
2656
|
+
if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
|
|
2657
|
+
const { node: oldNode } = crossTreeDragNodeInfo
|
|
2658
|
+
const { $oldTree } = crossTreeDragNodeObj
|
|
2659
|
+
const el = refElem.value
|
|
2660
|
+
if (!el) {
|
|
2661
|
+
return
|
|
2662
|
+
}
|
|
2663
|
+
if ($oldTree && oldNode) {
|
|
2664
|
+
const dragNode = oldNode
|
|
2665
|
+
let dragOffsetIndex = -1
|
|
2666
|
+
if (prevDragNode) {
|
|
2667
|
+
dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
|
|
2668
|
+
}
|
|
2669
|
+
const dragParams = {
|
|
2670
|
+
oldNode: dragNode,
|
|
2671
|
+
newNode: prevDragNode,
|
|
2672
|
+
dragNode,
|
|
2673
|
+
dragPos: prevDragPos as 'top' | 'bottom',
|
|
2674
|
+
dragToChild: !!prevDragToChild,
|
|
2675
|
+
offsetIndex: dragOffsetIndex as 0 | 1
|
|
2676
|
+
}
|
|
2677
|
+
const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
|
|
2678
|
+
const errRest = {
|
|
2679
|
+
status: false
|
|
2680
|
+
}
|
|
2681
|
+
Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
|
|
2682
|
+
if (!status) {
|
|
2683
|
+
if ($oldTree) {
|
|
2684
|
+
if ($oldTree.xID !== $xeTree.xID) {
|
|
2685
|
+
$oldTree.handleCrossTreeNodeDragCancelEvent(evnt)
|
|
2686
|
+
}
|
|
2687
|
+
}
|
|
2688
|
+
handleNodeDragEndClearStatus()
|
|
2689
|
+
return errRest
|
|
2690
|
+
}
|
|
2691
|
+
let insertRest: Promise<any> = Promise.resolve()
|
|
2692
|
+
const dragList = XEUtils.toTreeArray([dragNode], {
|
|
2693
|
+
updated: true,
|
|
2694
|
+
children: mapChildrenField
|
|
2695
|
+
})
|
|
2696
|
+
$oldTree.handleCrossTreeNodeDragFinishEvent(evnt)
|
|
2697
|
+
if (prevDragNode) {
|
|
2698
|
+
dragNode[parentField] = prevDragNode[parentField]
|
|
2699
|
+
} else {
|
|
2700
|
+
dragNode[parentField] = null
|
|
2701
|
+
}
|
|
2702
|
+
dragList.forEach(row => {
|
|
2703
|
+
row[childrenField] = undefined
|
|
2704
|
+
row[mapChildrenField] = undefined
|
|
2705
|
+
})
|
|
2706
|
+
if (prevDragNode) {
|
|
2707
|
+
if (prevDragPos === 'bottom') {
|
|
2708
|
+
insertRest = $xeTree.insertNextAt(dragList, prevDragNode)
|
|
2709
|
+
} else {
|
|
2710
|
+
insertRest = $xeTree.insertAt(dragList, prevDragNode)
|
|
2711
|
+
}
|
|
2712
|
+
} else {
|
|
2713
|
+
insertRest = $xeTree.insert(dragList)
|
|
2714
|
+
}
|
|
2715
|
+
$xeTree.dispatchEvent('node-insert-dragend', {
|
|
2716
|
+
oldNode,
|
|
2717
|
+
newNode: prevDragNode,
|
|
2718
|
+
dragNode,
|
|
2719
|
+
dragPos: prevDragPos as any,
|
|
2720
|
+
dragToChild: isDragToChildFlag,
|
|
2721
|
+
offsetIndex: dragOffsetIndex
|
|
2722
|
+
}, evnt)
|
|
2723
|
+
clearNodeDragData()
|
|
2724
|
+
|
|
2725
|
+
insertRest.then(() => {
|
|
2726
|
+
const { treeList } = reactData
|
|
2727
|
+
const { nodeMaps } = internalData
|
|
2728
|
+
const oldNodeid = getNodeId(dragNode)
|
|
2729
|
+
const oldNodeRest = nodeMaps[oldNodeid]
|
|
2730
|
+
let dragNodeHeight = 0
|
|
2731
|
+
let rsIndex = -1
|
|
2732
|
+
if (oldNodeRest) {
|
|
2733
|
+
if (animation) {
|
|
2734
|
+
const oldItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${oldNodeid}"]`)
|
|
2735
|
+
const targetItemEl = oldItemEl
|
|
2736
|
+
if (targetItemEl) {
|
|
2737
|
+
dragNodeHeight = targetItemEl.offsetHeight
|
|
2738
|
+
}
|
|
2739
|
+
}
|
|
2740
|
+
rsIndex = oldNodeRest.$index
|
|
2741
|
+
}
|
|
2742
|
+
const dragRangeList = rsIndex > -1 ? treeList.slice(rsIndex) : []
|
|
2743
|
+
if (animation && dragNodeHeight && dragRangeList.length) {
|
|
2744
|
+
const wrapperEl = el
|
|
2745
|
+
const dtClss: string[] = []
|
|
2746
|
+
dragRangeList.forEach(item => {
|
|
2747
|
+
const nodeid = getNodeId(item)
|
|
2748
|
+
dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`)
|
|
2749
|
+
})
|
|
2750
|
+
const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
|
|
2751
|
+
moveRowAnimateToTb(dtTrList, -dragNodeHeight)
|
|
2752
|
+
}
|
|
2753
|
+
})
|
|
2754
|
+
})
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2336
2757
|
},
|
|
2337
2758
|
hideCrossTreeNodeDropClearStatus () {
|
|
2338
2759
|
hideDropTip()
|
|
@@ -2663,10 +3084,17 @@ export default defineVxeComponent({
|
|
|
2663
3084
|
const loadingOpts = computeLoadingOpts.value
|
|
2664
3085
|
const isRowHover = computeIsRowHover.value
|
|
2665
3086
|
const treeStyle = computeTreeStyle.value
|
|
3087
|
+
const dragOpts = computeDragOpts.value
|
|
2666
3088
|
const loadingSlot = slots.loading
|
|
2667
3089
|
const headerSlot = slots.header
|
|
2668
3090
|
const footerSlot = slots.footer
|
|
2669
3091
|
|
|
3092
|
+
const teOns: {
|
|
3093
|
+
onDragover?: (...args: any[]) => void
|
|
3094
|
+
} = { }
|
|
3095
|
+
if (dragOpts.isCrossTreeDrag && !treeList.length) {
|
|
3096
|
+
teOns.onDragover = $xeTree.handleCrossTreeNodeDragInsertEvent
|
|
3097
|
+
}
|
|
2670
3098
|
return h('div', {
|
|
2671
3099
|
ref: refElem,
|
|
2672
3100
|
class: ['vxe-tree', {
|
|
@@ -2677,7 +3105,8 @@ export default defineVxeComponent({
|
|
|
2677
3105
|
'node--hover': isRowHover,
|
|
2678
3106
|
'node--trigger': trigger === 'node',
|
|
2679
3107
|
'is--loading': loading
|
|
2680
|
-
}]
|
|
3108
|
+
}],
|
|
3109
|
+
...teOns
|
|
2681
3110
|
}, [
|
|
2682
3111
|
headerSlot
|
|
2683
3112
|
? h('div', {
|
|
@@ -2790,8 +3219,8 @@ export default defineVxeComponent({
|
|
|
2790
3219
|
if (drag && !transform) {
|
|
2791
3220
|
errLog('vxe.error.notSupportProp', ['drag', 'transform=false', 'transform=true'])
|
|
2792
3221
|
}
|
|
2793
|
-
if (dragOpts.isCrossTreeDrag) {
|
|
2794
|
-
errLog('vxe.error.
|
|
3222
|
+
if (dragOpts.isCrossTreeDrag && !dragOpts.isCrossDrag) {
|
|
3223
|
+
errLog('vxe.error.reqSupportProp', ['drag-config.isCrossTreeDrag', 'drag-config.isCrossDrag'])
|
|
2795
3224
|
}
|
|
2796
3225
|
// if (valueField) {
|
|
2797
3226
|
// errLog('vxe.error.delProp', ['value-field', 'value-field'])
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { VxeTreeConstructor } from '../../../types'
|
|
1
|
+
import type { VxeTreeConstructor, VxeTreeDefines } from '../../../types'
|
|
2
2
|
|
|
3
3
|
function countTreeExpand ($xeTree: VxeTreeConstructor, prevNode: any) {
|
|
4
4
|
let count = 1
|
|
@@ -33,3 +33,19 @@ export function calcTreeLine ($xeTree: VxeTreeConstructor, node: any, prevNode:
|
|
|
33
33
|
}
|
|
34
34
|
return (rowHeight || 28) * expandSize - (prevNode ? 1 : 12)
|
|
35
35
|
}
|
|
36
|
+
|
|
37
|
+
export function getItemCacheObj (item: any): VxeTreeDefines.NodeCacheItem {
|
|
38
|
+
return {
|
|
39
|
+
item,
|
|
40
|
+
index: -1,
|
|
41
|
+
$index: -1,
|
|
42
|
+
_index: -1,
|
|
43
|
+
items: [],
|
|
44
|
+
parent: null,
|
|
45
|
+
nodes: [],
|
|
46
|
+
level: 0,
|
|
47
|
+
treeIndex: -1,
|
|
48
|
+
lineCount: 0,
|
|
49
|
+
treeLoaded: false
|
|
50
|
+
}
|
|
51
|
+
}
|
package/packages/ui/index.ts
CHANGED
|
@@ -185,7 +185,10 @@ setConfig({
|
|
|
185
185
|
formView: {},
|
|
186
186
|
icon: {},
|
|
187
187
|
iconPicker: {
|
|
188
|
-
icons: ['home', 'company', 'comment', 'setting', 'send', 'envelope', 'envelope-open', 'bell', 'search', 'print', 'pc', 'goods', 'chart-line', 'edit', 'delete', 'save', 'folder', 'microphone', 'flag', 'link', 'location', 'sunny', 'rmb', 'usd', 'user', 'add-user', 'add-users', 'star', 'unlock', 'time', 'text', 'feedback', 'calendar', 'association-form', 'cloud-download', 'cloud-upload', 'file', 'subtable', 'chart-bar-x', 'chart-bar-y', 'chart-line', 'chart-pie', 'chart-radar']
|
|
188
|
+
icons: ['home', 'company', 'comment', 'setting', 'send', 'envelope', 'envelope-open', 'bell', 'search', 'print', 'pc', 'goods', 'chart-line', 'edit', 'delete', 'save', 'folder', 'microphone', 'flag', 'link', 'location', 'sunny', 'rmb', 'usd', 'user', 'add-user', 'add-users', 'star', 'unlock', 'time', 'text', 'feedback', 'calendar', 'association-form', 'cloud-download', 'cloud-upload', 'file', 'subtable', 'chart-bar-x', 'chart-bar-y', 'chart-line', 'chart-pie', 'chart-radar'],
|
|
189
|
+
popupConfig: {
|
|
190
|
+
// chunkSize: 4
|
|
191
|
+
}
|
|
189
192
|
},
|
|
190
193
|
image: {
|
|
191
194
|
draggable: null,
|