@myrmidon/cadmus-part-lexicography-word-senses 0.0.1 → 0.0.4

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,3 @@
1
- import * as i9$2 from '@angular/common';
2
- import { CommonModule } from '@angular/common';
3
1
  import * as i0 from '@angular/core';
4
2
  import { model, output, input, effect, Inject, Optional, Component, signal } from '@angular/core';
5
3
  import * as i1 from '@angular/forms';
@@ -22,7 +20,7 @@ import * as i9 from '@cisstech/nge/monaco';
22
20
  import { NgeMonacoModule } from '@cisstech/nge/monaco';
23
21
  import * as i10 from '@cisstech/nge/markdown';
24
22
  import { NgeMarkdownModule } from '@cisstech/nge/markdown';
25
- import { ThesEntriesPickerComponent, ModelEditorComponentBase, CloseSaveButtonsComponent } from '@myrmidon/cadmus-ui';
23
+ import { ThesaurusEntriesPickerComponent } from '@myrmidon/cadmus-thesaurus-store';
26
24
  import * as i2 from '@myrmidon/cadmus-text-ed';
27
25
  import { CADMUS_TEXT_ED_BINDINGS_TOKEN } from '@myrmidon/cadmus-text-ed';
28
26
  import * as i9$1 from '@angular/material/tabs';
@@ -30,8 +28,11 @@ import { MatTabsModule } from '@angular/material/tabs';
30
28
  import { EllipsisPipe, FlatLookupPipe, NgxToolsValidators, deepCopy } from '@myrmidon/ngx-tools';
31
29
  import { AssertedCompositeIdsComponent } from '@myrmidon/cadmus-refs-asserted-ids';
32
30
  import * as i2$1 from '@myrmidon/ngx-mat-tools';
31
+ import * as i9$2 from '@angular/common';
32
+ import { CommonModule } from '@angular/common';
33
33
  import * as i5$2 from '@angular/material/card';
34
34
  import { MatCardModule } from '@angular/material/card';
35
+ import { ModelEditorComponentBase, CloseSaveButtonsComponent } from '@myrmidon/cadmus-ui';
35
36
  import * as i1$1 from '@myrmidon/auth-jwt-login';
36
37
  import * as i4$1 from '@myrmidon/cadmus-state';
37
38
  import { EditPartFeatureBase } from '@myrmidon/cadmus-state';
@@ -362,13 +363,12 @@ class WordSenseExampleEditor {
362
363
  this.form.markAsPristine();
363
364
  }
364
365
  }
365
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: WordSenseExampleEditor, deps: [{ token: i1.FormBuilder }, { token: i2.CadmusTextEdService }, { token: CADMUS_TEXT_ED_BINDINGS_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
366
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: WordSenseExampleEditor, isStandalone: true, selector: "cadmus-word-sense-example-editor", inputs: { example: { classPropertyName: "example", publicName: "example", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { example: "exampleChange", cancelEdit: "cancelEdit" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:100%;max-width:800px}.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:6px}legend{color:silver}#txt-editor,#exp-editor{height:300px}.mt{margin-top:16px}#txt-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"txt preview\";gap:8px}#txt{grid-area:txt}#txt-preview{grid-area:preview}@media only screen and (max-width: 959px){#txt-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"txt\" \"preview\"}}#exp-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"exp exp-preview\";gap:8px}#exp{grid-area:exp}#exp-preview{grid-area:exp-preview}@media only screen and (max-width: 959px){#exp-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"exp\" \"exp-preview\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.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: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgeMonacoModule }, { kind: "component", type: i9.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgeMarkdownModule }, { kind: "component", type: i10.NgeMarkdownComponent, selector: "nge-markdown, [nge-markdown]", inputs: ["file", "data", "theme"], outputs: ["render"] }, { kind: "component", type: ThesEntriesPickerComponent, selector: "cadmus-thes-entries-picker", inputs: ["availableEntries", "entries", "hierarchicLabels", "autoSort", "allowCustom", "minEntries", "maxEntries", "expanded", "emptyMessage"], outputs: ["entriesChange", "expandedChange"] }] });
366
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: WordSenseExampleEditor, deps: [{ token: i1.FormBuilder }, { token: i2.CadmusTextEdService }, { token: CADMUS_TEXT_ED_BINDINGS_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
367
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: WordSenseExampleEditor, isStandalone: true, selector: "cadmus-word-sense-example-editor", inputs: { example: { classPropertyName: "example", publicName: "example", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { example: "exampleChange", cancelEdit: "cancelEdit" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:100%;max-width:800px}.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:6px}legend{color:silver}#txt-editor,#exp-editor{height:300px}.mt{margin-top:16px}#txt-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"txt preview\";gap:8px}#txt{grid-area:txt}#txt-preview{grid-area:preview}@media only screen and (max-width:959px){#txt-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"txt\" \"preview\"}}#exp-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"exp exp-preview\";gap:8px}#exp{grid-area:exp}#exp-preview{grid-area:exp-preview}@media only screen and (max-width:959px){#exp-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"exp\" \"exp-preview\"}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.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: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgeMonacoModule }, { kind: "component", type: i9.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgeMarkdownModule }, { kind: "component", type: i10.NgeMarkdownComponent, selector: "nge-markdown, [nge-markdown]", inputs: ["file", "data", "theme"], outputs: ["render"] }, { kind: "component", type: ThesaurusEntriesPickerComponent, selector: "cadmus-thesaurus-entries-picker", inputs: ["availableEntries", "entries", "hierarchicLabels", "autoSort", "allowCustom", "minEntries", "maxEntries", "expanded", "emptyMessage"], outputs: ["entriesChange", "expandedChange"] }] });
367
368
  }
368
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: WordSenseExampleEditor, decorators: [{
369
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: WordSenseExampleEditor, decorators: [{
369
370
  type: Component,
370
371
  args: [{ selector: 'cadmus-word-sense-example-editor', imports: [
371
- CommonModule,
372
372
  ReactiveFormsModule,
373
373
  MatButtonModule,
374
374
  MatCheckboxModule,
@@ -380,8 +380,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
380
380
  MatTooltipModule,
381
381
  NgeMonacoModule,
382
382
  NgeMarkdownModule,
383
- ThesEntriesPickerComponent,
384
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:100%;max-width:800px}.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:6px}legend{color:silver}#txt-editor,#exp-editor{height:300px}.mt{margin-top:16px}#txt-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"txt preview\";gap:8px}#txt{grid-area:txt}#txt-preview{grid-area:preview}@media only screen and (max-width: 959px){#txt-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"txt\" \"preview\"}}#exp-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"exp exp-preview\";gap:8px}#exp{grid-area:exp}#exp-preview{grid-area:exp-preview}@media only screen and (max-width: 959px){#exp-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"exp\" \"exp-preview\"}}\n"] }]
383
+ ThesaurusEntriesPickerComponent,
384
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".long-text{width:100%;max-width:800px}.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:6px}legend{color:silver}#txt-editor,#exp-editor{height:300px}.mt{margin-top:16px}#txt-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"txt preview\";gap:8px}#txt{grid-area:txt}#txt-preview{grid-area:preview}@media only screen and (max-width:959px){#txt-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"txt\" \"preview\"}}#exp-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"exp exp-preview\";gap:8px}#exp{grid-area:exp}#exp-preview{grid-area:exp-preview}@media only screen and (max-width:959px){#exp-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"exp\" \"exp-preview\"}}\n"] }]
385
385
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.CadmusTextEdService }, { type: undefined, decorators: [{
386
386
  type: Inject,
387
387
  args: [CADMUS_TEXT_ED_BINDINGS_TOKEN]
@@ -413,6 +413,8 @@ class WordSenseEditor {
413
413
  refTypeEntries = input(...(ngDevMode ? [undefined, { debugName: "refTypeEntries" }] : []));
414
414
  // doc-reference-tags
415
415
  refTagEntries = input(...(ngDevMode ? [undefined, { debugName: "refTagEntries" }] : []));
416
+ // asserted-id-features
417
+ idFeatureEntries = input(...(ngDevMode ? [undefined, { debugName: "idFeatureEntries" }] : []));
416
418
  eid;
417
419
  tags;
418
420
  definition;
@@ -640,13 +642,12 @@ class WordSenseEditor {
640
642
  this.form.markAsPristine();
641
643
  }
642
644
  }
643
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: WordSenseEditor, deps: [{ token: i1.FormBuilder }, { token: i2$1.DialogService }, { token: i2.CadmusTextEdService }, { token: CADMUS_TEXT_ED_BINDINGS_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
644
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: WordSenseEditor, isStandalone: true, selector: "cadmus-word-sense-editor", inputs: { sense: { classPropertyName: "sense", publicName: "sense", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null }, assIdScopeEntries: { classPropertyName: "assIdScopeEntries", publicName: "assIdScopeEntries", isSignal: true, isRequired: false, transformFunction: null }, assIdTagEntries: { classPropertyName: "assIdTagEntries", publicName: "assIdTagEntries", isSignal: true, isRequired: false, transformFunction: null }, assTagEntries: { classPropertyName: "assTagEntries", publicName: "assTagEntries", isSignal: true, isRequired: false, transformFunction: null }, refTypeEntries: { classPropertyName: "refTypeEntries", publicName: "refTypeEntries", isSignal: true, isRequired: false, transformFunction: null }, refTagEntries: { classPropertyName: "refTagEntries", publicName: "refTagEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sense: "senseChange", cancelEdit: "cancelEdit" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n", styles: ["#editor{height:300px}.long-text{width:100%;max-width:800px}.mt{margin-top:16px}#def-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"def preview\";gap:8px}#def{grid-area:def}#def-preview{grid-area:preview}@media only screen and (max-width: 959px){#def-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"def\" \"preview\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.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: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i9$1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i9$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgeMonacoModule }, { kind: "component", type: i9.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgeMarkdownModule }, { kind: "component", type: i10.NgeMarkdownComponent, selector: "nge-markdown, [nge-markdown]", inputs: ["file", "data", "theme"], outputs: ["render"] }, { kind: "component", type: AssertedCompositeIdsComponent, selector: "cadmus-refs-asserted-composite-ids", inputs: ["ids", "idScopeEntries", "idTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "pinByTypeMode", "canSwitchMode", "canEditTarget", "lookupDefinitions", "defaultPartTypeKey"], outputs: ["idsChange"] }, { kind: "component", type: ThesEntriesPickerComponent, selector: "cadmus-thes-entries-picker", inputs: ["availableEntries", "entries", "hierarchicLabels", "autoSort", "allowCustom", "minEntries", "maxEntries", "expanded", "emptyMessage"], outputs: ["entriesChange", "expandedChange"] }, { kind: "component", type: WordSenseExampleEditor, selector: "cadmus-word-sense-example-editor", inputs: ["example", "tagEntries"], outputs: ["exampleChange", "cancelEdit"] }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: FlatLookupPipe, name: "flatLookup" }] });
645
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: WordSenseEditor, deps: [{ token: i1.FormBuilder }, { token: i2$1.DialogService }, { token: i2.CadmusTextEdService }, { token: CADMUS_TEXT_ED_BINDINGS_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
646
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: WordSenseEditor, isStandalone: true, selector: "cadmus-word-sense-editor", inputs: { sense: { classPropertyName: "sense", publicName: "sense", isSignal: true, isRequired: false, transformFunction: null }, tagEntries: { classPropertyName: "tagEntries", publicName: "tagEntries", isSignal: true, isRequired: false, transformFunction: null }, assIdScopeEntries: { classPropertyName: "assIdScopeEntries", publicName: "assIdScopeEntries", isSignal: true, isRequired: false, transformFunction: null }, assIdTagEntries: { classPropertyName: "assIdTagEntries", publicName: "assIdTagEntries", isSignal: true, isRequired: false, transformFunction: null }, assTagEntries: { classPropertyName: "assTagEntries", publicName: "assTagEntries", isSignal: true, isRequired: false, transformFunction: null }, refTypeEntries: { classPropertyName: "refTypeEntries", publicName: "refTypeEntries", isSignal: true, isRequired: false, transformFunction: null }, refTagEntries: { classPropertyName: "refTagEntries", publicName: "refTagEntries", isSignal: true, isRequired: false, transformFunction: null }, idFeatureEntries: { classPropertyName: "idFeatureEntries", publicName: "idFeatureEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sense: "senseChange", cancelEdit: "cancelEdit" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [featureEntries]=\"idFeatureEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n", styles: ["#editor{height:300px}.long-text{width:100%;max-width:800px}.mt{margin-top:16px}#def-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"def preview\";gap:8px}#def{grid-area:def}#def-preview{grid-area:preview}@media only screen and (max-width:959px){#def-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"def\" \"preview\"}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.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: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i9$1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i9$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgeMonacoModule }, { kind: "component", type: i9.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgeMarkdownModule }, { kind: "component", type: i10.NgeMarkdownComponent, selector: "nge-markdown, [nge-markdown]", inputs: ["file", "data", "theme"], outputs: ["render"] }, { kind: "component", type: AssertedCompositeIdsComponent, selector: "cadmus-refs-asserted-composite-ids", inputs: ["ids", "idScopeEntries", "idTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "featureEntries", "pinByTypeMode", "canSwitchMode", "canEditTarget", "lookupDefinitions", "defaultPartTypeKey"], outputs: ["idsChange"] }, { kind: "component", type: ThesaurusEntriesPickerComponent, selector: "cadmus-thesaurus-entries-picker", inputs: ["availableEntries", "entries", "hierarchicLabels", "autoSort", "allowCustom", "minEntries", "maxEntries", "expanded", "emptyMessage"], outputs: ["entriesChange", "expandedChange"] }, { kind: "component", type: WordSenseExampleEditor, selector: "cadmus-word-sense-example-editor", inputs: ["example", "tagEntries"], outputs: ["exampleChange", "cancelEdit"] }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: FlatLookupPipe, name: "flatLookup" }] });
645
647
  }
646
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: WordSenseEditor, decorators: [{
648
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: WordSenseEditor, decorators: [{
647
649
  type: Component,
648
650
  args: [{ selector: 'cadmus-word-sense-editor', imports: [
649
- CommonModule,
650
651
  ReactiveFormsModule,
651
652
  MatButtonModule,
652
653
  MatCheckboxModule,
@@ -660,22 +661,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
660
661
  NgeMonacoModule,
661
662
  NgeMarkdownModule,
662
663
  AssertedCompositeIdsComponent,
663
- ThesEntriesPickerComponent,
664
+ ThesaurusEntriesPickerComponent,
664
665
  WordSenseExampleEditor,
665
666
  EllipsisPipe,
666
- FlatLookupPipe
667
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n", styles: ["#editor{height:300px}.long-text{width:100%;max-width:800px}.mt{margin-top:16px}#def-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"def preview\";gap:8px}#def{grid-area:def}#def-preview{grid-area:preview}@media only screen and (max-width: 959px){#def-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"def\" \"preview\"}}\n"] }]
667
+ FlatLookupPipe,
668
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [featureEntries]=\"idFeatureEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n", styles: ["#editor{height:300px}.long-text{width:100%;max-width:800px}.mt{margin-top:16px}#def-container{display:grid;grid-template-rows:auto;grid-template-columns:1fr 1fr;grid-template-areas:\"def preview\";gap:8px}#def{grid-area:def}#def-preview{grid-area:preview}@media only screen and (max-width:959px){#def-container{grid-template-columns:1fr;grid-template-rows:auto auto;grid-template-areas:\"def\" \"preview\"}}\n"] }]
668
669
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2$1.DialogService }, { type: i2.CadmusTextEdService }, { type: undefined, decorators: [{
669
670
  type: Inject,
670
671
  args: [CADMUS_TEXT_ED_BINDINGS_TOKEN]
671
672
  }, {
672
673
  type: Optional
673
- }] }], propDecorators: { sense: [{ type: i0.Input, args: [{ isSignal: true, alias: "sense", required: false }] }, { type: i0.Output, args: ["senseChange"] }], cancelEdit: [{ type: i0.Output, args: ["cancelEdit"] }], tagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "tagEntries", required: false }] }], assIdScopeEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assIdScopeEntries", required: false }] }], assIdTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assIdTagEntries", required: false }] }], assTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assTagEntries", required: false }] }], refTypeEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "refTypeEntries", required: false }] }], refTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "refTagEntries", required: false }] }] } });
674
+ }] }], propDecorators: { sense: [{ type: i0.Input, args: [{ isSignal: true, alias: "sense", required: false }] }, { type: i0.Output, args: ["senseChange"] }], cancelEdit: [{ type: i0.Output, args: ["cancelEdit"] }], tagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "tagEntries", required: false }] }], assIdScopeEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assIdScopeEntries", required: false }] }], assIdTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assIdTagEntries", required: false }] }], assTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "assTagEntries", required: false }] }], refTypeEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "refTypeEntries", required: false }] }], refTagEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "refTagEntries", required: false }] }], idFeatureEntries: [{ type: i0.Input, args: [{ isSignal: true, alias: "idFeatureEntries", required: false }] }] } });
674
675
 
