@aurelia-mdc-web/all 9.3.0-au2 → 9.3.1-au2
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/chips/mdc-chip/mdc-chip.js.map +1 -1
- package/dist/data-table/mdc-data-table.js.map +1 -1
- package/dist/dialog/mdc-dialog-service.js.map +1 -1
- package/dist/expandable/mdc-expandable.js.map +1 -1
- package/dist/form-field/mdc-form-field.js.map +1 -1
- package/dist/list/mdc-deprecated-list/mdc-deprecated-list-item/mdc-deprecated-list-item.js.map +1 -1
- package/dist/list/mdc-list-item/mdc-list-item.js.map +1 -1
- package/dist/menu/mdc-menu.js.map +1 -1
- package/dist/segmented-button/mdc-segmented-button-segment/mdc-segmented-button-segment.js.map +1 -1
- package/dist/select/mdc-select-value-observer.js.map +1 -1
- package/dist/select/mdc-select.js.map +1 -1
- package/dist/text-field/mdc-text-field.js.map +1 -1
- package/dist/tree-view/mdc-tree-view.js.map +1 -1
- package/package.json +2 -2
- package/src/chips/mdc-chip/mdc-chip.ts +290 -290
- package/src/data-table/mdc-data-table.ts +432 -432
- package/src/dialog/mdc-dialog-service.ts +80 -80
- package/src/expandable/mdc-expandable.ts +104 -104
- package/src/form-field/mdc-form-field.ts +60 -60
- package/src/list/mdc-deprecated-list/mdc-deprecated-list-item/mdc-deprecated-list-item.ts +108 -108
- package/src/list/mdc-list-item/mdc-list-item.ts +136 -136
- package/src/menu/mdc-menu.ts +340 -340
- package/src/segmented-button/mdc-segmented-button-segment/mdc-segmented-button-segment.ts +170 -170
- package/src/select/mdc-select-value-observer.ts +346 -346
- package/src/select/mdc-select.ts +480 -480
- package/src/text-field/mdc-text-field.ts +535 -535
- package/src/tree-view/mdc-tree-view.ts +147 -147
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
import { MdcComponent } from '../base';
|
|
2
|
-
import { MDCFoundation } from '@material/base';
|
|
3
|
-
import { customElement, bindable, inject, ViewFactory, INode } from 'aurelia';
|
|
4
|
-
import { ITreeNode } from './i-tree-node';
|
|
5
|
-
import { processContent } from '@aurelia/runtime-html';
|
|
6
|
-
import template from './mdc-tree-view.html?raw';
|
|
7
|
-
|
|
8
|
-
let id = 0;
|
|
9
|
-
const templateLookup: Record<string, string> = {};
|
|
10
|
-
const getNextNodeTemplateId = () => ++id;
|
|
11
|
-
const NODE_SELECTED_EVENT = 'mdctree:node-selected';
|
|
12
|
-
|
|
13
|
-
export class MDCTreeViewFoundation extends MDCFoundation { }
|
|
14
|
-
|
|
15
|
-
@inject(Element)
|
|
16
|
-
@customElement({ name: 'mdc-tree-view', template })
|
|
17
|
-
@processContent(function processContent(node: INode) {
|
|
18
|
-
const element = node as Element;
|
|
19
|
-
const treeNode = element.querySelector('mdc-tree-node');
|
|
20
|
-
if (treeNode) {
|
|
21
|
-
const nodeTemplateId = getNextNodeTemplateId();
|
|
22
|
-
element.setAttribute('data-template-id', nodeTemplateId.toString());
|
|
23
|
-
templateLookup[nodeTemplateId] = treeNode.innerHTML;
|
|
24
|
-
}
|
|
25
|
-
element.innerHTML = '';
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
export class MdcTreeView extends MdcComponent<MDCTreeViewFoundation> {
|
|
30
|
-
getDefaultFoundation(): MDCTreeViewFoundation {
|
|
31
|
-
return new MDCTreeViewFoundation();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
constructor(root: HTMLElement) {
|
|
35
|
-
super(root);
|
|
36
|
-
const templateId = root.getAttribute('data-template-id');
|
|
37
|
-
if (templateId !== null) {
|
|
38
|
-
this.nodeTemplate = templateLookup[templateId];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
nodeViewFactory: ViewFactory;
|
|
43
|
-
selectedNode?: ITreeNode;
|
|
44
|
-
|
|
45
|
-
@bindable()
|
|
46
|
-
nodeTemplate: string;
|
|
47
|
-
|
|
48
|
-
@bindable()
|
|
49
|
-
nodes: ITreeNode[];
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Allows for filtering tree nodes
|
|
53
|
-
*/
|
|
54
|
-
@bindable()
|
|
55
|
-
filter: (n: ITreeNode) => boolean = () => true;
|
|
56
|
-
|
|
57
|
-
@bindable()
|
|
58
|
-
rootBindingContext: Record<string, unknown>;
|
|
59
|
-
|
|
60
|
-
bind(bindingContext: Record<string, unknown>) {
|
|
61
|
-
this.rootBindingContext = this.rootBindingContext ?? bindingContext;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
toggleExpanded(n: ITreeNode, e: Event): boolean {
|
|
65
|
-
n.expanded = !n.expanded;
|
|
66
|
-
e.stopPropagation();
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
nodeClicked(n?: ITreeNode) {
|
|
71
|
-
if (this.selectedNode) {
|
|
72
|
-
this.selectedNode.selected = false;
|
|
73
|
-
}
|
|
74
|
-
if (n) {
|
|
75
|
-
n.selected = true;
|
|
76
|
-
}
|
|
77
|
-
this.selectedNode = n;
|
|
78
|
-
this.root.dispatchEvent(new CustomEvent(NODE_SELECTED_EVENT,
|
|
79
|
-
{ detail: { node: n }, bubbles: true })
|
|
80
|
-
);
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
childNodeSelected(n: ITreeNode) {
|
|
85
|
-
if (this.selectedNode && this.selectedNode !== n) {
|
|
86
|
-
this.selectedNode.selected = false;
|
|
87
|
-
}
|
|
88
|
-
this.selectedNode = n;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
findPath<T extends ITreeNode>(nodes: T[], predicate: (node: T) => boolean): number[] {
|
|
92
|
-
const path: number[] = [];
|
|
93
|
-
for (let i = 0; i < nodes.length; ++i) {
|
|
94
|
-
if (predicate(nodes[i])) {
|
|
95
|
-
return [i];
|
|
96
|
-
}
|
|
97
|
-
if (!nodes[i].children) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
const childPath = this.findPath(nodes[i].children!, predicate);
|
|
101
|
-
if (childPath.length) {
|
|
102
|
-
return [i, ...childPath];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return path;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async expandPath(path: number[]) {
|
|
109
|
-
const filteredNodes = this.nodes.filter(x => this.filter(x));
|
|
110
|
-
if (path.length === 1) {
|
|
111
|
-
this.nodeClicked(filteredNodes[path[0]]);
|
|
112
|
-
this.root.querySelectorAll('.mdc-tree-view__node')[path[0]].scrollIntoView();
|
|
113
|
-
} else {
|
|
114
|
-
filteredNodes[path[0]].expanded = true;
|
|
115
|
-
// child tree views are hidden with 'if.bind'
|
|
116
|
-
// promises are created by a helper element `mdc-promisify-reference`
|
|
117
|
-
// this lets dependent code to wait till a view model reference is assigned
|
|
118
|
-
await this.initialised;
|
|
119
|
-
const childTreeView = await (filteredNodes[path[0]].childTreeViewPromise);
|
|
120
|
-
await childTreeView?.expandPath(path.slice(1));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async find<T extends ITreeNode>(predicate: (node: T) => boolean) {
|
|
125
|
-
// to avoid rendering the whole tree finding a node is a 2-step process
|
|
126
|
-
// firstly, find the path - nodes which need to be expanded to display the target node
|
|
127
|
-
const filteredNodes = this.nodes.filter(x => this.filter(x));
|
|
128
|
-
const path = this.findPath(filteredNodes, predicate);
|
|
129
|
-
if (path.length) {
|
|
130
|
-
// secondly, expand the path
|
|
131
|
-
await this.expandPath(path);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
dispatchEvent(type: string, node: ITreeNode) {
|
|
136
|
-
this.root.dispatchEvent(new CustomEvent(type, { bubbles: true, detail: { node } }));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** @hidden */
|
|
141
|
-
export interface IMdcTreeElement extends HTMLElement {
|
|
142
|
-
$au: {
|
|
143
|
-
'au:resource:custom-element': {
|
|
144
|
-
viewModel: MdcTreeView;
|
|
145
|
-
};
|
|
146
|
-
};
|
|
147
|
-
}
|
|
1
|
+
import { MdcComponent } from '../base';
|
|
2
|
+
import { MDCFoundation } from '@material/base';
|
|
3
|
+
import { customElement, bindable, inject, ViewFactory, INode } from 'aurelia';
|
|
4
|
+
import { ITreeNode } from './i-tree-node';
|
|
5
|
+
import { processContent } from '@aurelia/runtime-html';
|
|
6
|
+
import template from './mdc-tree-view.html?raw';
|
|
7
|
+
|
|
8
|
+
let id = 0;
|
|
9
|
+
const templateLookup: Record<string, string> = {};
|
|
10
|
+
const getNextNodeTemplateId = () => ++id;
|
|
11
|
+
const NODE_SELECTED_EVENT = 'mdctree:node-selected';
|
|
12
|
+
|
|
13
|
+
export class MDCTreeViewFoundation extends MDCFoundation { }
|
|
14
|
+
|
|
15
|
+
@inject(Element)
|
|
16
|
+
@customElement({ name: 'mdc-tree-view', template })
|
|
17
|
+
@processContent(function processContent(node: INode) {
|
|
18
|
+
const element = node as Element;
|
|
19
|
+
const treeNode = element.querySelector('mdc-tree-node');
|
|
20
|
+
if (treeNode) {
|
|
21
|
+
const nodeTemplateId = getNextNodeTemplateId();
|
|
22
|
+
element.setAttribute('data-template-id', nodeTemplateId.toString());
|
|
23
|
+
templateLookup[nodeTemplateId] = treeNode.innerHTML;
|
|
24
|
+
}
|
|
25
|
+
element.innerHTML = '';
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
export class MdcTreeView extends MdcComponent<MDCTreeViewFoundation> {
|
|
30
|
+
getDefaultFoundation(): MDCTreeViewFoundation {
|
|
31
|
+
return new MDCTreeViewFoundation();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
constructor(root: HTMLElement) {
|
|
35
|
+
super(root);
|
|
36
|
+
const templateId = root.getAttribute('data-template-id');
|
|
37
|
+
if (templateId !== null) {
|
|
38
|
+
this.nodeTemplate = templateLookup[templateId];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
nodeViewFactory: ViewFactory;
|
|
43
|
+
selectedNode?: ITreeNode;
|
|
44
|
+
|
|
45
|
+
@bindable()
|
|
46
|
+
nodeTemplate: string;
|
|
47
|
+
|
|
48
|
+
@bindable()
|
|
49
|
+
nodes: ITreeNode[];
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Allows for filtering tree nodes
|
|
53
|
+
*/
|
|
54
|
+
@bindable()
|
|
55
|
+
filter: (n: ITreeNode) => boolean = () => true;
|
|
56
|
+
|
|
57
|
+
@bindable()
|
|
58
|
+
rootBindingContext: Record<string, unknown>;
|
|
59
|
+
|
|
60
|
+
bind(bindingContext: Record<string, unknown>) {
|
|
61
|
+
this.rootBindingContext = this.rootBindingContext ?? bindingContext;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
toggleExpanded(n: ITreeNode, e: Event): boolean {
|
|
65
|
+
n.expanded = !n.expanded;
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
nodeClicked(n?: ITreeNode) {
|
|
71
|
+
if (this.selectedNode) {
|
|
72
|
+
this.selectedNode.selected = false;
|
|
73
|
+
}
|
|
74
|
+
if (n) {
|
|
75
|
+
n.selected = true;
|
|
76
|
+
}
|
|
77
|
+
this.selectedNode = n;
|
|
78
|
+
this.root.dispatchEvent(new CustomEvent(NODE_SELECTED_EVENT,
|
|
79
|
+
{ detail: { node: n }, bubbles: true })
|
|
80
|
+
);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
childNodeSelected(n: ITreeNode) {
|
|
85
|
+
if (this.selectedNode && this.selectedNode !== n) {
|
|
86
|
+
this.selectedNode.selected = false;
|
|
87
|
+
}
|
|
88
|
+
this.selectedNode = n;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
findPath<T extends ITreeNode>(nodes: T[], predicate: (node: T) => boolean): number[] {
|
|
92
|
+
const path: number[] = [];
|
|
93
|
+
for (let i = 0; i < nodes.length; ++i) {
|
|
94
|
+
if (predicate(nodes[i])) {
|
|
95
|
+
return [i];
|
|
96
|
+
}
|
|
97
|
+
if (!nodes[i].children) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const childPath = this.findPath(nodes[i].children!, predicate);
|
|
101
|
+
if (childPath.length) {
|
|
102
|
+
return [i, ...childPath];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return path;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async expandPath(path: number[]) {
|
|
109
|
+
const filteredNodes = this.nodes.filter(x => this.filter(x));
|
|
110
|
+
if (path.length === 1) {
|
|
111
|
+
this.nodeClicked(filteredNodes[path[0]]);
|
|
112
|
+
this.root.querySelectorAll('.mdc-tree-view__node')[path[0]].scrollIntoView();
|
|
113
|
+
} else {
|
|
114
|
+
filteredNodes[path[0]].expanded = true;
|
|
115
|
+
// child tree views are hidden with 'if.bind'
|
|
116
|
+
// promises are created by a helper element `mdc-promisify-reference`
|
|
117
|
+
// this lets dependent code to wait till a view model reference is assigned
|
|
118
|
+
await this.initialised;
|
|
119
|
+
const childTreeView = await (filteredNodes[path[0]].childTreeViewPromise);
|
|
120
|
+
await childTreeView?.expandPath(path.slice(1));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async find<T extends ITreeNode>(predicate: (node: T) => boolean) {
|
|
125
|
+
// to avoid rendering the whole tree finding a node is a 2-step process
|
|
126
|
+
// firstly, find the path - nodes which need to be expanded to display the target node
|
|
127
|
+
const filteredNodes = this.nodes.filter(x => this.filter(x));
|
|
128
|
+
const path = this.findPath(filteredNodes, predicate);
|
|
129
|
+
if (path.length) {
|
|
130
|
+
// secondly, expand the path
|
|
131
|
+
await this.expandPath(path);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
dispatchEvent(type: string, node: ITreeNode) {
|
|
136
|
+
this.root.dispatchEvent(new CustomEvent(type, { bubbles: true, detail: { node } }));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** @hidden */
|
|
141
|
+
export interface IMdcTreeElement extends HTMLElement {
|
|
142
|
+
$au: {
|
|
143
|
+
'au:resource:custom-element': {
|
|
144
|
+
viewModel: MdcTreeView;
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
}
|