@myrmidon/cadmus-refs-asserted-ids 1.0.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/esm2022/lib/asserted-id/asserted-id.component.mjs +133 -0
  2. package/esm2022/lib/asserted-ids/asserted-ids.component.mjs +147 -0
  3. package/esm2022/lib/cadmus-refs-asserted-ids.module.mjs +92 -0
  4. package/esm2022/lib/scoped-pin-lookup/scoped-pin-lookup.component.mjs +130 -0
  5. package/esm2022/lib/services/pin-ref-lookup.service.mjs +73 -0
  6. package/{esm2020 → esm2022}/myrmidon-cadmus-refs-asserted-ids.mjs +4 -4
  7. package/{esm2020 → esm2022}/public-api.mjs +8 -8
  8. package/{fesm2020 → fesm2022}/myrmidon-cadmus-refs-asserted-ids.mjs +500 -498
  9. package/fesm2022/myrmidon-cadmus-refs-asserted-ids.mjs.map +1 -0
  10. package/index.d.ts +5 -5
  11. package/lib/asserted-id/asserted-id.component.d.ts +49 -50
  12. package/lib/asserted-ids/asserted-ids.component.d.ts +44 -44
  13. package/lib/cadmus-refs-asserted-ids.module.d.ts +22 -22
  14. package/lib/scoped-pin-lookup/scoped-pin-lookup.component.d.ts +39 -39
  15. package/lib/services/pin-ref-lookup.service.d.ts +18 -18
  16. package/package.json +8 -14
  17. package/public-api.d.ts +5 -5
  18. package/esm2020/lib/asserted-id/asserted-id.component.mjs +0 -130
  19. package/esm2020/lib/asserted-ids/asserted-ids.component.mjs +0 -146
  20. package/esm2020/lib/cadmus-refs-asserted-ids.module.mjs +0 -91
  21. package/esm2020/lib/scoped-pin-lookup/scoped-pin-lookup.component.mjs +0 -129
  22. package/esm2020/lib/services/pin-ref-lookup.service.mjs +0 -72
  23. package/fesm2015/myrmidon-cadmus-refs-asserted-ids.mjs +0 -552
  24. package/fesm2015/myrmidon-cadmus-refs-asserted-ids.mjs.map +0 -1
  25. package/fesm2020/myrmidon-cadmus-refs-asserted-ids.mjs.map +0 -1