675
676
  /**
676
677
  * Word senses part editor component.
677
678
  * Thesauri: lex-word-sense-tags, asserted-id-scopes, asserted-id-tags,
678
- * doc-reference-types, doc-reference-tags.
679
+ * doc-reference-types, doc-reference-tags, asserted-id-features.
679
680
  */
680
681
  class LexWordSensesPartEditor extends ModelEditorComponentBase {
681
682
  _dialogService;
@@ -683,6 +684,8 @@ class LexWordSensesPartEditor extends ModelEditorComponentBase {
683
684
  edited = signal(undefined, ...(ngDevMode ? [{ debugName: "edited" }] : []));
684
685
  // lex-word-sense-tags
685
686
  tagEntries = signal(undefined, ...(ngDevMode ? [{ debugName: "tagEntries" }] : []));
687
+ // asserted-id-features
688
+ idFeatureEntries = signal(undefined, ...(ngDevMode ? [{ debugName: "idFeatureEntries" }] : []));
686
689
  entries;
687
690
  constructor(authService, formBuilder, _dialogService) {
688
691
  super(authService, formBuilder);
@@ -703,13 +706,20 @@ class LexWordSensesPartEditor extends ModelEditorComponentBase {
703
706
  });
704
707
  }
705
708
  updateThesauri(thesauri) {
706
- const key = 'lex-word-sense-tags';
709
+ let key = 'lex-word-sense-tags';
707
710
  if (this.hasThesaurus(key)) {
708
711
  this.tagEntries.set(thesauri[key].entries);
709
712
  }
710
713
  else {
711
714
  this.tagEntries.set(undefined);
712
715
  }
716
+ key = 'asserted-id-features';
717
+ if (this.hasThesaurus(key)) {
718
+ this.idFeatureEntries.set(thesauri[key].entries);
719
+ }
720
+ else {
721
+ this.idFeatureEntries.set(undefined);
722
+ }
713
723
  }
714
724
  updateForm(part) {
715
725
  if (!part) {
@@ -799,12 +809,12 @@ class LexWordSensesPartEditor extends ModelEditorComponentBase {
799
809
  this.entries.markAsDirty();
800
810
  this.entries.updateValueAndValidity();
801
811
  }
802
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: LexWordSensesPartEditor, deps: [{ token: i1$1.AuthJwtService }, { token: i1.FormBuilder }, { token: i2$1.DialogService }], target: i0.ɵɵFactoryTarget.Component });
803
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: LexWordSensesPartEditor, isStandalone: true, selector: "cadmus-lex-word-senses-part-editor", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\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: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$2.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5$2.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i5$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type:
812
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: LexWordSensesPartEditor, deps: [{ token: i1$1.AuthJwtService }, { token: i1.FormBuilder }, { token: i2$1.DialogService }], target: i0.ɵɵFactoryTarget.Component });
813
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: LexWordSensesPartEditor, isStandalone: true, selector: "cadmus-lex-word-senses-part-editor", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [idFeatureEntries]=\"idFeatureEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\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: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$2.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5$2.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i5$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type:
804
814
  // cadmus
