@myrmidon/paged-data-browsers 2.0.5 → 4.0.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/README.md CHANGED
@@ -6,6 +6,19 @@ There are currently two components, one for displaying a flat list of data, and
6
6
 
7
7
  Also, there is a LRU cache service and a compact pager used in the paged tree component.
8
8
 
9
+ ## Paged List
10
+
11
+ Paged list support is provided by a single utility class, [PagedListStore](src/lib/services/paged-list.store.ts). This templated class provides logic for:
12
+
13
+ - a filter object of type `F`;
14
+ - a list element object of type `E`.
15
+
16
+ So you need:
17
+
18
+ - a filter class to represent your elements filter (for `F`).
19
+ - an element item class (for `E`).
20
+ - a service to fetch data, implementing interface [PagedListStoreService<F, E>](src/lib/services/paged-list.store.ts). In this shell, a [local service](../../../src/app/services/mock-paged-list-store.service.ts) provides mock data.
21
+
9
22
  ## Paged Tree
10
23
 
11
24
  ### Services
@@ -1,102 +1,99 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
3
- import * as i1 from '@angular/material/button';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import * as i2 from '@angular/material/icon';
6
- import { MatIconModule } from '@angular/material/icon';
2
+ import { input, output, Component, computed } from '@angular/core';
7
3
  import * as i1$1 from '@angular/common';
8
4
  import { CommonModule } from '@angular/common';
5
+ import * as i2 from '@angular/material/icon';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import * as i1 from '@angular/material/button';
8
+ import { MatButtonModule } from '@angular/material/button';
9
9
  import * as i2$1 from '@angular/material/badge';
10
10
  import { MatBadgeModule } from '@angular/material/badge';
11
11
  import * as i5 from '@angular/material/tooltip';
12
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
- import * as i8 from '@myrmidon/ng-tools';
14
- import { NgToolsModule } from '@myrmidon/ng-tools';
13
+ import { ColorToContrastPipe, StringToColorPipe } from '@myrmidon/ngx-tools';
15
14
  import { BehaviorSubject, of, tap, forkJoin } from 'rxjs';
16
- import { ReactiveFormsModule } from '@angular/forms';
17
- import { MatChipsModule } from '@angular/material/chips';
18
- import { MatDialogModule } from '@angular/material/dialog';
19
- import { MatFormFieldModule } from '@angular/material/form-field';
20
- import { MatInputModule } from '@angular/material/input';
21
- import { MatPaginatorModule } from '@angular/material/paginator';
22
- import { MatProgressBarModule } from '@angular/material/progress-bar';
23
- import { MatSelectModule } from '@angular/material/select';
24
15
 