@@ -1,129 +0,0 @@
1
- import { Component, EventEmitter, Inject, Output } from '@angular/core';
2
- import { Validators, } from '@angular/forms';
3
- import { forkJoin, take } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- import * as i2 from "@myrmidon/cadmus-api";
7
- import * as i3 from "../services/pin-ref-lookup.service";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "@angular/material/button";
10
- import * as i6 from "@angular/material/expansion";
11
- import * as i7 from "@angular/material/form-field";
12
- import * as i8 from "@angular/material/icon";
13
- import * as i9 from "@angular/material/input";
14
- import * as i10 from "@angular/material/select";
15
- import * as i11 from "@angular/material/core";
16
- import * as i12 from "@myrmidon/cadmus-refs-lookup";
17
- // from Cadmus general parts
18
- const METADATA_PART_ID = 'it.vedph.metadata';
19
- /*
20
- * Scoped pin-based lookup component. This component provides a list
21
- * of pin-based searches, with a lookup control. Whenever the user
22
- * picks a pin value, he gets the details about its item and part, and
23
- * item's metadata part, if any. He can then use these data to build
24
- * some EID by variously assembling these components.
25
- */
26
- export class ScopedPinLookupComponent {
27
- constructor(formBuilder, _itemService, lookupService, lookupDefs) {
28
- this._itemService = _itemService;
29
- this.lookupService = lookupService;
30
- this.lookupDefs = lookupDefs;
31
- // lookup
32
- // keys are all the defined lookup searches
33
- this.keys = Object.keys(lookupDefs);
34
- // the selected key defines the lookup scope
35
- this.key = formBuilder.control(null);
36
- this.keyForm = formBuilder.group({
37
- key: this.key,
38
- });
39
- // id
40
- this.id = formBuilder.control(null, [
41
- Validators.required,
42
- Validators.maxLength(300),
43
- ]);
44
- this.idForm = formBuilder.group({
45
- id: this.id,
46
- });
47
- // event
48
- this.idPick = new EventEmitter();
49
- }
50
- ngOnInit() {
51
- // pre-select a unique key
52
- if (this.keys.length === 1) {
53
- this.key.setValue(this.keys[0]);
54
- this.key.markAsDirty();
55
- this.key.updateValueAndValidity();
56
- }
57
- }
58
- onItemChange(item) {
59
- const info = {
60
- pin: item,
61
- };
62
- // lookup item and its metadata part if any
63
- forkJoin({
64
- item: this._itemService.getItem(item.itemId, false),
65
- part: this._itemService.getPartFromTypeAndRole(item.itemId, METADATA_PART_ID),
66
- })
67
- .pipe(take(1))
68
- .subscribe({
69
- next: (result) => {
70
- info.item = result.item;
71
- info.part = result.part;
72
- this.info = info;
73
- },
74
- error: (error) => {
75
- console.error(error ? JSON.stringify(error) : 'Error loading item/metadata');
76
- },
77
- });
78
- }
79
- appendIdComponent(type, metaIndex = -1) {
80
- let id = this.id.value || '';
81
- switch (type) {
82
- case 'pin':
83
- id += this.info?.pin.value;
84
- break;
85
- case 'itemId':
86
- id += this.info.item?.id || '';
87
- break;
88
- case 'partId':
89
- id += this.info.part?.id || '';
90
- break;
91
- case 'partTypeId':
92
- id += this.info.part?.typeId || '';
93
- break;
94
- case 'partRoleId':
95
- id += this.info.part?.roleId || '';
96
- break;
97
- case 'metadata':
98
- id += this.info.part.metadata[metaIndex].value;
99
- break;
100
- }
101
- this.id.setValue(id);
102
- this.id.markAsDirty();
103
- this.id.updateValueAndValidity();
104
- }
105
- pickId() {
106
- if (this.idForm.invalid) {
107
- return;
108
- }
109
- this.idPick.emit(this.id.value);
110
- this.info = undefined;
111
- }
112
- resetId() {
113
- this.id.reset();
114
- this.id.markAsDirty();
115
- this.id.updateValueAndValidity();
116
- }
117
- }
118
- ScopedPinLookupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: ScopedPinLookupComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ItemService }, { token: i3.PinRefLookupService }, { token: 'indexLookupDefinitions' }], target: i0.ɵɵFactoryTarget.Component });
119
- ScopedPinLookupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: ScopedPinLookupComponent, selector: "cadmus-scoped-pin-lookup", outputs: { idPick: "idPick" }, ngImport: i0, template: "<div>\n <!-- lookup -->\n <div>\n <form [formGroup]=\"keyForm\" class=\"form-row\">\n <!-- key -->\n <mat-form-field *ngIf=\"keys.length > 1\">\n <mat-label>type</mat-label>\n <mat-select [formControl]=\"key\">\n <mat-option *ngFor=\"let k of keys\" [value]=\"k\">{{ k }}</mat-option>\n </mat-select>\n <mat-error\n *ngIf=\"$any(key).errors?.required && (key.dirty || key.touched)\"\n >type required</mat-error\n >\n </mat-form-field>\n <cadmus-ref-lookup\n [service]=\"lookupService\"\n label=\"pin\"\n [options]=\"key.value ? lookupDefs[key.value] : undefined\"\n (itemChange)=\"onItemChange($event)\"\n ></cadmus-ref-lookup>\n </form>\n </div>\n\n <!-- builder -->\n <mat-expansion-panel *ngIf=\"info\" [expanded]=\"info\" [disabled]=\"!info\">\n <mat-expansion-panel-header>ID builder</mat-expansion-panel-header>\n <!-- ID -->\n <div>\n <form [formGroup]=\"idForm\" (submit)=\"pickId()\">\n <mat-form-field style=\"width: 100%\">\n <input matInput [formControl]=\"id\" />\n <mat-error\n *ngIf=\"$any(id).errors?.required && (id.dirty || id.touched)\"\n >ID required</mat-error\n >\n <mat-error\n *ngIf=\"$any(id).errors?.maxLength && (id.dirty || id.touched)\"\n >ID too long</mat-error\n >\n <button\n mat-icon-button\n type=\"button\"\n matSuffix\n (click)=\"resetId()\"\n [disabled]=\"!id.value\"\n >\n <mat-icon color=\"warn\">close</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n matSuffix\n (click)=\"pickId()\"\n [disabled]=\"idForm.invalid\"\n >\n <mat-icon color=\"primary\">check_circle</mat-icon>\n </button>\n </mat-form-field>\n </form>\n </div>\n <!-- table -->\n <table>\n <thead>\n <th></th>\n <th>source</th>\n <th>value</th>\n </thead>\n <tbody>\n <!-- pin -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('pin')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>pin</td>\n <td>{{ info!.pin.value }}</td>\n </tr>\n <!-- item ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('itemId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>item ID</td>\n <td>{{ info!.item?.id }}</td>\n </tr>\n <!-- item title -->\n <tr>\n <td></td>\n <td>item title</td>\n <td>{{ info!.item?.title }}</td>\n </tr>\n <!-- part ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part ID</td>\n <td>{{ info!.part?.id }}</td>\n </tr>\n <!-- part type ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partTypeId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part type ID</td>\n <td>{{ info!.part?.typeId }}</td>\n </tr>\n <!-- part role ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partRoleId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part role ID</td>\n <td>{{ info!.part?.roleId }}</td>\n </tr>\n\n <!-- part's metadata -->\n <tr *ngFor=\"let m of info!.part?.metadata; let i = index\">\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('metadata', i)\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td class=\"metadata\">{{ m.name }}</td>\n <td class=\"metadata\">{{ m.value }}</td>\n </tr>\n </tbody>\n </table>\n </mat-expansion-panel>\n</div>\n", styles: [".metadata{color:#4a3001}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.RefLookupComponent, selector: "cadmus-ref-lookup", inputs: ["label", "limit", "baseFilter", "service", "item", "required", "hasMore", "linkTemplate", "optDialog", "options"], outputs: ["itemChange", "moreRequest"] }] });
120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: ScopedPinLookupComponent, decorators: [{
121
- type: Component,
122
- args: [{ selector: 'cadmus-scoped-pin-lookup', template: "<div>\n <!-- lookup -->\n <div>\n <form [formGroup]=\"keyForm\" class=\"form-row\">\n <!-- key -->\n <mat-form-field *ngIf=\"keys.length > 1\">\n <mat-label>type</mat-label>\n <mat-select [formControl]=\"key\">\n <mat-option *ngFor=\"let k of keys\" [value]=\"k\">{{ k }}</mat-option>\n </mat-select>\n <mat-error\n *ngIf=\"$any(key).errors?.required && (key.dirty || key.touched)\"\n >type required</mat-error\n >\n </mat-form-field>\n <cadmus-ref-lookup\n [service]=\"lookupService\"\n label=\"pin\"\n [options]=\"key.value ? lookupDefs[key.value] : undefined\"\n (itemChange)=\"onItemChange($event)\"\n ></cadmus-ref-lookup>\n </form>\n </div>\n\n <!-- builder -->\n <mat-expansion-panel *ngIf=\"info\" [expanded]=\"info\" [disabled]=\"!info\">\n <mat-expansion-panel-header>ID builder</mat-expansion-panel-header>\n <!-- ID -->\n <div>\n <form [formGroup]=\"idForm\" (submit)=\"pickId()\">\n <mat-form-field style=\"width: 100%\">\n <input matInput [formControl]=\"id\" />\n <mat-error\n *ngIf=\"$any(id).errors?.required && (id.dirty || id.touched)\"\n >ID required</mat-error\n >\n <mat-error\n *ngIf=\"$any(id).errors?.maxLength && (id.dirty || id.touched)\"\n >ID too long</mat-error\n >\n <button\n mat-icon-button\n type=\"button\"\n matSuffix\n (click)=\"resetId()\"\n [disabled]=\"!id.value\"\n >\n <mat-icon color=\"warn\">close</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n matSuffix\n (click)=\"pickId()\"\n [disabled]=\"idForm.invalid\"\n >\n <mat-icon color=\"primary\">check_circle</mat-icon>\n </button>\n </mat-form-field>\n </form>\n </div>\n <!-- table -->\n <table>\n <thead>\n <th></th>\n <th>source</th>\n <th>value</th>\n </thead>\n <tbody>\n <!-- pin -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('pin')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>pin</td>\n <td>{{ info!.pin.value }}</td>\n </tr>\n <!-- item ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('itemId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>item ID</td>\n <td>{{ info!.item?.id }}</td>\n </tr>\n <!-- item title -->\n <tr>\n <td></td>\n <td>item title</td>\n <td>{{ info!.item?.title }}</td>\n </tr>\n <!-- part ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part ID</td>\n <td>{{ info!.part?.id }}</td>\n </tr>\n <!-- part type ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partTypeId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part type ID</td>\n <td>{{ info!.part?.typeId }}</td>\n </tr>\n <!-- part role ID -->\n <tr>\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('partRoleId')\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td>part role ID</td>\n <td>{{ info!.part?.roleId }}</td>\n </tr>\n\n <!-- part's metadata -->\n <tr *ngFor=\"let m of info!.part?.metadata; let i = index\">\n <td>\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"appendIdComponent('metadata', i)\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </td>\n <td class=\"metadata\">{{ m.name }}</td>\n <td class=\"metadata\">{{ m.value }}</td>\n </tr>\n </tbody>\n </table>\n </mat-expansion-panel>\n</div>\n", styles: [".metadata{color:#4a3001}table{border:1px solid silver;border-radius:6px;padding:4px;margin-top:8px}tr:nth-child(odd){background-color:#f0f0f0}th{font-weight:400;text-align:left;color:silver}\n"] }]
123
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ItemService }, { type: i3.PinRefLookupService }, { type: undefined, decorators: [{
124
- type: Inject,
125
- args: ['indexLookupDefinitions']
126
- }] }]; }, propDecorators: { idPick: [{
127
- type: Output
128
- }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGVkLXBpbi1sb29rdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvc2NvcGVkLXBpbi1sb29rdXAvc2NvcGVkLXBpbi1sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvc2NvcGVkLXBpbi1sb29rdXAvc2NvcGVkLXBpbi1sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBSUwsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBSXRDLDRCQUE0QjtBQUM1QixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBZTdDOzs7Ozs7R0FNRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFhbkMsWUFDRSxXQUF3QixFQUNoQixZQUF5QixFQUMxQixhQUFrQyxFQUVsQyxVQUFrQztRQUhqQyxpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFFbEMsZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFFekMsU0FBUztRQUNULDJDQUEyQztRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FB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dXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJdGVtU2VydmljZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtYXBpJztcblxuaW1wb3J0IHtcbiAgRGF0YVBpbkluZm8sXG4gIEluZGV4TG9va3VwRGVmaW5pdGlvbnMsXG4gIEl0ZW0sXG4gIFBhcnQsXG59IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgdGFrZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQaW5SZWZMb29rdXBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGluLXJlZi1sb29rdXAuc2VydmljZSc7XG5cbi8vIGZyb20gQ2FkbXVzIGdlbmVyYWwgcGFydHNcbmNvbnN0IE1FVEFEQVRBX1BBUlRfSUQgPSAnaXQudmVkcGgubWV0YWRhdGEnO1xuaW50ZXJmYWNlIE1ldGFkYXRhUGFydCBleHRlbmRzIFBhcnQge1xuICBtZXRhZGF0YToge1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIExvb2t1cEluZm8ge1xuICBwaW46IERhdGFQaW5JbmZvO1xuICBpdGVtPzogSXRlbTtcbiAgcGFydD86IE1ldGFkYXRhUGFydDtcbn1cblxuLypcbiAqIFNjb3BlZCBwaW4tYmFzZWQgbG9va3VwIGNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBsaXN0XG4gKiBvZiBwaW4tYmFzZWQgc2VhcmNoZXMsIHdpdGggYSBsb29rdXAgY29udHJvbC4gV2hlbmV2ZXIgdGhlIHVzZXJcbiAqIHBpY2tzIGEgcGluIHZhbHVlLCBoZSBnZXRzIHRoZSBkZXRhaWxzIGFib3V0IGl0cyBpdGVtIGFuZCBwYXJ0LCBhbmRcbiAqIGl0ZW0ncyBtZXRhZGF0YSBwYXJ0LCBpZiBhbnkuIEhlIGNhbiB0aGVuIHVzZSB0aGVzZSBkYXRhIHRvIGJ1aWxkXG4gKiBzb21lIEVJRCBieSB2YXJpb3VzbHkgYXNzZW1ibGluZyB0aGVzZSBjb21wb25lbnRzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjYWRtdXMtc2NvcGVkLXBpbi1sb29rdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2NvcGVkLXBpbi1sb29rdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY29wZWQtcGluLWxvb2t1cC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFNjb3BlZFBpbkxvb2t1cENvbXBvbmVudCB7XG4gIC8vIGxvb2t1cFxuICBwdWJsaWMga2V5OiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcbiAgcHVibGljIGtleUZvcm06IEZvcm1Hcm91cDtcbiAgcHVibGljIGtleXM6IHN0cmluZ1tdO1xuICBwdWJsaWMgaW5mbz86IExvb2t1cEluZm87XG4gIC8vIGJ1aWxkZXJcbiAgcHVibGljIGlkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcbiAgcHVibGljIGlkRm9ybTogRm9ybUdyb3VwO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgaWRQaWNrOiBFdmVudEVtaXR0ZXI8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxuICAgIHB1YmxpYyBsb29rdXBTZXJ2aWNlOiBQaW5SZWZMb29rdXBTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2luZGV4TG9va3VwRGVmaW5pdGlvbnMnKVxuICAgIHB1YmxpYyBsb29rdXBEZWZzOiBJbmRleExvb2t1cERlZmluaXRpb25zXG4gICkge1xuICAgIC8vIGxvb2t1cFxuICAgIC8vIGtleXMgYXJlIGFsbCB0aGUgZGVmaW5lZCBsb29rdXAgc2VhcmNoZXNcbiAgICB0aGlzLmtleXMgPSBPYmplY3Qua2V5cyhsb29rdXBEZWZzKTtcbiAgICAvLyB0aGUgc2VsZWN0ZWQga2V5IGRlZmluZXMgdGhlIGxvb2t1cCBzY29wZVxuICAgIHRoaXMua2V5ID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcbiAgICB0aGlzLmtleUZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBrZXk6IHRoaXMua2V5LFxuICAgIH0pO1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCksXG4gICAgXSk7XG4gICAgdGhpcy5pZEZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICB9KTtcbiAgICAvLyBldmVudFxuICAgIHRoaXMuaWRQaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBwcmUtc2VsZWN0IGEgdW5pcXVlIGtleVxuICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmtleS5zZXRWYWx1ZSh0aGlzLmtleXNbMF0pO1xuICAgICAgdGhpcy5rZXkubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMua2V5LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25JdGVtQ2hhbmdlKGl0ZW06IERhdGFQaW5JbmZvKTogdm9pZCB7XG4gICAgY29uc3QgaW5mbzogTG9va3VwSW5mbyA9IHtcbiAgICAgIHBpbjogaXRlbSxcbiAgICB9O1xuICAgIC8vIGxvb2t1cCBpdGVtIGFuZCBpdHMgbWV0YWRhdGEgcGFydCBpZiBhbnlcbiAgICBmb3JrSm9pbih7XG4gICAgICBpdGVtOiB0aGlzLl9pdGVtU2VydmljZS5nZXRJdGVtKGl0ZW0uaXRlbUlkLCBmYWxzZSksXG4gICAgICBwYXJ0OiB0aGlzLl9pdGVtU2VydmljZS5nZXRQYXJ0RnJvbVR5cGVBbmRSb2xlKFxuICAgICAgICBpdGVtLml0ZW1JZCxcbiAgICAgICAgTUVUQURBVEFfUEFSVF9JRFxuICAgICAgKSxcbiAgICB9KVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaW5mby5pdGVtID0gcmVzdWx0Lml0ZW07XG4gICAgICAgICAgaW5mby5wYXJ0ID0gcmVzdWx0LnBhcnQgYXMgTWV0YWRhdGFQYXJ0O1xuICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcikgOiAnRXJyb3IgbG9hZGluZyBpdGVtL21ldGFkYXRhJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRJZENvbXBvbmVudCh0eXBlOiBzdHJpbmcsIG1ldGFJbmRleCA9IC0xKTogdm9pZCB7XG4gICAgbGV0IGlkID0gdGhpcy5pZC52YWx1ZSB8fCAnJztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAncGluJzpcbiAgICAgICAgaWQgKz0gdGhpcy5pbmZvPy5waW4udmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRlbUlkJzpcbiAgICAgICAgaWQgKz0gdGhpcy5pbmZvIS5pdGVtPy5pZCB8fCAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYXJ0SWQnOlxuICAgICAgICBpZCArPSB0aGlzLmluZm8hLnBhcnQ/LmlkIHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BhcnRUeXBlSWQnOlxuICAgICAgICBpZCArPSB0aGlzLmluZm8hLnBhcnQ/LnR5cGVJZCB8fCAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYXJ0Um9sZUlkJzpcbiAgICAgICAgaWQgKz0gdGhpcy5pbmZvIS5wYXJ0Py5yb2xlSWQgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWV0YWRhdGEnOlxuICAgICAgICBpZCArPSB0aGlzLmluZm8hLnBhcnQhLm1ldGFkYXRhW21ldGFJbmRleF0udmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuaWQuc2V0VmFsdWUoaWQpO1xuICAgIHRoaXMuaWQubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmlkLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBwaWNrSWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaWRGb3JtLmludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pZFBpY2suZW1pdCh0aGlzLmlkLnZhbHVlISk7XG4gICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlc2V0SWQoKTogdm9pZCB7XG4gICAgdGhpcy5pZC5yZXNldCgpO1xuICAgIHRoaXMuaWQubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmlkLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPCEtLSBsb29rdXAgLS0+XG4gIDxkaXY+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJrZXlGb3JtXCIgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgPCEtLSBrZXkgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJrZXlzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPG1hdC1sYWJlbD50eXBlPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJrZXlcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgayBvZiBrZXlzXCIgW3ZhbHVlXT1cImtcIj57eyBrIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAqbmdJZj1cIiRhbnkoa2V5KS5lcnJvcnM/LnJlcXVpcmVkICYmIChrZXkuZGlydHkgfHwga2V5LnRvdWNoZWQpXCJcbiAgICAgICAgICA+dHlwZSByZXF1aXJlZDwvbWF0LWVycm9yXG4gICAgICAgID5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8Y2FkbXVzLXJlZi1sb29rdXBcbiAgICAgICAgW3NlcnZpY2VdPVwibG9va3VwU2VydmljZVwiXG4gICAgICAgIGxhYmVsPVwicGluXCJcbiAgICAgICAgW29wdGlvbnNdPVwia2V5LnZhbHVlID8gbG9va3VwRGVmc1trZXkudmFsdWVdIDogdW5kZWZpbmVkXCJcbiAgICAgICAgKGl0ZW1DaGFuZ2UpPVwib25JdGVtQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvY2FkbXVzLXJlZi1sb29rdXA+XG4gICAgPC9mb3JtPlxuICA8L2Rpdj5cblxuICA8IS0tIGJ1aWxkZXIgLS0+XG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0lmPVwiaW5mb1wiIFtleHBhbmRlZF09XCJpbmZvXCIgW2Rpc2FibGVkXT1cIiFpbmZvXCI+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPklEIGJ1aWxkZXI8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgIDwhLS0gSUQgLS0+XG4gICAgPGRpdj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiaWRGb3JtXCIgKHN1Ym1pdCk9XCJwaWNrSWQoKVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiaWRcIiAvPlxuICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShpZCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoaWQuZGlydHkgfHwgaWQudG91Y2hlZClcIlxuICAgICAgICAgICAgPklEIHJlcXVpcmVkPC9tYXQtZXJyb3JcbiAgICAgICAgICA+XG4gICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGlkKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAoaWQuZGlydHkgfHwgaWQudG91Y2hlZClcIlxuICAgICAgICAgICAgPklEIHRvbyBsb25nPC9tYXQtZXJyb3JcbiAgICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0SWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlkLnZhbHVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJ3YXJuXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIChjbGljayk9XCJwaWNrSWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaWRGb3JtLmludmFsaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gdGFibGUgLS0+XG4gICAgPHRhYmxlPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgPHRoPnNvdXJjZTwvdGg+XG4gICAgICAgIDx0aD52YWx1ZTwvdGg+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8IS0tIHBpbiAtLT5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwZW5kSWRDb21wb25lbnQoJ3BpbicpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+cGluPC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaW5mbyEucGluLnZhbHVlIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPCEtLSBpdGVtIElEIC0tPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBlbmRJZENvbXBvbmVudCgnaXRlbUlkJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5pdGVtIElEPC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaW5mbyEuaXRlbT8uaWQgfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8IS0tIGl0ZW0gdGl0bGUgLS0+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICA8dGQ+aXRlbSB0aXRsZTwvdGQ+XG4gICAgICAgICAgPHRkPnt7IGluZm8hLml0ZW0/LnRpdGxlIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPCEtLSBwYXJ0IElEIC0tPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBlbmRJZENvbXBvbmVudCgncGFydElkJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5wYXJ0IElEPC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaW5mbyEucGFydD8uaWQgfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8IS0tIHBhcnQgdHlwZSBJRCAtLT5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwZW5kSWRDb21wb25lbnQoJ3BhcnRUeXBlSWQnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPnBhcnQgdHlwZSBJRDwvdGQ+XG4gICAgICAgICAgPHRkPnt7IGluZm8hLnBhcnQ/LnR5cGVJZCB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDwhLS0gcGFydCByb2xlIElEIC0tPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBlbmRJZENvbXBvbmVudCgncGFydFJvbGVJZCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+cGFydCByb2xlIElEPC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaW5mbyEucGFydD8ucm9sZUlkIH19PC90ZD5cbiAgICAgICAgPC90cj5cblxuICAgICAgICA8IS0tIHBhcnQncyBtZXRhZGF0YSAtLT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBtIG9mIGluZm8hLnBhcnQ/Lm1ldGFkYXRhOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBlbmRJZENvbXBvbmVudCgnbWV0YWRhdGEnLCBpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwibWV0YWRhdGFcIj57eyBtLm5hbWUgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1ldGFkYXRhXCI+e3sgbS52YWx1ZSB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbjwvZGl2PlxuIl19
@@ -1,72 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { map, of } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@myrmidon/cadmus-api";
5
- /**
6
- * Cadmus pin-based lookup data service. The text being searched here is just
7
- * the pin's value, according to the options specified. These options correspond
8
- * to an index lookup definition. The resulting items are of type DataPinInfo.
9
- */
10
- export class PinRefLookupService {
11
- constructor(_itemService) {
12
- this._itemService = _itemService;
13
- }
14
- getName(item) {
15
- return item?.value || '';
16
- }
17
- buildQuery(def, text) {
18
- const sb = [];
19
- const AND = ' AND ';
20
- if (def.typeId) {
21
- sb.push(`[partTypeId=${def.typeId}]`);
22
- }
23
- if (def.roleId) {
24
- if (sb.length) {
25
- sb.push(AND);
26
- }
27
- sb.push(`[roleId=${def.roleId}]`);
28
- }
29
- if (def.name) {
30
- if (sb.length) {
31
- sb.push(AND);
32
- }
33
- sb.push(`[name=${def.name}]`);
34
- }
35
- if (text) {
36
- if (sb.length) {
37
- sb.push(AND);
38
- }
39
- // for other operators see backend SqlQueryBuilderBase.cs
40
- sb.push(`[value*=${text}]`); // *= is "contains"
41
- }
42
- return sb.join('');
43
- }
44
- lookup(filter, options) {
45
- // the index lookup definition is required
46
- const def = options;
47
- if (!def) {
48
- return of([]);
49
- }
50
- // build the corresponding pin query
51
- const query = this.buildQuery(def, filter.text);
52
- // search the index
53
- return this._itemService.searchPins(query, 1, filter.limit).pipe(map((w) => {
54
- if (w.error) {
55
- console.error(w.error);
56
- return [];
57
- }
58
- else {
59
- return w.value?.items || [];
60
- }
61
- }));
62
- }
63
- }
64
- PinRefLookupService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PinRefLookupService, deps: [{ token: i1.ItemService }], target: i0.ɵɵFactoryTarget.Injectable });
65
- PinRefLookupService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PinRefLookupService, providedIn: 'root' });
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: PinRefLookupService, decorators: [{
67
- type: Injectable,
68
- args: [{
69
- providedIn: 'root',
70
- }]
71
- }], ctorParameters: function () { return [{ type: i1.ItemService }]; } });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLXJlZi1sb29rdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1yZWZzLWFzc2VydGVkLWlkcy9zcmMvbGliL3NlcnZpY2VzL3Bpbi1yZWYtbG9va3VwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBVTNDOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQW9CLFlBQXlCO1FBQXpCLGlCQUFZLEdBQVosWUFBWSxDQUFhO0lBQUcsQ0FBQztJQUUxQyxPQUFPLENBQUMsSUFBcUI7UUFDbEMsT0FBTyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQTBCLEVBQUUsSUFBYTtRQUMxRCxNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7UUFDeEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBRXBCLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRTtnQkFDYixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2Q7WUFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDbkM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNkO1lBQ0QsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNkO1lBQ0QseURBQXlEO1lBQ3pELEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUUsbUJBQW1CO1NBQ2xEO1FBRUQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBdUIsRUFBRSxPQUFhO1FBQ2xELDBDQUEwQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFnQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNmO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRCxtQkFBbUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQzlELEdBQUcsQ0FBQyxDQUFDLENBQXNDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU8sRUFBRSxDQUFDO2FBQ1g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7YUFDN0I7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7Z0hBMURVLG1CQUFtQjtvSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSXRlbVNlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWFwaSc7XG5pbXBvcnQgeyBEYXRhUGluSW5mbywgSW5kZXhMb29rdXBEZWZpbml0aW9uIH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcbmltcG9ydCB7XG4gIFJlZkxvb2t1cEZpbHRlcixcbiAgUmVmTG9va3VwU2VydmljZSxcbn0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1yZWZzLWxvb2t1cCc7XG5pbXBvcnQgeyBEYXRhUGFnZSwgRXJyb3JXcmFwcGVyIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcblxuLyoqXG4gKiBDYWRtdXMgcGluLWJhc2VkIGxvb2t1cCBkYXRhIHNlcnZpY2UuIFRoZSB0ZXh0IGJlaW5nIHNlYXJjaGVkIGhlcmUgaXMganVzdFxuICogdGhlIHBpbidzIHZhbHVlLCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgc3BlY2lmaWVkLiBUaGVzZSBvcHRpb25zIGNvcnJlc3BvbmRcbiAqIHRvIGFuIGluZGV4IGxvb2t1cCBkZWZpbml0aW9uLiBUaGUgcmVzdWx0aW5nIGl0ZW1zIGFyZSBvZiB0eXBlIERhdGFQaW5JbmZvLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGluUmVmTG9va3VwU2VydmljZSBpbXBsZW1lbnRzIFJlZkxvb2t1cFNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UpIHt9XG5cbiAgcHVibGljIGdldE5hbWUoaXRlbTogYW55IHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbT8udmFsdWUgfHwgJyc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUXVlcnkoZGVmOiBJbmRleExvb2t1cERlZmluaXRpb24sIHRleHQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNiOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IEFORCA9ICcgQU5EICc7XG5cbiAgICBpZiAoZGVmLnR5cGVJZCkge1xuICAgICAgc2IucHVzaChgW3BhcnRUeXBlSWQ9JHtkZWYudHlwZUlkfV1gKTtcbiAgICB9XG4gICAgaWYgKGRlZi5yb2xlSWQpIHtcbiAgICAgIGlmIChzYi5sZW5ndGgpIHtcbiAgICAgICAgc2IucHVzaChBTkQpO1xuICAgICAgfVxuICAgICAgc2IucHVzaChgW3JvbGVJZD0ke2RlZi5yb2xlSWR9XWApO1xuICAgIH1cbiAgICBpZiAoZGVmLm5hbWUpIHtcbiAgICAgIGlmIChzYi5sZW5ndGgpIHtcbiAgICAgICAgc2IucHVzaChBTkQpO1xuICAgICAgfVxuICAgICAgc2IucHVzaChgW25hbWU9JHtkZWYubmFtZX1dYCk7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBpZiAoc2IubGVuZ3RoKSB7XG4gICAgICAgIHNiLnB1c2goQU5EKTtcbiAgICAgIH1cbiAgICAgIC8vIGZvciBvdGhlciBvcGVyYXRvcnMgc2VlIGJhY2tlbmQgU3FsUXVlcnlCdWlsZGVyQmFzZS5jc1xuICAgICAgc2IucHVzaChgW3ZhbHVlKj0ke3RleHR9XWApOyAgLy8gKj0gaXMgXCJjb250YWluc1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xuICB9XG5cbiAgcHVibGljIGxvb2t1cChmaWx0ZXI6IFJlZkxvb2t1cEZpbHRlciwgb3B0aW9ucz86IGFueSk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICAvLyB0aGUgaW5kZXggbG9va3VwIGRlZmluaXRpb24gaXMgcmVxdWlyZWRcbiAgICBjb25zdCBkZWYgPSBvcHRpb25zIGFzIEluZGV4TG9va3VwRGVmaW5pdGlvbjtcbiAgICBpZiAoIWRlZikge1xuICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCB0aGUgY29ycmVzcG9uZGluZyBwaW4gcXVlcnlcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGRRdWVyeShkZWYsIGZpbHRlci50ZXh0KTtcblxuICAgIC8vIHNlYXJjaCB0aGUgaW5kZXhcbiAgICByZXR1cm4gdGhpcy5faXRlbVNlcnZpY2Uuc2VhcmNoUGlucyhxdWVyeSwgMSwgZmlsdGVyLmxpbWl0KS5waXBlKFxuICAgICAgbWFwKCh3OiBFcnJvcldyYXBwZXI8RGF0YVBhZ2U8RGF0YVBpbkluZm8+PikgPT4ge1xuICAgICAgICBpZiAody5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3Iody5lcnJvcik7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB3LnZhbHVlPy5pdGVtcyB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=