@myrmidon/cadmus-ui 9.0.0 → 10.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.
@@ -6,13 +6,13 @@ import * as i5 from '@angular/material/icon';
6
6
  import { MatIconModule } from '@angular/material/icon';
7
7
  import * as i1 from '@myrmidon/cadmus-core';
8
8
  import { CadmusCoreModule } from '@myrmidon/cadmus-core';
9
- import * as i2 from '@myrmidon/ng-tools';
10
- import { deepCopy, NgToolsModule } from '@myrmidon/ng-tools';
9
+ import * as i2 from '@myrmidon/ngx-tools';
10
+ import { deepCopy, SafeHtmlPipe } from '@myrmidon/ngx-tools';
11
11
  import * as i2$1 from '@angular/material/tooltip';
12
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
13
  import * as i1$1 from '@angular/forms';
14
14
  import { PristineChangeEvent, FormsModule, ReactiveFormsModule } from '@angular/forms';
15
- import * as i2$2 from '@myrmidon/ng-mat-tools';
15
+ import * as i2$2 from '@myrmidon/ngx-mat-tools';
16
16
  import * as i4 from '@angular/material/checkbox';
17
17
  import { MatCheckboxModule } from '@angular/material/checkbox';
18
18
  import { of, BehaviorSubject, map as map$1, Subject } from 'rxjs';
@@ -29,7 +29,7 @@ import * as i10 from '@angular/common';
29
29
  import { CommonModule } from '@angular/common';
30
30
  import { NestedTreeControl } from '@angular/cdk/tree';
31
31
  import * as i7 from '@angular/material/tree';
32
- import { MatTreeNestedDataSource, MatTreeModule } from '@angular/material/tree';
32
+ import { MatTreeNestedDataSource, MatNestedTreeNode, MatTreeModule } from '@angular/material/tree';
33
33
  import * as i1$3 from '@myrmidon/auth-jwt-login';
34
34
  import { RouterModule } from '@angular/router';
35
35
  import { MatSelectModule } from '@angular/material/select';
@@ -42,12 +42,12 @@ class CloseSaveButtonsComponent {
42
42
  close() {
43
43
  this.closeRequest.emit();
44
44
  }
45
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CloseSaveButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: CloseSaveButtonsComponent, isStandalone: false, selector: "cadmus-close-save-buttons", inputs: { form: "form", noSave: "noSave" }, outputs: { closeRequest: "closeRequest" }, ngImport: i0, template: "@if (form) {\n<button\n type=\"button\"\n mat-raised-button\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"close()\"\n>\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n color=\"primary\"\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n", styles: [""], dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
45
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CloseSaveButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: CloseSaveButtonsComponent, isStandalone: false, selector: "cadmus-close-save-buttons", inputs: { form: "form", noSave: "noSave" }, outputs: { closeRequest: "closeRequest" }, ngImport: i0, template: "@if (form) {\n<button type=\"button\" mat-raised-button class=\"mat-warn\" (click)=\"close()\">\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n", styles: [""], dependencies: [{ kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
47
47
  }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CloseSaveButtonsComponent, decorators: [{
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CloseSaveButtonsComponent, decorators: [{
49
49
  type: Component,
50
- args: [{ selector: 'cadmus-close-save-buttons', standalone: false, template: "@if (form) {\n<button\n type=\"button\"\n mat-raised-button\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"close()\"\n>\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n color=\"primary\"\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n" }]
50
+ args: [{ selector: 'cadmus-close-save-buttons', standalone: false, template: "@if (form) {\n<button type=\"button\" mat-raised-button class=\"mat-warn\" (click)=\"close()\">\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n" }]
51
51
  }], ctorParameters: () => [], propDecorators: { form: [{
52
52
  type: Input
53
53
  }], noSave: [{
@@ -102,10 +102,10 @@ class DecoratedTokenTextComponent {
102
102
  decorate() {
103
103
  this.text = this._textLayerService.render(this._baseText, this._locations, this._selectedLoc);
104
104
  }
105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: DecoratedTokenTextComponent, deps: [{ token: i1.TextLayerService }], target: i0.ɵɵFactoryTarget.Component }); }
106
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: DecoratedTokenTextComponent, isStandalone: false, selector: "cadmus-decorated-token-text", inputs: { baseText: "baseText", locations: "locations", selectedLocation: "selectedLocation" }, viewQueries: [{ propertyName: "_textElement", first: true, predicate: ["textElem"], descendants: true }], ngImport: i0, template: "<div [innerHtml]=\"text | safeHtml: 'html'\" id=\"text\" #textElem></div>\r\n", styles: [":host ::ng-deep div#text{counter-reset:text-y-counter}:host ::ng-deep div#text p:before{content:counter(text-y-counter);counter-increment:text-y-counter;margin-right:6px;color:#a0a0a0}:host ::ng-deep span.fr{background-color:#ff0;border:1px solid silver;border-radius:6px;padding:0 4px}:host ::ng-deep span.fr-sel{background-color:orange;font-weight:700;border:1px solid #404040}\n"], dependencies: [{ kind: "pipe", type: i2.SafeHtmlPipe, name: "safeHtml" }] }); }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: DecoratedTokenTextComponent, deps: [{ token: i1.TextLayerService }], target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.1", type: DecoratedTokenTextComponent, isStandalone: false, selector: "cadmus-decorated-token-text", inputs: { baseText: "baseText", locations: "locations", selectedLocation: "selectedLocation" }, viewQueries: [{ propertyName: "_textElement", first: true, predicate: ["textElem"], descendants: true }], ngImport: i0, template: "<div [innerHtml]=\"text | safeHtml: 'html'\" id=\"text\" #textElem></div>\r\n", styles: [":host ::ng-deep div#text{counter-reset:text-y-counter}:host ::ng-deep div#text p:before{content:counter(text-y-counter);counter-increment:text-y-counter;margin-right:6px;color:#a0a0a0}:host ::ng-deep span.fr{background-color:#ff0;border:1px solid silver;border-radius:6px;padding:0 4px}:host ::ng-deep span.fr-sel{background-color:orange;font-weight:700;border:1px solid #404040}\n"], dependencies: [{ kind: "pipe", type: i2.SafeHtmlPipe, name: "safeHtml" }] }); }
107
107
  }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: DecoratedTokenTextComponent, decorators: [{
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: DecoratedTokenTextComponent, decorators: [{
109
109
  type: Component,
110
110
  args: [{ selector: 'cadmus-decorated-token-text', standalone: false, template: "<div [innerHtml]=\"text | safeHtml: 'html'\" id=\"text\" #textElem></div>\r\n", styles: [":host ::ng-deep div#text{counter-reset:text-y-counter}:host ::ng-deep div#text p:before{content:counter(text-y-counter);counter-increment:text-y-counter;margin-right:6px;color:#a0a0a0}:host ::ng-deep span.fr{background-color:#ff0;border:1px solid silver;border-radius:6px;padding:0 4px}:host ::ng-deep span.fr-sel{background-color:orange;font-weight:700;border:1px solid #404040}\n"] }]
111
111
  }], ctorParameters: () => [{ type: i1.TextLayerService }], propDecorators: { _textElement: [{
@@ -122,10 +122,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
122
122
  class ErrorListComponent {
123
123
  constructor() { }
124
124
  ngOnInit() { }
125
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ErrorListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: ErrorListComponent, isStandalone: false, selector: "cadmus-error-list", inputs: { errors: "errors" }, ngImport: i0, template: "@if (errors) {\n <ul>\n @for (error of errors; track error) {\n <li>{{error}}</li>\n }\n </ul>\n}\n", styles: [""] }); }
125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ErrorListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: ErrorListComponent, isStandalone: false, selector: "cadmus-error-list", inputs: { errors: "errors" }, ngImport: i0, template: "@if (errors) {\n <ul>\n @for (error of errors; track error) {\n <li>{{error}}</li>\n }\n </ul>\n}\n", styles: [""] }); }
127
127
  }
128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ErrorListComponent, decorators: [{
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ErrorListComponent, decorators: [{
129
129
  type: Component,
130
130
  args: [{ selector: 'cadmus-error-list', standalone: false, template: "@if (errors) {\n <ul>\n @for (error of errors; track error) {\n <li>{{error}}</li>\n }\n </ul>\n}\n" }]
131
131
  }], ctorParameters: () => [], propDecorators: { errors: [{
@@ -275,10 +275,10 @@ class ColorService {
275
275
  const rgb = this.hslToRgb(h, s, l);
276
276
  return this.rgbToString(rgb.r, rgb.g, rgb.b);
277
277
  }
278
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ColorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
279
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ColorService, providedIn: 'root' }); }
278
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ColorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
279
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ColorService, providedIn: 'root' }); }
280
280
  }