805
- CloseSaveButtonsComponent, selector: "cadmus-close-save-buttons", inputs: ["form", "noSave"], outputs: ["closeRequest"] }, { kind: "component", type: WordSenseEditor, selector: "cadmus-word-sense-editor", inputs: ["sense", "tagEntries", "assIdScopeEntries", "assIdTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries"], outputs: ["senseChange", "cancelEdit"] }, { kind: "pipe", type: i9$2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }] });
815
+ CloseSaveButtonsComponent, selector: "cadmus-close-save-buttons", inputs: ["form", "noSave"], outputs: ["closeRequest"] }, { kind: "component", type: WordSenseEditor, selector: "cadmus-word-sense-editor", inputs: ["sense", "tagEntries", "assIdScopeEntries", "assIdTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "idFeatureEntries"], outputs: ["senseChange", "cancelEdit"] }, { kind: "pipe", type: i9$2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }] });
806
816
  }
807
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: LexWordSensesPartEditor, decorators: [{
817
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: LexWordSensesPartEditor, decorators: [{
808
818
  type: Component,
809
819
  args: [{ selector: 'cadmus-lex-word-senses-part-editor', imports: [
810
820
  CommonModule,
@@ -822,7 +832,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
822
832
  WordSenseEditor,
823
833
  FlatLookupPipe,
824
834
  EllipsisPipe,
825
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\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"] }]
835
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [idFeatureEntries]=\"idFeatureEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\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"] }]
826
836
  }], ctorParameters: () => [{ type: i1$1.AuthJwtService }, { type: i1.FormBuilder }, { type: i2$1.DialogService }] });
827
837
 
828
838
  class LexWordSensesPartFeature extends EditPartFeatureBase {
@@ -837,12 +847,13 @@ class LexWordSensesPartFeature extends EditPartFeatureBase {
837
847
  'asserted-id-tags',
838
848
  'doc-reference-types',
839
849
  'doc-reference-tags',
850
+ 'asserted-id-features',
840
851
  ];
841
852
  }
842
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: LexWordSensesPartFeature, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i2$2.MatSnackBar }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4$1.PartEditorService }], target: i0.ɵɵFactoryTarget.Component });
843
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: LexWordSensesPartFeature, isStandalone: true, selector: "cadmus-lex-word-senses-part-feature", usesInheritance: true, ngImport: i0, template: "<cadmus-current-item-bar />\r\n<cadmus-lex-word-senses-part-editor\r\n [identity]=\"identity\"\r\n [data]=\"$any(data)\"\r\n (dataChange)=\"save($event!.value!)\"\r\n (editorClose)=\"close()\"\r\n (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n", styles: [""], dependencies: [{ kind: "component", type: CurrentItemBarComponent, selector: "cadmus-current-item-bar" }, { kind: "component", type: LexWordSensesPartEditor, selector: "cadmus-lex-word-senses-part-editor" }] });
853
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: LexWordSensesPartFeature, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i2$2.MatSnackBar }, { token: i3.ItemService }, { token: i3.ThesaurusService }, { token: i4$1.PartEditorService }], target: i0.ɵɵFactoryTarget.Component });
854
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.1", type: LexWordSensesPartFeature, isStandalone: true, selector: "cadmus-lex-word-senses-part-feature", usesInheritance: true, ngImport: i0, template: "<cadmus-current-item-bar />\r\n<cadmus-lex-word-senses-part-editor\r\n [identity]=\"identity\"\r\n [data]=\"$any(data)\"\r\n (dataChange)=\"save($event!.value!)\"\r\n (editorClose)=\"close()\"\r\n (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n", styles: [""], dependencies: [{ kind: "component", type: CurrentItemBarComponent, selector: "cadmus-current-item-bar" }, { kind: "component", type: LexWordSensesPartEditor, selector: "cadmus-lex-word-senses-part-editor" }] });
844
855
  }
