@myrmidon/cadmus-part-epigraphy-formula-patterns 10.0.0 → 12.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { model, input, output, effect, Component, Pipe } from '@angular/core';
2
+ import { model, input, output, effect, Component, Pipe, signal } from '@angular/core';
3
3
  import { TitleCasePipe } from '@angular/common';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
@@ -9,7 +9,7 @@ import { MatIcon } from '@angular/material/icon';
9
9
  import { MatIconButton, MatButton } from '@angular/material/button';
10
10
  import { MatTooltip } from '@angular/material/tooltip';
11
11
  import { MatExpansionPanel, MatExpansionPanelHeader } from '@angular/material/expansion';
12
- import { NgxToolsValidators } from '@myrmidon/ngx-tools';
12
+ import { NgxToolsValidators, deepCopy } from '@myrmidon/ngx-tools';
13
13
  import { renderLabelFromLastColon, ThesaurusTreeComponent, ModelEditorComponentBase, CloseSaveButtonsComponent } from '@myrmidon/cadmus-ui';
14
14
  import { take } from 'rxjs';
15
15
  import { MatFormField, MatHint, MatError, MatLabel } from '@angular/material/form-field';
@@ -137,9 +137,9 @@ class EpiFormulaTokenComponent {
137
137
  /**
138
138
  * The token being edited.
139
139
  */
140
- token = model();
140
+ token = model(...(ngDevMode ? [undefined, { debugName: "token" }] : []));
141
141
  // epi-formula-token-tags
142
- tagEntries = input();
142
+ tagEntries = input(...(ngDevMode ? [undefined, { debugName: "tagEntries" }] : []));
143
143
  editorClose = output();
144
144
  optional;
145
145
  placeholder;
@@ -249,10 +249,10 @@ class EpiFormulaTokenComponent {
249
249
  renderLabel(label) {
250
250
  return renderLabelFromLastColon(label);
251
251
  }
252
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaTokenComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
253
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: EpiFormulaTokenComponent, isStandalone: true, selector: "cadmus-epi-formula-token", inputs: { token: { classPropertyName: "token", publicName: "token", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { token: "tokenChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- placeholder -->\n <mat-checkbox [formControl]=\"placeholder\">placeholder</mat-checkbox>\n\n <!-- optional -->\n <mat-checkbox [formControl]=\"optional\">optional</mat-checkbox>\n </div>\n\n <!-- tags -->\n <fieldset>\n <legend>tags</legend>\n <div class=\"form-row\">\n <!-- picker -->\n <cadmus-thesaurus-tree\n [entries]=\"tagEntries()\"\n rootLabel=\"categories\"\n [renderLabel]=\"renderLabel\"\n (entryChange)=\"onEntryChange($event)\"\n />\n <!-- list -->\n @if (tags.value.length) {\n <table>\n <tbody>\n @for ( e of tags.value; track e; let i = $index; let first = $first;\n let last = $last) {\n <tr>\n <td>\n <button\n [disabled]=\"first\"\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move tag up\"\n (click)=\"moveTagUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n [disabled]=\"last\"\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move tag down\"\n (click)=\"moveTagDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"removeTag(i)\">\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n <td>{{ e.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <span class=\"error\">no tags</span>\n }\n </div>\n </fieldset>\n\n <!-- values -->\n <mat-form-field class=\"long-text\">\n <textarea [formControl]=\"values\" matInput rows=\"3\"></textarea>\n <mat-hint>value(s), one per line</mat-hint>\n @if ($any(values).errors?.required && (values.dirty || values.touched)) {\n <mat-error>value(s) required</mat-error>\n } @if ($any(values).errors?.maxLength && (values.dirty || values.touched)) {\n <mat-error>value(s) too long</mat-error>\n }\n </mat-form-field>\n\n <!-- note -->\n <div>\n <mat-form-field class=\"long-text\">\n <mat-label>note</mat-label>\n <textarea matInput [formControl]=\"note\"></textarea>\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\n <mat-error>note too long</mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}.error{color:red}fieldset{border:1px solid silver;border-radius:6px;padding:4px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: 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: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: 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: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: ThesaurusTreeComponent, selector: "cadmus-thesaurus-tree", inputs: ["entries", "rootLabel", "renderLabel"], outputs: ["entryChange"] }] });
252
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaTokenComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
253
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.0", type: EpiFormulaTokenComponent, isStandalone: true, selector: "cadmus-epi-formula-token", inputs: { token: { classPropertyName: "token", publicName: "token", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { token: "tokenChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- placeholder -->\n <mat-checkbox [formControl]=\"placeholder\">placeholder</mat-checkbox>\n\n <!-- optional -->\n <mat-checkbox [formControl]=\"optional\">optional</mat-checkbox>\n </div>\n\n <!-- tags -->\n <fieldset>\n <legend>tags</legend>\n <div class=\"form-row\">\n <!-- picker -->\n <cadmus-thesaurus-tree\n [entries]=\"tagEntries()\"\n rootLabel=\"categories\"\n [renderLabel]=\"renderLabel\"\n (entryChange)=\"onEntryChange($event)\"\n />\n <!-- list -->\n @if (tags.value.length) {\n <table>\n <tbody>\n @for ( e of tags.value; track e; let i = $index; let first = $first;\n let last = $last) {\n <tr>\n <td>\n <button\n [disabled]=\"first\"\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move tag up\"\n (click)=\"moveTagUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n [disabled]=\"last\"\n mat-icon-button\n type=\"button\"\n matTooltip=\"Move tag down\"\n (click)=\"moveTagDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"removeTag(i)\">\n <mat-icon class=\"mat-warn\">delete</mat-icon>\n </button>\n </td>\n <td>{{ e.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <span class=\"error\">no tags</span>\n }\n </div>\n </fieldset>\n\n <!-- values -->\n <mat-form-field class=\"long-text\">\n <textarea [formControl]=\"values\" matInput rows=\"3\"></textarea>\n <mat-hint>value(s), one per line</mat-hint>\n @if ($any(values).errors?.required && (values.dirty || values.touched)) {\n <mat-error>value(s) required</mat-error>\n } @if ($any(values).errors?.maxLength && (values.dirty || values.touched)) {\n <mat-error>value(s) too long</mat-error>\n }\n </mat-form-field>\n\n <!-- note -->\n <div>\n <mat-form-field class=\"long-text\">\n <mat-label>note</mat-label>\n <textarea matInput [formControl]=\"note\"></textarea>\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\n <mat-error>note too long</mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}.error{color:red}fieldset{border:1px solid silver;border-radius:6px;padding:4px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: 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: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: 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: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: ThesaurusTreeComponent, selector: "cadmus-thesaurus-tree", inputs: ["entries", "rootLabel", "renderLabel"], outputs: ["entryChange"] }] });
254
254
  }
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaTokenComponent, decorators: [{
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaTokenComponent, decorators: [{
256
256
  type: Component,
257
257
  args: [{ selector: 'cadmus-epi-formula-token', imports: [
258
258
  FormsModule,
@@ -293,10 +293,10 @@ class EpiFormulaTokenPipe {
293
293
  sb.push(value.isOptional ? ']' : '>');
294
294
  return sb.join('');
295
295
  }
296
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaTokenPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
297
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaTokenPipe, isStandalone: true, name: "epiFormulaToken" });
296
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaTokenPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
297
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaTokenPipe, isStandalone: true, name: "epiFormulaToken" });
298
298
  }
299
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaTokenPipe, decorators: [{
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaTokenPipe, decorators: [{
300
300
  type: Pipe,
301
301
  args: [{ name: 'epiFormulaToken' }]
302
302
  }] });
@@ -309,16 +309,16 @@ class EpiFormulaPatternComponent {
309
309
  /**
310
310
  * The pattern being edited.
311
311
  */
312
- pattern = model();
312
+ pattern = model(...(ngDevMode ? [undefined, { debugName: "pattern" }] : []));
313
313
  // epi-formula-pattern-languages
314
- langEntries = input();
314
+ langEntries = input(...(ngDevMode ? [undefined, { debugName: "langEntries" }] : []));
315
315
  // epi-formula-pattern-tags
316
- tagEntries = input();
316
+ tagEntries = input(...(ngDevMode ? [undefined, { debugName: "tagEntries" }] : []));
317
317
  // epi-formula-token-tags
318
- tokTagEntries = input();
318
+ tokTagEntries = input(...(ngDevMode ? [undefined, { debugName: "tokTagEntries" }] : []));
319
319
  editorClose = output();
320
- editedIndex;
321
- edited;
320
+ edited = signal(undefined, ...(ngDevMode ? [{ debugName: "edited" }] : []));
321
+ editedIndex = signal(-1, ...(ngDevMode ? [{ debugName: "editedIndex" }] : []));
322
322
  eid;
323
323
  language;
324
324
  tag;
@@ -326,7 +326,6 @@ class EpiFormulaPatternComponent {
326
326
  form;
327
327
  constructor(formBuilder, _dialogService) {
328
328
  this._dialogService = _dialogService;
329
- this.editedIndex = -1;
330
329
  // form
331
330
  this.eid = formBuilder.control(null, Validators.maxLength(500));
332
331
  this.language = formBuilder.control('', {
@@ -368,20 +367,20 @@ class EpiFormulaPatternComponent {
368
367
  this.editToken(token, -1);
369
368
  }
370
369
  editToken(token, index) {
371
- this.editedIndex = index;
372
- this.edited = token;
370
+ this.editedIndex.set(index);
371
+ this.edited.set(deepCopy(token));
373
372
  }
374
373
  closeToken() {
375
- this.editedIndex = -1;
376
- this.edited = undefined;
374
+ this.editedIndex.set(-1);
375
+ this.edited.set(undefined);
377
376
  }
378
377
  saveToken(token) {
379
378
  const tokens = [...this.tokens.value];
380
- if (this.editedIndex === -1) {
379
+ if (this.editedIndex() === -1) {
381
380
  tokens.push(token);
382
381
  }
383
382
  else {
384
- tokens.splice(this.editedIndex, 1, token);
383
+ tokens.splice(this.editedIndex(), 1, token);
385
384
  }
386
385
  this.tokens.setValue(tokens);
387
386
  this.tokens.markAsDirty();
@@ -394,7 +393,7 @@ class EpiFormulaPatternComponent {
394
393
  .pipe(take(1))
395
394
  .subscribe((yes) => {
396
395
  if (yes) {
397
- if (this.editedIndex === index) {
396
+ if (this.editedIndex() === index) {
398
397
  this.closeToken();
399
398
  }
400
399
  const tokens = [...this.tokens.value];
@@ -410,10 +409,10 @@ class EpiFormulaPatternComponent {
410
409
  return;
411
410
  }
412
411
  const token = this.tokens.value[index];
413
- const entries = [...this.tokens.value];
414
- entries.splice(index, 1);
415
- entries.splice(index - 1, 0, token);
416
- this.tokens.setValue(entries);
412
+ const tokens = [...this.tokens.value];
413
+ tokens.splice(index, 1);
414
+ tokens.splice(index - 1, 0, token);
415
+ this.tokens.setValue(tokens);
417
416
  this.tokens.markAsDirty();
418
417
  this.tokens.updateValueAndValidity();
419
418
  }
@@ -421,11 +420,11 @@ class EpiFormulaPatternComponent {
421
420
  if (index + 1 >= this.tokens.value.length) {
422
421
  return;
423
422
  }
424
- const entry = this.tokens.value[index];
425
- const entries = [...this.tokens.value];
426
- entries.splice(index, 1);
427
- entries.splice(index + 1, 0, entry);
428
- this.tokens.setValue(entries);
423
+ const token = this.tokens.value[index];
424
+ const tokens = [...this.tokens.value];
425
+ tokens.splice(index, 1);
426
+ tokens.splice(index + 1, 0, token);
427
+ this.tokens.setValue(tokens);
429
428
  this.tokens.markAsDirty();
430
429
  this.tokens.updateValueAndValidity();
431
430
  }
@@ -446,10 +445,10 @@ class EpiFormulaPatternComponent {
446
445
  }
447
446
  this.pattern.set(this.getPattern());
448
447
  }
449
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: EpiFormulaPatternComponent, isStandalone: true, selector: "cadmus-epi-formula-pattern", inputs: { pattern: { classPropertyName: "pattern", publicName: "pattern", isSignal: true, isRequired: false, transformFunction: null }, langEntries: { classPropertyName: "langEntries", publicName: "langEntries", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null }, tokTagEntries: { classPropertyName: "tokTagEntries", publicName: "tokTagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pattern: "patternChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- eid -->\n <mat-form-field>\n <mat-label>EID</mat-label>\n <input matInput [formControl]=\"eid\" />\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\n <mat-error>EID too long</mat-error>\n }\n </mat-form-field>\n\n <!-- language (bound) -->\n @if (langEntries()?.length) {\n <mat-form-field>\n <mat-label>language</mat-label>\n <mat-select [formControl]=\"language\">\n @for (e of langEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n }\n </mat-form-field>\n }\n <!-- language (free) -->\n @else {\n <mat-form-field>\n <mat-label>language</mat-label>\n <input matInput [formControl]=\"language\" />\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n } @if ( $any(language).errors?.maxLength && (language.dirty ||\n language.touched) ) {\n <mat-error>language too long</mat-error>\n }\n </mat-form-field>\n }\n\n <!-- tag (bound) -->\n @if (tagEntries()?.length) {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n @for (e of tagEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n <!-- tag (free) -->\n @else {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\n <mat-error>tag too long</mat-error>\n }\n </mat-form-field>\n }\n </div>\n\n <!-- tokens -->\n <fieldset>\n <legend>tokens</legend>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addToken()\"\n >\n <mat-icon>add_circle</mat-icon> token\n </button>\n @if (tokens.value.length) {\n <table>\n <tbody>\n @for ( token of tokens.value; track token; let i = $index; let first =\n $first; let last = $last) {\n <tr [class.selected]=\"token === edited\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this token\"\n (click)=\"editToken(token, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token up\"\n [disabled]=\"first\"\n (click)=\"moveTokenUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token down\"\n [disabled]=\"last\"\n (click)=\"moveTokenDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this token\"\n (click)=\"deleteToken(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n {{ token | epiFormulaToken }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited) {\n <mat-expansion-panel [disabled]=\"!edited\" [expanded]=\"edited\">\n <mat-expansion-panel-header\n >Token #{{ editedIndex + 1 }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-token\n [token]=\"edited\"\n [tagEntries]=\"tokTagEntries()\"\n (tokenChange)=\"saveToken($event!)\"\n (editorClose)=\"closeToken()\"\n />\n </mat-expansion-panel>\n }\n </fieldset>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}fieldset{border:1px solid silver;border-radius:6px;padding:4px}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: 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: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: EpiFormulaTokenComponent, selector: "cadmus-epi-formula-token", inputs: ["token", "tagEntries"], outputs: ["tokenChange", "editorClose"] }, { kind: "pipe", type: EpiFormulaTokenPipe, name: "epiFormulaToken" }] });
448
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
449
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.0", type: EpiFormulaPatternComponent, isStandalone: true, selector: "cadmus-epi-formula-pattern", inputs: { pattern: { classPropertyName: "pattern", publicName: "pattern", isSignal: true, isRequired: false, transformFunction: null }, langEntries: { classPropertyName: "langEntries", publicName: "langEntries", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null }, tokTagEntries: { classPropertyName: "tokTagEntries", publicName: "tokTagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pattern: "patternChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- eid -->\n <mat-form-field>\n <mat-label>EID</mat-label>\n <input matInput [formControl]=\"eid\" />\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\n <mat-error>EID too long</mat-error>\n }\n </mat-form-field>\n\n <!-- language (bound) -->\n @if (langEntries()?.length) {\n <mat-form-field>\n <mat-label>language</mat-label>\n <mat-select [formControl]=\"language\">\n @for (e of langEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n }\n </mat-form-field>\n }\n <!-- language (free) -->\n @else {\n <mat-form-field>\n <mat-label>language</mat-label>\n <input matInput [formControl]=\"language\" />\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n } @if ( $any(language).errors?.maxLength && (language.dirty ||\n language.touched) ) {\n <mat-error>language too long</mat-error>\n }\n </mat-form-field>\n }\n\n <!-- tag (bound) -->\n @if (tagEntries()?.length) {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n @for (e of tagEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n <!-- tag (free) -->\n @else {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\n <mat-error>tag too long</mat-error>\n }\n </mat-form-field>\n }\n </div>\n\n <!-- tokens -->\n <fieldset>\n <legend>tokens</legend>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addToken()\"\n >\n <mat-icon>add_circle</mat-icon> token\n </button>\n @if (tokens.value.length) {\n <table>\n <tbody>\n @for ( token of tokens.value; track token; let i = $index; let first =\n $first; let last = $last) {\n <tr [class.selected]=\"i === editedIndex()\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this token\"\n (click)=\"editToken(token, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token up\"\n [disabled]=\"first\"\n (click)=\"moveTokenUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token down\"\n [disabled]=\"last\"\n (click)=\"moveTokenDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this token\"\n (click)=\"deleteToken(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n {{ token | epiFormulaToken }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited()) {\n <mat-expansion-panel [disabled]=\"!edited()\" [expanded]=\"edited()\">\n <mat-expansion-panel-header\n >Token #{{ editedIndex() + 1 }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-token\n [token]=\"edited()\"\n [tagEntries]=\"tokTagEntries()\"\n (tokenChange)=\"saveToken($event!)\"\n (editorClose)=\"closeToken()\"\n />\n </mat-expansion-panel>\n }\n </fieldset>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}fieldset{border:1px solid silver;border-radius:6px;padding:4px}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: 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: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: EpiFormulaTokenComponent, selector: "cadmus-epi-formula-token", inputs: ["token", "tagEntries"], outputs: ["tokenChange", "editorClose"] }, { kind: "pipe", type: EpiFormulaTokenPipe, name: "epiFormulaToken" }] });
451
450
  }
452
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternComponent, decorators: [{
451
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternComponent, decorators: [{
453
452
  type: Component,
454
453
  args: [{ selector: 'cadmus-epi-formula-pattern', imports: [
455
454
  FormsModule,
@@ -468,7 +467,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
468
467
  MatExpansionPanelHeader,
469
468
  EpiFormulaTokenComponent,
470
469
  EpiFormulaTokenPipe,
471
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- eid -->\n <mat-form-field>\n <mat-label>EID</mat-label>\n <input matInput [formControl]=\"eid\" />\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\n <mat-error>EID too long</mat-error>\n }\n </mat-form-field>\n\n <!-- language (bound) -->\n @if (langEntries()?.length) {\n <mat-form-field>\n <mat-label>language</mat-label>\n <mat-select [formControl]=\"language\">\n @for (e of langEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n }\n </mat-form-field>\n }\n <!-- language (free) -->\n @else {\n <mat-form-field>\n <mat-label>language</mat-label>\n <input matInput [formControl]=\"language\" />\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n } @if ( $any(language).errors?.maxLength && (language.dirty ||\n language.touched) ) {\n <mat-error>language too long</mat-error>\n }\n </mat-form-field>\n }\n\n <!-- tag (bound) -->\n @if (tagEntries()?.length) {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n @for (e of tagEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n <!-- tag (free) -->\n @else {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\n <mat-error>tag too long</mat-error>\n }\n </mat-form-field>\n }\n </div>\n\n <!-- tokens -->\n <fieldset>\n <legend>tokens</legend>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addToken()\"\n >\n <mat-icon>add_circle</mat-icon> token\n </button>\n @if (tokens.value.length) {\n <table>\n <tbody>\n @for ( token of tokens.value; track token; let i = $index; let first =\n $first; let last = $last) {\n <tr [class.selected]=\"token === edited\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this token\"\n (click)=\"editToken(token, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token up\"\n [disabled]=\"first\"\n (click)=\"moveTokenUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token down\"\n [disabled]=\"last\"\n (click)=\"moveTokenDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this token\"\n (click)=\"deleteToken(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n {{ token | epiFormulaToken }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited) {\n <mat-expansion-panel [disabled]=\"!edited\" [expanded]=\"edited\">\n <mat-expansion-panel-header\n >Token #{{ editedIndex + 1 }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-token\n [token]=\"edited\"\n [tagEntries]=\"tokTagEntries()\"\n (tokenChange)=\"saveToken($event!)\"\n (editorClose)=\"closeToken()\"\n />\n </mat-expansion-panel>\n }\n </fieldset>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}fieldset{border:1px solid silver;border-radius:6px;padding:4px}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"] }]
470
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- eid -->\n <mat-form-field>\n <mat-label>EID</mat-label>\n <input matInput [formControl]=\"eid\" />\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\n <mat-error>EID too long</mat-error>\n }\n </mat-form-field>\n\n <!-- language (bound) -->\n @if (langEntries()?.length) {\n <mat-form-field>\n <mat-label>language</mat-label>\n <mat-select [formControl]=\"language\">\n @for (e of langEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n }\n </mat-form-field>\n }\n <!-- language (free) -->\n @else {\n <mat-form-field>\n <mat-label>language</mat-label>\n <input matInput [formControl]=\"language\" />\n @if ( $any(language).errors?.required && (language.dirty ||\n language.touched) ) {\n <mat-error>language required</mat-error>\n } @if ( $any(language).errors?.maxLength && (language.dirty ||\n language.touched) ) {\n <mat-error>language too long</mat-error>\n }\n </mat-form-field>\n }\n\n <!-- tag (bound) -->\n @if (tagEntries()?.length) {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n @for (e of tagEntries(); track e.id) {\n <mat-option [value]=\"e.id\">{{ e.value }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n <!-- tag (free) -->\n @else {\n <mat-form-field>\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\n <mat-error>tag too long</mat-error>\n }\n </mat-form-field>\n }\n </div>\n\n <!-- tokens -->\n <fieldset>\n <legend>tokens</legend>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addToken()\"\n >\n <mat-icon>add_circle</mat-icon> token\n </button>\n @if (tokens.value.length) {\n <table>\n <tbody>\n @for ( token of tokens.value; track token; let i = $index; let first =\n $first; let last = $last) {\n <tr [class.selected]=\"i === editedIndex()\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this token\"\n (click)=\"editToken(token, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token up\"\n [disabled]=\"first\"\n (click)=\"moveTokenUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this token down\"\n [disabled]=\"last\"\n (click)=\"moveTokenDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this token\"\n (click)=\"deleteToken(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n {{ token | epiFormulaToken }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited()) {\n <mat-expansion-panel [disabled]=\"!edited()\" [expanded]=\"edited()\">\n <mat-expansion-panel-header\n >Token #{{ editedIndex() + 1 }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-token\n [token]=\"edited()\"\n [tagEntries]=\"tokTagEntries()\"\n (tokenChange)=\"saveToken($event!)\"\n (editorClose)=\"closeToken()\"\n />\n </mat-expansion-panel>\n }\n </fieldset>\n\n <!-- buttons -->\n <div>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Discard changes\"\n (click)=\"cancel()\"\n >\n <mat-icon class=\"mat-warn\">clear</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n matTooltip=\"Accept changes\"\n [disabled]=\"form.invalid || form.pristine\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}fieldset{border:1px solid silver;border-radius:6px;padding:4px}legend{color:silver}table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"] }]
472
471
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.DialogService }] });
473
472
 
474
473
  /**
@@ -478,19 +477,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
478
477
  */
479
478
  class EpiFormulaPatternsPartComponent extends ModelEditorComponentBase {
480
479
  _dialogService;
481
- editedIndex;
482
- edited;
480
+ edited = signal(undefined, ...(ngDevMode ? [{ debugName: "edited" }] : []));
481
+ editedIndex = signal(-1, ...(ngDevMode ? [{ debugName: "editedIndex" }] : []));
483
482
  // epi-formula-pattern-languages
484
- langEntries;
483
+ langEntries = signal(undefined, ...(ngDevMode ? [{ debugName: "langEntries" }] : []));
485
484
  // epi-formula-pattern-tags
486
- tagEntries;
485
+ tagEntries = signal(undefined, ...(ngDevMode ? [{ debugName: "tagEntries" }] : []));
487
486
  // epi-formula-token-tags
488
- tokTagEntries;
487
+ tokTagEntries = signal(undefined, ...(ngDevMode ? [{ debugName: "tokTagEntries" }] : []));
489
488
  patterns;
490
489
  constructor(authService, formBuilder, _dialogService) {
491
490
  super(authService, formBuilder);
492
491
  this._dialogService = _dialogService;
493
- this.editedIndex = -1;
494
492
  // form
495
493
  this.patterns = formBuilder.control([], {
496
494
  // at least 1 entry
@@ -509,24 +507,24 @@ class EpiFormulaPatternsPartComponent extends ModelEditorComponentBase {
509
507
  updateThesauri(thesauri) {
510
508
  let key = 'epi-formula-pattern-languages';
511
509
  if (this.hasThesaurus(key)) {
512
- this.langEntries = thesauri[key].entries;
510
+ this.langEntries.set(thesauri[key].entries);
513
511
  }
514
512
  else {
515
- this.langEntries = undefined;
513
+ this.langEntries.set(undefined);
516
514
  }
517
515
  key = 'epi-formula-pattern-tags';
518
516
  if (this.hasThesaurus(key)) {
519
- this.tagEntries = thesauri[key].entries;
517
+ this.tagEntries.set(thesauri[key].entries);
520
518
  }
521
519
  else {
522
- this.tagEntries = undefined;
520
+ this.tagEntries.set(undefined);
523
521
  }
524
522
  key = 'epi-formula-token-tags';
525
523
  if (this.hasThesaurus(key)) {
526
- this.tokTagEntries = thesauri[key].entries;
524
+ this.tokTagEntries.set(thesauri[key].entries);
527
525
  }
528
526
  else {
529
- this.tokTagEntries = undefined;
527
+ this.tokTagEntries.set(undefined);
530
528
  }
531
529
  }
532
530
  updateForm(part) {
@@ -558,20 +556,20 @@ class EpiFormulaPatternsPartComponent extends ModelEditorComponentBase {
558
556
  this.editPattern(pattern, -1);
559
557
  }
560
558
  editPattern(entry, index) {
561
- this.editedIndex = index;
562
- this.edited = entry;
559
+ this.editedIndex.set(index);
560
+ this.edited.set(deepCopy(entry));
563
561
  }
564
562
  closePattern() {
565
- this.editedIndex = -1;
566
- this.edited = undefined;
563
+ this.editedIndex.set(-1);
564
+ this.edited.set(undefined);
567
565
  }
568
566
  savePattern(pattern) {
569
567
  const patterns = [...this.patterns.value];
570
- if (this.editedIndex === -1) {
568
+ if (this.editedIndex() === -1) {
571
569
  patterns.push(pattern);
572
570
  }
573
571
  else {
574
- patterns.splice(this.editedIndex, 1, pattern);
572
+ patterns.splice(this.editedIndex(), 1, pattern);
575
573
  }
576
574
  this.patterns.setValue(patterns);
577
575
  this.patterns.markAsDirty();
@@ -584,7 +582,7 @@ class EpiFormulaPatternsPartComponent extends ModelEditorComponentBase {
584
582
  .pipe(take$1(1))
585
583
  .subscribe((yes) => {
586
584
  if (yes) {
587
- if (this.editedIndex === index) {
585
+ if (this.editedIndex() === index) {
588
586
  this.closePattern();
589
587
  }
590
588
  const patterns = [...this.patterns.value];
@@ -619,10 +617,10 @@ class EpiFormulaPatternsPartComponent extends ModelEditorComponentBase {
619
617
  this.patterns.markAsDirty();
620
618
  this.patterns.updateValueAndValidity();
621
619
  }
622
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternsPartComponent, deps: [{ token: i1$1.AuthJwtService }, { token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
623
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: EpiFormulaPatternsPartComponent, isStandalone: true, selector: "cadmus-epi-formula-patterns-part", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <mat-card>\n <mat-card-header>\n <div mat-card-avatar>\n <mat-icon>picture_in_picture</mat-icon>\n </div>\n <mat-card-title>{{\n (modelName() | titlecase) || \"Epigraphic Formula Patterns Part\"\n }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addPattern()\"\n >\n <mat-icon>add_circle</mat-icon> pattern\n </button>\n </div>\n @if (patterns.value.length) {\n <table>\n <tbody>\n @for ( pattern of patterns.value; track pattern; let i = $index; let\n first = $first; let last = $last) {\n <tr [class.selected]=\"pattern === edited\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this pattern\"\n (click)=\"editPattern(pattern, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern up\"\n [disabled]=\"first\"\n (click)=\"movePatternUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern down\"\n [disabled]=\"last\"\n (click)=\"movePatternDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this pattern\"\n (click)=\"deletePattern(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <ul>\n @for (t of pattern.tokens; track t) {\n <li>\n {{ t | epiFormulaToken }}\n </li>\n }\n </ul>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited) {\n <mat-expansion-panel [disabled]=\"!edited\" [expanded]=\"edited\">\n <mat-expansion-panel-header\n >Pattern #{{ editedIndex }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-pattern\n [langEntries]=\"langEntries\"\n [tagEntries]=\"tagEntries\"\n [tokTagEntries]=\"tokTagEntries\"\n [pattern]=\"edited\"\n (editorClose)=\"closePattern()\"\n (patternChange)=\"savePattern($event!)\"\n />\n </mat-expansion-panel>\n }\n </mat-card-content>\n <mat-card-actions>\n <cadmus-close-save-buttons\n [form]=\"form\"\n [noSave]=\"userLevel < 2\"\n (closeRequest)=\"close()\"\n />\n </mat-card-actions>\n </mat-card>\n</form>\n", styles: ["table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: EpiFormulaPatternComponent, selector: "cadmus-epi-formula-pattern", inputs: ["pattern", "langEntries", "tagEntries", "tokTagEntries"], outputs: ["patternChange", "editorClose"] }, { kind: "directive", type: MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "pipe", type: EpiFormulaTokenPipe, name: "epiFormulaToken" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "component", type: CloseSaveButtonsComponent, selector: "cadmus-close-save-buttons", inputs: ["form", "noSave"], outputs: ["closeRequest"] }] });
620
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternsPartComponent, deps: [{ token: i1$1.AuthJwtService }, { token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
621
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.0", type: EpiFormulaPatternsPartComponent, isStandalone: true, selector: "cadmus-epi-formula-patterns-part", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <mat-card>\n <mat-card-header>\n <div mat-card-avatar>\n <mat-icon>picture_in_picture</mat-icon>\n </div>\n <mat-card-title>{{\n (modelName() | titlecase) || \"Epigraphic Formula Patterns Part\"\n }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addPattern()\"\n >\n <mat-icon>add_circle</mat-icon> pattern\n </button>\n </div>\n @if (patterns.value.length) {\n <table>\n <tbody>\n @for ( pattern of patterns.value; track pattern; let i = $index; let\n first = $first; let last = $last) {\n <tr [class.selected]=\"i === editedIndex()\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this pattern\"\n (click)=\"editPattern(pattern, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern up\"\n [disabled]=\"first\"\n (click)=\"movePatternUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern down\"\n [disabled]=\"last\"\n (click)=\"movePatternDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this pattern\"\n (click)=\"deletePattern(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <ul>\n @for (t of pattern.tokens; track t) {\n <li>\n {{ t | epiFormulaToken }}\n </li>\n }\n </ul>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited()) {\n <mat-expansion-panel [disabled]=\"!edited()\" [expanded]=\"edited()\">\n <mat-expansion-panel-header\n >Pattern #{{ editedIndex() }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-pattern\n [langEntries]=\"langEntries()\"\n [tagEntries]=\"tagEntries()\"\n [tokTagEntries]=\"tokTagEntries()\"\n [pattern]=\"edited()\"\n (editorClose)=\"closePattern()\"\n (patternChange)=\"savePattern($event!)\"\n />\n </mat-expansion-panel>\n }\n </mat-card-content>\n <mat-card-actions>\n <cadmus-close-save-buttons\n [form]=\"form\"\n [noSave]=\"userLevel < 2\"\n (closeRequest)=\"close()\"\n />\n </mat-card-actions>\n </mat-card>\n</form>\n", styles: ["table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: EpiFormulaPatternComponent, selector: "cadmus-epi-formula-pattern", inputs: ["pattern", "langEntries", "tagEntries", "tokTagEntries"], outputs: ["patternChange", "editorClose"] }, { kind: "directive", type: MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "component", type: CloseSaveButtonsComponent, selector: "cadmus-close-save-buttons", inputs: ["form", "noSave"], outputs: ["closeRequest"] }, { kind: "pipe", type: EpiFormulaTokenPipe, name: "epiFormulaToken" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }] });
624
622
  }
625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternsPartComponent, decorators: [{
623
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternsPartComponent, decorators: [{
626
624
  type: Component,
627
625
  args: [{ selector: 'cadmus-epi-formula-patterns-part', imports: [
628
626
  FormsModule,
@@ -643,7 +641,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
643
641
  EpiFormulaTokenPipe,
644
642
  TitleCasePipe,
645
643
  CloseSaveButtonsComponent,
646
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <mat-card>\n <mat-card-header>\n <div mat-card-avatar>\n <mat-icon>picture_in_picture</mat-icon>\n </div>\n <mat-card-title>{{\n (modelName() | titlecase) || \"Epigraphic Formula Patterns Part\"\n }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addPattern()\"\n >\n <mat-icon>add_circle</mat-icon> pattern\n </button>\n </div>\n @if (patterns.value.length) {\n <table>\n <tbody>\n @for ( pattern of patterns.value; track pattern; let i = $index; let\n first = $first; let last = $last) {\n <tr [class.selected]=\"pattern === edited\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this pattern\"\n (click)=\"editPattern(pattern, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern up\"\n [disabled]=\"first\"\n (click)=\"movePatternUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern down\"\n [disabled]=\"last\"\n (click)=\"movePatternDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this pattern\"\n (click)=\"deletePattern(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <ul>\n @for (t of pattern.tokens; track t) {\n <li>\n {{ t | epiFormulaToken }}\n </li>\n }\n </ul>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited) {\n <mat-expansion-panel [disabled]=\"!edited\" [expanded]=\"edited\">\n <mat-expansion-panel-header\n >Pattern #{{ editedIndex }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-pattern\n [langEntries]=\"langEntries\"\n [tagEntries]=\"tagEntries\"\n [tokTagEntries]=\"tokTagEntries\"\n [pattern]=\"edited\"\n (editorClose)=\"closePattern()\"\n (patternChange)=\"savePattern($event!)\"\n />\n </mat-expansion-panel>\n }\n </mat-card-content>\n <mat-card-actions>\n <cadmus-close-save-buttons\n [form]=\"form\"\n [noSave]=\"userLevel < 2\"\n (closeRequest)=\"close()\"\n />\n </mat-card-actions>\n </mat-card>\n</form>\n", styles: ["table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"] }]
644
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <mat-card>\n <mat-card-header>\n <div mat-card-avatar>\n <mat-icon>picture_in_picture</mat-icon>\n </div>\n <mat-card-title>{{\n (modelName() | titlecase) || \"Epigraphic Formula Patterns Part\"\n }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div>\n <button\n type=\"button\"\n mat-flat-button\n class=\"mat-primary\"\n (click)=\"addPattern()\"\n >\n <mat-icon>add_circle</mat-icon> pattern\n </button>\n </div>\n @if (patterns.value.length) {\n <table>\n <tbody>\n @for ( pattern of patterns.value; track pattern; let i = $index; let\n first = $first; let last = $last) {\n <tr [class.selected]=\"i === editedIndex()\">\n <td class=\"fit-width\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Edit this pattern\"\n (click)=\"editPattern(pattern, i)\"\n >\n <mat-icon class=\"mat-primary\">edit</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern up\"\n [disabled]=\"first\"\n (click)=\"movePatternUp(i)\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Move this pattern down\"\n [disabled]=\"last\"\n (click)=\"movePatternDown(i)\"\n >\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Delete this pattern\"\n (click)=\"deletePattern(i)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <ul>\n @for (t of pattern.tokens; track t) {\n <li>\n {{ t | epiFormulaToken }}\n </li>\n }\n </ul>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @if (edited()) {\n <mat-expansion-panel [disabled]=\"!edited()\" [expanded]=\"edited()\">\n <mat-expansion-panel-header\n >Pattern #{{ editedIndex() }}</mat-expansion-panel-header\n >\n <cadmus-epi-formula-pattern\n [langEntries]=\"langEntries()\"\n [tagEntries]=\"tagEntries()\"\n [tokTagEntries]=\"tokTagEntries()\"\n [pattern]=\"edited()\"\n (editorClose)=\"closePattern()\"\n (patternChange)=\"savePattern($event!)\"\n />\n </mat-expansion-panel>\n }\n </mat-card-content>\n <mat-card-actions>\n <cadmus-close-save-buttons\n [form]=\"form\"\n [noSave]=\"userLevel < 2\"\n (closeRequest)=\"close()\"\n />\n </mat-card-actions>\n </mat-card>\n</form>\n", styles: ["table{width:100%;border-collapse:collapse}tbody tr:nth-child(odd){background-color:#e2e2e2}th{text-align:left;font-weight:400;color:silver}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#d0d0d0!important}fieldset{border:1px solid silver;border-radius:6px;padding:6px}\n"] }]
647
645
  }], ctorParameters: () => [{ type: i1$1.AuthJwtService }, { type: i1.FormBuilder }, { type: i2.DialogService }] });
648
646
 
649
647
  class EpiFormulaPatternsPartFeatureComponent extends EditPartFeatureBase {
@@ -657,10 +655,10 @@ class EpiFormulaPatternsPartFeatureComponent extends EditPartFeatureBase {
657
655
  'epi-formula-token-tags',
658
656
  ];
659
657
  }
660
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternsPartFeatureComponent, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i2$1.MatSnackBar }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.PartEditorService }], target: i0.ɵɵFactoryTarget.Component });
661
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: EpiFormulaPatternsPartFeatureComponent, isStandalone: true, selector: "cadmus-epi-formula-patterns-part-feature", usesInheritance: true, ngImport: i0, template: "<cadmus-current-item-bar/>\n<cadmus-epi-formula-patterns-part\n [identity]=\"identity\"\n [data]=\"$any(data)\"\n (dataChange)=\"save($event!.value!)\"\n (editorClose)=\"close()\"\n (dirtyChange)=\"onDirtyChange($event)\"\n/>\n", styles: [""], dependencies: [{ kind: "component", type: CurrentItemBarComponent, selector: "cadmus-current-item-bar" }, { kind: "component", type: EpiFormulaPatternsPartComponent, selector: "cadmus-epi-formula-patterns-part" }] });
658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternsPartFeatureComponent, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i2$1.MatSnackBar }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4.PartEditorService }], target: i0.ɵɵFactoryTarget.Component });
659
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.0", type: EpiFormulaPatternsPartFeatureComponent, isStandalone: true, selector: "cadmus-epi-formula-patterns-part-feature", usesInheritance: true, ngImport: i0, template: "<cadmus-current-item-bar/>\n<cadmus-epi-formula-patterns-part\n [identity]=\"identity\"\n [data]=\"$any(data)\"\n (dataChange)=\"save($event!.value!)\"\n (editorClose)=\"close()\"\n (dirtyChange)=\"onDirtyChange($event)\"\n/>\n", styles: [""], dependencies: [{ kind: "component", type: CurrentItemBarComponent, selector: "cadmus-current-item-bar" }, { kind: "component", type: EpiFormulaPatternsPartComponent, selector: "cadmus-epi-formula-patterns-part" }] });
662
660
  }
663
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EpiFormulaPatternsPartFeatureComponent, decorators: [{
661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.0", ngImport: i0, type: EpiFormulaPatternsPartFeatureComponent, decorators: [{
664
662
  type: Component,
665
663
  args: [{ selector: 'cadmus-epi-formula-patterns-part-feature', imports: [CurrentItemBarComponent, EpiFormulaPatternsPartComponent], template: "<cadmus-current-item-bar/>\n<cadmus-epi-formula-patterns-part\n [identity]=\"identity\"\n [data]=\"$any(data)\"\n (dataChange)=\"save($event!.value!)\"\n (editorClose)=\"close()\"\n (dirtyChange)=\"onDirtyChange($event)\"\n/>\n" }]
666
664
  }], ctorParameters: () => [{ type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: i2$1.MatSnackBar }, { type: i3.ItemService }, { type: i3.ThesaurusService }, { type: i4.PartEditorService }] });