@myrmidon/paged-data-browsers 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ # Paged Data Browsers
2
+
3
+ This library provides simple components to display filtered and paged data from some service.
4
+
5
+ There are currently two components, one for displaying a flat list of data, and another to display hierarchically structured data, combining a tree view with paging.
6
+
7
+ Also, there is a LRU cache service and a compact pager used in the paged tree component.
@@ -0,0 +1,76 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@angular/material/badge";
5
+ import * as i3 from "@angular/material/button";
6
+ import * as i4 from "@angular/material/icon";
7
+ import * as i5 from "@angular/material/tooltip";
8
+ import * as i6 from "../compact-pager/compact-pager.component";
9
+ import * as i7 from "../range-view/range-view.component";
10
+ import * as i8 from "@myrmidon/ng-tools";
11
+ /**
12
+ * Browser tree node component view. This wraps some HTML content providing
13
+ * a toggle button to expand/collapse the node, a paging control for the
14
+ * node's children, and a button to edit the node's filter. You should then
15
+ * provide the HTML content to display the node's data inside this component, e.g.
16
+ * <pdb-browser-tree-node [node]="node">
17
+ * <your-node-view [node]="node" />
18
+ * <pdb-browser-tree-node>
19
+ */
20
+ export class BrowserTreeNodeComponent {
21
+ /**
22
+ * The node to display.
23
+ */
24
+ get node() {
25
+ return this._node;
26
+ }
27
+ set node(value) {
28
+ if (this._node === value) {
29
+ return;
30
+ }
31
+ this._node = value;
32
+ }
33
+ constructor() {
34
+ this.toggleExpandedRequest = new EventEmitter();
35
+ this.changePageRequest = new EventEmitter();
36
+ this.editNodeFilterRequest = new EventEmitter();
37
+ }
38
+ onToggleExpanded() {
39
+ if (!this._node) {
40
+ return;
41
+ }
42
+ this.toggleExpandedRequest.emit(this._node);
43
+ }
44
+ onPagingChange(node, paging) {
45
+ this.changePageRequest.emit({
46
+ node,
47
+ paging,
48
+ });
49
+ }
50
+ onEditFilter() {
51
+ if (this._node) {
52
+ this.editNodeFilterRequest.emit(this._node);
53
+ }
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hidePaging: "hidePaging" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\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 transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i6.CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: i7.RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ selector: 'pdb-browser-tree-node', template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\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 transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}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"] }]
61
+ }], ctorParameters: function () { return []; }, propDecorators: { node: [{
62
+ type: Input
63
+ }], paging: [{
64
+ type: Input
65
+ }], debug: [{
66
+ type: Input
67
+ }], hidePaging: [{
68
+ type: Input
69
+ }], toggleExpandedRequest: [{
70
+ type: Output
71
+ }], changePageRequest: [{
72
+ type: Output
73
+ }], editNodeFilterRequest: [{
74
+ type: Output
75
+ }] } });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVN2RTs7Ozs7Ozs7R0FRRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQTRDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQWdDRDtRQUNFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUNwRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDL0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBQ3RFLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUEyQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUF3QixFQUFFLE1BQWtCO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSTtZQUNKLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7OEdBeEVVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHdTQ3ZCckMsa2hGQW1GQTs7MkZENURhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSx1QkFBdUI7MEVBV3RCLElBQUk7c0JBRGQsS0FBSztnQkFnQk4sTUFBTTtzQkFETCxLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLHFCQUFxQjtzQkFEM0IsTUFBTTtnQkFPQSxpQkFBaUI7c0JBRHZCLE1BQU07Z0JBSUEscUJBQXFCO3NCQUQzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGFnZWRUcmVlTm9kZSwgUGFnaW5nSW5mbyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2VkLXRyZWUuc3RvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VDaGFuZ2VSZXF1ZXN0IHtcbiAgbm9kZTogUGFnZWRUcmVlTm9kZTxhbnk+O1xuICBwYWdpbmc6IFBhZ2luZ0luZm87XG59XG5cbi8qKlxuICogQnJvd3NlciB0cmVlIG5vZGUgY29tcG9uZW50IHZpZXcuIFRoaXMgd3JhcHMgc29tZSBIVE1MIGNvbnRlbnQgcHJvdmlkaW5nXG4gKiBhIHRvZ2dsZSBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIHRoZSBub2RlLCBhIHBhZ2luZyBjb250cm9sIGZvciB0aGVcbiAqIG5vZGUncyBjaGlsZHJlbiwgYW5kIGEgYnV0dG9uIHRvIGVkaXQgdGhlIG5vZGUncyBmaWx0ZXIuIFlvdSBzaG91bGQgdGhlblxuICogcHJvdmlkZSB0aGUgSFRNTCBjb250ZW50IHRvIGRpc3BsYXkgdGhlIG5vZGUncyBkYXRhIGluc2lkZSB0aGlzIGNvbXBvbmVudCwgZS5nLlxuICogPHBkYi1icm93c2VyLXRyZWUtbm9kZSBbbm9kZV09XCJub2RlXCI+XG4gKiAgIDx5b3VyLW5vZGUtdmlldyBbbm9kZV09XCJub2RlXCIgLz5cbiAqIDxwZGItYnJvd3Nlci10cmVlLW5vZGU+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkYi1icm93c2VyLXRyZWUtbm9kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9icm93c2VyLXRyZWUtbm9kZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jyb3dzZXItdHJlZS1ub2RlLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQnJvd3NlclRyZWVOb2RlQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfbm9kZTogUGFnZWRUcmVlTm9kZTxhbnk+IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5vZGUgdG8gZGlzcGxheS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbm9kZSgpOiBQYWdlZFRyZWVOb2RlPGFueT4gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbm9kZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbm9kZSh2YWx1ZTogUGFnZWRUcmVlTm9kZTxhbnk+IHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLl9ub2RlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ub2RlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHBhZ2luZz86IFBhZ2luZ0luZm87XG5cbiAgLyoqXG4gICAqIFRydWUgdG8gc2hvdyBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGhpZGVQYWdpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIHRvZ2dsZSB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgdGhlIG5vZGUuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHRvZ2dsZUV4cGFuZGVkUmVxdWVzdDogRXZlbnRFbWl0dGVyPFBhZ2VkVHJlZU5vZGU8YW55Pj47XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gY2hhbmdlIHRoZSBwYWdlIG51bWJlciBvZiB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjaGFuZ2VQYWdlUmVxdWVzdDogRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2VSZXF1ZXN0PjtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGVkaXROb2RlRmlsdGVyUmVxdWVzdDogRXZlbnRFbWl0dGVyPFBhZ2VkVHJlZU5vZGU8YW55Pj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VkVHJlZU5vZGU8YW55Pj4oKTtcbiAgICB0aGlzLmNoYW5nZVBhZ2VSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlQ2hhbmdlUmVxdWVzdD4oKTtcbiAgICB0aGlzLmVkaXROb2RlRmlsdGVyUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PigpO1xuICB9XG5cbiAgcHVibGljIG9uVG9nZ2xlRXhwYW5kZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9ub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWRSZXF1ZXN0LmVtaXQodGhpcy5fbm9kZSBhcyBQYWdlZFRyZWVOb2RlPGFueT4pO1xuICB9XG5cbiAgcHVibGljIG9uUGFnaW5nQ2hhbmdlKG5vZGU6IFBhZ2VkVHJlZU5vZGU8YW55PiwgcGFnaW5nOiBQYWdpbmdJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VQYWdlUmVxdWVzdC5lbWl0KHtcbiAgICAgIG5vZGUsXG4gICAgICBwYWdpbmcsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25FZGl0RmlsdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ub2RlKSB7XG4gICAgICB0aGlzLmVkaXROb2RlRmlsdGVyUmVxdWVzdC5lbWl0KHRoaXMuX25vZGUpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cIm5vZGVcIiAqbmdJZj1cIm5vZGVcIiBbc3R5bGUubWFyZ2luLWxlZnQucHhdPVwiKG5vZGUueSAtIDEpICogMjBcIj5cclxuICA8IS0tIHBhZ2VyIC0tPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwiJGFueShub2RlKS5leHBhbmRlZCAmJiBwYWdpbmcgJiYgcGFnaW5nLnBhZ2VDb3VudCA+IDFcIlxyXG4gICAgaWQ9XCJwYWdlclwiXHJcbiAgICBbc3R5bGUuZGlzcGxheV09XCJoaWRlUGFnaW5nID8gJ2luaGVyaXQnIDogJ2Jsb2NrJ1wiXHJcbiAgPlxyXG4gICAgPHBkYi1jb21wYWN0LXBhZ2VyXHJcbiAgICAgIFtwYWdpbmddPVwicGFnaW5nXCJcclxuICAgICAgKHBhZ2luZ0NoYW5nZSk9XCJvblBhZ2luZ0NoYW5nZSgkYW55KG5vZGUpLCAkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICA8cGRiLXJhbmdlLXZpZXdcclxuICAgICAgW3dpZHRoXT1cIjI1MFwiXHJcbiAgICAgIFtkb21haW5dPVwiWzAsIHBhZ2luZy5wYWdlQ291bnRdXCJcclxuICAgICAgW3JhbmdlXT1cIltwYWdpbmcucGFnZU51bWJlciAtIDEsIHBhZ2luZy5wYWdlTnVtYmVyXVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gbm9kZSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJub2RlLnkgPiAwXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCIkYW55KG5vZGUpLmV4cGFuZGVkID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlXCJcclxuICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj57e1xyXG4gICAgICAgIG5vZGUuaGFzQ2hpbGRyZW4gPT09IHRydWUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICA/ICRhbnkobm9kZSkuZXhwYW5kZWRcclxuICAgICAgICAgICAgPyBcImV4cGFuZF9sZXNzXCJcclxuICAgICAgICAgICAgOiBcImV4cGFuZF9tb3JlXCJcclxuICAgICAgICAgIDogXCJzdG9wXCJcclxuICAgICAgfX08L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8IS0tIHRhZyAtLT5cclxuICAgIDxzcGFuXHJcbiAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogKG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciksXHJcbiAgICAgICAgY29sb3I6IG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciB8IGNvbG9yVG9Db250cmFzdFxyXG4gICAgICB9XCJcclxuICAgICAgPnt7IG5vZGUudGFnIH19PC9zcGFuXHJcbiAgICA+XHJcbiAgICA8IS0tIGxvYyBhbmQgbGFiZWwgLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cImxvY1wiPnt7IG5vZGUueSB9fS57eyBub2RlLnggfX08L3NwYW4+IC0ge3sgbm9kZS5sYWJlbCB9fVxyXG5cclxuICAgIDwhLS0gUFJPSkVDVEVEIE5PREUgLS0+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcblxyXG4gICAgPCEtLSBkZWJ1ZyAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnXCJcclxuICAgICAgPiN7eyBub2RlLmlkIH19XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgPnwge3sgJGFueShub2RlKS5wYWdpbmcucGFnZU51bWJlciB9fS97e1xyXG4gICAgICAgICAgJGFueShub2RlKS5wYWdpbmcucGFnZUNvdW50XHJcbiAgICAgICAgfX1cclxuICAgICAgICAoe3sgJGFueShub2RlKS5wYWdpbmcudG90YWwgfX0pPC9zcGFuXHJcbiAgICAgID48L3NwYW5cclxuICAgID5cclxuXHJcbiAgICA8IS0tIGZpbHRlciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtdXRlZFwiICpuZ0lmPVwiISRhbnkobm9kZSkuZmlsdGVyICYmIG5vZGUueVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBmaWx0ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm11dGVkXCIgKm5nSWY9XCIkYW55KG5vZGUpLmZpbHRlciAmJiBub2RlLnlcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBbbWF0QmFkZ2VdPVwiJGFueShub2RlKS5maWx0ZXIgPyAnRicgOiAnJ1wiXHJcbiAgICAgICAgICA+ZmlsdGVyX2FsdDwvbWF0LWljb25cclxuICAgICAgICA+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,48 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@angular/material/button";
5
+ import * as i3 from "@angular/material/icon";
6
+ export class CompactPagerComponent {
7
+ constructor() {
8
+ this.paging = {
9
+ pageNumber: 0,
10
+ pageCount: 0,
11
+ total: 0,
12
+ };
13
+ this.pagingChange = new EventEmitter();
14
+ }
15
+ onFirst() {
16
+ this.paging = { ...this.paging, pageNumber: 1 };
17
+ this.pagingChange.emit(this.paging);
18
+ }
19
+ onPrevious() {
20
+ if (this.paging.pageNumber > 1) {
21
+ this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };
22
+ this.pagingChange.emit(this.paging);
23
+ }
24
+ }
25
+ onNext() {
26
+ if (this.paging.pageNumber < this.paging.pageCount) {
27
+ this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };
28
+ this.pagingChange.emit(this.paging);
29
+ }
30
+ }
31
+ onLast() {
32
+ if (this.paging.pageNumber < this.paging.pageCount) {
33
+ this.paging = { ...this.paging, pageNumber: this.paging.pageCount };
34
+ this.pagingChange.emit(this.paging);
35
+ }
36
+ }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
38
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\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", 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: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: CompactPagerComponent, decorators: [{
41
+ type: Component,
42
+ args: [{ selector: 'pdb-compact-pager', template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\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", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
43
+ }], ctorParameters: function () { return []; }, propDecorators: { paging: [{
44
+ type: Input
45
+ }], pagingChange: [{
46
+ type: Output
47
+ }] } });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFjdC1wYWdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9wYWdlZC1kYXRhLWJyb3dzZXJzL3NyYy9saWIvY29tcG9uZW50cy9jb21wYWN0LXBhZ2VyL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvY29tcGFjdC1wYWdlci9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxxQkFBcUI7SUFPaEM7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osVUFBVSxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOzhHQXhDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixrSUNUbEMsMDZCQW9DQTs7MkZEM0JhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7MEVBTXRCLE1BQU07c0JBRFosS0FBSztnQkFJQyxZQUFZO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGFnaW5nSW5mbyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2VkLXRyZWUuc3RvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGItY29tcGFjdC1wYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcGFjdC1wYWdlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wYWN0UGFnZXJDb21wb25lbnQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGFnaW5nOiBQYWdpbmdJbmZvO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGFnaW5nQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wYWdpbmcgPSB7XG4gICAgICBwYWdlTnVtYmVyOiAwLFxuICAgICAgcGFnZUNvdW50OiAwLFxuICAgICAgdG90YWw6IDAsXG4gICAgfTtcbiAgICB0aGlzLnBhZ2luZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZpcnN0KCk6IHZvaWQge1xuICAgIHRoaXMucGFnaW5nID0geyAuLi50aGlzLnBhZ2luZywgcGFnZU51bWJlcjogMSB9O1xuICAgIHRoaXMucGFnaW5nQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmcpO1xuICB9XG5cbiAgcHVibGljIG9uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgPiAxKSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgLSAxIH07XG4gICAgICB0aGlzLnBhZ2luZ0NoYW5nZS5lbWl0KHRoaXMucGFnaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25OZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2luZy5wYWdlTnVtYmVyIDwgdGhpcy5wYWdpbmcucGFnZUNvdW50KSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgKyAxIH07XG4gICAgICB0aGlzLnBhZ2luZ0NoYW5nZS5lbWl0KHRoaXMucGFnaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25MYXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2luZy5wYWdlTnVtYmVyIDwgdGhpcy5wYWdpbmcucGFnZUNvdW50KSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VDb3VudCB9O1xuICAgICAgdGhpcy5wYWdpbmdDaGFuZ2UuZW1pdCh0aGlzLnBhZ2luZyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIiAqbmdJZj1cInBhZ2luZy5wYWdlQ291bnRcIj5cbiAgPHNwYW4gaWQ9XCJwYWdlc1wiPnt7IHBhZ2luZy5wYWdlTnVtYmVyIH19L3t7IHBhZ2luZy5wYWdlQ291bnQgfX08L3NwYW4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25GaXJzdCgpXCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5maXJzdF9wYWdlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25QcmV2aW91cygpXCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9iZWZvcmU8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIG1hdC1pY29uLWJ1dHRvblxuICAgIChjbGljayk9XCJvbk5leHQoKVwiXG4gICAgW2Rpc2FibGVkXT1cInBhZ2luZy5wYWdlTnVtYmVyID09PSBwYWdpbmcucGFnZUNvdW50XCJcbiAgPlxuICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25MYXN0KClcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmcucGFnZU51bWJlciA9PT0gcGFnaW5nLnBhZ2VDb3VudFwiXG4gID5cbiAgICA8bWF0LWljb24+bGFzdF9wYWdlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxzcGFuIGlkPVwidG90YWxcIj57eyBwYWdpbmcudG90YWwgfX0gPC9zcGFuPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class RangeViewComponent {
4
+ constructor() {
5
+ this.domain = [0, 100];
6
+ this.range = [0, 100];
7
+ this.width = 100;
8
+ this.height = 5;
9
+ this.scaledRange = [];
10
+ }
11
+ ngOnChanges() {
12
+ const domainWidth = this.domain[1] - this.domain[0];
13
+ const rangeWidth = this.range[1] - this.range[0];
14
+ const rangeStart = this.range[0] - this.domain[0];
15
+ this.scaledRange = [
16
+ (rangeStart / domainWidth) * this.width,
17
+ ((rangeStart + rangeWidth) / domainWidth) * this.width,
18
+ ];
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", 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"] }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: RangeViewComponent, decorators: [{
24
+ type: Component,
25
+ 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"] }]
26
+ }], ctorParameters: function () { return []; }, propDecorators: { domain: [{
27
+ type: Input
28
+ }], range: [{
29
+ type: Input
30
+ }], width: [{
31
+ type: Input
32
+ }], height: [{
33
+ type: Input
34
+ }] } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Utdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9wYWdlZC1kYXRhLWJyb3dzZXJzL3NyYy9saWIvY29tcG9uZW50cy9yYW5nZS12aWV3L3JhbmdlLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvcmFuZ2Utdmlldy9yYW5nZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDOztBQU81RCxNQUFNLE9BQU8sa0JBQWtCO0lBb0I3QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUs7WUFDdkMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSztTQUN2RCxDQUFDO0lBQ0osQ0FBQzs4R0FyQ1Usa0JBQWtCO2tHQUFsQixrQkFBa0IsMkpDUC9CLHVUQVVBOzsyRkRIYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzBFQVFWLE1BQU07c0JBQXJCLEtBQUs7Z0JBSVUsS0FBSztzQkFBcEIsS0FBSztnQkFJVSxLQUFLO3NCQUFwQixLQUFLO2dCQUlVLE1BQU07c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRiLXJhbmdlLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2Utdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhbmdlLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmFuZ2VWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gb2YgdGhlIHJhbmdlIHZpZXcgKHN0YXJ0LCBsaW1pdCkuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgZG9tYWluOiBBcnJheTxudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJhbmdlIG9mIHRoZSByYW5nZSB2aWV3IChzdGFydCwgbGltaXQpLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHJhbmdlOiBBcnJheTxudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgd2lkdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ6IG51bWJlcjtcblxuICBwdWJsaWMgc2NhbGVkUmFuZ2U6IEFycmF5PG51bWJlcj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5kb21haW4gPSBbMCwgMTAwXTtcbiAgICB0aGlzLnJhbmdlID0gWzAsIDEwMF07XG4gICAgdGhpcy53aWR0aCA9IDEwMDtcbiAgICB0aGlzLmhlaWdodCA9IDU7XG4gICAgdGhpcy5zY2FsZWRSYW5nZSA9IFtdO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgZG9tYWluV2lkdGggPSB0aGlzLmRvbWFpblsxXSAtIHRoaXMuZG9tYWluWzBdO1xuICAgIGNvbnN0IHJhbmdlV2lkdGggPSB0aGlzLnJhbmdlWzFdIC0gdGhpcy5yYW5nZVswXTtcbiAgICBjb25zdCByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZVswXSAtIHRoaXMuZG9tYWluWzBdO1xuXG4gICAgdGhpcy5zY2FsZWRSYW5nZSA9IFtcbiAgICAgIChyYW5nZVN0YXJ0IC8gZG9tYWluV2lkdGgpICogdGhpcy53aWR0aCxcbiAgICAgICgocmFuZ2VTdGFydCArIHJhbmdlV2lkdGgpIC8gZG9tYWluV2lkdGgpICogdGhpcy53aWR0aCxcbiAgICBdO1xuICB9XG59XG4iLCI8c3ZnIFthdHRyLndpZHRoXT1cIndpZHRoXCIgW2F0dHIuaGVpZ2h0XT1cImhlaWdodFwiPlxuICA8cmVjdCBpZD1cInJkb21haW5cIiBbYXR0ci53aWR0aF09XCJ3aWR0aFwiIFthdHRyLmhlaWdodF09XCJoZWlnaHRcIiAvPlxuICA8cmVjdFxuICAgIGlkPVwicnJhbmdlXCJcbiAgICBbYXR0ci54XT1cInNjYWxlZFJhbmdlWzBdXCJcbiAgICBbYXR0ci55XT1cIjBcIlxuICAgIFthdHRyLndpZHRoXT1cInNjYWxlZFJhbmdlWzFdIC0gc2NhbGVkUmFuZ2VbMF1cIlxuICAgIFthdHRyLmhlaWdodF09XCJoZWlnaHRcIlxuICAvPlxuPC9zdmc+XG4iXX0=
@@ -0,0 +1,92 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { MatBadgeModule } from '@angular/material/badge';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { MatChipsModule } from '@angular/material/chips';
7
+ import { MatDialogModule } from '@angular/material/dialog';
8
+ import { MatFormFieldModule } from '@angular/material/form-field';
9
+ import { MatIconModule } from '@angular/material/icon';
10
+ import { MatInputModule } from '@angular/material/input';
11
+ import { MatPaginatorModule } from '@angular/material/paginator';
12
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
13
+ import { MatSelectModule } from '@angular/material/select';
14
+ import { MatTooltipModule } from '@angular/material/tooltip';
15
+ import { NgToolsModule } from '@myrmidon/ng-tools';
16
+ import { CompactPagerComponent } from './components/compact-pager/compact-pager.component';
17
+ import { RangeViewComponent } from './components/range-view/range-view.component';
18
+ import { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';
19
+ import * as i0 from "@angular/core";
20
+ export class PagedDataBrowsersModule {
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
22
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.7", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
23
+ RangeViewComponent,
24
+ BrowserTreeNodeComponent], imports: [CommonModule,
25
+ ReactiveFormsModule,
26
+ // material
27
+ MatBadgeModule,
28
+ MatButtonModule,
29
+ MatChipsModule,
30
+ MatDialogModule,
31
+ MatFormFieldModule,
32
+ MatIconModule,
33
+ MatInputModule,
34
+ MatPaginatorModule,
35
+ MatProgressBarModule,
36
+ MatSelectModule,
37
+ MatTooltipModule,
38
+ // myrmidon
39
+ NgToolsModule], exports: [CompactPagerComponent,
40
+ RangeViewComponent,
41
+ BrowserTreeNodeComponent] }); }
42
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
43
+ ReactiveFormsModule,
44
+ // material
45
+ MatBadgeModule,
46
+ MatButtonModule,
47
+ MatChipsModule,
48
+ MatDialogModule,
49
+ MatFormFieldModule,
50
+ MatIconModule,
51
+ MatInputModule,
52
+ MatPaginatorModule,
53
+ MatProgressBarModule,
54
+ MatSelectModule,
55
+ MatTooltipModule,
56
+ // myrmidon
57
+ NgToolsModule] }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
60
+ type: NgModule,
61
+ args: [{
62
+ declarations: [
63
+ CompactPagerComponent,
64
+ RangeViewComponent,
65
+ BrowserTreeNodeComponent,
66
+ ],
67
+ imports: [
68
+ CommonModule,
69
+ ReactiveFormsModule,
70
+ // material
71
+ MatBadgeModule,
72
+ MatButtonModule,
73
+ MatChipsModule,
74
+ MatDialogModule,
75
+ MatFormFieldModule,
76
+ MatIconModule,
77
+ MatInputModule,
78
+ MatPaginatorModule,
79
+ MatProgressBarModule,
80
+ MatSelectModule,
81
+ MatTooltipModule,
82
+ // myrmidon
83
+ NgToolsModule
84
+ ],
85
+ exports: [
86
+ CompactPagerComponent,
87
+ RangeViewComponent,
88
+ BrowserTreeNodeComponent,
89
+ ],
90
+ }]
91
+ }] });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtZGF0YS1icm93c2Vycy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9wYWdlZC1kYXRhLWJyb3dzZXJzL3NyYy9saWIvcGFnZWQtZGF0YS1icm93c2Vycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7QUFnQ3RHLE1BQU0sT0FBTyx1QkFBdUI7OEdBQXZCLHVCQUF1QjsrR0FBdkIsdUJBQXVCLGlCQTVCaEMscUJBQXFCO1lBQ3JCLGtCQUFrQjtZQUNsQix3QkFBd0IsYUFHeEIsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixXQUFXO1lBQ1gsY0FBYztZQUNkLGVBQWU7WUFDZixjQUFjO1lBQ2QsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsY0FBYztZQUNkLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixXQUFXO1lBQ1gsYUFBYSxhQUdiLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsd0JBQXdCOytHQUdmLHVCQUF1QixZQXZCaEMsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixXQUFXO1lBQ1gsY0FBYztZQUNkLGVBQWU7WUFDZixjQUFjO1lBQ2QsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsY0FBYztZQUNkLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixXQUFXO1lBQ1gsYUFBYTs7MkZBUUosdUJBQXVCO2tCQTlCbkMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1oscUJBQXFCO3dCQUNyQixrQkFBa0I7d0JBQ2xCLHdCQUF3QjtxQkFDekI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixjQUFjO3dCQUNkLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixXQUFXO3dCQUNYLGFBQWE7cUJBQ2Q7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHFCQUFxQjt3QkFDckIsa0JBQWtCO3dCQUNsQix3QkFBd0I7cUJBQ3pCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRDaGlwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xuXG5pbXBvcnQgeyBDb21wYWN0UGFnZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcGFjdC1wYWdlci9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYW5nZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcmFuZ2Utdmlldy9yYW5nZS12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCcm93c2VyVHJlZU5vZGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgQ29tcGFjdFBhZ2VyQ29tcG9uZW50LFxuICAgIFJhbmdlVmlld0NvbXBvbmVudCxcbiAgICBCcm93c2VyVHJlZU5vZGVDb21wb25lbnQsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAvLyBtYXRlcmlhbFxuICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRDaGlwc01vZHVsZSxcbiAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIC8vIG15cm1pZG9uXG4gICAgTmdUb29sc01vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQ29tcGFjdFBhZ2VyQ29tcG9uZW50LFxuICAgIFJhbmdlVmlld0NvbXBvbmVudCxcbiAgICBCcm93c2VyVHJlZU5vZGVDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VkRGF0YUJyb3dzZXJzTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,111 @@
1
+ /**
2
+ * A Least Recently Used cache that can be used to store any type of object.
3
+ * The cache works in two modes: considering the size of the objects or not.
4
+ * If the size is considered, the cache will have a maximum size and will
5
+ * remove the oldest objects when the maximum size is reached. Note that
6
+ * the size is only roughly estimated. This avoids removing too many
7
+ * entries from the cache when the maximum is reached.
8
+ * If the size is not considered, the cache will have a maximum number of
9
+ * objects and will remove the oldest objects when the maximum number is
10
+ * reached.
11
+ */
12
+ export class LRUCache {
13
+ /**
14
+ * Creates a new cache.
15
+ * @param maxSize The maximum size of the cache. This is either
16
+ * the maximum number of items in the cache (when considerSize
17
+ * is false) or the maximum total size of all items in the
18
+ * cache in bytes (when considerSize is true).
19
+ * @param considerSize True if the size of the objects should be
20
+ * considered.
21
+ */
22
+ constructor(maxSize, considerSize = false) {
23
+ this.maxSize = maxSize;
24
+ this.totalSize = 0;
25
+ this.considerSize = considerSize;
26
+ this.cache = new Map();
27
+ this.sizes = new Map();
28
+ }
29
+ /**
30
+ * Get an item from the cache.
31
+ * @param key The key of the item to get.
32
+ * @returns The item or undefined if the item is not in the cache.
33
+ */
34
+ get(key) {
35
+ let item = this.cache.get(key);
36
+ if (item) {
37
+ this.cache.delete(key);
38
+ this.cache.set(key, item);
39
+ }
40
+ return item;
41
+ }
42
+ /**
43
+ * Put an item in the cache.
44
+ * @param key The key of the item to put.
45
+ * @param item The item to put.
46
+ * @param size The estimated size of the item in bytes.
47
+ * This must be calculated by the caller but only when
48
+ * considerSize is true.
49
+ */
50
+ put(key, item, size) {
51
+ this.cache.delete(key);
52
+ this.cache.set(key, item);
53
+ this.sizes.set(key, size);
54
+ if (this.considerSize) {
55
+ this.totalSize += size;
56
+ while (this.totalSize > this.maxSize) {
57
+ const oldestKey = this.cache.keys().next().value;
58
+ let oldestSize = this.sizes.get(oldestKey);
59
+ if (oldestSize) {
60
+ this.totalSize -= oldestSize;
61
+ }
62
+ this.cache.delete(oldestKey);
63
+ this.sizes.delete(oldestKey);
64
+ }
65
+ }
66
+ else {
67
+ while (this.cache.size > this.maxSize) {
68
+ const oldestKey = this.cache.keys().next().value;
69
+ this.cache.delete(oldestKey);
70
+ this.sizes.delete(oldestKey);
71
+ }
72
+ }
73
+ }
74
+ /**
75
+ * Clear the cache.
76
+ */
77
+ clear() {
78
+ this.cache.clear();
79
+ this.sizes.clear();
80
+ this.totalSize = 0;
81
+ }
82
+ /**
83
+ * Estimate the size of an object in bytes.
84
+ * @param obj The object to calculate the size of.
85
+ * @returns The estimated size of the object in bytes.
86
+ */
87
+ static calculateObjectSize(obj) {
88
+ if (!obj) {
89
+ return 0;
90
+ }
91
+ let totalSize = 0;
92
+ let keys = Object.keys(obj);
93
+ for (let key of keys) {
94
+ let value = obj[key];
95
+ if (typeof value === 'string') {
96
+ totalSize += value.length * 2;
97
+ }
98
+ else if (typeof value === 'number') {
99
+ totalSize += 8;
100
+ }
101
+ else if (typeof value === 'boolean') {
102
+ totalSize += 4;
103
+ }
104
+ else if (typeof value === 'object' && value !== null) {
105
+ totalSize += this.calculateObjectSize(value);
106
+ }
107
+ }
108
+ return totalSize;
109
+ }
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL3NlcnZpY2VzL2xydS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxlQUF3QixLQUFLO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEdBQUcsQ0FBQyxHQUFXLEVBQUUsSUFBTyxFQUFFLElBQVk7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7aUJBQzlCO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM5QjtTQUNGO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUI7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBUTtRQUN4QyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDN0IsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNwQyxTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQyxTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ3RELFNBQVMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUM7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIExlYXN0IFJlY2VudGx5IFVzZWQgY2FjaGUgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbnkgdHlwZSBvZiBvYmplY3QuXHJcbiAqIFRoZSBjYWNoZSB3b3JrcyBpbiB0d28gbW9kZXM6IGNvbnNpZGVyaW5nIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIG9yIG5vdC5cclxuICogSWYgdGhlIHNpemUgaXMgY29uc2lkZXJlZCwgdGhlIGNhY2hlIHdpbGwgaGF2ZSBhIG1heGltdW0gc2l6ZSBhbmQgd2lsbFxyXG4gKiByZW1vdmUgdGhlIG9sZGVzdCBvYmplY3RzIHdoZW4gdGhlIG1heGltdW0gc2l6ZSBpcyByZWFjaGVkLiBOb3RlIHRoYXRcclxuICogdGhlIHNpemUgaXMgb25seSByb3VnaGx5IGVzdGltYXRlZC4gVGhpcyBhdm9pZHMgcmVtb3ZpbmcgdG9vIG1hbnlcclxuICogZW50cmllcyBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQuXHJcbiAqIElmIHRoZSBzaXplIGlzIG5vdCBjb25zaWRlcmVkLCB0aGUgY2FjaGUgd2lsbCBoYXZlIGEgbWF4aW11bSBudW1iZXIgb2ZcclxuICogb2JqZWN0cyBhbmQgd2lsbCByZW1vdmUgdGhlIG9sZGVzdCBvYmplY3RzIHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIGlzXHJcbiAqIHJlYWNoZWQuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8VD4ge1xyXG4gIHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb25zaWRlclNpemU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgVD47XHJcbiAgcHJpdmF0ZSBzaXplczogTWFwPHN0cmluZywgbnVtYmVyPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBjYWNoZS5cclxuICAgKiBAcGFyYW0gbWF4U2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyBpcyBlaXRoZXJcclxuICAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhY2hlICh3aGVuIGNvbnNpZGVyU2l6ZVxyXG4gICAqIGlzIGZhbHNlKSBvciB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyBpbiB0aGVcclxuICAgKiBjYWNoZSBpbiBieXRlcyAod2hlbiBjb25zaWRlclNpemUgaXMgdHJ1ZSkuXHJcbiAgICogQHBhcmFtIGNvbnNpZGVyU2l6ZSBUcnVlIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHNob3VsZCBiZVxyXG4gICAqIGNvbnNpZGVyZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyLCBjb25zaWRlclNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcclxuICAgIHRoaXMudG90YWxTaXplID0gMDtcclxuICAgIHRoaXMuY29uc2lkZXJTaXplID0gY29uc2lkZXJTaXplO1xyXG4gICAgdGhpcy5jYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xyXG4gICAgdGhpcy5zaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYW4gaXRlbSBmcm9tIHRoZSBjYWNoZS5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIG9yIHVuZGVmaW5lZCBpZiB0aGUgaXRlbSBpcyBub3QgaW4gdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBpdGVtOiBUIHwgdW5kZWZpbmVkID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XHJcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dCBhbiBpdGVtIGluIHRoZSBjYWNoZS5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gcHV0LlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIHB1dC5cclxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIGl0ZW0gaW4gYnl0ZXMuXHJcbiAgICogVGhpcyBtdXN0IGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNhbGxlciBidXQgb25seSB3aGVuXHJcbiAgICogY29uc2lkZXJTaXplIGlzIHRydWUuXHJcbiAgICovXHJcbiAgcHVibGljIHB1dChrZXk6IHN0cmluZywgaXRlbTogVCwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBpdGVtKTtcclxuICAgIHRoaXMuc2l6ZXMuc2V0KGtleSwgc2l6ZSk7XHJcbiAgICBpZiAodGhpcy5jb25zaWRlclNpemUpIHtcclxuICAgICAgdGhpcy50b3RhbFNpemUgKz0gc2l6ZTtcclxuICAgICAgd2hpbGUgKHRoaXMudG90YWxTaXplID4gdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgIGxldCBvbGRlc3RTaXplID0gdGhpcy5zaXplcy5nZXQob2xkZXN0S2V5KTtcclxuICAgICAgICBpZiAob2xkZXN0U2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbFNpemUgLT0gb2xkZXN0U2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUob2xkZXN0S2V5KTtcclxuICAgICAgICB0aGlzLnNpemVzLmRlbGV0ZShvbGRlc3RLZXkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aGlsZSAodGhpcy5jYWNoZS5zaXplID4gdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5zaXplcy5kZWxldGUob2xkZXN0S2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcclxuICAgIHRoaXMuc2l6ZXMuY2xlYXIoKTtcclxuICAgIHRoaXMudG90YWxTaXplID0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzdGltYXRlIHRoZSBzaXplIG9mIGFuIG9iamVjdCBpbiBieXRlcy5cclxuICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mLlxyXG4gICAqIEByZXR1cm5zIFRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIGJ5dGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlT2JqZWN0U2l6ZShvYmo6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGxldCB0b3RhbFNpemUgPSAwO1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xyXG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcclxuICAgICAgbGV0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdG90YWxTaXplICs9IHZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSA4O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgdG90YWxTaXplICs9IDQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSB0aGlzLmNhbGN1bGF0ZU9iamVjdFNpemUodmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG90YWxTaXplO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,128 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { LRUCache } from './lru-cache';
3
+ /**
4
+ * Default options for the paged list store.
5
+ */
6
+ export const DEFAULT_PAGED_LIST_STORE_OPTIONS = {
7
+ pageSize: 20,
8
+ cacheSize: 50,
9
+ };
10
+ /**
11
+ * A generic paged list store using a filter object of type F
12
+ * and a list of elements of type E.
13
+ */
14
+ export class PagedListStore {
15
+ /**
16
+ * The size of nodes pages in this store. If you change it, the store
17
+ * is reset. The default value is 20.
18
+ */
19
+ get pageSize() {
20
+ return this._pageSize;
21
+ }
22
+ set pageSize(value) {
23
+ if (this._pageSize === value) {
24
+ return;
25
+ }
26
+ this._pageSize = value;
27
+ this.reset();
28
+ }
29
+ /**
30
+ * Create a new paged list store.
31
+ * @param options Options for the paged list store.
32
+ */
33
+ constructor(_service, options = DEFAULT_PAGED_LIST_STORE_OPTIONS) {
34
+ this._service = _service;
35
+ this._pageSize = options.pageSize;
36
+ this._cache = new LRUCache(options.cacheSize);
37
+ // page
38
+ this._page$ = new BehaviorSubject({
39
+ pageNumber: 0,
40
+ pageCount: 0,
41
+ pageSize: 0,
42
+ total: 0,
43
+ items: [],
44
+ });
45
+ this.page$ = this._page$.asObservable();
46
+ // filter
47
+ this._filter$ = new BehaviorSubject({});
48
+ this.filter$ = this._filter$.asObservable();
49
+ }
50
+ /**
51
+ * Returns true if the store is empty, false otherwise.
52
+ * @returns true if the store is empty, false otherwise.
53
+ */
54
+ isEmpty() {
55
+ return this._page$.value.items.length === 0;
56
+ }
57
+ /**
58
+ * Build the cache key for the given page number and filter.
59
+ * The default implementation just returns a stringified object
60
+ * containing the page number and the filter. You may override
61
+ * this method to provide a custom cache key.
62
+ * @param pageNumber The page number.
63
+ * @param filter The filter.
64
+ * @returns A string to be used as cache key.
65
+ */
66
+ buildCacheKey(pageNumber, filter) {
67
+ if (this._customCacheKeyBuilder) {
68
+ return this._customCacheKeyBuilder(pageNumber, filter);
69
+ }
70
+ return JSON.stringify({ pageNumber, ...filter });
71
+ }
72
+ /**
73
+ * Load the page with the given number.
74
+ * @param pageNumber the page number to load.
75
+ */
76
+ loadPage(pageNumber) {
77
+ return this._service.loadPage(pageNumber, this._pageSize, this._filter$.value);
78
+ }
79
+ /**
80
+ * Set the page with the given number.
81
+ * @param pageNumber The page number to load.
82
+ * @param pageSize The page size.
83
+ * @returns Promise which resolves when the page is loaded.
84
+ */
85
+ setPage(pageNumber, pageSize) {
86
+ if (pageSize && pageSize !== this._pageSize) {
87
+ this._pageSize = pageSize;
88
+ }
89
+ return new Promise((resolve, reject) => {
90
+ // if page is in cache, return it
91
+ const key = this.buildCacheKey(pageNumber, this._filter$.value);
92
+ const cachedPage = this._cache.get(key);
93
+ if (cachedPage) {
94
+ this._page$.next(cachedPage);
95
+ resolve();
96
+ return;
97
+ }
98
+ // else load page
99
+ this.loadPage(pageNumber).subscribe({
100
+ next: (page) => {
101
+ this._page$.next(page);
102
+ resolve();
103
+ },
104
+ error: reject,
105
+ });
106
+ });
107
+ }
108
+ /**
109
+ * Apply the given filter and load the first page.
110
+ * @param filter The filter to apply.
111
+ * @returns Promise which resolves when the page is loaded.
112
+ */
113
+ applyFilter(filter) {
114
+ return new Promise((resolve, reject) => {
115
+ this._filter$.next(filter);
116
+ this.setPage(1).then(resolve, reject);
117
+ });
118
+ }
119
+ /**
120
+ * Reset the filter and load the first page. The cache is cleared.
121
+ * @returns Promise which resolves when the page is loaded.
122
+ */
123
+ reset() {
124
+ this._cache.clear();
125
+ return this.applyFilter({});
126
+ }
127
+ }
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFDVSxRQUFxQyxFQUM3QyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFHN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQWMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE9BQU87UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFjO1lBQzdDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFFLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsU0FBUztRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUksRUFBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2pELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4RDtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFFBQVEsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMzQixVQUFVLEVBQ1YsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxVQUFrQixFQUFFLFFBQWlCO1FBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxpQ0FBaUM7WUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTzthQUNSO1lBRUQsaUJBQWlCO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxLQUFLLEVBQUUsTUFBTTthQUNkLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBUztRQUMxQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRMaXN0U3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IHtcclxuICBwYWdlU2l6ZTogMjAsXHJcbiAgY2FjaGVTaXplOiA1MCxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgUGFnZWRMaXN0U3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPiB7XHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBzaXplIG9mIHRoZSBwYWdlIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIGFwcGx5LlxyXG4gICAqL1xyXG4gIGxvYWRQYWdlKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlcixcclxuICAgIGZpbHRlcjogRlxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8RT4+O1xyXG59XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIHBhZ2VkIGxpc3Qgc3RvcmUgdXNpbmcgYSBmaWx0ZXIgb2JqZWN0IG9mIHR5cGUgRlxyXG4gKiBhbmQgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIHR5cGUgRS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZExpc3RTdG9yZTxGLCBFPiB7XHJcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgX3BhZ2UkOiBCZWhhdmlvclN1YmplY3Q8RGF0YVBhZ2U8RT4+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTFJVQ2FjaGU8RGF0YVBhZ2U8RT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGFnZS4gSXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBwYWdlIGlzIGNoYW5nZWQgb3IgdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlJDogT2JzZXJ2YWJsZTxSZWFkb25seTxEYXRhUGFnZTxFPj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyLiBJdCBpcyB1cGRhdGVkIHdoZW4gdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxFPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgLy8gcGFnZVxyXG4gICAgdGhpcy5fcGFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFQYWdlPEU+Pih7XHJcbiAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgIHBhZ2VDb3VudDogMCxcclxuICAgICAgcGFnZVNpemU6IDAsXHJcbiAgICAgIHRvdGFsOiAwLFxyXG4gICAgICBpdGVtczogW10sXHJcbiAgICB9KTtcclxuICAgIHRoaXMucGFnZSQgPSB0aGlzLl9wYWdlJC5hc09ic2VydmFibGUoKTtcclxuICAgIC8vIGZpbHRlclxyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdG9yZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZSQudmFsdWUuaXRlbXMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBhZ2VOdW1iZXIsIC4uLmZpbHRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIHRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFBhZ2UocGFnZU51bWJlcjogbnVtYmVyKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxFPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UubG9hZFBhZ2UoXHJcbiAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgIHRoaXMuX3BhZ2VTaXplLFxyXG4gICAgICB0aGlzLl9maWx0ZXIkLnZhbHVlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gbG9hZC5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSAhPT0gdGhpcy5fcGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIGlmIHBhZ2UgaXMgaW4gY2FjaGUsIHJldHVybiBpdFxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgdGhpcy5fZmlsdGVyJC52YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNhY2hlZFBhZ2UgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgICAgaWYgKGNhY2hlZFBhZ2UpIHtcclxuICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KGNhY2hlZFBhZ2UpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGVsc2UgbG9hZCBwYWdlXHJcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZU51bWJlcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcGFnZSQubmV4dChwYWdlKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiByZWplY3QsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSB0aGUgZ2l2ZW4gZmlsdGVyIGFuZCBsb2FkIHRoZSBmaXJzdCBwYWdlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhcHBseUZpbHRlcihmaWx0ZXI6IEYpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlciQubmV4dChmaWx0ZXIpO1xyXG4gICAgICB0aGlzLnNldFBhZ2UoMSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCB0aGUgZmlsdGVyIGFuZCBsb2FkIHRoZSBmaXJzdCBwYWdlLiBUaGUgY2FjaGUgaXMgY2xlYXJlZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBseUZpbHRlcih7fSBhcyBGKTtcclxuICB9XHJcbn1cclxuIl19