bkui-vue 2.1.0-dev-beta.10 → 2.1.0-dev-beta.12

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.
@@ -19,6 +19,49 @@ export type TreeNode = {
19
19
  */
20
20
  export type DropType = 'child' | 'move' | 'sort';
21
21
  export type DisableDropHandler = (data: TreeNode, type: DropType, target: TreeNode) => boolean;
22
+ export type TreeDataChangeTrigger = 'async' | 'drag';
23
+ export type TreeDataChangePayload = {
24
+ trigger: TreeDataChangeTrigger;
25
+ data: TreeNode[];
26
+ node: TreeNode;
27
+ targetNode?: TreeNode;
28
+ parentNode?: TreeNode | null;
29
+ oldParentNode?: TreeNode | null;
30
+ dropType?: DropType;
31
+ sourceIndex?: number;
32
+ targetIndex?: number;
33
+ };
34
+ export type TreeDataChangeHandler = (payload: TreeDataChangePayload) => void;
35
+ export type TreeCheckedPayload = {
36
+ checkedNodes: TreeNode[];
37
+ indeterminateNodes: TreeNode[];
38
+ };
39
+ export type TreeSelectedPayload = {
40
+ selected: boolean;
41
+ node: TreeNode;
42
+ };
43
+ export type TreeDropPayload = {
44
+ event: unknown;
45
+ element: HTMLElement;
46
+ targetNode: TreeNode;
47
+ sourceNode: TreeNode;
48
+ data: TreeNode[];
49
+ parentNode?: TreeNode | null;
50
+ oldParentNode?: TreeNode | null;
51
+ dropType?: DropType;
52
+ sourceIndex?: number;
53
+ targetIndex?: number;
54
+ };
55
+ export type TreeDragSortPayload = {
56
+ sourceNode: TreeNode;
57
+ targetNode: TreeNode;
58
+ data: TreeNode[];
59
+ parentNode?: TreeNode | null;
60
+ oldParentNode?: TreeNode | null;
61
+ dropType?: DropType;
62
+ sourceIndex?: number;
63
+ targetIndex?: number;
64
+ };
22
65
  /**
23
66
  * Tree Prop: prefixIcon function
24
67
  * @param {} isRoot 是否为分跟节点
@@ -102,6 +145,10 @@ export declare const treeProps: {
102
145
  prefixIcon: import("vue-types").VueTypeDef<any> & {
103
146
  default: any;
104
147
  };
148
+ /**
149
+ * 当树数据需要由外部接管更新时的统一回调
150
+ */
151
+ onDataChange: PropType<TreeDataChangeHandler>;
105
152
  /**
106
153
  * 异步加载节点数据配置
107
154
  * @param callback 请求数据回调函数,函数返回 Promise
@@ -146,9 +193,7 @@ export declare const treeProps: {
146
193
  */
147
194
  disableDrop: PropType<DisableDropHandler>;
148
195
  /**
149
- * 拖拽阈值
150
- * 用于判断拖拽时鼠标位置与节点的距离
151
- * 当鼠标位置与节点的距离大于此值时,才会触发拖拽
196
+ * 拖拽阈值:节点顶部/底部区域占比用于判定前后插入,中间区域作为目标子节点
152
197
  */
153
198
  dragThreshold: import("vue-types").VueTypeValidableDef<number> & {
154
199
  default: number;
@@ -156,7 +201,7 @@ export declare const treeProps: {
156
201
  default: number;
157
202
  };
158
203
  /**
159
- * 节点拖拽时可交换位置(开启拖拽可交换位置后将不支持改变层级)
204
+ * 节点拖拽时可调整前后顺序;拖拽到节点中部仍会添加为目标子节点
160
205
  */
161
206
  dragSort: import("vue-types").VueTypeValidableDef<boolean> & {
162
207
  default: boolean;
@@ -275,6 +320,14 @@ export declare const treeProps: {
275
320
  } & {
276
321
  default: boolean;
277
322
  };
323
+ /**
324
+ * 是否开启父子勾选级联;未传时沿用 checkStrictly 历史语义
325
+ */
326
+ cascade: import("vue-types").VueTypeValidableDef<boolean> & {
327
+ default: boolean;
328
+ } & {
329
+ default: boolean;
330
+ };
278
331
  /**
279
332
  * 是否开启监听Tree节点进入Tree容器可视区域
280
333
  */
@@ -282,8 +335,9 @@ export declare const treeProps: {
282
335
  default: boolean | (() => IIntersectionObserver);
283
336
  };
284
337
  };
338
+ type AsyncLoadCallback = (item: TreeNode, cb: (data: TreeNode | TreeNode[]) => Promise<unknown> | unknown, data?: unknown) => Promise<TreeNode | TreeNode[]> | TreeNode | TreeNode[];
285
339
  type AsyncOption = {
286
- callback: (item: any, cb: any) => Promise<VNode | string>;
340
+ callback: AsyncLoadCallback;
287
341
  cache: boolean;
288
342
  deepAutoOpen?: string;
289
343
  trigger?: string[];
package/lib/tree/tree.css CHANGED
@@ -274,60 +274,49 @@
274
274
  text-overflow: ellipsis;
275
275
  white-space: nowrap;
276
276
  }
277
- .bk-tree-drop-active {
278
- background: #f5f7fa;
277
+ .bk-tree-node-draggable {
278
+ cursor: grab;
279
+ user-select: none;
279
280
  }
280
- .bk-tree-drop-disabled {
281
- background: #ffd5d5;
281
+ .bk-tree-node-draggable:hover {
282
+ background-color: #f5f7fa;
282
283
  }
283
- .bk-tree-drop-disabled .bk-tree-node {
284
+ .bk-tree-drop-disabled {
284
285
  cursor: no-drop;
285
- }
286
- .bk-tree-ghost {
287
286
  opacity: 0.5;
288
- background: #c8ebfb;
289
- }
290
- .bk-tree-chosen {
291
- background: #e1ecff;
292
287
  }
293
288
  .bk-tree-drag {
294
- opacity: 0.8;
295
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
289
+ opacity: 0.85;
296
290
  cursor: grabbing;
297
291
  }
298
- .bk-tree-drag-disabled .bk-node-row {
292
+ .bk-tree-drag-disabled {
299
293
  cursor: no-drop;
300
294
  opacity: 0.5;
301
295
  }
302
- .bk-tree-drop-indicator {
303
- position: fixed;
304
- pointer-events: none;
305
- z-index: 9999;
306
- }
307
- .bk-tree-drop-indicator.bk-tree-drop-inner {
308
- background: rgba(33, 150, 243, 0.06);
309
- outline: 2px dashed #3a84ff;
310
- outline-offset: -2px;
311
- border-radius: 2px;
312
- box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.1);
296
+ .bk-tree-drop-before,
297
+ .bk-tree-drop-after,
298
+ .bk-tree-drop-inner {
299
+ background-clip: content-box;
313
300
  }
314
- .bk-tree-drop-indicator.bk-tree-drop-line {
315
- background: #3a84ff;
301
+ .bk-tree-drop-before::after,
302
+ .bk-tree-drop-after::after {
303
+ position: absolute;
304
+ right: 0;
305
+ left: var(--drop-line-left, 0);
306
+ display: block;
307
+ height: 2px;
316
308
  border-radius: 1px;
317
- }
318
- .bk-tree-drop-indicator.bk-tree-drop-line::before,
319
- .bk-tree-drop-indicator.bk-tree-drop-line::after {
309
+ background-color: #3a84ff;
320
310
  content: '';
321
- position: absolute;
322
- width: 6px;
323
- height: 6px;
324
- border-radius: 50%;
325
- background: #3a84ff;
326
- top: -2px;
311
+ pointer-events: none;
327
312
  }
328
- .bk-tree-drop-indicator.bk-tree-drop-line::before {
329
- left: 0;
313
+ .bk-tree-drop-before::after {
314
+ top: -1px;
330
315
  }
331
- .bk-tree-drop-indicator.bk-tree-drop-line::after {
332
- right: 0;
316
+ .bk-tree-drop-after::after {
317
+ bottom: -1px;
318
+ }
319
+ .bk-tree-drop-inner {
320
+ background-color: rgba(58, 132, 255, 0.08);
321
+ box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.28);
333
322
  }
@@ -1,4 +1,4 @@
1
- import { TreePropTypes as defineTypes } from './props';
1
+ import { TreePropTypes as defineTypes, TreeNode } from './props';
2
2
  export type TreePropTypes = defineTypes;
3
3
  export type ITreeScrollTopOption = {
4
4
  id?: string;
@@ -43,10 +43,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
43
43
  prefixIcon: import("vue-types").VueTypeDef<any> & {
44
44
  default: any;
45
45
  };
46
+ onDataChange: import("vue").PropType<import("./props").TreeDataChangeHandler>;
46
47
  async: import("vue-types").VueTypeShape<{
47
- callback: (item: any, cb: any) => Promise<string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
48
- [key: string]: any;
49
- }>>;
48
+ callback: (item: TreeNode, cb: (data: TreeNode | TreeNode[]) => unknown, data?: unknown) => TreeNode | TreeNode[] | Promise<TreeNode | TreeNode[]>;
50
49
  cache: boolean;
51
50
  deepAutoOpen?: string;
52
51
  trigger?: string[];
@@ -139,14 +138,22 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
139
138
  } & {
140
139
  default: boolean;
141
140
  };
141
+ cascade: import("vue-types").VueTypeValidableDef<boolean> & {
142
+ default: boolean;
143
+ } & {
144
+ default: boolean;
145
+ };
142
146
  intersectionObserver: import("vue-types").VueTypeDef<boolean | import("./props").IIntersectionObserver> & {
143
147
  default: boolean | (() => import("./props").IIntersectionObserver);
144
148
  };
145
149
  }>, () => JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
150
+ nodeAsyncLoad: (..._args: any[]) => boolean;
151
+ nodeAsyncLoadError: (..._args: any[]) => boolean;
146
152
  nodeClick: (..._args: any[]) => boolean;
147
153
  nodeCollapse: (..._args: any[]) => boolean;
148
154
  nodeExpand: (..._args: any[]) => boolean;
149
155
  nodeChecked: (..._args: any[]) => boolean;
156
+ nodeDataChange: (..._args: any[]) => boolean;
150
157
  nodeDragStart: (..._args: any[]) => boolean;
151
158
  nodeDragOver: (..._args: any[]) => boolean;
152
159
  nodeDragLeave: (..._args: any[]) => boolean;
@@ -193,10 +200,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
193
200
  prefixIcon: import("vue-types").VueTypeDef<any> & {
194
201
  default: any;
195
202
  };
203
+ onDataChange: import("vue").PropType<import("./props").TreeDataChangeHandler>;
196
204
  async: import("vue-types").VueTypeShape<{
197
- callback: (item: any, cb: any) => Promise<string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
198
- [key: string]: any;
199
- }>>;
205
+ callback: (item: TreeNode, cb: (data: TreeNode | TreeNode[]) => unknown, data?: unknown) => TreeNode | TreeNode[] | Promise<TreeNode | TreeNode[]>;
200
206
  cache: boolean;
201
207
  deepAutoOpen?: string;
202
208
  trigger?: string[];
@@ -289,13 +295,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
289
295
  } & {
290
296
  default: boolean;
291
297
  };
298
+ cascade: import("vue-types").VueTypeValidableDef<boolean> & {
299
+ default: boolean;
300
+ } & {
301
+ default: boolean;
302
+ };
292
303
  intersectionObserver: import("vue-types").VueTypeDef<boolean | import("./props").IIntersectionObserver> & {
293
304
  default: boolean | (() => import("./props").IIntersectionObserver);
294
305
  };
295
306
  }>> & Readonly<{
307
+ onNodeAsyncLoad?: (...args: any[]) => any;
308
+ onNodeAsyncLoadError?: (...args: any[]) => any;
296
309
  onNodeChecked?: (...args: any[]) => any;
297
310
  onNodeClick?: (...args: any[]) => any;
298
311
  onNodeCollapse?: (...args: any[]) => any;
312
+ onNodeDataChange?: (...args: any[]) => any;
299
313
  onNodeDragLeave?: (...args: any[]) => any;
300
314
  onNodeDragOver?: (...args: any[]) => any;
301
315
  onNodeDragSort?: (...args: any[]) => any;
@@ -335,5 +349,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
335
349
  nodeContentAction: any;
336
350
  keepSlotData: boolean;
337
351
  checkStrictly: boolean;
352
+ cascade: boolean;
338
353
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
339
354
  export default _default;
@@ -22,6 +22,7 @@
22
22
  background-color: #e1ecff;
23
23
  }
24
24
  }
25
+
25
26
  }
26
27
 
27
28
  &-node {
@@ -132,80 +133,61 @@
132
133
  }
133
134
  }
134
135
 
135
- &-drop-active {
136
- background: #f5f7fa;
137
- }
136
+ &-node-draggable {
137
+ cursor: grab;
138
+ user-select: none;
138
139
 
139
- &-drop-disabled {
140
- background: #ffd5d5;
141
- .@{bk-prefix}-tree-node {
142
- cursor: no-drop;
140
+ &:hover {
141
+ background-color: #f5f7fa;
143
142
  }
144
143
  }
145
144
 
146
- // SortableJS ghost/chosen/drag 样式
147
- &-ghost {
145
+ &-drop-disabled {
146
+ cursor: no-drop;
148
147
  opacity: 0.5;
149
- background: #c8ebfb;
150
- }
151
-
152
- &-chosen {
153
- background: #e1ecff;
154
148
  }
155
149
 
156
150
  &-drag {
157
- opacity: 0.8;
158
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
151
+ opacity: 0.85;
159
152
  cursor: grabbing;
160
153
  }
161
154
 
162
155
  &-drag-disabled {
163
- .@{bk-prefix}-node-row {
164
- cursor: no-drop;
165
- opacity: 0.5;
166
- }
156
+ cursor: no-drop;
157
+ opacity: 0.5;
167
158
  }
168
- }
169
159
 
170
- // 拖拽放置指示器(overlay 方式,挂载在 body 上)
171
- // sort/move 类型:水平线 + 两端圆点,指示同级插入位置
172
- // child 类型:高亮边框 + 浅色背景,指示嵌入为子节点
173
- .@{bk-prefix}-tree-drop-indicator {
174
- position: fixed;
175
- pointer-events: none;
176
- z-index: 9999;
177
-
178
- // child 类型:嵌入为子节点的指示器
179
- &.@{bk-prefix}-tree-drop-inner {
180
- background: rgba(33, 150, 243, 0.06);
181
- outline: 2px dashed #3a84ff;
182
- outline-offset: -2px;
183
- border-radius: 2px;
184
- box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.1);
160
+ &-drop-before,
161
+ &-drop-after,
162
+ &-drop-inner {
163
+ background-clip: content-box;
185
164
  }
186
165
 
187
- // sort/move 类型:同级插入的水平线指示器
188
- &.@{bk-prefix}-tree-drop-line {
189
- background: #3a84ff;
190
- border-radius: 1px;
191
-
192
- &::before,
166
+ &-drop-before,
167
+ &-drop-after {
193
168
  &::after {
194
- content: '';
195
169
  position: absolute;
196
- width: 6px;
197
- height: 6px;
198
- border-radius: 50%;
199
- background: #3a84ff;
200
- top: -2px;
170
+ right: 0;
171
+ left: var(--drop-line-left, 0);
172
+ display: block;
173
+ height: 2px;
174
+ border-radius: 1px;
175
+ background-color: #3a84ff;
176
+ content: '';
177
+ pointer-events: none;
201
178
  }
179
+ }
202
180
 
203
- &::before {
204
- left: 0;
205
- }
181
+ &-drop-before::after {
182
+ top: -1px;
183
+ }
206
184
 
207
- &::after {
208
- right: 0;
209
- }
185
+ &-drop-after::after {
186
+ bottom: -1px;
187
+ }
188
+
189
+ &-drop-inner {
190
+ background-color: rgba(58, 132, 255, 0.08);
191
+ box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.28);
210
192
  }
211
193
  }
@@ -405,60 +405,49 @@
405
405
  text-overflow: ellipsis;
406
406
  white-space: nowrap;
407
407
  }
408
- .bk-tree-drop-active {
409
- background: #f5f7fa;
408
+ .bk-tree-node-draggable {
409
+ cursor: grab;
410
+ user-select: none;
410
411
  }
411
- .bk-tree-drop-disabled {
412
- background: #ffd5d5;
412
+ .bk-tree-node-draggable:hover {
413
+ background-color: #f5f7fa;
413
414
  }
414
- .bk-tree-drop-disabled .bk-tree-node {
415
+ .bk-tree-drop-disabled {
415
416
  cursor: no-drop;
416
- }
417
- .bk-tree-ghost {
418
417
  opacity: 0.5;
419
- background: #c8ebfb;
420
- }
421
- .bk-tree-chosen {
422
- background: #e1ecff;
423
418
  }
424
419
  .bk-tree-drag {
425
- opacity: 0.8;
426
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
420
+ opacity: 0.85;
427
421
  cursor: grabbing;
428
422
  }
429
- .bk-tree-drag-disabled .bk-node-row {
423
+ .bk-tree-drag-disabled {
430
424
  cursor: no-drop;
431
425
  opacity: 0.5;
432
426
  }
433
- .bk-tree-drop-indicator {
434
- position: fixed;
435
- pointer-events: none;
436
- z-index: 9999;
437
- }
438
- .bk-tree-drop-indicator.bk-tree-drop-inner {
439
- background: rgba(33, 150, 243, 0.06);
440
- outline: 2px dashed #3a84ff;
441
- outline-offset: -2px;
442
- border-radius: 2px;
443
- box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.1);
427
+ .bk-tree-drop-before,
428
+ .bk-tree-drop-after,
429
+ .bk-tree-drop-inner {
430
+ background-clip: content-box;
444
431
  }
445
- .bk-tree-drop-indicator.bk-tree-drop-line {
446
- background: #3a84ff;
432
+ .bk-tree-drop-before::after,
433
+ .bk-tree-drop-after::after {
434
+ position: absolute;
435
+ right: 0;
436
+ left: var(--drop-line-left, 0);
437
+ display: block;
438
+ height: 2px;
447
439
  border-radius: 1px;
448
- }
449
- .bk-tree-drop-indicator.bk-tree-drop-line::before,
450
- .bk-tree-drop-indicator.bk-tree-drop-line::after {
440
+ background-color: #3a84ff;
451
441
  content: '';
452
- position: absolute;
453
- width: 6px;
454
- height: 6px;
455
- border-radius: 50%;
456
- background: #3a84ff;
457
- top: -2px;
442
+ pointer-events: none;
458
443
  }
459
- .bk-tree-drop-indicator.bk-tree-drop-line::before {
460
- left: 0;
444
+ .bk-tree-drop-before::after {
445
+ top: -1px;
461
446
  }
462
- .bk-tree-drop-indicator.bk-tree-drop-line::after {
463
- right: 0;
447
+ .bk-tree-drop-after::after {
448
+ bottom: -1px;
449
+ }
450
+ .bk-tree-drop-inner {
451
+ background-color: rgba(58, 132, 255, 0.08);
452
+ box-shadow: inset 0 0 0 1px rgba(58, 132, 255, 0.28);
464
453
  }
@@ -6,7 +6,7 @@ type IntersectionObserverOptions = {
6
6
  };
7
7
  type IntersectionObserverResponseValue = {
8
8
  level: number;
9
- node: Record<string, any>;
9
+ node: Record<string, unknown>;
10
10
  index: number;
11
11
  entry: IntersectionObserverEntry;
12
12
  };
@@ -4,13 +4,13 @@ declare const _default: (props: TreePropTypes, ctx: any, flatData: IFlatData, _r
4
4
  renderTreeNode: (item: TreeNode, showTree?: boolean) => JSX.Element;
5
5
  handleTreeNodeClick: (item: TreeNode, e: MouseEvent, event?: string) => void;
6
6
  deepAutoOpen: () => void;
7
- asyncNodeClick: (item: TreeNode) => Promise<boolean> | Promise<void | Record<string, unknown>>;
7
+ asyncNodeClick: (item: TreeNode) => Promise<boolean | (TreeNode | TreeNode[])>;
8
8
  setNodeAction: (args: TreeNode | TreeNode[], action: string, value: unknown) => void;
9
9
  setNodeOpened: (item: TreeNode, isOpen?: any, e?: MouseEvent, fireEmit?: boolean) => void;
10
10
  setSelect: (nodes: TreeNode | TreeNode[], selected?: boolean, autoOpen?: boolean, triggerEvent?: boolean, event?: string) => void;
11
11
  setOpen: (item: TreeNode, isOpen?: boolean, autoOpenParents?: boolean) => void;
12
12
  setNodeAttribute: (node: TreeNode, attrName: string | string[], value: (boolean | number | string)[] | boolean | number | string, loopParent?: boolean) => void;
13
- isIndeterminate: (item: TreeNode) => any;
13
+ isIndeterminate: (item: TreeNode) => boolean;
14
14
  deepUpdateChildNode: (node: TreeNode, attr: string | string[], value: unknown | unknown[]) => void;
15
15
  updateParentChecked: (item: TreeNode, isChecked: any) => void;
16
16
  };
@@ -1,6 +1,16 @@
1
- import { TreeNode } from './props';
2
- declare const _default: (props: any, flatData: any) => {
3
- asyncNodeClick: (item: TreeNode) => Promise<boolean> | Promise<void | Record<string, unknown>>;
1
+ import { EVENTS } from './constant';
2
+ import { TreeDataChangePayload, TreeNode, TreePropTypes } from './props';
3
+ import { IFlatData } from './util';
4
+ type TreeContext = {
5
+ emit: (event: EVENTS, ...args: unknown[]) => void;
6
+ };
7
+ type AsyncLoadResponse = TreeNode | TreeNode[];
8
+ export type UseNodeAsyncOptions = {
9
+ getTreeData?: () => TreeNode[];
10
+ onTreeDataChange?: (payload: TreeDataChangePayload) => void;
11
+ };
12
+ declare const _default: (props: TreePropTypes, flatData: IFlatData, ctx?: TreeContext, options?: UseNodeAsyncOptions) => {
13
+ asyncNodeClick: (item: TreeNode) => Promise<boolean | AsyncLoadResponse>;
4
14
  deepAutoOpen: () => void;
5
15
  };
6
16
  export default _default;