@meshmakers/octo-ui 3.3.1000 → 3.3.1020

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Component, Injectable, EventEmitter, Output, Input, ChangeDetectionStrategy, ElementRef, forwardRef, ViewChild, signal, computed, input, model, output, effect, untracked, Directive, InjectionToken, HostListener, makeEnvironmentProviders } from '@angular/core';
2
+ import { inject, Component, Injectable, Input, EventEmitter, Output, ChangeDetectionStrategy, ElementRef, forwardRef, ViewChild, signal, computed, input, model, output, effect, untracked, Directive, InjectionToken, HostListener, makeEnvironmentProviders } from '@angular/core';
3
3
  import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
4
4
  import { AttributeSelectorService, AttributeValueTypeDto as AttributeValueTypeDto$1, CkTypeSelectorService, CkTypeAttributeService, GetEntitiesByCkTypeDtoGQL, RuntimeEntitySelectDataSource, RuntimeEntityDialogDataSource, SearchFilterTypesDto, SortOrdersDto, FieldFilterOperatorsDto, GetCkTypesDtoGQL, GetCkModelByIdDtoGQL, LevelMetaData, RtAssociationMetaData, CkTypeMetaData, GraphDirectionDto, AssociationModOptionsDto, GraphQL, DeleteStrategiesDto, CommunicationService, provideOctoServices } from '@meshmakers/octo-services';
5
5
  import { Roles, provideMmSharedAuth } from '@meshmakers/shared-auth';
@@ -677,6 +677,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
677
677
  type: Injectable
678
678
  }] });
679
679
 
