ngx-edu-sharing-metaqs2 0.9.33 → 0.9.35

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.
Files changed (52) hide show
  1. package/README.md +31 -0
  2. package/_index.scss +8 -0
  3. package/esm2022/lib/collection-count-history/collection-count-history.component.mjs +3 -3
  4. package/esm2022/lib/components/donut-chart/donut-chart.component.mjs +6 -6
  5. package/esm2022/lib/components/donut-chart/donut-chart.model.mjs +1 -1
  6. package/esm2022/lib/components/donut-chart/donut-chart.pipe.mjs +6 -5
  7. package/esm2022/lib/components/donut-chart-tooltip/donut-chart-tooltip.component.mjs +79 -0
  8. package/esm2022/lib/components/filter/datepicker/datepicker.component.mjs +3 -8
  9. package/esm2022/lib/components/node-list/node-list.component.mjs +13 -9
  10. package/esm2022/lib/components/quality-matrix/quality_matrix.mjs +195 -36
  11. package/esm2022/lib/components/quality-matrix/scroll-marker.directive.mjs +17 -0
  12. package/esm2022/lib/config-helper.service.mjs +5 -4
  13. package/esm2022/lib/core/tooltip.service.mjs +146 -0
  14. package/esm2022/lib/counts-with-history/counts-with-history.component.mjs +4 -4
  15. package/esm2022/lib/java-api/api/authProxyController.service.mjs +12 -93
  16. package/esm2022/lib/java-api/api/collectionAPI.service.mjs +91 -178
  17. package/esm2022/lib/java-api/api/editorsAPI.service.mjs +14 -102
  18. package/esm2022/lib/java-api/api/filterAPI.service.mjs +50 -129
  19. package/esm2022/lib/java-api/api/replicationSourceAPI.service.mjs +20 -130
  20. package/esm2022/lib/java-api/api.base.service.mjs +66 -0
  21. package/esm2022/lib/java-api/configuration.mjs +9 -1
  22. package/esm2022/lib/java-api/model/missingAttributeResult.mjs +2 -0
  23. package/esm2022/lib/java-api/model/models.mjs +2 -1
  24. package/esm2022/lib/ng-meta-widgets-lib.module.mjs +18 -11
  25. package/esm2022/lib/tree-collection-details/tree-collection-details.component.mjs +3 -7
  26. package/esm2022/lib/tree-search-counts/tree-search-counts.component.mjs +4 -6
  27. package/esm2022/public-api.mjs +6 -3
  28. package/esm2022/web-components.mjs +36 -0
  29. package/fesm2022/ngx-edu-sharing-metaqs2.mjs +1051 -1003
  30. package/fesm2022/ngx-edu-sharing-metaqs2.mjs.map +1 -1
  31. package/lib/components/donut-chart/donut-chart.component.d.ts +1 -1
  32. package/lib/components/donut-chart/donut-chart.model.d.ts +1 -0
  33. package/lib/components/donut-chart/donut-chart.pipe.d.ts +1 -1
  34. package/lib/components/donut-chart-tooltip/donut-chart-tooltip.component.d.ts +14 -0
  35. package/lib/components/node-list/node-list.component.d.ts +9 -5
  36. package/lib/components/quality-matrix/quality_matrix.d.ts +25 -6
  37. package/lib/components/quality-matrix/scroll-marker.directive.d.ts +7 -0
  38. package/lib/config-helper.service.d.ts +2 -0
  39. package/lib/core/tooltip.service.d.ts +61 -0
  40. package/lib/java-api/api/authProxyController.service.d.ts +4 -9
  41. package/lib/java-api/api/collectionAPI.service.d.ts +47 -25
  42. package/lib/java-api/api/editorsAPI.service.d.ts +5 -10
  43. package/lib/java-api/api/filterAPI.service.d.ts +27 -9
  44. package/lib/java-api/api/replicationSourceAPI.service.d.ts +4 -9
  45. package/lib/java-api/api.base.service.d.ts +12 -0
  46. package/lib/java-api/configuration.d.ts +3 -1
  47. package/lib/java-api/model/missingAttributeResult.d.ts +16 -0
  48. package/lib/java-api/model/models.d.ts +1 -0
  49. package/lib/ng-meta-widgets-lib.module.d.ts +34 -32
  50. package/package.json +4 -1
  51. package/public-api.d.ts +5 -2
  52. package/web-components.d.ts +7 -0