281
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ColorService, decorators: [{
281
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ColorService, decorators: [{
282
282
  type: Injectable,
283
283
  args: [{
284
284
  providedIn: 'root',
@@ -359,10 +359,10 @@ class FacetBadgeComponent {
359
359
  this.contrastColor = this._colorService.getContrastColor(this.color);
360
360
  this.tip = this.getFacetTip(this._data?.facetId || '') ?? undefined;
361
361
  }
362
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: FacetBadgeComponent, deps: [{ token: ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
363
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: FacetBadgeComponent, isStandalone: false, selector: "cadmus-facet-badge", inputs: { data: "data" }, ngImport: i0, template: "<span\r\n class=\"model-type\"\r\n [style.background-color]=\"color\"\r\n [style.color]=\"contrastColor\"\r\n matTooltip=\"{{ tip }}\"\r\n >{{ data?.facetId }}\r\n</span>\r\n", styles: ["span.model-type{padding:4px;border-radius:6px}\n"], dependencies: [{ kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
362
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: FacetBadgeComponent, deps: [{ token: ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
363
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.1", type: FacetBadgeComponent, isStandalone: false, selector: "cadmus-facet-badge", inputs: { data: "data" }, ngImport: i0, template: "<span\r\n class=\"model-type\"\r\n [style.background-color]=\"color\"\r\n [style.color]=\"contrastColor\"\r\n matTooltip=\"{{ tip }}\"\r\n >{{ data?.facetId }}\r\n</span>\r\n", styles: ["span.model-type{padding:4px;border-radius:6px}\n"], dependencies: [{ kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
364
364
  }
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: FacetBadgeComponent, decorators: [{
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: FacetBadgeComponent, decorators: [{
366
366
  type: Component,
367
367
  args: [{ selector: 'cadmus-facet-badge', standalone: false, template: "<span\r\n class=\"model-type\"\r\n [style.background-color]=\"color\"\r\n [style.color]=\"contrastColor\"\r\n matTooltip=\"{{ tip }}\"\r\n >{{ data?.facetId }}\r\n</span>\r\n", styles: ["span.model-type{padding:4px;border-radius:6px}\n"] }]
368
368
  }], ctorParameters: () => [{ type: ColorService }], propDecorators: { data: [{
@@ -393,12 +393,12 @@ class FlagsBadgeComponent {
393
393
  return def.id & this._data.flags;
394
394
  });
395
395
  }
396
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: FlagsBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
397
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: FlagsBadgeComponent, isStandalone: false, selector: "cadmus-flags-badge", inputs: { data: "data" }, ngImport: i0, template: "<div>\n @for (def of badgeFlags; track def) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n &#x2b24;\n </span>\n }\n</div>\n", styles: ["span.badge-flag{font-size:1rem;cursor:default}\n"], dependencies: [{ kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
396
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: FlagsBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
397
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: FlagsBadgeComponent, isStandalone: false, selector: "cadmus-flags-badge", inputs: { data: "data" }, ngImport: i0, template: "<div>\n @for (def of badgeFlags; track def.id) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n @if (def.isAdmin) {\n &#x25c6;\n } @else {\n &#x2b24;\n }\n </span>\n }\n</div>\n", styles: ["span.badge-flag{font-size:1rem;cursor:default}\n"], dependencies: [{ kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
398
398
  }
399
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: FlagsBadgeComponent, decorators: [{
399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: FlagsBadgeComponent, decorators: [{
400
400
  type: Component,
401
- args: [{ selector: 'cadmus-flags-badge', standalone: false, template: "<div>\n @for (def of badgeFlags; track def) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n &#x2b24;\n </span>\n }\n</div>\n", styles: ["span.badge-flag{font-size:1rem;cursor:default}\n"] }]
401
+ args: [{ selector: 'cadmus-flags-badge', standalone: false, template: "<div>\n @for (def of badgeFlags; track def.id) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n @if (def.isAdmin) {\n &#x25c6;\n } @else {\n &#x2b24;\n }\n </span>\n }\n</div>\n", styles: ["span.badge-flag{font-size:1rem;cursor:default}\n"] }]
402
402
  }], ctorParameters: () => [], propDecorators: { data: [{
403
403
  type: Input
404
404
  }] } });
@@ -471,10 +471,10 @@ class LayerHintsComponent {
471
471
  }
472
472
  });
473
473
  }
474
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: LayerHintsComponent, deps: [{ token: i1$1.FormBuilder }, { token: i2$2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
475
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: LayerHintsComponent, isStandalone: false, selector: "cadmus-layer-hints", inputs: { hints: "hints", targetLocation: "targetLocation", disabled: "disabled", readonly: "readonly" }, outputs: { requestEdit: "requestEdit", requestDelete: "requestDelete", requestMove: "requestMove", requestPatch: "requestPatch" }, ngImport: i0, template: "@if (hints) {\n<form [formGroup]=\"form\" (submit)=\"emitRequestPatch()\">\n <table class=\"patches\">\n <thead>\n <tr>\n <th></th>\n <th>location</th>\n <th>description</th>\n <th>patch</th>\n </tr>\n </thead>\n <tbody>\n @for (hint of hints; track hint; let i = $index) {\n <tr>\n @if (!readonly) {\n <td>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this fragment\"\n [disabled]=\"disabled\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this fragment to {{ targetLocation }}\"\n [disabled]=\"\n disabled || !targetLocation || targetLocation === hint.location\n \"\n (click)=\"emitRequestMove(hint)\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this fragment\"\n color=\"warn\"\n [disabled]=\"disabled\"\n (click)=\"emitRequestDelete(hint)\"\n >\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n }\n <td>{{ hint.location }}</td>\n <td>{{ hint.description }}</td>\n <td>\n @if (hint.patchOperation) {\n <mat-checkbox\n matTooltip=\"Apply this patch\"\n [disabled]=\"disabled\"\n [value]=\"(i + 1).toString()\"\n >\n {{ hint.patchOperation }}\n </mat-checkbox>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (targetLocation) {\n <div>move target: {{ targetLocation }}</div>\n }\n <button\n type=\"submit\"\n mat-raised-button\n [disabled]=\"readonly || disabled || form.invalid\"\n >\n apply patches\n </button>\n</form>\n}\n", styles: ["table.patches th{font-weight:400;color:#bdbdbd}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
474
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: LayerHintsComponent, deps: [{ token: i1$1.FormBuilder }, { token: i2$2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
475
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: LayerHintsComponent, isStandalone: false, selector: "cadmus-layer-hints", inputs: { hints: "hints", targetLocation: "targetLocation", disabled: "disabled", readonly: "readonly" }, outputs: { requestEdit: "requestEdit", requestDelete: "requestDelete", requestMove: "requestMove", requestPatch: "requestPatch" }, ngImport: i0, template: "@if (hints) {\n<form [formGroup]=\"form\" (submit)=\"emitRequestPatch()\">\n <table class=\"patches\">\n <thead>\n <tr>\n <th></th>\n <th>location</th>\n <th>description</th>\n <th>patch</th>\n </tr>\n </thead>\n <tbody>\n @for (hint of hints; track hint; let i = $index) {\n <tr>\n @if (!readonly) {\n <td>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this fragment\"\n [disabled]=\"disabled\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this fragment to {{ targetLocation }}\"\n [disabled]=\"\n disabled || !targetLocation || targetLocation === hint.location\n \"\n (click)=\"emitRequestMove(hint)\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this fragment\"\n color=\"warn\"\n [disabled]=\"disabled\"\n (click)=\"emitRequestDelete(hint)\"\n >\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n }\n <td>{{ hint.location }}</td>\n <td>{{ hint.description }}</td>\n <td>\n @if (hint.patchOperation) {\n <mat-checkbox\n matTooltip=\"Apply this patch\"\n [disabled]=\"disabled\"\n [value]=\"(i + 1).toString()\"\n >\n {{ hint.patchOperation }}\n </mat-checkbox>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (targetLocation) {\n <div>move target: {{ targetLocation }}</div>\n }\n <button\n type=\"submit\"\n mat-raised-button\n [disabled]=\"readonly || disabled || form.invalid\"\n >\n apply patches\n </button>\n</form>\n}\n", styles: ["table.patches th{font-weight:400;color:#bdbdbd}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
476
476
  }
477
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: LayerHintsComponent, decorators: [{
477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: LayerHintsComponent, decorators: [{
478
478
  type: Component,
479
479
  args: [{ selector: 'cadmus-layer-hints', standalone: false, template: "@if (hints) {\n<form [formGroup]=\"form\" (submit)=\"emitRequestPatch()\">\n <table class=\"patches\">\n <thead>\n <tr>\n <th></th>\n <th>location</th>\n <th>description</th>\n <th>patch</th>\n </tr>\n </thead>\n <tbody>\n @for (hint of hints; track hint; let i = $index) {\n <tr>\n @if (!readonly) {\n <td>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this fragment\"\n [disabled]=\"disabled\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this fragment to {{ targetLocation }}\"\n [disabled]=\"\n disabled || !targetLocation || targetLocation === hint.location\n \"\n (click)=\"emitRequestMove(hint)\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this fragment\"\n color=\"warn\"\n [disabled]=\"disabled\"\n (click)=\"emitRequestDelete(hint)\"\n >\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n }\n <td>{{ hint.location }}</td>\n <td>{{ hint.description }}</td>\n <td>\n @if (hint.patchOperation) {\n <mat-checkbox\n matTooltip=\"Apply this patch\"\n [disabled]=\"disabled\"\n [value]=\"(i + 1).toString()\"\n >\n {{ hint.patchOperation }}\n </mat-checkbox>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (targetLocation) {\n <div>move target: {{ targetLocation }}</div>\n }\n <button\n type=\"submit\"\n mat-raised-button\n [disabled]=\"readonly || disabled || form.invalid\"\n >\n apply patches\n </button>\n</form>\n}\n", styles: ["table.patches th{font-weight:400;color:#bdbdbd}\n"] }]
480
480
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: i2$2.DialogService }], propDecorators: { hints: [{
@@ -593,12 +593,12 @@ class LookupPinComponent {
593
593
  this.clear();
594
594
  }
595
595
  }
596
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: LookupPinComponent, deps: [{ token: i1$1.UntypedFormBuilder }, { token: i1$2.ItemService }, { token: 'indexLookupDefinitions' }], target: i0.ɵɵFactoryTarget.Component }); }
597
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: LookupPinComponent, isStandalone: false, selector: "cadmus-lookup-pin", inputs: { initialValue: "initialValue", label: "label", limit: "limit", resetOnPick: "resetOnPick", lookupKey: "lookupKey" }, outputs: { entryChange: "entryChange" }, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }] }); }
596
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: LookupPinComponent, deps: [{ token: i1$1.UntypedFormBuilder }, { token: i1$2.ItemService }, { token: 'indexLookupDefinitions' }], target: i0.ɵɵFactoryTarget.Component }); }
597
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: LookupPinComponent, isStandalone: false, selector: "cadmus-lookup-pin", inputs: { initialValue: "initialValue", label: "label", limit: "limit", resetOnPick: "resetOnPick", lookupKey: "lookupKey" }, outputs: { entryChange: "entryChange" }, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }] }); }
598
598
  }
599
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: LookupPinComponent, decorators: [{
599
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: LookupPinComponent, decorators: [{
600
600
  type: Component,
601
- args: [{ selector: 'cadmus-lookup-pin', standalone: false, template: "<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n" }]
601
+ args: [{ selector: 'cadmus-lookup-pin', standalone: false, template: "<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n" }]
602
602
  }], ctorParameters: () => [{ type: i1$1.UntypedFormBuilder }, { type: i1$2.ItemService }, { type: undefined, decorators: [{
603
603
  type: Inject,
604
604
  args: ['indexLookupDefinitions']
@@ -697,10 +697,10 @@ class PartBadgeComponent {
697
697
  }
698
698
  this.contrastColor = this._colorService.getContrastColor(this.color);
699
699
  }
700
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: PartBadgeComponent, deps: [{ token: i1$2.FacetService }, { token: ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
701
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: PartBadgeComponent, isStandalone: false, selector: "cadmus-part-badge", inputs: { badgeType: "badgeType", typeThesaurus: "typeThesaurus", facetDefinition: "facetDefinition", partTypeIds: "partTypeIds" }, ngImport: i0, template: "@if (badgeType !== 2) {\n <span class=\"part-badge\"\n [style.background-color]=\"color\"\n [style.color]=\"contrastColor\"\n >\n {{ typeName }}\n </span>\n}\n@if (badgeType !== 1 && roleName) {\n <span class=\"role-badge\">\n {{ roleName }}\n </span>\n}\n", styles: [".part-badge{padding:4px;border-radius:6px}.role-badge{padding:4px;border:1px solid silver;border-radius:6px}\n"] }); }
700
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: PartBadgeComponent, deps: [{ token: i1$2.FacetService }, { token: ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
701
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: PartBadgeComponent, isStandalone: false, selector: "cadmus-part-badge", inputs: { badgeType: "badgeType", typeThesaurus: "typeThesaurus", facetDefinition: "facetDefinition", partTypeIds: "partTypeIds" }, ngImport: i0, template: "@if (badgeType !== 2) {\n <span class=\"part-badge\"\n [style.background-color]=\"color\"\n [style.color]=\"contrastColor\"\n >\n {{ typeName }}\n </span>\n}\n@if (badgeType !== 1 && roleName) {\n <span class=\"role-badge\">\n {{ roleName }}\n </span>\n}\n", styles: [".part-badge{padding:4px;border-radius:6px}.role-badge{padding:4px;border:1px solid silver;border-radius:6px}\n"] }); }
702
702
  }
703
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: PartBadgeComponent, decorators: [{
703
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: PartBadgeComponent, decorators: [{
704
704
  type: Component,
705
705
  args: [{ selector: 'cadmus-part-badge', standalone: false, template: "@if (badgeType !== 2) {\n <span class=\"part-badge\"\n [style.background-color]=\"color\"\n [style.color]=\"contrastColor\"\n >\n {{ typeName }}\n </span>\n}\n@if (badgeType !== 1 && roleName) {\n <span class=\"role-badge\">\n {{ roleName }}\n </span>\n}\n", styles: [".part-badge{padding:4px;border-radius:6px}.role-badge{padding:4px;border:1px solid silver;border-radius:6px}\n"] }]
706
706
  }], ctorParameters: () => [{ type: i1$2.FacetService }, { type: ColorService }], propDecorators: { badgeType: [{
@@ -905,12 +905,12 @@ class ThesaurusTreeComponent {
905
905
  }
906
906
  return this.foundNodes?.length > 0 && this.foundNodes.indexOf(node) > -1;
907
907
  }
908
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ThesaurusTreeComponent, deps: [{ token: i1$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
909
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: ThesaurusTreeComponent, isStandalone: false, selector: "cadmus-thesaurus-tree", inputs: { entries: "entries", rootLabel: "rootLabel", renderLabel: "renderLabel" }, outputs: { entryChange: "entryChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n color=\"warn\"\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n", styles: [".th-tree-progress-bar{margin-left:30px}.th-tree-nested-node{padding-left:30px}mat-tree{margin-left:40px}.mat-tree-node{padding:0;background-color:#fff}.mat-nested-tree-node{top:-24px}ul,li{list-style:none;margin:0;padding:0}li.th-tree-container{border-bottom:0}ul{padding-left:40px}li{padding-left:40px;border:1px dotted grey;border-width:0 0 1px 1px;position:relative;top:-24px}li.mat-tree-node,li div{margin:0;position:relative;top:24px}li ul{border-top:1px dotted grey;margin-left:-40px;padding-left:60px}.mat-nested-tree-node:last-child ul{border-left:1px solid white;margin-left:-41px}.mat-mdc-icon-button{z-index:100}span.found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#0cc078;border-radius:6px}span.not-found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#fb6962;border-radius:6px}.hilite{background-color:#fdfd96}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i7.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], outputs: ["activation", "expandedChange"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i7.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i7.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
908
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ThesaurusTreeComponent, deps: [{ token: i1$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
909
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: ThesaurusTreeComponent, isStandalone: false, selector: "cadmus-thesaurus-tree", inputs: { entries: "entries", rootLabel: "rootLabel", renderLabel: "renderLabel" }, outputs: { entryChange: "entryChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n", styles: [".th-tree-progress-bar{margin-left:30px}.th-tree-nested-node{padding-left:30px}mat-tree{margin-left:40px}.mat-tree-node{padding:0;background-color:#fff}.mat-nested-tree-node{top:-24px}ul,li{list-style:none;margin:0;padding:0}li.th-tree-container{border-bottom:0}ul{padding-left:40px}li{padding-left:40px;border:1px dotted grey;border-width:0 0 1px 1px;position:relative;top:-24px}li.mat-tree-node,li div{margin:0;position:relative;top:24px}li ul{border-top:1px dotted grey;margin-left:-40px;padding-left:60px}.mat-nested-tree-node:last-child ul{border-left:1px solid white;margin-left:-41px}.mat-mdc-icon-button{z-index:100}span.found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#0cc078;border-radius:6px}span.not-found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#fb6962;border-radius:6px}.hilite{background-color:#fdfd96}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: i7.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], outputs: ["activation", "expandedChange"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i7.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i7.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i7.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
910
910
  }
911
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ThesaurusTreeComponent, decorators: [{
911
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ThesaurusTreeComponent, decorators: [{
912
912
  type: Component,
913
- args: [{ selector: 'cadmus-thesaurus-tree', standalone: false, template: "<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n color=\"warn\"\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n", styles: [".th-tree-progress-bar{margin-left:30px}.th-tree-nested-node{padding-left:30px}mat-tree{margin-left:40px}.mat-tree-node{padding:0;background-color:#fff}.mat-nested-tree-node{top:-24px}ul,li{list-style:none;margin:0;padding:0}li.th-tree-container{border-bottom:0}ul{padding-left:40px}li{padding-left:40px;border:1px dotted grey;border-width:0 0 1px 1px;position:relative;top:-24px}li.mat-tree-node,li div{margin:0;position:relative;top:24px}li ul{border-top:1px dotted grey;margin-left:-40px;padding-left:60px}.mat-nested-tree-node:last-child ul{border-left:1px solid white;margin-left:-41px}.mat-mdc-icon-button{z-index:100}span.found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#0cc078;border-radius:6px}span.not-found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#fb6962;border-radius:6px}.hilite{background-color:#fdfd96}\n"] }]
913
+ args: [{ selector: 'cadmus-thesaurus-tree', standalone: false, template: "<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n", styles: [".th-tree-progress-bar{margin-left:30px}.th-tree-nested-node{padding-left:30px}mat-tree{margin-left:40px}.mat-tree-node{padding:0;background-color:#fff}.mat-nested-tree-node{top:-24px}ul,li{list-style:none;margin:0;padding:0}li.th-tree-container{border-bottom:0}ul{padding-left:40px}li{padding-left:40px;border:1px dotted grey;border-width:0 0 1px 1px;position:relative;top:-24px}li.mat-tree-node,li div{margin:0;position:relative;top:24px}li ul{border-top:1px dotted grey;margin-left:-40px;padding-left:60px}.mat-nested-tree-node:last-child ul{border-left:1px solid white;margin-left:-41px}.mat-mdc-icon-button{z-index:100}span.found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#0cc078;border-radius:6px}span.not-found-count{margin:0 4px;padding:2px 4px;color:#fff;background-color:#fb6962;border-radius:6px}.hilite{background-color:#fdfd96}\n"] }]
914
914
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { entries: [{
915
915
  type: Input
916
916
  }], rootLabel: [{
@@ -1103,14 +1103,14 @@ class ModelEditorComponentBase {
1103
1103
  // the form is no more dirty
1104
1104
  this.form.markAsPristine();
1105
1105
  }
1106
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ModelEditorComponentBase, deps: [{ token: i1$3.AuthJwtService }, { token: i1$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
1107
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.0", type: ModelEditorComponentBase, isStandalone: false, selector: "ng-component", inputs: { identity: "identity", data: "data", disabled: "disabled" }, outputs: { dataChange: "dataChange", dirtyChange: "dirtyChange", editorClose: "editorClose" }, ngImport: i0, template: '', isInline: true }); }
1106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ModelEditorComponentBase, deps: [{ token: i1$3.AuthJwtService }, { token: i1$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
1107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.1", type: ModelEditorComponentBase, isStandalone: false, selector: "ng-component", inputs: { identity: "identity", data: "data", disabled: "disabled" }, outputs: { dataChange: "dataChange", dirtyChange: "dirtyChange", editorClose: "editorClose" }, ngImport: i0, template: '', isInline: true }); }
1108
1108
  }
1109
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: ModelEditorComponentBase, decorators: [{
1109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: ModelEditorComponentBase, decorators: [{
1110
1110
  type: Component,
1111
1111
  args: [{
1112
1112
  template: '',
1113
- standalone: false
1113
+ standalone: false,
1114
1114
  }]
1115
1115
  }], ctorParameters: () => [{ type: i1$3.AuthJwtService }, { type: i1$1.FormBuilder }], propDecorators: { identity: [{
1116
1116
  type: Input
@@ -1199,10 +1199,10 @@ class UserRefLookupService {
1199
1199
  getName(item) {
1200
1200
  return item?.userName;
1201
1201
  }
1202
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserRefLookupService, deps: [{ token: i1$2.UserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1203
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserRefLookupService, providedIn: 'root' }); }
1202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: UserRefLookupService, deps: [{ token: i1$2.UserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1203
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: UserRefLookupService, providedIn: 'root' }); }
1204
1204
  }
1205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserRefLookupService, decorators: [{
1205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: UserRefLookupService, decorators: [{
1206
1206
  type: Injectable,
1207
1207
  args: [{
1208
1208
  providedIn: 'root',
@@ -1259,8 +1259,8 @@ const extractPristineChanges = (control) => {
1259
1259
  };
1260
1260
 
1261
1261
  class CadmusUiModule {
1262
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CadmusUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1263
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: CadmusUiModule, declarations: [CloseSaveButtonsComponent,
1262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CadmusUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1263
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.1", ngImport: i0, type: CadmusUiModule, declarations: [CloseSaveButtonsComponent,
1264
1264
  DecoratedTokenTextComponent,
1265
1265
  ErrorListComponent,
1266
1266
  FacetBadgeComponent,
@@ -1279,13 +1279,14 @@ class CadmusUiModule {
1279
1279
  MatFormFieldModule,
1280
1280
  MatIconModule,
1281
1281
  MatInputModule,
1282
+ MatNestedTreeNode,
1282
1283
  MatSelectModule,
1283
1284
  MatTreeModule,
1284
1285
  MatTooltipModule,
1285
1286
  // Cadmus
1286
- NgToolsModule,
1287
1287
  CadmusCoreModule,
1288
- RefLookupComponent], exports: [CloseSaveButtonsComponent,
1288
+ RefLookupComponent,
1289
+ SafeHtmlPipe], exports: [CloseSaveButtonsComponent,
1289
1290
  DecoratedTokenTextComponent,
1290
1291
  ErrorListComponent,
1291
1292
  FacetBadgeComponent,
@@ -1294,7 +1295,7 @@ class CadmusUiModule {
1294
1295
  LookupPinComponent,
1295
1296
  PartBadgeComponent,
1296
1297
  ThesaurusTreeComponent] }); }
1297
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CadmusUiModule, imports: [CommonModule,
1298
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CadmusUiModule, imports: [CommonModule,
1298
1299
  FormsModule,
1299
1300
  RouterModule,
1300
1301
  ReactiveFormsModule,
@@ -1309,11 +1310,10 @@ class CadmusUiModule {
1309
1310
  MatTreeModule,
1310
1311
  MatTooltipModule,
1311
1312
  // Cadmus
1312
- NgToolsModule,
1313
1313
  CadmusCoreModule,
1314
1314
  RefLookupComponent] }); }
1315
1315
  }
1316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: CadmusUiModule, decorators: [{
1316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CadmusUiModule, decorators: [{
1317
1317
  type: NgModule,
1318
1318
  args: [{
1319
1319
  imports: [
@@ -1328,13 +1328,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
1328
1328
  MatFormFieldModule,
1329
1329
  MatIconModule,
1330
1330
  MatInputModule,
1331
+ MatNestedTreeNode,
1331
1332
  MatSelectModule,
1332
1333
  MatTreeModule,
1333
1334
  MatTooltipModule,
1334
1335
  // Cadmus
1335
- NgToolsModule,
1336
1336
  CadmusCoreModule,
1337
1337
  RefLookupComponent,
1338
+ SafeHtmlPipe,
1338
1339
  ],
1339
1340
  declarations: [
1340
1341
  CloseSaveButtonsComponent,
@@ -1357,7 +1358,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
1357
1358
  LookupPinComponent,
1358
1359
  PartBadgeComponent,
1359
1360
  ThesaurusTreeComponent,
1360
- ]
1361
+ ],
1361
1362
  }]
1362
1363
  }] });
1363
1364
 
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-cadmus-ui.mjs","sources":["../../../../projects/myrmidon/cadmus-ui/src/lib/components/close-save-buttons/close-save-buttons.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/close-save-buttons/close-save-buttons.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/decorated-token-text/decorated-token-text.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/decorated-token-text/decorated-token-text.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/error-list/error-list.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/error-list/error-list.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/services/color.service.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/facet-badge/facet-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/facet-badge/facet-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/flags-badge/flags-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/flags-badge/flags-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/layer-hints/layer-hints.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/layer-hints/layer-hints.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/lookup-pin/lookup-pin.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/lookup-pin/lookup-pin.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/part-badge/part-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/part-badge/part-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/thesaurus-tree/thesaurus-tree.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/thesaurus-tree/thesaurus-tree.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/model-editor-component-base.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/validators/custom-validators.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/validators/json-validators.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/services/user-ref-lookup.service.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/utils.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/cadmus-ui.module.ts","../../../../projects/myrmidon/cadmus-ui/src/public-api.ts","../../../../projects/myrmidon/cadmus-ui/src/myrmidon-cadmus-ui.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormGroup, UntypedFormGroup } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cadmus-close-save-buttons',\r\n templateUrl: './close-save-buttons.component.html',\r\n styleUrls: ['./close-save-buttons.component.css'],\r\n standalone: false,\r\n})\r\nexport class CloseSaveButtonsComponent {\r\n @Input()\r\n public form?: FormGroup | UntypedFormGroup;\r\n @Input()\r\n public noSave?: boolean;\r\n\r\n @Output()\r\n public closeRequest: EventEmitter<any>;\r\n\r\n constructor() {\r\n this.closeRequest = new EventEmitter();\r\n }\r\n\r\n public close(): void {\r\n this.closeRequest.emit();\r\n }\r\n}\r\n","@if (form) {\n<button\n type=\"button\"\n mat-raised-button\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"close()\"\n>\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n color=\"primary\"\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n","import { Component, OnInit, ViewChild, ElementRef, Input } from '@angular/core';\r\nimport { TokenLocation, TextLayerService } from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * Decorated token-based text visualizer. This is used when editing\r\n * token-based text layers.\r\n */\r\n@Component({\r\n selector: 'cadmus-decorated-token-text',\r\n templateUrl: './decorated-token-text.component.html',\r\n styleUrls: ['./decorated-token-text.component.css'],\r\n standalone: false,\r\n})\r\nexport class DecoratedTokenTextComponent implements OnInit {\r\n @ViewChild('textElem') _textElement?: ElementRef;\r\n private _baseText: string;\r\n private _locations: TokenLocation[];\r\n private _selectedLoc?: TokenLocation;\r\n\r\n /**\r\n * The base text.\r\n */\r\n @Input()\r\n public get baseText(): string {\r\n return this._baseText;\r\n }\r\n public set baseText(value: string) {\r\n this._baseText = value || '';\r\n this.decorate();\r\n }\r\n\r\n /**\r\n * The token-based locations of all the fragments in the layer.\r\n */\r\n @Input()\r\n public get locations(): TokenLocation[] {\r\n return this._locations;\r\n }\r\n public set locations(value: TokenLocation[]) {\r\n this._locations = value || [];\r\n this.decorate();\r\n }\r\n\r\n /**\r\n * A selected token-based location.\r\n */\r\n @Input()\r\n public get selectedLocation(): TokenLocation | undefined {\r\n return this._selectedLoc;\r\n }\r\n public set selectedLocation(value: TokenLocation | undefined) {\r\n this._selectedLoc = value;\r\n this.decorate();\r\n }\r\n\r\n public text?: string; // rendered HTML text\r\n\r\n constructor(private _textLayerService: TextLayerService) {\r\n this._baseText = '';\r\n this._locations = [];\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.decorate();\r\n }\r\n\r\n private decorate(): void {\r\n this.text = this._textLayerService.render(\r\n this._baseText,\r\n this._locations,\r\n this._selectedLoc\r\n );\r\n }\r\n}\r\n","<div [innerHtml]=\"text | safeHtml: 'html'\" id=\"text\" #textElem></div>\r\n","import { Component, OnInit, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'cadmus-error-list',\r\n templateUrl: './error-list.component.html',\r\n styleUrls: ['./error-list.component.css'],\r\n standalone: false,\r\n})\r\nexport class ErrorListComponent implements OnInit {\r\n @Input()\r\n public errors?: string[];\r\n\r\n constructor() {}\r\n\r\n public ngOnInit(): void {}\r\n}\r\n","@if (errors) {\n <ul>\n @for (error of errors; track error) {\n <li>{{error}}</li>\n }\n </ul>\n}\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Colors helper service.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ColorService {\r\n /**\r\n * Get the R,G,B components of the color expressed by the specified\r\n * RGB string (3 or 6 digits format).\r\n *\r\n * @param rgb The RGB color string (3 or 6 digits).\r\n * @returns An array where [0]=R, [1]=G, [2]=B, or null if invalid\r\n * input string.\r\n */\r\n public getRgb(rgb: string): number[] | null {\r\n if (!rgb) {\r\n return null;\r\n }\r\n\r\n // RGB\r\n let m = rgb.match(/^#?([0-9a-f]{3})$/i);\r\n if (m && m[1]) {\r\n // in 3-characters format, each value is multiplied by 0x11 to give an\r\n // even scale from 0x00 to 0xff\r\n return [\r\n parseInt(m[1].charAt(0), 16) * 0x11,\r\n parseInt(m[1].charAt(1), 16) * 0x11,\r\n parseInt(m[1].charAt(2), 16) * 0x11,\r\n ];\r\n }\r\n // RRGGBB\r\n m = rgb.match(/^#?([0-9a-f]{6})$/i);\r\n if (m && m[1]) {\r\n return [\r\n parseInt(m[1].substring(0, 2), 16),\r\n parseInt(m[1].substring(2, 4), 16),\r\n parseInt(m[1].substring(4, 6), 16),\r\n ];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get black or white according to which of them has the maximum contrast\r\n * against the specified color.\r\n *\r\n * @param rgb The RGB color string.\r\n * @returns Black or white. If rgb is invalid, always black.\r\n */\r\n public getContrastColor(rgb: string): string {\r\n // https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color\r\n const values = this.getRgb(rgb);\r\n if (!values) {\r\n return 'black';\r\n }\r\n return values[0] * 0.299 + values[1] * 0.587 + values[2] * 0.114 > 186\r\n ? 'black'\r\n : 'white';\r\n }\r\n\r\n /**\r\n * Convert HSL to RGB.\r\n *\r\n * @param h Hue\r\n * @param s Saturation\r\n * @param l Lightness\r\n * @returns Object with r, g, b values.\r\n */\r\n public hslToRgb(\r\n h: number,\r\n s: number,\r\n l: number\r\n ): { r: number; g: number; b: number } {\r\n // https://css-tricks.com/converting-color-spaces-in-javascript/\r\n // must be fractions of 1\r\n s /= 100;\r\n l /= 100;\r\n\r\n let c = (1 - Math.abs(2 * l - 1)) * s,\r\n x = c * (1 - Math.abs(((h / 60) % 2) - 1)),\r\n m = l - c / 2,\r\n r = 0,\r\n g = 0,\r\n b = 0;\r\n if (0 <= h && h < 60) {\r\n r = c;\r\n g = x;\r\n b = 0;\r\n } else if (60 <= h && h < 120) {\r\n r = x;\r\n g = c;\r\n b = 0;\r\n } else if (120 <= h && h < 180) {\r\n r = 0;\r\n g = c;\r\n b = x;\r\n } else if (180 <= h && h < 240) {\r\n r = 0;\r\n g = x;\r\n b = c;\r\n } else if (240 <= h && h < 300) {\r\n r = x;\r\n g = 0;\r\n b = c;\r\n } else if (300 <= h && h < 360) {\r\n r = c;\r\n g = 0;\r\n b = x;\r\n }\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return { r: r, g: g, b: b };\r\n }\r\n\r\n public rgbToString(r: number, g: number, b: number): string {\r\n let rd = r.toString(16);\r\n if (rd.length === 1) {\r\n rd = '0' + rd;\r\n }\r\n let gd = g.toString(16);\r\n if (gd.length === 1) {\r\n gd = '0' + gd;\r\n }\r\n let bd = b.toString(16);\r\n if (bd.length === 1) {\r\n bd = '0' + bd;\r\n }\r\n return rd + gd + bd;\r\n }\r\n\r\n /**\r\n * Get the next color from a palette generated to include\r\n * the specified count of colors.\r\n *\r\n * @param index The index of the next color in the palette.\r\n * @param count The total count of colors in the palette.\r\n * @param blueBoost True to adjust colors for the eye's lack of sensitivity to blue.\r\n * @returns The RRGGBB values string.\r\n */\r\n public nextPaletteColor(\r\n index: number,\r\n count: number,\r\n blueBoost = true\r\n ): string {\r\n // https://stackoverflow.com/questions/43193341/how-to-generate-random-pastel-or-brighter-color-in-javascript\r\n const h = Math.floor((index / count) * 341); // between 0 and 340\r\n let s = 100;\r\n let l = 50;\r\n\r\n if (blueBoost && h > 215 && h < 265) {\r\n const gain = 20;\r\n let blueness = 1 - Math.abs(h - 240) / 25;\r\n let change = Math.floor(gain * blueness);\r\n l += change;\r\n s -= change;\r\n }\r\n const rgb = this.hslToRgb(h, s, l);\r\n return this.rgbToString(rgb.r, rgb.g, rgb.b);\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FacetDefinition } from '@myrmidon/cadmus-core';\r\n\r\nimport { ColorService } from '../../services/color.service';\r\n\r\nexport interface FacetBadgeData {\r\n definitions: FacetDefinition[];\r\n facetId?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cadmus-facet-badge',\r\n templateUrl: './facet-badge.component.html',\r\n styleUrls: ['./facet-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class FacetBadgeComponent {\r\n private _facetColors: { [key: string]: string };\r\n private _facetTips: { [key: string]: string };\r\n private _data?: FacetBadgeData | null;\r\n\r\n public color: string;\r\n public contrastColor: string;\r\n public tip?: string;\r\n\r\n /**\r\n * The facet data.\r\n */\r\n @Input()\r\n public get data(): FacetBadgeData | undefined | null {\r\n return this._data;\r\n }\r\n public set data(value: FacetBadgeData | undefined | null) {\r\n this._data = value;\r\n this._facetColors = {};\r\n this._facetTips = {};\r\n this.updateBadge();\r\n }\r\n\r\n constructor(private _colorService: ColorService) {\r\n this._data = {\r\n definitions: [],\r\n };\r\n this._facetColors = {};\r\n this._facetTips = {};\r\n this.color = 'transparent';\r\n this.contrastColor = 'black';\r\n }\r\n\r\n private getFacetColor(facetId: string): string {\r\n if (this._facetColors[facetId]) {\r\n return this._facetColors[facetId];\r\n }\r\n if (!this._data?.definitions?.length) {\r\n return 'transparent';\r\n }\r\n\r\n const facet = this._data.definitions.find((f) => {\r\n return f.id === facetId;\r\n });\r\n if (facet?.colorKey) {\r\n this._facetColors[facetId] = '#' + facet.colorKey;\r\n } else {\r\n this._facetColors[facetId] = 'transparent';\r\n }\r\n return this._facetColors[facetId];\r\n }\r\n\r\n private getFacetTip(facetId: string): string | null {\r\n if (this._facetTips[facetId]) {\r\n return this._facetTips[facetId];\r\n }\r\n\r\n if (!this._data?.definitions?.length) {\r\n return null;\r\n }\r\n\r\n const facet = this._data.definitions.find((f) => {\r\n return f.id === facetId;\r\n });\r\n if (!facet) {\r\n this._facetTips[facetId] = facetId;\r\n } else {\r\n const sb: string[] = [];\r\n for (let i = 0; i < facet.partDefinitions.length; i++) {\r\n if (i > 0) {\r\n sb.push(', ');\r\n }\r\n sb.push(facet.partDefinitions[i].name);\r\n if (facet.partDefinitions[i].isRequired) {\r\n sb.push('*');\r\n }\r\n }\r\n this._facetTips[facetId] = sb.join('');\r\n }\r\n return this._facetTips[facetId];\r\n }\r\n\r\n private updateBadge() {\r\n this.color = this.getFacetColor(this._data?.facetId || '');\r\n this.contrastColor = this._colorService.getContrastColor(this.color);\r\n this.tip = this.getFacetTip(this._data?.facetId || '') ?? undefined;\r\n }\r\n}\r\n","<span\r\n class=\"model-type\"\r\n [style.background-color]=\"color\"\r\n [style.color]=\"contrastColor\"\r\n matTooltip=\"{{ tip }}\"\r\n >{{ data?.facetId }}\r\n</span>\r\n","import { Component, Input } from '@angular/core';\r\nimport { FlagDefinition } from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * Data for FlagsBadgeComponent, including flags and their definitions.\r\n */\r\nexport interface FlagsBadgeData {\r\n definitions: FlagDefinition[];\r\n flags: number;\r\n}\r\n\r\n/**\r\n * Badge with item's flags. Each flag is represented by a circle filled\r\n * with the flag's color key.\r\n */\r\n@Component({\r\n selector: 'cadmus-flags-badge',\r\n templateUrl: './flags-badge.component.html',\r\n styleUrls: ['./flags-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class FlagsBadgeComponent {\r\n private _data?: FlagsBadgeData | null;\r\n\r\n public badgeFlags: FlagDefinition[];\r\n\r\n @Input()\r\n public get data(): FlagsBadgeData | undefined | null {\r\n return this._data;\r\n }\r\n public set data(value: FlagsBadgeData | undefined | null) {\r\n this._data = value;\r\n this.updateBadge();\r\n }\r\n\r\n constructor() {\r\n this.badgeFlags = [];\r\n }\r\n\r\n private updateBadge() {\r\n if (!this._data) {\r\n return;\r\n }\r\n this.badgeFlags = this._data.definitions.filter((def) => {\r\n // tslint:disable-next-line: no-bitwise\r\n return def.id & this._data!.flags;\r\n });\r\n }\r\n}\r\n","<div>\n @for (def of badgeFlags; track def) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n &#x2b24;\n </span>\n }\n</div>\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormArray,\r\n FormBuilder,\r\n} from '@angular/forms';\r\n\r\nimport { LayerHint } from '@myrmidon/cadmus-core';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\n@Component({\r\n selector: 'cadmus-layer-hints',\r\n templateUrl: './layer-hints.component.html',\r\n styleUrls: ['./layer-hints.component.css'],\r\n standalone: false,\r\n})\r\nexport class LayerHintsComponent implements OnInit {\r\n private _hints: LayerHint[];\r\n\r\n @Input()\r\n public get hints(): LayerHint[] {\r\n return this._hints;\r\n }\r\n public set hints(value: LayerHint[]) {\r\n this._hints = value || [];\r\n this.checks.controls = [];\r\n for (let i = 0; i < this._hints.length; i++) {\r\n this.checks.push(this._formBuilder.control(false));\r\n }\r\n }\r\n\r\n @Input()\r\n public targetLocation?: string;\r\n @Input()\r\n public disabled?: boolean;\r\n @Input()\r\n public readonly?: boolean;\r\n\r\n @Output()\r\n public requestEdit: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestDelete: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestMove: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestPatch: EventEmitter<string[]>;\r\n\r\n public form: FormGroup;\r\n public checks: FormArray;\r\n\r\n constructor(\r\n private _formBuilder: FormBuilder,\r\n private _dialogService: DialogService\r\n ) {\r\n this.requestEdit = new EventEmitter<LayerHint>();\r\n this.requestDelete = new EventEmitter<LayerHint>();\r\n this.requestMove = new EventEmitter<LayerHint>();\r\n this.requestPatch = new EventEmitter<string[]>();\r\n this._hints = [];\r\n\r\n this.checks = _formBuilder.array([]);\r\n this.form = _formBuilder.group({\r\n checks: this.checks,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n public emitRequestEdit(hint: LayerHint) {\r\n this.requestEdit.emit(hint);\r\n }\r\n\r\n public emitRequestDelete(hint: LayerHint) {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete fragment at \"${hint.location}\"?`)\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n this.requestDelete.emit(hint);\r\n }\r\n });\r\n }\r\n\r\n public emitRequestMove(hint: LayerHint) {\r\n if (!this.targetLocation) {\r\n return;\r\n }\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Move',\r\n `Move fragment at ${hint.location} to ${this.targetLocation}?`\r\n )\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n this.requestMove.emit(hint);\r\n }\r\n });\r\n }\r\n\r\n public emitRequestPatch() {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this._dialogService\r\n .confirm('Confirm Patch', `Patch the selected fragments?`)\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n const patches: string[] = [];\r\n for (let i = 0; i < this.checks.controls.length; i++) {\r\n const n = this.checks.controls[i].value;\r\n if (n) {\r\n patches.push(this._hints[n - 1].patchOperation!);\r\n }\r\n }\r\n this.requestPatch.emit(patches);\r\n }\r\n });\r\n }\r\n}\r\n","@if (hints) {\n<form [formGroup]=\"form\" (submit)=\"emitRequestPatch()\">\n <table class=\"patches\">\n <thead>\n <tr>\n <th></th>\n <th>location</th>\n <th>description</th>\n <th>patch</th>\n </tr>\n </thead>\n <tbody>\n @for (hint of hints; track hint; let i = $index) {\n <tr>\n @if (!readonly) {\n <td>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this fragment\"\n [disabled]=\"disabled\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this fragment to {{ targetLocation }}\"\n [disabled]=\"\n disabled || !targetLocation || targetLocation === hint.location\n \"\n (click)=\"emitRequestMove(hint)\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this fragment\"\n color=\"warn\"\n [disabled]=\"disabled\"\n (click)=\"emitRequestDelete(hint)\"\n >\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n }\n <td>{{ hint.location }}</td>\n <td>{{ hint.description }}</td>\n <td>\n @if (hint.patchOperation) {\n <mat-checkbox\n matTooltip=\"Apply this patch\"\n [disabled]=\"disabled\"\n [value]=\"(i + 1).toString()\"\n >\n {{ hint.patchOperation }}\n </mat-checkbox>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (targetLocation) {\n <div>move target: {{ targetLocation }}</div>\n }\n <button\n type=\"submit\"\n mat-raised-button\n [disabled]=\"readonly || disabled || form.invalid\"\n >\n apply patches\n </button>\n</form>\n}\n","import {\r\n Component,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n UntypedFormBuilder,\r\n UntypedFormControl,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { Observable, of } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n switchMap,\r\n take,\r\n} from 'rxjs/operators';\r\n\r\nimport { DataPinInfo, IndexLookupDefinitions } from '@myrmidon/cadmus-core';\r\nimport { ItemService } from '@myrmidon/cadmus-api';\r\nimport { DataPage, ErrorWrapper } from '@myrmidon/ng-tools';\r\n\r\n/**\r\n * Generic data pin lookup component. This allows users typing a part\r\n * of a pin's value, and get the full pin. For instance, if you have\r\n * a lookup set of colors and type \"gr\", you might get the pins\r\n * corresponding to \"green\" (e.g. id=color, value=green), \"gray\", etc.\r\n * Usage: add a FormControl to hold a DataPinInfo value; in the HTML\r\n * template set the component's lookupKey, label, initialValue, and\r\n * entryChange handler. The initialValue, if any, should be the initial\r\n * DataPinInfo value.\r\n * If you are using this component as a pure lookup device, don't set\r\n * the initialValue and set resetOnPick=true.\r\n */\r\n@Component({\r\n selector: 'cadmus-lookup-pin',\r\n templateUrl: './lookup-pin.component.html',\r\n styleUrls: ['./lookup-pin.component.css'],\r\n standalone: false,\r\n})\r\nexport class LookupPinComponent implements OnInit {\r\n private _initialValue: string | undefined;\r\n\r\n /**\r\n * The entry value initially set when the component loads.\r\n */\r\n @Input()\r\n public get initialValue(): string | undefined {\r\n return this._initialValue;\r\n }\r\n public set initialValue(value: string | undefined) {\r\n this._initialValue = value;\r\n if (this.lookup) {\r\n this.resetToInitial();\r\n }\r\n }\r\n\r\n /**\r\n * The label to be displayed for this lookup.\r\n */\r\n @Input()\r\n public label: string;\r\n\r\n /**\r\n * The maximum count of lookup entries to retrieve.\r\n * Default is 10.\r\n */\r\n @Input()\r\n public limit: number;\r\n\r\n /**\r\n * True to reset the lookup value after it is picked.\r\n * This is typically used when you use this component\r\n * as a pure lookup device, storing the picked value\r\n * elsewhere when handling its entryChange event.\r\n */\r\n @Input()\r\n public resetOnPick: boolean | undefined;\r\n\r\n /**\r\n * Fired whenever an entry is picked. Usually you should\r\n * cast the received argument to a more specific type.\r\n */\r\n @Output()\r\n public entryChange: EventEmitter<DataPinInfo | null>;\r\n\r\n public form: UntypedFormGroup;\r\n public lookup: UntypedFormControl;\r\n public entries$: Observable<DataPinInfo[]> | undefined;\r\n public entry: DataPinInfo | undefined;\r\n\r\n constructor(\r\n formBuilder: UntypedFormBuilder,\r\n private _itemService: ItemService,\r\n @Inject('indexLookupDefinitions')\r\n private _lookupDefs: IndexLookupDefinitions\r\n ) {\r\n this.label = '';\r\n // events\r\n this.entryChange = new EventEmitter<DataPinInfo | null>();\r\n // form\r\n this.lookup = formBuilder.control(null);\r\n this.form = formBuilder.group({\r\n lookup: this.lookup,\r\n });\r\n this.limit = 10;\r\n }\r\n\r\n /**\r\n * The lookup key to be used for this component.\r\n * This should be a key from the injectable indexLookupDefinitions.\r\n */\r\n @Input()\r\n public lookupKey: string | undefined;\r\n\r\n ngOnInit(): void {\r\n this.entries$ = this.lookup.valueChanges.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap((value: DataPinInfo | string) => {\r\n // if it's a string it's a filter; else it's the entry got\r\n if (typeof value === 'string') {\r\n return this.lookupEntries(value, this.limit || 10);\r\n } else {\r\n return of([value]);\r\n }\r\n })\r\n );\r\n // setup initial value if its name was specified\r\n if (this._initialValue) {\r\n this.resetToInitial();\r\n }\r\n }\r\n\r\n private lookupEntries(\r\n filter: string,\r\n limit: number\r\n ): Observable<DataPinInfo[]> {\r\n // get the lookup definition\r\n if (!this.lookupKey || !filter) {\r\n return of([]);\r\n }\r\n const ld = this._lookupDefs[this.lookupKey];\r\n if (!ld) {\r\n return of([]);\r\n }\r\n\r\n // build query\r\n const query = ld.roleId\r\n ? `[partTypeId=${ld.typeId}] AND [roleId=${ld.roleId}] AND [name=${ld.name}] AND [value^=${filter}]`\r\n : `[partTypeId=${ld.typeId}] AND [name=${ld.name}] AND [value^=${filter}]`;\r\n\r\n // search\r\n return this._itemService.searchPins(query, 1, limit).pipe(\r\n map((w: ErrorWrapper<DataPage<DataPinInfo>>) => {\r\n if (w.error) {\r\n return [];\r\n } else {\r\n return w.value?.items || [];\r\n }\r\n })\r\n );\r\n }\r\n\r\n private resetToInitial(): void {\r\n this.lookupEntries(this._initialValue || '', 1)\r\n .pipe(take(1))\r\n .subscribe((entries) => {\r\n this.lookup.setValue(entries.length ? entries[0] : undefined);\r\n });\r\n }\r\n\r\n public clear(): void {\r\n this.entry = undefined;\r\n this.lookup.setValue(null);\r\n this.entryChange.emit(null);\r\n }\r\n\r\n public entryToName(entry: DataPinInfo): string {\r\n return entry?.value;\r\n }\r\n\r\n public pickEntry(entry: DataPinInfo): void {\r\n this.entry = entry;\r\n this.entryChange.emit(entry);\r\n if (this.resetOnPick) {\r\n this.clear();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n","import { Component, Input } from '@angular/core';\r\n\r\nimport { Thesaurus, FacetDefinition, PartTypeIds } from '@myrmidon/cadmus-core';\r\nimport { FacetService } from '@myrmidon/cadmus-api';\r\n\r\nimport { ColorService } from '../../services/color.service';\r\n\r\nexport enum PartBadgeType {\r\n partAndRole = 0,\r\n partOnly = 1,\r\n roleOnly = 2,\r\n}\r\n\r\n@Component({\r\n selector: 'cadmus-part-badge',\r\n templateUrl: './part-badge.component.html',\r\n styleUrls: ['./part-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class PartBadgeComponent {\r\n private _typeThesaurus?: Thesaurus;\r\n private _facetDefinition?: FacetDefinition;\r\n private _partTypeIds?: PartTypeIds;\r\n\r\n public typeName: string | undefined;\r\n public roleName: string | undefined;\r\n public color: string;\r\n public contrastColor: string;\r\n\r\n /**\r\n * The badge type: 0=part and role, 1=part only, 2=role only.\r\n */\r\n @Input()\r\n public badgeType: PartBadgeType;\r\n\r\n /**\r\n * The types thesaurus.\r\n */\r\n @Input()\r\n public get typeThesaurus(): Thesaurus | undefined {\r\n return this._typeThesaurus;\r\n }\r\n public set typeThesaurus(value: Thesaurus | undefined) {\r\n this._typeThesaurus = value;\r\n this.updateBadge();\r\n }\r\n\r\n /**\r\n * The part's facet definition.\r\n */\r\n @Input()\r\n public get facetDefinition(): FacetDefinition | undefined {\r\n return this._facetDefinition;\r\n }\r\n public set facetDefinition(value: FacetDefinition | undefined) {\r\n this._facetDefinition = value;\r\n this.updateBadge();\r\n }\r\n\r\n /**\r\n * The part type IDs.\r\n */\r\n @Input()\r\n public get partTypeIds(): PartTypeIds | undefined {\r\n return this._partTypeIds;\r\n }\r\n public set partTypeIds(value: PartTypeIds | undefined) {\r\n this._partTypeIds = value;\r\n this.updateBadge();\r\n }\r\n\r\n constructor(\r\n private _facetService: FacetService,\r\n private _colorService: ColorService\r\n ) {\r\n this.badgeType = PartBadgeType.partAndRole;\r\n this.color = 'transparent';\r\n this.contrastColor = 'black';\r\n }\r\n\r\n private getPartColor(typeId: string, roleId?: string): string {\r\n if (!this._facetDefinition) {\r\n return 'transparent';\r\n }\r\n return this._facetService.getPartColor(\r\n typeId,\r\n roleId,\r\n this._facetDefinition\r\n );\r\n }\r\n\r\n private getTypeIdName(typeId: string): string {\r\n if (!this._typeThesaurus) {\r\n return typeId;\r\n }\r\n // strip :suffix if any\r\n const i = typeId.lastIndexOf(':');\r\n if (i > -1) {\r\n typeId = typeId.substring(0, i);\r\n }\r\n const entry = this._typeThesaurus.entries?.find((e) => e.id === typeId);\r\n return entry ? entry.value : typeId;\r\n }\r\n\r\n private getRoleIdName(roleId?: string): string | undefined {\r\n if (!roleId || !roleId.startsWith('fr.')) {\r\n return roleId;\r\n }\r\n return this.getTypeIdName(roleId);\r\n }\r\n\r\n private updateBadge(): void {\r\n if (this._partTypeIds) {\r\n this.color = this.getPartColor(\r\n this._partTypeIds.typeId,\r\n this._partTypeIds.roleId\r\n );\r\n this.typeName = this.getTypeIdName(this._partTypeIds.typeId);\r\n this.roleName = this.getRoleIdName(this._partTypeIds.roleId);\r\n } else {\r\n this.color = 'transparent';\r\n this.typeName = undefined;\r\n this.roleName = undefined;\r\n }\r\n this.contrastColor = this._colorService.getContrastColor(this.color);\r\n }\r\n}\r\n","@if (badgeType !== 2) {\n <span class=\"part-badge\"\n [style.background-color]=\"color\"\n [style.color]=\"contrastColor\"\n >\n {{ typeName }}\n </span>\n}\n@if (badgeType !== 1 && roleName) {\n <span class=\"role-badge\">\n {{ roleName }}\n </span>\n}\n","import { NestedTreeControl } from '@angular/cdk/tree';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { MatTreeNestedDataSource } from '@angular/material/tree';\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\ninterface TreeNode {\r\n id: string;\r\n label: string;\r\n originalLabel?: string;\r\n parent?: TreeNode;\r\n children?: TreeNode[];\r\n clickable?: boolean;\r\n}\r\n\r\n/**\r\n * A label rendering function which removes from a label\r\n * all the characters past the last colon, trimming the result.\r\n * This is a typical rendering when dealing with hierarchical\r\n * thesaurus entries, e.g. \"furniture: table: color\", where\r\n * we can shorten the label to just \"color\", as \"furniture\"\r\n * and \"table\" are its ancestors.\r\n */\r\nexport const renderLabelFromLastColon = (label: string): string => {\r\n if (!label) {\r\n return label;\r\n }\r\n const i = label.lastIndexOf(':');\r\n return i > -1 && i + 1 < label.length ? label.substring(i + 1).trim() : label;\r\n};\r\n\r\n/**\r\n * Thesaurus tree component.\r\n * This component displays a set of hierarchical thesaurus entries\r\n * in a tree, provided that each entry marks its hierarchy with\r\n * dots. For instance, say you have the hierarchy \"furniture\" -\r\n * \"type\" - \"color\". You might have an entry whose ID is\r\n * \"furniture.table.red\", with a sibling \"furniture.table.green\",\r\n * and a parent \"furniture.table\". This parent is there only to\r\n * provide a label to the parent node, but only leaf nodes can be\r\n * picked by the user. Whenever one is picked, the entryChange\r\n * event is emitted. Note that even if you specify a label renderer\r\n * function, the event always emits the original label.\r\n */\r\n@Component({\r\n selector: 'cadmus-thesaurus-tree',\r\n templateUrl: './thesaurus-tree.component.html',\r\n styleUrls: ['./thesaurus-tree.component.css'],\r\n standalone: false,\r\n})\r\nexport class ThesaurusTreeComponent implements OnInit {\r\n private _entries?: ThesaurusEntry[];\r\n\r\n /**\r\n * The thesaurus entries.\r\n */\r\n @Input()\r\n public get entries(): ThesaurusEntry[] | undefined {\r\n return this._entries;\r\n }\r\n public set entries(value: ThesaurusEntry[] | undefined) {\r\n if (this._entries !== value) {\r\n this._entries = value;\r\n this.initTree();\r\n }\r\n }\r\n\r\n /**\r\n * The label for the root node.\r\n */\r\n @Input()\r\n public rootLabel: string;\r\n /**\r\n * The optional node label rendering function.\r\n */\r\n @Input()\r\n public renderLabel: ((label: string) => string) | undefined;\r\n /**\r\n * Fired when a thesaurus entry is selected.\r\n */\r\n @Output()\r\n public entryChange: EventEmitter<ThesaurusEntry>;\r\n\r\n public root: TreeNode;\r\n public treeControl: NestedTreeControl<TreeNode>;\r\n public treeDataSource: MatTreeNestedDataSource<TreeNode>;\r\n\r\n public filter: FormControl<string | null>;\r\n public form: FormGroup;\r\n public foundNodes: TreeNode[] | undefined;\r\n\r\n public hasChildren = (index: number, node: TreeNode) => {\r\n return node && node.children && node.children.length > 0;\r\n };\r\n\r\n public isRoot = (index: number, node: TreeNode) => {\r\n return node && node.id === '@root';\r\n };\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // tree\r\n this.entryChange = new EventEmitter<ThesaurusEntry>();\r\n this.treeControl = new NestedTreeControl<TreeNode>((node) => node.children);\r\n this.treeDataSource = new MatTreeNestedDataSource<TreeNode>();\r\n this.rootLabel = '-';\r\n this.root = { id: '@root', label: '-', children: [] };\r\n // filter\r\n this.filter = formBuilder.control(null);\r\n this.form = formBuilder.group({\r\n filter: this.filter,\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initTree();\r\n }\r\n\r\n private initTree(): void {\r\n this.foundNodes = undefined;\r\n\r\n this.root = this.buildTreeModel(this._entries || []);\r\n this.treeDataSource.data = [this.root];\r\n // https://github.com/angular/components/issues/12469\r\n this.treeControl.dataNodes = this.treeDataSource.data;\r\n }\r\n\r\n private getLabel(label: string): string {\r\n return this.renderLabel ? this.renderLabel(label) : label;\r\n }\r\n\r\n private addNode(\r\n entry: ThesaurusEntry,\r\n separator: string,\r\n root: TreeNode\r\n ): void {\r\n const components = entry.id.split(separator);\r\n\r\n // walk the tree up to the last existing component\r\n let i = 0;\r\n let node = root;\r\n const idParts: string[] = [];\r\n\r\n // for each component:\r\n while (i < components.length) {\r\n idParts.push(components[i]);\r\n\r\n // stop walking when the node has no more children\r\n if (!node.children) {\r\n break;\r\n }\r\n // find target among children\r\n const targetId = idParts.join(separator);\r\n const existing = node.children.find((c) => {\r\n return c.id === targetId;\r\n });\r\n if (existing) {\r\n node = existing;\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // node is now the last existing component; use it as the ancestor\r\n // for all the remaining components (starting from i)\r\n while (i < components.length) {\r\n if (!node.children) {\r\n node.children = [];\r\n }\r\n const isLast = i + 1 === components.length;\r\n const label = isLast ? entry.value : components[i];\r\n const child: TreeNode = {\r\n label: isLast ? this.getLabel(label) : label,\r\n id: isLast ? entry.id : idParts.join(separator),\r\n parent: node,\r\n children: [],\r\n };\r\n if (label !== child.label) {\r\n child.originalLabel = label;\r\n }\r\n node.children.push(child);\r\n node = child;\r\n i++;\r\n }\r\n }\r\n\r\n /**\r\n * Build a tree model from a list of name=value pairs,\r\n * where each value can include one or more components separated by\r\n * the specified separator.\r\n * @param entries The entries to add.\r\n * @param separator string The separator string to use for values.\r\n */\r\n public buildTreeModel(entries: ThesaurusEntry[], separator = '.'): TreeNode {\r\n const root: TreeNode = {\r\n id: '@root',\r\n label: this.rootLabel || '-',\r\n };\r\n if (!entries) {\r\n return root;\r\n }\r\n entries.forEach((entry) => {\r\n this.addNode(entry, separator, root);\r\n });\r\n return root;\r\n }\r\n\r\n public onTreeNodeClick(node: TreeNode): void {\r\n if (node.children && node.children.length > 0) {\r\n return;\r\n }\r\n this.entryChange.emit({\r\n id: node.id,\r\n value: node.originalLabel || node.label,\r\n });\r\n }\r\n\r\n public expandAll(): void {\r\n this.treeControl.expandAll();\r\n }\r\n\r\n public collapseAll(): void {\r\n this.treeControl.collapseAll();\r\n }\r\n\r\n private expandFromNode(node: TreeNode): void {\r\n while (node.parent) {\r\n node = node.parent;\r\n this.treeControl.expand(node);\r\n }\r\n }\r\n\r\n private expandMatchingNodes(\r\n node: TreeNode,\r\n filter: string,\r\n found: TreeNode[]\r\n ): void {\r\n if (node.label.toLowerCase().includes(filter)) {\r\n found.push(node);\r\n this.expandFromNode(node);\r\n }\r\n if (node.children?.length) {\r\n node.children.forEach((child) => {\r\n this.expandMatchingNodes(child, filter, found);\r\n });\r\n }\r\n }\r\n\r\n public find(): void {\r\n if (!this.filter.value?.length) {\r\n return;\r\n }\r\n this.treeControl.collapseAll();\r\n const foundNodes: TreeNode[] = [];\r\n this.expandMatchingNodes(\r\n this.treeDataSource.data[0],\r\n this.filter.value.toLowerCase(),\r\n foundNodes\r\n );\r\n this.foundNodes = foundNodes;\r\n }\r\n\r\n public resetFilter(): void {\r\n this.filter.reset();\r\n this.foundNodes = undefined;\r\n }\r\n\r\n public isFoundNode(node: TreeNode): boolean {\r\n if (!this.foundNodes) {\r\n return false;\r\n }\r\n return this.foundNodes?.length > 0 && this.foundNodes.indexOf(node) > -1;\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n color=\"warn\"\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n","import {\r\n Input,\r\n Output,\r\n EventEmitter,\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n PristineChangeEvent,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\n\r\nimport { deepCopy } from '@myrmidon/ng-tools';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\nimport {\r\n Fragment,\r\n Part,\r\n TextLayerPart,\r\n ThesauriSet,\r\n} from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * The identifiers for an edited part.\r\n */\r\nexport interface PartIdentity {\r\n itemId: string;\r\n typeId: string;\r\n partId: string | null;\r\n roleId: string | null;\r\n}\r\n\r\n/**\r\n * The identifiers for an edited fragment.\r\n */\r\nexport interface FragmentIdentity extends PartIdentity {\r\n frTypeId: string;\r\n frRoleId: string | null;\r\n loc: string;\r\n}\r\n\r\n/**\r\n * An edited part or fragment.\r\n */\r\nexport interface EditedObject<T extends Part | Fragment> {\r\n value: T | null;\r\n thesauri: ThesauriSet;\r\n layerPart?: TextLayerPart;\r\n baseText?: string;\r\n}\r\n\r\n/**\r\n * Base class for part/fragment editors dumb components.\r\n * The model type is the templated argument T.\r\n *\r\n * When deriving from this editor, be sure to call super.ngOnInit()\r\n * from the derived editor's ngOnInit handler.\r\n */\r\n@Component({\n template: '',\n standalone: false\n})\r\nexport abstract class ModelEditorComponentBase<T extends Part | Fragment>\r\n implements OnInit, OnDestroy\r\n{\r\n private readonly _mebSubs: Subscription[] = [];\r\n private _identity: PartIdentity | FragmentIdentity | undefined;\r\n private _data?: EditedObject<T>;\r\n\r\n /**\r\n * The root form of the editor.\r\n */\r\n public form: FormGroup | UntypedFormGroup;\r\n\r\n /**\r\n * The current user.\r\n */\r\n public user?: User;\r\n\r\n /**\r\n * The user authorization level (0-4).\r\n */\r\n public userLevel: number;\r\n\r\n /**\r\n * An observable with the current dirty state of the editor.\r\n */\r\n public isDirty$: BehaviorSubject<boolean>;\r\n\r\n /**\r\n * The identity of the edited model.\r\n */\r\n @Input()\r\n public get identity(): PartIdentity | FragmentIdentity | undefined {\r\n return this._identity;\r\n }\r\n public set identity(value: PartIdentity | FragmentIdentity | undefined) {\r\n this._identity = value;\r\n if (this.identity?.partId) {\r\n const part = this._data?.value as Part;\r\n if (part && !part.id) {\r\n console.log('part identity updated');\r\n part.id = this.identity.partId;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The data being edited.\r\n */\r\n @Input()\r\n public get data(): EditedObject<T> | undefined {\r\n return this._data;\r\n }\r\n public set data(value: EditedObject<T> | undefined) {\r\n this._data = value;\r\n this.onDataSet(value);\r\n }\r\n\r\n /**\r\n * Event emitted when the edited data is saved.\r\n */\r\n @Output()\r\n public dataChange: EventEmitter<T>;\r\n\r\n /**\r\n * Event emitted when the dirty state has changed.\r\n * This event just reflects changes in isDirty$, and is a facility\r\n * for propagating it to the parent's component.\r\n */\r\n @Output()\r\n public dirtyChange: EventEmitter<boolean>;\r\n\r\n /**\r\n * True to disable the editor.\r\n */\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n }\r\n }\r\n\r\n /**\r\n * Emitted when the user requests to close the editor.\r\n */\r\n @Output()\r\n public editorClose: EventEmitter<any>;\r\n\r\n /**\r\n * Create a new instance of the editor.\r\n *\r\n * @param authService The authentication service.\r\n * @param formBuilder Form builder.\r\n */\r\n constructor(\r\n protected authService: AuthJwtService,\r\n protected formBuilder: FormBuilder\r\n ) {\r\n this.dataChange = new EventEmitter<T>();\r\n this.editorClose = new EventEmitter<any>();\r\n this.dirtyChange = new EventEmitter<boolean>();\r\n this.form = formBuilder.group({});\r\n this.userLevel = 0;\r\n this.isDirty$ = new BehaviorSubject<boolean>(false);\r\n }\r\n\r\n public ngOnInit(): void {\r\n // form\r\n this.form = this.buildForm(this.formBuilder);\r\n\r\n // dirty check on form\r\n this._mebSubs.push(\r\n this.form.events.subscribe((e) => {\r\n if (e instanceof PristineChangeEvent) {\r\n console.log('dirty change: ', !e.pristine);\r\n this.isDirty$.next(!e.pristine);\r\n this.dirtyChange.emit(this.isDirty$.value);\r\n }\r\n })\r\n );\r\n\r\n // auth service\r\n this.userLevel = this.getCurrentUserLevel();\r\n this._mebSubs.push(\r\n this.authService.currentUser$.subscribe((user: User | null) => {\r\n this.updateUserProperties(user);\r\n })\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._mebSubs.forEach((s) => s.unsubscribe());\r\n }\r\n\r\n /**\r\n * Implement in the derived class to build the root form of this editor.\r\n * The form built will then be attached to the dirty check mechanism\r\n * provided by this base class.\r\n *\r\n * @param formBuilder The form builder.\r\n */\r\n protected abstract buildForm(\r\n formBuilder: FormBuilder\r\n ): FormGroup | UntypedFormGroup;\r\n\r\n /**\r\n * Get the authorization level of the current user if any.\r\n * @returns 4-1 for admin, editor, operator, visitor; else 0.\r\n */\r\n private getCurrentUserLevel(): number {\r\n const user = this.authService.currentUserValue;\r\n if (!user || !user.roles) {\r\n return 0;\r\n }\r\n if (user.roles.indexOf('admin') > -1) {\r\n return 4;\r\n }\r\n if (user.roles.indexOf('editor') > -1) {\r\n return 3;\r\n }\r\n if (user.roles.indexOf('operator') > -1) {\r\n return 2;\r\n }\r\n if (user.roles.indexOf('visitor') > -1) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n private updateUserProperties(user: User | null): void {\r\n if (!user) {\r\n this.user = undefined;\r\n this.userLevel = 0;\r\n } else {\r\n this.user = user;\r\n this.userLevel = this.getCurrentUserLevel();\r\n }\r\n }\r\n\r\n /**\r\n * Update the data value property and emit the corresponding\r\n * modelChange event.\r\n *\r\n * @param value The value.\r\n */\r\n protected updateValue(value: T): void {\r\n this._data = { ...(this._data || { thesauri: {} }), value: value };\r\n this.dataChange.emit(value);\r\n }\r\n\r\n /**\r\n * Invoked whenever the model property is set (=data comes from input model\r\n * property), unless setting it via updateModel. Implement to update the form\r\n * controls to reflect the new model data.\r\n *\r\n * @param data The data set, or undefined.\r\n */\r\n protected abstract onDataSet(data?: EditedObject<T>): void;\r\n\r\n /**\r\n * Get a new object from the edited part if any, else as a new part.\r\n *\r\n * @param typeId The part's type ID. This is a constant received\r\n * from the implementor.\r\n * @returns Part object.\r\n */\r\n protected getEditedPart(typeId: string): Part {\r\n const part = deepCopy(this.data?.value) as Part | null;\r\n return (\r\n part || {\r\n itemId: this.identity!.itemId || '',\r\n id: '',\r\n typeId: typeId,\r\n roleId: this.identity!.roleId || undefined,\r\n timeCreated: new Date(),\r\n creatorId: '',\r\n timeModified: new Date(),\r\n userId: '',\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Get a new object from the edited fragment if any, else a new fragment.\r\n *\r\n * @returns Fragment object.\r\n */\r\n protected getEditedFragment(): Fragment {\r\n const fr = deepCopy(this.data?.value) as Fragment | null;\r\n return (\r\n fr || {\r\n location: (this.identity as FragmentIdentity).loc,\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Implement in derived classes to get the data from form's controls.\r\n * This is used when saving.\r\n */\r\n protected abstract getValue(): T;\r\n\r\n /**\r\n * True if this editor has the thesaurus having the specified key in the\r\n * loaded thesauri set.\r\n */\r\n protected hasThesaurus(key: string): boolean {\r\n return this.data?.thesauri && this.data.thesauri[key] ? true : false;\r\n }\r\n\r\n /**\r\n * Emit a request to close the editor.\r\n */\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n /**\r\n * Save the edited data if valid.\r\n */\r\n public save(): void {\r\n if (this.form.invalid) {\r\n console.warn('Save invoked with invalid form');\r\n return;\r\n }\r\n const value = this.getValue();\r\n this.updateValue(value);\r\n // the form is no more dirty\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n ValidatorFn,\r\n ValidationErrors,\r\n FormGroup,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\n\r\n// https://www.tektutorialshub.com/angular/custom-validator-with-parameters-in-angular/\r\n\r\n/**\r\n * General-purpose custom validators.\r\n */\r\n// https://github.com/angular/angular/issues/18867#issuecomment-357484102\r\n// @dynamic\r\nexport class CustomValidators {\r\n /**\r\n * Validates a FormGroup or FormArray control checking if the count of their\r\n * controls with a true value is equal to or greater than the specified\r\n * number.\r\n *\r\n * @param min The minimum number of checked controls.\r\n */\r\n public static minChecked(min = 1): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n // https://trungk18.com/experience/angular-form-array-validate-at-least-one-checkbox-was-selected/\r\n let checked = 0;\r\n\r\n const group = control as FormGroup || control as UntypedFormGroup;\r\n Object.keys(group.controls).forEach((key) => {\r\n const ctl = group.controls[key];\r\n if (ctl.value === true) {\r\n checked++;\r\n }\r\n });\r\n\r\n if (checked < min) {\r\n return {\r\n minChecked: true,\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n}\r\n","import { AbstractControl } from '@angular/forms';\r\n\r\n/**\r\n * Simple JSON validator.\r\n */\r\nexport class JsonValidators {\r\n public static json(\r\n control: AbstractControl\r\n ): { [key: string]: boolean } | null {\r\n if (!control.value) {\r\n // we allow empty code\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\n\nimport { User } from '@myrmidon/auth-jwt-login';\nimport { DataPage } from '@myrmidon/ng-tools';\n\nimport { UserService } from '@myrmidon/cadmus-api';\nimport { UserInfo } from '@myrmidon/cadmus-core';\nimport {\n RefLookupFilter,\n RefLookupService,\n} from '@myrmidon/cadmus-refs-lookup';\n\n/**\n * Service for users lookup.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UserRefLookupService implements RefLookupService {\n constructor(private _userService: UserService) {}\n\n lookup(filter: RefLookupFilter, options?: any): Observable<UserInfo[]> {\n return this._userService\n .getUsers(\n {\n name: filter.text,\n },\n 1,\n filter.limit\n )\n .pipe(\n map((page: DataPage<UserInfo>) => {\n return page.items;\n })\n );\n }\n\n getName(item: User): string {\n return item?.userName;\n }\n}\n","// https://github.com/angular/angular/issues/10887\r\n\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Extract arguments of function\r\n */\r\nexport type ArgumentsType<F> = F extends (...args: infer A) => any ? A : never;\r\n\r\n/**\r\n * Creates an object like O. Optionally provide minimum set of properties P\r\n * which the objects must share to conform.\r\n */\r\ntype ObjectLike<O extends object, P extends keyof O = keyof O> = Pick<O, P>;\r\n\r\n/**\r\n * Extract a touched changed observable from an abstract control.\r\n * Use in component code like:\r\n * this.touchedChanges$ = extractTouchedChanges(this.form);\r\n *\r\n * @param control AbstractControl-like object with markAsTouched method.\r\n */\r\nexport const extractTouchedChanges = (\r\n control: ObjectLike<AbstractControl, 'markAsTouched' | 'markAsUntouched'>\r\n): Observable<boolean> => {\r\n const prevMarkAsTouched = control.markAsTouched;\r\n const prevMarkAsUntouched = control.markAsUntouched;\r\n\r\n const touchedChanges$ = new Subject<boolean>();\r\n\r\n function nextMarkAsTouched(\r\n ...args: ArgumentsType<AbstractControl['markAsTouched']>\r\n ): void {\r\n touchedChanges$.next(true);\r\n prevMarkAsTouched.bind(control)(...args);\r\n }\r\n\r\n function nextMarkAsUntouched(\r\n ...args: ArgumentsType<AbstractControl['markAsUntouched']>\r\n ): void {\r\n touchedChanges$.next(false);\r\n prevMarkAsUntouched.bind(control)(...args);\r\n }\r\n\r\n control.markAsTouched = nextMarkAsTouched;\r\n control.markAsUntouched = nextMarkAsUntouched;\r\n\r\n return touchedChanges$;\r\n};\r\n\r\n/**\r\n * Extract a pristine changed observable from an abstract control.\r\n * Use in component code like:\r\n * this.pristineChanges$ = extractPristineChanges(this.form);\r\n *\r\n * @param control AbstractControl-like object with markAsPristine and markAsDirty\r\n * methods.\r\n */\r\nexport const extractPristineChanges = (\r\n control: ObjectLike<AbstractControl, 'markAsPristine' | 'markAsDirty'>\r\n): Observable<boolean> => {\r\n const prevMarkAsPristine = control.markAsPristine;\r\n const prevMarkAsDirty = control.markAsDirty;\r\n\r\n const pristineChanges$ = new Subject<boolean>();\r\n\r\n function nextMarkAsPristine(\r\n ...args: ArgumentsType<AbstractControl['markAsPristine']>\r\n ): void {\r\n pristineChanges$.next(true);\r\n prevMarkAsPristine.bind(control)(...args);\r\n }\r\n\r\n function nextMarkAsDirty(\r\n ...args: ArgumentsType<AbstractControl['markAsDirty']>\r\n ): void {\r\n pristineChanges$.next(false);\r\n prevMarkAsDirty.bind(control)(...args);\r\n }\r\n\r\n control.markAsPristine = nextMarkAsPristine;\r\n control.markAsDirty = nextMarkAsDirty;\r\n\r\n return pristineChanges$;\r\n};\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// material\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule } from '@angular/material/tree';\r\n\r\n// myrmidon\r\nimport { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\n// cadmus\r\nimport { CadmusCoreModule } from '@myrmidon/cadmus-core';\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { CloseSaveButtonsComponent } from './components/close-save-buttons/close-save-buttons.component';\r\nimport { ErrorListComponent } from './components/error-list/error-list.component';\r\nimport { FacetBadgeComponent } from './components/facet-badge/facet-badge.component';\r\nimport { FlagsBadgeComponent } from './components/flags-badge/flags-badge.component';\r\nimport { DecoratedTokenTextComponent } from './components/decorated-token-text/decorated-token-text.component';\r\nimport { LayerHintsComponent } from './components/layer-hints/layer-hints.component';\r\nimport { LookupPinComponent } from './components/lookup-pin/lookup-pin.component';\r\nimport { PartBadgeComponent } from './components/part-badge/part-badge.component';\r\nimport { ThesaurusTreeComponent } from './components/thesaurus-tree/thesaurus-tree.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n // material\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTreeModule,\r\n MatTooltipModule,\r\n // Cadmus\r\n NgToolsModule,\r\n CadmusCoreModule,\r\n RefLookupComponent,\r\n ],\r\n declarations: [\r\n CloseSaveButtonsComponent,\r\n DecoratedTokenTextComponent,\r\n ErrorListComponent,\r\n FacetBadgeComponent,\r\n FlagsBadgeComponent,\r\n LayerHintsComponent,\r\n LookupPinComponent,\r\n PartBadgeComponent,\r\n ThesaurusTreeComponent,\r\n ],\r\n exports: [\r\n CloseSaveButtonsComponent,\r\n DecoratedTokenTextComponent,\r\n ErrorListComponent,\r\n FacetBadgeComponent,\r\n FlagsBadgeComponent,\r\n LayerHintsComponent,\r\n LookupPinComponent,\r\n PartBadgeComponent,\r\n ThesaurusTreeComponent,\r\n ]\r\n})\r\nexport class CadmusUiModule {}\r\n","/*\r\n * Public API Surface of cadmus-ui\r\n */\r\n\r\nexport * from './lib/components/close-save-buttons/close-save-buttons.component';\r\nexport * from './lib/components/decorated-token-text/decorated-token-text.component';\r\nexport * from './lib/components/error-list/error-list.component';\r\nexport * from './lib/components/facet-badge/facet-badge.component';\r\nexport * from './lib/components/flags-badge/flags-badge.component';\r\nexport * from './lib/components/layer-hints/layer-hints.component';\r\nexport * from './lib/components/lookup-pin/lookup-pin.component';\r\nexport * from './lib/components/part-badge/part-badge.component';\r\nexport * from './lib/components/thesaurus-tree/thesaurus-tree.component';\r\n\r\nexport * from './lib/components/model-editor-component-base';\r\n\r\nexport * from './lib/services/color.service';\r\n\r\nexport * from './lib/validators/custom-validators';\r\nexport * from './lib/validators/json-validators';\r\n\r\nexport * from './lib/services/user-ref-lookup.service';\r\n\r\nexport * from './lib/utils';\r\n\r\nexport * from './lib/cadmus-ui.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i1.ColorService","i6","i3","i4","i5","i7","i9","i2.ColorService","i8","map"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-cadmus-ui.mjs","sources":["../../../../projects/myrmidon/cadmus-ui/src/lib/components/close-save-buttons/close-save-buttons.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/close-save-buttons/close-save-buttons.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/decorated-token-text/decorated-token-text.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/decorated-token-text/decorated-token-text.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/error-list/error-list.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/error-list/error-list.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/services/color.service.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/facet-badge/facet-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/facet-badge/facet-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/flags-badge/flags-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/flags-badge/flags-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/layer-hints/layer-hints.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/layer-hints/layer-hints.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/lookup-pin/lookup-pin.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/lookup-pin/lookup-pin.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/part-badge/part-badge.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/part-badge/part-badge.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/thesaurus-tree/thesaurus-tree.component.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/components/thesaurus-tree/thesaurus-tree.component.html","../../../../projects/myrmidon/cadmus-ui/src/lib/components/model-editor-component-base.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/validators/custom-validators.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/validators/json-validators.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/services/user-ref-lookup.service.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/utils.ts","../../../../projects/myrmidon/cadmus-ui/src/lib/cadmus-ui.module.ts","../../../../projects/myrmidon/cadmus-ui/src/public-api.ts","../../../../projects/myrmidon/cadmus-ui/src/myrmidon-cadmus-ui.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormGroup, UntypedFormGroup } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cadmus-close-save-buttons',\r\n templateUrl: './close-save-buttons.component.html',\r\n styleUrls: ['./close-save-buttons.component.css'],\r\n standalone: false,\r\n})\r\nexport class CloseSaveButtonsComponent {\r\n @Input()\r\n public form?: FormGroup | UntypedFormGroup;\r\n @Input()\r\n public noSave?: boolean;\r\n\r\n @Output()\r\n public closeRequest: EventEmitter<any>;\r\n\r\n constructor() {\r\n this.closeRequest = new EventEmitter();\r\n }\r\n\r\n public close(): void {\r\n this.closeRequest.emit();\r\n }\r\n}\r\n","@if (form) {\n<button type=\"button\" mat-raised-button class=\"mat-warn\" (click)=\"close()\">\n <mat-icon>cancel</mat-icon>\n close\n</button>\n@if (!noSave) {\n<button\n type=\"submit\"\n [disabled]=\"form.invalid\"\n mat-raised-button\n class=\"mat-primary\"\n style=\"margin-left: 8px\"\n>\n <mat-icon>check_circle</mat-icon>\n save\n</button>\n} }\n","import { Component, OnInit, ViewChild, ElementRef, Input } from '@angular/core';\r\nimport { TokenLocation, TextLayerService } from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * Decorated token-based text visualizer. This is used when editing\r\n * token-based text layers.\r\n */\r\n@Component({\r\n selector: 'cadmus-decorated-token-text',\r\n templateUrl: './decorated-token-text.component.html',\r\n styleUrls: ['./decorated-token-text.component.css'],\r\n standalone: false,\r\n})\r\nexport class DecoratedTokenTextComponent implements OnInit {\r\n @ViewChild('textElem') _textElement?: ElementRef;\r\n private _baseText: string;\r\n private _locations: TokenLocation[];\r\n private _selectedLoc?: TokenLocation;\r\n\r\n /**\r\n * The base text.\r\n */\r\n @Input()\r\n public get baseText(): string {\r\n return this._baseText;\r\n }\r\n public set baseText(value: string) {\r\n this._baseText = value || '';\r\n this.decorate();\r\n }\r\n\r\n /**\r\n * The token-based locations of all the fragments in the layer.\r\n */\r\n @Input()\r\n public get locations(): TokenLocation[] {\r\n return this._locations;\r\n }\r\n public set locations(value: TokenLocation[]) {\r\n this._locations = value || [];\r\n this.decorate();\r\n }\r\n\r\n /**\r\n * A selected token-based location.\r\n */\r\n @Input()\r\n public get selectedLocation(): TokenLocation | undefined {\r\n return this._selectedLoc;\r\n }\r\n public set selectedLocation(value: TokenLocation | undefined) {\r\n this._selectedLoc = value;\r\n this.decorate();\r\n }\r\n\r\n public text?: string; // rendered HTML text\r\n\r\n constructor(private _textLayerService: TextLayerService) {\r\n this._baseText = '';\r\n this._locations = [];\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.decorate();\r\n }\r\n\r\n private decorate(): void {\r\n this.text = this._textLayerService.render(\r\n this._baseText,\r\n this._locations,\r\n this._selectedLoc\r\n );\r\n }\r\n}\r\n","<div [innerHtml]=\"text | safeHtml: 'html'\" id=\"text\" #textElem></div>\r\n","import { Component, OnInit, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'cadmus-error-list',\r\n templateUrl: './error-list.component.html',\r\n styleUrls: ['./error-list.component.css'],\r\n standalone: false,\r\n})\r\nexport class ErrorListComponent implements OnInit {\r\n @Input()\r\n public errors?: string[];\r\n\r\n constructor() {}\r\n\r\n public ngOnInit(): void {}\r\n}\r\n","@if (errors) {\n <ul>\n @for (error of errors; track error) {\n <li>{{error}}</li>\n }\n </ul>\n}\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Colors helper service.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ColorService {\r\n /**\r\n * Get the R,G,B components of the color expressed by the specified\r\n * RGB string (3 or 6 digits format).\r\n *\r\n * @param rgb The RGB color string (3 or 6 digits).\r\n * @returns An array where [0]=R, [1]=G, [2]=B, or null if invalid\r\n * input string.\r\n */\r\n public getRgb(rgb: string): number[] | null {\r\n if (!rgb) {\r\n return null;\r\n }\r\n\r\n // RGB\r\n let m = rgb.match(/^#?([0-9a-f]{3})$/i);\r\n if (m && m[1]) {\r\n // in 3-characters format, each value is multiplied by 0x11 to give an\r\n // even scale from 0x00 to 0xff\r\n return [\r\n parseInt(m[1].charAt(0), 16) * 0x11,\r\n parseInt(m[1].charAt(1), 16) * 0x11,\r\n parseInt(m[1].charAt(2), 16) * 0x11,\r\n ];\r\n }\r\n // RRGGBB\r\n m = rgb.match(/^#?([0-9a-f]{6})$/i);\r\n if (m && m[1]) {\r\n return [\r\n parseInt(m[1].substring(0, 2), 16),\r\n parseInt(m[1].substring(2, 4), 16),\r\n parseInt(m[1].substring(4, 6), 16),\r\n ];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get black or white according to which of them has the maximum contrast\r\n * against the specified color.\r\n *\r\n * @param rgb The RGB color string.\r\n * @returns Black or white. If rgb is invalid, always black.\r\n */\r\n public getContrastColor(rgb: string): string {\r\n // https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color\r\n const values = this.getRgb(rgb);\r\n if (!values) {\r\n return 'black';\r\n }\r\n return values[0] * 0.299 + values[1] * 0.587 + values[2] * 0.114 > 186\r\n ? 'black'\r\n : 'white';\r\n }\r\n\r\n /**\r\n * Convert HSL to RGB.\r\n *\r\n * @param h Hue\r\n * @param s Saturation\r\n * @param l Lightness\r\n * @returns Object with r, g, b values.\r\n */\r\n public hslToRgb(\r\n h: number,\r\n s: number,\r\n l: number\r\n ): { r: number; g: number; b: number } {\r\n // https://css-tricks.com/converting-color-spaces-in-javascript/\r\n // must be fractions of 1\r\n s /= 100;\r\n l /= 100;\r\n\r\n let c = (1 - Math.abs(2 * l - 1)) * s,\r\n x = c * (1 - Math.abs(((h / 60) % 2) - 1)),\r\n m = l - c / 2,\r\n r = 0,\r\n g = 0,\r\n b = 0;\r\n if (0 <= h && h < 60) {\r\n r = c;\r\n g = x;\r\n b = 0;\r\n } else if (60 <= h && h < 120) {\r\n r = x;\r\n g = c;\r\n b = 0;\r\n } else if (120 <= h && h < 180) {\r\n r = 0;\r\n g = c;\r\n b = x;\r\n } else if (180 <= h && h < 240) {\r\n r = 0;\r\n g = x;\r\n b = c;\r\n } else if (240 <= h && h < 300) {\r\n r = x;\r\n g = 0;\r\n b = c;\r\n } else if (300 <= h && h < 360) {\r\n r = c;\r\n g = 0;\r\n b = x;\r\n }\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return { r: r, g: g, b: b };\r\n }\r\n\r\n public rgbToString(r: number, g: number, b: number): string {\r\n let rd = r.toString(16);\r\n if (rd.length === 1) {\r\n rd = '0' + rd;\r\n }\r\n let gd = g.toString(16);\r\n if (gd.length === 1) {\r\n gd = '0' + gd;\r\n }\r\n let bd = b.toString(16);\r\n if (bd.length === 1) {\r\n bd = '0' + bd;\r\n }\r\n return rd + gd + bd;\r\n }\r\n\r\n /**\r\n * Get the next color from a palette generated to include\r\n * the specified count of colors.\r\n *\r\n * @param index The index of the next color in the palette.\r\n * @param count The total count of colors in the palette.\r\n * @param blueBoost True to adjust colors for the eye's lack of sensitivity to blue.\r\n * @returns The RRGGBB values string.\r\n */\r\n public nextPaletteColor(\r\n index: number,\r\n count: number,\r\n blueBoost = true\r\n ): string {\r\n // https://stackoverflow.com/questions/43193341/how-to-generate-random-pastel-or-brighter-color-in-javascript\r\n const h = Math.floor((index / count) * 341); // between 0 and 340\r\n let s = 100;\r\n let l = 50;\r\n\r\n if (blueBoost && h > 215 && h < 265) {\r\n const gain = 20;\r\n let blueness = 1 - Math.abs(h - 240) / 25;\r\n let change = Math.floor(gain * blueness);\r\n l += change;\r\n s -= change;\r\n }\r\n const rgb = this.hslToRgb(h, s, l);\r\n return this.rgbToString(rgb.r, rgb.g, rgb.b);\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { FacetDefinition } from '@myrmidon/cadmus-core';\r\n\r\nimport { ColorService } from '../../services/color.service';\r\n\r\nexport interface FacetBadgeData {\r\n definitions: FacetDefinition[];\r\n facetId?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cadmus-facet-badge',\r\n templateUrl: './facet-badge.component.html',\r\n styleUrls: ['./facet-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class FacetBadgeComponent {\r\n private _facetColors: { [key: string]: string };\r\n private _facetTips: { [key: string]: string };\r\n private _data?: FacetBadgeData | null;\r\n\r\n public color: string;\r\n public contrastColor: string;\r\n public tip?: string;\r\n\r\n /**\r\n * The facet data.\r\n */\r\n @Input()\r\n public get data(): FacetBadgeData | undefined | null {\r\n return this._data;\r\n }\r\n public set data(value: FacetBadgeData | undefined | null) {\r\n this._data = value;\r\n this._facetColors = {};\r\n this._facetTips = {};\r\n this.updateBadge();\r\n }\r\n\r\n constructor(private _colorService: ColorService) {\r\n this._data = {\r\n definitions: [],\r\n };\r\n this._facetColors = {};\r\n this._facetTips = {};\r\n this.color = 'transparent';\r\n this.contrastColor = 'black';\r\n }\r\n\r\n private getFacetColor(facetId: string): string {\r\n if (this._facetColors[facetId]) {\r\n return this._facetColors[facetId];\r\n }\r\n if (!this._data?.definitions?.length) {\r\n return 'transparent';\r\n }\r\n\r\n const facet = this._data.definitions.find((f) => {\r\n return f.id === facetId;\r\n });\r\n if (facet?.colorKey) {\r\n this._facetColors[facetId] = '#' + facet.colorKey;\r\n } else {\r\n this._facetColors[facetId] = 'transparent';\r\n }\r\n return this._facetColors[facetId];\r\n }\r\n\r\n private getFacetTip(facetId: string): string | null {\r\n if (this._facetTips[facetId]) {\r\n return this._facetTips[facetId];\r\n }\r\n\r\n if (!this._data?.definitions?.length) {\r\n return null;\r\n }\r\n\r\n const facet = this._data.definitions.find((f) => {\r\n return f.id === facetId;\r\n });\r\n if (!facet) {\r\n this._facetTips[facetId] = facetId;\r\n } else {\r\n const sb: string[] = [];\r\n for (let i = 0; i < facet.partDefinitions.length; i++) {\r\n if (i > 0) {\r\n sb.push(', ');\r\n }\r\n sb.push(facet.partDefinitions[i].name);\r\n if (facet.partDefinitions[i].isRequired) {\r\n sb.push('*');\r\n }\r\n }\r\n this._facetTips[facetId] = sb.join('');\r\n }\r\n return this._facetTips[facetId];\r\n }\r\n\r\n private updateBadge() {\r\n this.color = this.getFacetColor(this._data?.facetId || '');\r\n this.contrastColor = this._colorService.getContrastColor(this.color);\r\n this.tip = this.getFacetTip(this._data?.facetId || '') ?? undefined;\r\n }\r\n}\r\n","<span\r\n class=\"model-type\"\r\n [style.background-color]=\"color\"\r\n [style.color]=\"contrastColor\"\r\n matTooltip=\"{{ tip }}\"\r\n >{{ data?.facetId }}\r\n</span>\r\n","import { Component, Input } from '@angular/core';\r\nimport { FlagDefinition } from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * Data for FlagsBadgeComponent, including flags and their definitions.\r\n */\r\nexport interface FlagsBadgeData {\r\n definitions: FlagDefinition[];\r\n flags: number;\r\n}\r\n\r\n/**\r\n * Badge with item's flags. Each flag is represented by a circle filled\r\n * with the flag's color key.\r\n */\r\n@Component({\r\n selector: 'cadmus-flags-badge',\r\n templateUrl: './flags-badge.component.html',\r\n styleUrls: ['./flags-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class FlagsBadgeComponent {\r\n private _data?: FlagsBadgeData | null;\r\n\r\n public badgeFlags: FlagDefinition[];\r\n\r\n @Input()\r\n public get data(): FlagsBadgeData | undefined | null {\r\n return this._data;\r\n }\r\n public set data(value: FlagsBadgeData | undefined | null) {\r\n this._data = value;\r\n this.updateBadge();\r\n }\r\n\r\n constructor() {\r\n this.badgeFlags = [];\r\n }\r\n\r\n private updateBadge() {\r\n if (!this._data) {\r\n return;\r\n }\r\n this.badgeFlags = this._data.definitions.filter((def) => {\r\n // tslint:disable-next-line: no-bitwise\r\n return def.id & this._data!.flags;\r\n });\r\n }\r\n}\r\n","<div>\n @for (def of badgeFlags; track def.id) {\n <span\n class=\"badge-flag\"\n [style.color]=\"'#' + def.colorKey\"\n [matTooltip]=\"def.label\"\n >\n @if (def.isAdmin) {\n &#x25c6;\n } @else {\n &#x2b24;\n }\n </span>\n }\n</div>\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormGroup, FormArray, FormBuilder } from '@angular/forms';\r\n\r\nimport { LayerHint } from '@myrmidon/cadmus-core';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\n@Component({\r\n selector: 'cadmus-layer-hints',\r\n templateUrl: './layer-hints.component.html',\r\n styleUrls: ['./layer-hints.component.css'],\r\n standalone: false,\r\n})\r\nexport class LayerHintsComponent implements OnInit {\r\n private _hints: LayerHint[];\r\n\r\n @Input()\r\n public get hints(): LayerHint[] {\r\n return this._hints;\r\n }\r\n public set hints(value: LayerHint[]) {\r\n this._hints = value || [];\r\n this.checks.controls = [];\r\n for (let i = 0; i < this._hints.length; i++) {\r\n this.checks.push(this._formBuilder.control(false));\r\n }\r\n }\r\n\r\n @Input()\r\n public targetLocation?: string;\r\n @Input()\r\n public disabled?: boolean;\r\n @Input()\r\n public readonly?: boolean;\r\n\r\n @Output()\r\n public requestEdit: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestDelete: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestMove: EventEmitter<LayerHint>;\r\n @Output()\r\n public requestPatch: EventEmitter<string[]>;\r\n\r\n public form: FormGroup;\r\n public checks: FormArray;\r\n\r\n constructor(\r\n private _formBuilder: FormBuilder,\r\n private _dialogService: DialogService\r\n ) {\r\n this.requestEdit = new EventEmitter<LayerHint>();\r\n this.requestDelete = new EventEmitter<LayerHint>();\r\n this.requestMove = new EventEmitter<LayerHint>();\r\n this.requestPatch = new EventEmitter<string[]>();\r\n this._hints = [];\r\n\r\n this.checks = _formBuilder.array([]);\r\n this.form = _formBuilder.group({\r\n checks: this.checks,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n public emitRequestEdit(hint: LayerHint) {\r\n this.requestEdit.emit(hint);\r\n }\r\n\r\n public emitRequestDelete(hint: LayerHint) {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete fragment at \"${hint.location}\"?`)\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n this.requestDelete.emit(hint);\r\n }\r\n });\r\n }\r\n\r\n public emitRequestMove(hint: LayerHint) {\r\n if (!this.targetLocation) {\r\n return;\r\n }\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Move',\r\n `Move fragment at ${hint.location} to ${this.targetLocation}?`\r\n )\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n this.requestMove.emit(hint);\r\n }\r\n });\r\n }\r\n\r\n public emitRequestPatch() {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this._dialogService\r\n .confirm('Confirm Patch', `Patch the selected fragments?`)\r\n .subscribe((ok: boolean) => {\r\n if (ok) {\r\n const patches: string[] = [];\r\n for (let i = 0; i < this.checks.controls.length; i++) {\r\n const n = this.checks.controls[i].value;\r\n if (n) {\r\n patches.push(this._hints[n - 1].patchOperation!);\r\n }\r\n }\r\n this.requestPatch.emit(patches);\r\n }\r\n });\r\n }\r\n}\r\n","@if (hints) {\n<form [formGroup]=\"form\" (submit)=\"emitRequestPatch()\">\n <table class=\"patches\">\n <thead>\n <tr>\n <th></th>\n <th>location</th>\n <th>description</th>\n <th>patch</th>\n </tr>\n </thead>\n <tbody>\n @for (hint of hints; track hint; let i = $index) {\n <tr>\n @if (!readonly) {\n <td>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this fragment\"\n [disabled]=\"disabled\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this fragment to {{ targetLocation }}\"\n [disabled]=\"\n disabled || !targetLocation || targetLocation === hint.location\n \"\n (click)=\"emitRequestMove(hint)\"\n >\n <mat-icon>arrow_forward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this fragment\"\n color=\"warn\"\n [disabled]=\"disabled\"\n (click)=\"emitRequestDelete(hint)\"\n >\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n }\n <td>{{ hint.location }}</td>\n <td>{{ hint.description }}</td>\n <td>\n @if (hint.patchOperation) {\n <mat-checkbox\n matTooltip=\"Apply this patch\"\n [disabled]=\"disabled\"\n [value]=\"(i + 1).toString()\"\n >\n {{ hint.patchOperation }}\n </mat-checkbox>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (targetLocation) {\n <div>move target: {{ targetLocation }}</div>\n }\n <button\n type=\"submit\"\n mat-raised-button\n [disabled]=\"readonly || disabled || form.invalid\"\n >\n apply patches\n </button>\n</form>\n}\n","import {\r\n Component,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n UntypedFormBuilder,\r\n UntypedFormControl,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { Observable, of } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n switchMap,\r\n take,\r\n} from 'rxjs/operators';\r\n\r\nimport { DataPinInfo, IndexLookupDefinitions } from '@myrmidon/cadmus-core';\r\nimport { ItemService } from '@myrmidon/cadmus-api';\r\nimport { DataPage, ErrorWrapper } from '@myrmidon/ngx-tools';\r\n\r\n/**\r\n * Generic data pin lookup component. This allows users typing a part\r\n * of a pin's value, and get the full pin. For instance, if you have\r\n * a lookup set of colors and type \"gr\", you might get the pins\r\n * corresponding to \"green\" (e.g. id=color, value=green), \"gray\", etc.\r\n * Usage: add a FormControl to hold a DataPinInfo value; in the HTML\r\n * template set the component's lookupKey, label, initialValue, and\r\n * entryChange handler. The initialValue, if any, should be the initial\r\n * DataPinInfo value.\r\n * If you are using this component as a pure lookup device, don't set\r\n * the initialValue and set resetOnPick=true.\r\n */\r\n@Component({\r\n selector: 'cadmus-lookup-pin',\r\n templateUrl: './lookup-pin.component.html',\r\n styleUrls: ['./lookup-pin.component.css'],\r\n standalone: false,\r\n})\r\nexport class LookupPinComponent implements OnInit {\r\n private _initialValue: string | undefined;\r\n\r\n /**\r\n * The entry value initially set when the component loads.\r\n */\r\n @Input()\r\n public get initialValue(): string | undefined {\r\n return this._initialValue;\r\n }\r\n public set initialValue(value: string | undefined) {\r\n this._initialValue = value;\r\n if (this.lookup) {\r\n this.resetToInitial();\r\n }\r\n }\r\n\r\n /**\r\n * The label to be displayed for this lookup.\r\n */\r\n @Input()\r\n public label: string;\r\n\r\n /**\r\n * The maximum count of lookup entries to retrieve.\r\n * Default is 10.\r\n */\r\n @Input()\r\n public limit: number;\r\n\r\n /**\r\n * True to reset the lookup value after it is picked.\r\n * This is typically used when you use this component\r\n * as a pure lookup device, storing the picked value\r\n * elsewhere when handling its entryChange event.\r\n */\r\n @Input()\r\n public resetOnPick: boolean | undefined;\r\n\r\n /**\r\n * Fired whenever an entry is picked. Usually you should\r\n * cast the received argument to a more specific type.\r\n */\r\n @Output()\r\n public entryChange: EventEmitter<DataPinInfo | null>;\r\n\r\n public form: UntypedFormGroup;\r\n public lookup: UntypedFormControl;\r\n public entries$: Observable<DataPinInfo[]> | undefined;\r\n public entry: DataPinInfo | undefined;\r\n\r\n constructor(\r\n formBuilder: UntypedFormBuilder,\r\n private _itemService: ItemService,\r\n @Inject('indexLookupDefinitions')\r\n private _lookupDefs: IndexLookupDefinitions\r\n ) {\r\n this.label = '';\r\n // events\r\n this.entryChange = new EventEmitter<DataPinInfo | null>();\r\n // form\r\n this.lookup = formBuilder.control(null);\r\n this.form = formBuilder.group({\r\n lookup: this.lookup,\r\n });\r\n this.limit = 10;\r\n }\r\n\r\n /**\r\n * The lookup key to be used for this component.\r\n * This should be a key from the injectable indexLookupDefinitions.\r\n */\r\n @Input()\r\n public lookupKey: string | undefined;\r\n\r\n ngOnInit(): void {\r\n this.entries$ = this.lookup.valueChanges.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap((value: DataPinInfo | string) => {\r\n // if it's a string it's a filter; else it's the entry got\r\n if (typeof value === 'string') {\r\n return this.lookupEntries(value, this.limit || 10);\r\n } else {\r\n return of([value]);\r\n }\r\n })\r\n );\r\n // setup initial value if its name was specified\r\n if (this._initialValue) {\r\n this.resetToInitial();\r\n }\r\n }\r\n\r\n private lookupEntries(\r\n filter: string,\r\n limit: number\r\n ): Observable<DataPinInfo[]> {\r\n // get the lookup definition\r\n if (!this.lookupKey || !filter) {\r\n return of([]);\r\n }\r\n const ld = this._lookupDefs[this.lookupKey];\r\n if (!ld) {\r\n return of([]);\r\n }\r\n\r\n // build query\r\n const query = ld.roleId\r\n ? `[partTypeId=${ld.typeId}] AND [roleId=${ld.roleId}] AND [name=${ld.name}] AND [value^=${filter}]`\r\n : `[partTypeId=${ld.typeId}] AND [name=${ld.name}] AND [value^=${filter}]`;\r\n\r\n // search\r\n return this._itemService.searchPins(query, 1, limit).pipe(\r\n map((w: ErrorWrapper<DataPage<DataPinInfo>>) => {\r\n if (w.error) {\r\n return [];\r\n } else {\r\n return w.value?.items || [];\r\n }\r\n })\r\n );\r\n }\r\n\r\n private resetToInitial(): void {\r\n this.lookupEntries(this._initialValue || '', 1)\r\n .pipe(take(1))\r\n .subscribe((entries) => {\r\n this.lookup.setValue(entries.length ? entries[0] : undefined);\r\n });\r\n }\r\n\r\n public clear(): void {\r\n this.entry = undefined;\r\n this.lookup.setValue(null);\r\n this.entryChange.emit(null);\r\n }\r\n\r\n public entryToName(entry: DataPinInfo): string {\r\n return entry?.value;\r\n }\r\n\r\n public pickEntry(entry: DataPinInfo): void {\r\n this.entry = entry;\r\n this.entryChange.emit(entry);\r\n if (this.resetOnPick) {\r\n this.clear();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\n <mat-autocomplete #lookupAuto=\"matAutocomplete\" [displayWith]=\"entryToName\">\n @for (entry of entries$ | async; track entry) {\n <mat-option [value]=\"entry\" (onSelectionChange)=\"pickEntry(entry)\">\n {{ entry?.value }}\n </mat-option>\n }\n </mat-autocomplete>\n\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"label\"\n [formControl]=\"lookup\"\n [matAutocomplete]=\"lookupAuto\"\n />\n </mat-form-field>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"clear()\"\n [disabled]=\"!entry\"\n matTooltip=\"Clear\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n</form>\n","import { Component, Input } from '@angular/core';\r\n\r\nimport { Thesaurus, FacetDefinition, PartTypeIds } from '@myrmidon/cadmus-core';\r\nimport { FacetService } from '@myrmidon/cadmus-api';\r\n\r\nimport { ColorService } from '../../services/color.service';\r\n\r\nexport enum PartBadgeType {\r\n partAndRole = 0,\r\n partOnly = 1,\r\n roleOnly = 2,\r\n}\r\n\r\n@Component({\r\n selector: 'cadmus-part-badge',\r\n templateUrl: './part-badge.component.html',\r\n styleUrls: ['./part-badge.component.css'],\r\n standalone: false,\r\n})\r\nexport class PartBadgeComponent {\r\n private _typeThesaurus?: Thesaurus;\r\n private _facetDefinition?: FacetDefinition;\r\n private _partTypeIds?: PartTypeIds;\r\n\r\n public typeName: string | undefined;\r\n public roleName: string | undefined;\r\n public color: string;\r\n public contrastColor: string;\r\n\r\n /**\r\n * The badge type: 0=part and role, 1=part only, 2=role only.\r\n */\r\n @Input()\r\n public badgeType: PartBadgeType;\r\n\r\n /**\r\n * The types thesaurus.\r\n */\r\n @Input()\r\n public get typeThesaurus(): Thesaurus | undefined {\r\n return this._typeThesaurus;\r\n }\r\n public set typeThesaurus(value: Thesaurus | undefined) {\r\n this._typeThesaurus = value;\r\n this.updateBadge();\r\n }\r\n\r\n /**\r\n * The part's facet definition.\r\n */\r\n @Input()\r\n public get facetDefinition(): FacetDefinition | undefined {\r\n return this._facetDefinition;\r\n }\r\n public set facetDefinition(value: FacetDefinition | undefined) {\r\n this._facetDefinition = value;\r\n this.updateBadge();\r\n }\r\n\r\n /**\r\n * The part type IDs.\r\n */\r\n @Input()\r\n public get partTypeIds(): PartTypeIds | undefined {\r\n return this._partTypeIds;\r\n }\r\n public set partTypeIds(value: PartTypeIds | undefined) {\r\n this._partTypeIds = value;\r\n this.updateBadge();\r\n }\r\n\r\n constructor(\r\n private _facetService: FacetService,\r\n private _colorService: ColorService\r\n ) {\r\n this.badgeType = PartBadgeType.partAndRole;\r\n this.color = 'transparent';\r\n this.contrastColor = 'black';\r\n }\r\n\r\n private getPartColor(typeId: string, roleId?: string): string {\r\n if (!this._facetDefinition) {\r\n return 'transparent';\r\n }\r\n return this._facetService.getPartColor(\r\n typeId,\r\n roleId,\r\n this._facetDefinition\r\n );\r\n }\r\n\r\n private getTypeIdName(typeId: string): string {\r\n if (!this._typeThesaurus) {\r\n return typeId;\r\n }\r\n // strip :suffix if any\r\n const i = typeId.lastIndexOf(':');\r\n if (i > -1) {\r\n typeId = typeId.substring(0, i);\r\n }\r\n const entry = this._typeThesaurus.entries?.find((e) => e.id === typeId);\r\n return entry ? entry.value : typeId;\r\n }\r\n\r\n private getRoleIdName(roleId?: string): string | undefined {\r\n if (!roleId || !roleId.startsWith('fr.')) {\r\n return roleId;\r\n }\r\n return this.getTypeIdName(roleId);\r\n }\r\n\r\n private updateBadge(): void {\r\n if (this._partTypeIds) {\r\n this.color = this.getPartColor(\r\n this._partTypeIds.typeId,\r\n this._partTypeIds.roleId\r\n );\r\n this.typeName = this.getTypeIdName(this._partTypeIds.typeId);\r\n this.roleName = this.getRoleIdName(this._partTypeIds.roleId);\r\n } else {\r\n this.color = 'transparent';\r\n this.typeName = undefined;\r\n this.roleName = undefined;\r\n }\r\n this.contrastColor = this._colorService.getContrastColor(this.color);\r\n }\r\n}\r\n","@if (badgeType !== 2) {\n <span class=\"part-badge\"\n [style.background-color]=\"color\"\n [style.color]=\"contrastColor\"\n >\n {{ typeName }}\n </span>\n}\n@if (badgeType !== 1 && roleName) {\n <span class=\"role-badge\">\n {{ roleName }}\n </span>\n}\n","import { NestedTreeControl } from '@angular/cdk/tree';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { MatTreeNestedDataSource } from '@angular/material/tree';\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\ninterface TreeNode {\r\n id: string;\r\n label: string;\r\n originalLabel?: string;\r\n parent?: TreeNode;\r\n children?: TreeNode[];\r\n clickable?: boolean;\r\n}\r\n\r\n/**\r\n * A label rendering function which removes from a label\r\n * all the characters past the last colon, trimming the result.\r\n * This is a typical rendering when dealing with hierarchical\r\n * thesaurus entries, e.g. \"furniture: table: color\", where\r\n * we can shorten the label to just \"color\", as \"furniture\"\r\n * and \"table\" are its ancestors.\r\n */\r\nexport const renderLabelFromLastColon = (label: string): string => {\r\n if (!label) {\r\n return label;\r\n }\r\n const i = label.lastIndexOf(':');\r\n return i > -1 && i + 1 < label.length ? label.substring(i + 1).trim() : label;\r\n};\r\n\r\n/**\r\n * Thesaurus tree component.\r\n * This component displays a set of hierarchical thesaurus entries\r\n * in a tree, provided that each entry marks its hierarchy with\r\n * dots. For instance, say you have the hierarchy \"furniture\" -\r\n * \"type\" - \"color\". You might have an entry whose ID is\r\n * \"furniture.table.red\", with a sibling \"furniture.table.green\",\r\n * and a parent \"furniture.table\". This parent is there only to\r\n * provide a label to the parent node, but only leaf nodes can be\r\n * picked by the user. Whenever one is picked, the entryChange\r\n * event is emitted. Note that even if you specify a label renderer\r\n * function, the event always emits the original label.\r\n */\r\n@Component({\r\n selector: 'cadmus-thesaurus-tree',\r\n templateUrl: './thesaurus-tree.component.html',\r\n styleUrls: ['./thesaurus-tree.component.css'],\r\n standalone: false,\r\n})\r\nexport class ThesaurusTreeComponent implements OnInit {\r\n private _entries?: ThesaurusEntry[];\r\n\r\n /**\r\n * The thesaurus entries.\r\n */\r\n @Input()\r\n public get entries(): ThesaurusEntry[] | undefined {\r\n return this._entries;\r\n }\r\n public set entries(value: ThesaurusEntry[] | undefined) {\r\n if (this._entries !== value) {\r\n this._entries = value;\r\n this.initTree();\r\n }\r\n }\r\n\r\n /**\r\n * The label for the root node.\r\n */\r\n @Input()\r\n public rootLabel: string;\r\n /**\r\n * The optional node label rendering function.\r\n */\r\n @Input()\r\n public renderLabel: ((label: string) => string) | undefined;\r\n /**\r\n * Fired when a thesaurus entry is selected.\r\n */\r\n @Output()\r\n public entryChange: EventEmitter<ThesaurusEntry>;\r\n\r\n public root: TreeNode;\r\n public treeControl: NestedTreeControl<TreeNode>;\r\n public treeDataSource: MatTreeNestedDataSource<TreeNode>;\r\n\r\n public filter: FormControl<string | null>;\r\n public form: FormGroup;\r\n public foundNodes: TreeNode[] | undefined;\r\n\r\n public hasChildren = (index: number, node: TreeNode) => {\r\n return node && node.children && node.children.length > 0;\r\n };\r\n\r\n public isRoot = (index: number, node: TreeNode) => {\r\n return node && node.id === '@root';\r\n };\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // tree\r\n this.entryChange = new EventEmitter<ThesaurusEntry>();\r\n this.treeControl = new NestedTreeControl<TreeNode>((node) => node.children);\r\n this.treeDataSource = new MatTreeNestedDataSource<TreeNode>();\r\n this.rootLabel = '-';\r\n this.root = { id: '@root', label: '-', children: [] };\r\n // filter\r\n this.filter = formBuilder.control(null);\r\n this.form = formBuilder.group({\r\n filter: this.filter,\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initTree();\r\n }\r\n\r\n private initTree(): void {\r\n this.foundNodes = undefined;\r\n\r\n this.root = this.buildTreeModel(this._entries || []);\r\n this.treeDataSource.data = [this.root];\r\n // https://github.com/angular/components/issues/12469\r\n this.treeControl.dataNodes = this.treeDataSource.data;\r\n }\r\n\r\n private getLabel(label: string): string {\r\n return this.renderLabel ? this.renderLabel(label) : label;\r\n }\r\n\r\n private addNode(\r\n entry: ThesaurusEntry,\r\n separator: string,\r\n root: TreeNode\r\n ): void {\r\n const components = entry.id.split(separator);\r\n\r\n // walk the tree up to the last existing component\r\n let i = 0;\r\n let node = root;\r\n const idParts: string[] = [];\r\n\r\n // for each component:\r\n while (i < components.length) {\r\n idParts.push(components[i]);\r\n\r\n // stop walking when the node has no more children\r\n if (!node.children) {\r\n break;\r\n }\r\n // find target among children\r\n const targetId = idParts.join(separator);\r\n const existing = node.children.find((c) => {\r\n return c.id === targetId;\r\n });\r\n if (existing) {\r\n node = existing;\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // node is now the last existing component; use it as the ancestor\r\n // for all the remaining components (starting from i)\r\n while (i < components.length) {\r\n if (!node.children) {\r\n node.children = [];\r\n }\r\n const isLast = i + 1 === components.length;\r\n const label = isLast ? entry.value : components[i];\r\n const child: TreeNode = {\r\n label: isLast ? this.getLabel(label) : label,\r\n id: isLast ? entry.id : idParts.join(separator),\r\n parent: node,\r\n children: [],\r\n };\r\n if (label !== child.label) {\r\n child.originalLabel = label;\r\n }\r\n node.children.push(child);\r\n node = child;\r\n i++;\r\n }\r\n }\r\n\r\n /**\r\n * Build a tree model from a list of name=value pairs,\r\n * where each value can include one or more components separated by\r\n * the specified separator.\r\n * @param entries The entries to add.\r\n * @param separator string The separator string to use for values.\r\n */\r\n public buildTreeModel(entries: ThesaurusEntry[], separator = '.'): TreeNode {\r\n const root: TreeNode = {\r\n id: '@root',\r\n label: this.rootLabel || '-',\r\n };\r\n if (!entries) {\r\n return root;\r\n }\r\n entries.forEach((entry) => {\r\n this.addNode(entry, separator, root);\r\n });\r\n return root;\r\n }\r\n\r\n public onTreeNodeClick(node: TreeNode): void {\r\n if (node.children && node.children.length > 0) {\r\n return;\r\n }\r\n this.entryChange.emit({\r\n id: node.id,\r\n value: node.originalLabel || node.label,\r\n });\r\n }\r\n\r\n public expandAll(): void {\r\n this.treeControl.expandAll();\r\n }\r\n\r\n public collapseAll(): void {\r\n this.treeControl.collapseAll();\r\n }\r\n\r\n private expandFromNode(node: TreeNode): void {\r\n while (node.parent) {\r\n node = node.parent;\r\n this.treeControl.expand(node);\r\n }\r\n }\r\n\r\n private expandMatchingNodes(\r\n node: TreeNode,\r\n filter: string,\r\n found: TreeNode[]\r\n ): void {\r\n if (node.label.toLowerCase().includes(filter)) {\r\n found.push(node);\r\n this.expandFromNode(node);\r\n }\r\n if (node.children?.length) {\r\n node.children.forEach((child) => {\r\n this.expandMatchingNodes(child, filter, found);\r\n });\r\n }\r\n }\r\n\r\n public find(): void {\r\n if (!this.filter.value?.length) {\r\n return;\r\n }\r\n this.treeControl.collapseAll();\r\n const foundNodes: TreeNode[] = [];\r\n this.expandMatchingNodes(\r\n this.treeDataSource.data[0],\r\n this.filter.value.toLowerCase(),\r\n foundNodes\r\n );\r\n this.foundNodes = foundNodes;\r\n }\r\n\r\n public resetFilter(): void {\r\n this.filter.reset();\r\n this.foundNodes = undefined;\r\n }\r\n\r\n public isFoundNode(node: TreeNode): boolean {\r\n if (!this.foundNodes) {\r\n return false;\r\n }\r\n return this.foundNodes?.length > 0 && this.foundNodes.indexOf(node) > -1;\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"find()\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Expand all\"\n (click)=\"expandAll()\"\n >\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Collapse all\"\n (click)=\"collapseAll()\"\n >\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>find</mat-label>\n <input matInput [formControl]=\"filter\" />\n <button\n type=\"button\"\n matSuffix\n mat-icon-button\n (click)=\"resetFilter()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n </mat-form-field>\n @if (foundNodes) {\n <span\n [ngClass]=\"{\n 'found-count': foundNodes.length,\n 'not-found-count': foundNodes.length === 0\n }\"\n >{{ foundNodes.length }}</span\n >\n }\n</form>\n<mat-tree\n [dataSource]=\"treeDataSource\"\n [treeControl]=\"treeControl\"\n class=\"th-tree\"\n>\n <!-- leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li>\n <div class=\"mat-tree-node\">\n <a\n mat-button\n (click)=\"onTreeNodeClick(node)\"\n [class.hilite]=\"isFoundNode(node)\"\n >\n {{ node.label }}\n </a>\n </div>\n </li>\n </mat-tree-node>\n\n <!-- root node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: isRoot\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n {{ node.label }}\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </mat-nested-tree-node>\n\n <!-- parent node -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChildren\">\n <li class=\"tree-container\">\n <div class=\"mat-tree-node\">\n <button\n type=\"button\"\n mat-icon-button\n matTreeNodeToggle\n [attr.aria-label]=\"'Toggle ' + node.label\"\n >\n <mat-icon>\n {{ treeControl.isExpanded(node) ? \"expand_more\" : \"chevron_right\" }}\n </mat-icon>\n </button>\n <a mat-button (click)=\"onTreeNodeClick(node)\">\n {{ node.label }}\n </a>\n </div>\n <ul class=\"tree-nested-node\">\n @if (treeControl.isExpanded(node)) {\n <div>\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n }\n </ul>\n </li>\n </mat-nested-tree-node>\n</mat-tree>\n","import {\r\n Input,\r\n Output,\r\n EventEmitter,\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n PristineChangeEvent,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\n\r\nimport { deepCopy } from '@myrmidon/ngx-tools';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\nimport {\r\n Fragment,\r\n Part,\r\n TextLayerPart,\r\n ThesauriSet,\r\n} from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * The identifiers for an edited part.\r\n */\r\nexport interface PartIdentity {\r\n itemId: string;\r\n typeId: string;\r\n partId: string | null;\r\n roleId: string | null;\r\n}\r\n\r\n/**\r\n * The identifiers for an edited fragment.\r\n */\r\nexport interface FragmentIdentity extends PartIdentity {\r\n frTypeId: string;\r\n frRoleId: string | null;\r\n loc: string;\r\n}\r\n\r\n/**\r\n * An edited part or fragment.\r\n */\r\nexport interface EditedObject<T extends Part | Fragment> {\r\n value: T | null;\r\n thesauri: ThesauriSet;\r\n layerPart?: TextLayerPart;\r\n baseText?: string;\r\n}\r\n\r\n/**\r\n * Base class for part/fragment editors dumb components.\r\n * The model type is the templated argument T.\r\n *\r\n * When deriving from this editor, be sure to call super.ngOnInit()\r\n * from the derived editor's ngOnInit handler.\r\n */\r\n@Component({\r\n template: '',\r\n standalone: false,\r\n})\r\nexport abstract class ModelEditorComponentBase<T extends Part | Fragment>\r\n implements OnInit, OnDestroy\r\n{\r\n private readonly _mebSubs: Subscription[] = [];\r\n private _identity: PartIdentity | FragmentIdentity | undefined;\r\n private _data?: EditedObject<T>;\r\n\r\n /**\r\n * The root form of the editor.\r\n */\r\n public form: FormGroup | UntypedFormGroup;\r\n\r\n /**\r\n * The current user.\r\n */\r\n public user?: User;\r\n\r\n /**\r\n * The user authorization level (0-4).\r\n */\r\n public userLevel: number;\r\n\r\n /**\r\n * An observable with the current dirty state of the editor.\r\n */\r\n public isDirty$: BehaviorSubject<boolean>;\r\n\r\n /**\r\n * The identity of the edited model.\r\n */\r\n @Input()\r\n public get identity(): PartIdentity | FragmentIdentity | undefined {\r\n return this._identity;\r\n }\r\n public set identity(value: PartIdentity | FragmentIdentity | undefined) {\r\n this._identity = value;\r\n if (this.identity?.partId) {\r\n const part = this._data?.value as Part;\r\n if (part && !part.id) {\r\n console.log('part identity updated');\r\n part.id = this.identity.partId;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The data being edited.\r\n */\r\n @Input()\r\n public get data(): EditedObject<T> | undefined {\r\n return this._data;\r\n }\r\n public set data(value: EditedObject<T> | undefined) {\r\n this._data = value;\r\n this.onDataSet(value);\r\n }\r\n\r\n /**\r\n * Event emitted when the edited data is saved.\r\n */\r\n @Output()\r\n public dataChange: EventEmitter<T>;\r\n\r\n /**\r\n * Event emitted when the dirty state has changed.\r\n * This event just reflects changes in isDirty$, and is a facility\r\n * for propagating it to the parent's component.\r\n */\r\n @Output()\r\n public dirtyChange: EventEmitter<boolean>;\r\n\r\n /**\r\n * True to disable the editor.\r\n */\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n }\r\n }\r\n\r\n /**\r\n * Emitted when the user requests to close the editor.\r\n */\r\n @Output()\r\n public editorClose: EventEmitter<any>;\r\n\r\n /**\r\n * Create a new instance of the editor.\r\n *\r\n * @param authService The authentication service.\r\n * @param formBuilder Form builder.\r\n */\r\n constructor(\r\n protected authService: AuthJwtService,\r\n protected formBuilder: FormBuilder\r\n ) {\r\n this.dataChange = new EventEmitter<T>();\r\n this.editorClose = new EventEmitter<any>();\r\n this.dirtyChange = new EventEmitter<boolean>();\r\n this.form = formBuilder.group({});\r\n this.userLevel = 0;\r\n this.isDirty$ = new BehaviorSubject<boolean>(false);\r\n }\r\n\r\n public ngOnInit(): void {\r\n // form\r\n this.form = this.buildForm(this.formBuilder);\r\n\r\n // dirty check on form\r\n this._mebSubs.push(\r\n this.form.events.subscribe((e) => {\r\n if (e instanceof PristineChangeEvent) {\r\n console.log('dirty change: ', !e.pristine);\r\n this.isDirty$.next(!e.pristine);\r\n this.dirtyChange.emit(this.isDirty$.value);\r\n }\r\n })\r\n );\r\n\r\n // auth service\r\n this.userLevel = this.getCurrentUserLevel();\r\n this._mebSubs.push(\r\n this.authService.currentUser$.subscribe((user: User | null) => {\r\n this.updateUserProperties(user);\r\n })\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._mebSubs.forEach((s) => s.unsubscribe());\r\n }\r\n\r\n /**\r\n * Implement in the derived class to build the root form of this editor.\r\n * The form built will then be attached to the dirty check mechanism\r\n * provided by this base class.\r\n *\r\n * @param formBuilder The form builder.\r\n */\r\n protected abstract buildForm(\r\n formBuilder: FormBuilder\r\n ): FormGroup | UntypedFormGroup;\r\n\r\n /**\r\n * Get the authorization level of the current user if any.\r\n * @returns 4-1 for admin, editor, operator, visitor; else 0.\r\n */\r\n private getCurrentUserLevel(): number {\r\n const user = this.authService.currentUserValue;\r\n if (!user || !user.roles) {\r\n return 0;\r\n }\r\n if (user.roles.indexOf('admin') > -1) {\r\n return 4;\r\n }\r\n if (user.roles.indexOf('editor') > -1) {\r\n return 3;\r\n }\r\n if (user.roles.indexOf('operator') > -1) {\r\n return 2;\r\n }\r\n if (user.roles.indexOf('visitor') > -1) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n private updateUserProperties(user: User | null): void {\r\n if (!user) {\r\n this.user = undefined;\r\n this.userLevel = 0;\r\n } else {\r\n this.user = user;\r\n this.userLevel = this.getCurrentUserLevel();\r\n }\r\n }\r\n\r\n /**\r\n * Update the data value property and emit the corresponding\r\n * modelChange event.\r\n *\r\n * @param value The value.\r\n */\r\n protected updateValue(value: T): void {\r\n this._data = { ...(this._data || { thesauri: {} }), value: value };\r\n this.dataChange.emit(value);\r\n }\r\n\r\n /**\r\n * Invoked whenever the model property is set (=data comes from input model\r\n * property), unless setting it via updateModel. Implement to update the form\r\n * controls to reflect the new model data.\r\n *\r\n * @param data The data set, or undefined.\r\n */\r\n protected abstract onDataSet(data?: EditedObject<T>): void;\r\n\r\n /**\r\n * Get a new object from the edited part if any, else as a new part.\r\n *\r\n * @param typeId The part's type ID. This is a constant received\r\n * from the implementor.\r\n * @returns Part object.\r\n */\r\n protected getEditedPart(typeId: string): Part {\r\n const part = deepCopy(this.data?.value) as Part | null;\r\n return (\r\n part || {\r\n itemId: this.identity!.itemId || '',\r\n id: '',\r\n typeId: typeId,\r\n roleId: this.identity!.roleId || undefined,\r\n timeCreated: new Date(),\r\n creatorId: '',\r\n timeModified: new Date(),\r\n userId: '',\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Get a new object from the edited fragment if any, else a new fragment.\r\n *\r\n * @returns Fragment object.\r\n */\r\n protected getEditedFragment(): Fragment {\r\n const fr = deepCopy(this.data?.value) as Fragment | null;\r\n return (\r\n fr || {\r\n location: (this.identity as FragmentIdentity).loc,\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Implement in derived classes to get the data from form's controls.\r\n * This is used when saving.\r\n */\r\n protected abstract getValue(): T;\r\n\r\n /**\r\n * True if this editor has the thesaurus having the specified key in the\r\n * loaded thesauri set.\r\n */\r\n protected hasThesaurus(key: string): boolean {\r\n return this.data?.thesauri && this.data.thesauri[key] ? true : false;\r\n }\r\n\r\n /**\r\n * Emit a request to close the editor.\r\n */\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n /**\r\n * Save the edited data if valid.\r\n */\r\n public save(): void {\r\n if (this.form.invalid) {\r\n console.warn('Save invoked with invalid form');\r\n return;\r\n }\r\n const value = this.getValue();\r\n this.updateValue(value);\r\n // the form is no more dirty\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n ValidatorFn,\r\n ValidationErrors,\r\n FormGroup,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\n\r\n// https://www.tektutorialshub.com/angular/custom-validator-with-parameters-in-angular/\r\n\r\n/**\r\n * General-purpose custom validators.\r\n */\r\n// https://github.com/angular/angular/issues/18867#issuecomment-357484102\r\n// @dynamic\r\nexport class CustomValidators {\r\n /**\r\n * Validates a FormGroup or FormArray control checking if the count of their\r\n * controls with a true value is equal to or greater than the specified\r\n * number.\r\n *\r\n * @param min The minimum number of checked controls.\r\n */\r\n public static minChecked(min = 1): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n // https://trungk18.com/experience/angular-form-array-validate-at-least-one-checkbox-was-selected/\r\n let checked = 0;\r\n\r\n const group = control as FormGroup || control as UntypedFormGroup;\r\n Object.keys(group.controls).forEach((key) => {\r\n const ctl = group.controls[key];\r\n if (ctl.value === true) {\r\n checked++;\r\n }\r\n });\r\n\r\n if (checked < min) {\r\n return {\r\n minChecked: true,\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n}\r\n","import { AbstractControl } from '@angular/forms';\r\n\r\n/**\r\n * Simple JSON validator.\r\n */\r\nexport class JsonValidators {\r\n public static json(\r\n control: AbstractControl\r\n ): { [key: string]: boolean } | null {\r\n if (!control.value) {\r\n // we allow empty code\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\n\nimport { User } from '@myrmidon/auth-jwt-login';\nimport { DataPage } from '@myrmidon/ngx-tools';\n\nimport { UserService } from '@myrmidon/cadmus-api';\nimport { UserInfo } from '@myrmidon/cadmus-core';\nimport {\n RefLookupFilter,\n RefLookupService,\n} from '@myrmidon/cadmus-refs-lookup';\n\n/**\n * Service for users lookup.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UserRefLookupService implements RefLookupService {\n constructor(private _userService: UserService) {}\n\n lookup(filter: RefLookupFilter, options?: any): Observable<UserInfo[]> {\n return this._userService\n .getUsers(\n {\n name: filter.text,\n },\n 1,\n filter.limit\n )\n .pipe(\n map((page: DataPage<UserInfo>) => {\n return page.items;\n })\n );\n }\n\n getName(item: User): string {\n return item?.userName;\n }\n}\n","// https://github.com/angular/angular/issues/10887\r\n\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Extract arguments of function\r\n */\r\nexport type ArgumentsType<F> = F extends (...args: infer A) => any ? A : never;\r\n\r\n/**\r\n * Creates an object like O. Optionally provide minimum set of properties P\r\n * which the objects must share to conform.\r\n */\r\ntype ObjectLike<O extends object, P extends keyof O = keyof O> = Pick<O, P>;\r\n\r\n/**\r\n * Extract a touched changed observable from an abstract control.\r\n * Use in component code like:\r\n * this.touchedChanges$ = extractTouchedChanges(this.form);\r\n *\r\n * @param control AbstractControl-like object with markAsTouched method.\r\n */\r\nexport const extractTouchedChanges = (\r\n control: ObjectLike<AbstractControl, 'markAsTouched' | 'markAsUntouched'>\r\n): Observable<boolean> => {\r\n const prevMarkAsTouched = control.markAsTouched;\r\n const prevMarkAsUntouched = control.markAsUntouched;\r\n\r\n const touchedChanges$ = new Subject<boolean>();\r\n\r\n function nextMarkAsTouched(\r\n ...args: ArgumentsType<AbstractControl['markAsTouched']>\r\n ): void {\r\n touchedChanges$.next(true);\r\n prevMarkAsTouched.bind(control)(...args);\r\n }\r\n\r\n function nextMarkAsUntouched(\r\n ...args: ArgumentsType<AbstractControl['markAsUntouched']>\r\n ): void {\r\n touchedChanges$.next(false);\r\n prevMarkAsUntouched.bind(control)(...args);\r\n }\r\n\r\n control.markAsTouched = nextMarkAsTouched;\r\n control.markAsUntouched = nextMarkAsUntouched;\r\n\r\n return touchedChanges$;\r\n};\r\n\r\n/**\r\n * Extract a pristine changed observable from an abstract control.\r\n * Use in component code like:\r\n * this.pristineChanges$ = extractPristineChanges(this.form);\r\n *\r\n * @param control AbstractControl-like object with markAsPristine and markAsDirty\r\n * methods.\r\n */\r\nexport const extractPristineChanges = (\r\n control: ObjectLike<AbstractControl, 'markAsPristine' | 'markAsDirty'>\r\n): Observable<boolean> => {\r\n const prevMarkAsPristine = control.markAsPristine;\r\n const prevMarkAsDirty = control.markAsDirty;\r\n\r\n const pristineChanges$ = new Subject<boolean>();\r\n\r\n function nextMarkAsPristine(\r\n ...args: ArgumentsType<AbstractControl['markAsPristine']>\r\n ): void {\r\n pristineChanges$.next(true);\r\n prevMarkAsPristine.bind(control)(...args);\r\n }\r\n\r\n function nextMarkAsDirty(\r\n ...args: ArgumentsType<AbstractControl['markAsDirty']>\r\n ): void {\r\n pristineChanges$.next(false);\r\n prevMarkAsDirty.bind(control)(...args);\r\n }\r\n\r\n control.markAsPristine = nextMarkAsPristine;\r\n control.markAsDirty = nextMarkAsDirty;\r\n\r\n return pristineChanges$;\r\n};\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// material\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatNestedTreeNode, MatTreeModule } from '@angular/material/tree';\r\n\r\nimport { SafeHtmlPipe } from '@myrmidon/ngx-tools';\r\n\r\n// cadmus\r\nimport { CadmusCoreModule } from '@myrmidon/cadmus-core';\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { CloseSaveButtonsComponent } from './components/close-save-buttons/close-save-buttons.component';\r\nimport { ErrorListComponent } from './components/error-list/error-list.component';\r\nimport { FacetBadgeComponent } from './components/facet-badge/facet-badge.component';\r\nimport { FlagsBadgeComponent } from './components/flags-badge/flags-badge.component';\r\nimport { DecoratedTokenTextComponent } from './components/decorated-token-text/decorated-token-text.component';\r\nimport { LayerHintsComponent } from './components/layer-hints/layer-hints.component';\r\nimport { LookupPinComponent } from './components/lookup-pin/lookup-pin.component';\r\nimport { PartBadgeComponent } from './components/part-badge/part-badge.component';\r\nimport { ThesaurusTreeComponent } from './components/thesaurus-tree/thesaurus-tree.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n // material\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatNestedTreeNode,\r\n MatSelectModule,\r\n MatTreeModule,\r\n MatTooltipModule,\r\n // Cadmus\r\n CadmusCoreModule,\r\n RefLookupComponent,\r\n SafeHtmlPipe,\r\n ],\r\n declarations: [\r\n CloseSaveButtonsComponent,\r\n DecoratedTokenTextComponent,\r\n ErrorListComponent,\r\n FacetBadgeComponent,\r\n FlagsBadgeComponent,\r\n LayerHintsComponent,\r\n LookupPinComponent,\r\n PartBadgeComponent,\r\n ThesaurusTreeComponent,\r\n ],\r\n exports: [\r\n CloseSaveButtonsComponent,\r\n DecoratedTokenTextComponent,\r\n ErrorListComponent,\r\n FacetBadgeComponent,\r\n FlagsBadgeComponent,\r\n LayerHintsComponent,\r\n LookupPinComponent,\r\n PartBadgeComponent,\r\n ThesaurusTreeComponent,\r\n ],\r\n})\r\nexport class CadmusUiModule {}\r\n","/*\r\n * Public API Surface of cadmus-ui\r\n */\r\n\r\nexport * from './lib/components/close-save-buttons/close-save-buttons.component';\r\nexport * from './lib/components/decorated-token-text/decorated-token-text.component';\r\nexport * from './lib/components/error-list/error-list.component';\r\nexport * from './lib/components/facet-badge/facet-badge.component';\r\nexport * from './lib/components/flags-badge/flags-badge.component';\r\nexport * from './lib/components/layer-hints/layer-hints.component';\r\nexport * from './lib/components/lookup-pin/lookup-pin.component';\r\nexport * from './lib/components/part-badge/part-badge.component';\r\nexport * from './lib/components/thesaurus-tree/thesaurus-tree.component';\r\n\r\nexport * from './lib/components/model-editor-component-base';\r\n\r\nexport * from './lib/services/color.service';\r\n\r\nexport * from './lib/validators/custom-validators';\r\nexport * from './lib/validators/json-validators';\r\n\r\nexport * from './lib/services/user-ref-lookup.service';\r\n\r\nexport * from './lib/utils';\r\n\r\nexport * from './lib/cadmus-ui.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i1.ColorService","i6","i3","i4","i5","i7","i9","i2.ColorService","i8","map"],"mappings":"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"}
@@ -17,14 +17,14 @@ import * as i15 from "@angular/material/checkbox";
17
17
  import * as i16 from "@angular/material/form-field";
18
18
  import * as i17 from "@angular/material/icon";
19
19
  import * as i18 from "@angular/material/input";
20
- import * as i19 from "@angular/material/select";
21
- import * as i20 from "@angular/material/tree";
20
+ import * as i19 from "@angular/material/tree";
21
+ import * as i20 from "@angular/material/select";
22
22
  import * as i21 from "@angular/material/tooltip";
23
- import * as i22 from "@myrmidon/ng-tools";
24
- import * as i23 from "@myrmidon/cadmus-core";
25
- import * as i24 from "@myrmidon/cadmus-refs-lookup";
23
+ import * as i22 from "@myrmidon/cadmus-core";
24
+ import * as i23 from "@myrmidon/cadmus-refs-lookup";
25
+ import * as i24 from "@myrmidon/ngx-tools";
26
26
  export declare class CadmusUiModule {
27
27
  static ɵfac: i0.ɵɵFactoryDeclaration<CadmusUiModule, never>;
28
- static ɵmod: i0.ɵɵNgModuleDeclaration<CadmusUiModule, [typeof i1.CloseSaveButtonsComponent, typeof i2.DecoratedTokenTextComponent, typeof i3.ErrorListComponent, typeof i4.FacetBadgeComponent, typeof i5.FlagsBadgeComponent, typeof i6.LayerHintsComponent, typeof i7.LookupPinComponent, typeof i8.PartBadgeComponent, typeof i9.ThesaurusTreeComponent], [typeof i10.CommonModule, typeof i11.FormsModule, typeof i12.RouterModule, typeof i11.ReactiveFormsModule, typeof i13.MatAutocompleteModule, typeof i14.MatButtonModule, typeof i15.MatCheckboxModule, typeof i16.MatFormFieldModule, typeof i17.MatIconModule, typeof i18.MatInputModule, typeof i19.MatSelectModule, typeof i20.MatTreeModule, typeof i21.MatTooltipModule, typeof i22.NgToolsModule, typeof i23.CadmusCoreModule, typeof i24.RefLookupComponent], [typeof i1.CloseSaveButtonsComponent, typeof i2.DecoratedTokenTextComponent, typeof i3.ErrorListComponent, typeof i4.FacetBadgeComponent, typeof i5.FlagsBadgeComponent, typeof i6.LayerHintsComponent, typeof i7.LookupPinComponent, typeof i8.PartBadgeComponent, typeof i9.ThesaurusTreeComponent]>;
28
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CadmusUiModule, [typeof i1.CloseSaveButtonsComponent, typeof i2.DecoratedTokenTextComponent, typeof i3.ErrorListComponent, typeof i4.FacetBadgeComponent, typeof i5.FlagsBadgeComponent, typeof i6.LayerHintsComponent, typeof i7.LookupPinComponent, typeof i8.PartBadgeComponent, typeof i9.ThesaurusTreeComponent], [typeof i10.CommonModule, typeof i11.FormsModule, typeof i12.RouterModule, typeof i11.ReactiveFormsModule, typeof i13.MatAutocompleteModule, typeof i14.MatButtonModule, typeof i15.MatCheckboxModule, typeof i16.MatFormFieldModule, typeof i17.MatIconModule, typeof i18.MatInputModule, typeof i19.MatNestedTreeNode, typeof i20.MatSelectModule, typeof i19.MatTreeModule, typeof i21.MatTooltipModule, typeof i22.CadmusCoreModule, typeof i23.RefLookupComponent, typeof i24.SafeHtmlPipe], [typeof i1.CloseSaveButtonsComponent, typeof i2.DecoratedTokenTextComponent, typeof i3.ErrorListComponent, typeof i4.FacetBadgeComponent, typeof i5.FlagsBadgeComponent, typeof i6.LayerHintsComponent, typeof i7.LookupPinComponent, typeof i8.PartBadgeComponent, typeof i9.ThesaurusTreeComponent]>;
29
29
  static ɵinj: i0.ɵɵInjectorDeclaration<CadmusUiModule>;
30
30
  }
@@ -1,7 +1,7 @@
1
1
  import { OnInit, EventEmitter } from '@angular/core';
2
2
  import { FormGroup, FormArray, FormBuilder } from '@angular/forms';
3
3
  import { LayerHint } from '@myrmidon/cadmus-core';
4
- import { DialogService } from '@myrmidon/ng-mat-tools';
4
+ import { DialogService } from '@myrmidon/ngx-mat-tools';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class LayerHintsComponent implements OnInit {
7
7
  private _formBuilder;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/cadmus-ui",
3
- "version": "9.0.0",
3
+ "version": "10.0.0",
4
4
  "description": "Cadmus - general UI components.",
5
5
  "keywords": [
6
6
  "Cadmus"
@@ -16,9 +16,9 @@
16
16
  "peerDependencies": {
17
17
  "@angular/common": "^19.0.0",
18
18
  "@angular/core": "^19.0.0",
19
- "@myrmidon/ng-tools": "^4.0.0",
19
+ "@myrmidon/ngx-tools": "^0.0.1",
20
20
  "@myrmidon/cadmus-refs-lookup": "^6.0.0",
21
- "@myrmidon/cadmus-core": "^9.0.0"
21
+ "@myrmidon/cadmus-core": "^10.0.0"
22
22
  },
23
23
  "dependencies": {
24
24
  "tslib": "^2.3.0"