680
+ const DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES = {
681
+ modelFilterLabel: 'Model Filter',
682
+ modelFilterPlaceholder: 'All Models',
683
+ typeSearchLabel: 'Type Search',
684
+ typeSearchPlaceholder: 'Search types...',
685
+ clearFiltersTitle: 'Clear filters',
686
+ columnTypeTitle: 'Type',
687
+ columnBaseTypeTitle: 'Base Type',
688
+ columnDescriptionTitle: 'Description',
689
+ badgeAbstract: 'abstract',
690
+ badgeFinal: 'final',
691
+ selectedLabel: 'Selected:',
692
+ cancel: 'Cancel',
693
+ ok: 'OK',
694
+ defaultDialogTitle: 'Select Construction Kit Type',
695
+ pagerItemsPerPage: 'items per page',
696
+ pagerOf: 'of',
697
+ pagerItems: 'items',
698
+ pagerPage: 'Page',
699
+ pagerFirstPage: 'Go to the first page',
700
+ pagerLastPage: 'Go to the last page',
701
+ pagerPreviousPage: 'Go to the previous page',
702
+ pagerNextPage: 'Go to the next page',
703
+ noRecords: 'No records available.',
704
+ closeTitle: 'Close',
705
+ minimizeTitle: 'Minimize',
706
+ maximizeTitle: 'Maximize',
707
+ restoreTitle: 'Restore',
708
+ };
709
+
680
710
  class CkTypeSelectorDialogComponent {
681
711
  windowRef = inject(WindowRef);
682
712
  ckTypeSelectorService = inject(CkTypeSelectorService);
@@ -684,8 +714,12 @@ class CkTypeSelectorDialogComponent {
684
714
  subscriptions = new Subscription();
685
715
  searchIcon = searchIcon;
686
716
  filterClearIcon = filterClearIcon;
687
- dialogTitle = 'Select Construction Kit Type';
717
+ dialogTitle = DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES.defaultDialogTitle;
688
718
  allowAbstract = true;
719
+ _messages = { ...DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES };
720
+ set messages(value) {
721
+ this._messages = { ...DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES, ...(value ?? {}) };
722
+ }
689
723
  searchText = '';
690
724
  selectedModel = null;
691
725
  availableModels = [];
@@ -705,7 +739,10 @@ class CkTypeSelectorDialogComponent {
705
739
  data;
706
740
  ngOnInit() {
707
741
  if (this.data) {
708
- this.dialogTitle = this.data.dialogTitle || 'Select Construction Kit Type';
742
+ if (this.data.messages) {
743
+ this._messages = { ...DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES, ...this.data.messages };
744
+ }
745
+ this.dialogTitle = this.data.dialogTitle || this._messages.defaultDialogTitle;
709
746
  this.allowAbstract = this.data.allowAbstract ?? true;
710
747
  this.initialCkModelIds = this.data.ckModelIds;
711
748
  this.derivedFromRtCkTypeId = this.data.derivedFromRtCkTypeId;
@@ -858,28 +895,28 @@ class CkTypeSelectorDialogComponent {
858
895
  }
859
896
  }
860
897
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
861
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", ngImport: i0, template: `
898
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", inputs: { messages: "messages" }, ngImport: i0, template: `
862
899
  <div class="ck-type-selector-container">
863
900
  <div class="filter-container">
864
901
  <div class="filter-row">
865
902
  <div class="filter-item" *ngIf="!derivedFromRtCkTypeId">
866
- <label>Model Filter</label>
903
+ <label>{{ _messages.modelFilterLabel }}</label>
867
904
  <kendo-combobox
868
905
  [data]="availableModels"
869
906
  [(ngModel)]="selectedModel"
870
907
  (valueChange)="onModelFilterChange($event)"
871
908
  [allowCustom]="false"
872
909
  [clearButton]="true"
873
- placeholder="All Models"
910
+ [placeholder]="_messages.modelFilterPlaceholder"
874
911
  class="filter-input">
875
912
  </kendo-combobox>
876
913
  </div>
877
914
  <div class="filter-item flex-grow">
878
- <label>Type Search</label>
915
+ <label>{{ _messages.typeSearchLabel }}</label>
879
916
  <kendo-textbox
880
917
  [(ngModel)]="searchText"
881
918
  (ngModelChange)="onSearchChange($event)"
882
- placeholder="Search types..."
919
+ [placeholder]="_messages.typeSearchPlaceholder"
883
920
  class="filter-input">
884
921
  <ng-template kendoTextBoxSuffixTemplate>
885
922
  <button kendoButton [svgIcon]="searchIcon" fillMode="clear" size="small"></button>
@@ -888,7 +925,7 @@ class CkTypeSelectorDialogComponent {
888
925
  </div>
889
926
  <div class="filter-item filter-actions">
890
927
  <label>&nbsp;</label>
891
- <button kendoButton [svgIcon]="filterClearIcon" (click)="clearFilters()" title="Clear filters"></button>
928
+ <button kendoButton [svgIcon]="filterClearIcon" (click)="clearFilters()" [title]="_messages.clearFiltersTitle"></button>
892
929
  </div>
893
930
  </div>
894
931
  </div>
@@ -907,38 +944,49 @@ class CkTypeSelectorDialogComponent {
907
944
  [kendoGridSelectBy]="selectItemBy"
908
945
  [(selectedKeys)]="selectedKeys"
909
946
  class="type-grid">
910
- <kendo-grid-column field="rtCkTypeId" title="Type" [width]="300">
947
+ <kendo-grid-column field="rtCkTypeId" [title]="_messages.columnTypeTitle" [width]="300">
911
948
  <ng-template kendoGridCellTemplate let-dataItem>
912
949
  <span [class.abstract-type]="dataItem.isAbstract" [class.final-type]="dataItem.isFinal">
913
950
  {{ dataItem.rtCkTypeId }}
914
951
  </span>
915
- <span *ngIf="dataItem.isAbstract" class="type-badge abstract">abstract</span>
916
- <span *ngIf="dataItem.isFinal" class="type-badge final">final</span>
952
+ <span *ngIf="dataItem.isAbstract" class="type-badge abstract">{{ _messages.badgeAbstract }}</span>
953
+ <span *ngIf="dataItem.isFinal" class="type-badge final">{{ _messages.badgeFinal }}</span>
917
954
  </ng-template>
918
955
  </kendo-grid-column>
919
- <kendo-grid-column field="baseTypeRtCkTypeId" title="Base Type" [width]="200">
956
+ <kendo-grid-column field="baseTypeRtCkTypeId" [title]="_messages.columnBaseTypeTitle" [width]="200">
920
957
  <ng-template kendoGridCellTemplate let-dataItem>
921
958
  {{ dataItem.baseTypeRtCkTypeId || '-' }}
922
959
  </ng-template>
923
960
  </kendo-grid-column>
924
- <kendo-grid-column field="description" title="Description">
961
+ <kendo-grid-column field="description" [title]="_messages.columnDescriptionTitle">
925
962
  <ng-template kendoGridCellTemplate let-dataItem>
926
963
  {{ dataItem.description || '-' }}
927
964
  </ng-template>
928
965
  </kendo-grid-column>
966
+ <kendo-grid-messages
967
+ [pagerItemsPerPage]="_messages.pagerItemsPerPage"
968
+ [pagerOf]="_messages.pagerOf"
969
+ [pagerItems]="_messages.pagerItems"
970
+ [pagerPage]="_messages.pagerPage"
971
+ [pagerFirstPage]="_messages.pagerFirstPage"
972
+ [pagerLastPage]="_messages.pagerLastPage"
973
+ [pagerPreviousPage]="_messages.pagerPreviousPage"
974
+ [pagerNextPage]="_messages.pagerNextPage"
975
+ [noRecords]="_messages.noRecords"
976
+ />
929
977
  </kendo-grid>
930
978
  </div>
931
979
 
932
980
  <div class="selection-info" *ngIf="selectedType">
933
- <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}
981
+ <strong>{{ _messages.selectedLabel }}</strong> {{ selectedType.rtCkTypeId }}
934
982
  </div>
935
983
 
936
984
  <div class="dialog-actions">
937
- <button kendoButton (click)="onCancel()">Cancel</button>
938
- <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
985
+ <button kendoButton (click)="onCancel()">{{ _messages.cancel }}</button>
986
+ <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">{{ _messages.ok }}</button>
939
987
  </div>
940
988
  </div>
941
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%}.ck-type-selector-container{display:flex;flex-direction:column;flex:1;min-height:0;padding:20px;box-sizing:border-box;gap:12px}.filter-container{margin-bottom:16px;flex-shrink:0}.filter-row{display:flex;gap:16px;align-items:flex-end}.filter-item{display:flex;flex-direction:column;gap:4px}.filter-item label{font-size:12px;font-weight:500}.filter-item.flex-grow{flex:1}.filter-item.filter-actions{flex-shrink:0}.filter-input{min-width:180px}.grid-container{flex:1;min-height:0;display:flex;flex-direction:column}.grid-container kendo-grid,.grid-container .type-grid{flex:1;min-height:200px}.type-grid{border-radius:4px}.type-grid ::ng-deep .k-grid-table tbody tr{cursor:pointer}.abstract-type{font-style:italic;opacity:.7}.final-type{font-weight:600}.type-badge{display:inline-block;font-size:10px;padding:1px 6px;border-radius:10px;margin-left:8px;text-transform:uppercase}.type-badge.abstract{background-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-on-warning, #000);opacity:.8}.type-badge.final{background-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-on-success, #fff);opacity:.8}.selection-info{margin-top:12px;padding:8px 12px;background:var(--kendo-color-success-subtle, #d4edda);border:1px solid var(--kendo-color-success, #28a745);border-radius:4px;font-size:14px;flex-shrink:0}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding:8px 20px 0;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: GridModule }, { kind: "component", type: i3.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "adaptiveMode", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "size", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "gridResizable", "rowReorderable", "navigable", "autoSize", "rowClass", "rowSticky", "rowSelected", "isRowSelectable", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "showInactiveTools", "isDetailExpanded", "isGroupExpanded", "dataLayoutMode"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "component", type: i3$1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "ngmodule", type: IconsModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: WindowModule }] });
989
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%}.ck-type-selector-container{display:flex;flex-direction:column;flex:1;min-height:0;padding:20px;box-sizing:border-box;gap:12px}.filter-container{margin-bottom:16px;flex-shrink:0}.filter-row{display:flex;gap:16px;align-items:flex-end}.filter-item{display:flex;flex-direction:column;gap:4px}.filter-item label{font-size:12px;font-weight:500}.filter-item.flex-grow{flex:1}.filter-item.filter-actions{flex-shrink:0}.filter-input{min-width:180px}.grid-container{flex:1;min-height:0;display:flex;flex-direction:column}.grid-container kendo-grid,.grid-container .type-grid{flex:1;min-height:200px}.type-grid{border-radius:4px}.type-grid ::ng-deep .k-grid-table tbody tr{cursor:pointer}.abstract-type{font-style:italic;opacity:.7}.final-type{font-weight:600}.type-badge{display:inline-block;font-size:10px;padding:1px 6px;border-radius:10px;margin-left:8px;text-transform:uppercase}.type-badge.abstract{background-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-on-warning, #000);opacity:.8}.type-badge.final{background-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-on-success, #fff);opacity:.8}.selection-info{margin-top:12px;padding:8px 12px;background:var(--kendo-color-success-subtle, #d4edda);border:1px solid var(--kendo-color-success, #28a745);border-radius:4px;font-size:14px;flex-shrink:0}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding:8px 20px 0;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: GridModule }, { kind: "component", type: i3.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "adaptiveMode", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "size", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "gridResizable", "rowReorderable", "navigable", "autoSize", "rowClass", "rowSticky", "rowSelected", "isRowSelectable", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "showInactiveTools", "isDetailExpanded", "isGroupExpanded", "dataLayoutMode"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.CustomMessagesComponent, selector: "kendo-grid-messages" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "component", type: i3$1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "ngmodule", type: IconsModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: WindowModule }] });
942
990
  }
943
991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
944
992
  type: Component,
@@ -957,23 +1005,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
957
1005
  <div class="filter-container">
958
1006
  <div class="filter-row">
959
1007
  <div class="filter-item" *ngIf="!derivedFromRtCkTypeId">
960
- <label>Model Filter</label>
1008
+ <label>{{ _messages.modelFilterLabel }}</label>
961
1009
  <kendo-combobox
962
1010
  [data]="availableModels"
963
1011
  [(ngModel)]="selectedModel"
964
1012
  (valueChange)="onModelFilterChange($event)"
965
1013
  [allowCustom]="false"
966
1014
  [clearButton]="true"
967
- placeholder="All Models"
1015
+ [placeholder]="_messages.modelFilterPlaceholder"
968
1016
  class="filter-input">
969
1017
  </kendo-combobox>
970
1018
  </div>
971
1019
  <div class="filter-item flex-grow">
972
- <label>Type Search</label>
1020
+ <label>{{ _messages.typeSearchLabel }}</label>
973
1021
  <kendo-textbox
974
1022
  [(ngModel)]="searchText"
975
1023
  (ngModelChange)="onSearchChange($event)"
976
- placeholder="Search types..."
1024
+ [placeholder]="_messages.typeSearchPlaceholder"
977
1025
  class="filter-input">
978
1026
  <ng-template kendoTextBoxSuffixTemplate>
979
1027
  <button kendoButton [svgIcon]="searchIcon" fillMode="clear" size="small"></button>
@@ -982,7 +1030,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
982
1030
  </div>
983
1031
  <div class="filter-item filter-actions">
984
1032
  <label>&nbsp;</label>
985
- <button kendoButton [svgIcon]="filterClearIcon" (click)="clearFilters()" title="Clear filters"></button>
1033
+ <button kendoButton [svgIcon]="filterClearIcon" (click)="clearFilters()" [title]="_messages.clearFiltersTitle"></button>
986
1034
  </div>
987
1035
  </div>
988
1036
  </div>
@@ -1001,57 +1049,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1001
1049
  [kendoGridSelectBy]="selectItemBy"
1002
1050
  [(selectedKeys)]="selectedKeys"
1003
1051
  class="type-grid">
1004
- <kendo-grid-column field="rtCkTypeId" title="Type" [width]="300">
1052
+ <kendo-grid-column field="rtCkTypeId" [title]="_messages.columnTypeTitle" [width]="300">
1005
1053
  <ng-template kendoGridCellTemplate let-dataItem>
1006
1054
  <span [class.abstract-type]="dataItem.isAbstract" [class.final-type]="dataItem.isFinal">
1007
1055
  {{ dataItem.rtCkTypeId }}
1008
1056
  </span>
1009
- <span *ngIf="dataItem.isAbstract" class="type-badge abstract">abstract</span>
1010
- <span *ngIf="dataItem.isFinal" class="type-badge final">final</span>
1057
+ <span *ngIf="dataItem.isAbstract" class="type-badge abstract">{{ _messages.badgeAbstract }}</span>
1058
+ <span *ngIf="dataItem.isFinal" class="type-badge final">{{ _messages.badgeFinal }}</span>
1011
1059
  </ng-template>
1012
1060
  </kendo-grid-column>
1013
- <kendo-grid-column field="baseTypeRtCkTypeId" title="Base Type" [width]="200">
1061
+ <kendo-grid-column field="baseTypeRtCkTypeId" [title]="_messages.columnBaseTypeTitle" [width]="200">
1014
1062
  <ng-template kendoGridCellTemplate let-dataItem>
1015
1063
  {{ dataItem.baseTypeRtCkTypeId || '-' }}
1016
1064
  </ng-template>
1017
1065
  </kendo-grid-column>
1018
- <kendo-grid-column field="description" title="Description">
1066
+ <kendo-grid-column field="description" [title]="_messages.columnDescriptionTitle">
1019
1067
  <ng-template kendoGridCellTemplate let-dataItem>
1020
1068
  {{ dataItem.description || '-' }}
1021
1069
  </ng-template>
1022
1070
  </kendo-grid-column>
1071
+ <kendo-grid-messages
1072
+ [pagerItemsPerPage]="_messages.pagerItemsPerPage"
1073
+ [pagerOf]="_messages.pagerOf"
1074
+ [pagerItems]="_messages.pagerItems"
1075
+ [pagerPage]="_messages.pagerPage"
1076
+ [pagerFirstPage]="_messages.pagerFirstPage"
1077
+ [pagerLastPage]="_messages.pagerLastPage"
1078
+ [pagerPreviousPage]="_messages.pagerPreviousPage"
1079
+ [pagerNextPage]="_messages.pagerNextPage"
1080
+ [noRecords]="_messages.noRecords"
1081
+ />
1023
1082
  </kendo-grid>
1024
1083
  </div>
1025
1084
 
1026
1085
  <div class="selection-info" *ngIf="selectedType">
1027
- <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}
1086
+ <strong>{{ _messages.selectedLabel }}</strong> {{ selectedType.rtCkTypeId }}
1028
1087
  </div>
1029
1088
 
1030
1089
  <div class="dialog-actions">
1031
- <button kendoButton (click)="onCancel()">Cancel</button>
1032
- <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
1090
+ <button kendoButton (click)="onCancel()">{{ _messages.cancel }}</button>
1091
+ <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">{{ _messages.ok }}</button>
1033
1092
  </div>
1034
1093
  </div>
1035
1094
  `, styles: [":host{display:flex;flex-direction:column;height:100%}.ck-type-selector-container{display:flex;flex-direction:column;flex:1;min-height:0;padding:20px;box-sizing:border-box;gap:12px}.filter-container{margin-bottom:16px;flex-shrink:0}.filter-row{display:flex;gap:16px;align-items:flex-end}.filter-item{display:flex;flex-direction:column;gap:4px}.filter-item label{font-size:12px;font-weight:500}.filter-item.flex-grow{flex:1}.filter-item.filter-actions{flex-shrink:0}.filter-input{min-width:180px}.grid-container{flex:1;min-height:0;display:flex;flex-direction:column}.grid-container kendo-grid,.grid-container .type-grid{flex:1;min-height:200px}.type-grid{border-radius:4px}.type-grid ::ng-deep .k-grid-table tbody tr{cursor:pointer}.abstract-type{font-style:italic;opacity:.7}.final-type{font-weight:600}.type-badge{display:inline-block;font-size:10px;padding:1px 6px;border-radius:10px;margin-left:8px;text-transform:uppercase}.type-badge.abstract{background-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-on-warning, #000);opacity:.8}.type-badge.final{background-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-on-success, #fff);opacity:.8}.selection-info{margin-top:12px;padding:8px 12px;background:var(--kendo-color-success-subtle, #d4edda);border:1px solid var(--kendo-color-success, #28a745);border-radius:4px;font-size:14px;flex-shrink:0}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding:8px 20px 0;flex-shrink:0}\n"] }]
1036
- }] });
1095
+ }], propDecorators: { messages: [{
1096
+ type: Input
1097
+ }] } });
1037
1098
 
1038
1099
  class CkTypeSelectorDialogService {
1039
1100
  windowService = inject(WindowService);
1040
1101
  windowStateService = inject(WindowStateService);
1041
- /**
1042
- * Opens the CkType selector dialog
1043
- * @param options Dialog options
1044
- * @returns Promise that resolves with the result containing selected CkType and confirmation status
1045
- */
1102
+ defaultMessages;
1046
1103
  async openCkTypeSelector(options = {}) {
1104
+ const effectiveMessages = options.messages ?? this.defaultMessages;
1047
1105
  const data = {
1048
1106
  selectedCkTypeId: options.selectedCkTypeId,
1049
1107
  ckModelIds: options.ckModelIds,
1050
1108
  dialogTitle: options.dialogTitle,
1051
1109
  allowAbstract: options.allowAbstract,
1052
- derivedFromRtCkTypeId: options.derivedFromRtCkTypeId
1110
+ derivedFromRtCkTypeId: options.derivedFromRtCkTypeId,
1111
+ ...(effectiveMessages ? { messages: effectiveMessages } : {}),
1053
1112
  };
1054
1113
  const size = this.windowStateService.resolveWindowSize('ck-type-selector', { width: 900, height: 650 });
1114
+ const defaultTitle = effectiveMessages?.defaultDialogTitle ??
1115
+ DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES.defaultDialogTitle;
1116
+ // Forward titlebar tooltips through WindowSettings.messages — Kendo's
1117
+ // Window reads them on open. <kendo-window-messages> in projected content
1118
+ // is out of reach for its ContentChild query.
1119
+ const windowMessages = effectiveMessages
1120
+ ? {
1121
+ closeTitle: effectiveMessages.closeTitle,
1122
+ minimizeTitle: effectiveMessages.minimizeTitle,
1123
+ maximizeTitle: effectiveMessages.maximizeTitle,
1124
+ restoreTitle: effectiveMessages.restoreTitle,
1125
+ }
1126
+ : undefined;
1055
1127
  const windowRef = this.windowService.open({
1056
1128
  content: CkTypeSelectorDialogComponent,
1057
1129
  width: size.width,
@@ -1059,7 +1131,8 @@ class CkTypeSelectorDialogService {
1059
1131
  minWidth: 750,
1060
1132
  minHeight: 550,
1061
1133
  resizable: true,
1062
- title: options.dialogTitle || 'Select Construction Kit Type'
1134
+ title: options.dialogTitle || defaultTitle,
1135
+ messages: windowMessages,
1063
1136
  });
1064
1137
  this.windowStateService.applyModalBehavior('ck-type-selector', windowRef);
1065
1138
  // Pass data to the component
@@ -1151,6 +1224,14 @@ var DefaultPropertyCategory;
1151
1224
  DefaultPropertyCategory["Metadata"] = "Metadata";
1152
1225
  })(DefaultPropertyCategory || (DefaultPropertyCategory = {}));
1153
1226
 
1227
+ const DEFAULT_PROPERTY_GRID_MESSAGES = {
1228
+ searchPlaceholder: 'Search attributes...',
1229
+ columnPropertyTitle: 'Property',
1230
+ columnValueTitle: 'Value',
1231
+ columnTypeTitle: 'Type',
1232
+ readOnlyTooltip: 'Read-only',
1233
+ };
1234
+
1154
1235
  /**
1155
1236
  * Service for converting various data structures to PropertyGridItem format.
1156
1237
  * Uses Construction Kit (CK) type definitions for accurate attribute type resolution.
@@ -2734,6 +2815,10 @@ class PropertyGridComponent {
2734
2815
  data = [];
2735
2816
  config = {};
2736
2817
  showTypeColumn = false;
2818
+ _messages = { ...DEFAULT_PROPERTY_GRID_MESSAGES };
2819
+ set messages(value) {
2820
+ this._messages = { ...DEFAULT_PROPERTY_GRID_MESSAGES, ...(value ?? {}) };
2821
+ }
2737
2822
  propertyChange = new EventEmitter();
2738
2823
  saveRequested = new EventEmitter();
2739
2824
  binaryDownload = new EventEmitter();
@@ -2870,14 +2955,14 @@ class PropertyGridComponent {
2870
2955
  this.binaryDownload.emit(event);
2871
2956
  }
2872
2957
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PropertyGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2873
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PropertyGridComponent, isStandalone: true, selector: "mm-property-grid", inputs: { data: "data", config: "config", showTypeColumn: "showTypeColumn" }, outputs: { propertyChange: "propertyChange", saveRequested: "saveRequested", binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2958
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PropertyGridComponent, isStandalone: true, selector: "mm-property-grid", inputs: { data: "data", config: "config", showTypeColumn: "showTypeColumn", messages: "messages" }, outputs: { propertyChange: "propertyChange", saveRequested: "saveRequested", binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2874
2959
  <div class="mm-property-grid" [style.height]="config.height || '400px'">
2875
2960
 
2876
2961
  @if (config.showSearch) {
2877
2962
  <div class="search-toolbar">
2878
2963
  <kendo-textbox
2879
2964
  [(ngModel)]="searchTerm"
2880
- placeholder="Search attributes..."
2965
+ [placeholder]="_messages.searchPlaceholder"
2881
2966
  (input)="onSearch()"
2882
2967
  [clearButton]="true">
2883
2968
  </kendo-textbox>
@@ -2895,7 +2980,7 @@ class PropertyGridComponent {
2895
2980
  <!-- Property Name Column -->
2896
2981
  <kendo-grid-column
2897
2982
  field="displayName"
2898
- title="Property"
2983
+ [title]="_messages.columnPropertyTitle"
2899
2984
  [width]="200"
2900
2985
  [sortable]="true">
2901
2986
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
@@ -2914,7 +2999,7 @@ class PropertyGridComponent {
2914
2999
  <span class="required-indicator">*</span>
2915
3000
  }
2916
3001
  @if (dataItem.readOnly) {
2917
- <span class="readonly-indicator" title="Read-only">🔒</span>
3002
+ <span class="readonly-indicator" [title]="_messages.readOnlyTooltip">🔒</span>
2918
3003
  }
2919
3004
  </div>
2920
3005
  </div>
@@ -2924,7 +3009,7 @@ class PropertyGridComponent {
2924
3009
  <!-- Property Value Column -->
2925
3010
  <kendo-grid-column
2926
3011
  field="value"
2927
- title="Value"
3012
+ [title]="_messages.columnValueTitle"
2928
3013
  [sortable]="false">
2929
3014
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
2930
3015
  <mm-property-value-display
@@ -2940,7 +3025,7 @@ class PropertyGridComponent {
2940
3025
  @if (showTypeColumn) {
2941
3026
  <kendo-grid-column
2942
3027
  field="type"
2943
- title="Type"
3028
+ [title]="_messages.columnTypeTitle"
2944
3029
  [width]="120"
2945
3030
  [sortable]="true">
2946
3031
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
@@ -2973,7 +3058,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2973
3058
  <div class="search-toolbar">
2974
3059
  <kendo-textbox
2975
3060
  [(ngModel)]="searchTerm"
2976
- placeholder="Search attributes..."
3061
+ [placeholder]="_messages.searchPlaceholder"
2977
3062
  (input)="onSearch()"
2978
3063
  [clearButton]="true">
2979
3064
  </kendo-textbox>
@@ -2991,7 +3076,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2991
3076
  <!-- Property Name Column -->
2992
3077
  <kendo-grid-column
2993
3078
  field="displayName"
2994
- title="Property"
3079
+ [title]="_messages.columnPropertyTitle"
2995
3080
  [width]="200"
2996
3081
  [sortable]="true">
2997
3082
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
@@ -3010,7 +3095,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3010
3095
  <span class="required-indicator">*</span>
3011
3096
  }
3012
3097
  @if (dataItem.readOnly) {
3013
- <span class="readonly-indicator" title="Read-only">🔒</span>
3098
+ <span class="readonly-indicator" [title]="_messages.readOnlyTooltip">🔒</span>
3014
3099
  }
3015
3100
  </div>
3016
3101
  </div>
@@ -3020,7 +3105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3020
3105
  <!-- Property Value Column -->
3021
3106
  <kendo-grid-column
3022
3107
  field="value"
3023
- title="Value"
3108
+ [title]="_messages.columnValueTitle"
3024
3109
  [sortable]="false">
3025
3110
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
3026
3111
  <mm-property-value-display
@@ -3036,7 +3121,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3036
3121
  @if (showTypeColumn) {
3037
3122
  <kendo-grid-column
3038
3123
  field="type"
3039
- title="Type"
3124
+ [title]="_messages.columnTypeTitle"
3040
3125
  [width]="120"
3041
3126
  [sortable]="true">
3042
3127
  <ng-template kendoGridCellTemplate let-dataItem="dataItem">
@@ -3056,6 +3141,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3056
3141
  type: Input
3057
3142
  }], showTypeColumn: [{
3058
3143
  type: Input
3144
+ }], messages: [{
3145
+ type: Input
3059
3146
  }], propertyChange: [{
3060
3147
  type: Output
3061
3148
  }], saveRequested: [{
@@ -3066,17 +3153,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3066
3153
 
3067
3154
  // Models
3068
3155
 
3156
+ const DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES = {
3157
+ placeholder: 'Select a CK type...',
3158
+ noTypesFound: 'No types found for "{0}"',
3159
+ minCharactersHint: 'Type at least {0} characters to search...',
3160
+ advancedSearchLabel: 'Advanced Search...',
3161
+ defaultDialogTitle: 'Select Construction Kit Type',
3162
+ };
3163
+
3069
3164
  class CkTypeSelectorInputComponent {
3070
3165
  autocomplete;
3071
- placeholder = 'Select a CK type...';
3166
+ placeholder = DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.placeholder;
3072
3167
  minSearchLength = 2;
3073
3168
  maxResults = 50;
3074
3169
  debounceMs = 300;
3075
3170
  ckModelIds;
3076
3171
  allowAbstract = true;
3077
- dialogTitle = 'Select Construction Kit Type';
3078
- advancedSearchLabel = 'Advanced Search...';
3172
+ dialogTitle = DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.defaultDialogTitle;
3173
+ advancedSearchLabel = DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.advancedSearchLabel;
3079
3174
  derivedFromRtCkTypeId;
3175
+ _messages = { ...DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES };
3176
+ set messages(value) {
3177
+ this._messages = { ...DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES, ...(value ?? {}) };
3178
+ if (this.placeholder === DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.placeholder) {
3179
+ this.placeholder = this._messages.placeholder;
3180
+ }
3181
+ if (this.advancedSearchLabel === DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.advancedSearchLabel) {
3182
+ this.advancedSearchLabel = this._messages.advancedSearchLabel;
3183
+ }
3184
+ if (this.dialogTitle === DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES.defaultDialogTitle) {
3185
+ this.dialogTitle = this._messages.defaultDialogTitle;
3186
+ }
3187
+ }
3188
+ dialogMessages;
3189
+ formatNoTypesFound(searchValue) {
3190
+ return this._messages.noTypesFound.replace('{0}', searchValue);
3191
+ }
3192
+ formatMinCharactersHint(minLength) {
3193
+ return this._messages.minCharactersHint.replace('{0}', String(minLength));
3194
+ }
3080
3195
  _disabled = false;
3081
3196
  get disabled() {
3082
3197
  return this._disabled;
@@ -3316,19 +3431,23 @@ class CkTypeSelectorInputComponent {
3316
3431
  return;
3317
3432
  }
3318
3433
  this.autocomplete.toggle(false);
3319
- const result = await this.dialogService.openCkTypeSelector({
3434
+ const openOptions = {
3320
3435
  selectedCkTypeId: this.selectedCkType?.fullName,
3321
3436
  ckModelIds: this.ckModelIds,
3322
3437
  dialogTitle: this.dialogTitle,
3323
3438
  allowAbstract: this.allowAbstract,
3324
- derivedFromRtCkTypeId: this.derivedFromRtCkTypeId
3325
- });
3439
+ derivedFromRtCkTypeId: this.derivedFromRtCkTypeId,
3440
+ };
3441
+ if (this.dialogMessages) {
3442
+ openOptions.messages = this.dialogMessages;
3443
+ }
3444
+ const result = await this.dialogService.openCkTypeSelector(openOptions);
3326
3445
  if (result.confirmed && result.selectedCkType) {
3327
3446
  this.selectCkType(result.selectedCkType);
3328
3447
  }
3329
3448
  }
3330
3449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CkTypeSelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3331
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CkTypeSelectorInputComponent, isStandalone: true, selector: "mm-ck-type-selector-input", inputs: { placeholder: "placeholder", minSearchLength: "minSearchLength", maxResults: "maxResults", debounceMs: "debounceMs", ckModelIds: "ckModelIds", allowAbstract: "allowAbstract", dialogTitle: "dialogTitle", advancedSearchLabel: "advancedSearchLabel", derivedFromRtCkTypeId: "derivedFromRtCkTypeId", disabled: "disabled", required: "required" }, outputs: { ckTypeSelected: "ckTypeSelected", ckTypeCleared: "ckTypeCleared" }, providers: [
3450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CkTypeSelectorInputComponent, isStandalone: true, selector: "mm-ck-type-selector-input", inputs: { placeholder: "placeholder", minSearchLength: "minSearchLength", maxResults: "maxResults", debounceMs: "debounceMs", ckModelIds: "ckModelIds", allowAbstract: "allowAbstract", dialogTitle: "dialogTitle", advancedSearchLabel: "advancedSearchLabel", derivedFromRtCkTypeId: "derivedFromRtCkTypeId", messages: "messages", dialogMessages: "dialogMessages", disabled: "disabled", required: "required" }, outputs: { ckTypeSelected: "ckTypeSelected", ckTypeCleared: "ckTypeCleared" }, providers: [
3332
3451
  {
3333
3452
  provide: NG_VALUE_ACCESSOR,
3334
3453
  useExisting: forwardRef(() => CkTypeSelectorInputComponent),
@@ -3366,10 +3485,10 @@ class CkTypeSelectorInputComponent {
3366
3485
  <ng-template kendoAutoCompleteNoDataTemplate>
3367
3486
  <div class="no-data-message">
3368
3487
  <span *ngIf="!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength">
3369
- No types found for "{{ searchFormControl.value }}"
3488
+ {{ formatNoTypesFound(searchFormControl.value) }}
3370
3489
  </span>
3371
3490
  <span *ngIf="!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)">
3372
- Type at least {{ minSearchLength }} characters to search...
3491
+ {{ formatMinCharactersHint(minSearchLength) }}
3373
3492
  </span>
3374
3493
  </div>
3375
3494
  </ng-template>
@@ -3377,7 +3496,7 @@ class CkTypeSelectorInputComponent {
3377
3496
  <ng-template kendoAutoCompleteFooterTemplate>
3378
3497
  <div class="advanced-search-footer" (click)="openDialog($event)">
3379
3498
  <kendo-svg-icon [icon]="searchIcon" size="small"></kendo-svg-icon>
3380
- <span>{{ advancedSearchLabel }}</span>
3499
+ <span>{{ advancedSearchLabel || _messages.advancedSearchLabel }}</span>
3381
3500
  </div>
3382
3501
  </ng-template>
3383
3502
 
@@ -3388,7 +3507,7 @@ class CkTypeSelectorInputComponent {
3388
3507
  type="button"
3389
3508
  [svgIcon]="searchIcon"
3390
3509
  [disabled]="disabled"
3391
- [title]="advancedSearchLabel"
3510
+ [title]="advancedSearchLabel || _messages.advancedSearchLabel"
3392
3511
  class="dialog-button"
3393
3512
  (click)="openDialog()">
3394
3513
  </button>
@@ -3443,10 +3562,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3443
3562
  <ng-template kendoAutoCompleteNoDataTemplate>
3444
3563
  <div class="no-data-message">
3445
3564
  <span *ngIf="!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength">
3446
- No types found for "{{ searchFormControl.value }}"
3565
+ {{ formatNoTypesFound(searchFormControl.value) }}
3447
3566
  </span>
3448
3567
  <span *ngIf="!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)">
3449
- Type at least {{ minSearchLength }} characters to search...
3568
+ {{ formatMinCharactersHint(minSearchLength) }}
3450
3569
  </span>
3451
3570
  </div>
3452
3571
  </ng-template>
@@ -3454,7 +3573,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3454
3573
  <ng-template kendoAutoCompleteFooterTemplate>
3455
3574
  <div class="advanced-search-footer" (click)="openDialog($event)">
3456
3575
  <kendo-svg-icon [icon]="searchIcon" size="small"></kendo-svg-icon>
3457
- <span>{{ advancedSearchLabel }}</span>
3576
+ <span>{{ advancedSearchLabel || _messages.advancedSearchLabel }}</span>
3458
3577
  </div>
3459
3578
  </ng-template>
3460
3579
 
@@ -3465,7 +3584,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3465
3584
  type="button"
3466
3585
  [svgIcon]="searchIcon"
3467
3586
  [disabled]="disabled"
3468
- [title]="advancedSearchLabel"
3587
+ [title]="advancedSearchLabel || _messages.advancedSearchLabel"
3469
3588
  class="dialog-button"
3470
3589
  (click)="openDialog()">
3471
3590
  </button>
@@ -3492,6 +3611,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3492
3611
  type: Input
3493
3612
  }], derivedFromRtCkTypeId: [{
3494
3613
  type: Input
3614
+ }], messages: [{
3615
+ type: Input
3616
+ }], dialogMessages: [{
3617
+ type: Input
3495
3618
  }], disabled: [{
3496
3619
  type: Input
3497
3620
  }], required: [{
@@ -4588,7 +4711,7 @@ class RuntimeEntityVariableDialogComponent {
4588
4711
  <button kendoButton (click)="onOk()" themeColor="primary" [disabled]="!isValid()">OK</button>
4589
4712
  </div>
4590
4713
  </div>
4591
- `, isInline: true, styles: [".dialog-content{display:flex;flex-direction:column;gap:16px;padding:16px 20px}.form-row{display:flex;flex-direction:column;gap:4px}.form-label{font-size:12px;font-weight:600;color:var(--kendo-color-subtle, #666)}.mappings-grid{border:1px solid var(--kendo-color-border, #e0e0e0);border-radius:4px;background:var(--kendo-color-surface-alt, #fafafa)}.grid-header{display:grid;grid-template-columns:1fr 1fr 100px 40px;gap:.5rem;padding:.5rem .75rem;background:var(--kendo-color-surface, #f5f5f5);border-bottom:1px solid var(--kendo-color-border, #e0e0e0);font-size:12px;font-weight:600;color:var(--kendo-color-subtle, #666)}.grid-row{display:grid;grid-template-columns:1fr 1fr 100px 40px;gap:.5rem;padding:.5rem .75rem;align-items:start;border-bottom:1px solid var(--kendo-color-border, #e0e0e0)}.grid-row:last-child{border-bottom:none}.col-name{display:flex;flex-direction:column;gap:2px}.col-path,.col-type{font-size:13px;padding-top:6px;color:var(--kendo-color-on-app-surface, #424242)}.col-actions{display:flex;justify-content:center;padding-top:2px}.error-text{font-size:11px;color:var(--kendo-color-error, #f44336)}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:8px;border-top:1px solid var(--kendo-color-border, #e0e0e0)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "ngmodule", type: GridModule }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: EntitySelectInputComponent, selector: "mm-entity-select-input", inputs: ["dataSource", "placeholder", "minSearchLength", "maxResults", "debounceMs", "prefix", "initialDisplayValue", "dialogDataSource", "dialogTitle", "multiSelect", "advancedSearchLabel", "dialogMessages", "messages", "disabled", "required"], outputs: ["entitySelected", "entityCleared", "entitiesSelected"] }] });
4714
+ `, isInline: true, styles: [".dialog-content{display:flex;flex-direction:column;gap:16px;padding:16px 20px}.form-row{display:flex;flex-direction:column;gap:4px}.form-label{font-size:12px;font-weight:600;color:var(--kendo-color-subtle, #666)}.mappings-grid{border:1px solid var(--kendo-color-border, #e0e0e0);border-radius:4px;background:var(--kendo-color-surface-alt, #fafafa)}.grid-header{display:grid;grid-template-columns:1fr 1fr 100px 40px;gap:.5rem;padding:.5rem .75rem;background:var(--kendo-color-surface, #f5f5f5);border-bottom:1px solid var(--kendo-color-border, #e0e0e0);font-size:12px;font-weight:600;color:var(--kendo-color-subtle, #666)}.grid-row{display:grid;grid-template-columns:1fr 1fr 100px 40px;gap:.5rem;padding:.5rem .75rem;align-items:start;border-bottom:1px solid var(--kendo-color-border, #e0e0e0)}.grid-row:last-child{border-bottom:none}.col-name{display:flex;flex-direction:column;gap:2px}.col-path,.col-type{font-size:13px;padding-top:6px;color:var(--kendo-color-on-app-surface, #424242)}.col-actions{display:flex;justify-content:center;padding-top:2px}.error-text{font-size:11px;color:var(--kendo-color-error, #f44336)}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:8px;border-top:1px solid var(--kendo-color-border, #e0e0e0)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "ngmodule", type: GridModule }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "messages", "dialogMessages", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: EntitySelectInputComponent, selector: "mm-entity-select-input", inputs: ["dataSource", "placeholder", "minSearchLength", "maxResults", "debounceMs", "prefix", "initialDisplayValue", "dialogDataSource", "dialogTitle", "multiSelect", "advancedSearchLabel", "dialogMessages", "messages", "disabled", "required"], outputs: ["entitySelected", "entityCleared", "entitiesSelected"] }] });
4592
4715
  }
4593
4716
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RuntimeEntityVariableDialogComponent, decorators: [{
4594
4717
  type: Component,
@@ -8007,6 +8130,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8007
8130
  * Default English messages for the RuntimeBrowser components.
8008
8131
  */
8009
8132
  const DEFAULT_RUNTIME_BROWSER_MESSAGES = {
8133
+ recordLabel: 'Record',
8134
+ back: 'Back',
8135
+ recordArrayHint: 'Add records to this array. Remove to delete the selected record. Empty arrays are not saved.',
8136
+ recordHint: 'Load attributes to edit this optional record. Unload to remove all data and clear validation.',
8137
+ addRecord: 'Add',
8138
+ removeRecord: 'Remove',
8139
+ loadRecord: 'Load',
8140
+ unloadRecord: 'Unload',
8141
+ longitudeHint: 'The longitude of the point on the Earth surface (-180 to 180 degrees).',
8142
+ latitudeHint: 'The latitude of the point on the Earth surface (-90 to 90 degrees).',
8010
8143
  title: 'Runtime Browser',
8011
8144
  badgeLabel: 'Entities & Data',
8012
8145
  titlePrefix: 'REPOSITORY',
@@ -8071,6 +8204,8 @@ const DEFAULT_RUNTIME_BROWSER_MESSAGES = {
8071
8204
  attributesFor: 'Attributes for',
8072
8205
  couldNotLoadEntityDetails: 'Could not load entity details',
8073
8206
  failedToLoadEntityDetails: 'Failed to load entity details',
8207
+ entityNotFound: 'Entity not found',
8208
+ entityIdInvalidFormat: 'Invalid entity ID format',
8074
8209
  copiedToClipboard: 'copied to clipboard',
8075
8210
  failedToCopyToClipboard: 'Failed to copy to clipboard',
8076
8211
  downloadNotAvailable: 'Download not available for this file',
@@ -8097,9 +8232,19 @@ const DEFAULT_RUNTIME_BROWSER_MESSAGES = {
8097
8232
  mappingRemoved: 'Data mapping removed',
8098
8233
  failedToSaveMapping: 'Failed to save data mapping',
8099
8234
  failedToLoadMapping: 'Failed to load data mapping',
8235
+ treeMoveToRootUnsupported: 'Moving item to the root of the tree is not supported',
8236
+ treeMoveOnRootUnsupported: 'Moving item on the root of the tree is not supported',
8237
+ mappingHeader: 'MAPPING',
8238
+ mappingSourceDataPoint: 'Source Data Point',
8239
+ mappingAddMapping: '+ Add Mapping',
8240
+ mappingSaveAll: 'Save All Mappings',
8241
+ mappingNotSet: '(not set)',
8242
+ mappingSelect: 'Select...',
8243
+ mappingNoneConfigured: 'No data point mappings configured yet.',
8100
8244
  };
8101
8245
 
8102
8246
  class DataMappingListComponent {
8247
+ messages;
8103
8248
  mappings = [];
8104
8249
  /**
8105
8250
  * The runtime entity whose data points feed the Source Data Point picker.
@@ -8152,29 +8297,29 @@ class DataMappingListComponent {
8152
8297
  trashIcon = trashIcon;
8153
8298
  linkIcon = hyperlinkOpenIcon;
8154
8299
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DataMappingListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8155
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DataMappingListComponent, isStandalone: true, selector: "mm-data-mapping-list", inputs: { mappings: "mappings", sourceEntity: "sourceEntity", expressionValidator: "expressionValidator" }, outputs: { addMapping: "addMapping", removeMapping: "removeMapping", selectTarget: "selectTarget", selectSourceAttribute: "selectSourceAttribute", selectTargetAttribute: "selectTargetAttribute", mappingChanged: "mappingChanged", navigateToTarget: "navigateToTarget", saveAll: "saveAll" }, ngImport: i0, template: `
8300
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DataMappingListComponent, isStandalone: true, selector: "mm-data-mapping-list", inputs: { messages: "messages", mappings: "mappings", sourceEntity: "sourceEntity", expressionValidator: "expressionValidator" }, outputs: { addMapping: "addMapping", removeMapping: "removeMapping", selectTarget: "selectTarget", selectSourceAttribute: "selectSourceAttribute", selectTargetAttribute: "selectTargetAttribute", mappingChanged: "mappingChanged", navigateToTarget: "navigateToTarget", saveAll: "saveAll" }, ngImport: i0, template: `
8156
8301
  <div class="mapping-list">
8157
8302
  <div class="mapping-toolbar">
8158
8303
  <button kendoButton themeColor="primary" size="small" [svgIcon]="plusIcon"
8159
- (click)="addMapping.emit()">Add Mapping</button>
8304
+ (click)="addMapping.emit()">{{ messages?.mappingAddMapping ?? '+ Add Mapping' }}</button>
8160
8305
  </div>
8161
8306
 
8162
8307
  @if (mappings.length === 0) {
8163
8308
  <div class="mapping-empty-hint">
8164
- No data point mappings configured yet.
8309
+ {{ messages?.mappingNoneConfigured ?? 'No data point mappings configured yet.' }}
8165
8310
  </div>
8166
8311
  }
8167
8312
 
8168
8313
  @for (mapping of mappings; track mapping.rtId ?? $index) {
8169
8314
  <div class="mapping-card">
8170
8315
  <div class="mapping-card-header">
8171
- <span class="mapping-name">{{ mapping.name || 'Mapping ' + ($index + 1) }}</span>
8316
+ <span class="mapping-name">{{ mapping.name || ((messages?.mappingHeader ?? 'MAPPING') + ' ' + ($index + 1)) }}</span>
8172
8317
  <button kendoButton fillMode="flat" size="small" [svgIcon]="trashIcon"
8173
8318
  (click)="removeMapping.emit(mapping)"></button>
8174
8319
  </div>
8175
8320
  <div class="mapping-card-body">
8176
8321
  <div class="mapping-row">
8177
- <label>Source Data Point</label>
8322
+ <label>{{ messages?.mappingSourceDataPoint ?? 'Source Data Point' }}</label>
8178
8323
  <mm-data-point-picker
8179
8324
  [entity]="sourceEntity"
8180
8325
  [value]="mapping.sourceAttributePath || 'currentValue'"
@@ -8182,9 +8327,9 @@ class DataMappingListComponent {
8182
8327
  </mm-data-point-picker>
8183
8328
  </div>
8184
8329
  <div class="mapping-row">
8185
- <label>Expression</label>
8330
+ <label>{{ messages?.mappingExpression ?? 'Expression' }}</label>
8186
8331
  <kendo-textbox [(value)]="mapping.mappingExpression"
8187
- placeholder="e.g. value > 0 ? value : 0"
8332
+ [placeholder]="messages?.mappingExpressionHint ?? 'e.g. value > 0 ? value : 0'"
8188
8333
  (valueChange)="onExpressionChange(mapping, $event)">
8189
8334
  </kendo-textbox>
8190
8335
  @if (mapping.mappingExpression && expressionValidator) {
@@ -8196,7 +8341,7 @@ class DataMappingListComponent {
8196
8341
  }
8197
8342
  </div>
8198
8343
  <div class="mapping-row">
8199
- <label>Target Entity</label>
8344
+ <label>{{ messages?.mappingTarget ?? 'Target Entity' }}</label>
8200
8345
  @if (mapping.targetRtId) {
8201
8346
  <div class="entity-info-display">
8202
8347
  <div class="entity-info-main">
@@ -8213,23 +8358,23 @@ class DataMappingListComponent {
8213
8358
  <span class="entity-detail-item">{{ mapping.targetRtId }}</span>
8214
8359
  </div>
8215
8360
  <button kendoButton fillMode="flat" size="small"
8216
- (click)="selectTarget.emit(mapping)">Change...</button>
8361
+ (click)="selectTarget.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8217
8362
  </div>
8218
8363
  } @else {
8219
8364
  <div class="target-display">
8220
- <span class="target-info">(not set)</span>
8365
+ <span class="target-info">{{ messages?.mappingNotSet ?? '(not set)' }}</span>
8221
8366
  <button kendoButton fillMode="flat" size="small"
8222
- (click)="selectTarget.emit(mapping)">Select...</button>
8367
+ (click)="selectTarget.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8223
8368
  </div>
8224
8369
  }
8225
8370
  </div>
8226
8371
  <div class="mapping-row">
8227
- <label>Target Attribute</label>
8372
+ <label>{{ messages?.mappingTargetAttributePath ?? 'Target Attribute' }}</label>
8228
8373
  <div class="target-display">
8229
- <span class="target-info">{{ mapping.targetAttributePath || '(not set)' }}</span>
8374
+ <span class="target-info">{{ mapping.targetAttributePath || (messages?.mappingNotSet ?? '(not set)') }}</span>
8230
8375
  <button kendoButton fillMode="flat" size="small"
8231
8376
  [disabled]="!mapping.targetCkTypeId"
8232
- (click)="selectTargetAttribute.emit(mapping)">Select...</button>
8377
+ (click)="selectTargetAttribute.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8233
8378
  </div>
8234
8379
  </div>
8235
8380
  </div>
@@ -8239,7 +8384,7 @@ class DataMappingListComponent {
8239
8384
  @if (mappings.length > 0) {
8240
8385
  <div class="mapping-actions">
8241
8386
  <button kendoButton themeColor="primary" (click)="saveAll.emit()">
8242
- Save All Mappings
8387
+ {{ messages?.mappingSaveAll ?? 'Save All Mappings' }}
8243
8388
  </button>
8244
8389
  </div>
8245
8390
  }
@@ -8259,25 +8404,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8259
8404
  <div class="mapping-list">
8260
8405
  <div class="mapping-toolbar">
8261
8406
  <button kendoButton themeColor="primary" size="small" [svgIcon]="plusIcon"
8262
- (click)="addMapping.emit()">Add Mapping</button>
8407
+ (click)="addMapping.emit()">{{ messages?.mappingAddMapping ?? '+ Add Mapping' }}</button>
8263
8408
  </div>
8264
8409
 
8265
8410
  @if (mappings.length === 0) {
8266
8411
  <div class="mapping-empty-hint">
8267
- No data point mappings configured yet.
8412
+ {{ messages?.mappingNoneConfigured ?? 'No data point mappings configured yet.' }}
8268
8413
  </div>
8269
8414
  }
8270
8415
 
8271
8416
  @for (mapping of mappings; track mapping.rtId ?? $index) {
8272
8417
  <div class="mapping-card">
8273
8418
  <div class="mapping-card-header">
8274
- <span class="mapping-name">{{ mapping.name || 'Mapping ' + ($index + 1) }}</span>
8419
+ <span class="mapping-name">{{ mapping.name || ((messages?.mappingHeader ?? 'MAPPING') + ' ' + ($index + 1)) }}</span>
8275
8420
  <button kendoButton fillMode="flat" size="small" [svgIcon]="trashIcon"
8276
8421
  (click)="removeMapping.emit(mapping)"></button>
8277
8422
  </div>
8278
8423
  <div class="mapping-card-body">
8279
8424
  <div class="mapping-row">
8280
- <label>Source Data Point</label>
8425
+ <label>{{ messages?.mappingSourceDataPoint ?? 'Source Data Point' }}</label>
8281
8426
  <mm-data-point-picker
8282
8427
  [entity]="sourceEntity"
8283
8428
  [value]="mapping.sourceAttributePath || 'currentValue'"
@@ -8285,9 +8430,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8285
8430
  </mm-data-point-picker>
8286
8431
  </div>
8287
8432
  <div class="mapping-row">
8288
- <label>Expression</label>
8433
+ <label>{{ messages?.mappingExpression ?? 'Expression' }}</label>
8289
8434
  <kendo-textbox [(value)]="mapping.mappingExpression"
8290
- placeholder="e.g. value > 0 ? value : 0"
8435
+ [placeholder]="messages?.mappingExpressionHint ?? 'e.g. value > 0 ? value : 0'"
8291
8436
  (valueChange)="onExpressionChange(mapping, $event)">
8292
8437
  </kendo-textbox>
8293
8438
  @if (mapping.mappingExpression && expressionValidator) {
@@ -8299,7 +8444,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8299
8444
  }
8300
8445
  </div>
8301
8446
  <div class="mapping-row">
8302
- <label>Target Entity</label>
8447
+ <label>{{ messages?.mappingTarget ?? 'Target Entity' }}</label>
8303
8448
  @if (mapping.targetRtId) {
8304
8449
  <div class="entity-info-display">
8305
8450
  <div class="entity-info-main">
@@ -8316,23 +8461,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8316
8461
  <span class="entity-detail-item">{{ mapping.targetRtId }}</span>
8317
8462
  </div>
8318
8463
  <button kendoButton fillMode="flat" size="small"
8319
- (click)="selectTarget.emit(mapping)">Change...</button>
8464
+ (click)="selectTarget.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8320
8465
  </div>
8321
8466
  } @else {
8322
8467
  <div class="target-display">
8323
- <span class="target-info">(not set)</span>
8468
+ <span class="target-info">{{ messages?.mappingNotSet ?? '(not set)' }}</span>
8324
8469
  <button kendoButton fillMode="flat" size="small"
8325
- (click)="selectTarget.emit(mapping)">Select...</button>
8470
+ (click)="selectTarget.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8326
8471
  </div>
8327
8472
  }
8328
8473
  </div>
8329
8474
  <div class="mapping-row">
8330
- <label>Target Attribute</label>
8475
+ <label>{{ messages?.mappingTargetAttributePath ?? 'Target Attribute' }}</label>
8331
8476
  <div class="target-display">
8332
- <span class="target-info">{{ mapping.targetAttributePath || '(not set)' }}</span>
8477
+ <span class="target-info">{{ mapping.targetAttributePath || (messages?.mappingNotSet ?? '(not set)') }}</span>
8333
8478
  <button kendoButton fillMode="flat" size="small"
8334
8479
  [disabled]="!mapping.targetCkTypeId"
8335
- (click)="selectTargetAttribute.emit(mapping)">Select...</button>
8480
+ (click)="selectTargetAttribute.emit(mapping)">{{ messages?.mappingSelect ?? 'Select...' }}</button>
8336
8481
  </div>
8337
8482
  </div>
8338
8483
  </div>
@@ -8342,13 +8487,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8342
8487
  @if (mappings.length > 0) {
8343
8488
  <div class="mapping-actions">
8344
8489
  <button kendoButton themeColor="primary" (click)="saveAll.emit()">
8345
- Save All Mappings
8490
+ {{ messages?.mappingSaveAll ?? 'Save All Mappings' }}
8346
8491
  </button>
8347
8492
  </div>
8348
8493
  }
8349
8494
  </div>
8350
8495
  `, styles: [".mapping-list{display:flex;flex-direction:column;gap:12px}.mapping-toolbar{display:flex;justify-content:flex-end}.mapping-empty-hint{text-align:center;padding:16px;color:var(--kendo-color-subtle, #6c757d);font-size:.85rem}.mapping-card{border:1px solid var(--kendo-color-border, #dee2e6);border-radius:6px;overflow:hidden}.mapping-card-header{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-on-primary, #ffffff);background:var(--kendo-color-primary, #ff6358)}.mapping-card-header .mapping-name{flex:1}.mapping-card-body{padding:10px 12px;display:flex;flex-direction:column;gap:8px}.mapping-row{display:flex;flex-direction:column;gap:3px}.mapping-row label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.target-display{display:flex;align-items:center;gap:8px;padding:4px 8px;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px;background:var(--kendo-color-surface-alt, #f8f9fa);min-height:30px}.target-display .target-info{flex:1;font-size:.85rem;font-family:monospace}.mapping-actions{display:flex;justify-content:flex-end;padding-top:4px}.entity-info-display{display:flex;flex-direction:column;gap:2px;padding:4px 8px;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px;background:var(--kendo-color-surface-alt, #f8f9fa)}.entity-info-main{display:flex;align-items:center;gap:4px}.entity-name{flex:1;font-size:.85rem;font-weight:600}.entity-info-details{display:flex;align-items:center;gap:2px;font-size:.7rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d)}.entity-detail-separator{color:var(--kendo-color-subtle, #6c757d)}.expression-feedback{font-size:.75rem;padding:2px 0;font-family:monospace}.expression-error{color:var(--kendo-color-error, #dc3545)}.expression-success{color:var(--kendo-color-success, #28a745)}\n"] }]
8351
- }], propDecorators: { mappings: [{
8496
+ }], propDecorators: { messages: [{
8497
+ type: Input
8498
+ }], mappings: [{
8352
8499
  type: Input
8353
8500
  }], sourceEntity: [{
8354
8501
  type: Input
@@ -8765,6 +8912,7 @@ class EntityDetailViewComponent {
8765
8912
  [data]="propertyGridItems"
8766
8913
  [config]="propertyGridConfig"
8767
8914
  [showTypeColumn]="true"
8915
+ [messages]="_messages.propertyGrid"
8768
8916
  (propertyChange)="propertyChange.emit($event)"
8769
8917
  (binaryDownload)="onBinaryDownload($event)"
8770
8918
  >
@@ -8833,6 +8981,7 @@ class EntityDetailViewComponent {
8833
8981
  [pageable]="{ buttonCount: 3, pageSizes: [10, 20, 50] }"
8834
8982
  [pageSize]="20"
8835
8983
  [selectable]="{ mode: 'single', enabled: true }"
8984
+ [messages]="_messages.listView ?? {}"
8836
8985
  [columns]="[
8837
8986
  {
8838
8987
  field: 'ckAssociationRoleId',
@@ -8875,6 +9024,7 @@ class EntityDetailViewComponent {
8875
9024
  <ng-template kendoTabContent>
8876
9025
  <div class="tab-content mapping-tab">
8877
9026
  <mm-data-mapping-list
9027
+ [messages]="_messages"
8878
9028
  [mappings]="dataMappings"
8879
9029
  [sourceEntity]="entity"
8880
9030
  [expressionValidator]="expressionValidator"
@@ -8893,7 +9043,7 @@ class EntityDetailViewComponent {
8893
9043
  </kendo-tabstrip>
8894
9044
  </div>
8895
9045
  }
8896
- `, isInline: true, styles: [".loading-state,.error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;text-align:center;min-height:200px}.loading-state .error-message,.error-state .error-message{margin-bottom:16px;font-family:Roboto,sans-serif;color:#e74c3c}.entity-content{flex:1;display:flex;flex-direction:column;gap:24px}.entity-content .basic-info-card{padding:20px 24px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;position:relative;box-shadow:0 4px 20px #0006,0 0 15px var(--octo-mint-08)}.entity-content .basic-info-card:before{content:\"\";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(180deg,var(--octo-mint),var(--neo-cyan),var(--royal-violet));box-shadow:0 0 10px var(--octo-mint-50);border-radius:4px 0 0 4px}.entity-content .basic-info-card .basic-info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px}.entity-content .basic-info-card .basic-info-grid .info-item{display:flex;flex-direction:column;gap:8px}.entity-content .basic-info-card .basic-info-grid .info-item label{font-family:Montserrat,sans-serif;font-weight:600;font-size:.75rem;letter-spacing:.5px;text-transform:uppercase;color:var(--octo-mint-80)}.entity-content .basic-info-card .basic-info-grid .info-item .value{font-family:Roboto Mono,monospace;font-size:.875rem;color:rgba(var(--octo-text-color),.9);word-break:break-word;background:var(--deep-sea-40);padding:8px 12px;border-radius:4px;border:1px solid var(--octo-mint-15)}.entity-content .basic-info-card .basic-info-grid .info-item.with-action .value-with-action{display:flex;align-items:center}.entity-content .basic-info-card .basic-info-grid .info-item.with-action .value-with-action .value{flex:1;font-family:Roboto Mono,monospace;font-size:.875rem;color:rgba(var(--octo-text-color),.9);word-break:break-word}.entity-content .entity-tabs{flex:1;min-height:400px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;overflow:hidden;position:relative}.entity-content .entity-tabs:before{content:\"\";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(180deg,var(--octo-mint),var(--neo-cyan),var(--royal-violet));box-shadow:0 0 10px var(--octo-mint-50);z-index:1}.entity-content .entity-tabs ::ng-deep .k-tabstrip{background:transparent}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper{background:linear-gradient(90deg,var(--octo-mint-10),transparent);border-bottom:1px solid var(--octo-mint-20);padding-left:20px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item{background:transparent;border:none;color:rgba(var(--octo-text-color),.7);font-family:Montserrat,sans-serif;font-weight:600;font-size:.8rem;letter-spacing:.5px;text-transform:uppercase;padding:12px 20px;margin-right:4px;border-radius:4px 4px 0 0;transition:all .2s ease}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item:hover{background:var(--octo-mint-10);color:var(--octo-mint)}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item.k-active{background:linear-gradient(180deg,var(--octo-mint-20),transparent);color:var(--octo-mint);border-bottom:2px solid var(--octo-mint);box-shadow:0 0 10px var(--octo-mint-30)}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-content{background:transparent;border:none;padding:0}.entity-content .entity-tabs .tab-content{padding:20px 24px;height:100%;overflow-y:auto}.entity-content .entity-tabs .tab-content .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 40px;text-align:center}.entity-content .entity-tabs .tab-content .empty-state kendo-svgicon{font-size:64px;margin-bottom:20px;color:var(--octo-mint-40);text-shadow:0 0 20px var(--octo-mint-30)}.entity-content .entity-tabs .tab-content .empty-state p{margin:0;font-family:Montserrat,sans-serif;font-size:.9rem;color:rgba(var(--octo-text-color),.5);letter-spacing:.5px}.entity-content .entity-tabs .tab-content.properties-tab{padding:0;height:100%}.entity-content .entity-tabs .tab-content.properties-tab mm-property-grid{display:block;height:100%;width:100%}.entity-content .entity-tabs .tab-content.associations-tab{display:flex;flex-direction:column;gap:16px;padding:0;height:100%}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:16px;padding:16px 20px;background:linear-gradient(90deg,var(--octo-mint-05),transparent);border-bottom:1px solid var(--octo-mint-20)}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group{display:flex;align-items:center;gap:10px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group label{font-family:Montserrat,sans-serif;font-weight:600;font-size:.75rem;letter-spacing:.5px;text-transform:uppercase;color:var(--octo-mint-80);white-space:nowrap}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-dropdownlist{width:160px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-textbox{width:220px}.entity-content .entity-tabs .tab-content.associations-tab mm-list-view{flex:1;display:block;height:calc(100% - 70px)}.entity-content .entity-tabs .tab-content.mapping-tab{padding:12px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty{display:flex;flex-direction:column;align-items:center;padding:24px 20px;text-align:center}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty kendo-svgicon{font-size:36px;margin-bottom:10px;opacity:.5}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty p{margin:0 0 12px;font-size:.85rem;color:var(--kendo-color-subtle, #6c757d)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-config{display:flex;flex-direction:column;gap:20px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section{border:1px solid var(--kendo-color-border, #dee2e6);border-radius:6px;overflow:hidden}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section .section-header{padding:8px 14px;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--kendo-color-on-primary, #ffffff);background:var(--kendo-color-primary, #ff6358)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section .section-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-field{display:flex;flex-direction:column;gap:4px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-field label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display{display:flex;align-items:center;gap:8px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display .target-type{font-size:.75rem;color:var(--kendo-color-subtle, #6c757d);font-family:monospace;padding:2px 6px;border-radius:3px;background:var(--kendo-color-surface-alt, #f8f9fa);border:1px solid var(--kendo-color-border, #dee2e6)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display .target-name{font-weight:600;flex:1}.entity-content .entity-tabs .tab-content.mapping-tab .field-hint{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);font-style:italic;line-height:1.3}.entity-content .entity-tabs .tab-content.mapping-tab .attribute-picker{display:flex;align-items:center;gap:8px;padding:4px 10px;border-radius:4px;border:1px solid var(--kendo-color-border, #dee2e6);background:var(--kendo-color-surface-alt, #f8f9fa);min-height:32px}.entity-content .entity-tabs .tab-content.mapping-tab .attribute-picker .attribute-value{flex:1;font-family:monospace;font-size:.85rem}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-actions{display:flex;gap:8px;justify-content:flex-end;padding-top:4px}@media(max-width:768px){.entity-content{gap:16px}.entity-content .basic-info-card{padding:16px 20px}.entity-content .basic-info-card .basic-info-grid{grid-template-columns:1fr;gap:16px}.entity-content .entity-tabs{min-height:300px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper{padding-left:12px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item{padding:10px 14px;font-size:.75rem}.entity-content .entity-tabs .tab-content{padding:16px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar{flex-direction:column;align-items:flex-start;gap:12px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group{width:100%}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-dropdownlist,.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-textbox{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TabStripModule }, { kind: "component", type: i1$4.TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: i1$4.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i1$4.TabContentDirective, selector: "[kendoTabContent]" }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "ngmodule", type: DropDownListModule }, { kind: "component", type: i3$1.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "ngmodule", type: TextBoxModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: PropertyGridComponent, selector: "mm-property-grid", inputs: ["data", "config", "showTypeColumn"], outputs: ["propertyChange", "saveRequested", "binaryDownload"] }, { kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked"] }, { kind: "directive", type: EntityAssociationsDataSourceDirective, selector: "[mmEntityAssociationsDataSource]", exportAs: ["mmEntityAssociationsDataSource"] }, { kind: "component", type: DataMappingListComponent, selector: "mm-data-mapping-list", inputs: ["mappings", "sourceEntity", "expressionValidator"], outputs: ["addMapping", "removeMapping", "selectTarget", "selectSourceAttribute", "selectTargetAttribute", "mappingChanged", "navigateToTarget", "saveAll"] }] });
9046
+ `, isInline: true, styles: [".loading-state,.error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;text-align:center;min-height:200px}.loading-state .error-message,.error-state .error-message{margin-bottom:16px;font-family:Roboto,sans-serif;color:#e74c3c}.entity-content{flex:1;display:flex;flex-direction:column;gap:24px}.entity-content .basic-info-card{padding:20px 24px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;position:relative;box-shadow:0 4px 20px #0006,0 0 15px var(--octo-mint-08)}.entity-content .basic-info-card:before{content:\"\";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(180deg,var(--octo-mint),var(--neo-cyan),var(--royal-violet));box-shadow:0 0 10px var(--octo-mint-50);border-radius:4px 0 0 4px}.entity-content .basic-info-card .basic-info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px}.entity-content .basic-info-card .basic-info-grid .info-item{display:flex;flex-direction:column;gap:8px}.entity-content .basic-info-card .basic-info-grid .info-item label{font-family:Montserrat,sans-serif;font-weight:600;font-size:.75rem;letter-spacing:.5px;text-transform:uppercase;color:var(--octo-mint-80)}.entity-content .basic-info-card .basic-info-grid .info-item .value{font-family:Roboto Mono,monospace;font-size:.875rem;color:rgba(var(--octo-text-color),.9);word-break:break-word;background:var(--deep-sea-40);padding:8px 12px;border-radius:4px;border:1px solid var(--octo-mint-15)}.entity-content .basic-info-card .basic-info-grid .info-item.with-action .value-with-action{display:flex;align-items:center}.entity-content .basic-info-card .basic-info-grid .info-item.with-action .value-with-action .value{flex:1;font-family:Roboto Mono,monospace;font-size:.875rem;color:rgba(var(--octo-text-color),.9);word-break:break-word}.entity-content .entity-tabs{flex:1;min-height:400px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;overflow:hidden;position:relative}.entity-content .entity-tabs:before{content:\"\";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(180deg,var(--octo-mint),var(--neo-cyan),var(--royal-violet));box-shadow:0 0 10px var(--octo-mint-50);z-index:1}.entity-content .entity-tabs ::ng-deep .k-tabstrip{background:transparent}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper{background:linear-gradient(90deg,var(--octo-mint-10),transparent);border-bottom:1px solid var(--octo-mint-20);padding-left:20px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item{background:transparent;border:none;color:rgba(var(--octo-text-color),.7);font-family:Montserrat,sans-serif;font-weight:600;font-size:.8rem;letter-spacing:.5px;text-transform:uppercase;padding:12px 20px;margin-right:4px;border-radius:4px 4px 0 0;transition:all .2s ease}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item:hover{background:var(--octo-mint-10);color:var(--octo-mint)}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item.k-active{background:linear-gradient(180deg,var(--octo-mint-20),transparent);color:var(--octo-mint);border-bottom:2px solid var(--octo-mint);box-shadow:0 0 10px var(--octo-mint-30)}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-content{background:transparent;border:none;padding:0}.entity-content .entity-tabs .tab-content{padding:20px 24px;height:100%;overflow-y:auto}.entity-content .entity-tabs .tab-content .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 40px;text-align:center}.entity-content .entity-tabs .tab-content .empty-state kendo-svgicon{font-size:64px;margin-bottom:20px;color:var(--octo-mint-40);text-shadow:0 0 20px var(--octo-mint-30)}.entity-content .entity-tabs .tab-content .empty-state p{margin:0;font-family:Montserrat,sans-serif;font-size:.9rem;color:rgba(var(--octo-text-color),.5);letter-spacing:.5px}.entity-content .entity-tabs .tab-content.properties-tab{padding:0;height:100%}.entity-content .entity-tabs .tab-content.properties-tab mm-property-grid{display:block;height:100%;width:100%}.entity-content .entity-tabs .tab-content.associations-tab{display:flex;flex-direction:column;gap:16px;padding:0;height:100%}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:16px;padding:16px 20px;background:linear-gradient(90deg,var(--octo-mint-05),transparent);border-bottom:1px solid var(--octo-mint-20)}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group{display:flex;align-items:center;gap:10px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group label{font-family:Montserrat,sans-serif;font-weight:600;font-size:.75rem;letter-spacing:.5px;text-transform:uppercase;color:var(--octo-mint-80);white-space:nowrap}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-dropdownlist{width:160px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-textbox{width:220px}.entity-content .entity-tabs .tab-content.associations-tab mm-list-view{flex:1;display:block;height:calc(100% - 70px)}.entity-content .entity-tabs .tab-content.mapping-tab{padding:12px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty{display:flex;flex-direction:column;align-items:center;padding:24px 20px;text-align:center}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty kendo-svgicon{font-size:36px;margin-bottom:10px;opacity:.5}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-empty p{margin:0 0 12px;font-size:.85rem;color:var(--kendo-color-subtle, #6c757d)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-config{display:flex;flex-direction:column;gap:20px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section{border:1px solid var(--kendo-color-border, #dee2e6);border-radius:6px;overflow:hidden}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section .section-header{padding:8px 14px;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--kendo-color-on-primary, #ffffff);background:var(--kendo-color-primary, #ff6358)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-section .section-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-field{display:flex;flex-direction:column;gap:4px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-field label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display{display:flex;align-items:center;gap:8px}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display .target-type{font-size:.75rem;color:var(--kendo-color-subtle, #6c757d);font-family:monospace;padding:2px 6px;border-radius:3px;background:var(--kendo-color-surface-alt, #f8f9fa);border:1px solid var(--kendo-color-border, #dee2e6)}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-target-display .target-name{font-weight:600;flex:1}.entity-content .entity-tabs .tab-content.mapping-tab .field-hint{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);font-style:italic;line-height:1.3}.entity-content .entity-tabs .tab-content.mapping-tab .attribute-picker{display:flex;align-items:center;gap:8px;padding:4px 10px;border-radius:4px;border:1px solid var(--kendo-color-border, #dee2e6);background:var(--kendo-color-surface-alt, #f8f9fa);min-height:32px}.entity-content .entity-tabs .tab-content.mapping-tab .attribute-picker .attribute-value{flex:1;font-family:monospace;font-size:.85rem}.entity-content .entity-tabs .tab-content.mapping-tab .mapping-actions{display:flex;gap:8px;justify-content:flex-end;padding-top:4px}@media(max-width:768px){.entity-content{gap:16px}.entity-content .basic-info-card{padding:16px 20px}.entity-content .basic-info-card .basic-info-grid{grid-template-columns:1fr;gap:16px}.entity-content .entity-tabs{min-height:300px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper{padding-left:12px}.entity-content .entity-tabs ::ng-deep .k-tabstrip .k-tabstrip-items-wrapper .k-tabstrip-items .k-item{padding:10px 14px;font-size:.75rem}.entity-content .entity-tabs .tab-content{padding:16px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar{flex-direction:column;align-items:flex-start;gap:12px}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group{width:100%}.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-dropdownlist,.entity-content .entity-tabs .tab-content.associations-tab .associations-toolbar .filter-group kendo-textbox{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TabStripModule }, { kind: "component", type: i1$4.TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: i1$4.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i1$4.TabContentDirective, selector: "[kendoTabContent]" }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "ngmodule", type: DropDownListModule }, { kind: "component", type: i3$1.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "ngmodule", type: TextBoxModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: PropertyGridComponent, selector: "mm-property-grid", inputs: ["data", "config", "showTypeColumn", "messages"], outputs: ["propertyChange", "saveRequested", "binaryDownload"] }, { kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked"] }, { kind: "directive", type: EntityAssociationsDataSourceDirective, selector: "[mmEntityAssociationsDataSource]", exportAs: ["mmEntityAssociationsDataSource"] }, { kind: "component", type: DataMappingListComponent, selector: "mm-data-mapping-list", inputs: ["messages", "mappings", "sourceEntity", "expressionValidator"], outputs: ["addMapping", "removeMapping", "selectTarget", "selectSourceAttribute", "selectTargetAttribute", "mappingChanged", "navigateToTarget", "saveAll"] }] });
8897
9047
  }
8898
9048
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: EntityDetailViewComponent, decorators: [{
8899
9049
  type: Component,
@@ -9014,6 +9164,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9014
9164
  [data]="propertyGridItems"
9015
9165
  [config]="propertyGridConfig"
9016
9166
  [showTypeColumn]="true"
9167
+ [messages]="_messages.propertyGrid"
9017
9168
  (propertyChange)="propertyChange.emit($event)"
9018
9169
  (binaryDownload)="onBinaryDownload($event)"
9019
9170
  >
@@ -9082,6 +9233,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9082
9233
  [pageable]="{ buttonCount: 3, pageSizes: [10, 20, 50] }"
9083
9234
  [pageSize]="20"
9084
9235
  [selectable]="{ mode: 'single', enabled: true }"
9236
+ [messages]="_messages.listView ?? {}"
9085
9237
  [columns]="[
9086
9238
  {
9087
9239
  field: 'ckAssociationRoleId',
@@ -9124,6 +9276,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9124
9276
  <ng-template kendoTabContent>
9125
9277
  <div class="tab-content mapping-tab">
9126
9278
  <mm-data-mapping-list
9279
+ [messages]="_messages"
9127
9280
  [mappings]="dataMappings"
9128
9281
  [sourceEntity]="entity"
9129
9282
  [expressionValidator]="expressionValidator"
@@ -9314,6 +9467,10 @@ class EntityDetailComponent {
9314
9467
  attributeSelectorDialog = inject(AttributeSelectorDialogService);
9315
9468
  destroy$ = new Subject();
9316
9469
  arrowLeftIcon = arrowLeftIcon;
9470
+ _messages = { ...DEFAULT_RUNTIME_BROWSER_MESSAGES };
9471
+ set messages(value) {
9472
+ this._messages = { ...DEFAULT_RUNTIME_BROWSER_MESSAGES, ...(value ?? {}) };
9473
+ }
9317
9474
  showDataMapping = true;
9318
9475
  entity = null;
9319
9476
  loading = false;
@@ -9332,7 +9489,7 @@ class EntityDetailComponent {
9332
9489
  await this.loadEntity();
9333
9490
  }
9334
9491
  catch (error) {
9335
- this.error = 'Invalid entity ID format';
9492
+ this.error = this._messages.entityIdInvalidFormat ?? 'Invalid entity ID format';
9336
9493
  console.error('Failed to decode entity ID:', error);
9337
9494
  }
9338
9495
  }
@@ -9351,7 +9508,7 @@ class EntityDetailComponent {
9351
9508
  try {
9352
9509
  this.entity = await this.dataSource.fetchEntityDetails(this.entityId.rtId, this.entityId.ckTypeId);
9353
9510
  if (!this.entity) {
9354
- this.error = 'Entity not found';
9511
+ this.error = this._messages.entityNotFound ?? 'Entity not found';
9355
9512
  }
9356
9513
  else {
9357
9514
  await this.loadDataMappings();
@@ -9359,7 +9516,7 @@ class EntityDetailComponent {
9359
9516
  }
9360
9517
  catch (error) {
9361
9518
  console.error('Failed to load entity:', error);
9362
- this.error = 'Failed to load entity details';
9519
+ this.error = this._messages.failedToLoadEntityDetails ?? 'Failed to load entity details';
9363
9520
  }
9364
9521
  finally {
9365
9522
  this.loading = false;
@@ -9527,7 +9684,7 @@ class EntityDetailComponent {
9527
9684
  }));
9528
9685
  this.dataMappings = this.dataMappings.filter((m) => m.rtId !== mapping.rtId);
9529
9686
  this.notificationService.show({
9530
- content: 'Data mapping removed',
9687
+ content: this._messages.mappingRemoved ?? 'Data mapping removed',
9531
9688
  type: { style: 'success', icon: true },
9532
9689
  position: { horizontal: 'right', vertical: 'top' },
9533
9690
  hideAfter: 2000,
@@ -9618,7 +9775,7 @@ class EntityDetailComponent {
9618
9775
  m._originalTargetRtId = m.targetRtId;
9619
9776
  }
9620
9777
  this.notificationService.show({
9621
- content: 'All data mappings saved',
9778
+ content: this._messages.mappingSaved ?? 'Data mapping saved successfully',
9622
9779
  type: { style: 'success', icon: true },
9623
9780
  position: { horizontal: 'right', vertical: 'top' },
9624
9781
  hideAfter: 2000,
@@ -9628,7 +9785,7 @@ class EntityDetailComponent {
9628
9785
  catch (error) {
9629
9786
  console.error('Failed to save mappings:', error);
9630
9787
  this.notificationService.show({
9631
- content: 'Failed to save data mappings',
9788
+ content: this._messages.failedToSaveMapping ?? 'Failed to save data mapping',
9632
9789
  type: { style: 'error', icon: true },
9633
9790
  position: { horizontal: 'right', vertical: 'top' },
9634
9791
  hideAfter: 3000,
@@ -9637,7 +9794,7 @@ class EntityDetailComponent {
9637
9794
  }
9638
9795
  }
9639
9796
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: EntityDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9640
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", ngImport: i0, template: `
9797
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", inputs: { messages: "messages" }, ngImport: i0, template: `
9641
9798
  <div class="entity-detail">
9642
9799
  <div class="entity-detail-header">
9643
9800
  <button
@@ -9646,7 +9803,7 @@ class EntityDetailComponent {
9646
9803
  [svgIcon]="arrowLeftIcon"
9647
9804
  (click)="navigateBack()"
9648
9805
  >
9649
- Back
9806
+ {{ _messages.back ?? 'Back' }}
9650
9807
  </button>
9651
9808
 
9652
9809
  @if (entity) {
@@ -9665,6 +9822,7 @@ class EntityDetailComponent {
9665
9822
  [error]="error"
9666
9823
  [showDataMapping]="showDataMapping"
9667
9824
  [dataMappings]="dataMappings"
9825
+ [messages]="_messages"
9668
9826
  (retry)="loadEntity()"
9669
9827
  (propertyChange)="onPropertyChange($event)"
9670
9828
  (navigateToEntity)="navigateToEntity($event.rtId, $event.ckTypeId)"
@@ -9696,7 +9854,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9696
9854
  [svgIcon]="arrowLeftIcon"
9697
9855
  (click)="navigateBack()"
9698
9856
  >
9699
- Back
9857
+ {{ _messages.back ?? 'Back' }}
9700
9858
  </button>
9701
9859
 
9702
9860
  @if (entity) {
@@ -9715,6 +9873,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9715
9873
  [error]="error"
9716
9874
  [showDataMapping]="showDataMapping"
9717
9875
  [dataMappings]="dataMappings"
9876
+ [messages]="_messages"
9718
9877
  (retry)="loadEntity()"
9719
9878
  (propertyChange)="onPropertyChange($event)"
9720
9879
  (navigateToEntity)="navigateToEntity($event.rtId, $event.ckTypeId)"
@@ -9729,7 +9888,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9729
9888
  </mm-entity-detail-view>
9730
9889
  </div>
9731
9890
  `, styles: [":host{display:block;height:100%;width:100%}.entity-detail{height:100%;display:flex;flex-direction:column;padding:24px;box-sizing:border-box;overflow-y:auto}.entity-detail .entity-detail-header{display:flex;align-items:center;gap:20px;margin-bottom:24px;padding:20px 24px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;position:relative;box-shadow:0 4px 20px #0006,0 0 15px var(--octo-mint-08)}.entity-detail .entity-detail-header:before{content:\"\";position:absolute;top:0;left:0;width:4px;height:100%;background:linear-gradient(180deg,var(--octo-mint),var(--neo-cyan),var(--royal-violet));box-shadow:0 0 10px var(--octo-mint-50);border-radius:4px 0 0 4px}.entity-detail .entity-detail-header .header-info{flex:1}.entity-detail .entity-detail-header .header-info .entity-title h2{margin:0 0 8px;font-family:Montserrat,sans-serif;font-size:1.4rem;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--octo-text-color);text-shadow:0 0 10px rgba(0,0,0,.3)}.entity-detail .entity-detail-header .header-info .entity-type{margin:0;font-family:Roboto Mono,monospace;font-size:.8rem;background:var(--deep-sea-60);padding:6px 12px;border-radius:4px;border:1px solid var(--neo-cyan-30);display:inline-block;color:var(--neo-cyan)}.entity-detail mm-entity-detail-view{flex:1;display:flex;flex-direction:column;overflow-y:auto}@media(max-width:768px){.entity-detail{padding:16px}.entity-detail .entity-detail-header{flex-direction:column;align-items:flex-start;gap:12px;padding:16px 20px}.entity-detail .entity-detail-header .header-info .entity-title h2{font-size:1.1rem}}\n"] }]
9732
- }] });
9891
+ }], propDecorators: { messages: [{
9892
+ type: Input
9893
+ }] } });
9733
9894
 
9734
9895
  const GetCkTypeAssociationRolesDocumentDto = gql `
9735
9896
  query getCkTypeAssociationRoles($ckTypeId: String!) {
@@ -11404,18 +11565,16 @@ class AttributesGroupComponent {
11404
11565
  parentFormGroup = input.required(...(ngDevMode ? [{ debugName: "parentFormGroup" }] : /* istanbul ignore next */ []));
11405
11566
  isRecord = input(false, ...(ngDevMode ? [{ debugName: "isRecord" }] : /* istanbul ignore next */ []));
11406
11567
  initialValues = input(...(ngDevMode ? [undefined, { debugName: "initialValues" }] : /* istanbul ignore next */ []));
11568
+ _messages = { ...DEFAULT_RUNTIME_BROWSER_MESSAGES };
11569
+ set messages(value) {
11570
+ this._messages = { ...DEFAULT_RUNTIME_BROWSER_MESSAGES, ...(value ?? {}) };
11571
+ }
11407
11572
  // ─── Derived state & resource ────────────────────────────────────────────────────
11408
11573
  attributes = computed(() => this.attributesResource.value() ?? [], ...(ngDevMode ? [{ debugName: "attributes" }] : /* istanbul ignore next */ []));
11409
11574
  selectedIndices = new Map();
11410
11575
  loadedRecords = new Map();
11411
11576
  baselineValues = new Map();
11412
11577
  binaryRestrictions = { maxFileSize: 16 * 1024 * 1024 };
11413
- /** Label and tooltip for BINARY when value was restored from base64 (content is real; file name is a placeholder). */
11414
- binaryReferenceLabel = "Preview (restored from stored data)";
11415
- binaryReferenceTooltip = "Content and size are from stored data. File name is a placeholder because the original name is not stored.";
11416
- /** Label and tooltip for BINARY_LINKED when value is a reference/mockup (no content, metadata only). */
11417
- referencePreviewLabel = "Preview (reference file)";
11418
- referencePreviewTooltip = "Shows metadata of an existing file in the system; content is not loaded. Replace with a file to change.";
11419
11578
  /** True when the control value is a BINARY file restored from base64 (reference: real content, placeholder name). */
11420
11579
  isBinaryReferenceFile(attrName) {
11421
11580
  const control = this.parentFormGroup()?.get(attrName);
@@ -11701,12 +11860,12 @@ class AttributesGroupComponent {
11701
11860
  return EMPTY_INITIAL_VALUES;
11702
11861
  }
11703
11862
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AttributesGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11704
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AttributesGroupComponent, isStandalone: true, selector: "mm-attributes-group", inputs: { ckId: { classPropertyName: "ckId", publicName: "ckId", isSignal: true, isRequired: true, transformFunction: null }, parentFormGroup: { classPropertyName: "parentFormGroup", publicName: "parentFormGroup", isSignal: true, isRequired: true, transformFunction: null }, isRecord: { classPropertyName: "isRecord", publicName: "isRecord", isSignal: true, isRequired: false, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
11863
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AttributesGroupComponent, isStandalone: true, selector: "mm-attributes-group", inputs: { ckId: { classPropertyName: "ckId", publicName: "ckId", isSignal: true, isRequired: true, transformFunction: null }, parentFormGroup: { classPropertyName: "parentFormGroup", publicName: "parentFormGroup", isSignal: true, isRequired: true, transformFunction: null }, isRecord: { classPropertyName: "isRecord", publicName: "isRecord", isSignal: true, isRequired: false, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: false, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
11705
11864
  <div class="attributes-form-container" [formGroup]="parentFormGroup()">
11706
11865
  <kendo-card [style.margin-bottom.px]="10">
11707
11866
  <kendo-card-header>
11708
11867
  <div class="header-title">
11709
- <strong>{{ isRecord() ? 'Record' : 'Attributes' }}:</strong>
11868
+ <strong>{{ isRecord() ? (_messages.recordLabel ?? 'Record') : _messages.attributes }}:</strong>
11710
11869
  {{ ckId() }}
11711
11870
  </div>
11712
11871
  </kendo-card-header>
@@ -11732,8 +11891,7 @@ class AttributesGroupComponent {
11732
11891
  @if (attr.isOptional) {
11733
11892
  <div class="record-actions-info">
11734
11893
  <p class="record-actions-description">
11735
- Add records to this array. Remove to delete the selected
11736
- record. Empty arrays are not saved.
11894
+ {{ _messages.recordArrayHint }}
11737
11895
  </p>
11738
11896
  </div>
11739
11897
  }
@@ -11758,6 +11916,7 @@ class AttributesGroupComponent {
11758
11916
  [isRecord]="true"
11759
11917
  [parentFormGroup]="asFormGroup(item)"
11760
11918
  [initialValues]="getRawInitialValue(attr.attributeName, $index)"
11919
+ [messages]="_messages"
11761
11920
  />
11762
11921
  </div>
11763
11922
  </ng-template>
@@ -11770,7 +11929,7 @@ class AttributesGroupComponent {
11770
11929
  style="margin-top: 10px; display: flex; gap: 8px;"
11771
11930
  >
11772
11931
  <button kendoButton size="small" (click)="addRecord(attr)">
11773
- Add
11932
+ {{ _messages.addRecord }}
11774
11933
  </button>
11775
11934
  <button
11776
11935
  kendoButton
@@ -11780,7 +11939,7 @@ class AttributesGroupComponent {
11780
11939
  [disabled]="!canRemoveRecord(attr)"
11781
11940
  (click)="removeRecord(attr)"
11782
11941
  >
11783
- Remove
11942
+ {{ _messages.removeRecord }}
11784
11943
  </button>
11785
11944
  </div>
11786
11945
  </div>
@@ -11799,8 +11958,7 @@ class AttributesGroupComponent {
11799
11958
  @if (attr.isOptional) {
11800
11959
  <div class="record-actions-info">
11801
11960
  <p class="record-actions-description">
11802
- Load attributes to edit this optional record. Unload to
11803
- remove all data and clear validation.
11961
+ {{ _messages.recordHint }}
11804
11962
  </p>
11805
11963
  </div>
11806
11964
  }
@@ -11814,6 +11972,7 @@ class AttributesGroupComponent {
11814
11972
  asFormGroup(parentFormGroup().get(attr.attributeName)!)
11815
11973
  "
11816
11974
  [initialValues]="getRawInitialValue(attr.attributeName)"
11975
+ [messages]="_messages"
11817
11976
  />
11818
11977
  </div>
11819
11978
  }
@@ -11826,7 +11985,7 @@ class AttributesGroupComponent {
11826
11985
  [disabled]="isRecordLoaded(attr.attributeName)"
11827
11986
  (click)="loadRecord(attr)"
11828
11987
  >
11829
- Load
11988
+ {{ _messages.loadRecord }}
11830
11989
  </button>
11831
11990
  <button
11832
11991
  kendoButton
@@ -11836,7 +11995,7 @@ class AttributesGroupComponent {
11836
11995
  [disabled]="!isRecordLoaded(attr.attributeName)"
11837
11996
  (click)="unloadRecord(attr)"
11838
11997
  >
11839
- Unload
11998
+ {{ _messages.unloadRecord }}
11840
11999
  </button>
11841
12000
  </div>
11842
12001
  }
@@ -11860,14 +12019,15 @@ class AttributesGroupComponent {
11860
12019
  class="geospatial-grid"
11861
12020
  >
11862
12021
  <mm-attribute-field
11863
- [hintText]="'The longitude of the point on the Earth surface (-180 to 180 degrees).'"
12022
+ [hintText]="_messages.longitudeHint ?? ''"
11864
12023
  [attribute]="attr"
11865
- [overrideLabelText]="'Longitude (X)'"
12024
+ [overrideLabelText]="_messages.longitude"
11866
12025
  [control]="
11867
12026
  parentFormGroup().get(attr.attributeName + '.longitude')!
11868
12027
  "
11869
12028
  [baselineValue]="getBaselineValue(attr.attributeName + '.longitude')"
11870
12029
  [fieldId]="attr.attributeName + '_lon'"
12030
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
11871
12031
  >
11872
12032
  <kendo-numerictextbox
11873
12033
  [focusableId]="attr.attributeName + '_lon'"
@@ -11880,14 +12040,15 @@ class AttributesGroupComponent {
11880
12040
  </mm-attribute-field>
11881
12041
 
11882
12042
  <mm-attribute-field
11883
- [hintText]="'The latitude of the point on the Earth surface (-90 to 90 degrees).'"
12043
+ [hintText]="_messages.latitudeHint ?? ''"
11884
12044
  [attribute]="attr"
11885
- [overrideLabelText]="'Latitude (Y)'"
12045
+ [overrideLabelText]="_messages.latitude"
11886
12046
  [control]="
11887
12047
  parentFormGroup().get(attr.attributeName + '.latitude')!
11888
12048
  "
11889
12049
  [baselineValue]="getBaselineValue(attr.attributeName + '.latitude')"
11890
12050
  [fieldId]="attr.attributeName + '_lat'"
12051
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
11891
12052
  >
11892
12053
  <kendo-numerictextbox
11893
12054
  [focusableId]="attr.attributeName + '_lat'"
@@ -11907,6 +12068,7 @@ class AttributesGroupComponent {
11907
12068
  [control]="parentFormGroup().get(attr.attributeName)!"
11908
12069
  [baselineValue]="getBaselineValue(attr.attributeName)"
11909
12070
  [fieldId]="attr.attributeName"
12071
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
11910
12072
  >
11911
12073
  @if (recognition.isNumber(attr.attributeValueType)) {
11912
12074
  <kendo-numerictextbox
@@ -11935,10 +12097,17 @@ class AttributesGroupComponent {
11935
12097
  [focusableId]="attr.attributeName"
11936
12098
  [formControlName]="attr.attributeName"
11937
12099
  [restrictions]="binaryRestrictions"
11938
- />
12100
+ >
12101
+ <kendo-fileselect-messages
12102
+ [dropFilesHere]="_messages.dragDrop?.dropZone ?? 'Drop files here to upload'"
12103
+ [invalidMaxFileSize]="_messages.dragDrop?.errorFileTooBig ?? 'File size too large.'"
12104
+ [invalidFileExtension]="_messages.dragDrop?.errorInvalidType ?? 'File type not allowed.'"
12105
+ [fileStatusFailed]="_messages.dragDrop?.errorUploadFailed ?? 'File failed to upload.'"
12106
+ />
12107
+ </kendo-fileselect>
11939
12108
  @if (isBinaryReferenceFile(attr.attributeName)) {
11940
- <span class="binary-linked-reference-hint" [title]="binaryReferenceTooltip">
11941
- {{ binaryReferenceLabel }}
12109
+ <span class="binary-linked-reference-hint" [title]="_messages.binaryReference?.tooltip ?? 'Content and size are from stored data. File name is a placeholder because the original name is not stored.'">
12110
+ {{ _messages.binaryReference?.label ?? 'Preview (restored from stored data)' }}
11942
12111
  </span>
11943
12112
  }
11944
12113
  </div>
@@ -11948,10 +12117,17 @@ class AttributesGroupComponent {
11948
12117
  [multiple]="false"
11949
12118
  [focusableId]="attr.attributeName"
11950
12119
  [formControlName]="attr.attributeName"
11951
- />
12120
+ >
12121
+ <kendo-fileselect-messages
12122
+ [dropFilesHere]="_messages.dragDrop?.dropZone ?? 'Drop files here to upload'"
12123
+ [invalidMaxFileSize]="_messages.dragDrop?.errorFileTooBig ?? 'File size too large.'"
12124
+ [invalidFileExtension]="_messages.dragDrop?.errorInvalidType ?? 'File type not allowed.'"
12125
+ [fileStatusFailed]="_messages.dragDrop?.errorUploadFailed ?? 'File failed to upload.'"
12126
+ />
12127
+ </kendo-fileselect>
11952
12128
  @if (isReferencePreviewFile(attr.attributeName)) {
11953
- <span class="binary-linked-reference-hint" [title]="referencePreviewTooltip">
11954
- {{ referencePreviewLabel }}
12129
+ <span class="binary-linked-reference-hint" [title]="_messages.referencePreview?.tooltip ?? 'Shows metadata of an existing file in the system; content is not loaded. Replace with a file to change.'">
12130
+ {{ _messages.referencePreview?.label ?? 'Preview (reference file)' }}
11955
12131
  </span>
11956
12132
  }
11957
12133
  </div>
@@ -11986,7 +12162,7 @@ class AttributesGroupComponent {
11986
12162
  </kendo-card-body>
11987
12163
  </kendo-card>
11988
12164
  </div>
11989
- `, isInline: true, styles: [".attributes-form-container ::ng-deep kendo-card kendo-card-body{display:flex;flex-direction:column;gap:16px}.attributes-form-container ::ng-deep kendo-label{display:flex;flex-direction:column;gap:4px}.attributes-form-container ::ng-deep kendo-label label{text-transform:uppercase}.header-content{display:flex;flex-direction:column;gap:4px}.record-array-content,.tab-content-wrapper{display:flex;flex-direction:column;gap:16px}.record-actions-info{display:flex;flex-direction:column;gap:12px;padding:16px;background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));border:1px solid var(--kendo-color-border, rgba(0, 0, 0, .1));border-radius:4px;margin-bottom:16px}.record-actions-description{margin:0;font-size:13px;color:var(--kendo-color-subtle, rgba(0, 0, 0, .6));line-height:1.5}.record-array-actions{display:flex;gap:8px;justify-content:flex-start;padding-top:0}.record-actions{margin-top:16px;display:flex;gap:8px;justify-content:flex-start;padding-top:0}.binary-linked-wrap{display:flex;flex-direction:column;gap:6px}.binary-linked-reference-hint{font-size:.75rem;color:var(--kendo-color-primary, #0f6dff);font-style:italic}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => AttributesGroupComponent), selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }, { kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatusGroup), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupDirective), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormControlName), selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupName), selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i0.forwardRef(() => i1$4.CardComponent), selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i0.forwardRef(() => i1$4.CardBodyComponent), selector: "kendo-card-body" }, { kind: "component", type: i0.forwardRef(() => i1$4.CardHeaderComponent), selector: "kendo-card-header" }, { kind: "component", type: i0.forwardRef(() => i1$4.ExpansionPanelComponent), selector: "kendo-expansionpanel", inputs: ["title", "subtitle", "disabled", "expanded", "svgExpandIcon", "svgCollapseIcon", "expandIcon", "collapseIcon", "animation"], outputs: ["expandedChange", "action", "expand", "collapse"], exportAs: ["kendoExpansionPanel"] }, { kind: "directive", type: i0.forwardRef(() => i1$4.ExpansionPanelTitleDirective), selector: "[kendoExpansionPanelTitleDirective]" }, { kind: "component", type: i0.forwardRef(() => i1$4.TabStripComponent), selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: i0.forwardRef(() => i1$4.TabStripTabComponent), selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i0.forwardRef(() => i1$4.TabContentDirective), selector: "[kendoTabContent]" }, { kind: "component", type: i0.forwardRef(() => i5.TextBoxComponent), selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i0.forwardRef(() => i5.NumericTextBoxComponent), selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "component", type: i0.forwardRef(() => i5.SwitchComponent), selector: "kendo-switch", inputs: ["focusableId", "onLabel", "offLabel", "checked", "disabled", "readonly", "tabindex", "size", "thumbRounded", "trackRounded", "tabIndex"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoSwitch"] }, { kind: "component", type: i0.forwardRef(() => i1$5.LabelComponent), selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "component", type: i0.forwardRef(() => i1$1.ButtonComponent), selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i0.forwardRef(() => i3$1.DropDownListComponent), selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "component", type: i0.forwardRef(() => i3$1.MultiSelectComponent), selector: "kendo-multiselect", inputs: ["showStickyHeader", "focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer", "inputAttributes"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { kind: "component", type: i0.forwardRef(() => i7.DateTimePickerComponent), selector: "kendo-datetimepicker", inputs: ["focusableId", "weekDaysFormat", "showOtherMonthDays", "value", "format", "twoDigitYearMax", "tabindex", "disabledDates", "popupSettings", "adaptiveTitle", "adaptiveSubtitle", "disabled", "readonly", "readOnlyInput", "cancelButton", "formatPlaceholder", "placeholder", "steps", "focusedDate", "calendarType", "animateCalendarNavigation", "weekNumber", "min", "max", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "clearButton", "autoFill", "adaptiveMode", "inputAttributes", "defaultTab", "size", "rounded", "fillMode", "headerTemplate", "footerTemplate", "footer"], outputs: ["valueChange", "open", "close", "focus", "blur", "escape"], exportAs: ["kendo-datetimepicker"] }, { kind: "component", type: i0.forwardRef(() => i7.TimePickerComponent), selector: "kendo-timepicker", inputs: ["focusableId", "disabled", "readonly", "readOnlyInput", "clearButton", "format", "formatPlaceholder", "placeholder", "min", "max", "incompleteDateValidation", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "cancelButton", "nowButton", "steps", "popupSettings", "tabindex", "tabIndex", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "adaptiveMode", "value", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-timepicker"] }, { kind: "component", type: i0.forwardRef(() => i8.FileSelectComponent), selector: "kendo-fileselect", inputs: ["name"], outputs: ["valueChange"], exportAs: ["kendoFileSelect"] }, { kind: "component", type: i0.forwardRef(() => AttributeFieldComponent), selector: "mm-attribute-field", inputs: ["attribute", "control", "baselineValue", "fieldId", "overrideLabelText", "showUndoButton", "undoButtonSize", "errorMessage", "hintText"], outputs: ["undo"] }] });
12165
+ `, isInline: true, styles: [".attributes-form-container ::ng-deep kendo-card kendo-card-body{display:flex;flex-direction:column;gap:16px}.attributes-form-container ::ng-deep kendo-label{display:flex;flex-direction:column;gap:4px}.attributes-form-container ::ng-deep kendo-label label{text-transform:uppercase}.header-content{display:flex;flex-direction:column;gap:4px}.record-array-content,.tab-content-wrapper{display:flex;flex-direction:column;gap:16px}.record-actions-info{display:flex;flex-direction:column;gap:12px;padding:16px;background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));border:1px solid var(--kendo-color-border, rgba(0, 0, 0, .1));border-radius:4px;margin-bottom:16px}.record-actions-description{margin:0;font-size:13px;color:var(--kendo-color-subtle, rgba(0, 0, 0, .6));line-height:1.5}.record-array-actions{display:flex;gap:8px;justify-content:flex-start;padding-top:0}.record-actions{margin-top:16px;display:flex;gap:8px;justify-content:flex-start;padding-top:0}.binary-linked-wrap{display:flex;flex-direction:column;gap:6px}.binary-linked-reference-hint{font-size:.75rem;color:var(--kendo-color-primary, #0f6dff);font-style:italic}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => AttributesGroupComponent), selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues", "messages"] }, { kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatusGroup), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupDirective), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormControlName), selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupName), selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i0.forwardRef(() => i1$4.CardComponent), selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i0.forwardRef(() => i1$4.CardBodyComponent), selector: "kendo-card-body" }, { kind: "component", type: i0.forwardRef(() => i1$4.CardHeaderComponent), selector: "kendo-card-header" }, { kind: "component", type: i0.forwardRef(() => i1$4.ExpansionPanelComponent), selector: "kendo-expansionpanel", inputs: ["title", "subtitle", "disabled", "expanded", "svgExpandIcon", "svgCollapseIcon", "expandIcon", "collapseIcon", "animation"], outputs: ["expandedChange", "action", "expand", "collapse"], exportAs: ["kendoExpansionPanel"] }, { kind: "directive", type: i0.forwardRef(() => i1$4.ExpansionPanelTitleDirective), selector: "[kendoExpansionPanelTitleDirective]" }, { kind: "component", type: i0.forwardRef(() => i1$4.TabStripComponent), selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: i0.forwardRef(() => i1$4.TabStripTabComponent), selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i0.forwardRef(() => i1$4.TabContentDirective), selector: "[kendoTabContent]" }, { kind: "component", type: i0.forwardRef(() => i5.TextBoxComponent), selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i0.forwardRef(() => i5.NumericTextBoxComponent), selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "component", type: i0.forwardRef(() => i5.SwitchComponent), selector: "kendo-switch", inputs: ["focusableId", "onLabel", "offLabel", "checked", "disabled", "readonly", "tabindex", "size", "thumbRounded", "trackRounded", "tabIndex"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoSwitch"] }, { kind: "component", type: i0.forwardRef(() => i1$5.LabelComponent), selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "component", type: i0.forwardRef(() => i1$1.ButtonComponent), selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i0.forwardRef(() => i3$1.DropDownListComponent), selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "component", type: i0.forwardRef(() => i3$1.MultiSelectComponent), selector: "kendo-multiselect", inputs: ["showStickyHeader", "focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer", "inputAttributes"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { kind: "component", type: i0.forwardRef(() => i7.DateTimePickerComponent), selector: "kendo-datetimepicker", inputs: ["focusableId", "weekDaysFormat", "showOtherMonthDays", "value", "format", "twoDigitYearMax", "tabindex", "disabledDates", "popupSettings", "adaptiveTitle", "adaptiveSubtitle", "disabled", "readonly", "readOnlyInput", "cancelButton", "formatPlaceholder", "placeholder", "steps", "focusedDate", "calendarType", "animateCalendarNavigation", "weekNumber", "min", "max", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "clearButton", "autoFill", "adaptiveMode", "inputAttributes", "defaultTab", "size", "rounded", "fillMode", "headerTemplate", "footerTemplate", "footer"], outputs: ["valueChange", "open", "close", "focus", "blur", "escape"], exportAs: ["kendo-datetimepicker"] }, { kind: "component", type: i0.forwardRef(() => i7.TimePickerComponent), selector: "kendo-timepicker", inputs: ["focusableId", "disabled", "readonly", "readOnlyInput", "clearButton", "format", "formatPlaceholder", "placeholder", "min", "max", "incompleteDateValidation", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "cancelButton", "nowButton", "steps", "popupSettings", "tabindex", "tabIndex", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "adaptiveMode", "value", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-timepicker"] }, { kind: "component", type: i0.forwardRef(() => i8.FileSelectComponent), selector: "kendo-fileselect", inputs: ["name"], outputs: ["valueChange"], exportAs: ["kendoFileSelect"] }, { kind: "component", type: i0.forwardRef(() => i8.CustomMessagesComponent), selector: "kendo-upload-messages, kendo-fileselect-messages, kendo-uploaddropzone-messages" }, { kind: "component", type: i0.forwardRef(() => AttributeFieldComponent), selector: "mm-attribute-field", inputs: ["attribute", "control", "baselineValue", "fieldId", "overrideLabelText", "showUndoButton", "undoButtonSize", "errorMessage", "hintText"], outputs: ["undo"] }] });
11990
12166
  }
11991
12167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AttributesGroupComponent, decorators: [{
11992
12168
  type: Component,
@@ -12007,7 +12183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12007
12183
  <kendo-card [style.margin-bottom.px]="10">
12008
12184
  <kendo-card-header>
12009
12185
  <div class="header-title">
12010
- <strong>{{ isRecord() ? 'Record' : 'Attributes' }}:</strong>
12186
+ <strong>{{ isRecord() ? (_messages.recordLabel ?? 'Record') : _messages.attributes }}:</strong>
12011
12187
  {{ ckId() }}
12012
12188
  </div>
12013
12189
  </kendo-card-header>
@@ -12033,8 +12209,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12033
12209
  @if (attr.isOptional) {
12034
12210
  <div class="record-actions-info">
12035
12211
  <p class="record-actions-description">
12036
- Add records to this array. Remove to delete the selected
12037
- record. Empty arrays are not saved.
12212
+ {{ _messages.recordArrayHint }}
12038
12213
  </p>
12039
12214
  </div>
12040
12215
  }
@@ -12059,6 +12234,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12059
12234
  [isRecord]="true"
12060
12235
  [parentFormGroup]="asFormGroup(item)"
12061
12236
  [initialValues]="getRawInitialValue(attr.attributeName, $index)"
12237
+ [messages]="_messages"
12062
12238
  />
12063
12239
  </div>
12064
12240
  </ng-template>
@@ -12071,7 +12247,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12071
12247
  style="margin-top: 10px; display: flex; gap: 8px;"
12072
12248
  >
12073
12249
  <button kendoButton size="small" (click)="addRecord(attr)">
12074
- Add
12250
+ {{ _messages.addRecord }}
12075
12251
  </button>
12076
12252
  <button
12077
12253
  kendoButton
@@ -12081,7 +12257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12081
12257
  [disabled]="!canRemoveRecord(attr)"
12082
12258
  (click)="removeRecord(attr)"
12083
12259
  >
12084
- Remove
12260
+ {{ _messages.removeRecord }}
12085
12261
  </button>
12086
12262
  </div>
12087
12263
  </div>
@@ -12100,8 +12276,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12100
12276
  @if (attr.isOptional) {
12101
12277
  <div class="record-actions-info">
12102
12278
  <p class="record-actions-description">
12103
- Load attributes to edit this optional record. Unload to
12104
- remove all data and clear validation.
12279
+ {{ _messages.recordHint }}
12105
12280
  </p>
12106
12281
  </div>
12107
12282
  }
@@ -12115,6 +12290,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12115
12290
  asFormGroup(parentFormGroup().get(attr.attributeName)!)
12116
12291
  "
12117
12292
  [initialValues]="getRawInitialValue(attr.attributeName)"
12293
+ [messages]="_messages"
12118
12294
  />
12119
12295
  </div>
12120
12296
  }
@@ -12127,7 +12303,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12127
12303
  [disabled]="isRecordLoaded(attr.attributeName)"
12128
12304
  (click)="loadRecord(attr)"
12129
12305
  >
12130
- Load
12306
+ {{ _messages.loadRecord }}
12131
12307
  </button>
12132
12308
  <button
12133
12309
  kendoButton
@@ -12137,7 +12313,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12137
12313
  [disabled]="!isRecordLoaded(attr.attributeName)"
12138
12314
  (click)="unloadRecord(attr)"
12139
12315
  >
12140
- Unload
12316
+ {{ _messages.unloadRecord }}
12141
12317
  </button>
12142
12318
  </div>
12143
12319
  }
@@ -12161,14 +12337,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12161
12337
  class="geospatial-grid"
12162
12338
  >
12163
12339
  <mm-attribute-field
12164
- [hintText]="'The longitude of the point on the Earth surface (-180 to 180 degrees).'"
12340
+ [hintText]="_messages.longitudeHint ?? ''"
12165
12341
  [attribute]="attr"
12166
- [overrideLabelText]="'Longitude (X)'"
12342
+ [overrideLabelText]="_messages.longitude"
12167
12343
  [control]="
12168
12344
  parentFormGroup().get(attr.attributeName + '.longitude')!
12169
12345
  "
12170
12346
  [baselineValue]="getBaselineValue(attr.attributeName + '.longitude')"
12171
12347
  [fieldId]="attr.attributeName + '_lon'"
12348
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
12172
12349
  >
12173
12350
  <kendo-numerictextbox
12174
12351
  [focusableId]="attr.attributeName + '_lon'"
@@ -12181,14 +12358,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12181
12358
  </mm-attribute-field>
12182
12359
 
12183
12360
  <mm-attribute-field
12184
- [hintText]="'The latitude of the point on the Earth surface (-90 to 90 degrees).'"
12361
+ [hintText]="_messages.latitudeHint ?? ''"
12185
12362
  [attribute]="attr"
12186
- [overrideLabelText]="'Latitude (Y)'"
12363
+ [overrideLabelText]="_messages.latitude"
12187
12364
  [control]="
12188
12365
  parentFormGroup().get(attr.attributeName + '.latitude')!
12189
12366
  "
12190
12367
  [baselineValue]="getBaselineValue(attr.attributeName + '.latitude')"
12191
12368
  [fieldId]="attr.attributeName + '_lat'"
12369
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
12192
12370
  >
12193
12371
  <kendo-numerictextbox
12194
12372
  [focusableId]="attr.attributeName + '_lat'"
@@ -12208,6 +12386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12208
12386
  [control]="parentFormGroup().get(attr.attributeName)!"
12209
12387
  [baselineValue]="getBaselineValue(attr.attributeName)"
12210
12388
  [fieldId]="attr.attributeName"
12389
+ [errorMessage]="_messages.attributeField?.errorMessage ?? 'This field is required or invalid.'"
12211
12390
  >
12212
12391
  @if (recognition.isNumber(attr.attributeValueType)) {
12213
12392
  <kendo-numerictextbox
@@ -12236,10 +12415,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12236
12415
  [focusableId]="attr.attributeName"
12237
12416
  [formControlName]="attr.attributeName"
12238
12417
  [restrictions]="binaryRestrictions"
12239
- />
12418
+ >
12419
+ <kendo-fileselect-messages
12420
+ [dropFilesHere]="_messages.dragDrop?.dropZone ?? 'Drop files here to upload'"
12421
+ [invalidMaxFileSize]="_messages.dragDrop?.errorFileTooBig ?? 'File size too large.'"
12422
+ [invalidFileExtension]="_messages.dragDrop?.errorInvalidType ?? 'File type not allowed.'"
12423
+ [fileStatusFailed]="_messages.dragDrop?.errorUploadFailed ?? 'File failed to upload.'"
12424
+ />
12425
+ </kendo-fileselect>
12240
12426
  @if (isBinaryReferenceFile(attr.attributeName)) {
12241
- <span class="binary-linked-reference-hint" [title]="binaryReferenceTooltip">
12242
- {{ binaryReferenceLabel }}
12427
+ <span class="binary-linked-reference-hint" [title]="_messages.binaryReference?.tooltip ?? 'Content and size are from stored data. File name is a placeholder because the original name is not stored.'">
12428
+ {{ _messages.binaryReference?.label ?? 'Preview (restored from stored data)' }}
12243
12429
  </span>
12244
12430
  }
12245
12431
  </div>
@@ -12249,10 +12435,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12249
12435
  [multiple]="false"
12250
12436
  [focusableId]="attr.attributeName"
12251
12437
  [formControlName]="attr.attributeName"
12252
- />
12438
+ >
12439
+ <kendo-fileselect-messages
12440
+ [dropFilesHere]="_messages.dragDrop?.dropZone ?? 'Drop files here to upload'"
12441
+ [invalidMaxFileSize]="_messages.dragDrop?.errorFileTooBig ?? 'File size too large.'"
12442
+ [invalidFileExtension]="_messages.dragDrop?.errorInvalidType ?? 'File type not allowed.'"
12443
+ [fileStatusFailed]="_messages.dragDrop?.errorUploadFailed ?? 'File failed to upload.'"
12444
+ />
12445
+ </kendo-fileselect>
12253
12446
  @if (isReferencePreviewFile(attr.attributeName)) {
12254
- <span class="binary-linked-reference-hint" [title]="referencePreviewTooltip">
12255
- {{ referencePreviewLabel }}
12447
+ <span class="binary-linked-reference-hint" [title]="_messages.referencePreview?.tooltip ?? 'Shows metadata of an existing file in the system; content is not loaded. Replace with a file to change.'">
12448
+ {{ _messages.referencePreview?.label ?? 'Preview (reference file)' }}
12256
12449
  </span>
12257
12450
  }
12258
12451
  </div>
@@ -12288,7 +12481,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12288
12481
  </kendo-card>
12289
12482
  </div>
12290
12483
  `, styles: [".attributes-form-container ::ng-deep kendo-card kendo-card-body{display:flex;flex-direction:column;gap:16px}.attributes-form-container ::ng-deep kendo-label{display:flex;flex-direction:column;gap:4px}.attributes-form-container ::ng-deep kendo-label label{text-transform:uppercase}.header-content{display:flex;flex-direction:column;gap:4px}.record-array-content,.tab-content-wrapper{display:flex;flex-direction:column;gap:16px}.record-actions-info{display:flex;flex-direction:column;gap:12px;padding:16px;background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));border:1px solid var(--kendo-color-border, rgba(0, 0, 0, .1));border-radius:4px;margin-bottom:16px}.record-actions-description{margin:0;font-size:13px;color:var(--kendo-color-subtle, rgba(0, 0, 0, .6));line-height:1.5}.record-array-actions{display:flex;gap:8px;justify-content:flex-start;padding-top:0}.record-actions{margin-top:16px;display:flex;gap:8px;justify-content:flex-start;padding-top:0}.binary-linked-wrap{display:flex;flex-direction:column;gap:6px}.binary-linked-reference-hint{font-size:.75rem;color:var(--kendo-color-primary, #0f6dff);font-style:italic}\n"] }]
12291
- }], ctorParameters: () => [], propDecorators: { ckId: [{ type: i0.Input, args: [{ isSignal: true, alias: "ckId", required: true }] }], parentFormGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentFormGroup", required: true }] }], isRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRecord", required: false }] }], initialValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValues", required: false }] }] } });
12484
+ }], ctorParameters: () => [], propDecorators: { ckId: [{ type: i0.Input, args: [{ isSignal: true, alias: "ckId", required: true }] }], parentFormGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentFormGroup", required: true }] }], isRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRecord", required: false }] }], initialValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValues", required: false }] }], messages: [{
12485
+ type: Input
12486
+ }] } });
12292
12487
  /** Stable empty array to avoid new [] references that would retrigger effects (infinite loop). */
12293
12488
  const EMPTY_INITIAL_VALUES = [];
12294
12489
 
@@ -12566,6 +12761,7 @@ class CreateEditorComponent {
12566
12761
  [allowAbstract]="false"
12567
12762
  [derivedFromRtCkTypeId]="createInput()!.derivedFromRtCkTypeId"
12568
12763
  [dialogTitle]="resolvedMessages().selectType"
12764
+ [messages]="resolvedMessages().ckTypeSelectorInput"
12569
12765
  (ckTypeSelected)="onCkTypeSelected($event)"
12570
12766
  (ckTypeCleared)="onCkTypeCleared()"
12571
12767
  >
@@ -12580,6 +12776,7 @@ class CreateEditorComponent {
12580
12776
  [ckId]="selectedRtCkTypeId()!"
12581
12777
  [parentFormGroup]="form()!"
12582
12778
  [isRecord]="false"
12779
+ [messages]="resolvedMessages()"
12583
12780
  />
12584
12781
  } @else {
12585
12782
  <p class="select-type-prompt">
@@ -12605,7 +12802,7 @@ class CreateEditorComponent {
12605
12802
  </button>
12606
12803
  </div>
12607
12804
  </div>
12608
- `, isInline: true, styles: [".entity-editor-container{display:flex;flex-direction:column;gap:16px;width:100%}.entity-editor-container ::ng-deep kendo-card{display:grid;grid-template-rows:auto 1fr;grid-template-columns:1fr 1fr;gap:16px;width:100%!important}.entity-editor-container ::ng-deep kendo-card kendo-card-header{grid-column:span 2;grid-row:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body{grid-row:2;grid-column:span 2;display:grid;grid-template-columns:1fr 1fr;gap:16px}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item{display:flex;flex-direction:column}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :first-child{grid-column:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :nth-child(2){grid-column:2}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item label{color:var(--kendo-color-subtle, rgba(0, 0, 0, .7));margin-bottom:8px;text-transform:uppercase}.entity-editor-container .attributes-form-container ::ng-deep kendo-card:not(.basic-info-card) kendo-card-body{display:flex;flex-direction:column;gap:16px}.entity-editor-container .select-type-prompt{grid-column:span 2;text-transform:uppercase;color:var(--kendo-color-primary, #0f6dff);background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));padding:16px;border-radius:8px;text-align:center;border:1px dashed var(--kendo-color-border, rgba(0, 0, 0, .1))}.entity-editor-container .entity-editor-actions{display:flex;flex-direction:row;gap:16px}.entity-editor-container .entity-editor-actions button:disabled{opacity:.6}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }] });
12805
+ `, isInline: true, styles: [".entity-editor-container{display:flex;flex-direction:column;gap:16px;width:100%}.entity-editor-container ::ng-deep kendo-card{display:grid;grid-template-rows:auto 1fr;grid-template-columns:1fr 1fr;gap:16px;width:100%!important}.entity-editor-container ::ng-deep kendo-card kendo-card-header{grid-column:span 2;grid-row:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body{grid-row:2;grid-column:span 2;display:grid;grid-template-columns:1fr 1fr;gap:16px}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item{display:flex;flex-direction:column}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :first-child{grid-column:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :nth-child(2){grid-column:2}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item label{color:var(--kendo-color-subtle, rgba(0, 0, 0, .7));margin-bottom:8px;text-transform:uppercase}.entity-editor-container .attributes-form-container ::ng-deep kendo-card:not(.basic-info-card) kendo-card-body{display:flex;flex-direction:column;gap:16px}.entity-editor-container .select-type-prompt{grid-column:span 2;text-transform:uppercase;color:var(--kendo-color-primary, #0f6dff);background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));padding:16px;border-radius:8px;text-align:center;border:1px dashed var(--kendo-color-border, rgba(0, 0, 0, .1))}.entity-editor-container .entity-editor-actions{display:flex;flex-direction:row;gap:16px}.entity-editor-container .entity-editor-actions button:disabled{opacity:.6}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "messages", "dialogMessages", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues", "messages"] }] });
12609
12806
  }
12610
12807
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CreateEditorComponent, decorators: [{
12611
12808
  type: Component,
@@ -12644,6 +12841,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12644
12841
  [allowAbstract]="false"
12645
12842
  [derivedFromRtCkTypeId]="createInput()!.derivedFromRtCkTypeId"
12646
12843
  [dialogTitle]="resolvedMessages().selectType"
12844
+ [messages]="resolvedMessages().ckTypeSelectorInput"
12647
12845
  (ckTypeSelected)="onCkTypeSelected($event)"
12648
12846
  (ckTypeCleared)="onCkTypeCleared()"
12649
12847
  >
@@ -12658,6 +12856,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12658
12856
  [ckId]="selectedRtCkTypeId()!"
12659
12857
  [parentFormGroup]="form()!"
12660
12858
  [isRecord]="false"
12859
+ [messages]="resolvedMessages()"
12661
12860
  />
12662
12861
  } @else {
12663
12862
  <p class="select-type-prompt">
@@ -12901,6 +13100,7 @@ class UpdateEditorComponent {
12901
13100
  [parentFormGroup]="form()!"
12902
13101
  [initialValues]="entityData()?.initial"
12903
13102
  [isRecord]="false"
13103
+ [messages]="resolvedMessages()"
12904
13104
  />
12905
13105
  } @else {
12906
13106
  <div class="loading-shimmer">
@@ -12926,7 +13126,7 @@ class UpdateEditorComponent {
12926
13126
  </button>
12927
13127
  </div>
12928
13128
  </div>
12929
- `, isInline: true, styles: [".entity-editor-container{display:flex;flex-direction:column;gap:16px;width:100%}.entity-editor-container ::ng-deep kendo-card{display:grid;grid-template-rows:auto 1fr;grid-template-columns:1fr 1fr;gap:16px;width:100%!important}.entity-editor-container ::ng-deep kendo-card kendo-card-header{grid-column:span 2;grid-row:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body{grid-row:2;grid-column:span 2;display:grid;grid-template-columns:1fr 1fr;gap:16px}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item{display:flex;flex-direction:column}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :first-child{grid-column:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :nth-child(2){grid-column:2}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item label{color:var(--kendo-color-subtle, rgba(0, 0, 0, .7));margin-bottom:8px;text-transform:uppercase}.entity-editor-container .attributes-form-container ::ng-deep kendo-card:not(.basic-info-card) kendo-card-body{display:flex;flex-direction:column;gap:16px}.entity-editor-container .select-type-prompt{grid-column:span 2;text-transform:uppercase;color:var(--kendo-color-primary, #0f6dff);background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));padding:16px;border-radius:8px;text-align:center;border:1px dashed var(--kendo-color-border, rgba(0, 0, 0, .1))}.entity-editor-container .entity-editor-actions{display:flex;flex-direction:row;gap:16px}.entity-editor-container .entity-editor-actions button:disabled{opacity:.6}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }] });
13129
+ `, isInline: true, styles: [".entity-editor-container{display:flex;flex-direction:column;gap:16px;width:100%}.entity-editor-container ::ng-deep kendo-card{display:grid;grid-template-rows:auto 1fr;grid-template-columns:1fr 1fr;gap:16px;width:100%!important}.entity-editor-container ::ng-deep kendo-card kendo-card-header{grid-column:span 2;grid-row:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body{grid-row:2;grid-column:span 2;display:grid;grid-template-columns:1fr 1fr;gap:16px}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item{display:flex;flex-direction:column}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :first-child{grid-column:1}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item :nth-child(2){grid-column:2}.entity-editor-container ::ng-deep kendo-card kendo-card-body .info-item label{color:var(--kendo-color-subtle, rgba(0, 0, 0, .7));margin-bottom:8px;text-transform:uppercase}.entity-editor-container .attributes-form-container ::ng-deep kendo-card:not(.basic-info-card) kendo-card-body{display:flex;flex-direction:column;gap:16px}.entity-editor-container .select-type-prompt{grid-column:span 2;text-transform:uppercase;color:var(--kendo-color-primary, #0f6dff);background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));padding:16px;border-radius:8px;text-align:center;border:1px dashed var(--kendo-color-border, rgba(0, 0, 0, .1))}.entity-editor-container .entity-editor-actions{display:flex;flex-direction:row;gap:16px}.entity-editor-container .entity-editor-actions button:disabled{opacity:.6}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$4.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$4.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$4.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues", "messages"] }] });
12930
13130
  }
12931
13131
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UpdateEditorComponent, decorators: [{
12932
13132
  type: Component,
@@ -12989,6 +13189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12989
13189
  [parentFormGroup]="form()!"
12990
13190
  [initialValues]="entityData()?.initial"
12991
13191
  [isRecord]="false"
13192
+ [messages]="resolvedMessages()"
12992
13193
  />
12993
13194
  } @else {
12994
13195
  <div class="loading-shimmer">
@@ -14183,13 +14384,13 @@ class RuntimeBrowserComponent {
14183
14384
  async onNodeDropped(event) {
14184
14385
  console.debug('Runtime Browser - Node dropped:', event);
14185
14386
  if (!event.destinationItem) {
14186
- const msg = 'Moving item to the root of the tree is not supported';
14387
+ const msg = this.resolvedMessages().treeMoveToRootUnsupported ?? 'Moving item to the root of the tree is not supported';
14187
14388
  this._showWarningNotification(msg);
14188
14389
  console.debug(msg, event);
14189
14390
  return;
14190
14391
  }
14191
14392
  if (!event.sourceParent) {
14192
- const msg = 'Moving item on the root of the tree is not supported';
14393
+ const msg = this.resolvedMessages().treeMoveOnRootUnsupported ?? 'Moving item on the root of the tree is not supported';
14193
14394
  this._showWarningNotification(msg);
14194
14395
  console.debug(msg, event);
14195
14396
  return;
@@ -17718,5 +17919,5 @@ function provideOctoUi() {
17718
17919
  * Generated bundle index. Do not edit.
17719
17920
  */
17720
17921
 
17721
- export { AssociationValidationService, AttributeSelectorDialogComponent, AttributeSelectorDialogService, AttributeSortSelectorDialogComponent, AttributeSortSelectorDialogService, AttributeValueTypeDto, CkTypeSelectorDialogComponent, CkTypeSelectorDialogService, CkTypeSelectorInputComponent, DEFAULT_DATA_POINT, DEFAULT_MAPPING_COVERAGE_TREE_CONFIG, DEFAULT_RUNTIME_BROWSER_MESSAGES, DataMappingOverviewComponent, DataPointPickerComponent, DataPointResolverService, DefaultPropertyCategory, EntityDetailComponent, EntityIdInfoComponent, EntitySelectorDialogComponent, EntitySelectorDialogService, FieldFilterEditorComponent, MappingCoverageTreeComponent, MappingCoverageTreeDataSource, MappingEditDialogComponent, MappingEditDialogService, OctoGraphQlDataSource, OctoGraphQlHierarchyDataSource, OctoLoaderComponent, PropertyConverterService, PropertyDisplayMode, PropertyGridComponent, PropertyValueDisplayComponent, RUNTIME_BROWSER_MESSAGES, RecordDetailDialogComponent, RtEntityIdHelper, RuntimeBrowserComponent, RuntimeBrowserOutletComponent, RuntimeBrowserPageComponent, RuntimeBrowserStateService, RuntimeEntityVariableDialogComponent, RuntimeEntityVariableDialogService, TenantSwitcherComponent, account_tree, add, analytics, app_registration, article, botService, category, chat, checklist, code, component_exchange, computer, createRuntimeBrowserRoutes, customer, dashboard, event_list, extractDataPointNames, graphic_eq, group, identityService, insert_link, manage_accounts, more_time, notifications, page_info, pages, person_search, playlist_add_check, pool, power, provideOctoUi, publicIcon, query_builder, schedule_send, settings, sort, storage, swagger, swagger_asset, swagger_bot, swagger_communication, swagger_identity, team_dashboard, tenancy, text_snippet, travel_explore, user_diagnostics, webhook, work };
17922
+ export { AssociationValidationService, AttributeSelectorDialogComponent, AttributeSelectorDialogService, AttributeSortSelectorDialogComponent, AttributeSortSelectorDialogService, AttributeValueTypeDto, CkTypeSelectorDialogComponent, CkTypeSelectorDialogService, CkTypeSelectorInputComponent, DEFAULT_CK_TYPE_SELECTOR_DIALOG_MESSAGES, DEFAULT_CK_TYPE_SELECTOR_INPUT_MESSAGES, DEFAULT_DATA_POINT, DEFAULT_MAPPING_COVERAGE_TREE_CONFIG, DEFAULT_PROPERTY_GRID_MESSAGES, DEFAULT_RUNTIME_BROWSER_MESSAGES, DataMappingOverviewComponent, DataPointPickerComponent, DataPointResolverService, DefaultPropertyCategory, EntityDetailComponent, EntityIdInfoComponent, EntitySelectorDialogComponent, EntitySelectorDialogService, FieldFilterEditorComponent, MappingCoverageTreeComponent, MappingCoverageTreeDataSource, MappingEditDialogComponent, MappingEditDialogService, OctoGraphQlDataSource, OctoGraphQlHierarchyDataSource, OctoLoaderComponent, PropertyConverterService, PropertyDisplayMode, PropertyGridComponent, PropertyValueDisplayComponent, RUNTIME_BROWSER_MESSAGES, RecordDetailDialogComponent, RtEntityIdHelper, RuntimeBrowserComponent, RuntimeBrowserOutletComponent, RuntimeBrowserPageComponent, RuntimeBrowserStateService, RuntimeEntityVariableDialogComponent, RuntimeEntityVariableDialogService, TenantSwitcherComponent, account_tree, add, analytics, app_registration, article, botService, category, chat, checklist, code, component_exchange, computer, createRuntimeBrowserRoutes, customer, dashboard, event_list, extractDataPointNames, graphic_eq, group, identityService, insert_link, manage_accounts, more_time, notifications, page_info, pages, person_search, playlist_add_check, pool, power, provideOctoUi, publicIcon, query_builder, schedule_send, settings, sort, storage, swagger, swagger_asset, swagger_bot, swagger_communication, swagger_identity, team_dashboard, tenancy, text_snippet, travel_explore, user_diagnostics, webhook, work };
17722
17923
  //# sourceMappingURL=meshmakers-octo-ui.mjs.map