@@ -23,9 +23,13 @@ export class NodeListComponent {
23
23
  */
24
24
  this.countChanged = new EventEmitter();
25
25
  /**
26
- * default max count of nodes that should be shown
26
+ * default max count of nodes that should be shown in view
27
27
  */
28
28
  this.DEFAULT_LIMIT = 25;
29
+ /**
30
+ * default count to fetch from api
31
+ */
32
+ this.FETCH_LIMIT = 200;
29
33
  this.data = new BehaviorSubject(undefined);
30
34
  // rawData: (MaterialWithMissingAttributes | CollectionWithMissingAttributes)[] | undefined;
31
35
  this.count = 0;
@@ -34,9 +38,9 @@ export class NodeListComponent {
34
38
  * should all nodes be shown?
35
39
  */
36
40
  this.showAll = false;
37
- this.data.pipe(takeUntil(this.destroyed$)).subscribe((d) => this.countChanged.next(d?.length || 0));
41
+ this.data.pipe(takeUntil(this.destroyed$)).subscribe((d) => this.countChanged.next(d?.total || 0));
38
42
  }
39
- async ngOnChanges(changes) {
43
+ async ngOnChanges(_changes) {
40
44
  if (this.collectionId) {
41
45
  await this.refresh();
42
46
  }
@@ -48,10 +52,10 @@ export class NodeListComponent {
48
52
  async refresh() {
49
53
  let getByMissingAttribute = () => {
50
54
  if (this.type === 'material') {
51
- return this.collectionAPIService.getMaterialsWithMissingAttribute(this.collectionId, this.mode);
55
+ return this.collectionAPIService.getMaterialsWithMissingAttribute(this.collectionId, this.mode, 0, this.FETCH_LIMIT);
52
56
  }
53
57
  else {
54
- return this.collectionAPIService.getCollectionsWithMissingAttribute(this.collectionId, this.mode);
58
+ return this.collectionAPIService.getCollectionsWithMissingAttribute(this.collectionId, this.mode, 0, this.FETCH_LIMIT);
55
59
  }
56
60
  };
57
61
  // reset all data before switching
@@ -80,7 +84,7 @@ export class NodeListComponent {
80
84
  action = 'OPTIONS.EDIT';
81
85
  }
82
86
  const id = node.node_id;
83
- const win = window.open(this.env.eduSharingPath +
87
+ window.open(this.env.eduSharingPath +
84
88
  '/components/editorial-desk?mode=audit&viewType=single&ids=' +
85
89
  encodeURIComponent(id) +
86
90
  '&action=' +
@@ -91,11 +95,11 @@ export class NodeListComponent {
91
95
  // this.data = this.rawData?.filter((d) => (d as MaterialCounts).materials_count <= (this.count ?? 0));
92
96
  }
93
97
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NodeListComponent, deps: [{ token: i1.CollectionAPIService }], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NodeListComponent, selector: "metaqs2-node-list", inputs: { mode: "mode", type: "type", collectionId: "collectionId" }, outputs: { countChanged: "countChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\n <mat-card *ngIf=\"mode\">\n <mat-card-header>\n <mat-card-title>\n {{ 'issues.' + mode | translate }}\n <span class=\"count\" *ngIf=\"(data | async) as d\">({{ d.length || 0 }})</span>\n </mat-card-title>\n <button mat-icon-button color=\"primary\" [disabled]=\"!(data | async)\" (click)=\"refresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n </mat-card-header>\n <!-- @TODO -->\n <div *ngIf=\"type === 'collection' && mode === 'TODO_count'\" class=\"count-slider\">\n <label>Sammlungen mit {{ count }} oder weniger Inhalten</label>\n <mat-slider\n [showTickMarks]=\"true\"\n step=\"1\"\n [ngModel]=\"count\"\n (ngModelChange)=\"count = $event; filterCount()\"\n min=\"0\"\n max=\"10\"\n ></mat-slider>\n </div>\n <ng-container *ngIf=\"wrappedData$ | async as wrappedData\">\n <mat-spinner *ngIf=\"wrappedData.state === 'loading'\" diameter=\"40\" color=\"primary\"></mat-spinner>\n <div class=\"error\" *ngIf=\"wrappedData.state === 'error'\">\n <p class=\"error-text\">Etwas ist schief gelaufen.</p>\n </div>\n <div class=\"scroll\" *ngIf=\"wrappedData.state === 'success'\">\n <ng-container *ngIf=\"(data | async) as d\">\n <metaqs2-node-entry\n *ngFor=\"let node of DEFAULT_LIMIT < d.length && !showAll ? d.slice(0, DEFAULT_LIMIT) : d\"\n [node]=\"node\"\n (edit)=\"editNode(node)\"\n ></metaqs2-node-entry>\n <div *ngIf=\"!d.length\">\n <div class=\"all-done\">\n <p class=\"all-done-emoji\">\uD83E\uDD73</p>\n <p class=\"all-done-text\">Keine Elemente ausstehend</p>\n </div>\n </div>\n <button *ngIf=\"DEFAULT_LIMIT < d.length && !showAll\" (click)=\"showAll = true\" color=\"primary\" mat-button>\n Alle Elemente anzeigen <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </mat-card>\n</div>\n", styles: [".while-loading{filter:blur(2px)}.wrapper{width:100%;height:100%}.wrapper mat-card{display:flex;flex-direction:column;width:100%;height:100%;padding:0;box-shadow:none}.wrapper mat-card ::ng-deep mat-card-header{align-items:center}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text{flex-grow:1;margin:0}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title{padding-top:20px;font-size:120%}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title .count{font-size:80%;color:#888}.wrapper mat-card .count-slider{display:flex;flex-direction:column;width:100%}.wrapper mat-card .count-slider>label{padding:0 20px;font-size:90%}.wrapper mat-card .count-slider>mat-slider{width:100%}.wrapper mat-card mat-spinner{flex-grow:1;display:flex;align-self:center;justify-self:center;margin-top:20%}.wrapper mat-card .scroll{flex-grow:1;overflow-y:auto}.wrapper mat-card .scroll>button{display:flex;margin:auto}.wrapper mat-card .scroll .all-done{display:flex;flex-direction:column;align-items:center}.wrapper mat-card .scroll .all-done .all-done-emoji{font-size:72px;margin-bottom:20px}.wrapper mat-card .scroll .all-done .all-done-text{text-align:center;font-size:1.3em;color:var(--font-light)}.wrapper mat-card .error{border:#d00 solid 2px;background-color:#d005;display:flex;flex-direction:column;align-items:center}.wrapper mat-card .error .error-text{font-size:1.3em}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.NodeEntryComponent, selector: "metaqs2-node-entry", inputs: ["node"], outputs: ["edit"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
98
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NodeListComponent, selector: "metaqs2-node-list", inputs: { mode: "mode", type: "type", collectionId: "collectionId" }, outputs: { countChanged: "countChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\n <mat-card *ngIf=\"mode\">\n <mat-card-header>\n <mat-card-title>\n {{ 'issues.' + mode | translate }}\n <span class=\"count\" *ngIf=\"(data | async) as d\">({{ d.total || 0 }})</span>\n </mat-card-title>\n <button mat-icon-button color=\"primary\" [disabled]=\"!(data | async)\" (click)=\"refresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n </mat-card-header>\n <!-- @TODO -->\n <div *ngIf=\"type === 'collection' && mode === 'TODO_count'\" class=\"count-slider\">\n <label>Sammlungen mit {{ count }} oder weniger Inhalten</label>\n <mat-slider\n [showTickMarks]=\"true\"\n step=\"1\"\n [ngModel]=\"count\"\n (ngModelChange)=\"count = $event; filterCount()\"\n min=\"0\"\n max=\"10\"\n ></mat-slider>\n </div>\n <ng-container *ngIf=\"wrappedData$ | async as wrappedData\">\n <mat-spinner *ngIf=\"wrappedData.state === 'loading'\" diameter=\"40\" color=\"primary\"></mat-spinner>\n <div class=\"error\" *ngIf=\"wrappedData.state === 'error'\">\n <p class=\"error-text\">Etwas ist schief gelaufen.</p>\n </div>\n <div class=\"scroll\" *ngIf=\"wrappedData.state === 'success'\">\n <ng-container *ngIf=\"(data | async) as d\">\n <metaqs2-node-entry\n *ngFor=\"let node of DEFAULT_LIMIT < (d?.total || 0) && !showAll ? $any(d.materials || d.collections)?.slice(0, DEFAULT_LIMIT) : (d.materials || d.collections)\"\n [node]=\"node\"\n (edit)=\"editNode(node)\"\n ></metaqs2-node-entry>\n <div *ngIf=\"!d.total\">\n <div class=\"all-done\">\n <p class=\"all-done-emoji\">\uD83E\uDD73</p>\n <p class=\"all-done-text\">Keine Elemente ausstehend</p>\n </div>\n </div>\n <button *ngIf=\"DEFAULT_LIMIT < (d?.total || 0) && !showAll\" (click)=\"showAll = true\" color=\"primary\" mat-button>\n Alle Elemente anzeigen <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </mat-card>\n</div>\n", styles: [".while-loading{filter:blur(2px)}.wrapper{width:100%;height:100%}.wrapper mat-card{display:flex;flex-direction:column;width:100%;height:100%;padding:0;box-shadow:none}.wrapper mat-card ::ng-deep mat-card-header{align-items:center}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text{flex-grow:1;margin:0}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title{padding-top:20px;font-size:120%}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title .count{font-size:80%;color:#888}.wrapper mat-card .count-slider{display:flex;flex-direction:column;width:100%}.wrapper mat-card .count-slider>label{padding:0 20px;font-size:90%}.wrapper mat-card .count-slider>mat-slider{width:100%}.wrapper mat-card mat-spinner{flex-grow:1;display:flex;align-self:center;justify-self:center;margin-top:20%}.wrapper mat-card .scroll{flex-grow:1;overflow-y:auto}.wrapper mat-card .scroll>button{display:flex;margin:auto}.wrapper mat-card .scroll .all-done{display:flex;flex-direction:column;align-items:center}.wrapper mat-card .scroll .all-done .all-done-emoji{font-size:72px;margin-bottom:20px}.wrapper mat-card .scroll .all-done .all-done-text{text-align:center;font-size:1.3em;color:var(--font-light)}.wrapper mat-card .error{border:#d00 solid 2px;background-color:#d005;display:flex;flex-direction:column;align-items:center}.wrapper mat-card .error .error-text{font-size:1.3em}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.NodeEntryComponent, selector: "metaqs2-node-entry", inputs: ["node"], outputs: ["edit"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
95
99
  }
96
100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NodeListComponent, decorators: [{
97
101
  type: Component,
98
- args: [{ selector: 'metaqs2-node-list', template: "<div class=\"wrapper\">\n <mat-card *ngIf=\"mode\">\n <mat-card-header>\n <mat-card-title>\n {{ 'issues.' + mode | translate }}\n <span class=\"count\" *ngIf=\"(data | async) as d\">({{ d.length || 0 }})</span>\n </mat-card-title>\n <button mat-icon-button color=\"primary\" [disabled]=\"!(data | async)\" (click)=\"refresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n </mat-card-header>\n <!-- @TODO -->\n <div *ngIf=\"type === 'collection' && mode === 'TODO_count'\" class=\"count-slider\">\n <label>Sammlungen mit {{ count }} oder weniger Inhalten</label>\n <mat-slider\n [showTickMarks]=\"true\"\n step=\"1\"\n [ngModel]=\"count\"\n (ngModelChange)=\"count = $event; filterCount()\"\n min=\"0\"\n max=\"10\"\n ></mat-slider>\n </div>\n <ng-container *ngIf=\"wrappedData$ | async as wrappedData\">\n <mat-spinner *ngIf=\"wrappedData.state === 'loading'\" diameter=\"40\" color=\"primary\"></mat-spinner>\n <div class=\"error\" *ngIf=\"wrappedData.state === 'error'\">\n <p class=\"error-text\">Etwas ist schief gelaufen.</p>\n </div>\n <div class=\"scroll\" *ngIf=\"wrappedData.state === 'success'\">\n <ng-container *ngIf=\"(data | async) as d\">\n <metaqs2-node-entry\n *ngFor=\"let node of DEFAULT_LIMIT < d.length && !showAll ? d.slice(0, DEFAULT_LIMIT) : d\"\n [node]=\"node\"\n (edit)=\"editNode(node)\"\n ></metaqs2-node-entry>\n <div *ngIf=\"!d.length\">\n <div class=\"all-done\">\n <p class=\"all-done-emoji\">\uD83E\uDD73</p>\n <p class=\"all-done-text\">Keine Elemente ausstehend</p>\n </div>\n </div>\n <button *ngIf=\"DEFAULT_LIMIT < d.length && !showAll\" (click)=\"showAll = true\" color=\"primary\" mat-button>\n Alle Elemente anzeigen <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </mat-card>\n</div>\n", styles: [".while-loading{filter:blur(2px)}.wrapper{width:100%;height:100%}.wrapper mat-card{display:flex;flex-direction:column;width:100%;height:100%;padding:0;box-shadow:none}.wrapper mat-card ::ng-deep mat-card-header{align-items:center}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text{flex-grow:1;margin:0}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title{padding-top:20px;font-size:120%}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title .count{font-size:80%;color:#888}.wrapper mat-card .count-slider{display:flex;flex-direction:column;width:100%}.wrapper mat-card .count-slider>label{padding:0 20px;font-size:90%}.wrapper mat-card .count-slider>mat-slider{width:100%}.wrapper mat-card mat-spinner{flex-grow:1;display:flex;align-self:center;justify-self:center;margin-top:20%}.wrapper mat-card .scroll{flex-grow:1;overflow-y:auto}.wrapper mat-card .scroll>button{display:flex;margin:auto}.wrapper mat-card .scroll .all-done{display:flex;flex-direction:column;align-items:center}.wrapper mat-card .scroll .all-done .all-done-emoji{font-size:72px;margin-bottom:20px}.wrapper mat-card .scroll .all-done .all-done-text{text-align:center;font-size:1.3em;color:var(--font-light)}.wrapper mat-card .error{border:#d00 solid 2px;background-color:#d005;display:flex;flex-direction:column;align-items:center}.wrapper mat-card .error .error-text{font-size:1.3em}\n"] }]
102
+ args: [{ selector: 'metaqs2-node-list', template: "<div class=\"wrapper\">\n <mat-card *ngIf=\"mode\">\n <mat-card-header>\n <mat-card-title>\n {{ 'issues.' + mode | translate }}\n <span class=\"count\" *ngIf=\"(data | async) as d\">({{ d.total || 0 }})</span>\n </mat-card-title>\n <button mat-icon-button color=\"primary\" [disabled]=\"!(data | async)\" (click)=\"refresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n </mat-card-header>\n <!-- @TODO -->\n <div *ngIf=\"type === 'collection' && mode === 'TODO_count'\" class=\"count-slider\">\n <label>Sammlungen mit {{ count }} oder weniger Inhalten</label>\n <mat-slider\n [showTickMarks]=\"true\"\n step=\"1\"\n [ngModel]=\"count\"\n (ngModelChange)=\"count = $event; filterCount()\"\n min=\"0\"\n max=\"10\"\n ></mat-slider>\n </div>\n <ng-container *ngIf=\"wrappedData$ | async as wrappedData\">\n <mat-spinner *ngIf=\"wrappedData.state === 'loading'\" diameter=\"40\" color=\"primary\"></mat-spinner>\n <div class=\"error\" *ngIf=\"wrappedData.state === 'error'\">\n <p class=\"error-text\">Etwas ist schief gelaufen.</p>\n </div>\n <div class=\"scroll\" *ngIf=\"wrappedData.state === 'success'\">\n <ng-container *ngIf=\"(data | async) as d\">\n <metaqs2-node-entry\n *ngFor=\"let node of DEFAULT_LIMIT < (d?.total || 0) && !showAll ? $any(d.materials || d.collections)?.slice(0, DEFAULT_LIMIT) : (d.materials || d.collections)\"\n [node]=\"node\"\n (edit)=\"editNode(node)\"\n ></metaqs2-node-entry>\n <div *ngIf=\"!d.total\">\n <div class=\"all-done\">\n <p class=\"all-done-emoji\">\uD83E\uDD73</p>\n <p class=\"all-done-text\">Keine Elemente ausstehend</p>\n </div>\n </div>\n <button *ngIf=\"DEFAULT_LIMIT < (d?.total || 0) && !showAll\" (click)=\"showAll = true\" color=\"primary\" mat-button>\n Alle Elemente anzeigen <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </mat-card>\n</div>\n", styles: [".while-loading{filter:blur(2px)}.wrapper{width:100%;height:100%}.wrapper mat-card{display:flex;flex-direction:column;width:100%;height:100%;padding:0;box-shadow:none}.wrapper mat-card ::ng-deep mat-card-header{align-items:center}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text{flex-grow:1;margin:0}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title{padding-top:20px;font-size:120%}.wrapper mat-card ::ng-deep mat-card-header .mat-card-header-text mat-card-title .count{font-size:80%;color:#888}.wrapper mat-card .count-slider{display:flex;flex-direction:column;width:100%}.wrapper mat-card .count-slider>label{padding:0 20px;font-size:90%}.wrapper mat-card .count-slider>mat-slider{width:100%}.wrapper mat-card mat-spinner{flex-grow:1;display:flex;align-self:center;justify-self:center;margin-top:20%}.wrapper mat-card .scroll{flex-grow:1;overflow-y:auto}.wrapper mat-card .scroll>button{display:flex;margin:auto}.wrapper mat-card .scroll .all-done{display:flex;flex-direction:column;align-items:center}.wrapper mat-card .scroll .all-done .all-done-emoji{font-size:72px;margin-bottom:20px}.wrapper mat-card .scroll .all-done .all-done-text{text-align:center;font-size:1.3em;color:var(--font-light)}.wrapper mat-card .error{border:#d00 solid 2px;background-color:#d005;display:flex;flex-direction:column;align-items:center}.wrapper mat-card .error .error-text{font-size:1.3em}\n"] }]
99
103
  }], ctorParameters: () => [{ type: i1.CollectionAPIService }], propDecorators: { mode: [{
100
104
  type: Input
101
105
  }], type: [{
@@ -105,4 +109,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
105
109
  }], countChanged: [{
106
110
  type: Output
107
111
  }] } });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL25vZGUtbGlzdC9ub2RlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWV0YS13aWRnZXRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvbm9kZS1saXN0L25vZGUtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBbUIsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7OztBQU9sRSxNQUFNLE9BQU8saUJBQWlCO0lBMkI1QixZQUFvQixvQkFBMEM7UUFBMUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQTFCdEQsUUFBRyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBSTFDOztXQUVHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXBEOztXQUVHO1FBQ00sa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFNUIsU0FBSSxHQUFHLElBQUksZUFBZSxDQUN4QixTQUFTLENBQ1YsQ0FBQztRQUNGLDRGQUE0RjtRQUM1RixVQUFLLEdBQWtCLENBQUMsQ0FBQztRQUVqQixlQUFVLEdB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c0JBQXBCLEtBQUs7Z0JBSUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbGxlY3Rpb25BUElTZXJ2aWNlLCBDb2xsZWN0aW9uV2l0aE1pc3NpbmdBdHRyaWJ1dGVzLCBNYXRlcmlhbFdpdGhNaXNzaW5nQXR0cmlidXRlcyB9IGZyb20gJy4uLy4uL2phdmEtYXBpJztcbmltcG9ydCB7IFdyYXBwZWRSZXNwb25zZSwgd3JhcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vd3JhcC1vYnNlcnZhYmxlLnBpcGUnO1xuaW1wb3J0IHsgQ29uZmlnSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbmZpZy1oZWxwZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21ldGFxczItbm9kZS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBlbnYgPSBpbmplY3QoQ29uZmlnSGVscGVyU2VydmljZSk7XG4gIEBJbnB1dCgpIG1vZGU6IHN0cmluZztcbiAgQElucHV0KCkgdHlwZTogJ21hdGVyaWFsJyB8ICdjb2xsZWN0aW9uJztcbiAgQElucHV0KCkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBvdXRwdXRzIHRoZSBjdXJyZW50IGNvdW50IG9mIG1hdGVyaWFscyBpbiB0aGlzIHZpZXdcbiAgICovXG4gIEBPdXRwdXQoKSBjb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKipcbiAgICogZGVmYXVsdCBtYXggY291bnQgb2Ygbm9kZXMgdGhhdCBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHJlYWRvbmx5IERFRkFVTFRfTElNSVQgPSAyNTtcbiAgd3JhcHBlZERhdGEkOiBPYnNlcnZhYmxlPFdyYXBwZWRSZXNwb25zZTwoTWF0ZXJpYWxXaXRoTWlzc2luZ0F0dHJpYnV0ZXMgfCBDb2xsZWN0aW9uV2l0aE1pc3NpbmdBdHRyaWJ1dGVzKVtdPj47XG4gIGRhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChNYXRlcmlhbFdpdGhNaXNzaW5nQXR0cmlidXRlcyB8IENvbGxlY3Rpb25XaXRoTWlzc2luZ0F0dHJpYnV0ZXMpW10gfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICAvLyByYXdEYXRhOiAoTWF0ZXJpYWxXaXRoTWlzc2luZ0F0dHJpYnV0ZXMgfCBDb2xsZWN0aW9uV2l0aE1pc3NpbmdBdHRyaWJ1dGVzKVtdIHwgdW5kZWZpbmVkO1xuICBjb3VudDogbnVtYmVyIHwgbnVsbCA9IDA7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLyoqXG4gICAqIHNob3VsZCBhbGwgbm9kZXMgYmUgc2hvd24/XG4gICAqL1xuICBzaG93QWxsID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb2xsZWN0aW9uQVBJU2VydmljZTogQ29sbGVjdGlvbkFQSVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkKSA9PiB0aGlzLmNvdW50Q2hhbmdlZC5uZXh0KGQ/Lmxlbmd0aCB8fCAwKSk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbklkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICBsZXQgZ2V0QnlNaXNzaW5nQXR0cmlidXRlID0gKCk6IE9ic2VydmFibGU8KE1hdGVyaWFsV2l0aE1pc3NpbmdBdHRyaWJ1dGVzIHwgQ29sbGVjdGlvbldpdGhNaXNzaW5nQXR0cmlidXRlcylbXT4gPT4ge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uQVBJU2VydmljZS5nZXRNYXRlcmlhbHNXaXRoTWlzc2luZ0F0dHJpYnV0ZSh0aGlzLmNvbGxlY3Rpb25JZCwgdGhpcy5tb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25BUElTZXJ2aWNlLmdldENvbGxlY3Rpb25zV2l0aE1pc3NpbmdBdHRyaWJ1dGUodGhpcy5jb2xsZWN0aW9uSWQsIHRoaXMubW9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHJlc2V0IGFsbCBkYXRhIGJlZm9yZSBzd2l0Y2hpbmdcbiAgICB0aGlzLmRhdGEubmV4dCh1bmRlZmluZWQpO1xuICAgIC8vdGhpcy5yYXdEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMud3JhcHBlZERhdGEkID0gZ2V0QnlNaXNzaW5nQXR0cmlidXRlKCkucGlwZSh3cmFwUmVzcG9uc2UoKSwgc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuZGF0YS5uZXh0KFxuICAgICAgYXdhaXQgdGhpcy53cmFwcGVkRGF0YSRcbiAgICAgICAgLnBpcGUobWFwKCh3cmFwcGVkRGF0YSkgPT4gKHdyYXBwZWREYXRhLnN0YXRlID09PSAnc3VjY2VzcycgPyB3cmFwcGVkRGF0YS5kYXRhIDogdW5kZWZpbmVkKSkpXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICk7XG4gICAgLy90aGlzLnJhd0RhdGEgPSB0aGlzLmRhdGEudmFsdWU/LnNsaWNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBAVE9ETzogQ291bnQgbW9kZVxuICAgICAqL1xuICAgIC8qXG4gICAgICAgIGlmICg/KSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb3VudCgpO1xuICAgICAgICB9XG4gICAgICAgICAqL1xuICB9XG5cbiAgZWRpdE5vZGUobm9kZTogTWF0ZXJpYWxXaXRoTWlzc2luZ0F0dHJpYnV0ZXMgfCBDb2xsZWN0aW9uV2l0aE1pc3NpbmdBdHRyaWJ1dGVzKSB7XG4gICAgbGV0IGFjdGlvbjogc3RyaW5nO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd3aXRob3V0X2xpY2Vuc2UnKSB7XG4gICAgICBhY3Rpb24gPSAnT1BUSU9OUy5MSUNFTlNFJztcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aW9uID0gJ09QVElPTlMuRURJVCc7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSBub2RlLm5vZGVfaWQhITtcbiAgICBjb25zdCB3aW4gPSB3aW5kb3cub3BlbihcbiAgICAgIHRoaXMuZW52LmVkdVNoYXJpbmdQYXRoICtcbiAgICAgICAgJy9jb21wb25lbnRzL2VkaXRvcmlhbC1kZXNrP21vZGU9YXVkaXQmdmlld1R5cGU9c2luZ2xlJmlkcz0nICtcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSArXG4gICAgICAgICcmYWN0aW9uPScgK1xuICAgICAgICBhY3Rpb25cbiAgICApO1xuICB9XG5cbiAgZmlsdGVyQ291bnQoKSB7XG4gICAgLy8gQFRPRE9cbiAgICAvLyB0aGlzLmRhdGEgPSB0aGlzLnJhd0RhdGE/LmZpbHRlcigoZCkgPT4gKGQgYXMgTWF0ZXJpYWxDb3VudHMpLm1hdGVyaWFsc19jb3VudCA8PSAodGhpcy5jb3VudCA/PyAwKSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gIDxtYXQtY2FyZCAqbmdJZj1cIm1vZGVcIj5cbiAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgPG1hdC1jYXJkLXRpdGxlPlxuICAgICAgICB7eyAnaXNzdWVzLicgKyBtb2RlICB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCIgKm5nSWY9XCIoZGF0YSB8IGFzeW5jKSBhcyBkXCI+KHt7IGQubGVuZ3RoIHx8IDAgfX0pPC9zcGFuPlxuICAgICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhKGRhdGEgfCBhc3luYylcIiAoY2xpY2spPVwicmVmcmVzaCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgIDwhLS0gQFRPRE8gLS0+XG4gICAgPGRpdiAqbmdJZj1cInR5cGUgPT09ICdjb2xsZWN0aW9uJyAmJiBtb2RlID09PSAnVE9ET19jb3VudCdcIiBjbGFzcz1cImNvdW50LXNsaWRlclwiPlxuICAgICAgPGxhYmVsPlNhbW1sdW5nZW4gbWl0IHt7IGNvdW50IH19IG9kZXIgd2VuaWdlciBJbmhhbHRlbjwvbGFiZWw+XG4gICAgICA8bWF0LXNsaWRlclxuICAgICAgICBbc2hvd1RpY2tNYXJrc109XCJ0cnVlXCJcbiAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICBbbmdNb2RlbF09XCJjb3VudFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNvdW50ID0gJGV2ZW50OyBmaWx0ZXJDb3VudCgpXCJcbiAgICAgICAgbWluPVwiMFwiXG4gICAgICAgIG1heD1cIjEwXCJcbiAgICAgID48L21hdC1zbGlkZXI+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndyYXBwZWREYXRhJCB8IGFzeW5jIGFzIHdyYXBwZWREYXRhXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJ3cmFwcGVkRGF0YS5zdGF0ZSA9PT0gJ2xvYWRpbmcnXCIgZGlhbWV0ZXI9XCI0MFwiIGNvbG9yPVwicHJpbWFyeVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JcIiAqbmdJZj1cIndyYXBwZWREYXRhLnN0YXRlID09PSAnZXJyb3InXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiZXJyb3ItdGV4dFwiPkV0d2FzIGlzdCBzY2hpZWYgZ2VsYXVmZW4uPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsXCIgKm5nSWY9XCJ3cmFwcGVkRGF0YS5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZGF0YSB8IGFzeW5jKSBhcyBkXCI+XG4gICAgICAgICAgPG1ldGFxczItbm9kZS1lbnRyeVxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgREVGQVVMVF9MSU1JVCA8IGQubGVuZ3RoICYmICFzaG93QWxsID8gZC5zbGljZSgwLCBERUZBVUxUX0xJTUlUKSA6IGRcIlxuICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAoZWRpdCk9XCJlZGl0Tm9kZShub2RlKVwiXG4gICAgICAgICAgPjwvbWV0YXFzMi1ub2RlLWVudHJ5PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZC5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGwtZG9uZVwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImFsbC1kb25lLWVtb2ppXCI+8J+lszwvcD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhbGwtZG9uZS10ZXh0XCI+S2VpbmUgRWxlbWVudGUgYXVzc3RlaGVuZDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJERUZBVUxUX0xJTUlUIDwgZC5sZW5ndGggJiYgIXNob3dBbGxcIiAoY2xpY2spPVwic2hvd0FsbCA9IHRydWVcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtYnV0dG9uPlxuICAgICAgICAgICAgQWxsZSBFbGVtZW50ZSBhbnplaWdlbiA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LWNhcmQ+XG48L2Rpdj5cbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL25vZGUtbGlzdC9ub2RlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWV0YS13aWRnZXRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvbm9kZS1saXN0L25vZGUtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTzdELE9BQU8sRUFBbUIsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7OztBQU9sRSxNQUFNLE9BQU8saUJBQWlCO0lBNkI1QixZQUFvQixvQkFBMEM7UUFBMUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQTVCdEQsUUFBRyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBSTFDOztXQUVHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXBEOztXQUVHO1FBQ00sa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEdBQUcsQ0FBQztRQUUzQixTQUFJLEdBQUcsSUFBSSxlQUFlLENBQXFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLDRGQUE0RjtR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aUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLG1CQUFtQjt5RkFNcEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb2xsZWN0aW9uQVBJU2VydmljZSxcbiAgQ29sbGVjdGlvbldpdGhNaXNzaW5nQXR0cmlidXRlcyxcbiAgTWF0ZXJpYWxXaXRoTWlzc2luZ0F0dHJpYnV0ZXMsXG4gIE1pc3NpbmdBdHRyaWJ1dGVSZXN1bHQsXG59IGZyb20gJy4uLy4uL2phdmEtYXBpJztcbmltcG9ydCB7IFdyYXBwZWRSZXNwb25zZSwgd3JhcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vd3JhcC1vYnNlcnZhYmxlLnBpcGUnO1xuaW1wb3J0IHsgQ29uZmlnSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbmZpZy1oZWxwZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21ldGFxczItbm9kZS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBlbnYgPSBpbmplY3QoQ29uZmlnSGVscGVyU2VydmljZSk7XG4gIEBJbnB1dCgpIG1vZGU6IHN0cmluZztcbiAgQElucHV0KCkgdHlwZTogJ21hdGVyaWFsJyB8ICdjb2xsZWN0aW9uJztcbiAgQElucHV0KCkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBvdXRwdXRzIHRoZSBjdXJyZW50IGNvdW50IG9mIG1hdGVyaWFscyBpbiB0aGlzIHZpZXdcbiAgICovXG4gIEBPdXRwdXQoKSBjb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKipcbiAgICogZGVmYXVsdCBtYXggY291bnQgb2Ygbm9kZXMgdGhhdCBzaG91bGQgYmUgc2hvd24gaW4gdmlld1xuICAgKi9cbiAgcmVhZG9ubHkgREVGQVVMVF9MSU1JVCA9IDI1O1xuICAvKipcbiAgICogZGVmYXVsdCBjb3VudCB0byBmZXRjaCBmcm9tIGFwaVxuICAgKi9cbiAgcmVhZG9ubHkgRkVUQ0hfTElNSVQgPSAyMDA7XG4gIHdyYXBwZWREYXRhJDogT2JzZXJ2YWJsZTxXcmFwcGVkUmVzcG9uc2U8TWlzc2luZ0F0dHJpYnV0ZVJlc3VsdD4+O1xuICBkYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNaXNzaW5nQXR0cmlidXRlUmVzdWx0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAvLyByYXdEYXRhOiAoTWF0ZXJpYWxXaXRoTWlzc2luZ0F0dHJpYnV0ZXMgfCBDb2xsZWN0aW9uV2l0aE1pc3NpbmdBdHRyaWJ1dGVzKVtdIHwgdW5kZWZpbmVkO1xuICBjb3VudDogbnVtYmVyIHwgbnVsbCA9IDA7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLyoqXG4gICAqIHNob3VsZCBhbGwgbm9kZXMgYmUgc2hvd24/XG4gICAqL1xuICBzaG93QWxsID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb2xsZWN0aW9uQVBJU2VydmljZTogQ29sbGVjdGlvbkFQSVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkKSA9PiB0aGlzLmNvdW50Q2hhbmdlZC5uZXh0KGQ/LnRvdGFsIHx8IDApKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbklkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICBsZXQgZ2V0QnlNaXNzaW5nQXR0cmlidXRlID0gKCk6IE9ic2VydmFibGU8TWlzc2luZ0F0dHJpYnV0ZVJlc3VsdD4gPT4ge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uQVBJU2VydmljZS5nZXRNYXRlcmlhbHNXaXRoTWlzc2luZ0F0dHJpYnV0ZShcbiAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICB0aGlzLm1vZGUsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLkZFVENIX0xJTUlUXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uQVBJU2VydmljZS5nZXRDb2xsZWN0aW9uc1dpdGhNaXNzaW5nQXR0cmlidXRlKFxuICAgICAgICAgIHRoaXMuY29sbGVjdGlvbklkLFxuICAgICAgICAgIHRoaXMubW9kZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHRoaXMuRkVUQ0hfTElNSVRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gcmVzZXQgYWxsIGRhdGEgYmVmb3JlIHN3aXRjaGluZ1xuICAgIHRoaXMuZGF0YS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgLy90aGlzLnJhd0RhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53cmFwcGVkRGF0YSQgPSBnZXRCeU1pc3NpbmdBdHRyaWJ1dGUoKS5waXBlKHdyYXBSZXNwb25zZSgpLCBzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5kYXRhLm5leHQoXG4gICAgICBhd2FpdCB0aGlzLndyYXBwZWREYXRhJFxuICAgICAgICAucGlwZShtYXAoKHdyYXBwZWREYXRhKSA9PiAod3JhcHBlZERhdGEuc3RhdGUgPT09ICdzdWNjZXNzJyA/IHdyYXBwZWREYXRhLmRhdGEgOiB1bmRlZmluZWQpKSlcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgICAvL3RoaXMucmF3RGF0YSA9IHRoaXMuZGF0YS52YWx1ZT8uc2xpY2UoKTtcblxuICAgIC8qKlxuICAgICAqIEBUT0RPOiBDb3VudCBtb2RlXG4gICAgICovXG4gICAgLypcbiAgICAgICAgaWYgKD8pIHtcbiAgICAgICAgICB0aGlzLmZpbHRlckNvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgICovXG4gIH1cblxuICBlZGl0Tm9kZShub2RlOiBNYXRlcmlhbFdpdGhNaXNzaW5nQXR0cmlidXRlcyB8IENvbGxlY3Rpb25XaXRoTWlzc2luZ0F0dHJpYnV0ZXMpIHtcbiAgICBsZXQgYWN0aW9uOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3dpdGhvdXRfbGljZW5zZScpIHtcbiAgICAgIGFjdGlvbiA9ICdPUFRJT05TLkxJQ0VOU0UnO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3Rpb24gPSAnT1BUSU9OUy5FRElUJztcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IG5vZGUubm9kZV9pZCEhO1xuICAgIHdpbmRvdy5vcGVuKFxuICAgICAgdGhpcy5lbnYuZWR1U2hhcmluZ1BhdGggK1xuICAgICAgICAnL2NvbXBvbmVudHMvZWRpdG9yaWFsLWRlc2s/bW9kZT1hdWRpdCZ2aWV3VHlwZT1zaW5nbGUmaWRzPScgK1xuICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoaWQpICtcbiAgICAgICAgJyZhY3Rpb249JyArXG4gICAgICAgIGFjdGlvblxuICAgICk7XG4gIH1cblxuICBmaWx0ZXJDb3VudCgpIHtcbiAgICAvLyBAVE9ET1xuICAgIC8vIHRoaXMuZGF0YSA9IHRoaXMucmF3RGF0YT8uZmlsdGVyKChkKSA9PiAoZCBhcyBNYXRlcmlhbENvdW50cykubWF0ZXJpYWxzX2NvdW50IDw9ICh0aGlzLmNvdW50ID8/IDApKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgPG1hdC1jYXJkICpuZ0lmPVwibW9kZVwiPlxuICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICAgIHt7ICdpc3N1ZXMuJyArIG1vZGUgIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIiAqbmdJZj1cIihkYXRhIHwgYXN5bmMpIGFzIGRcIj4oe3sgZC50b3RhbCB8fCAwIH19KTwvc3Bhbj5cbiAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIShkYXRhIHwgYXN5bmMpXCIgKGNsaWNrKT1cInJlZnJlc2goKVwiPlxuICAgICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICA8IS0tIEBUT0RPIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnY29sbGVjdGlvbicgJiYgbW9kZSA9PT0gJ1RPRE9fY291bnQnXCIgY2xhc3M9XCJjb3VudC1zbGlkZXJcIj5cbiAgICAgIDxsYWJlbD5TYW1tbHVuZ2VuIG1pdCB7eyBjb3VudCB9fSBvZGVyIHdlbmlnZXIgSW5oYWx0ZW48L2xhYmVsPlxuICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgW3Nob3dUaWNrTWFya3NdPVwidHJ1ZVwiXG4gICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgW25nTW9kZWxdPVwiY291bnRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjb3VudCA9ICRldmVudDsgZmlsdGVyQ291bnQoKVwiXG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBtYXg9XCIxMFwiXG4gICAgICA+PC9tYXQtc2xpZGVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3cmFwcGVkRGF0YSQgfCBhc3luYyBhcyB3cmFwcGVkRGF0YVwiPlxuICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwid3JhcHBlZERhdGEuc3RhdGUgPT09ICdsb2FkaW5nJ1wiIGRpYW1ldGVyPVwiNDBcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1zcGlubmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCJ3cmFwcGVkRGF0YS5zdGF0ZSA9PT0gJ2Vycm9yJ1wiPlxuICAgICAgICA8cCBjbGFzcz1cImVycm9yLXRleHRcIj5FdHdhcyBpc3Qgc2NoaWVmIGdlbGF1ZmVuLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbFwiICpuZ0lmPVwid3JhcHBlZERhdGEuc3RhdGUgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGRhdGEgfCBhc3luYykgYXMgZFwiPlxuICAgICAgICAgIDxtZXRhcXMyLW5vZGUtZW50cnlcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIERFRkFVTFRfTElNSVQgPCAoZD8udG90YWwgfHwgMCkgJiYgIXNob3dBbGwgPyAkYW55KGQubWF0ZXJpYWxzIHx8IGQuY29sbGVjdGlvbnMpPy5zbGljZSgwLCBERUZBVUxUX0xJTUlUKSA6IChkLm1hdGVyaWFscyB8fCBkLmNvbGxlY3Rpb25zKVwiXG4gICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgIChlZGl0KT1cImVkaXROb2RlKG5vZGUpXCJcbiAgICAgICAgICA+PC9tZXRhcXMyLW5vZGUtZW50cnk+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFkLnRvdGFsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxsLWRvbmVcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhbGwtZG9uZS1lbW9qaVwiPvCfpbM8L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxsLWRvbmUtdGV4dFwiPktlaW5lIEVsZW1lbnRlIGF1c3N0ZWhlbmQ8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiREVGQVVMVF9MSU1JVCA8IChkPy50b3RhbCB8fCAwKSAmJiAhc2hvd0FsbFwiIChjbGljayk9XCJzaG93QWxsID0gdHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1idXR0b24+XG4gICAgICAgICAgICBBbGxlIEVsZW1lbnRlIGFuemVpZ2VuIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9tYXQtY2FyZD5cbjwvZGl2PlxuIl19