25
16
  class CompactPagerComponent {
26
17
  constructor() {
27
- this.paging = {
28
- pageNumber: 0,
29
- pageCount: 0,
30
- total: 0,
31
- };
32
- this.pagingChange = new EventEmitter();
18
+ this.paging = input({ pageNumber: 0, pageCount: 0, total: 0 });
19
+ /**
20
+ * Emits the new paging information when the user changes the page.
21
+ */
22
+ this.pagingChange = output();
33
23
  }
34
24
  onFirst() {
35
- this.paging = { ...this.paging, pageNumber: 1 };
36
- this.pagingChange.emit(this.paging);
25
+ this.pagingChange.emit({ ...this.paging(), pageNumber: 1 });
37
26
  }
38
27
  onPrevious() {
39
- if (this.paging.pageNumber > 1) {
40
- this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };
41
- this.pagingChange.emit(this.paging);
28
+ if (this.paging().pageNumber > 1) {
29
+ this.pagingChange.emit({
30
+ ...this.paging(),
31
+ pageNumber: this.paging().pageNumber - 1,
32
+ });
42
33
  }
43
34
  }
44
35
  onNext() {
45
- if (this.paging.pageNumber < this.paging.pageCount) {
46
- this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };
47
- this.pagingChange.emit(this.paging);
36
+ if (this.paging().pageNumber < this.paging().pageCount) {
37
+ this.pagingChange.emit({
38
+ ...this.paging(),
39
+ pageNumber: this.paging().pageNumber + 1,
40
+ });
48
41
  }
49
42
  }
50
43
  onLast() {
51
- if (this.paging.pageNumber < this.paging.pageCount) {
52
- this.paging = { ...this.paging, pageNumber: this.paging.pageCount };
53
- this.pagingChange.emit(this.paging);
44
+ if (this.paging().pageNumber < this.paging().pageCount) {
45
+ this.pagingChange.emit({
46
+ ...this.paging(),
47
+ pageNumber: this.paging().pageCount,
48
+ });
54
49
  }
55
50
  }
56
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
57
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
51
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: CompactPagerComponent, isStandalone: true, selector: "pdb-compact-pager", inputs: { paging: { classPropertyName: "paging", publicName: "paging", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "@if (paging().pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging().pageNumber }}/{{ paging().pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging().pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging().pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging().pageNumber === paging().pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging().pageNumber === paging().pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging().total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
58
53
  }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CompactPagerComponent, decorators: [{
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CompactPagerComponent, decorators: [{
60
55
  type: Component,
61
- args: [{ selector: 'pdb-compact-pager', template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
62
- }], ctorParameters: () => [], propDecorators: { paging: [{
63
- type: Input
64
- }], pagingChange: [{
65
- type: Output
66
- }] } });
56
+ args: [{ selector: 'pdb-compact-pager', imports: [CommonModule, MatButtonModule, MatIconModule], template: "@if (paging().pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging().pageNumber }}/{{ paging().pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging().pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging().pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging().pageNumber === paging().pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging().pageNumber === paging().pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging().total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
57
+ }] });
67
58
 
68
59
  class RangeViewComponent {
69
60
  constructor() {
70
- this.domain = [0, 100];
71
- this.range = [0, 100];
72
- this.width = 100;
73
- this.height = 5;
74
- this.scaledRange = [];
75
- }
76
- ngOnChanges() {
77
- const domainWidth = this.domain[1] - this.domain[0];
78
- const rangeWidth = this.range[1] - this.range[0];
79
- const rangeStart = this.range[0] - this.domain[0];
80
- this.scaledRange = [
81
- (rangeStart / domainWidth) * this.width,
82
- ((rangeStart + rangeWidth) / domainWidth) * this.width,
83
- ];
84
- }
85
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
86
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RangeViewComponent, selector: "pdb-range-view", inputs: { domain: "domain", range: "range", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
61
+ /**
62
+ * The domain of the range view (start, limit).
63
+ */
64
+ this.domain = input([0, 100]);
65
+ /**
66
+ * The range of the range view (start, limit).
67
+ */
68
+ this.range = input([0, 100]);
69
+ /**
70
+ * The width of the component.
71
+ */
72
+ this.width = input(100);
73
+ /**
74
+ * The height of the component.
75
+ */
76
+ this.height = input(5);
77
+ this.scaledRange = computed(() => {
78
+ const domain = this.domain();
79
+ const range = this.range();
80
+ const width = this.width();
81
+ const domainWidth = domain[1] - domain[0];
82
+ const rangeWidth = range[1] - range[0];
83
+ const rangeStart = range[0] - domain[0];
84
+ return [
85
+ (rangeStart / domainWidth) * width,
86
+ ((rangeStart + rangeWidth) / domainWidth) * width,
87
+ ];
88
+ });
89
+ }
90
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
91
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.0", type: RangeViewComponent, isStandalone: true, selector: "pdb-range-view", inputs: { domain: { classPropertyName: "domain", publicName: "domain", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<svg [attr.width]=\"width()\" [attr.height]=\"height()\">\n <rect id=\"rdomain\" [attr.width]=\"width()\" [attr.height]=\"height()\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange()[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange()[1] - scaledRange()[0]\"\n [attr.height]=\"height()\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
87
92
  }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RangeViewComponent, decorators: [{
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: RangeViewComponent, decorators: [{
89
94
  type: Component,
90
- args: [{ selector: 'pdb-range-view', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }]
91
- }], ctorParameters: () => [], propDecorators: { domain: [{
92
- type: Input
93
- }], range: [{
94
- type: Input
95
- }], width: [{
96
- type: Input
97
- }], height: [{
98
- type: Input
99
- }] } });
95
+ args: [{ selector: 'pdb-range-view', template: "<svg [attr.width]=\"width()\" [attr.height]=\"height()\">\n <rect id=\"rdomain\" [attr.width]=\"width()\" [attr.height]=\"height()\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange()[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange()[1] - scaledRange()[0]\"\n [attr.height]=\"height()\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }]
96
+ }], ctorParameters: () => [] });
100
97
 
101
98
  /**
102
99
  * Browser tree node component view. This wraps some HTML content providing
@@ -108,32 +105,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
108
105
  * <pdb-browser-tree-node>
109
106
  */
110
107
  class BrowserTreeNodeComponent {
111
- /**
112
- * The node to display.
113
- */
114
- get node() {
115
- return this._node;
116
- }
117
- set node(value) {
118
- if (this._node === value) {
119
- return;
120
- }
121
- this._node = value;
122
- }
123
108
  constructor() {
109
+ /**
110
+ * The node to display.
111
+ */
112
+ this.node = input();
113
+ /**
114
+ * The paging information for the node's children.
115
+ */
116
+ this.paging = input();
117
+ /**
118
+ * True to show debug information.
119
+ */
120
+ this.debug = input();
121
+ /**
122
+ * True to hide the node's loc and label. This is useful if you want to
123
+ * provide your own view for the node, between the expansion toggle and
124
+ * the filter edit button. In this case, in your consumer template provide
125
+ * your own view as the content of this component. If instead you are fine
126
+ * with the default loc and label, and just want to add more data to
127
+ * the view, then you can just add your own content to this component's
128
+ * template, without setting this property to true.
129
+ */
130
+ this.hideLabel = input();
131
+ /**
132
+ * True to hide the node's location (y and x).
133
+ */
134
+ this.hideLoc = input();
135
+ /**
136
+ * True to hide the node's paging control unless hovered.
137
+ */
138
+ this.hidePaging = input();
139
+ /**
140
+ * True to hide the node's filter edit button.
141
+ */
142
+ this.hideFilter = input();
124
143
  /**
125
144
  * The indent size for the node's children.
126
145
  */
127
- this.indentSize = 30;
128
- this.toggleExpandedRequest = new EventEmitter();
129
- this.changePageRequest = new EventEmitter();
130
- this.editNodeFilterRequest = new EventEmitter();
146
+ this.indentSize = input(30);
147
+ /**
148
+ * Emits when the user wants to toggle the expanded state of the node.
149
+ */
150
+ this.toggleExpandedRequest = output();
151
+ /**
152
+ * Emits when the user wants to change the page number of the node's children.
153
+ */
154
+ this.changePageRequest = output();
155
+ /**
156
+ * Emits when the user wants to edit the node's filter.
157
+ */
158
+ this.editNodeFilterRequest = output();
131
159
  }
132
160
  onToggleExpanded() {
133
- if (!this._node) {
161
+ if (!this.node()) {
134
162
  return;
135
163
  }
136
- this.toggleExpandedRequest.emit(this._node);
164
+ this.toggleExpandedRequest.emit(this.node());
137
165
  }
138
166
  onPagingChange(node, paging) {
139
167
  this.changePageRequest.emit({
@@ -142,39 +170,33 @@ class BrowserTreeNodeComponent {
142
170
  });
143
171
  }
144
172
  onEditFilter() {
145
- if (this._node) {
146
- this.editNodeFilterRequest.emit(this._node);
173
+ if (this.node()) {
174
+ this.editNodeFilterRequest.emit(this.node());
147
175
  }
148
176
  }
149
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hideLoc: "hideLoc", hidePaging: "hidePaging", hideFilter: "hideFilter", indentSize: "indentSize" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "@if (node) {\n<div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * indentSize\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n i18n-matTooltip\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\" i18n>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\n >{{ node.tag }}</span\n >\n\n <!-- loc and label -->\n @if (!hideLoc) {\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - }\n {{ node.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n\n <!-- filter -->\n @if (!hideFilter){ @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n i18n-matTooltip\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n } @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n } }\n </div>\n</div>\n}\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: BrowserTreeNodeComponent, isStandalone: true, selector: "pdb-browser-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: false, transformFunction: null }, paging: { classPropertyName: "paging", publicName: "paging", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, hideLabel: { classPropertyName: "hideLabel", publicName: "hideLabel", isSignal: true, isRequired: false, transformFunction: null }, hideLoc: { classPropertyName: "hideLoc", publicName: "hideLoc", isSignal: true, isRequired: false, transformFunction: null }, hidePaging: { classPropertyName: "hidePaging", publicName: "hidePaging", isSignal: true, isRequired: false, transformFunction: null }, hideFilter: { classPropertyName: "hideFilter", publicName: "hideFilter", isSignal: true, isRequired: false, transformFunction: null }, indentSize: { classPropertyName: "indentSize", publicName: "indentSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "@if (node()) {\n<div id=\"node\" [style.margin-left.px]=\"(node()!.y - 1) * indentSize()\">\n <!-- pager -->\n @if (node()!.expanded && paging() && paging()!.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging() ? 'inherit' : 'block'\">\n <pdb-compact-pager\n [paging]=\"paging()!\"\n (pagingChange)=\"onPagingChange(node()!, $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging()!.pageCount]\"\n [range]=\"[paging()!.pageNumber - 1, paging()!.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"node()?.expanded ? 'Collapse' : 'Expand'\"\n i18n-matTooltip\n [disabled]=\"node()!.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\" i18n>{{\n node()!.hasChildren === true || node()!.hasChildren === undefined\n ? node()?.expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n\n <!-- tag -->\n @if (!hideLabel()) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\n 'background-color': (node()!.tag | stringToColor),\n color: node()!.tag | stringToColor | colorToContrast\n }\"\n >{{ node()!.tag }}</span\n >\n\n <!-- loc and label -->\n @if (!hideLoc()) {\n <span class=\"loc\">{{ node()!.y }}.{{ node()!.x }}</span> - }\n {{ node()!.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\n <!-- debug -->\n @if (debug()) {\n <span class=\"debug\"\n >#{{ node()!.id }}\n <span\n >| {{ node()!.paging.pageNumber }}/{{ node()!.paging.pageCount }} ({{\n node()!.paging.total\n }})</span\n ></span\n >\n }\n\n <!-- filter -->\n @if (!hideFilter()){ @if (!node()?.filter && node()?.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n i18n-matTooltip\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n } @if (node()?.filter && node()?.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"node()?.filter ? 'F' : ''\">filter_alt</mat-icon>\n </button>\n </div>\n } }\n </div>\n</div>\n}\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i2$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type:
179
+ // ngx-tools
180
+ ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: StringToColorPipe, name: "stringToColor" }, { kind: "component", type:
181
+ // local
182
+ CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }] }); }
151
183
  }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
153
185
  type: Component,
154
- args: [{ selector: 'pdb-browser-tree-node', template: "@if (node) {\n<div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * indentSize\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n i18n-matTooltip\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\" i18n>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\n >{{ node.tag }}</span\n >\n\n <!-- loc and label -->\n @if (!hideLoc) {\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - }\n {{ node.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n\n <!-- filter -->\n @if (!hideFilter){ @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n i18n-matTooltip\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n } @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n } }\n </div>\n</div>\n}\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
155
- }], ctorParameters: () => [], propDecorators: { node: [{
156
- type: Input
157
- }], paging: [{
158
- type: Input
159
- }], debug: [{
160
- type: Input
161
- }], hideLabel: [{
162
- type: Input
163
- }], hideLoc: [{
164
- type: Input
165
- }], hidePaging: [{
166
- type: Input
167
- }], hideFilter: [{
168
- type: Input
169
- }], indentSize: [{
170
- type: Input
171
- }], toggleExpandedRequest: [{
172
- type: Output
173
- }], changePageRequest: [{
174
- type: Output
175
- }], editNodeFilterRequest: [{
176
- type: Output
177
- }] } });
186
+ args: [{ selector: 'pdb-browser-tree-node', imports: [
187
+ CommonModule,
188
+ MatBadgeModule,
189
+ MatButtonModule,
190
+ MatIconModule,
191
+ MatTooltipModule,
192
+ // ngx-tools
193
+ ColorToContrastPipe,
194
+ StringToColorPipe,
195
+ // local
196
+ CompactPagerComponent,
197
+ RangeViewComponent,
198
+ ], template: "@if (node()) {\n<div id=\"node\" [style.margin-left.px]=\"(node()!.y - 1) * indentSize()\">\n <!-- pager -->\n @if (node()!.expanded && paging() && paging()!.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging() ? 'inherit' : 'block'\">\n <pdb-compact-pager\n [paging]=\"paging()!\"\n (pagingChange)=\"onPagingChange(node()!, $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging()!.pageCount]\"\n [range]=\"[paging()!.pageNumber - 1, paging()!.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"node()?.expanded ? 'Collapse' : 'Expand'\"\n i18n-matTooltip\n [disabled]=\"node()!.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\" i18n>{{\n node()!.hasChildren === true || node()!.hasChildren === undefined\n ? node()?.expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n\n <!-- tag -->\n @if (!hideLabel()) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\n 'background-color': (node()!.tag | stringToColor),\n color: node()!.tag | stringToColor | colorToContrast\n }\"\n >{{ node()!.tag }}</span\n >\n\n <!-- loc and label -->\n @if (!hideLoc()) {\n <span class=\"loc\">{{ node()!.y }}.{{ node()!.x }}</span> - }\n {{ node()!.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\n <!-- debug -->\n @if (debug()) {\n <span class=\"debug\"\n >#{{ node()!.id }}\n <span\n >| {{ node()!.paging.pageNumber }}/{{ node()!.paging.pageCount }} ({{\n node()!.paging.total\n }})</span\n ></span\n >\n }\n\n <!-- filter -->\n @if (!hideFilter()){ @if (!node()?.filter && node()?.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n i18n-matTooltip\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n } @if (node()?.filter && node()?.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"node()?.filter ? 'F' : ''\">filter_alt</mat-icon>\n </button>\n </div>\n } }\n </div>\n</div>\n}\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
199
+ }] });
178
200
 
