bkui-vue 2.0.2-beta.4 → 2.0.2-beta.40

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 (71) hide show
  1. package/dist/cli.css +1 -0
  2. package/dist/index.cjs.js +132 -132
  3. package/dist/index.esm.js +15822 -14471
  4. package/dist/index.umd.js +132 -132
  5. package/dist/style.variable.css +1 -1
  6. package/lib/cascader/cascader.css +26 -24
  7. package/lib/cascader/cascader.d.ts +12 -0
  8. package/lib/cascader/cascader.less +78 -76
  9. package/lib/cascader/cascader.variable.css +26 -24
  10. package/lib/cascader/index.d.ts +26 -0
  11. package/lib/cascader/index.js +110 -60
  12. package/lib/checkbox/index.js +1 -1
  13. package/lib/color-picker/index.js +20 -16
  14. package/lib/components.d.ts +1 -2
  15. package/lib/components.js +1 -2
  16. package/lib/date-picker/index.js +53 -58
  17. package/lib/date-picker/panel/time.d.ts +1 -1
  18. package/lib/date-picker/utils.d.ts +5 -17
  19. package/lib/directives/index.js +17 -13
  20. package/lib/dropdown/dropdown.d.ts +1 -0
  21. package/lib/dropdown/index.d.ts +3 -0
  22. package/lib/dropdown/index.js +11 -6
  23. package/lib/form/form-item.d.ts +19 -0
  24. package/lib/form/form.css +16 -4
  25. package/lib/form/form.less +24 -6
  26. package/lib/form/form.variable.css +16 -4
  27. package/lib/form/index.d.ts +13 -0
  28. package/lib/form/index.js +33 -25
  29. package/lib/image/index.js +7 -10
  30. package/lib/index.d.ts +0 -1
  31. package/lib/index.js +1 -2
  32. package/lib/input/index.d.ts +39 -20
  33. package/lib/input/index.js +24 -21
  34. package/lib/input/input.d.ts +30 -16
  35. package/lib/message/index.js +1 -1
  36. package/lib/modal/index.js +2 -1
  37. package/lib/pop-confirm/index.d.ts +600 -2
  38. package/lib/pop-confirm/index.js +20 -8
  39. package/lib/pop-confirm/pop-confirm.d.ts +297 -1
  40. package/lib/pop-confirm/props.d.ts +146 -0
  41. package/lib/popover/index.js +7 -10
  42. package/lib/search-select/index.d.ts +21 -3
  43. package/lib/search-select/index.js +62 -30
  44. package/lib/search-select/input.d.ts +3 -0
  45. package/lib/search-select/search-select.d.ts +7 -1
  46. package/lib/search-select/selected.d.ts +6 -0
  47. package/lib/select/index.d.ts +19 -0
  48. package/lib/select/index.js +15 -16
  49. package/lib/select/select.d.ts +10 -0
  50. package/lib/sideslider/index.js +3 -1
  51. package/lib/slider/index.js +2 -1
  52. package/lib/tab/index.js +7 -10
  53. package/lib/table/index.js +7 -15
  54. package/lib/tag-input/index.d.ts +3 -0
  55. package/lib/tag-input/index.js +35 -24
  56. package/lib/tag-input/tag-input.d.ts +1 -0
  57. package/lib/tree/constant.d.ts +2 -0
  58. package/lib/tree/index.d.ts +48 -0
  59. package/lib/tree/index.js +209 -59
  60. package/lib/tree/props.d.ts +20 -0
  61. package/lib/tree/tree.css +46 -0
  62. package/lib/tree/tree.d.ts +22 -0
  63. package/lib/tree/tree.less +57 -2
  64. package/lib/tree/tree.variable.css +46 -0
  65. package/lib/tree/use-node-action.d.ts +2 -2
  66. package/package.json +1 -1
  67. package/dist/style.css +0 -1
  68. package/lib/plugin-popover/index.d.ts +0 -27
  69. package/lib/plugin-popover/index.js +0 -65
  70. package/lib/plugins/index.d.ts +0 -1
  71. package/lib/plugins/index.js +0 -64
package/lib/tree/index.js CHANGED
@@ -12,6 +12,7 @@ import * as __WEBPACK_EXTERNAL_MODULE_lodash_isElement_e6b2a6ce__ from "lodash/i
12
12
  import * as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_checkbox_13b1cb4a__ from "../checkbox";
13
13
  import "../checkbox/checkbox.less";
14
14
  import * as __WEBPACK_EXTERNAL_MODULE_bkui_vue_lib_icon_a97c79c3__ from "../icon";
15
+ import * as __WEBPACK_EXTERNAL_MODULE_lodash_throttle_a7b7506a__ from "lodash/throttle";
15
16
  /******/ // The require scope
16
17
  /******/ var __webpack_require__ = {};
17
18
  /******/
@@ -168,6 +169,7 @@ function _defineProperty(obj, key, value) {
168
169
  }
169
170
  ;// CONCATENATED MODULE: ../../packages/tree/src/constant.ts
170
171
 
