@refinitiv-ui/elements 7.10.10 → 7.11.0
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/CHANGELOG.md +6 -0
- package/lib/combo-box/custom-elements.json +1 -1
- package/lib/combo-box/custom-elements.md +1 -1
- package/lib/combo-box/helpers/filter.d.ts +2 -2
- package/lib/combo-box/helpers/filter.js +12 -3
- package/lib/combo-box/helpers/types.d.ts +3 -2
- package/lib/combo-box/index.js +4 -3
- package/lib/overlay/managers/viewport-manager.js +11 -11
- package/lib/tree/custom-elements.json +5 -0
- package/lib/tree/custom-elements.md +10 -9
- package/lib/tree/elements/tree-item.d.ts +1 -1
- package/lib/tree/elements/tree.d.ts +5 -4
- package/lib/tree/elements/tree.js +45 -41
- package/lib/tree/helpers/filter.d.ts +1 -1
- package/lib/tree/helpers/filter.js +3 -3
- package/lib/tree/helpers/renderer.js +5 -11
- package/lib/tree/helpers/types.d.ts +2 -1
- package/lib/tree/index.d.ts +1 -0
- package/lib/tree/managers/tree-manager.d.ts +65 -42
- package/lib/tree/managers/tree-manager.js +123 -72
- package/lib/tree/managers/tree-node.d.ts +141 -0
- package/lib/tree/managers/tree-node.js +215 -0
- package/lib/tree-select/custom-elements.json +12 -0
- package/lib/tree-select/custom-elements.md +18 -11
- package/lib/tree-select/index.d.ts +12 -7
- package/lib/tree-select/index.js +42 -33
- package/lib/version.js +1 -1
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [7.11.0](https://github.com/Refinitiv/refinitiv-ui/compare/@refinitiv-ui/elements@7.10.10...@refinitiv-ui/elements@7.11.0) (2024-05-07)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **tree, tree-select:** introducing new Tree Manager APIs and Tree Node ([#1149](https://github.com/Refinitiv/refinitiv-ui/issues/1149)) ([1dbe3f5](https://github.com/Refinitiv/refinitiv-ui/commit/1dbe3f570f4cf45cc9b3407426aa94a48cc03033)), closes [#1136](https://github.com/Refinitiv/refinitiv-ui/issues/1136) [#1134](https://github.com/Refinitiv/refinitiv-ui/issues/1134) [#1133](https://github.com/Refinitiv/refinitiv-ui/issues/1133) [#1145](https://github.com/Refinitiv/refinitiv-ui/issues/1145) [#1135](https://github.com/Refinitiv/refinitiv-ui/issues/1135)
|
|
11
|
+
|
|
6
12
|
## [7.10.10](https://github.com/Refinitiv/refinitiv-ui/compare/@refinitiv-ui/elements@7.10.9...@refinitiv-ui/elements@7.10.10) (2024-04-30)
|
|
7
13
|
|
|
8
14
|
### Bug Fixes
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"name": "filter",
|
|
78
78
|
"description": "Custom filter for static data\nSet this to null when data is filtered externally, eg XHR",
|
|
79
79
|
"type": "ComboBoxFilter<T> | null",
|
|
80
|
-
"default": "\"
|
|
80
|
+
"default": "\"createDefaultFilter<T>(this)\""
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"name": "renderer",
|
|
@@ -10,7 +10,7 @@ Combines a popup with a filterable selection list
|
|
|
10
10
|
| `data` | | `ComboBoxData<T>` | [] | Data array to be displayed |
|
|
11
11
|
| `disabled` | `disabled` | `boolean` | false | Set disabled state |
|
|
12
12
|
| `error` | `error` | `boolean` | false | Set error state |
|
|
13
|
-
| `filter` | | `ComboBoxFilter<T> \| null` | "
|
|
13
|
+
| `filter` | | `ComboBoxFilter<T> \| null` | "createDefaultFilter<T>(this)" | Custom filter for static data<br />Set this to null when data is filtered externally, eg XHR |
|
|
14
14
|
| `freeText` | `free-text` | `boolean` | false | Allow to enter any value |
|
|
15
15
|
| `label (readonly)` | | `string` | "" | Label of selected value |
|
|
16
16
|
| `multiple` | `multiple` | `boolean` | false | Multiple selection mode |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DataItem } from '@refinitiv-ui/utils/collection.js';
|
|
2
2
|
import type { ItemData } from '../../item';
|
|
3
3
|
import type { ComboBox } from '../index';
|
|
4
4
|
import type { ComboBoxFilter } from './types';
|
|
@@ -7,4 +7,4 @@ import type { ComboBoxFilter } from './types';
|
|
|
7
7
|
* @param el ComboBox instance to filter
|
|
8
8
|
* @returns Filter accepting an item
|
|
9
9
|
*/
|
|
10
|
-
export declare const
|
|
10
|
+
export declare const createDefaultFilter: <T extends DataItem = ItemData>(el: ComboBox<T>) => ComboBoxFilter<T>;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import escapeStringRegexp from 'escape-string-regexp';
|
|
2
|
+
import { CollectionComposer } from '@refinitiv-ui/utils/collection.js';
|
|
2
3
|
/**
|
|
3
4
|
* Default filter used by combo box
|
|
4
5
|
* @param el ComboBox instance to filter
|
|
5
6
|
* @returns Filter accepting an item
|
|
6
7
|
*/
|
|
7
|
-
export const
|
|
8
|
+
export const createDefaultFilter = (el) => {
|
|
8
9
|
// reference query string for validating queryRegExp cache state
|
|
9
10
|
let query = '';
|
|
10
11
|
// cache RegExp
|
|
@@ -20,9 +21,17 @@ export const defaultFilter = (el) => {
|
|
|
20
21
|
return queryRegExp;
|
|
21
22
|
};
|
|
22
23
|
// return scoped custom filter
|
|
23
|
-
return (item) => {
|
|
24
|
+
return (item, context) => {
|
|
25
|
+
let label;
|
|
26
|
+
if (context) {
|
|
27
|
+
const composer = context instanceof CollectionComposer ? context : context.composer;
|
|
28
|
+
label = composer.getItemPropertyValue(item, 'label');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
label = item.label;
|
|
32
|
+
}
|
|
24
33
|
const regex = getRegularExpressionOfQuery();
|
|
25
|
-
const result = regex.test(
|
|
34
|
+
const result = regex.test(label);
|
|
26
35
|
// this example uses global scope, so the index needs resetting
|
|
27
36
|
regex.lastIndex = 0;
|
|
28
37
|
return result;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { DataItem } from '@refinitiv-ui/utils/collection.js';
|
|
1
|
+
import type { CollectionComposer, DataItem } from '@refinitiv-ui/utils/collection.js';
|
|
2
2
|
import type { ItemData } from '../../item';
|
|
3
|
+
import type { TreeManager } from '../../tree';
|
|
3
4
|
/**
|
|
4
5
|
* Predicate callback
|
|
5
6
|
* Matches item against filter function
|
|
@@ -7,5 +8,5 @@ import type { ItemData } from '../../item';
|
|
|
7
8
|
* @param item Item to filter
|
|
8
9
|
* @return Does item match filter
|
|
9
10
|
*/
|
|
10
|
-
export type ComboBoxFilter<T extends DataItem = ItemData> = (item: T) => boolean;
|
|
11
|
+
export type ComboBoxFilter<T extends DataItem = ItemData> = (item: T, context?: CollectionComposer<T> | TreeManager<T>) => boolean;
|
|
11
12
|
export type ComboBoxData<T extends DataItem = ItemData> = T[] | Promise<T[]>;
|
package/lib/combo-box/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import '../list/index.js';
|
|
|
16
16
|
import '../overlay/index.js';
|
|
17
17
|
import { registerOverflowTooltip } from '../tooltip/index.js';
|
|
18
18
|
import { VERSION } from '../version.js';
|
|
19
|
-
import {
|
|
19
|
+
import { createDefaultFilter } from './helpers/filter.js';
|
|
20
20
|
import { CustomKeyboardEvent } from './helpers/keyboard-event.js';
|
|
21
21
|
import { ComboBoxRenderer, createComboBoxRenderer } from './helpers/renderer.js';
|
|
22
22
|
export { ComboBoxRenderer, createComboBoxRenderer };
|
|
@@ -53,7 +53,7 @@ let ComboBox = class ComboBox extends FormFieldElement {
|
|
|
53
53
|
* Set this to null when data is filtered externally, eg XHR
|
|
54
54
|
* @type {ComboBoxFilter<T> | null}
|
|
55
55
|
*/
|
|
56
|
-
this.filter =
|
|
56
|
+
this.filter = createDefaultFilter(this);
|
|
57
57
|
/**
|
|
58
58
|
* Renderer used to render list item elements
|
|
59
59
|
*/
|
|
@@ -683,6 +683,7 @@ let ComboBox = class ComboBox extends FormFieldElement {
|
|
|
683
683
|
let groupHeaderItem = null;
|
|
684
684
|
this.queryItems((item, composer) => {
|
|
685
685
|
// do not filter hidden items
|
|
686
|
+
// TODO: blocking `hidden` update via TreeManager/TreeNode of this component
|
|
686
687
|
if (item.hidden) {
|
|
687
688
|
return false;
|
|
688
689
|
}
|
|
@@ -692,7 +693,7 @@ let ComboBox = class ComboBox extends FormFieldElement {
|
|
|
692
693
|
groupHeaderItem = item;
|
|
693
694
|
}
|
|
694
695
|
else {
|
|
695
|
-
result = filter(item);
|
|
696
|
+
result = filter(item, composer);
|
|
696
697
|
}
|
|
697
698
|
composer.setItemPropertyValue(item, 'hidden', !result);
|
|
698
699
|
composer.updateItemTimestamp(item);
|
|
@@ -87,17 +87,17 @@ export class ViewportManager {
|
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
89
89
|
const screenRect = this.screenViewport.getBoundingClientRect();
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
90
|
+
/**
|
|
91
|
+
* since screenViewport is applied on html element, it does not include body zoom.
|
|
92
|
+
* Zoom is a legacy feature and must not be used by any means.
|
|
93
|
+
* Kept here for compatibility with old apps.
|
|
94
|
+
*
|
|
95
|
+
* TODO: re-visit once the standardized zoom is implemented across major browsers.
|
|
96
|
+
* https://github.com/w3c/csswg-drafts/issues/5623
|
|
97
|
+
*/
|
|
98
|
+
const zoom = document.body
|
|
99
|
+
? parseFloat(window.getComputedStyle(document.body).getPropertyValue('zoom')) || 1
|
|
100
|
+
: 1;
|
|
101
101
|
const screenHeight = screenRect.height / zoom;
|
|
102
102
|
const screenWidth = screenRect.width / zoom;
|
|
103
103
|
const { top, left, bottom, right } = viewport.getBoundingClientRect();
|
|
@@ -5,15 +5,16 @@ to be used for menus and group selections
|
|
|
5
5
|
|
|
6
6
|
## Properties
|
|
7
7
|
|
|
8
|
-
| Property
|
|
9
|
-
|
|
10
|
-
| `data`
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
8
|
+
| Property | Attribute | Type | Default | Description |
|
|
9
|
+
|----------------------|---------------|------------------|-------------------------------|--------------------------------------------------|
|
|
10
|
+
| `data` | | `TreeData<T>` | | Data object to be used for creating tree |
|
|
11
|
+
| `manager (readonly)` | | `TreeManager<T>` | | Tree manager used for item manipulation |
|
|
12
|
+
| `multiple` | `multiple` | `boolean` | false | Allows multiple items to be selected |
|
|
13
|
+
| `noRelation` | `no-relation` | `boolean` | false | Breaks the relationship when multiple<br />selection mode is enabled |
|
|
14
|
+
| `query` | `query` | `string` | "" | Query string applied to tree |
|
|
15
|
+
| `renderer` | | | "createTreeRenderer<T>(this)" | Renderer used for generating tree items |
|
|
16
|
+
| `stateless` | `stateless` | `boolean` | false | Disable selections |
|
|
17
|
+
| `values` | | `string[]` | [] | Selected items in tree |
|
|
17
18
|
|
|
18
19
|
## Methods
|
|
19
20
|
|
|
@@ -3,7 +3,7 @@ import { PropertyValues, TapEvent } from '@refinitiv-ui/core';
|
|
|
3
3
|
import { CollectionComposer } from '@refinitiv-ui/utils/collection.js';
|
|
4
4
|
import { List } from '../../list/index.js';
|
|
5
5
|
import type { TreeData, TreeDataItem, TreeFilter } from '../helpers/types';
|
|
6
|
-
import { TreeManagerMode } from '../managers/tree-manager.js';
|
|
6
|
+
import { TreeManager, TreeManagerMode } from '../managers/tree-manager.js';
|
|
7
7
|
import './tree-item.js';
|
|
8
8
|
/**
|
|
9
9
|
* Displays a tree structure
|
|
@@ -22,10 +22,11 @@ export declare class Tree<T extends TreeDataItem = TreeDataItem> extends List<T>
|
|
|
22
22
|
*/
|
|
23
23
|
static get version(): string;
|
|
24
24
|
protected readonly defaultRole: string | null;
|
|
25
|
+
private _manager;
|
|
25
26
|
/**
|
|
26
|
-
* Tree manager used for manipulation
|
|
27
|
+
* Tree manager used for item manipulation
|
|
27
28
|
*/
|
|
28
|
-
|
|
29
|
+
get manager(): TreeManager<T>;
|
|
29
30
|
/**
|
|
30
31
|
* Allows multiple items to be selected
|
|
31
32
|
*/
|
|
@@ -48,7 +49,7 @@ export declare class Tree<T extends TreeDataItem = TreeDataItem> extends List<T>
|
|
|
48
49
|
/**
|
|
49
50
|
* Renderer used for generating tree items
|
|
50
51
|
*/
|
|
51
|
-
renderer: (item: T, composer: CollectionComposer<T>, element?: HTMLElement) => HTMLElement;
|
|
52
|
+
renderer: (item: T, composer: CollectionComposer<T>, element?: HTMLElement | undefined) => HTMLElement;
|
|
52
53
|
/**
|
|
53
54
|
* Expands all groups
|
|
54
55
|
* @returns {void}
|
|
@@ -3,7 +3,7 @@ import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
|
3
3
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
4
4
|
import { List, valueFormatWarning } from '../../list/index.js';
|
|
5
5
|
import { VERSION } from '../../version.js';
|
|
6
|
-
import {
|
|
6
|
+
import { createDefaultFilter } from '../helpers/filter.js';
|
|
7
7
|
import { createTreeRenderer } from '../helpers/renderer.js';
|
|
8
8
|
import { TreeManager, TreeManagerMode } from '../managers/tree-manager.js';
|
|
9
9
|
import './tree-item.js';
|
|
@@ -22,10 +22,7 @@ let Tree = class Tree extends List {
|
|
|
22
22
|
constructor() {
|
|
23
23
|
super(...arguments);
|
|
24
24
|
this.defaultRole = 'tree';
|
|
25
|
-
|
|
26
|
-
* Tree manager used for manipulation
|
|
27
|
-
*/
|
|
28
|
-
this.manager = new TreeManager(this.composer);
|
|
25
|
+
this._manager = new TreeManager(this.composer);
|
|
29
26
|
/**
|
|
30
27
|
* Allows multiple items to be selected
|
|
31
28
|
*/
|
|
@@ -44,7 +41,7 @@ let Tree = class Tree extends List {
|
|
|
44
41
|
* @type {TreeFilter<T> | null}
|
|
45
42
|
* @ignore set to protected for now and need to discuss before set to public API
|
|
46
43
|
*/
|
|
47
|
-
this.filter =
|
|
44
|
+
this.filter = createDefaultFilter(this);
|
|
48
45
|
/**
|
|
49
46
|
* Renderer used for generating tree items
|
|
50
47
|
*/
|
|
@@ -57,19 +54,25 @@ let Tree = class Tree extends List {
|
|
|
57
54
|
static get version() {
|
|
58
55
|
return VERSION;
|
|
59
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Tree manager used for item manipulation
|
|
59
|
+
*/
|
|
60
|
+
get manager() {
|
|
61
|
+
return this._manager;
|
|
62
|
+
}
|
|
60
63
|
/**
|
|
61
64
|
* Expands all groups
|
|
62
65
|
* @returns {void}
|
|
63
66
|
*/
|
|
64
67
|
expandAll() {
|
|
65
|
-
this.
|
|
68
|
+
this._manager.expandAllItems();
|
|
66
69
|
}
|
|
67
70
|
/**
|
|
68
71
|
* Collapses all groups
|
|
69
72
|
* @returns {void}
|
|
70
73
|
*/
|
|
71
74
|
collapseAll() {
|
|
72
|
-
this.
|
|
75
|
+
this._manager.collapseAllItems();
|
|
73
76
|
}
|
|
74
77
|
/**
|
|
75
78
|
* Checks all editable items
|
|
@@ -79,14 +82,14 @@ let Tree = class Tree extends List {
|
|
|
79
82
|
if (!this.multiple) {
|
|
80
83
|
throw new RangeError('You cannot check all items in single selection mode');
|
|
81
84
|
}
|
|
82
|
-
this.
|
|
85
|
+
this._manager.checkAllItems();
|
|
83
86
|
}
|
|
84
87
|
/**
|
|
85
88
|
* Unchecks all editable items
|
|
86
89
|
* @returns {void}
|
|
87
90
|
*/
|
|
88
91
|
uncheckAll() {
|
|
89
|
-
this.
|
|
92
|
+
this._manager.uncheckAllItems();
|
|
90
93
|
}
|
|
91
94
|
/**
|
|
92
95
|
* @override
|
|
@@ -96,23 +99,23 @@ let Tree = class Tree extends List {
|
|
|
96
99
|
// Stateless tree
|
|
97
100
|
if (this.stateless) {
|
|
98
101
|
// Single selection - expand/collapse group (parent)
|
|
99
|
-
if (!this.multiple && this.
|
|
102
|
+
if (!this.multiple && this._manager.isItemParent(item)) {
|
|
100
103
|
this.toggleExpandedState(item);
|
|
101
104
|
}
|
|
102
105
|
return false;
|
|
103
106
|
}
|
|
104
107
|
// Multiple selection
|
|
105
108
|
if (this.multiple) {
|
|
106
|
-
return this.
|
|
109
|
+
return this._manager.toggleItem(item);
|
|
107
110
|
}
|
|
108
111
|
// Single selection - expand/collapse group (parent)
|
|
109
|
-
if (this.
|
|
112
|
+
if (this._manager.isItemParent(item)) {
|
|
110
113
|
this.toggleExpandedState(item);
|
|
111
114
|
return false;
|
|
112
115
|
}
|
|
113
116
|
// Single selection - check item
|
|
114
|
-
if (this.
|
|
115
|
-
this.
|
|
117
|
+
if (this._manager.checkItem(item)) {
|
|
118
|
+
this._manager.checkedItems.forEach((checkedItem) => {
|
|
116
119
|
checkedItem !== item && this.forceUncheckItem(checkedItem);
|
|
117
120
|
});
|
|
118
121
|
return true;
|
|
@@ -126,7 +129,7 @@ let Tree = class Tree extends List {
|
|
|
126
129
|
*/
|
|
127
130
|
forceUncheckItem(item) {
|
|
128
131
|
const result = this.composer.unlockItem(item);
|
|
129
|
-
this.
|
|
132
|
+
this._manager.uncheckItem(item);
|
|
130
133
|
result && this.composer.lockItem(item);
|
|
131
134
|
}
|
|
132
135
|
/**
|
|
@@ -144,7 +147,7 @@ let Tree = class Tree extends List {
|
|
|
144
147
|
cancelable: false,
|
|
145
148
|
composed: true,
|
|
146
149
|
detail: {
|
|
147
|
-
value: this.
|
|
150
|
+
value: this._manager.isItemExpanded(item),
|
|
148
151
|
item
|
|
149
152
|
}
|
|
150
153
|
});
|
|
@@ -200,8 +203,8 @@ let Tree = class Tree extends List {
|
|
|
200
203
|
*/
|
|
201
204
|
left() {
|
|
202
205
|
const item = this.highlightElement && this.itemFromElement(this.highlightElement);
|
|
203
|
-
if (item && this.
|
|
204
|
-
this.
|
|
206
|
+
if (item && this._manager.isItemExpanded(item)) {
|
|
207
|
+
this._manager.collapseItem(item);
|
|
205
208
|
this.dispatchExpandedChangedEvent(item);
|
|
206
209
|
}
|
|
207
210
|
}
|
|
@@ -212,8 +215,8 @@ let Tree = class Tree extends List {
|
|
|
212
215
|
*/
|
|
213
216
|
right() {
|
|
214
217
|
const item = this.highlightElement && this.itemFromElement(this.highlightElement);
|
|
215
|
-
if (item && !this.
|
|
216
|
-
this.
|
|
218
|
+
if (item && !this._manager.isItemExpanded(item)) {
|
|
219
|
+
this._manager.expandItem(item);
|
|
217
220
|
this.dispatchExpandedChangedEvent(item);
|
|
218
221
|
}
|
|
219
222
|
}
|
|
@@ -224,11 +227,11 @@ let Tree = class Tree extends List {
|
|
|
224
227
|
* @returns {void}
|
|
225
228
|
*/
|
|
226
229
|
toggleExpandedState(item) {
|
|
227
|
-
if (this.
|
|
228
|
-
this.
|
|
230
|
+
if (this._manager.isItemExpanded(item)) {
|
|
231
|
+
this._manager.collapseItem(item);
|
|
229
232
|
}
|
|
230
233
|
else {
|
|
231
|
-
this.
|
|
234
|
+
this._manager.expandItem(item);
|
|
232
235
|
}
|
|
233
236
|
this.dispatchExpandedChangedEvent(item);
|
|
234
237
|
}
|
|
@@ -250,7 +253,7 @@ let Tree = class Tree extends List {
|
|
|
250
253
|
willUpdate(changeProperties) {
|
|
251
254
|
super.willUpdate(changeProperties);
|
|
252
255
|
if (changeProperties.has('noRelation') || changeProperties.has('multiple')) {
|
|
253
|
-
this.
|
|
256
|
+
this._manager.setMode(this.mode);
|
|
254
257
|
}
|
|
255
258
|
if (changeProperties.has('query') || changeProperties.has('data')) {
|
|
256
259
|
this.filterItems();
|
|
@@ -266,15 +269,16 @@ let Tree = class Tree extends List {
|
|
|
266
269
|
const filter = this.filter;
|
|
267
270
|
const items = this.queryItems((item) => {
|
|
268
271
|
// Do not filter hidden items
|
|
272
|
+
// TODO: blocking `hidden` update via TreeManager/TreeNode of this component
|
|
269
273
|
if (item.hidden) {
|
|
270
274
|
return false;
|
|
271
275
|
}
|
|
272
|
-
const result = filter(item);
|
|
276
|
+
const result = filter(item, this._manager);
|
|
273
277
|
if (result) {
|
|
274
|
-
this.
|
|
278
|
+
this._manager.includeItem(item);
|
|
275
279
|
}
|
|
276
280
|
else {
|
|
277
|
-
this.
|
|
281
|
+
this._manager.excludeItem(item);
|
|
278
282
|
}
|
|
279
283
|
return result;
|
|
280
284
|
}).slice();
|
|
@@ -304,8 +308,8 @@ let Tree = class Tree extends List {
|
|
|
304
308
|
/**
|
|
305
309
|
* Collapse an item to prevent tree show too many nested expanded
|
|
306
310
|
*/
|
|
307
|
-
if (this.
|
|
308
|
-
this.
|
|
311
|
+
if (this._manager.isItemExpanded(item)) {
|
|
312
|
+
this._manager.collapseItem(item);
|
|
309
313
|
}
|
|
310
314
|
/**
|
|
311
315
|
* show all descendants of items to make them all are selectable
|
|
@@ -330,8 +334,8 @@ let Tree = class Tree extends List {
|
|
|
330
334
|
// Skip hidden and exclude item
|
|
331
335
|
if (!item.hidden && !excludeItems.includes(item)) {
|
|
332
336
|
// Add item and nested children
|
|
333
|
-
this.
|
|
334
|
-
const children = this.
|
|
337
|
+
this._manager.includeItem(item);
|
|
338
|
+
const children = this._manager.getItemChildren(item);
|
|
335
339
|
if (children.length) {
|
|
336
340
|
this.addNestedItemsToRender(children, excludeItems, includeHidden);
|
|
337
341
|
}
|
|
@@ -350,9 +354,9 @@ let Tree = class Tree extends List {
|
|
|
350
354
|
// we iterate each item match so as to find ancestors
|
|
351
355
|
items.forEach((item) => {
|
|
352
356
|
// Get the ancestors
|
|
353
|
-
const parent = this.
|
|
357
|
+
const parent = this._manager.getItemParent(item);
|
|
354
358
|
if (parent && !ancestors.has(parent)) {
|
|
355
|
-
this.
|
|
359
|
+
this._manager.getItemAncestors(item).forEach((ancestor) => {
|
|
356
360
|
ancestors.add(ancestor); // track ancestors
|
|
357
361
|
this.addExpandedAncestorToRender(ancestor);
|
|
358
362
|
});
|
|
@@ -366,8 +370,8 @@ let Tree = class Tree extends List {
|
|
|
366
370
|
* @returns {void}
|
|
367
371
|
*/
|
|
368
372
|
addExpandedAncestorToRender(ancestor) {
|
|
369
|
-
this.
|
|
370
|
-
this.
|
|
373
|
+
this._manager.includeItem(ancestor);
|
|
374
|
+
this._manager.expandItem(ancestor);
|
|
371
375
|
}
|
|
372
376
|
/**
|
|
373
377
|
* Selected items in tree
|
|
@@ -376,7 +380,7 @@ let Tree = class Tree extends List {
|
|
|
376
380
|
* @default []
|
|
377
381
|
*/
|
|
378
382
|
get values() {
|
|
379
|
-
return this.
|
|
383
|
+
return this._manager.checkedItems.map((item) => {
|
|
380
384
|
return this.composer.getItemPropertyValue(item, 'value') ?? '';
|
|
381
385
|
});
|
|
382
386
|
}
|
|
@@ -390,10 +394,10 @@ let Tree = class Tree extends List {
|
|
|
390
394
|
const newValue = [...values];
|
|
391
395
|
const oldValue = [...this.values];
|
|
392
396
|
if (newValue.toString() !== oldValue.toString()) {
|
|
393
|
-
this.
|
|
397
|
+
this._manager.uncheckAllItems();
|
|
394
398
|
values.some((value) => {
|
|
395
399
|
this.queryItemsByPropertyValue('value', value).forEach((item) => {
|
|
396
|
-
this.
|
|
400
|
+
this._manager.checkItem(item);
|
|
397
401
|
});
|
|
398
402
|
return !this.multiple; // Only set the fist value if multiple is not enabled
|
|
399
403
|
});
|
|
@@ -411,13 +415,13 @@ let Tree = class Tree extends List {
|
|
|
411
415
|
}
|
|
412
416
|
set data(data) {
|
|
413
417
|
super.data = data;
|
|
414
|
-
this.
|
|
418
|
+
this._manager = new TreeManager(this.composer, this.mode);
|
|
415
419
|
}
|
|
416
420
|
/**
|
|
417
421
|
* @override
|
|
418
422
|
*/
|
|
419
423
|
get renderItems() {
|
|
420
|
-
return this.
|
|
424
|
+
return this._manager.visibleItems;
|
|
421
425
|
}
|
|
422
426
|
/**
|
|
423
427
|
* Mode to use in the tree manager
|
|
@@ -5,4 +5,4 @@ import type { TreeFilter } from './types';
|
|
|
5
5
|
* @param el Tree instance to filter
|
|
6
6
|
* @returns Filter accepting an item
|
|
7
7
|
*/
|
|
8
|
-
export declare const
|
|
8
|
+
export declare const createDefaultFilter: <T extends TreeDataItem = TreeDataItem>(el: Tree<T>) => TreeFilter<T>;
|
|
@@ -4,7 +4,7 @@ import escapeStringRegexp from 'escape-string-regexp';
|
|
|
4
4
|
* @param el Tree instance to filter
|
|
5
5
|
* @returns Filter accepting an item
|
|
6
6
|
*/
|
|
7
|
-
export const
|
|
7
|
+
export const createDefaultFilter = (el) => {
|
|
8
8
|
// reference query string for validating queryRegExp cache state
|
|
9
9
|
let query = '';
|
|
10
10
|
// cache RegExp
|
|
@@ -20,8 +20,8 @@ export const defaultFilter = (el) => {
|
|
|
20
20
|
return queryRegExp;
|
|
21
21
|
};
|
|
22
22
|
// return scoped custom filter
|
|
23
|
-
return (item) => {
|
|
24
|
-
const label = item
|
|
23
|
+
return (item, manager) => {
|
|
24
|
+
const label = manager.composer.getItemPropertyValue(item, 'label');
|
|
25
25
|
if (!label) {
|
|
26
26
|
return false;
|
|
27
27
|
}
|
|
@@ -8,25 +8,19 @@ export const createTreeRenderer = (context) => {
|
|
|
8
8
|
* Renderer key prefix, used in combination with item value to give unique id to each item
|
|
9
9
|
*/
|
|
10
10
|
const key = uuid();
|
|
11
|
-
let manager;
|
|
12
|
-
let currentMode;
|
|
13
|
-
let currentComposer;
|
|
14
11
|
return (item, composer, element = document.createElement('ef-tree-item')) => {
|
|
15
12
|
// cast type to element to not break List api.
|
|
13
|
+
const _context = context;
|
|
16
14
|
const _element = element;
|
|
17
|
-
const multiple =
|
|
18
|
-
const noRelation =
|
|
15
|
+
const multiple = _context?.multiple === true;
|
|
16
|
+
const noRelation = _context?.noRelation === true;
|
|
19
17
|
const mode = !multiple || !noRelation ? TreeManagerMode.RELATIONAL : TreeManagerMode.INDEPENDENT;
|
|
20
|
-
|
|
21
|
-
currentMode = mode;
|
|
22
|
-
currentComposer = composer;
|
|
23
|
-
manager = new TreeManager(composer, mode);
|
|
24
|
-
}
|
|
18
|
+
const manager = _context?.manager || _context?.treeManager || new TreeManager(composer, mode);
|
|
25
19
|
_element.multiple = multiple;
|
|
26
20
|
_element.item = item;
|
|
27
21
|
_element.id = getItemId(key, item.value);
|
|
28
22
|
_element.depth = composer.getItemDepth(item);
|
|
29
|
-
_element.parent =
|
|
23
|
+
_element.parent = manager.isItemParent(item);
|
|
30
24
|
_element.expanded = manager.isItemExpanded(item);
|
|
31
25
|
_element.checkedState =
|
|
32
26
|
!multiple && _element.parent ? CheckedState.UNCHECKED : manager.getItemCheckedState(item);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CollectionComposer, DataItem } from '@refinitiv-ui/utils/collection.js';
|
|
2
|
+
import type { TreeManager } from '../managers/tree-manager';
|
|
2
3
|
export type TreeData<T extends TreeDataItem = TreeDataItem> = T[] | CollectionComposer<T> | null;
|
|
3
4
|
export interface TreeDataItem extends DataItem {
|
|
4
5
|
/**
|
|
@@ -26,4 +27,4 @@ export interface TreeDataItem extends DataItem {
|
|
|
26
27
|
* @param item Item to filter
|
|
27
28
|
* @return Does item match filter
|
|
28
29
|
*/
|
|
29
|
-
export type TreeFilter<T extends TreeDataItem = TreeDataItem> = (item: T) => boolean;
|
|
30
|
+
export type TreeFilter<T extends TreeDataItem = TreeDataItem> = (item: T, manager: TreeManager<T>) => boolean;
|
package/lib/tree/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export * from './elements/tree.js';
|
|
|
3
3
|
export * from './elements/tree-item.js';
|
|
4
4
|
export { TreeRenderer, createTreeRenderer } from './helpers/renderer.js';
|
|
5
5
|
export { TreeManager, TreeManagerMode, CheckedState } from './managers/tree-manager.js';
|
|
6
|
+
export type { TreeNode } from './managers/tree-node.js';
|
|
6
7
|
export type { TreeData, TreeDataItem };
|