179
201
  /**
180
202
  * A Least Recently Used cache that can be used to store any type of object.
@@ -241,6 +263,9 @@ class LRUCache {
241
263
  this._totalSize += size;
242
264
  while (this._totalSize > this._maxSize) {
243
265
  const oldestKey = this._cache.keys().next().value;
266
+ if (!oldestKey) {
267
+ break;
268
+ }
244
269
  let oldestSize = this._sizes.get(oldestKey);
245
270
  if (oldestSize) {
246
271
  this._totalSize -= oldestSize;
@@ -252,6 +277,9 @@ class LRUCache {
252
277
  else {
253
278
  while (this._cache.size > this._maxSize) {
254
279
  const oldestKey = this._cache.keys().next().value;
280
+ if (!oldestKey) {
281
+ break;
282
+ }
255
283
  this._cache.delete(oldestKey);
256
284
  this._sizes.delete(oldestKey);
257
285
  }
@@ -554,7 +582,7 @@ class PagedTreeStore {
554
582
  if (this._customCacheKeyBuilder) {
555
583
  return this._customCacheKeyBuilder(pageNumber, filter);
556
584
  }
557
- return JSON.stringify({ pageNumber, ...filter });
585
+ return JSON.stringify({ ...filter, pageNumber });
558
586
  }
559
587
  /**
560
588
  * Get the specified page of nodes, either from cache or from the server.
@@ -671,9 +699,6 @@ class PagedTreeStore {
671
699
  * @returns Promise with true if the node was expanded, false otherwise.
672
700
  */