172
+ var _TreeEmitEventsType;
171
173
  /*
172
174
  * Tencent is pleased to support the open source community by making
173
175
  * 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
@@ -200,6 +202,7 @@ var EVENTS;
200
202
  EVENTS["NODE_COLLAPSE"] = "nodeCollapse";
201
203
  EVENTS["NODE_DRAG_LEAVE"] = "nodeDragLeave";
202
204
  EVENTS["NODE_DRAG_OVER"] = "nodeDragOver";
205
+ EVENTS["NODE_DRAG_SORT"] = "nodeDragSort";
203
206
  EVENTS["NODE_DRAG_START"] = "nodeDragStart";
204
207
  EVENTS["NODE_DROP"] = "nodeDrop";
205
208
  EVENTS["NODE_ENTER_VIEW"] = "nodeEnterView";
@@ -209,7 +212,7 @@ var EVENTS;
209
212
  var EMPTY = function EMPTY() {
210
213
  return true;
211
214
  };
212
- var TreeEmitEventsType = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, EVENTS.NODE_CLICK, EMPTY), EVENTS.NODE_COLLAPSE, EMPTY), EVENTS.NODE_EXPAND, EMPTY), EVENTS.NODE_CHECKED, EMPTY), EVENTS.NODE_DRAG_START, EMPTY), EVENTS.NODE_DRAG_OVER, EMPTY), EVENTS.NODE_DRAG_LEAVE, EMPTY), EVENTS.NODE_DROP, EMPTY), EVENTS.NODE_ENTER_VIEW, EMPTY), EVENTS.NODE_SELECTED, EMPTY);
215
+ var TreeEmitEventsType = (_TreeEmitEventsType = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_TreeEmitEventsType, EVENTS.NODE_CLICK, EMPTY), EVENTS.NODE_COLLAPSE, EMPTY), EVENTS.NODE_EXPAND, EMPTY), EVENTS.NODE_CHECKED, EMPTY), EVENTS.NODE_DRAG_START, EMPTY), EVENTS.NODE_DRAG_OVER, EMPTY), EVENTS.NODE_DRAG_LEAVE, EMPTY), EVENTS.NODE_DRAG_SORT, EMPTY), EVENTS.NODE_DROP, EMPTY), EVENTS.NODE_ENTER_VIEW, EMPTY), _defineProperty(_TreeEmitEventsType, EVENTS.NODE_SELECTED, EMPTY));
213
216
  /**
214
217
  * 节点扩展属性
215
218
  */
@@ -338,7 +341,12 @@ var treeProps = {
338
341
  * 可选值:once 只在初始化是执行一次
339
342
  * every 每次数据更新都执行
340
343
  */
341
- deepAutoOpen: (0,external_vue_types_namespaceObject.toType)('columnType', {}).def(ColumnTypeEnum.ONCE)
344
+ deepAutoOpen: (0,external_vue_types_namespaceObject.toType)('columnType', {}).def(ColumnTypeEnum.ONCE),
345
+ /**
346
+ * 触发异步加载的时机
347
+ * 可选值:'expand', 'click', 'checked'
348
+ */
349
+ trigger: shared_namespaceObject.PropTypes.arrayOf(shared_namespaceObject.PropTypes.oneOf(['expand', 'click', 'checked'])).def(null)
342
350
  }),
343
351
  /**
344
352
  * 每个节点偏移左侧距离
@@ -376,10 +384,23 @@ var treeProps = {
376
384
  draggable: shared_namespaceObject.PropTypes.bool.def(false),
377
385
  disableDrag: shared_namespaceObject.PropTypes.func,
378
386
  disableDrop: shared_namespaceObject.PropTypes.func,
387
+ /**
388
+ * 拖拽阈值
389
+ * 用于判断拖拽时鼠标位置与节点的距离
390
+ * 当鼠标位置与节点的距离大于此值时,才会触发拖拽
391
+ */
392
+ dragThreshold: shared_namespaceObject.PropTypes.number.def(0.2),
379
393
  /**
380
394
  * 节点拖拽时可交换位置(开启拖拽可交换位置后将不支持改变层级)
381
395
  */
382
396
  dragSort: shared_namespaceObject.PropTypes.bool.def(false),
397
+ /**
398
+ * 拖拽排序模式
399
+ * - any: 允许拖拽到任意位置
400
+ * - next: 只允许拖拽到同级节点的前后位置
401
+ * 默认 any
402
+ */
403
+ dragSortMode: shared_namespaceObject.PropTypes.oneOf(['any', 'next']).def('any'),
383
404
  /**
384
405
  * 节点是否可以选中
385
406
  */
@@ -835,10 +856,14 @@ const icon_namespaceObject = icon_x({ ["DownShape"]: () => __WEBPACK_EXTERNAL_MO
835
856
  });
836
857
  };