845
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: LexWordSensesPartFeature, decorators: [{
856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: LexWordSensesPartFeature, decorators: [{
846
857
  type: Component,
847
858
  args: [{ selector: 'cadmus-lex-word-senses-part-feature', imports: [CurrentItemBarComponent, LexWordSensesPartEditor], template: "<cadmus-current-item-bar />\r\n<cadmus-lex-word-senses-part-editor\r\n [identity]=\"identity\"\r\n [data]=\"$any(data)\"\r\n (dataChange)=\"save($event!.value!)\"\r\n (editorClose)=\"close()\"\r\n (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n" }]
848
859
  }], ctorParameters: () => [{ type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: i2$2.MatSnackBar }, { type: i3.ItemService }, { type: i3.ThesaurusService }, { type: i4$1.PartEditorService }] });
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-cadmus-part-lexicography-word-senses.mjs","sources":["../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/lex-word-senses-part.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-example-editor/word-sense-example-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-example-editor/word-sense-example-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-editor/word-sense-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-editor/word-sense-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/public-api.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/myrmidon-cadmus-part-lexicography-word-senses.ts"],"sourcesContent":["import { Part } from '@myrmidon/cadmus-core';\r\n\r\nimport { AssertedCompositeId } from '@myrmidon/cadmus-refs-asserted-ids';\r\n\r\nexport interface WordSenseExample {\r\n tags?: string[];\r\n text: string;\r\n explanation?: string;\r\n citation?: string;\r\n note?: string;\r\n}\r\n\r\nexport interface WordSense {\r\n eid?: string;\r\n tags?: string[];\r\n definition: string;\r\n note?: string;\r\n relatedIds?: AssertedCompositeId[];\r\n examples?: WordSenseExample[];\r\n}\r\n\r\n/**\r\n * The lexicography word senses part model.\r\n */\r\nexport interface LexWordSensesPart extends Part {\r\n senses: WordSense[];\r\n}\r\n\r\n/**\r\n * The type ID used to identify the LexWordSensesPart type.\r\n */\r\nexport const LEX_WORD_SENSES_PART_TYPEID = 'it.vedph.lexicography.word-senses';\r\n\r\n/**\r\n * JSON schema for the LexWordSenses part.\r\n * You can use the JSON schema tool at https://jsonschema.net/.\r\n */\r\nexport const LEX_WORD_SENSES_PART_SCHEMA = {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n $id: 'www.vedph.it/cadmus/parts/lexicography/' + LEX_WORD_SENSES_PART_TYPEID + '.json',\r\n type: 'object',\r\n title: 'LexWordSensesPart',\r\n required: [\r\n 'id',\r\n 'itemId',\r\n 'typeId',\r\n 'timeCreated',\r\n 'creatorId',\r\n 'timeModified',\r\n 'userId',\r\n 'senses',\r\n ],\r\n properties: {\r\n timeCreated: {\r\n type: 'string',\r\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n },\r\n creatorId: {\r\n type: 'string',\r\n },\r\n timeModified: {\r\n type: 'string',\r\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n },\r\n userId: {\r\n type: 'string',\r\n },\r\n id: {\r\n type: 'string',\r\n pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n },\r\n itemId: {\r\n type: 'string',\r\n pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n },\r\n typeId: {\r\n type: 'string',\r\n pattern: '^[a-z][-0-9a-z._]*$',\r\n },\r\n roleId: {\r\n type: ['string', 'null'],\r\n pattern: '^([a-z][-0-9a-z._]*)?$',\r\n },\r\n senses: {\r\n type: 'array',\r\n minItems: 1,\r\n items: {\r\n type: 'object',\r\n required: ['definition'],\r\n properties: {\r\n eid: {\r\n type: 'string',\r\n },\r\n tags: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n },\r\n definition: {\r\n type: 'string',\r\n },\r\n note: {\r\n type: 'string',\r\n },\r\n relatedIds: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n required: ['target'],\r\n properties: {\r\n // PinTarget\r\n target: {\r\n type: 'object',\r\n required: ['gid', 'label'],\r\n properties: {\r\n gid: { type: 'string' },\r\n label: { type: 'string' },\r\n itemId: { type: 'string' },\r\n partId: { type: 'string' },\r\n partTypeId: { type: 'string' },\r\n roleId: { type: 'string' },\r\n name: { type: 'string' },\r\n value: { type: 'string' },\r\n },\r\n additionalProperties: false,\r\n },\r\n tag: { type: 'string' },\r\n scope: { type: 'string' },\r\n // Assertion\r\n assertion: {\r\n type: 'object',\r\n required: ['rank'],\r\n properties: {\r\n tag: { type: 'string' },\r\n rank: { type: 'number' },\r\n note: { type: 'string' },\r\n references: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n required: ['citation'],\r\n properties: {\r\n type: { type: 'string' },\r\n tag: { type: 'string' },\r\n citation: { type: 'string' },\r\n note: { type: 'string' },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n};\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Inject,\r\n OnDestroy,\r\n Optional,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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\n\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { NgeMarkdownModule } from '@cisstech/nge/markdown';\r\n\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport { ThesEntriesPickerComponent } from '@myrmidon/cadmus-ui';\r\nimport {\r\n CadmusTextEdService,\r\n CADMUS_TEXT_ED_BINDINGS_TOKEN,\r\n CadmusTextEdBindings,\r\n} from '@myrmidon/cadmus-text-ed';\r\n\r\nimport { WordSenseExample } from '../../lex-word-senses-part';\r\n\r\n@Component({\r\n selector: 'cadmus-word-sense-example-editor',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n NgeMarkdownModule,\r\n ThesEntriesPickerComponent,\r\n ],\r\n templateUrl: './word-sense-example-editor.html',\r\n styleUrl: './word-sense-example-editor.css',\r\n})\r\nexport class WordSenseExampleEditor implements OnDestroy {\r\n // Monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _textModel?: monaco.editor.ITextModel;\r\n private _textEditor?: monaco.editor.IStandaloneCodeEditor;\r\n private _explanationModel?: monaco.editor.ITextModel;\r\n private _explanationEditor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n public readonly example = model<WordSenseExample | undefined>();\r\n public readonly cancelEdit = output();\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n public tags: FormControl<ThesaurusEntry[]>;\r\n public citation: FormControl<string | null>;\r\n public text: FormControl<string>;\r\n public explanation: FormControl<string | null>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _editService: CadmusTextEdService,\r\n @Inject(CADMUS_TEXT_ED_BINDINGS_TOKEN)\r\n @Optional()\r\n private _editorBindings?: CadmusTextEdBindings\r\n ) {\r\n // form\r\n this.tags = formBuilder.control([], { nonNullable: true });\r\n this.citation = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(500),\r\n });\r\n this.text = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(1000)],\r\n });\r\n this.explanation = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(1000),\r\n });\r\n this.note = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(1000),\r\n });\r\n\r\n this.form = formBuilder.group({\r\n tags: this.tags,\r\n citation: this.citation,\r\n text: this.text,\r\n explanation: this.explanation,\r\n note: this.note,\r\n });\r\n\r\n // when model changes, update form\r\n effect(() => {\r\n const data = this.example();\r\n this.updateForm(data);\r\n });\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._disposables.forEach((d) => d.dispose());\r\n }\r\n\r\n private async applyEdit(selector: string, editor: monaco.editor.IStandaloneCodeEditor) {\r\n if (!editor) {\r\n return;\r\n }\r\n const selection = editor.getSelection();\r\n const text = selection ? editor.getModel()!.getValueInRange(selection) : '';\r\n\r\n const result = await this._editService.edit({\r\n selector,\r\n text: text,\r\n });\r\n\r\n editor.executeEdits('my-source', [\r\n {\r\n range: selection!,\r\n text: result.text,\r\n forceMoveMarkers: true,\r\n },\r\n ]);\r\n }\r\n\r\n public onCreateTextEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._textModel =\r\n this._textModel || monaco.editor.createModel(this.text?.value || '', 'markdown');\r\n editor.setModel(this._textModel);\r\n this._textEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._textModel.onDidChangeContent((e) => {\r\n this.text.setValue(this._textModel!.getValue());\r\n this.text.markAsDirty();\r\n this.text.updateValueAndValidity();\r\n })\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._textEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._textEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public onCreateExplanationEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n enabled: false,\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._explanationModel =\r\n this._explanationModel ||\r\n monaco.editor.createModel(this.explanation?.value || '', 'markdown');\r\n editor.setModel(this._explanationModel);\r\n this._explanationEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._explanationModel.onDidChangeContent((e) => {\r\n this.explanation.setValue(this._explanationModel!.getValue());\r\n this.explanation.markAsDirty();\r\n this.explanation.updateValueAndValidity();\r\n })\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._explanationEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._explanationEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public mapIdToEntry(\r\n id: string | null,\r\n entries: ThesaurusEntry[] | undefined\r\n ): ThesaurusEntry | null {\r\n if (!id) return null;\r\n if (!entries) return { id, value: id };\r\n return entries.find((e) => e.id === id) || { id, value: id };\r\n }\r\n\r\n private mapIdToEntries(ids: string[], entries: ThesaurusEntry[] | undefined): ThesaurusEntry[] {\r\n if (!entries) return ids.map((id) => ({ id, value: id }));\r\n return ids.map((id) => entries.find((e) => e.id === id) || { id, value: id });\r\n }\r\n\r\n private updateForm(example: WordSenseExample | undefined | null): void {\r\n if (!example) {\r\n this.form.reset();\r\n } else {\r\n this.tags.setValue(this.mapIdToEntries(example.tags || [], this.tagEntries()));\r\n this.citation.setValue(example.citation || null);\r\n this._textModel?.setValue(example.text || '');\r\n this._explanationModel?.setValue(example.explanation || '');\r\n this.note.setValue(example.note || null);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n private getExample(): WordSenseExample {\r\n return {\r\n tags: this.tags.value?.length ? this.tags.value.map((e) => e.id) : undefined,\r\n citation: this.citation.value?.trim() || undefined,\r\n text: this.text.value?.trim() || '',\r\n explanation: this.explanation.value?.trim() || undefined,\r\n note: this.note.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public cancel(): void {\r\n this.cancelEdit.emit();\r\n }\r\n\r\n /**\r\n * Saves the current form data by updating the example model signal.\r\n * This method can be called manually (e.g., by a Save button) or\r\n * automatically (via auto-save).\r\n * @param pristine If true (default), the form is marked as pristine\r\n * after saving.\r\n * Set to false for auto-save if you want the form to remain dirty.\r\n */\r\n public save(pristine = true): void {\r\n if (this.form.invalid) {\r\n // show validation errors\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const example = this.getExample();\r\n this.example.set(example);\r\n\r\n if (pristine) {\r\n this.form.markAsPristine();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject, Optional, effect, input, model, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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 { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { NgeMarkdownModule } from '@cisstech/nge/markdown';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { EllipsisPipe, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\n\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport {\r\n AssertedCompositeId,\r\n AssertedCompositeIdsComponent,\r\n} from '@myrmidon/cadmus-refs-asserted-ids';\r\nimport { ThesEntriesPickerComponent } from '@myrmidon/cadmus-ui';\r\nimport {\r\n CadmusTextEdService,\r\n CADMUS_TEXT_ED_BINDINGS_TOKEN,\r\n CadmusTextEdBindings,\r\n} from '@myrmidon/cadmus-text-ed';\r\n\r\nimport { WordSense, WordSenseExample } from '../../lex-word-senses-part';\r\nimport { WordSenseExampleEditor } from '../word-sense-example-editor/word-sense-example-editor';\r\n\r\n@Component({\r\n selector: 'cadmus-word-sense-editor',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n NgeMarkdownModule,\r\n AssertedCompositeIdsComponent,\r\n ThesEntriesPickerComponent,\r\n WordSenseExampleEditor,\r\n EllipsisPipe,\r\n FlatLookupPipe\r\n ],\r\n templateUrl: './word-sense-editor.html',\r\n styleUrl: './word-sense-editor.css',\r\n})\r\nexport class WordSenseEditor {\r\n // Monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _definitionModel?: monaco.editor.ITextModel;\r\n private _definitionEditor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n public readonly sense = model<WordSense | undefined>();\r\n public readonly cancelEdit = output();\r\n\r\n public readonly editedEx = signal<WordSenseExample | undefined>(undefined);\r\n public readonly editedExIndex = signal<number>(-1);\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = input<ThesaurusEntry[] | undefined>();\r\n // asserted-id-scopes\r\n public readonly assIdScopeEntries = input<ThesaurusEntry[] | undefined>();\r\n // asserted-id-tags\r\n public readonly assIdTagEntries = input<ThesaurusEntry[] | undefined>();\r\n // assertion-tags\r\n public readonly assTagEntries = input<ThesaurusEntry[] | undefined>();\r\n // doc-reference-types\r\n public readonly refTypeEntries = input<ThesaurusEntry[] | undefined>();\r\n // doc-reference-tags\r\n public readonly refTagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n public eid: FormControl<string | null>;\r\n public tags: FormControl<ThesaurusEntry[]>;\r\n public definition: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public examples: FormControl<WordSenseExample[]>;\r\n public relatedIds: FormControl<AssertedCompositeId[]>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService,\r\n private _editService: CadmusTextEdService,\r\n @Inject(CADMUS_TEXT_ED_BINDINGS_TOKEN)\r\n @Optional()\r\n private _editorBindings?: CadmusTextEdBindings\r\n ) {\r\n // form\r\n this.eid = formBuilder.control(null, {\r\n validators: Validators.maxLength(50),\r\n });\r\n this.tags = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.definition = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.note = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.examples = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.relatedIds = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.form = formBuilder.group({\r\n eid: this.eid,\r\n tags: this.tags,\r\n definition: this.definition,\r\n note: this.note,\r\n examples: this.examples,\r\n relatedIds: this.relatedIds,\r\n });\r\n\r\n // when model changes, update form\r\n effect(() => {\r\n const data = this.sense();\r\n this.updateForm(data);\r\n });\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._disposables.forEach((d) => d.dispose());\r\n }\r\n\r\n private async applyEdit(selector: string, editor: monaco.editor.IStandaloneCodeEditor) {\r\n if (!editor) {\r\n return;\r\n }\r\n const selection = editor.getSelection();\r\n const text = selection ? editor.getModel()!.getValueInRange(selection) : '';\r\n\r\n const result = await this._editService.edit({\r\n selector,\r\n text: text,\r\n });\r\n\r\n editor.executeEdits('my-source', [\r\n {\r\n range: selection!,\r\n text: result.text,\r\n forceMoveMarkers: true,\r\n },\r\n ]);\r\n }\r\n\r\n public onCreateTextEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._definitionModel =\r\n this._definitionModel || monaco.editor.createModel(this.definition?.value || '', 'markdown');\r\n editor.setModel(this._definitionModel);\r\n this._definitionEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._definitionModel.onDidChangeContent((e) => {\r\n this.definition.setValue(this._definitionModel!.getValue());\r\n this.definition.markAsDirty();\r\n this.definition.updateValueAndValidity();\r\n })\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._definitionEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._definitionEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public mapIdToEntry(\r\n id: string | null,\r\n entries: ThesaurusEntry[] | undefined\r\n ): ThesaurusEntry | null {\r\n if (!id) return null;\r\n if (!entries) return { id, value: id };\r\n return entries.find((e) => e.id === id) || { id, value: id };\r\n }\r\n\r\n private mapIdToEntries(ids: string[], entries: ThesaurusEntry[] | undefined): ThesaurusEntry[] {\r\n if (!entries) return ids.map((id) => ({ id, value: id }));\r\n return ids.map((id) => entries.find((e) => e.id === id) || { id, value: id });\r\n }\r\n\r\n private updateForm(sense: WordSense | undefined | null): void {\r\n if (!sense) {\r\n this.form.reset();\r\n } else {\r\n this.eid.setValue(sense.eid || null);\r\n this.tags.setValue(this.mapIdToEntries(sense.tags || [], this.tagEntries()));\r\n this._definitionModel?.setValue(sense.definition || '');\r\n this.note.setValue(sense.note || null);\r\n this.examples.setValue(sense.examples || []);\r\n this.relatedIds.setValue(sense.relatedIds || []);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n public onRelatedIdsChange(ids: AssertedCompositeId[]): void {\r\n this.relatedIds.setValue(ids);\r\n this.relatedIds.markAsDirty();\r\n this.relatedIds.updateValueAndValidity();\r\n }\r\n\r\n private getSense(): WordSense {\r\n return {\r\n eid: this.eid.value || undefined,\r\n tags: this.tags.value?.length ? this.tags.value.map((e) => e.id) : undefined,\r\n definition: this.definition.value?.trim() || '',\r\n note: this.note.value?.trim() || undefined,\r\n examples: this.examples.value?.length ? this.examples.value : undefined,\r\n relatedIds: this.relatedIds.value?.length ? this.relatedIds.value : undefined,\r\n };\r\n }\r\n\r\n public addExample(): void {\r\n const entry: WordSenseExample = {\r\n text: '',\r\n };\r\n this.editedExIndex.set(-1);\r\n this.editedEx.set(entry);\r\n }\r\n\r\n public editExample(entry: WordSenseExample, index: number): void {\r\n this.editedExIndex.set(index);\r\n this.editedEx.set(structuredClone(entry));\r\n }\r\n\r\n public closeExample(): void {\r\n this.editedExIndex.set(-1);\r\n this.editedEx.set(undefined);\r\n }\r\n\r\n public saveExample(entry: WordSenseExample): void {\r\n const entries = [...this.examples.value];\r\n if (this.editedExIndex() === -1) {\r\n entries.push(entry);\r\n } else {\r\n entries.splice(this.editedExIndex(), 1, entry);\r\n }\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n this.closeExample();\r\n }\r\n\r\n public deleteExample(index: number): void {\r\n this._dialogService\r\n .confirm('Confirmation', `Delete example #${index + 1}?`)\r\n .subscribe((yes: boolean | undefined) => {\r\n if (yes) {\r\n if (this.editedExIndex() === index) {\r\n this.closeExample();\r\n }\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public moveExampleUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const entry = this.examples.value[index];\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n entries.splice(index - 1, 0, entry);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n\r\n public moveExampleDown(index: number): void {\r\n if (index + 1 >= this.examples.value.length) {\r\n return;\r\n }\r\n const entry = this.examples.value[index];\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n entries.splice(index + 1, 0, entry);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n\r\n public cancel(): void {\r\n this.cancelEdit.emit();\r\n }\r\n\r\n /**\r\n * Saves the current form data by updating the `sense` model signal.\r\n * This method can be called manually (e.g., by a Save button) or\r\n * automatically (via auto-save).\r\n * @param pristine If true (default), the form is marked as pristine\r\n * after saving.\r\n * Set to false for auto-save if you want the form to remain dirty.\r\n */\r\n public save(pristine = true): void {\r\n if (this.form.invalid) {\r\n // show validation errors\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const sense = this.getSense();\r\n this.sense.set(sense);\r\n\r\n if (pristine) {\r\n this.form.markAsPristine();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thes-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n","import { Component, OnInit, signal } from '@angular/core';\r\nimport {\r\n FormControl,\r\n FormBuilder,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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\n\r\nimport { deepCopy, EllipsisPipe, FlatLookupPipe, NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { AuthJwtService } from '@myrmidon/auth-jwt-login';\r\nimport { CloseSaveButtonsComponent, ModelEditorComponentBase } from '@myrmidon/cadmus-ui';\r\nimport { EditedObject, ThesauriSet, ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\nimport {\r\n LEX_WORD_SENSES_PART_TYPEID,\r\n LexWordSensesPart,\r\n WordSense,\r\n} from '../../lex-word-senses-part';\r\nimport { WordSenseEditor } from '../word-sense-editor/word-sense-editor';\r\n\r\n/**\r\n * Word senses part editor component.\r\n * Thesauri: lex-word-sense-tags, asserted-id-scopes, asserted-id-tags,\r\n * doc-reference-types, doc-reference-tags.\r\n */\r\n@Component({\r\n selector: 'cadmus-lex-word-senses-part-editor',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n // cadmus\r\n CloseSaveButtonsComponent,\r\n WordSenseEditor,\r\n FlatLookupPipe,\r\n EllipsisPipe,\r\n ],\r\n templateUrl: './lex-word-senses-part-editor.html',\r\n styleUrl: './lex-word-senses-part-editor.css',\r\n})\r\nexport class LexWordSensesPartEditor\r\n extends ModelEditorComponentBase<LexWordSensesPart>\r\n implements OnInit\r\n{\r\n public readonly editedIndex = signal<number>(-1);\r\n public readonly edited = signal<WordSense | undefined>(undefined);\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n\r\n public entries: FormControl<WordSense[]>;\r\n\r\n constructor(\r\n authService: AuthJwtService,\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService\r\n ) {\r\n super(authService, formBuilder);\r\n // form\r\n this.entries = formBuilder.control([], {\r\n // at least 1 entry\r\n validators: NgxToolsValidators.strictMinLengthValidator(1),\r\n nonNullable: true,\r\n });\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n protected buildForm(formBuilder: FormBuilder): FormGroup | UntypedFormGroup {\r\n return formBuilder.group({\r\n entries: this.entries,\r\n });\r\n }\r\n\r\n private updateThesauri(thesauri: ThesauriSet): void {\r\n const key = 'lex-word-sense-tags';\r\n if (this.hasThesaurus(key)) {\r\n this.tagEntries.set(thesauri[key].entries);\r\n } else {\r\n this.tagEntries.set(undefined);\r\n }\r\n }\r\n\r\n private updateForm(part?: LexWordSensesPart | null): void {\r\n if (!part) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.entries.setValue(part.senses || []);\r\n this.form.markAsPristine();\r\n }\r\n\r\n protected override onDataSet(data?: EditedObject<LexWordSensesPart>): void {\r\n // thesauri\r\n if (data?.thesauri) {\r\n this.updateThesauri(data.thesauri);\r\n }\r\n\r\n // form\r\n this.updateForm(data?.value);\r\n }\r\n\r\n protected getValue(): LexWordSensesPart {\r\n let part = this.getEditedPart(LEX_WORD_SENSES_PART_TYPEID) as LexWordSensesPart;\r\n part.senses = this.entries.value || [];\r\n return part;\r\n }\r\n\r\n public addSense(): void {\r\n const entry: WordSense = {\r\n definition: '',\r\n };\r\n this.editSense(entry, -1);\r\n }\r\n\r\n public editSense(entry: WordSense, index: number): void {\r\n this.editedIndex.set(index);\r\n this.edited.set(deepCopy(entry));\r\n }\r\n\r\n public closeSense(): void {\r\n this.editedIndex.set(-1);\r\n this.edited.set(undefined);\r\n }\r\n\r\n public saveSense(entry: WordSense): void {\r\n const entries = [...this.entries.value];\r\n if (this.editedIndex() === -1) {\r\n entries.push(entry);\r\n } else {\r\n entries.splice(this.editedIndex(), 1, entry);\r\n }\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n this.closeSense();\r\n }\r\n\r\n public deleteSense(index: number): void {\r\n this._dialogService\r\n .confirm('Confirmation', 'Delete sense?')\r\n .subscribe((yes: boolean | undefined) => {\r\n if (yes) {\r\n if (this.editedIndex() === index) {\r\n this.closeSense();\r\n }\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public moveSenseUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const entry = this.entries.value[index];\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n entries.splice(index - 1, 0, entry);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n\r\n public moveSenseDown(index: number): void {\r\n if (index + 1 >= this.entries.value.length) {\r\n return;\r\n }\r\n const entry = this.entries.value[index];\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n entries.splice(index + 1, 0, entry);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\nimport { ItemService, ThesaurusService } from '@myrmidon/cadmus-api';\r\nimport { EditPartFeatureBase, PartEditorService } from '@myrmidon/cadmus-state';\r\nimport { CurrentItemBarComponent } from '@myrmidon/cadmus-ui-pg';\r\n\r\nimport { LexWordSensesPartEditor } from '../lex-word-senses-part-editor/lex-word-senses-part-editor';\r\n\r\n@Component({\r\n selector: 'cadmus-lex-word-senses-part-feature',\r\n imports: [CurrentItemBarComponent, LexWordSensesPartEditor],\r\n templateUrl: './lex-word-senses-part-feature.html',\r\n styleUrl: './lex-word-senses-part-feature.css',\r\n})\r\nexport class LexWordSensesPartFeature extends EditPartFeatureBase implements OnInit {\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n snackbar: MatSnackBar,\r\n itemService: ItemService,\r\n thesaurusService: ThesaurusService,\r\n editorService: PartEditorService\r\n ) {\r\n super(router, route, snackbar, itemService, thesaurusService, editorService);\r\n }\r\n\r\n protected override getReqThesauriIds(): string[] {\r\n return [\r\n 'lex-word-sense-tags',\r\n 'lex-word-sense-tags',\r\n 'asserted-id-scopes',\r\n 'asserted-id-tags',\r\n 'doc-reference-types',\r\n 'doc-reference-tags',\r\n ];\r\n }\r\n}\r\n","<cadmus-current-item-bar />\r\n<cadmus-lex-word-senses-part-editor\r\n [identity]=\"identity\"\r\n [data]=\"$any(data)\"\r\n (dataChange)=\"save($event!.value!)\"\r\n (editorClose)=\"close()\"\r\n (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n","/*\r\n * Public API Surface of cadmus-part-lexicography-word-senses\r\n */\r\n\r\nexport * from './lib/lex-word-senses-part';\r\nexport * from './lib/components/word-sense-example-editor/word-sense-example-editor';\r\nexport * from './lib/components/word-sense-editor/word-sense-editor';\r\nexport * from './lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor';\r\nexport * from './lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i4","i5","i6","i7","i8","i9","i10","i11","i12","i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-cadmus-part-lexicography-word-senses.mjs","sources":["../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/lex-word-senses-part.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-example-editor/word-sense-example-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-example-editor/word-sense-example-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-editor/word-sense-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/word-sense-editor/word-sense-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/public-api.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-senses/src/myrmidon-cadmus-part-lexicography-word-senses.ts"],"sourcesContent":["import { Part } from '@myrmidon/cadmus-core';\r\n\r\nimport { AssertedCompositeId } from '@myrmidon/cadmus-refs-asserted-ids';\r\n\r\nexport interface WordSenseExample {\r\n tags?: string[];\r\n text: string;\r\n explanation?: string;\r\n citation?: string;\r\n note?: string;\r\n}\r\n\r\nexport interface WordSense {\r\n eid?: string;\r\n tags?: string[];\r\n definition: string;\r\n note?: string;\r\n relatedIds?: AssertedCompositeId[];\r\n examples?: WordSenseExample[];\r\n}\r\n\r\n/**\r\n * The lexicography word senses part model.\r\n */\r\nexport interface LexWordSensesPart extends Part {\r\n senses: WordSense[];\r\n}\r\n\r\n/**\r\n * The type ID used to identify the LexWordSensesPart type.\r\n */\r\nexport const LEX_WORD_SENSES_PART_TYPEID = 'it.vedph.lexicography.word-senses';\r\n\r\n/**\r\n * JSON schema for the LexWordSenses part.\r\n * You can use the JSON schema tool at https://jsonschema.net/.\r\n */\r\nexport const LEX_WORD_SENSES_PART_SCHEMA = {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n $id: 'www.vedph.it/cadmus/parts/lexicography/' + LEX_WORD_SENSES_PART_TYPEID + '.json',\r\n type: 'object',\r\n title: 'LexWordSensesPart',\r\n required: [\r\n 'id',\r\n 'itemId',\r\n 'typeId',\r\n 'timeCreated',\r\n 'creatorId',\r\n 'timeModified',\r\n 'userId',\r\n 'senses',\r\n ],\r\n properties: {\r\n timeCreated: {\r\n type: 'string',\r\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n },\r\n creatorId: {\r\n type: 'string',\r\n },\r\n timeModified: {\r\n type: 'string',\r\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n },\r\n userId: {\r\n type: 'string',\r\n },\r\n id: {\r\n type: 'string',\r\n pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n },\r\n itemId: {\r\n type: 'string',\r\n pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n },\r\n typeId: {\r\n type: 'string',\r\n pattern: '^[a-z][-0-9a-z._]*$',\r\n },\r\n roleId: {\r\n type: ['string', 'null'],\r\n pattern: '^([a-z][-0-9a-z._]*)?$',\r\n },\r\n senses: {\r\n type: 'array',\r\n minItems: 1,\r\n items: {\r\n type: 'object',\r\n required: ['definition'],\r\n properties: {\r\n eid: {\r\n type: 'string',\r\n },\r\n tags: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n },\r\n definition: {\r\n type: 'string',\r\n },\r\n note: {\r\n type: 'string',\r\n },\r\n relatedIds: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n required: ['target'],\r\n properties: {\r\n // PinTarget\r\n target: {\r\n type: 'object',\r\n required: ['gid', 'label'],\r\n properties: {\r\n gid: { type: 'string' },\r\n label: { type: 'string' },\r\n itemId: { type: 'string' },\r\n partId: { type: 'string' },\r\n partTypeId: { type: 'string' },\r\n roleId: { type: 'string' },\r\n name: { type: 'string' },\r\n value: { type: 'string' },\r\n },\r\n additionalProperties: false,\r\n },\r\n tag: { type: 'string' },\r\n scope: { type: 'string' },\r\n // Assertion\r\n assertion: {\r\n type: 'object',\r\n required: ['rank'],\r\n properties: {\r\n tag: { type: 'string' },\r\n rank: { type: 'number' },\r\n note: { type: 'string' },\r\n references: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n required: ['citation'],\r\n properties: {\r\n type: { type: 'string' },\r\n tag: { type: 'string' },\r\n citation: { type: 'string' },\r\n note: { type: 'string' },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n};\r\n","import {\r\n Component,\r\n Inject,\r\n OnDestroy,\r\n Optional,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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\n\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { NgeMarkdownModule } from '@cisstech/nge/markdown';\r\n\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport { ThesaurusEntriesPickerComponent } from '@myrmidon/cadmus-thesaurus-store';\r\nimport {\r\n CadmusTextEdService,\r\n CADMUS_TEXT_ED_BINDINGS_TOKEN,\r\n CadmusTextEdBindings,\r\n} from '@myrmidon/cadmus-text-ed';\r\n\r\nimport { WordSenseExample } from '../../lex-word-senses-part';\r\n\r\n@Component({\r\n selector: 'cadmus-word-sense-example-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n NgeMarkdownModule,\r\n ThesaurusEntriesPickerComponent,\r\n ],\r\n templateUrl: './word-sense-example-editor.html',\r\n styleUrl: './word-sense-example-editor.css',\r\n})\r\nexport class WordSenseExampleEditor implements OnDestroy {\r\n // Monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _textModel?: monaco.editor.ITextModel;\r\n private _textEditor?: monaco.editor.IStandaloneCodeEditor;\r\n private _explanationModel?: monaco.editor.ITextModel;\r\n private _explanationEditor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n public readonly example = model<WordSenseExample | undefined>();\r\n public readonly cancelEdit = output();\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n public tags: FormControl<ThesaurusEntry[]>;\r\n public citation: FormControl<string | null>;\r\n public text: FormControl<string>;\r\n public explanation: FormControl<string | null>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _editService: CadmusTextEdService,\r\n @Inject(CADMUS_TEXT_ED_BINDINGS_TOKEN)\r\n @Optional()\r\n private _editorBindings?: CadmusTextEdBindings\r\n ) {\r\n // form\r\n this.tags = formBuilder.control([], { nonNullable: true });\r\n this.citation = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(500),\r\n });\r\n this.text = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(1000)],\r\n });\r\n this.explanation = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(1000),\r\n });\r\n this.note = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: Validators.maxLength(1000),\r\n });\r\n\r\n this.form = formBuilder.group({\r\n tags: this.tags,\r\n citation: this.citation,\r\n text: this.text,\r\n explanation: this.explanation,\r\n note: this.note,\r\n });\r\n\r\n // when model changes, update form\r\n effect(() => {\r\n const data = this.example();\r\n this.updateForm(data);\r\n });\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._disposables.forEach((d) => d.dispose());\r\n }\r\n\r\n private async applyEdit(selector: string, editor: monaco.editor.IStandaloneCodeEditor) {\r\n if (!editor) {\r\n return;\r\n }\r\n const selection = editor.getSelection();\r\n const text = selection ? editor.getModel()!.getValueInRange(selection) : '';\r\n\r\n const result = await this._editService.edit({\r\n selector,\r\n text: text,\r\n });\r\n\r\n editor.executeEdits('my-source', [\r\n {\r\n range: selection!,\r\n text: result.text,\r\n forceMoveMarkers: true,\r\n },\r\n ]);\r\n }\r\n\r\n public onCreateTextEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._textModel =\r\n this._textModel || monaco.editor.createModel(this.text?.value || '', 'markdown');\r\n editor.setModel(this._textModel);\r\n this._textEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._textModel.onDidChangeContent((e) => {\r\n this.text.setValue(this._textModel!.getValue());\r\n this.text.markAsDirty();\r\n this.text.updateValueAndValidity();\r\n })\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._textEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._textEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public onCreateExplanationEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n enabled: false,\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._explanationModel =\r\n this._explanationModel ||\r\n monaco.editor.createModel(this.explanation?.value || '', 'markdown');\r\n editor.setModel(this._explanationModel);\r\n this._explanationEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._explanationModel.onDidChangeContent((e) => {\r\n this.explanation.setValue(this._explanationModel!.getValue());\r\n this.explanation.markAsDirty();\r\n this.explanation.updateValueAndValidity();\r\n })\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._explanationEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._explanationEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public mapIdToEntry(\r\n id: string | null,\r\n entries: ThesaurusEntry[] | undefined\r\n ): ThesaurusEntry | null {\r\n if (!id) return null;\r\n if (!entries) return { id, value: id };\r\n return entries.find((e) => e.id === id) || { id, value: id };\r\n }\r\n\r\n private mapIdToEntries(ids: string[], entries: ThesaurusEntry[] | undefined): ThesaurusEntry[] {\r\n if (!entries) return ids.map((id) => ({ id, value: id }));\r\n return ids.map((id) => entries.find((e) => e.id === id) || { id, value: id });\r\n }\r\n\r\n private updateForm(example: WordSenseExample | undefined | null): void {\r\n if (!example) {\r\n this.form.reset();\r\n } else {\r\n this.tags.setValue(this.mapIdToEntries(example.tags || [], this.tagEntries()));\r\n this.citation.setValue(example.citation || null);\r\n this._textModel?.setValue(example.text || '');\r\n this._explanationModel?.setValue(example.explanation || '');\r\n this.note.setValue(example.note || null);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n private getExample(): WordSenseExample {\r\n return {\r\n tags: this.tags.value?.length ? this.tags.value.map((e) => e.id) : undefined,\r\n citation: this.citation.value?.trim() || undefined,\r\n text: this.text.value?.trim() || '',\r\n explanation: this.explanation.value?.trim() || undefined,\r\n note: this.note.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public cancel(): void {\r\n this.cancelEdit.emit();\r\n }\r\n\r\n /**\r\n * Saves the current form data by updating the example model signal.\r\n * This method can be called manually (e.g., by a Save button) or\r\n * automatically (via auto-save).\r\n * @param pristine If true (default), the form is marked as pristine\r\n * after saving.\r\n * Set to false for auto-save if you want the form to remain dirty.\r\n */\r\n public save(pristine = true): void {\r\n if (this.form.invalid) {\r\n // show validation errors\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const example = this.getExample();\r\n this.example.set(example);\r\n\r\n if (pristine) {\r\n this.form.markAsPristine();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- citation -->\r\n <mat-form-field>\r\n <mat-label>citation</mat-label>\r\n <input matInput [formControl]=\"citation\" />\r\n @if ($any(citation).errors?.maxLength && (citation.dirty || citation.touched)) {\r\n <mat-error>citation too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- text-->\r\n <div id=\"txt-container\" class=\"mt\">\r\n <div id=\"txt\">\r\n <nge-monaco-editor id=\"txt-editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (text.hasError('required') && (text.touched || text.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (text.hasError('maxLength') && (text.touched || text.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"txt-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"text.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- explanation -->\r\n <div id=\"exp-container\" class=\"mt\">\r\n <div id=\"exp\">\r\n <nge-monaco-editor id=\"exp-editor\" (ready)=\"onCreateExplanationEditor($event)\" />\r\n @if ($any(explanation).errors?.maxLength && (explanation.dirty || explanation.touched)) {\r\n <mat-error>explanation too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"exp-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"explanation.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, Inject, Optional, effect, input, model, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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 { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { NgeMarkdownModule } from '@cisstech/nge/markdown';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { EllipsisPipe, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\n\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport {\r\n AssertedCompositeId,\r\n AssertedCompositeIdsComponent,\r\n} from '@myrmidon/cadmus-refs-asserted-ids';\r\nimport { ThesaurusEntriesPickerComponent } from '@myrmidon/cadmus-thesaurus-store';\r\nimport {\r\n CadmusTextEdService,\r\n CADMUS_TEXT_ED_BINDINGS_TOKEN,\r\n CadmusTextEdBindings,\r\n} from '@myrmidon/cadmus-text-ed';\r\n\r\nimport { WordSense, WordSenseExample } from '../../lex-word-senses-part';\r\nimport { WordSenseExampleEditor } from '../word-sense-example-editor/word-sense-example-editor';\r\n\r\n@Component({\r\n selector: 'cadmus-word-sense-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n NgeMarkdownModule,\r\n AssertedCompositeIdsComponent,\r\n ThesaurusEntriesPickerComponent,\r\n WordSenseExampleEditor,\r\n EllipsisPipe,\r\n FlatLookupPipe,\r\n ],\r\n templateUrl: './word-sense-editor.html',\r\n styleUrl: './word-sense-editor.css',\r\n})\r\nexport class WordSenseEditor {\r\n // Monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _definitionModel?: monaco.editor.ITextModel;\r\n private _definitionEditor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n public readonly sense = model<WordSense | undefined>();\r\n public readonly cancelEdit = output();\r\n\r\n public readonly editedEx = signal<WordSenseExample | undefined>(undefined);\r\n public readonly editedExIndex = signal<number>(-1);\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = input<ThesaurusEntry[] | undefined>();\r\n // asserted-id-scopes\r\n public readonly assIdScopeEntries = input<ThesaurusEntry[] | undefined>();\r\n // asserted-id-tags\r\n public readonly assIdTagEntries = input<ThesaurusEntry[] | undefined>();\r\n // assertion-tags\r\n public readonly assTagEntries = input<ThesaurusEntry[] | undefined>();\r\n // doc-reference-types\r\n public readonly refTypeEntries = input<ThesaurusEntry[] | undefined>();\r\n // doc-reference-tags\r\n public readonly refTagEntries = input<ThesaurusEntry[] | undefined>();\r\n // asserted-id-features\r\n public readonly idFeatureEntries = input<ThesaurusEntry[]>();\r\n\r\n public eid: FormControl<string | null>;\r\n public tags: FormControl<ThesaurusEntry[]>;\r\n public definition: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public examples: FormControl<WordSenseExample[]>;\r\n public relatedIds: FormControl<AssertedCompositeId[]>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService,\r\n private _editService: CadmusTextEdService,\r\n @Inject(CADMUS_TEXT_ED_BINDINGS_TOKEN)\r\n @Optional()\r\n private _editorBindings?: CadmusTextEdBindings,\r\n ) {\r\n // form\r\n this.eid = formBuilder.control(null, {\r\n validators: Validators.maxLength(50),\r\n });\r\n this.tags = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.definition = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.note = formBuilder.control(null, {\r\n nonNullable: true,\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.examples = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.relatedIds = formBuilder.control([], {\r\n nonNullable: true,\r\n });\r\n this.form = formBuilder.group({\r\n eid: this.eid,\r\n tags: this.tags,\r\n definition: this.definition,\r\n note: this.note,\r\n examples: this.examples,\r\n relatedIds: this.relatedIds,\r\n });\r\n\r\n // when model changes, update form\r\n effect(() => {\r\n const data = this.sense();\r\n this.updateForm(data);\r\n });\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._disposables.forEach((d) => d.dispose());\r\n }\r\n\r\n private async applyEdit(selector: string, editor: monaco.editor.IStandaloneCodeEditor) {\r\n if (!editor) {\r\n return;\r\n }\r\n const selection = editor.getSelection();\r\n const text = selection ? editor.getModel()!.getValueInRange(selection) : '';\r\n\r\n const result = await this._editService.edit({\r\n selector,\r\n text: text,\r\n });\r\n\r\n editor.executeEdits('my-source', [\r\n {\r\n range: selection!,\r\n text: result.text,\r\n forceMoveMarkers: true,\r\n },\r\n ]);\r\n }\r\n\r\n public onCreateTextEditor(editor: monaco.editor.IEditor) {\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._definitionModel =\r\n this._definitionModel || monaco.editor.createModel(this.definition?.value || '', 'markdown');\r\n editor.setModel(this._definitionModel);\r\n this._definitionEditor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._definitionModel.onDidChangeContent((e) => {\r\n this.definition.setValue(this._definitionModel!.getValue());\r\n this.definition.markAsDirty();\r\n this.definition.updateValueAndValidity();\r\n }),\r\n );\r\n\r\n // plugins\r\n if (this._editorBindings) {\r\n Object.keys(this._editorBindings).forEach((key) => {\r\n const n = parseInt(key, 10);\r\n console.log('Binding ' + n + ' to ' + this._editorBindings![key as any]);\r\n this._definitionEditor!.addCommand(n, () => {\r\n this.applyEdit(this._editorBindings![key as any], this._definitionEditor!);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public mapIdToEntry(\r\n id: string | null,\r\n entries: ThesaurusEntry[] | undefined,\r\n ): ThesaurusEntry | null {\r\n if (!id) return null;\r\n if (!entries) return { id, value: id };\r\n return entries.find((e) => e.id === id) || { id, value: id };\r\n }\r\n\r\n private mapIdToEntries(ids: string[], entries: ThesaurusEntry[] | undefined): ThesaurusEntry[] {\r\n if (!entries) return ids.map((id) => ({ id, value: id }));\r\n return ids.map((id) => entries.find((e) => e.id === id) || { id, value: id });\r\n }\r\n\r\n private updateForm(sense: WordSense | undefined | null): void {\r\n if (!sense) {\r\n this.form.reset();\r\n } else {\r\n this.eid.setValue(sense.eid || null);\r\n this.tags.setValue(this.mapIdToEntries(sense.tags || [], this.tagEntries()));\r\n this._definitionModel?.setValue(sense.definition || '');\r\n this.note.setValue(sense.note || null);\r\n this.examples.setValue(sense.examples || []);\r\n this.relatedIds.setValue(sense.relatedIds || []);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n public onRelatedIdsChange(ids: AssertedCompositeId[]): void {\r\n this.relatedIds.setValue(ids);\r\n this.relatedIds.markAsDirty();\r\n this.relatedIds.updateValueAndValidity();\r\n }\r\n\r\n private getSense(): WordSense {\r\n return {\r\n eid: this.eid.value || undefined,\r\n tags: this.tags.value?.length ? this.tags.value.map((e) => e.id) : undefined,\r\n definition: this.definition.value?.trim() || '',\r\n note: this.note.value?.trim() || undefined,\r\n examples: this.examples.value?.length ? this.examples.value : undefined,\r\n relatedIds: this.relatedIds.value?.length ? this.relatedIds.value : undefined,\r\n };\r\n }\r\n\r\n public addExample(): void {\r\n const entry: WordSenseExample = {\r\n text: '',\r\n };\r\n this.editedExIndex.set(-1);\r\n this.editedEx.set(entry);\r\n }\r\n\r\n public editExample(entry: WordSenseExample, index: number): void {\r\n this.editedExIndex.set(index);\r\n this.editedEx.set(structuredClone(entry));\r\n }\r\n\r\n public closeExample(): void {\r\n this.editedExIndex.set(-1);\r\n this.editedEx.set(undefined);\r\n }\r\n\r\n public saveExample(entry: WordSenseExample): void {\r\n const entries = [...this.examples.value];\r\n if (this.editedExIndex() === -1) {\r\n entries.push(entry);\r\n } else {\r\n entries.splice(this.editedExIndex(), 1, entry);\r\n }\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n this.closeExample();\r\n }\r\n\r\n public deleteExample(index: number): void {\r\n this._dialogService\r\n .confirm('Confirmation', `Delete example #${index + 1}?`)\r\n .subscribe((yes: boolean | undefined) => {\r\n if (yes) {\r\n if (this.editedExIndex() === index) {\r\n this.closeExample();\r\n }\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public moveExampleUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const entry = this.examples.value[index];\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n entries.splice(index - 1, 0, entry);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n\r\n public moveExampleDown(index: number): void {\r\n if (index + 1 >= this.examples.value.length) {\r\n return;\r\n }\r\n const entry = this.examples.value[index];\r\n const entries = [...this.examples.value];\r\n entries.splice(index, 1);\r\n entries.splice(index + 1, 0, entry);\r\n this.examples.setValue(entries);\r\n this.examples.markAsDirty();\r\n this.examples.updateValueAndValidity();\r\n }\r\n\r\n public cancel(): void {\r\n this.cancelEdit.emit();\r\n }\r\n\r\n /**\r\n * Saves the current form data by updating the `sense` model signal.\r\n * This method can be called manually (e.g., by a Save button) or\r\n * automatically (via auto-save).\r\n * @param pristine If true (default), the form is marked as pristine\r\n * after saving.\r\n * Set to false for auto-save if you want the form to remain dirty.\r\n */\r\n public save(pristine = true): void {\r\n if (this.form.invalid) {\r\n // show validation errors\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const sense = this.getSense();\r\n this.sense.set(sense);\r\n\r\n if (pristine) {\r\n this.form.markAsPristine();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- DEFINITION -->\r\n <mat-tab label=\"definition\">\r\n <!-- eid -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label>EID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n @if ($any(eid).errors?.maxLength && (eid.dirty || eid.touched)) {\r\n <mat-error>EID too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- tags -->\r\n @if (tagEntries()?.length) {\r\n <div>\r\n <cadmus-thesaurus-entries-picker\r\n [availableEntries]=\"tagEntries()!\"\r\n [entries]=\"tags.value\"\r\n [hierarchicLabels]=\"true\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- definition -->\r\n <div id=\"def-container\">\r\n <div id=\"def\">\r\n <nge-monaco-editor id=\"editor\" (ready)=\"onCreateTextEditor($event)\" />\r\n @if (definition.hasError('required') && (definition.touched || definition.dirty)) {\r\n <mat-error>text required</mat-error>\r\n } @if (definition.hasError('maxLength') && (definition.touched || definition.dirty)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </div>\r\n <!-- preview -->\r\n <div id=\"def-preview\">\r\n <mat-expansion-panel expanded=\"true\">\r\n <div>\r\n <nge-markdown [data]=\"definition.value || undefined\" />\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- note -->\r\n <div class=\"mt\">\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput rows=\"3\" [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- EXAMPLES -->\r\n <mat-tab label=\"examples\">\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n <mat-icon>add_circle</mat-icon> example\r\n </button>\r\n </div>\r\n @if (examples.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tags</th>\r\n <th>text</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"i === editedExIndex()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this example\"\r\n (click)=\"editExample(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveExampleUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this example down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveExampleDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this example\"\r\n (click)=\"deleteExample(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.text | ellipsis }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (editedEx()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"editedEx()\" [disabled]=\"!editedEx()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Example #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-example-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [example]=\"editedEx()\"\r\n (exampleChange)=\"saveExample($event!)\"\r\n (cancelEdit)=\"closeExample()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-tab>\r\n\r\n <!-- RELATED IDS -->\r\n <mat-tab label=\"related\">\r\n <cadmus-refs-asserted-composite-ids\r\n [idScopeEntries]=\"assIdScopeEntries()\"\r\n [idTagEntries]=\"assIdTagEntries()\"\r\n [assTagEntries]=\"assTagEntries()\"\r\n [refTypeEntries]=\"refTypeEntries()\"\r\n [refTagEntries]=\"refTagEntries()\"\r\n [featureEntries]=\"idFeatureEntries()\"\r\n [ids]=\"relatedIds.value\"\r\n (idsChange)=\"onRelatedIdsChange($event)\"\r\n />\r\n </mat-tab>\r\n\r\n <!-- buttons -->\r\n <div>\r\n <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n </mat-tab-group>\r\n</form>\r\n","import { Component, OnInit, signal } from '@angular/core';\r\nimport {\r\n FormControl,\r\n FormBuilder,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\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\n\r\nimport { deepCopy, EllipsisPipe, FlatLookupPipe, NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { AuthJwtService } from '@myrmidon/auth-jwt-login';\r\nimport { CloseSaveButtonsComponent, ModelEditorComponentBase } from '@myrmidon/cadmus-ui';\r\nimport { EditedObject, ThesauriSet, ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\nimport {\r\n LEX_WORD_SENSES_PART_TYPEID,\r\n LexWordSensesPart,\r\n WordSense,\r\n} from '../../lex-word-senses-part';\r\nimport { WordSenseEditor } from '../word-sense-editor/word-sense-editor';\r\n\r\n/**\r\n * Word senses part editor component.\r\n * Thesauri: lex-word-sense-tags, asserted-id-scopes, asserted-id-tags,\r\n * doc-reference-types, doc-reference-tags, asserted-id-features.\r\n */\r\n@Component({\r\n selector: 'cadmus-lex-word-senses-part-editor',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCardModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n // cadmus\r\n CloseSaveButtonsComponent,\r\n WordSenseEditor,\r\n FlatLookupPipe,\r\n EllipsisPipe,\r\n ],\r\n templateUrl: './lex-word-senses-part-editor.html',\r\n styleUrl: './lex-word-senses-part-editor.css',\r\n})\r\nexport class LexWordSensesPartEditor\r\n extends ModelEditorComponentBase<LexWordSensesPart>\r\n implements OnInit\r\n{\r\n public readonly editedIndex = signal<number>(-1);\r\n public readonly edited = signal<WordSense | undefined>(undefined);\r\n\r\n // lex-word-sense-tags\r\n public readonly tagEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n // asserted-id-features\r\n public readonly idFeatureEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n\r\n public entries: FormControl<WordSense[]>;\r\n\r\n constructor(\r\n authService: AuthJwtService,\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService,\r\n ) {\r\n super(authService, formBuilder);\r\n // form\r\n this.entries = formBuilder.control([], {\r\n // at least 1 entry\r\n validators: NgxToolsValidators.strictMinLengthValidator(1),\r\n nonNullable: true,\r\n });\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n protected buildForm(formBuilder: FormBuilder): FormGroup | UntypedFormGroup {\r\n return formBuilder.group({\r\n entries: this.entries,\r\n });\r\n }\r\n\r\n private updateThesauri(thesauri: ThesauriSet): void {\r\n let key = 'lex-word-sense-tags';\r\n if (this.hasThesaurus(key)) {\r\n this.tagEntries.set(thesauri[key].entries);\r\n } else {\r\n this.tagEntries.set(undefined);\r\n }\r\n key = 'asserted-id-features';\r\n if (this.hasThesaurus(key)) {\r\n this.idFeatureEntries.set(thesauri[key].entries);\r\n } else {\r\n this.idFeatureEntries.set(undefined);\r\n }\r\n }\r\n\r\n private updateForm(part?: LexWordSensesPart | null): void {\r\n if (!part) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.entries.setValue(part.senses || []);\r\n this.form.markAsPristine();\r\n }\r\n\r\n protected override onDataSet(data?: EditedObject<LexWordSensesPart>): void {\r\n // thesauri\r\n if (data?.thesauri) {\r\n this.updateThesauri(data.thesauri);\r\n }\r\n\r\n // form\r\n this.updateForm(data?.value);\r\n }\r\n\r\n protected getValue(): LexWordSensesPart {\r\n let part = this.getEditedPart(LEX_WORD_SENSES_PART_TYPEID) as LexWordSensesPart;\r\n part.senses = this.entries.value || [];\r\n return part;\r\n }\r\n\r\n public addSense(): void {\r\n const entry: WordSense = {\r\n definition: '',\r\n };\r\n this.editSense(entry, -1);\r\n }\r\n\r\n public editSense(entry: WordSense, index: number): void {\r\n this.editedIndex.set(index);\r\n this.edited.set(deepCopy(entry));\r\n }\r\n\r\n public closeSense(): void {\r\n this.editedIndex.set(-1);\r\n this.edited.set(undefined);\r\n }\r\n\r\n public saveSense(entry: WordSense): void {\r\n const entries = [...this.entries.value];\r\n if (this.editedIndex() === -1) {\r\n entries.push(entry);\r\n } else {\r\n entries.splice(this.editedIndex(), 1, entry);\r\n }\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n this.closeSense();\r\n }\r\n\r\n public deleteSense(index: number): void {\r\n this._dialogService\r\n .confirm('Confirmation', 'Delete sense?')\r\n .subscribe((yes: boolean | undefined) => {\r\n if (yes) {\r\n if (this.editedIndex() === index) {\r\n this.closeSense();\r\n }\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public moveSenseUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const entry = this.entries.value[index];\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n entries.splice(index - 1, 0, entry);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n\r\n public moveSenseDown(index: number): void {\r\n if (index + 1 >= this.entries.value.length) {\r\n return;\r\n }\r\n const entry = this.entries.value[index];\r\n const entries = [...this.entries.value];\r\n entries.splice(index, 1);\r\n entries.splice(index + 1, 0, entry);\r\n this.entries.setValue(entries);\r\n this.entries.markAsDirty();\r\n this.entries.updateValueAndValidity();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-card>\r\n <mat-card-header>\r\n <div mat-card-avatar>\r\n <mat-icon>picture_in_picture</mat-icon>\r\n </div>\r\n <mat-card-title>\r\n {{ (modelName() | titlecase) || 'Word Senses Part' }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div>\r\n <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addSense()\">\r\n <mat-icon>add_circle</mat-icon> sense\r\n </button>\r\n </div>\r\n @if (entries.value.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>EID</th>\r\n <th>tags</th>\r\n <th>definition</th>\r\n <th>examples</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (entry of entries.value; track entry; let i = $index; let first = $first; let last =\r\n $last) {\r\n <tr [class.selected]=\"entry === edited()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Edit this Sense\"\r\n (click)=\"editSense(entry, i)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveSenseUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this Sense down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveSenseDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Delete this Sense\"\r\n (click)=\"deleteSense(i)\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ entry.eid }}</td>\r\n <td>\r\n @for (tag of entry.tags; track tag; let last = $last) {\r\n {{ tag | flatLookup : tagEntries() : 'id' : 'value' }}\r\n @if (!last) {\r\n <span>, </span>\r\n } }\r\n </td>\r\n <td>{{ entry.definition | ellipsis }}</td>\r\n <td>{{ entry.examples?.length || 0 }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @if (edited()) {\r\n <fieldset>\r\n <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>Sense #</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-word-sense-editor\r\n [tagEntries]=\"tagEntries()\"\r\n [idFeatureEntries]=\"idFeatureEntries()\"\r\n [sense]=\"edited()\"\r\n (senseChange)=\"saveSense($event!)\"\r\n (cancelEdit)=\"closeSense()\"\r\n />\r\n </mat-expansion-panel>\r\n </fieldset>\r\n }\r\n </mat-card-content>\r\n <mat-card-actions>\r\n <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n </mat-card-actions>\r\n </mat-card>\r\n</form>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\nimport { ItemService, ThesaurusService } from '@myrmidon/cadmus-api';\r\nimport { EditPartFeatureBase, PartEditorService } from '@myrmidon/cadmus-state';\r\nimport { CurrentItemBarComponent } from '@myrmidon/cadmus-ui-pg';\r\n\r\nimport { LexWordSensesPartEditor } from '../lex-word-senses-part-editor/lex-word-senses-part-editor';\r\n\r\n@Component({\r\n selector: 'cadmus-lex-word-senses-part-feature',\r\n imports: [CurrentItemBarComponent, LexWordSensesPartEditor],\r\n templateUrl: './lex-word-senses-part-feature.html',\r\n styleUrl: './lex-word-senses-part-feature.css',\r\n})\r\nexport class LexWordSensesPartFeature extends EditPartFeatureBase implements OnInit {\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n snackbar: MatSnackBar,\r\n itemService: ItemService,\r\n thesaurusService: ThesaurusService,\r\n editorService: PartEditorService\r\n ) {\r\n super(router, route, snackbar, itemService, thesaurusService, editorService);\r\n }\r\n\r\n protected override getReqThesauriIds(): string[] {\r\n return [\r\n 'lex-word-sense-tags',\r\n 'lex-word-sense-tags',\r\n 'asserted-id-scopes',\r\n 'asserted-id-tags',\r\n 'doc-reference-types',\r\n 'doc-reference-tags',\r\n 'asserted-id-features',\r\n ];\r\n }\r\n}\r\n","<cadmus-current-item-bar />\r\n<cadmus-lex-word-senses-part-editor\r\n [identity]=\"identity\"\r\n [data]=\"$any(data)\"\r\n (dataChange)=\"save($event!.value!)\"\r\n (editorClose)=\"close()\"\r\n (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n","/*\r\n * Public API Surface of cadmus-part-lexicography-word-senses\r\n */\r\n\r\nexport * from './lib/lex-word-senses-part';\r\nexport * from './lib/components/word-sense-example-editor/word-sense-example-editor';\r\nexport * from './lib/components/word-sense-editor/word-sense-editor';\r\nexport * from './lib/components/lex-word-senses-part-editor/lex-word-senses-part-editor';\r\nexport * from './lib/components/lex-word-senses-part-feature/lex-word-senses-part-feature';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i4","i6","i7","i8","i9","i10","i12","i1","i2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/cadmus-part-lexicography-word-senses",
3
- "version": "0.0.1",
3
+ "version": "0.0.4",
4
4
  "description": "Cadmus - Lexicography word senses part.",
5
5
  "keywords": [
6
6
  "Cadmus",
@@ -15,23 +15,23 @@
15
15
  "name": "Daniele Fusi"
16
16
  },
17
17
  "peerDependencies": {
18
- "@angular/common": "^20.0.0",
19
- "@angular/core": "^20.0.0",
20
- "@angular/material": "^20.0.0",
21
- "@myrmidon/cadmus-refs-asserted-ids": "^10.0.10"
18
+ "@angular/common": "^20.0.0 || ^21.0.0",
19
+ "@angular/core": "^20.0.0 || ^21.0.0",
20
+ "@angular/material": "^20.0.0 || ^21.0.0",
21
+ "@myrmidon/cadmus-refs-asserted-ids": "^10.0.13"
22
22
  },
23
23
  "dependencies": {
24
24
  "tslib": "^2.3.0"
25
25
  },
26
26
  "sideEffects": false,
27
27
  "module": "fesm2022/myrmidon-cadmus-part-lexicography-word-senses.mjs",
28
- "typings": "index.d.ts",
28
+ "typings": "types/myrmidon-cadmus-part-lexicography-word-senses.d.ts",
29
29
  "exports": {
30
30
  "./package.json": {
31
31
  "default": "./package.json"
32
32
  },
33
33
  ".": {
34
- "types": "./index.d.ts",
34
+ "types": "./types/myrmidon-cadmus-part-lexicography-word-senses.d.ts",
35
35
  "default": "./fesm2022/myrmidon-cadmus-part-lexicography-word-senses.mjs"
36
36
  }
37
37
  }
@@ -249,6 +249,7 @@ declare class WordSenseEditor {
249
249
  readonly assTagEntries: _angular_core.InputSignal<ThesaurusEntry[] | undefined>;
250
250
  readonly refTypeEntries: _angular_core.InputSignal<ThesaurusEntry[] | undefined>;
251
251
  readonly refTagEntries: _angular_core.InputSignal<ThesaurusEntry[] | undefined>;
252
+ readonly idFeatureEntries: _angular_core.InputSignal<ThesaurusEntry[] | undefined>;
252
253
  eid: FormControl<string | null>;
253
254
  tags: FormControl<ThesaurusEntry[]>;
254
255
  definition: FormControl<string>;
@@ -283,19 +284,20 @@ declare class WordSenseEditor {
283
284
  */
284
285
  save(pristine?: boolean): void;
285
286
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WordSenseEditor, [null, null, null, { optional: true; }]>;
286
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WordSenseEditor, "cadmus-word-sense-editor", never, { "sense": { "alias": "sense"; "required": false; "isSignal": true; }; "tagEntries": { "alias": "tagEntries"; "required": false; "isSignal": true; }; "assIdScopeEntries": { "alias": "assIdScopeEntries"; "required": false; "isSignal": true; }; "assIdTagEntries": { "alias": "assIdTagEntries"; "required": false; "isSignal": true; }; "assTagEntries": { "alias": "assTagEntries"; "required": false; "isSignal": true; }; "refTypeEntries": { "alias": "refTypeEntries"; "required": false; "isSignal": true; }; "refTagEntries": { "alias": "refTagEntries"; "required": false; "isSignal": true; }; }, { "sense": "senseChange"; "cancelEdit": "cancelEdit"; }, never, never, true, never>;
287
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WordSenseEditor, "cadmus-word-sense-editor", never, { "sense": { "alias": "sense"; "required": false; "isSignal": true; }; "tagEntries": { "alias": "tagEntries"; "required": false; "isSignal": true; }; "assIdScopeEntries": { "alias": "assIdScopeEntries"; "required": false; "isSignal": true; }; "assIdTagEntries": { "alias": "assIdTagEntries"; "required": false; "isSignal": true; }; "assTagEntries": { "alias": "assTagEntries"; "required": false; "isSignal": true; }; "refTypeEntries": { "alias": "refTypeEntries"; "required": false; "isSignal": true; }; "refTagEntries": { "alias": "refTagEntries"; "required": false; "isSignal": true; }; "idFeatureEntries": { "alias": "idFeatureEntries"; "required": false; "isSignal": true; }; }, { "sense": "senseChange"; "cancelEdit": "cancelEdit"; }, never, never, true, never>;
287
288
  }
288
289
 
289
290
  /**
290
291
  * Word senses part editor component.
291
292
  * Thesauri: lex-word-sense-tags, asserted-id-scopes, asserted-id-tags,
292
- * doc-reference-types, doc-reference-tags.
293
+ * doc-reference-types, doc-reference-tags, asserted-id-features.
293
294
  */
294
295
  declare class LexWordSensesPartEditor extends ModelEditorComponentBase<LexWordSensesPart> implements OnInit {
295
296
  private _dialogService;
296
297
  readonly editedIndex: _angular_core.WritableSignal<number>;
297
298
  readonly edited: _angular_core.WritableSignal<WordSense | undefined>;
298
299
  readonly tagEntries: _angular_core.WritableSignal<ThesaurusEntry[] | undefined>;
300
+ readonly idFeatureEntries: _angular_core.WritableSignal<ThesaurusEntry[] | undefined>;
299
301
  entries: FormControl<WordSense[]>;
300
302
  constructor(authService: AuthJwtService, formBuilder: FormBuilder, _dialogService: DialogService);
301
303
  ngOnInit(): void;