673
701
  expand(id) {
674
- if (!id) {
675
- return Promise.resolve(false);
676
- }
677
702
  return new Promise((resolve, reject) => {
678
703
  const node = this._nodes$.value.find((n) => n.id === id);
679
704
  if (!node || node.hasChildren === false || node.expanded) {
@@ -708,12 +733,22 @@ class PagedTreeStore {
708
733
  /**
709
734
  * Expand all the descendants of the node with the specified ID.
710
735
  *
711
- * @param id The ID of the node to expand.
736
+ * @param id The ID of the node to expand, or undefined to expand the
737
+ * descendants of all the root level nodes.
712
738
  * @returns Promise.
713
739
  */
714
740
  expandAll(id) {
715
- if (!id) {
716
- return Promise.resolve(false);
741
+ if (id === undefined) {
742
+ // for each root level node call expandAll
743
+ const nodes = [...this._nodes$.value];
744
+ let i = 0;
745
+ while (i < nodes.length) {
746
+ if (nodes[i].parentId === undefined) {
747
+ this.expandAll(nodes[i].id);
748
+ }
749
+ i++;
750
+ }
751
+ return Promise.resolve(true);
717
752
  }
718
753
  // get the parent node to start from
719
754
  const nodes = this._nodes$.value;
@@ -768,9 +803,6 @@ class PagedTreeStore {
768
803
  * @returns Promise with true if the node was collapsed, false otherwise.
769
804
  */
770
805
  collapse(id) {
771
- if (!id) {
772
- return Promise.resolve(false);
773
- }
774
806
  return new Promise((resolve, reject) => {
775
807
  const node = this._nodes$.value.find((n) => n.id === id);
776
808
  if (!node || node.hasChildren === false || !node.expanded) {
@@ -785,12 +817,39 @@ class PagedTreeStore {
785
817
  else {
786
818
  this._dirty = true;
787
819
  this.removeDescendants(nodes, nodeIndex);
788
- this._nodes$.next(nodes);
789
820
  node.expanded = false;
821
+ // reset paging info
822
+ if (node?.paging) {
823
+ node.paging.pageNumber = 1;
824
+ }
825
+ this._nodes$.next(nodes);
790
826
  resolve(true);
791
827
  }
792
828
  });
793
829
  }
830
+ /**
831
+ * Collapse all the descendants of the node with the specified ID.
832
+ *
833
+ * @param id The ID of the node to collapse, or undefined to collapse the
834
+ * descendants of all the root level nodes.
835
+ * @returns Promise.
836
+ */
837
+ collapseAll(id) {
838
+ if (id === undefined) {
839
+ // for each expanded root level node
840
+ const nodes = [...this._nodes$.value.filter((n) => n.expanded)];
841
+ let i = 0;
842
+ while (i < nodes.length) {
843
+ if (nodes[i].parentId === undefined) {
844
+ this.collapseAll(nodes[i].id);
845
+ }
846
+ i++;
847
+ }
848
+ return Promise.resolve(true);
849
+ }
850
+ this.collapse(id);
851
+ return Promise.resolve(true);
852
+ }
794
853
  /**
795
854
  * Change the page including the node with the specified ID.
796
855
  * @param parentId The ID of the parent node whose children are inside the page
@@ -844,17 +903,6 @@ class PagedTreeStore {
844
903
  });
845
904
  });
846
905
  }
847
- /**
848
- * Collapse all the nodes in the store.
849
- */
850
- collapseAll() {
851
- if (this.isEmpty()) {
852
- return;
853
- }
854
- // collapse the first node
855
- const root = this._nodes$.value[0];
856
- this.collapse(root.id);
857
- }
858
906
  /**
859
907
  * Clear the store. The cache is cleared and the nodes are removed.
860
908
  */
@@ -881,79 +929,6 @@ class PagedTreeStore {
881
929
  }
882
930
  }
883
931
 
884
- class PagedDataBrowsersModule {
885
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
886
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
887
- RangeViewComponent,
888
- BrowserTreeNodeComponent], imports: [CommonModule,
889
- ReactiveFormsModule,
890
- // material
891
- MatBadgeModule,
892
- MatButtonModule,
893
- MatChipsModule,
894
- MatDialogModule,
895
- MatFormFieldModule,
896
- MatIconModule,
897
- MatInputModule,
898
- MatPaginatorModule,
899
- MatProgressBarModule,
900
- MatSelectModule,
901
- MatTooltipModule,
902
- // myrmidon
903
- NgToolsModule], exports: [CompactPagerComponent,
904
- RangeViewComponent,
905
- BrowserTreeNodeComponent] }); }
906
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
907
- ReactiveFormsModule,
908
- // material
909
- MatBadgeModule,
910
- MatButtonModule,
911
- MatChipsModule,
912
- MatDialogModule,
913
- MatFormFieldModule,
914
- MatIconModule,
915
- MatInputModule,
916
- MatPaginatorModule,
917
- MatProgressBarModule,
918
- MatSelectModule,
919
- MatTooltipModule,
920
- // myrmidon
921
- NgToolsModule] }); }
922
- }
923
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
924
- type: NgModule,
925
- args: [{
926
- declarations: [
927
- CompactPagerComponent,
928
- RangeViewComponent,
929
- BrowserTreeNodeComponent,
930
- ],
931
- imports: [
932
- CommonModule,
933
- ReactiveFormsModule,
934
- // material
935
- MatBadgeModule,
936
- MatButtonModule,
937
- MatChipsModule,
938
- MatDialogModule,
939
- MatFormFieldModule,
940
- MatIconModule,
941
- MatInputModule,
942
- MatPaginatorModule,
943
- MatProgressBarModule,
944
- MatSelectModule,
945
- MatTooltipModule,
946
- // myrmidon
947
- NgToolsModule
948
- ],
949
- exports: [
950
- CompactPagerComponent,
951
- RangeViewComponent,
952
- BrowserTreeNodeComponent,
953
- ],
954
- }]
955
- }] });
956
-
957
932
  /*
958
933
  * Public API Surface of paged-data-browsers
959
934
  */
@@ -962,5 +937,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
962
937
  * Generated bundle index. Do not edit.
963
938
  */
964
939
 
965
- export { BrowserTreeNodeComponent, CompactPagerComponent, DEFAULT_PAGED_LIST_STORE_OPTIONS, LRUCache, PagedDataBrowsersModule, PagedListStore, PagedTreeStore, RangeViewComponent };
940
+ export { BrowserTreeNodeComponent, CompactPagerComponent, DEFAULT_PAGED_LIST_STORE_OPTIONS, LRUCache, PagedListStore, PagedTreeStore, RangeViewComponent };
966
941
  //# sourceMappingURL=myrmidon-paged-data-browsers.mjs.map