837
858
  var getParentNodeData = function getParentNodeData(node) {
838
- if (isRootNode(node)) {
859
+ var target = node;
860
+ if (typeof target === 'string') {
861
+ target = getSourceNodeByUID(target);
862
+ }
863
+ if (isRootNode(target)) {
839
864
  return _defineProperty({}, props.children, props.data);
840
865
  }
841
- return getParentNode(node);
866
+ return getParentNode(target);
842
867
  };
843
868
  /**
844
869
  * 处理scoped slot 透传数据
@@ -1460,6 +1485,14 @@ var use_node_action_this = undefined;
1460
1485
  deepUpdateChildNode(chid, attr, value);
1461
1486
  });
1462
1487
  };
1488
+ var isRemoteFnExec = function isRemoteFnExec(event) {
1489
+ var _props$async;
1490
+ if ((_props$async = props.async) !== null && _props$async !== void 0 && (_props$async = _props$async.trigger) !== null && _props$async !== void 0 && _props$async.length) {
1491
+ var _props$async2;
1492
+ return (_props$async2 = props.async) === null || _props$async2 === void 0 ? void 0 : _props$async2.trigger.includes(event);
1493
+ }
1494
+ return true;
1495
+ };
1463
1496
  var handleNodeItemCheckboxChange = function handleNodeItemCheckboxChange(item, value, event) {
1464
1497
  event === null || event === void 0 || event.preventDefault();
1465
1498
  event === null || event === void 0 || event.stopImmediatePropagation();
@@ -1477,7 +1510,7 @@ var use_node_action_this = undefined;
1477
1510
  }), flatData.data.filter(function (t) {
1478
1511
  return isIndeterminate(t);
1479
1512
  }));
1480
- handleNodeContentClick(item, event);
1513
+ handleNodeContentClick(item, event, 'checked');
1481
1514
  };
1482
1515
  var isIndeterminate = function isIndeterminate(item) {
1483
1516
  return isNodeChecked(item) && getNodeAttr(item, NODE_ATTRIBUTES.IS_INDETERMINATE);
@@ -1487,6 +1520,7 @@ var use_node_action_this = undefined;
1487
1520
  return null;
1488
1521
  }
1489
1522
  return (0,external_vue_namespaceObject.createVNode)("span", {
1523
+ "class": "node-check-box",
1490
1524
  "onClick": handleNodeCheckboxClick
1491
1525
  }, [(0,external_vue_namespaceObject.createVNode)(checkbox_namespaceObject["default"], {
1492
1526
  "indeterminate": isIndeterminate(item),
@@ -1586,25 +1620,27 @@ var use_node_action_this = undefined;
1586
1620
  * 节点点击
1587
1621
  * @param item
1588
1622
  */
1589
- var handleTreeNodeClick = function handleTreeNodeClick(item, e) {
1623
+ var handleTreeNodeClick = function handleTreeNodeClick(item, e, event) {
1590
1624
  var isOpen = isItemOpen(item);
1591
1625
  if (isOpen) {
1592
1626
  setNodeOpened(item, false, e, true);
1593
1627
  return;
1594
1628
  }
1595
- /** 如果是异步请求加载 */
1596
- asyncNodeClick(item)["finally"](function () {
1597
- if (getNodeAttr(item, NODE_ATTRIBUTES.IS_LOADING)) {
1598
- registerNextLoop('setNodeOpenedAfterLoading', {
1599
- type: 'once',
1600
- fn: function fn() {
1601
- return setNodeOpened(item, true, e, true);
1602
- }
1603
- });
1604
- } else {
1605
- setNodeOpened(item, true, e, true);
1606
- }
1607
- });
1629
+ if (isRemoteFnExec(event)) {
1630
+ /** 如果是异步请求加载 */
1631
+ asyncNodeClick(item)["finally"](function () {
1632
+ if (getNodeAttr(item, NODE_ATTRIBUTES.IS_LOADING)) {
1633
+ registerNextLoop('setNodeOpenedAfterLoading', {
1634
+ type: 'once',
1635
+ fn: function fn() {
1636
+ return setNodeOpened(item, true, e, true);
1637
+ }
1638
+ });
1639
+ } else {
1640
+ setNodeOpened(item, true, e, true);
1641
+ }
1642
+ });
1643
+ }
1608
1644
  };
1609
1645
  /**
1610
1646
  * 点击树形节点展开、收起图标处理事件
@@ -1615,7 +1651,7 @@ var use_node_action_this = undefined;
1615
1651
  e.stopImmediatePropagation();
1616
1652
  e.stopPropagation();
1617
1653
  e.preventDefault();
1618
- handleTreeNodeClick(node, e);
1654
+ handleTreeNodeClick(node, e, 'expand');
1619
1655
  };
1620
1656
  /**
1621
1657
  * 设置节点选中状态
@@ -1629,6 +1665,7 @@ var use_node_action_this = undefined;
1629
1665
  var selected = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1630
1666
  var autoOpen = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1631
1667
  var triggerEvent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1668
+ var event = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';
1632
1669
  var nodeList = Array.isArray(nodes) ? nodes : [nodes];
1633
1670
  if (!nodeList.length) {
1634
1671
  return;
@@ -1673,12 +1710,14 @@ var use_node_action_this = undefined;
1673
1710
  * 处理异步节点多层级展开选中
1674
1711
  */
1675
1712
  if (getNodeAttr(resolvedItem, NODE_ATTRIBUTES.IS_ASYNC)) {
1676
- asyncNodeClick(resolvedItem).then(function () {
1677
- (0,external_vue_namespaceObject.nextTick)(function () {
1678
- nodeList.shift();
1679
- setSelect(nodeList, selected, autoOpen);
1713
+ if (isRemoteFnExec(event)) {
1714
+ asyncNodeClick(resolvedItem).then(function () {
1715
+ (0,external_vue_namespaceObject.nextTick)(function () {
1716
+ nodeList.shift();
1717
+ setSelect(nodeList, selected, autoOpen, triggerEvent, event);
1718
+ });
1680
1719
  });
1681
- });
1720
+ }
1682
1721
  }
1683
1722
  };
1684
1723
  var resolveNodeAction = function resolveNodeAction(node) {
@@ -1699,19 +1738,19 @@ var use_node_action_this = undefined;
1699
1738
  * 点击节点事件
1700
1739
  * @param item
1701
1740
  */
1702
- var handleNodeContentClick = function handleNodeContentClick(item, e) {
1741
+ var handleNodeContentClick = function handleNodeContentClick(item, e, event) {
1703
1742
  var nodeActions = resolveNodeAction(item);
1704
1743
  if (nodeActions.includes('selected')) {
1705
- setSelect(item, true, true, true);
1744
+ setSelect(item, true, true, true, event);
1706
1745
  }
1707
1746
  if (nodeActions.includes('expand')) {
1708
1747
  if (!isNodeOpened(item)) {
1709
- handleTreeNodeClick(item, e);
1748
+ handleTreeNodeClick(item, e, event);
1710
1749
  }
1711
1750
  }
1712
1751
  if (nodeActions.includes('collapse')) {
1713
1752
  if (isNodeOpened(item)) {
1714
- handleTreeNodeClick(item, e);
1753
+ handleTreeNodeClick(item, e, event);
1715
1754
  }
1716
1755
  }
1717
1756
  if (nodeActions.includes('click')) {
@@ -1805,6 +1844,7 @@ var use_node_action_this = undefined;
1805
1844
  var renderTreeNode = function renderTreeNode(item) {
1806
1845
  var _ctx$slots$nodeAppend, _ctx$slots4;
1807
1846
  var showTree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1847
+ var child = getActionIcon(item);
1808
1848
  return (0,external_vue_namespaceObject.createVNode)("div", {
1809
1849
  "key": getNodeId(item),
1810
1850
  "class": getNodeRowClass(item, flatData.schema),
@@ -1813,14 +1853,14 @@ var use_node_action_this = undefined;
1813
1853
  "style": getNodeItemStyle(item, props, flatData, showTree),
1814
1854
  "class": getNodeItemClass(item, flatData.schema, props, showTree),
1815
1855
  "onClick": function onClick(e) {
1816
- return handleNodeContentClick(item, e);
1856
+ return handleNodeContentClick(item, e, 'click');
1817
1857
  }
1818
1858
  }, [(0,external_vue_namespaceObject.createVNode)("div", {
1819
- "class": [resolveClassName('node-action')],
1859
+ "class": [resolveClassName('node-action'), child ? '' : 'empty-child'],
1820
1860
  "onClick": function onClick(e) {
1821
1861
  return handleNodeActionClick(e, item);
1822
1862
  }
1823
- }, [getActionIcon(item)]), (0,external_vue_namespaceObject.createVNode)("div", {
1863
+ }, [child]), (0,external_vue_namespaceObject.createVNode)("div", {
1824
1864
  "class": resolveClassName('node-content')
1825
1865
  }, [[getCheckboxRender(item), getNodePrefixIcon(item)], (0,external_vue_namespaceObject.createVNode)("span", {
1826
1866
  "class": resolveClassName('node-text')
@@ -1839,6 +1879,10 @@ var use_node_action_this = undefined;
1839
1879
  isIndeterminate: isIndeterminate
1840
1880
  };
1841
1881
  });
1882
+ ;// CONCATENATED MODULE: external "lodash/throttle"
1883
+ var throttle_x = y => { var x = {}; __webpack_require__.d(x, y); return x; }
1884
+ var throttle_y = x => () => x
1885
+ const throttle_namespaceObject = throttle_x({ ["default"]: () => __WEBPACK_EXTERNAL_MODULE_lodash_throttle_a7b7506a__["default"] });
1842
1886
  ;// CONCATENATED MODULE: ../../packages/tree/src/use-node-drag.tsx
1843
1887
  var use_node_drag_this = undefined;
1844
1888
  /*
@@ -1870,6 +1914,7 @@ var use_node_drag_this = undefined;
1870
1914
 
1871
1915
 
1872
1916
 
1917
+
1873
1918
  /* harmony default export */ const use_node_drag = (function (props, ctx, root, flatData) {
1874
1919
  var _useNodeAttribute = use_node_attribute(flatData, props),
1875
1920
  getSourceNodeByUID = _useNodeAttribute.getSourceNodeByUID,
@@ -1877,8 +1922,8 @@ var use_node_drag_this = undefined;
1877
1922
  getNodeParentIdById = _useNodeAttribute.getNodeParentIdById,
1878
1923
  extendNodeAttr = _useNodeAttribute.extendNodeAttr,
1879
1924
  getNodeAttrById = _useNodeAttribute.getNodeAttrById,
1880
- getNodePathById = _useNodeAttribute.getNodePathById,
1881
- isRootNode = _useNodeAttribute.isRootNode;
1925
+ isRootNode = _useNodeAttribute.isRootNode,
1926
+ setNodeAttrById = _useNodeAttribute.setNodeAttrById;
1882
1927
  var _usePrefix = (0,config_provider_namespaceObject.usePrefix)(),
1883
1928
  resolveClassName = _usePrefix.resolveClassName;
1884
1929
  var isNeedCheckDraggable = (0,external_vue_namespaceObject.computed)(function () {
@@ -1887,7 +1932,10 @@ var use_node_drag_this = undefined;
1887
1932
  var isNeedCheckDroppable = (0,external_vue_namespaceObject.computed)(function () {
1888
1933
  return typeof props.disableDrop === 'function';
1889
1934
  });
1935
+ var dragThreshold = props.dragThreshold || 0.2; // 新增配置项,默认值为 0.2
1890
1936
  var dragNodeId = '';
1937
+ var draggedItem = null;
1938
+ var nodeRectMap = new WeakMap();
1891
1939
  var getTargetTreeNode = function getTargetTreeNode(e) {
1892
1940
  var target = e.target;
1893
1941
  return target.closest('[data-tree-node]');
@@ -1897,6 +1945,14 @@ var use_node_drag_this = undefined;
1897
1945
  var uid = targetNode === null || targetNode === void 0 || (_targetNode$dataset = targetNode.dataset) === null || _targetNode$dataset === void 0 ? void 0 : _targetNode$dataset.treeNode;
1898
1946
  return getSourceNodeByUID(uid);
1899
1947
  };
1948
+ var updateDropStyles = function updateDropStyles(targetNode, stylesToAdd, stylesToRemove) {
1949
+ stylesToRemove.forEach(function (style) {
1950
+ return targetNode.classList.remove(style);
1951
+ });
1952
+ stylesToAdd.forEach(function (style) {
1953
+ return targetNode.classList.add(style);
1954
+ });
1955
+ };
1900
1956
  var handleTreeNodeMouseup = function handleTreeNodeMouseup(e) {
1901
1957
  var targetNode = getTargetTreeNode(e);
1902
1958
  targetNode.removeEventListener('mouseup', handleTreeNodeMouseup);
@@ -1911,10 +1967,37 @@ var use_node_drag_this = undefined;
1911
1967
  targetNode.setAttribute('draggable', 'true');
1912
1968
  targetNode.addEventListener('mouseup', handleTreeNodeMouseup);
1913
1969
  };
1914
- var handleTreeNodeDragover = function handleTreeNodeDragover(e) {
1970
+ var dropBefore = 'drop-before';
1971
+ var dropAfter = 'drop-after';
1972
+ var dropInner = 'drop-inner';
1973
+ var dragOverItem = null;
1974
+ var handleTreeNodeDragover = (0,throttle_namespaceObject["default"])(function (e) {
1915
1975
  e.preventDefault();
1976
+ if (!draggedItem) return;
1916
1977
  var targetNode = getTargetTreeNode(e);
1978
+ if (dragOverItem !== targetNode) {
1979
+ var _dragOverItem;
1980
+ (_dragOverItem = dragOverItem) === null || _dragOverItem === void 0 || _dragOverItem.classList.remove(dropBefore, dropAfter, dropInner);
1981
+ dragOverItem = targetNode;
1982
+ }
1917
1983
  var data = extendNodeAttr(getNodeByTargetTreeNode(targetNode));
1984
+ // 如果目标节点不在缓存中,重新计算并缓存
1985
+ if (!nodeRectMap.has(targetNode)) {
1986
+ nodeRectMap.set(targetNode, targetNode.getBoundingClientRect());
1987
+ }
1988
+ var clientY = e.clientY;
1989
+ var _nodeRectMap$get = nodeRectMap.get(targetNode),
1990
+ top = _nodeRectMap$get.top,
1991
+ height = _nodeRectMap$get.height;
1992
+ var threshold = height * dragThreshold; // 使用配置项
1993
+ var offsetY = clientY - top;
1994
+ if (offsetY < threshold) {
1995
+ updateDropStyles(targetNode, [dropBefore], [dropAfter, dropInner]);
1996
+ } else if (offsetY > height - threshold) {
1997
+ updateDropStyles(targetNode, [dropAfter], [dropBefore, dropInner]);
1998
+ } else {
1999
+ updateDropStyles(targetNode, [dropInner], [dropBefore, dropAfter]);
2000
+ }
1918
2001
  ctx.emit(EVENTS.NODE_DRAG_OVER, e, targetNode, data);
1919
2002
  if (isNeedCheckDroppable.value && props !== null && props !== void 0 && props.disableDrop(data)) {
1920
2003
  e.dataTransfer.effectAllowed = 'move';
@@ -1929,7 +2012,7 @@ var use_node_drag_this = undefined;
1929
2012
  var transferEffect = isNodeSortable(sourceNodeId, targetNodeId) ? 'move' : 'none';
1930
2013
  e.dataTransfer.effectAllowed = transferEffect;
1931
2014
  e.dataTransfer.dropEffect = transferEffect;
1932
- };
2015
+ });
1933
2016
  var handleTreeNodeDragStart = function handleTreeNodeDragStart(e) {
1934
2017
  e.dataTransfer.effectAllowed = 'move';
1935
2018
  e.dataTransfer.dropEffect = 'move';
@@ -1937,49 +2020,104 @@ var use_node_drag_this = undefined;
1937
2020
  e.dataTransfer.setData('text/plain', '');
1938
2021
  var nodeId = targetNode.getAttribute('data-tree-node');
1939
2022
  dragNodeId = nodeId;
2023
+ draggedItem = targetNode;
1940
2024
  e.dataTransfer.setData('node-id', nodeId);
1941
2025
  ctx.emit(EVENTS.NODE_DRAG_START, e, targetNode);
1942
2026
  };
1943
2027
  var handleTreeNodeDrop = function handleTreeNodeDrop(e) {
2028
+ var _dragOverItem5;
1944
2029
  /** firefox的drop事件必须调用preventDefault()和stopPropagation(), 否则会自动重定向 */
1945
2030
  e.preventDefault();
1946
2031
  e.stopPropagation();
1947
2032
  var targetNode = getTargetTreeNode(e);
2033
+ if (!targetNode) return;
1948
2034
  targetNode.classList.remove("".concat(resolveClassName('tree-drop-active')), "".concat(resolveClassName('tree-drop-disabled')));
1949
2035
  var data = extendNodeAttr(getNodeByTargetTreeNode(targetNode));
1950
2036
  if (isNeedCheckDroppable.value && props.disableDrop(data)) {
1951
2037
  return;
1952
2038
  }
1953
- var sourceNodeId = dragNodeId; // e.dataTransfer.getData('node-id');
2039
+ var sourceNodeId = dragNodeId;
1954
2040
  var targetNodeId = targetNode.getAttribute('data-tree-node');
1955
- Reflect.apply(props.dragSort ? dragSortData : dragAsChildNode, use_node_drag_this, [sourceNodeId, targetNodeId]);
1956
- ctx.emit(EVENTS.NODE_DROP, e, targetNode, data);
2041
+ if (sourceNodeId !== targetNodeId) {
2042
+ var _dragOverItem2, _dragOverItem3, _dragOverItem4;
2043
+ if ((_dragOverItem2 = dragOverItem) !== null && _dragOverItem2 !== void 0 && _dragOverItem2.classList.contains(dropInner)) {
2044
+ Reflect.apply(dragAsChildNode, use_node_drag_this, [sourceNodeId, targetNodeId]);
2045
+ } else if ((_dragOverItem3 = dragOverItem) !== null && _dragOverItem3 !== void 0 && _dragOverItem3.classList.contains(dropAfter) || (_dragOverItem4 = dragOverItem) !== null && _dragOverItem4 !== void 0 && _dragOverItem4.classList.contains(dropBefore)) {
2046
+ Reflect.apply(dragSortData, use_node_drag_this, [sourceNodeId, targetNodeId]);
2047
+ }
2048
+ ctx.emit(EVENTS.NODE_DROP, e, targetNode, data);
2049
+ }
2050
+ nodeRectMap = new WeakMap();
2051
+ (_dragOverItem5 = dragOverItem) === null || _dragOverItem5 === void 0 || _dragOverItem5.classList.remove(dropAfter, dropBefore, dropInner);
2052
+ dragOverItem = null;
1957
2053
  };
1958
2054
  var isNodeSortable = function isNodeSortable(sourceId, targetId) {
1959
- var sourcePath = getNodePathById(sourceId);
1960
- var targetPath = getNodePathById(targetId);
1961
- // if (!sourcePath || targetPath) {
1962
- // return false;
1963
- // }
1964
- var sourceParentNodeId = getNodeParentIdById(sourceId);
1965
- var targetParentNode = getNodeParentIdById(targetId);
1966
- if (sourceParentNodeId === targetParentNode) {
1967
- return true;
1968
- }
1969
- return sourcePath.indexOf(targetPath) === -1 && targetPath.indexOf(sourcePath) === -1;
2055
+ return sourceId !== targetId;
1970
2056
  };
1971
2057
  var dragSortData = function dragSortData(sourceId, targetId) {
1972
- if (!isNodeSortable(sourceId, targetId)) {
2058
+ var _dragOverItem6, _dragOverItem7;
2059
+ if (!props.dragSort || !isNodeSortable(sourceId, targetId)) {
1973
2060
  return;
1974
2061
  }
1975
- var sourceNodeData = JSON.parse(JSON.stringify(getSourceNodeByUID(sourceId)));
1976
- var targetNodeData = JSON.parse(JSON.stringify(getSourceNodeByUID(targetId)));
2062
+ var sourceNodeData = getSourceNodeByUID(sourceId);
2063
+ var targetNodeData = getSourceNodeByUID(targetId);
2064
+ if (!sourceNodeData || !targetNodeData) return;
1977
2065
  var sourceNodeParent = getParentNodeData(sourceId);
1978
2066
  var targetNodeParent = getParentNodeData(targetId);
1979
- var sourceNodeIndex = getNodeAttrById(sourceId, NODE_ATTRIBUTES.INDEX);
1980
- var targetNodeIndex = getNodeAttrById(targetId, NODE_ATTRIBUTES.INDEX);
1981
- sourceNodeParent === null || sourceNodeParent === void 0 || sourceNodeParent[props.children].splice(sourceNodeIndex, 1, targetNodeData);
1982
- targetNodeParent === null || targetNodeParent === void 0 || targetNodeParent[props.children].splice(targetNodeIndex, 1, sourceNodeData);
2067
+ if (!sourceNodeParent || !targetNodeParent) return;
2068
+ // 只允许同父节点下排序
2069
+ if (props.dragSortMode === 'next') {
2070
+ if (sourceNodeParent !== targetNodeParent) return;
2071
+ }
2072
+ var childrenKey = props.children;
2073
+ var sourceSiblings = sourceNodeParent[childrenKey];
2074
+ var targetSlibings = targetNodeParent[childrenKey];
2075
+ if (!Array.isArray(sourceSiblings)) return;
2076
+ var sourceNodeIndex = sourceSiblings.findIndex(function (item) {
2077
+ return item === sourceNodeData;
2078
+ });
2079
+ var targetNodeIndex = targetSlibings.findIndex(function (item) {
2080
+ return item === targetNodeData;
2081
+ });
2082
+ if (sourceNodeIndex === -1 || targetNodeIndex === -1) return;
2083
+ // 先移除源节点
2084
+ sourceSiblings.splice(sourceNodeIndex, 1);
2085
+ // 计算插入位置
2086
+ if ((_dragOverItem6 = dragOverItem) !== null && _dragOverItem6 !== void 0 && _dragOverItem6.classList.contains(dropAfter)) {
2087
+ // 如果源节点在目标节点前面,移除后 targetNodeIndex 需要减 1
2088
+ if (sourceNodeIndex < targetNodeIndex) {
2089
+ targetNodeIndex = targetNodeIndex - 1;
2090
+ }
2091
+ targetNodeIndex = targetNodeIndex + 1;
2092
+ } else if ((_dragOverItem7 = dragOverItem) !== null && _dragOverItem7 !== void 0 && _dragOverItem7.classList.contains(dropBefore)) {
2093
+ // 如果源节点在目标节点后面,移除后 targetNodeIndex 不变
2094
+ if (sourceNodeIndex > targetNodeIndex) {
2095
+ // do nothing
2096
+ }
2097
+ }
2098
+ // 插入节点
2099
+ targetSlibings.splice(targetNodeIndex, 0, sourceNodeData);
2100
+ // 更新所有兄弟节点的 INDEX
2101
+ targetSlibings.forEach(function (item, idx) {
2102
+ var nodeId = getNodeAttrById(item[NODE_ATTRIBUTES.UUID], NODE_ATTRIBUTES.UUID) || item[NODE_ATTRIBUTES.UUID];
2103
+ if (nodeId) {
2104
+ setNodeAttrById(nodeId, NODE_ATTRIBUTES.INDEX, idx);
2105
+ }
2106
+ });
2107
+ sourceSiblings.forEach(function (item, idx) {
2108
+ var nodeId = getNodeAttrById(item[NODE_ATTRIBUTES.UUID], NODE_ATTRIBUTES.UUID) || item[NODE_ATTRIBUTES.UUID];
2109
+ if (nodeId) {
2110
+ setNodeAttrById(nodeId, NODE_ATTRIBUTES.INDEX, idx);
2111
+ }
2112
+ });
2113
+ // 触发更新
2114
+ ctx.emit(EVENTS.NODE_DRAG_SORT, {
2115
+ sourceNode: sourceNodeData,
2116
+ targetNode: targetNodeData,
2117
+ sourceIndex: sourceNodeIndex,
2118
+ targetIndex: targetNodeIndex,
2119
+ targetSlibings: targetSlibings
2120
+ });
1983
2121
  };
1984
2122
  var dragAsChildNode = function dragAsChildNode(sourceNodeId, targetNodeId) {
1985
2123
  var sourceNodeData = getSourceNodeByUID(sourceNodeId);
@@ -2004,11 +2142,16 @@ var use_node_drag_this = undefined;
2004
2142
  var handleTreeNodeDragLeave = function handleTreeNodeDragLeave(e) {
2005
2143
  e.preventDefault();
2006
2144
  var targetNode = getTargetTreeNode(e);
2145
+ // 移除目标节点的缓存
2146
+ if (nodeRectMap.has(targetNode)) {
2147
+ nodeRectMap["delete"](targetNode);
2148
+ }
2007
2149
  targetNode.classList.remove("".concat(resolveClassName('tree-drop-active')), "".concat(resolveClassName('tree-drop-disabled')));
2150
+ targetNode.classList.remove(dropAfter, dropBefore, dropInner);
2008
2151
  ctx.emit(EVENTS.NODE_DRAG_LEAVE, e, targetNode);
2009
2152
  };
2010
2153
  (0,external_vue_namespaceObject.onMounted)(function () {
2011
- if (props.draggable && root.value) {
2154
+ if ((props.draggable || props.dragSort) && root.value) {
2012
2155
  var rootTree = root.value.$el;
2013
2156
  rootTree.addEventListener('mousedown', handleTreeNodeMousedown);
2014
2157
  rootTree.addEventListener('dragstart', handleTreeNodeDragStart);
@@ -2018,7 +2161,7 @@ var use_node_drag_this = undefined;
2018
2161
  }
2019
2162
  });
2020
2163
  (0,external_vue_namespaceObject.onUnmounted)(function () {
2021
- if (props.draggable && root.value) {
2164
+ if ((props.draggable || props.dragSort) && root.value) {
2022
2165
  var rootTree = root.value.$el;
2023
2166
  rootTree.removeEventListener('mousedown', handleTreeNodeMousedown);
2024
2167
  rootTree.removeEventListener('dragstart', handleTreeNodeDragStart);
@@ -2650,6 +2793,7 @@ var use_tree_init_this = undefined;
2650
2793
  getNodePath = _useNodeAttribute.getNodePath,
2651
2794
  getNodeId = _useNodeAttribute.getNodeId,
2652
2795
  getNodeAttr = _useNodeAttribute.getNodeAttr,
2796
+ getNodeById = _useNodeAttribute.getNodeById,
2653
2797
  getParentNode = _useNodeAttribute.getParentNode,
2654
2798
  getIntersectionResponse = _useNodeAttribute.getIntersectionResponse;
2655
2799
  var _useSearch = use_search(props),
@@ -2795,6 +2939,11 @@ var use_tree_init_this = undefined;
2795
2939
  return;
2796
2940
  }
2797
2941
  };
2942
+ var setCheckedById = function setCheckedById(id) {
2943
+ var checked = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2944
+ var triggerEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2945
+ setChecked(getNodeById(id), checked, triggerEvent);
2946
+ };
2798
2947
  ctx.expose({
2799
2948
  handleTreeNodeClick: handleTreeNodeClick,
2800
2949
  isNodeChecked: isNodeChecked,
@@ -2804,6 +2953,7 @@ var use_tree_init_this = undefined;
2804
2953
  hasChildNode: hasChildNode,
2805
2954
  setOpen: setOpen,
2806
2955
  setChecked: setChecked,
2956
+ setCheckedById: setCheckedById,
2807
2957
  setNodeAction: setNodeAction,
2808
2958
  setNodeOpened: setOpen,
2809
2959
  setSelect: setSelect,
@@ -132,6 +132,16 @@ export declare const treeProps: {
132
132
  disableDrop: import("vue-types").VueTypeValidableDef<(...args: any[]) => any> & {
133
133
  default: (...args: any[]) => any;
134
134
  };
135
+ /**
136
+ * 拖拽阈值
137
+ * 用于判断拖拽时鼠标位置与节点的距离
138
+ * 当鼠标位置与节点的距离大于此值时,才会触发拖拽
139
+ */
140
+ dragThreshold: import("vue-types").VueTypeValidableDef<number> & {
141
+ default: number;
142
+ } & {
143
+ default: number;
144
+ };
135
145
  /**
136
146
  * 节点拖拽时可交换位置(开启拖拽可交换位置后将不支持改变层级)
137
147
  */
@@ -140,6 +150,15 @@ export declare const treeProps: {
140
150
  } & {
141
151
  default: boolean;
142
152
  };
153
+ /**
154
+ * 拖拽排序模式
155
+ * - any: 允许拖拽到任意位置
156
+ * - next: 只允许拖拽到同级节点的前后位置
157
+ * 默认 any
158
+ */
159
+ dragSortMode: import("vue-types").VueTypeDef<string> & {
160
+ default: string;
161
+ };
143
162
  /**
144
163
  * 节点是否可以选中
145
164
  */
@@ -240,6 +259,7 @@ type AsyncOption = {
240
259
  callback: (item: any, cb: any) => Promise<VNode | string>;
241
260
  cache: boolean;
242
261
  deepAutoOpen?: string;
262
+ trigger?: string[];
243
263
  };
244
264
  export type IIntersectionObserver = {
245
265
  enabled: boolean;
package/lib/tree/tree.css CHANGED
@@ -257,13 +257,33 @@
257
257
  }
258
258
  .bk-tree {
259
259
  font-size: 14px;
260
+ position: relative;
260
261
  }
261
262
  .bk-tree .bk-node-row {
262
263
  padding-left: calc(var(--offset-left));
264
+ position: relative;
263
265
  }
264
266
  .bk-tree .bk-node-row.is-selected {
265
267
  background-color: #ebf2ff;
266
268
  }
269
+ .bk-tree .bk-node-row.drop-before::before {
270
+ content: '';
271
+ position: absolute;
272
+ top: 0;
273
+ left: 0;
274
+ right: 0;
275
+ height: 1px;
276
+ background-color: #2196F3;
277
+ }
278
+ .bk-tree .bk-node-row.drop-after::before {
279
+ content: '';
280
+ position: absolute;
281
+ bottom: 0;
282
+ left: 0;
283
+ right: 0;
284
+ height: 1px;
285
+ background-color: #2196F3;
286
+ }
267
287
  .bk-tree-node {
268
288
  position: relative;
269
289
  display: flex;
@@ -276,6 +296,20 @@
276
296
  .bk-tree-node:not(.is-root) {
277
297
  margin-left: calc(var(--depth)*var(--indent));
278
298
  }
299
+ .bk-tree-node:not(.is-root).level-line .bk-node-action.empty-child {
300
+ position: relative;
301
+ }
302
+ .bk-tree-node:not(.is-root).level-line .bk-node-action.empty-child::before {
303
+ position: absolute;
304
+ top: calc(50% + 1px);
305
+ left: 0;
306
+ right: 0;
307
+ z-index: 1;
308
+ height: 0;
309
+ pointer-events: none;
310
+ border-bottom: var(--level-line);
311
+ content: '';
312
+ }
279
313
  .bk-tree-node:not(.is-root).level-line::before {
280
314
  position: absolute;
281
315
  top: calc(50% + 1px);
@@ -309,6 +343,7 @@
309
343
  .bk-tree-node .bk-node-action {
310
344
  margin-right: 6px;
311
345
  color: #979ba5;
346
+ min-width: 14px;
312
347
  }
313
348
  .bk-tree-node .bk-tree-icon {
314
349
  margin: 0 6px 0 4px;
@@ -319,6 +354,9 @@
319
354
  align-items: center;
320
355
  min-width: 0;
321
356
  }
357
+ .bk-tree-node .bk-node-content .node-check-box {
358
+ display: inline-flex;
359
+ }
322
360
  .bk-tree-node .bk-node-content .bk-checkbox {
323
361
  margin: 0;
324
362
  }
@@ -340,3 +378,11 @@
340
378
  .bk-tree-drop-disabled .bk-tree-node {
341
379
  cursor: no-drop;
342
380
  }
381
+ .bk-tree .insert-line {
382
+ position: absolute;
383
+ height: 2px;
384
+ background: #2196F3;
385
+ display: none;
386
+ pointer-events: none;
387
+ z-index: 999;
388
+ }