@meshmakers/octo-ui 3.4.1070 → 3.4.1090

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.
@@ -250,8 +250,8 @@ class AttributeSortSelectorDialogComponent {
250
250
  onCancel() {
251
251
  this.windowRef.close();
252
252
  }
253
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: AttributeSortSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-sort-selector-dialog", host: { attributes: { "data-component": "attribute-sort-selector" } }, ngImport: i0, template: `
253
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: AttributeSortSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-sort-selector-dialog", host: { attributes: { "data-component": "attribute-sort-selector" } }, ngImport: i0, template: `
255
255
  <div class="attribute-sort-selector-container">
256
256
  <!-- Filter Section -->
257
257
  <div class="filter-container">
@@ -421,7 +421,7 @@ class AttributeSortSelectorDialogComponent {
421
421
  </div>
422
422
  `, isInline: true, styles: [":host{display:block;height:100%}.attribute-sort-selector-container{display:flex;flex-direction:column;height:100%;padding:16px 20px;box-sizing:border-box;gap:16px}.filter-container{display:flex;gap:12px;flex-shrink:0}.search-input{flex:1}.type-filter-dropdown{width:160px;flex-shrink:0}.lists-container{display:flex;gap:16px;flex:1;min-height:0}.list-section{flex:1;display:flex;flex-direction:column;min-height:0}.list-section h4,.sort-options-section h4{margin:0 0 10px;font-size:.85rem;font-weight:600;flex-shrink:0}.attribute-grid{border-radius:4px;flex:1;min-height:200px}.attribute-grid ::ng-deep .k-grid-table tbody tr{cursor:pointer}.sort-options-section{width:120px;flex-shrink:0;display:flex;flex-direction:column;padding-top:32px}.sort-buttons{display:flex;flex-direction:row;gap:4px}.sort-button{flex:1;min-width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center}.add-button{width:100%;margin-top:16px}.sort-display{display:flex;align-items:center;gap:6px}.sort-indicator{font-size:14px;font-weight:700;color:var(--kendo-color-primary, #ff6358)}.action-bar{display:flex;justify-content:flex-end;gap:8px;flex-shrink:0;padding-top:8px;border-top:1px solid var(--kendo-color-border, #dee2e6)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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: 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: IconsModule }, { kind: "ngmodule", type: WindowModule }], changeDetection: i0.ChangeDetectionStrategy.Eager });
423
423
  }
424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, decorators: [{
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, decorators: [{
425
425
  type: Component,
426
426
  args: [{ selector: 'mm-attribute-sort-selector-dialog', standalone: true, host: { 'data-component': 'attribute-sort-selector' }, imports: [
427
427
  CommonModule,
@@ -670,10 +670,10 @@ class AttributeSortSelectorDialogService {
670
670
  };
671
671
  }
672
672
  }
673
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSortSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
674
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSortSelectorDialogService });
673
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSortSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
674
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSortSelectorDialogService });
675
675
  }
676
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSortSelectorDialogService, decorators: [{
676
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSortSelectorDialogService, decorators: [{
677
677
  type: Injectable
678
678
  }] });
679
679
 
@@ -894,8 +894,8 @@ class CkTypeSelectorDialogComponent {
894
894
  this.windowRef.close(result);
895
895
  }
896
896
  }
897
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
898
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", inputs: { messages: "messages" }, ngImport: i0, template: `
897
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
898
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", inputs: { messages: "messages" }, ngImport: i0, template: `
899
899
  <div class="ck-type-selector-container">
900
900
  <div class="filter-container">
901
901
  <div class="filter-row">
@@ -988,7 +988,7 @@ class CkTypeSelectorDialogComponent {
988
988
  </div>
989
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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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 }], changeDetection: i0.ChangeDetectionStrategy.Eager });
990
990
  }
991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
991
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
992
992
  type: Component,
993
993
  args: [{ selector: 'mm-ck-type-selector-dialog', standalone: true, imports: [
994
994
  CommonModule,
@@ -1169,10 +1169,10 @@ class CkTypeSelectorDialogService {
1169
1169
  };
1170
1170
  }
1171
1171
  }
1172
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1173
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorDialogService });
1172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1173
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorDialogService });
1174
1174
  }
1175
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorDialogService, decorators: [{
1175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorDialogService, decorators: [{
1176
1176
  type: Injectable
1177
1177
  }] });
1178
1178
 
@@ -1556,10 +1556,10 @@ class PropertyConverterService {
1556
1556
  const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/;
1557
1557
  return isoDateRegex.test(value) && !isNaN(Date.parse(value));
1558
1558
  }
1559
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1560
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyConverterService, providedIn: 'root' });
1559
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1560
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyConverterService, providedIn: 'root' });
1561
1561
  }
1562
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyConverterService, decorators: [{
1562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyConverterService, decorators: [{
1563
1563
  type: Injectable,
1564
1564
  args: [{
1565
1565
  providedIn: 'root'
@@ -1822,8 +1822,8 @@ class RecordDetailDialogComponent {
1822
1822
  .replace(/^./, str => str.toUpperCase())
1823
1823
  .trim();
1824
1824
  }
1825
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RecordDetailDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1826
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: RecordDetailDialogComponent, isStandalone: true, selector: "mm-record-detail-dialog", inputs: { attributeName: "attributeName", value: "value", type: "type" }, outputs: { closed: "closed" }, ngImport: i0, template: `
1825
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RecordDetailDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1826
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: RecordDetailDialogComponent, isStandalone: true, selector: "mm-record-detail-dialog", inputs: { attributeName: "attributeName", value: "value", type: "type" }, outputs: { closed: "closed" }, ngImport: i0, template: `
1827
1827
  <div class="record-detail-content">
1828
1828
  @if (isRecordArray && recordItems.length > 1) {
1829
1829
  <div class="record-toolbar">
@@ -1932,7 +1932,7 @@ class RecordDetailDialogComponent {
1932
1932
  </div>
1933
1933
  `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}.record-detail-content{display:flex;flex-direction:column;height:100%;gap:8px;padding:12px 16px;box-sizing:border-box;overflow:hidden}.record-toolbar{display:flex;align-items:center;gap:8px;flex-shrink:0;padding-bottom:4px;border-bottom:1px solid var(--kendo-color-border, #dee2e6)}.toolbar-spacer{flex:1}.search-input{flex:0 1 220px;min-width:0;padding:4px 8px;font:inherit;color:var(--kendo-color-on-app-surface, #1d1b20);background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 6%,transparent);border:1px solid var(--kendo-color-border, #dee2e6);border-radius:3px;outline:none}.search-input::placeholder{color:var(--kendo-color-subtle, #6c757d)}.search-input:focus{border-color:var(--kendo-color-primary, #0d6efd)}.search-clear{flex-shrink:0;width:22px;height:22px;padding:0;background:transparent;border:none;cursor:pointer;font-size:1.1em;line-height:1;color:var(--kendo-color-subtle, #6c757d);border-radius:3px}.search-clear:hover{color:var(--kendo-color-on-app-surface, #1d1b20);background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 8%,transparent)}.match-count{flex-shrink:0;font-size:.8em;color:var(--kendo-color-subtle, #6c757d);font-style:italic}.no-matches{padding:16px;text-align:center;color:var(--kendo-color-subtle, #6c757d);font-style:italic}.record-array-list{display:flex;flex-direction:column;gap:8px;overflow-y:auto;flex:1;min-height:0}.record-array-item{display:block;flex-shrink:0;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px;overflow:hidden}.array-item-header{display:flex;align-items:center;gap:8px;padding:6px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--kendo-color-surface-alt, #f8f9fa);transition:background-color .15s ease}.array-item-header:hover{background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 6%,transparent)}.record-chevron{width:14px;height:14px;color:var(--kendo-color-subtle);flex-shrink:0}.array-item-index{font-family:Roboto Mono,monospace;font-size:.8em;font-weight:600;color:var(--kendo-color-primary, #0d6efd)}.array-item-label{font-size:.85em;color:var(--kendo-color-on-app-surface, #1d1b20);font-weight:500}.array-item-summary{margin-left:auto;font-size:.75em;color:var(--kendo-color-subtle, #6c757d);font-style:italic}.detail-grid{display:block!important;height:auto!important;border:none;border-top:1px solid var(--kendo-color-border, #dee2e6)}:host ::ng-deep .detail-grid .k-grid-aria-root{height:auto}.property-name-cell{display:flex;align-items:center;gap:8px}.type-icon{width:16px;height:16px;opacity:.7}.property-name{font-weight:500}.property-value{word-break:break-word;white-space:pre-wrap}.type-badge{font-size:.75em;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500;background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 12%,transparent);color:var(--kendo-color-on-app-surface, #1d1b20)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { 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: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
1934
1934
  }
1935
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RecordDetailDialogComponent, decorators: [{
1935
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RecordDetailDialogComponent, decorators: [{
1936
1936
  type: Component,
1937
1937
  args: [{ selector: 'mm-record-detail-dialog', standalone: true, imports: [CommonModule, ButtonModule, GridModule, SVGIconModule], template: `
1938
1938
  <div class="record-detail-content">
@@ -2085,8 +2085,15 @@ class PropertyValueDisplayComponent {
2085
2085
  recordArrayRows = [];
2086
2086
  /** Hard cap so we don't render a horizontally-unmanageable table. */
2087
2087
  static MAX_TABLE_COLUMNS = 12;
2088
- PropertyDisplayMode = PropertyDisplayMode;
2089
- AttributeValueTypeDto = AttributeValueTypeDto;
2088
+ // Exposed to the template through a getter, not a `readonly X = X` field: Vite's
2089
+ // module-runner transform (used by the Vitest unit-test builder) snapshots a class
2090
+ // field whose initialiser is a bare imported identifier at module-evaluation time,
2091
+ // which is before esbuild's lazily-initialised shared chunk has assigned the export,
2092
+ // so the field would be `undefined`.
2093
+ // A getter body is rewritten to a live read. Test-runner-only: production and
2094
+ // ng-packagr builds do not use the module runner and are unaffected.
2095
+ get PropertyDisplayMode() { return PropertyDisplayMode; }
2096
+ get AttributeValueTypeDto() { return AttributeValueTypeDto; }
2090
2097
  Array = Array;
2091
2098
  chevronRightIcon = chevronRightIcon;
2092
2099
  chevronDownIcon = chevronDownIcon;
@@ -2504,8 +2511,8 @@ class PropertyValueDisplayComponent {
2504
2511
  this.binaryDownload.emit(event);
2505
2512
  }
2506
2513
  }
2507
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyValueDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PropertyValueDisplayComponent, isStandalone: true, selector: "mm-property-value-display", inputs: { value: "value", type: "type", displayMode: "displayMode", attributeName: "attributeName" }, outputs: { binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyValueDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: PropertyValueDisplayComponent, isStandalone: true, selector: "mm-property-value-display", inputs: { value: "value", type: "type", displayMode: "displayMode", attributeName: "attributeName" }, outputs: { binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2509
2516
  <div class="property-value-display" [ngClass]="'type-' + type.toLowerCase()">
2510
2517
 
2511
2518
  @if (expandableRecord) {
@@ -2650,7 +2657,7 @@ class PropertyValueDisplayComponent {
2650
2657
  </div>
2651
2658
  `, isInline: true, styles: [".property-value-display{display:flex;align-items:flex-start;gap:8px;width:100%;min-width:0}.text-display,.default-display{word-break:break-word;white-space:pre-wrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.json-display{font-family:Roboto Mono,monospace;font-size:.8em;white-space:pre-wrap;word-break:break-word;margin:0;flex:1;min-width:0}.type-indicator{font-family:Roboto Mono,monospace;font-size:.7em;padding:1px 5px;background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 12%,transparent);border-radius:3px;color:var(--kendo-color-on-app-surface, #1d1b20);white-space:nowrap;flex-shrink:0}.expandable-record{width:100%}.record-header{display:flex;align-items:center;gap:6px;cursor:pointer;padding:2px 0;border-radius:3px;transition:background-color .15s ease}.record-header:hover{background-color:var(--kendo-color-base-subtle, rgba(0,0,0,.04))}.expand-icon{flex-shrink:0;width:14px;height:14px;color:var(--kendo-color-subtle)}.record-summary{color:var(--kendo-color-subtle);font-size:.85em;font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-button{flex-shrink:0;opacity:.6;transition:opacity .15s ease}.detail-button:hover{opacity:1}.record-content{margin-left:20px;padding-left:8px;border-left:1px solid var(--kendo-color-border, #dee2e6)}.array-item{margin:4px 0}.array-index{font-family:Roboto Mono,monospace;font-size:.8em;color:var(--kendo-color-subtle)}.record-array-list{max-height:320px;overflow-y:auto}.record-table-container{max-height:320px;overflow:auto;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:3px;margin-top:4px}.record-table{width:100%;border-collapse:collapse;font-size:.85em;table-layout:auto}.record-table th{position:sticky;top:0;z-index:1;background:var(--kendo-color-surface-alt, #f8f9fa);color:var(--kendo-color-subtle);text-align:left;padding:4px 8px;border-bottom:1px solid var(--kendo-color-border, #dee2e6);font-weight:500;font-size:.85em;white-space:nowrap}.record-table td{padding:3px 8px;border-bottom:1px solid color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 8%,transparent);vertical-align:top;word-break:break-word}.record-table tr:last-child td{border-bottom:none}.record-table tr:hover td{background:color-mix(in srgb,var(--kendo-color-on-app-surface, #1d1b20) 6%,transparent)}.record-table .row-index{color:var(--kendo-color-subtle);font-family:Roboto Mono,monospace;font-size:.85em;text-align:right;width:1px;white-space:nowrap}.nested-properties{margin-left:8px}.nested-property{display:flex;align-items:flex-start;gap:8px;padding:2px 0}.property-key{font-weight:500;white-space:nowrap;flex-shrink:0;color:var(--kendo-color-subtle);font-size:.85em}.binary-linked-display{display:flex;align-items:center;gap:12px;width:100%}.binary-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.filename{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-size{font-size:.85em;color:var(--kendo-color-subtle);flex-shrink:0}.content-type{font-size:.75em;padding:2px 6px;background:var(--kendo-color-base-subtle);border-radius:3px;color:var(--kendo-color-subtle);flex-shrink:0}\n"], dependencies: [{ kind: "component", type: PropertyValueDisplayComponent, selector: "mm-property-value-display", inputs: ["value", "type", "displayMode", "attributeName"], outputs: ["binaryDownload"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2652
2659
  }
2653
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyValueDisplayComponent, decorators: [{
2660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyValueDisplayComponent, decorators: [{
2654
2661
  type: Component,
2655
2662
  args: [{ selector: 'mm-property-value-display', standalone: true, imports: [CommonModule, SVGIconModule, ButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
2656
2663
  <div class="property-value-display" [ngClass]="'type-' + type.toLowerCase()">
@@ -2834,7 +2841,14 @@ class PropertyGridComponent {
2834
2841
  checkboxCheckedIcon = checkboxCheckedIcon;
2835
2842
  listUnorderedIcon = listUnorderedIcon;
2836
2843
  // Enum reference
2837
- AttributeValueTypeDto = AttributeValueTypeDto;
2844
+ // Exposed to the template through a getter, not a `readonly X = X` field: Vite's
2845
+ // module-runner transform (used by the Vitest unit-test builder) snapshots a class
2846
+ // field whose initialiser is a bare imported identifier at module-evaluation time,
2847
+ // which is before esbuild's lazily-initialised shared chunk has assigned the export,
2848
+ // so the field would be `undefined`.
2849
+ // A getter body is rewritten to a live read. Test-runner-only: production and
2850
+ // ng-packagr builds do not use the module runner and are unaffected.
2851
+ get AttributeValueTypeDto() { return AttributeValueTypeDto; }
2838
2852
  ngOnInit() {
2839
2853
  this.updateFilteredData();
2840
2854
  }
@@ -2954,8 +2968,8 @@ class PropertyGridComponent {
2954
2968
  onBinaryDownload(event) {
2955
2969
  this.binaryDownload.emit(event);
2956
2970
  }
2957
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2958
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", 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: `
2971
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2972
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", 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: `
2959
2973
  <div class="mm-property-grid" [style.height]="config.height || '400px'">
2960
2974
 
2961
2975
  @if (config.showSearch) {
@@ -3040,7 +3054,7 @@ class PropertyGridComponent {
3040
3054
  </div>
3041
3055
  `, isInline: true, styles: [".mm-property-grid{display:flex;flex-direction:column;border:1px solid var(--kendo-color-border);border-radius:4px;overflow:hidden}.search-toolbar{padding:8px;border-bottom:1px solid var(--kendo-color-border);background:var(--kendo-color-base-subtle)}.property-grid{flex:1;border:none}.property-name-cell{display:flex;align-items:center;gap:8px;min-height:24px}.type-icon{width:16px;height:16px;opacity:.7}.property-info{display:flex;align-items:center;gap:4px;flex:1}.property-name{font-weight:500}.required-indicator{color:var(--kendo-color-error);font-weight:700}.readonly-indicator{font-size:12px;opacity:.7}.property-editor{width:100%;min-width:200px}.validation-error{color:var(--kendo-color-error);font-size:.8em;margin-top:4px}.type-badge{font-size:.75em;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500;background:var(--kendo-color-base-subtle);color:var(--kendo-color-on-base)}.grid-toolbar{padding:8px;border-top:1px solid var(--kendo-color-border);background:var(--kendo-color-base-subtle);display:flex;align-items:center;gap:8px}.changes-indicator{margin-left:auto;font-size:.9em;color:var(--kendo-color-primary);font-style:italic}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { 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: 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: DropDownsModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }, { kind: "component", type: PropertyValueDisplayComponent, selector: "mm-property-value-display", inputs: ["value", "type", "displayMode", "attributeName"], outputs: ["binaryDownload"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
3042
3056
  }
3043
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PropertyGridComponent, decorators: [{
3057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PropertyGridComponent, decorators: [{
3044
3058
  type: Component,
3045
3059
  args: [{ selector: 'mm-property-grid', standalone: true, imports: [
3046
3060
  CommonModule,
@@ -3446,8 +3460,8 @@ class CkTypeSelectorInputComponent {
3446
3460
  this.selectCkType(result.selectedCkType);
3447
3461
  }
3448
3462
  }
3449
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", 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: [
3463
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3464
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", 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: [
3451
3465
  {
3452
3466
  provide: NG_VALUE_ACCESSOR,
3453
3467
  useExisting: forwardRef(() => CkTypeSelectorInputComponent),
@@ -3514,7 +3528,7 @@ class CkTypeSelectorInputComponent {
3514
3528
  </div>
3515
3529
  `, isInline: true, styles: [":host{display:block;width:100%}.ck-type-select-wrapper{position:relative;display:flex;align-items:center;width:100%;gap:4px}.ck-type-select-wrapper.disabled{opacity:.6;pointer-events:none}.ck-type-autocomplete{flex:1;min-width:0}.dialog-button{flex-shrink:0;height:30px;width:30px;padding:0;display:flex;align-items:center;justify-content:center}.ck-type-item{padding:4px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-data-message{padding:8px 12px;color:var(--kendo-color-subtle);font-style:italic;text-align:center}.advanced-search-footer{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;color:var(--kendo-color-primary);border-top:1px solid var(--kendo-color-border);background:var(--kendo-color-surface-alt);transition:background-color .2s}.advanced-search-footer:hover{background:var(--kendo-color-base-hover)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i3$1.AutoCompleteComponent, selector: "kendo-autocomplete", inputs: ["highlightFirst", "showStickyHeader", "focusableId", "data", "value", "valueField", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "clearButton", "suggest", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoAutoComplete"] }, { kind: "directive", type: i3$1.FooterTemplateDirective, selector: "[kendoDropDownListFooterTemplate],[kendoComboBoxFooterTemplate],[kendoDropDownTreeFooterTemplate],[kendoMultiColumnComboBoxFooterTemplate],[kendoAutoCompleteFooterTemplate],[kendoMultiSelectFooterTemplate],[kendoMultiSelectTreeFooterTemplate]" }, { kind: "directive", type: i3$1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: i3$1.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: SVGIconModule }], changeDetection: i0.ChangeDetectionStrategy.Eager });
3516
3530
  }
3517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeSelectorInputComponent, decorators: [{
3531
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeSelectorInputComponent, decorators: [{
3518
3532
  type: Component,
3519
3533
  args: [{ selector: 'mm-ck-type-selector-input', standalone: true, imports: [
3520
3534
  CommonModule,
@@ -4116,8 +4130,8 @@ class AttributeSelectorDialogComponent {
4116
4130
  this.sortAvailableAttributes();
4117
4131
  this.updateGrids();
4118
4132
  }
4119
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4120
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AttributeSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-selector-dialog", ngImport: i0, template: `
4133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4134
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: AttributeSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-selector-dialog", ngImport: i0, template: `
4121
4135
  <div class="attribute-selector-container">
4122
4136
  <div class="filter-container">
4123
4137
  <kendo-textbox
@@ -4396,7 +4410,7 @@ class AttributeSelectorDialogComponent {
4396
4410
  </div>
4397
4411
  `, isInline: true, styles: [":host{display:block;height:100%}.attribute-selector-container{display:flex;flex-direction:column;height:100%;padding:16px 20px;box-sizing:border-box;gap:16px}.filter-container{display:flex;gap:12px;flex-shrink:0}.search-input{flex:1}.type-filter-dropdown{width:160px;flex-shrink:0}.options-container{display:flex;align-items:center;gap:8px;font-size:.85rem;flex-shrink:0}.option-label{cursor:pointer}.depth-input{width:90px}.lists-container{display:flex;gap:16px;flex:1;min-height:0}.list-section{flex:1;display:flex;flex-direction:column;min-height:0}.list-section h4{margin:0 0 10px;font-size:.85rem;font-weight:600;flex-shrink:0}.attribute-grid{border-radius:4px;flex:1;min-height:200px}.attribute-grid ::ng-deep .k-grid-table tbody tr{cursor:pointer}.action-buttons{display:flex;flex-direction:column;gap:8px;justify-content:center;padding:32px 8px 0}.separator{height:1px;background-color:var(--kendo-color-border, #dee2e6);margin:8px 0}.order-buttons{display:flex;flex-direction:column;gap:8px;justify-content:center;padding:32px 8px 0}.order-number{color:var(--kendo-color-primary, #ff6358);font-weight:600;margin-right:8px;min-width:24px;display:inline-block}.single-select-container{flex:1;min-height:0;display:flex;flex-direction:column}.single-select-container .attribute-grid{flex:1}.selector-editor{display:flex;flex-direction:column;gap:8px;flex-shrink:0;padding:10px 12px;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px}.selector-editor-title{font-size:.8rem;font-weight:600}.selector-editor-title code{font-weight:400}.selector-editor-fields{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.selector-kind{width:190px;flex-shrink:0}.selector-field{min-width:180px;flex:1}.action-bar{display:flex;justify-content:flex-end;gap:8px;flex-shrink:0;padding-top:8px;border-top:1px solid var(--kendo-color-border, #dee2e6)}\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.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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: "component", type: 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: "directive", type: i5.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }, { 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: IconsModule }, { kind: "ngmodule", type: WindowModule }], changeDetection: i0.ChangeDetectionStrategy.Eager });
4398
4412
  }
4399
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSelectorDialogComponent, decorators: [{
4413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSelectorDialogComponent, decorators: [{
4400
4414
  type: Component,
4401
4415
  args: [{ selector: 'mm-attribute-selector-dialog', standalone: true, imports: [
4402
4416
  CommonModule,
@@ -4762,10 +4776,10 @@ class AttributeSelectorDialogService {
4762
4776
  };
4763
4777
  }
4764
4778
  }
4765
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4766
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSelectorDialogService, providedIn: 'root' });
4779
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4780
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSelectorDialogService, providedIn: 'root' });
4767
4781
  }
4768
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeSelectorDialogService, decorators: [{
4782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeSelectorDialogService, decorators: [{
4769
4783
  type: Injectable,
4770
4784
  args: [{
4771
4785
  providedIn: 'root'
@@ -4914,8 +4928,8 @@ class RuntimeEntityVariableDialogComponent {
4914
4928
  return true;
4915
4929
  return false;
4916
4930
  }
4917
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4918
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: RuntimeEntityVariableDialogComponent, isStandalone: true, selector: "mm-runtime-entity-variable-dialog", ngImport: i0, template: `
4931
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4932
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: RuntimeEntityVariableDialogComponent, isStandalone: true, selector: "mm-runtime-entity-variable-dialog", ngImport: i0, template: `
4919
4933
  <div class="dialog-content">
4920
4934
  <div class="form-row">
4921
4935
  <label class="form-label">CK Type</label>
@@ -4997,7 +5011,7 @@ class RuntimeEntityVariableDialogComponent {
4997
5011
  </div>
4998
5012
  `, 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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
4999
5013
  }
5000
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, decorators: [{
5014
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, decorators: [{
5001
5015
  type: Component,
5002
5016
  args: [{ selector: 'mm-runtime-entity-variable-dialog', standalone: true, imports: [
5003
5017
  CommonModule,
@@ -5132,10 +5146,10 @@ class RuntimeEntityVariableDialogService {
5132
5146
  return { confirmed: false };
5133
5147
  }
5134
5148
  }
5135
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeEntityVariableDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5136
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeEntityVariableDialogService, providedIn: 'root' });
5149
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeEntityVariableDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5150
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeEntityVariableDialogService, providedIn: 'root' });
5137
5151
  }
5138
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeEntityVariableDialogService, decorators: [{
5152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeEntityVariableDialogService, decorators: [{
5139
5153
  type: Injectable,
5140
5154
  args: [{
5141
5155
  providedIn: 'root'
@@ -5175,10 +5189,10 @@ class GetRuntimeEntityByIdDtoGQL extends i1$3.Query {
5175
5189
  constructor(apollo) {
5176
5190
  super(apollo);
5177
5191
  }
5178
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5179
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, providedIn: 'root' });
5192
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5193
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, providedIn: 'root' });
5180
5194
  }
5181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, decorators: [{
5195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, decorators: [{
5182
5196
  type: Injectable,
5183
5197
  args: [{
5184
5198
  providedIn: 'root'
@@ -5370,10 +5384,10 @@ class DataPointResolverService {
5370
5384
  return [{ name: DEFAULT_DATA_POINT }];
5371
5385
  }
5372
5386
  }
5373
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataPointResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5374
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataPointResolverService, providedIn: 'root' });
5387
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataPointResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5388
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataPointResolverService, providedIn: 'root' });
5375
5389
  }
5376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataPointResolverService, decorators: [{
5390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataPointResolverService, decorators: [{
5377
5391
  type: Injectable,
5378
5392
  args: [{ providedIn: 'root' }]
5379
5393
  }] });
@@ -5491,8 +5505,8 @@ class DataPointPickerComponent {
5491
5505
  this.filter.set(filter);
5492
5506
  this.filterChange.emit(filter);
5493
5507
  }
5494
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataPointPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5495
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: DataPointPickerComponent, isStandalone: true, selector: "mm-data-point-picker", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: false, transformFunction: null }, entityRtId: { classPropertyName: "entityRtId", publicName: "entityRtId", isSignal: true, isRequired: false, transformFunction: null }, entityCkTypeId: { classPropertyName: "entityCkTypeId", publicName: "entityCkTypeId", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", filterChange: "filterChange" }, ngImport: i0, template: `
5508
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataPointPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5509
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: DataPointPickerComponent, isStandalone: true, selector: "mm-data-point-picker", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: false, transformFunction: null }, entityRtId: { classPropertyName: "entityRtId", publicName: "entityRtId", isSignal: true, isRequired: false, transformFunction: null }, entityCkTypeId: { classPropertyName: "entityCkTypeId", publicName: "entityCkTypeId", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", filterChange: "filterChange" }, ngImport: i0, template: `
5496
5510
  <kendo-combobox
5497
5511
  [data]="filteredOptions()"
5498
5512
  [value]="value()"
@@ -5510,7 +5524,7 @@ class DataPointPickerComponent {
5510
5524
  }
5511
5525
  `, isInline: true, styles: [":host{display:inline-flex;align-items:center;gap:6px;width:100%}kendo-combobox{flex:1;min-width:0}.dpp-loading{font-size:.7rem;padding:1px 6px;border-radius:8px;background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);color:var(--kendo-color-info, #0dcaf0);font-style:italic}\n"], dependencies: [{ kind: "ngmodule", type: ComboBoxModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5512
5526
  }
5513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataPointPickerComponent, decorators: [{
5527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataPointPickerComponent, decorators: [{
5514
5528
  type: Component,
5515
5529
  args: [{ selector: 'mm-data-point-picker', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ComboBoxModule], template: `
5516
5530
  <kendo-combobox
@@ -5649,9 +5663,9 @@ class OctoGraphQlDataSource extends DataSourceTyped {
5649
5663
  case 'isnotnull':
5650
5664
  return { operator: FieldFilterOperatorsDto.NotEqualsDto, value: null };
5651
5665
  case 'isempty':
5652
- return { operator: FieldFilterOperatorsDto.EqualsDto, value: "" };
5666
+ return { operator: FieldFilterOperatorsDto.EqualsDto, value: '' };
5653
5667
  case 'isnotempty':
5654
- return { operator: FieldFilterOperatorsDto.NotEqualsDto, value: "" };
5668
+ return { operator: FieldFilterOperatorsDto.NotEqualsDto, value: '' };
5655
5669
  default:
5656
5670
  throw new Error('The filter operator is not supported');
5657
5671
  }
@@ -5728,8 +5742,8 @@ class EntityIdInfoComponent {
5728
5742
  this.notificationService.showError('Failed to copy to clipboard');
5729
5743
  }
5730
5744
  }
5731
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityIdInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5732
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: EntityIdInfoComponent, isStandalone: true, selector: "mm-entity-id-info", inputs: { rtId: "rtId", rtCkTypeId: "rtCkTypeId", ckTypeId: "ckTypeId" }, ngImport: i0, template: `
5745
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityIdInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5746
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: EntityIdInfoComponent, isStandalone: true, selector: "mm-entity-id-info", inputs: { rtId: "rtId", rtCkTypeId: "rtCkTypeId", ckTypeId: "ckTypeId" }, ngImport: i0, template: `
5733
5747
  <kendo-dropdownbutton
5734
5748
  [data]="copyOptions"
5735
5749
  [svgIcon]="copyIcon"
@@ -5747,7 +5761,7 @@ class EntityIdInfoComponent {
5747
5761
  </kendo-dropdownbutton>
5748
5762
  `, isInline: true, styles: [":host{display:inline-block}.copy-item{display:flex;flex-direction:column;gap:2px;padding:8px 12px;width:100%}.copy-label{font-size:.7rem;font-weight:600;color:var(--kendo-color-primary, #64ceb9);text-transform:uppercase;letter-spacing:.5px}.copy-value{font-family:Roboto Mono,monospace;font-size:.75rem;color:var(--kendo-color-subtle, #9292a6);word-break:break-all}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.DropDownButtonComponent, selector: "kendo-dropdownbutton", inputs: ["arrowIcon", "icon", "svgIcon", "iconClass", "imageUrl", "textField", "data", "size", "rounded", "fillMode", "themeColor", "buttonAttributes"], outputs: ["itemClick", "focus", "blur"], exportAs: ["kendoDropDownButton"] }, { kind: "directive", type: i1$1.ButtonItemTemplateDirective, selector: "[kendoDropDownButtonItemTemplate],[kendoSplitButtonItemTemplate]" }, { kind: "ngmodule", type: SVGIconModule }], changeDetection: i0.ChangeDetectionStrategy.Eager });
5749
5763
  }
5750
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityIdInfoComponent, decorators: [{
5764
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityIdInfoComponent, decorators: [{
5751
5765
  type: Component,
5752
5766
  args: [{ selector: 'mm-entity-id-info', standalone: true, imports: [
5753
5767
  CommonModule,
@@ -5794,10 +5808,10 @@ class DeleteEntitiesDtoGQL extends i1$3.Mutation {
5794
5808
  constructor(apollo) {
5795
5809
  super(apollo);
5796
5810
  }
5797
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DeleteEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5798
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DeleteEntitiesDtoGQL, providedIn: 'root' });
5811
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DeleteEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5812
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DeleteEntitiesDtoGQL, providedIn: 'root' });
5799
5813
  }
5800
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DeleteEntitiesDtoGQL, decorators: [{
5814
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DeleteEntitiesDtoGQL, decorators: [{
5801
5815
  type: Injectable,
5802
5816
  args: [{
5803
5817
  providedIn: 'root'
@@ -5837,10 +5851,10 @@ class GetCkModelsDtoGQL extends i1$3.Query {
5837
5851
  constructor(apollo) {
5838
5852
  super(apollo);
5839
5853
  }
5840
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkModelsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5841
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkModelsDtoGQL, providedIn: 'root' });
5854
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkModelsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5855
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkModelsDtoGQL, providedIn: 'root' });
5842
5856
  }
5843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkModelsDtoGQL, decorators: [{
5857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkModelsDtoGQL, decorators: [{
5844
5858
  type: Injectable,
5845
5859
  args: [{
5846
5860
  providedIn: 'root'
@@ -5897,10 +5911,10 @@ class GetCkTypeAssociationRolesDtoGQL extends i1$3.Query {
5897
5911
  constructor(apollo) {
5898
5912
  super(apollo);
5899
5913
  }
5900
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5901
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, providedIn: 'root' });
5914
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5915
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, providedIn: 'root' });
5902
5916
  }
5903
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, decorators: [{
5917
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, decorators: [{
5904
5918
  type: Injectable,
5905
5919
  args: [{
5906
5920
  providedIn: 'root'
@@ -5945,10 +5959,10 @@ class GetRuntimeEntityAssociationsByIdDtoGQL extends i1$3.Query {
5945
5959
  constructor(apollo) {
5946
5960
  super(apollo);
5947
5961
  }
5948
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5949
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, providedIn: 'root' });
5962
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5963
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, providedIn: 'root' });
5950
5964
  }
5951
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, decorators: [{
5965
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, decorators: [{
5952
5966
  type: Injectable,
5953
5967
  args: [{
5954
5968
  providedIn: 'root'
@@ -5986,10 +6000,10 @@ class GetTreeAssociationTargetsDtoGQL extends i1$3.Query {
5986
6000
  constructor(apollo) {
5987
6001
  super(apollo);
5988
6002
  }
5989
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5990
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, providedIn: 'root' });
6003
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6004
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, providedIn: 'root' });
5991
6005
  }
5992
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, decorators: [{
6006
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreeAssociationTargetsDtoGQL, decorators: [{
5993
6007
  type: Injectable,
5994
6008
  args: [{
5995
6009
  providedIn: 'root'
@@ -6024,10 +6038,10 @@ class GetTreesDtoGQL extends i1$3.Query {
6024
6038
  constructor(apollo) {
6025
6039
  super(apollo);
6026
6040
  }
6027
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6028
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreesDtoGQL, providedIn: 'root' });
6041
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6042
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreesDtoGQL, providedIn: 'root' });
6029
6043
  }
6030
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetTreesDtoGQL, decorators: [{
6044
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetTreesDtoGQL, decorators: [{
6031
6045
  type: Injectable,
6032
6046
  args: [{
6033
6047
  providedIn: 'root'
@@ -6056,10 +6070,10 @@ class UpdateRuntimeEntitiesDtoGQL extends i1$3.Mutation {
6056
6070
  constructor(apollo) {
6057
6071
  super(apollo);
6058
6072
  }
6059
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6060
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, providedIn: 'root' });
6073
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6074
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, providedIn: 'root' });
6061
6075
  }
6062
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, decorators: [{
6076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, decorators: [{
6063
6077
  type: Injectable,
6064
6078
  args: [{
6065
6079
  providedIn: 'root'
@@ -6082,10 +6096,10 @@ class UpdateTreeNodesDtoGQL extends i1$3.Mutation {
6082
6096
  constructor(apollo) {
6083
6097
  super(apollo);
6084
6098
  }
6085
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6086
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, providedIn: 'root' });
6099
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6100
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, providedIn: 'root' });
6087
6101
  }
6088
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, decorators: [{
6102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, decorators: [{
6089
6103
  type: Injectable,
6090
6104
  args: [{
6091
6105
  providedIn: 'root'
@@ -6198,7 +6212,7 @@ const swagger_communication = {
6198
6212
  viewBox: '0 0 192 192'
6199
6213
  };
6200
6214
  const swagger = {
6201
- name: "swagger",
6215
+ name: 'swagger',
6202
6216
  content: '<path id="path1" class="st0" d="M96,0C43.1,0,0,43,0,96s43.1,96,96,96,96-43,96-96S148.9,0,96,0ZM96,9.2c48,0,86.8,38.9,86.8,86.8s-38.9,86.8-86.8,86.8S9.2,143.9,9.2,96,48,9.2,96,9.2ZM67,46.9h-3.4c-7.9.5-12.5,4.1-13.9,11.8-.9,5.4-.7,10.7-1.1,16.1,0,2.8-.4,5.5-.9,8.3-1,4.9-3.2,6.4-8.2,6.6-.7,0-1.3,0-2,.3v11.6c9.1.5,10.2,3.7,10.9,13,.3,3.4,0,6.9,0,10.3s.6,6.4,1.3,9.6c2,8.6,10.5,11.5,20.6,9.8v-10.3h-4.5c-3.4,0-4.7-.9-5-4.3-.4-4.3-.3-8.6-.6-13-.6-8-1.4-15.9-9.2-21,4-2.9,6.9-6.4,7.9-11.2.7-3.2,1-6.6,1.3-10s0-6.7,0-10c.4-5.4.9-7.5,7.2-7.3h2.9v-10.4h-3.6.4ZM127.6,47c-2.2,0-4.3,0-6.5.5v10.3h5c2.6,0,4.6,1.1,4.9,4,.3,2.6.3,5.4.6,8.1.6,5.4.9,10.7,1.7,16.1.9,4.3,3.7,7.7,7.5,10.3-6.6,4.4-8.5,10.7-8.8,17.8,0,4.9-.3,9.6-.6,14.5-.3,4.4-1.7,5.8-6.2,6h-3.9v10.4h7.5c7.5-.5,11.9-4.1,13.5-11.3.6-4,1-8,1.1-12.1.3-3.7.3-7.3.6-11,.6-5.7,3.2-8.1,8.9-8.4.6,0,1,0,1.6-.3v-11.6c-1,0-1.6,0-2.3-.3-4.3,0-6.5-1.7-7.5-5.7-.7-2.6-1-5.2-1.3-8-.3-4.9-.3-10-.6-14.9-.6-9.5-6.3-14.1-15.1-14.2,0,0-.3,0-.3,0ZM72.6,89.3c-3.7,0-6.8,3.1-6.8,6.7s2.6,6.4,6.2,6.7h.4c3.6,0,6.8-2.6,7-6.3v-.3c0-3.7-2.9-6.7-6.6-6.9,0,0-.3,0-.3,0ZM95.9,89.3c-3.6,0-6.6,2.6-6.6,6.3v.6c0,4,2.7,6.6,6.9,6.6s6.6-2.6,6.6-6.9-2.7-6.7-6.9-6.6h0ZM119.6,89.3c-3.7,0-6.9,2.9-7,6.7,0,3.8,3,6.7,6.8,6.7h0c3.4.6,6.8-2.8,7-6.6,0-3.7-3.2-6.9-6.9-6.9h.1Z"/>',
6203
6217
  viewBox: '0 0 192 192'
6204
6218
  };
@@ -6819,10 +6833,10 @@ class TreeNavigationConfigService {
6819
6833
  return [];
6820
6834
  }
6821
6835
  }
6822
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TreeNavigationConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6823
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TreeNavigationConfigService, providedIn: 'root' });
6836
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TreeNavigationConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6837
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TreeNavigationConfigService, providedIn: 'root' });
6824
6838
  }
6825
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TreeNavigationConfigService, decorators: [{
6839
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TreeNavigationConfigService, decorators: [{
6826
6840
  type: Injectable,
6827
6841
  args: [{
6828
6842
  providedIn: 'root',
@@ -6849,10 +6863,10 @@ class TypeHelperService {
6849
6863
  && item.rtId
6850
6864
  && item.ckTypeId);
6851
6865
  }
6852
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TypeHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6853
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TypeHelperService, providedIn: 'root' });
6866
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TypeHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6867
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TypeHelperService, providedIn: 'root' });
6854
6868
  }
6855
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TypeHelperService, decorators: [{
6869
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TypeHelperService, decorators: [{
6856
6870
  type: Injectable,
6857
6871
  args: [{
6858
6872
  providedIn: 'root',
@@ -7187,7 +7201,7 @@ class RuntimeBrowserDataSource extends OctoGraphQlHierarchyDataSource {
7187
7201
  */
7188
7202
  async discoverEntityRoleGroups(rtId, ckTypeId, direction = GraphDirectionDto.InboundDto, excludeRtId) {
7189
7203
  const outbound = direction === GraphDirectionDto.OutboundDto;
7190
- let definitions = [];
7204
+ let definitions;
7191
7205
  try {
7192
7206
  const response = await firstValueFrom(this.getRuntimeEntityAssociationsByIdDtoGQL.fetch({
7193
7207
  variables: {
@@ -7822,10 +7836,10 @@ class RuntimeBrowserDataSource extends OctoGraphQlHierarchyDataSource {
7822
7836
  return [];
7823
7837
  }
7824
7838
  }
7825
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7826
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserDataSource, providedIn: 'root' });
7839
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7840
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserDataSource, providedIn: 'root' });
7827
7841
  }
7828
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserDataSource, decorators: [{
7842
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserDataSource, decorators: [{
7829
7843
  type: Injectable,
7830
7844
  args: [{
7831
7845
  providedIn: 'root',
@@ -7849,8 +7863,8 @@ class PerspectiveSwitcherComponent {
7849
7863
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7850
7864
  /** Emits the selected perspective key. */
7851
7865
  perspectiveChange = output();
7852
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PerspectiveSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7853
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PerspectiveSwitcherComponent, isStandalone: true, selector: "mm-perspective-switcher", inputs: { perspectives: { classPropertyName: "perspectives", publicName: "perspectives", isSignal: true, isRequired: false, transformFunction: null }, activeKey: { classPropertyName: "activeKey", publicName: "activeKey", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { perspectiveChange: "perspectiveChange" }, ngImport: i0, template: `
7866
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PerspectiveSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7867
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: PerspectiveSwitcherComponent, isStandalone: true, selector: "mm-perspective-switcher", inputs: { perspectives: { classPropertyName: "perspectives", publicName: "perspectives", isSignal: true, isRequired: false, transformFunction: null }, activeKey: { classPropertyName: "activeKey", publicName: "activeKey", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { perspectiveChange: "perspectiveChange" }, ngImport: i0, template: `
7854
7868
  @if (perspectives().length > 1) {
7855
7869
  <div class="perspective-switcher">
7856
7870
  <span class="switcher-label">{{ label() }}</span>
@@ -7866,7 +7880,7 @@ class PerspectiveSwitcherComponent {
7866
7880
  }
7867
7881
  `, isInline: true, styles: [".perspective-switcher{display:flex;align-items:center;gap:8px;padding:4px 8px}.switcher-label{font-size:.85rem;font-weight:600;color:var(--kendo-color-subtle, #6c757d);white-space:nowrap}\n"], dependencies: [{ 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7868
7882
  }
7869
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PerspectiveSwitcherComponent, decorators: [{
7883
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PerspectiveSwitcherComponent, decorators: [{
7870
7884
  type: Component,
7871
7885
  args: [{ selector: 'mm-perspective-switcher', standalone: true, imports: [DropDownListModule], template: `
7872
7886
  @if (perspectives().length > 1) {
@@ -7940,8 +7954,8 @@ class EntitySelectorDialogComponent {
7940
7954
  onCancel() {
7941
7955
  this.windowRef.close();
7942
7956
  }
7943
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntitySelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: EntitySelectorDialogComponent, isStandalone: true, selector: "mm-entity-selector-dialog", providers: [RuntimeBrowserDataSource], viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true }], ngImport: i0, template: `
7957
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntitySelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7958
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: EntitySelectorDialogComponent, isStandalone: true, selector: "mm-entity-selector-dialog", providers: [RuntimeBrowserDataSource], viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true }], ngImport: i0, template: `
7945
7959
  <div class="entity-selector">
7946
7960
  <div class="entity-selector-body">
7947
7961
  <mm-perspective-switcher
@@ -7988,7 +8002,7 @@ class EntitySelectorDialogComponent {
7988
8002
  </div>
7989
8003
  `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.entity-selector{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;box-sizing:border-box}.entity-selector-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.tree-section{flex:1;min-height:0;overflow:auto;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px;background:var(--kendo-color-surface, #ffffff)}.selection-preview{padding:10px 12px;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px;background:var(--kendo-color-surface-alt, #f8f9fa);display:flex;flex-direction:column;gap:4px;flex-shrink:0}.preview-row{display:flex;gap:8px}.preview-row .preview-label{font-weight:600;min-width:45px;color:var(--kendo-color-subtle, #6c757d);font-size:.85rem}.preview-row .preview-value{font-size:.85rem}.preview-row .monospace{font-family:monospace}.selection-hint{text-align:center;padding:8px;color:var(--kendo-color-subtle, #6c757d);font-size:.85rem;flex-shrink:0}.dialog-actions{flex:0 0 auto;display:flex;gap:8px;justify-content:flex-end;padding:10px 14px;border-top:1px solid var(--kendo-color-border, #dee2e6);background:var(--kendo-color-surface, transparent)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: TreeComponent, selector: "mm-tree-view", inputs: ["dataSource"], outputs: ["nodeSelected", "nodeClick", "nodeDoubleClick", "nodeDrop", "expand", "collapse"] }, { kind: "component", type: PerspectiveSwitcherComponent, selector: "mm-perspective-switcher", inputs: ["perspectives", "activeKey", "label"], outputs: ["perspectiveChange"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
7990
8004
  }
7991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntitySelectorDialogComponent, decorators: [{
8005
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntitySelectorDialogComponent, decorators: [{
7992
8006
  type: Component,
7993
8007
  args: [{ selector: 'mm-entity-selector-dialog', standalone: true, imports: [
7994
8008
  CommonModule,
@@ -8091,10 +8105,10 @@ class EntitySelectorDialogService {
8091
8105
  return { confirmed: false };
8092
8106
  }
8093
8107
  }
8094
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntitySelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8095
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntitySelectorDialogService, providedIn: 'root' });
8108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntitySelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8109
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntitySelectorDialogService, providedIn: 'root' });
8096
8110
  }
8097
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntitySelectorDialogService, decorators: [{
8111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntitySelectorDialogService, decorators: [{
8098
8112
  type: Injectable,
8099
8113
  args: [{
8100
8114
  providedIn: 'root'
@@ -8595,8 +8609,8 @@ class FieldFilterEditorComponent {
8595
8609
  }
8596
8610
  return values;
8597
8611
  }
8598
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FieldFilterEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8599
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FieldFilterEditorComponent, isStandalone: true, selector: "mm-field-filter-editor", inputs: { availableAttributes: "availableAttributes", ckTypeId: "ckTypeId", hideNavigationProperties: "hideNavigationProperties", attributePaths: "attributePaths", enableVariables: "enableVariables", availableVariables: "availableVariables", filters: "filters" }, outputs: { filtersChange: "filtersChange" }, usesOnChanges: true, ngImport: i0, template: `
8612
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldFilterEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8613
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: FieldFilterEditorComponent, isStandalone: true, selector: "mm-field-filter-editor", inputs: { availableAttributes: "availableAttributes", ckTypeId: "ckTypeId", hideNavigationProperties: "hideNavigationProperties", attributePaths: "attributePaths", enableVariables: "enableVariables", availableVariables: "availableVariables", filters: "filters" }, outputs: { filtersChange: "filtersChange" }, usesOnChanges: true, ngImport: i0, template: `
8600
8614
  <div class="field-filter-editor">
8601
8615
  @if (ckTypeId && !hideNavigationProperties) {
8602
8616
  <div class="attribute-options">
@@ -8895,7 +8909,7 @@ class FieldFilterEditorComponent {
8895
8909
  </div>
8896
8910
  `, isInline: true, styles: [".field-filter-editor{display:flex;flex-direction:column;gap:10px}.attribute-options{display:flex;align-items:center;gap:16px;font-size:.85rem}.inline-checkbox{display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:400}.inline-field{display:flex;align-items:center;gap:6px;font-weight:400}.depth-input{width:80px}.loading-hint{font-size:.8rem;color:var(--kendo-color-subtle, #6c757d)}.toolbar{display:flex;gap:10px;margin-bottom:5px}.filter-grid{border:1px solid #d5d5d5}.filter-grid ::ng-deep .k-grid-header .k-header{font-weight:600}.checkbox-column{text-align:center}.attribute-dropdown,.operator-dropdown,.attribute-input,.value-input{width:100%}.attribute-item{display:flex;justify-content:space-between;align-items:center;width:100%}.attribute-path{flex:1}.attribute-type{font-size:11px;color:#888;margin-left:8px;padding:2px 6px;background:#f0f0f0;border-radius:3px}.empty-state{padding:40px;text-align:center;border:1px dashed;border-radius:8px;font-family:Montserrat,sans-serif;font-size:.9rem}.empty-state p{margin:0}.value-cell{display:flex;gap:4px;align-items:center}.value-cell .value-input{flex:1}.variable-toggle{flex-shrink:0}.variable-item{display:flex;flex-direction:column;gap:2px}.variable-name{font-family:monospace;font-weight:500}.variable-label{font-size:11px;color:var(--kendo-color-subtle, #888)}.variable-value{font-family:monospace;color:var(--kendo-color-primary, #0d6efd)}.variable-placeholder{color:var(--kendo-color-subtle, #888)}.variable-dropdown ::ng-deep .k-input-value-text{font-family:monospace}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "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: "directive", type: i3.HeaderTemplateDirective, selector: "[kendoGridHeaderTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "directive", type: i3$1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { 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: "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: "directive", type: i3$1.ValueTemplateDirective, selector: "[kendoDropDownListValueTemplate],[kendoDropDownTreeValueTemplate]" }, { 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: "component", type: 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: "directive", type: i5.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }, { kind: "ngmodule", type: DateInputsModule }, { kind: "component", type: 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: "ngmodule", type: IconsModule }, { kind: "ngmodule", type: PopupModule }, { kind: "ngmodule", type: IntlModule }], changeDetection: i0.ChangeDetectionStrategy.Eager });
8897
8911
  }
8898
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
8912
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
8899
8913
  type: Component,
8900
8914
  args: [{ selector: 'mm-field-filter-editor', standalone: true, imports: [
8901
8915
  CommonModule,
@@ -9240,8 +9254,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
9240
9254
  */
9241
9255
  class OctoLoaderComponent {
9242
9256
  size = 'medium';
9243
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: OctoLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9244
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: OctoLoaderComponent, isStandalone: true, selector: "mm-octo-loader", inputs: { size: "size" }, ngImport: i0, template: `
9257
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: OctoLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: OctoLoaderComponent, isStandalone: true, selector: "mm-octo-loader", inputs: { size: "size" }, ngImport: i0, template: `
9245
9259
  <div class="octo-loader" [class.octo-loader--small]="size === 'small'" [class.octo-loader--medium]="size === 'medium'">
9246
9260
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-22 -8 112 118" class="octo-loader__svg" overflow="visible">
9247
9261
  <!-- Orbit track -->
@@ -9332,7 +9346,7 @@ class OctoLoaderComponent {
9332
9346
  </div>
9333
9347
  `, isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center;color:var(--kendo-color-primary, #64ceb9)}.octo-loader{display:inline-flex;align-items:center;justify-content:center}.octo-loader--small .octo-loader__svg{width:24px;height:24px}.octo-loader--medium .octo-loader__svg{width:48px;height:48px}.octo-arm--ol{transform-origin:7px 52.74px;animation:octo-wiggle-outer 1.2s ease-in-out infinite}.octo-arm--or{transform-origin:56px 52.74px;animation:octo-wiggle-outer 1.2s ease-in-out infinite;animation-delay:-.6s}.octo-leg--left{transform-origin:21.8px 52.74px;animation:octo-wiggle-inner 1s ease-in-out infinite}.octo-leg--center{transform-origin:31.5px 52.74px;animation:octo-wiggle-inner 1s ease-in-out infinite reverse;animation-delay:-.33s}.octo-leg--right{transform-origin:46px 52.74px;animation:octo-wiggle-inner 1s ease-in-out infinite;animation-delay:-.66s}@keyframes octo-wiggle-inner{0%,to{transform:rotate(-5deg)}50%{transform:rotate(5deg)}}@keyframes octo-wiggle-outer{0%,to{transform:rotate(-4deg)}50%{transform:rotate(4deg)}}.octo-orbit{stroke:var(--neo-cyan, #00a8dc)}.octo-data{fill:var(--neo-cyan, #00a8dc)}\n"], changeDetection: i0.ChangeDetectionStrategy.Eager });
9334
9348
  }
9335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: OctoLoaderComponent, decorators: [{
9349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: OctoLoaderComponent, decorators: [{
9336
9350
  type: Component,
9337
9351
  args: [{ selector: 'mm-octo-loader', standalone: true, template: `
9338
9352
  <div class="octo-loader" [class.octo-loader--small]="size === 'small'" [class.octo-loader--medium]="size === 'medium'">
@@ -9444,10 +9458,10 @@ class CreateEntitiesDtoGQL extends i1$3.Mutation {
9444
9458
  constructor(apollo) {
9445
9459
  super(apollo);
9446
9460
  }
9447
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CreateEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
9448
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CreateEntitiesDtoGQL, providedIn: 'root' });
9461
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CreateEntitiesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
9462
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CreateEntitiesDtoGQL, providedIn: 'root' });
9449
9463
  }
9450
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CreateEntitiesDtoGQL, decorators: [{
9464
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CreateEntitiesDtoGQL, decorators: [{
9451
9465
  type: Injectable,
9452
9466
  args: [{
9453
9467
  providedIn: 'root'
@@ -9479,10 +9493,10 @@ class GetBinaryInfoDtoGQL extends i1$3.Query {
9479
9493
  constructor(apollo) {
9480
9494
  super(apollo);
9481
9495
  }
9482
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetBinaryInfoDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
9483
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetBinaryInfoDtoGQL, providedIn: 'root' });
9496
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetBinaryInfoDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
9497
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetBinaryInfoDtoGQL, providedIn: 'root' });
9484
9498
  }
9485
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetBinaryInfoDtoGQL, decorators: [{
9499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetBinaryInfoDtoGQL, decorators: [{
9486
9500
  type: Injectable,
9487
9501
  args: [{
9488
9502
  providedIn: 'root'
@@ -9567,15 +9581,15 @@ class EntityAssociationsDataSourceDirective extends OctoGraphQlDataSource {
9567
9581
  return new FetchResultTyped(transformedItems, totalCount);
9568
9582
  }));
9569
9583
  }
9570
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9571
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.5", type: EntityAssociationsDataSourceDirective, isStandalone: true, selector: "[mmEntityAssociationsDataSource]", providers: [
9584
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9585
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.5", type: EntityAssociationsDataSourceDirective, isStandalone: true, selector: "[mmEntityAssociationsDataSource]", providers: [
9572
9586
  {
9573
9587
  provide: DataSourceBase,
9574
9588
  useExisting: forwardRef(() => EntityAssociationsDataSourceDirective),
9575
9589
  },
9576
9590
  ], exportAs: ["mmEntityAssociationsDataSource"], usesInheritance: true, ngImport: i0 });
9577
9591
  }
9578
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, decorators: [{
9592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, decorators: [{
9579
9593
  type: Directive,
9580
9594
  args: [{
9581
9595
  selector: '[mmEntityAssociationsDataSource]',
@@ -9761,8 +9775,8 @@ class DataMappingListComponent {
9761
9775
  plusIcon = plusIcon;
9762
9776
  trashIcon = trashIcon;
9763
9777
  linkIcon = hyperlinkOpenIcon;
9764
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataMappingListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9765
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", 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: `
9778
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataMappingListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9779
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", 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: `
9766
9780
  <div class="mapping-list">
9767
9781
  <div class="mapping-toolbar">
9768
9782
  <button kendoButton themeColor="primary" size="small" [svgIcon]="plusIcon"
@@ -9856,7 +9870,7 @@ class DataMappingListComponent {
9856
9870
  </div>
9857
9871
  `, isInline: true, 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"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { 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: "ngmodule", type: SVGIconModule }, { kind: "component", type: DataPointPickerComponent, selector: "mm-data-point-picker", inputs: ["entity", "entityRtId", "entityCkTypeId", "value", "placeholder", "disabled"], outputs: ["valueChange", "filterChange"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
9858
9872
  }
9859
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataMappingListComponent, decorators: [{
9873
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataMappingListComponent, decorators: [{
9860
9874
  type: Component,
9861
9875
  args: [{ selector: 'mm-data-mapping-list', standalone: true, imports: [
9862
9876
  CommonModule,
@@ -10030,7 +10044,7 @@ class EntityDetailViewComponent {
10030
10044
  propertyGridConfig = {
10031
10045
  readOnlyMode: false,
10032
10046
  showTypeIcons: true,
10033
- height: "500px",
10047
+ height: '500px',
10034
10048
  showSearch: true,
10035
10049
  };
10036
10050
  // Direction filter - use getter for current messages
@@ -10092,7 +10106,7 @@ class EntityDetailViewComponent {
10092
10106
  });
10093
10107
  }
10094
10108
  ngOnChanges(changes) {
10095
- if (changes["entity"] && this.entity) {
10109
+ if (changes['entity'] && this.entity) {
10096
10110
  this.updatePropertyGrid();
10097
10111
  }
10098
10112
  }
@@ -10112,7 +10126,7 @@ class EntityDetailViewComponent {
10112
10126
  this.propertyGridItems = items;
10113
10127
  },
10114
10128
  error: (err) => {
10115
- console.error("Error converting entity to properties:", err);
10129
+ console.error('Error converting entity to properties:', err);
10116
10130
  this.propertyGridItems = [];
10117
10131
  },
10118
10132
  });
@@ -10129,7 +10143,7 @@ class EntityDetailViewComponent {
10129
10143
  };
10130
10144
  }
10131
10145
  normalizeDateValue(value) {
10132
- if (typeof value === "string") {
10146
+ if (typeof value === 'string') {
10133
10147
  return value;
10134
10148
  }
10135
10149
  if (value instanceof Date) {
@@ -10184,7 +10198,7 @@ class EntityDetailViewComponent {
10184
10198
  };
10185
10199
  getEntityIdentifier() {
10186
10200
  if (!this.entity?.ckTypeId || !this.entity?.rtId) {
10187
- return "Unknown";
10201
+ return 'Unknown';
10188
10202
  }
10189
10203
  return `${this.entity.ckTypeId}@${this.entity.rtId}`;
10190
10204
  }
@@ -10213,20 +10227,20 @@ class EntityDetailViewComponent {
10213
10227
  .then(() => {
10214
10228
  this.notificationService.show({
10215
10229
  content: `${label} ${this._messages.copiedToClipboard}`,
10216
- type: { style: "success", icon: true },
10217
- position: { horizontal: "right", vertical: "top" },
10230
+ type: { style: 'success', icon: true },
10231
+ position: { horizontal: 'right', vertical: 'top' },
10218
10232
  hideAfter: 2000,
10219
- animation: { type: "fade", duration: 400 },
10233
+ animation: { type: 'fade', duration: 400 },
10220
10234
  });
10221
10235
  })
10222
10236
  .catch((err) => {
10223
- console.error("Failed to copy:", err);
10237
+ console.error('Failed to copy:', err);
10224
10238
  this.notificationService.show({
10225
10239
  content: this._messages.failedToCopyToClipboard,
10226
- type: { style: "error", icon: true },
10227
- position: { horizontal: "right", vertical: "top" },
10240
+ type: { style: 'error', icon: true },
10241
+ position: { horizontal: 'right', vertical: 'top' },
10228
10242
  hideAfter: 3000,
10229
- animation: { type: "fade", duration: 400 },
10243
+ animation: { type: 'fade', duration: 400 },
10230
10244
  });
10231
10245
  });
10232
10246
  }
@@ -10236,7 +10250,7 @@ class EntityDetailViewComponent {
10236
10250
  */
10237
10251
  async onBinaryDownload(_event) {
10238
10252
  if (!this.entity?.rtId) {
10239
- console.warn("Cannot download: no entity rtId available");
10253
+ console.warn('Cannot download: no entity rtId available');
10240
10254
  return;
10241
10255
  }
10242
10256
  try {
@@ -10247,32 +10261,32 @@ class EntityDetailViewComponent {
10247
10261
  const item = result.data?.runtime?.systemReportingFileSystemItem?.items?.[0];
10248
10262
  if (item?.content?.downloadUri) {
10249
10263
  // Open download in new tab
10250
- window.open(item.content.downloadUri, "_blank", "noopener,noreferrer");
10264
+ window.open(item.content.downloadUri, '_blank', 'noopener,noreferrer');
10251
10265
  }
10252
10266
  else {
10253
- console.warn("No downloadUri found for binary");
10267
+ console.warn('No downloadUri found for binary');
10254
10268
  this.notificationService.show({
10255
10269
  content: this._messages.downloadNotAvailable,
10256
- type: { style: "warning", icon: true },
10257
- position: { horizontal: "right", vertical: "top" },
10270
+ type: { style: 'warning', icon: true },
10271
+ position: { horizontal: 'right', vertical: 'top' },
10258
10272
  hideAfter: 3000,
10259
- animation: { type: "fade", duration: 400 },
10273
+ animation: { type: 'fade', duration: 400 },
10260
10274
  });
10261
10275
  }
10262
10276
  }
10263
10277
  catch (error) {
10264
- console.error("Failed to load binary info:", error);
10278
+ console.error('Failed to load binary info:', error);
10265
10279
  this.notificationService.show({
10266
10280
  content: this._messages.failedToLoadDownloadInfo,
10267
- type: { style: "error", icon: true },
10268
- position: { horizontal: "right", vertical: "top" },
10281
+ type: { style: 'error', icon: true },
10282
+ position: { horizontal: 'right', vertical: 'top' },
10269
10283
  hideAfter: 3000,
10270
- animation: { type: "fade", duration: 400 },
10284
+ animation: { type: 'fade', duration: 400 },
10271
10285
  });
10272
10286
  }
10273
10287
  }
10274
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10275
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: EntityDetailViewComponent, isStandalone: true, selector: "mm-entity-detail-view", inputs: { entity: "entity", loading: "loading", error: "error", showHeader: "showHeader", messages: "messages", showDataMapping: "showDataMapping", dataMappings: "dataMappings", expressionValidator: "expressionValidator" }, outputs: { retry: "retry", propertyChange: "propertyChange", navigateToEntity: "navigateToEntity", addMappingRequested: "addMappingRequested", removeMappingRequested: "removeMappingRequested", selectMappingTarget: "selectMappingTarget", selectSourceAttributeRequested: "selectSourceAttributeRequested", selectTargetAttributeRequested: "selectTargetAttributeRequested", mappingChanged: "mappingChanged", saveAllMappingsRequested: "saveAllMappingsRequested" }, viewQueries: [{ propertyName: "associationsDataSource", first: true, predicate: ["associationsDir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
10288
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10289
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: EntityDetailViewComponent, isStandalone: true, selector: "mm-entity-detail-view", inputs: { entity: "entity", loading: "loading", error: "error", showHeader: "showHeader", messages: "messages", showDataMapping: "showDataMapping", dataMappings: "dataMappings", expressionValidator: "expressionValidator" }, outputs: { retry: "retry", propertyChange: "propertyChange", navigateToEntity: "navigateToEntity", addMappingRequested: "addMappingRequested", removeMappingRequested: "removeMappingRequested", selectMappingTarget: "selectMappingTarget", selectSourceAttributeRequested: "selectSourceAttributeRequested", selectTargetAttributeRequested: "selectTargetAttributeRequested", mappingChanged: "mappingChanged", saveAllMappingsRequested: "saveAllMappingsRequested" }, viewQueries: [{ propertyName: "associationsDataSource", first: true, predicate: ["associationsDir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
10276
10290
  @if (loading) {
10277
10291
  <div class="loading-state">
10278
10292
  <p>{{ _messages.loadingEntityDetails }}</p>
@@ -10510,9 +10524,9 @@ class EntityDetailViewComponent {
10510
10524
  }
10511
10525
  `, 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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], 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", "autoPageSize", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "persistListState", "listStateKey", "resizable", "actionsColumnWidth", "hideCheckboxesBelow", "cardModeBelow", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked", "resetFilters"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
10512
10526
  }
10513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailViewComponent, decorators: [{
10527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailViewComponent, decorators: [{
10514
10528
  type: Component,
10515
- args: [{ selector: "mm-entity-detail-view", standalone: true, imports: [
10529
+ args: [{ selector: 'mm-entity-detail-view', standalone: true, imports: [
10516
10530
  CommonModule,
10517
10531
  TabStripModule,
10518
10532
  ButtonModule,
@@ -10799,7 +10813,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
10799
10813
  type: Output
10800
10814
  }], associationsDataSource: [{
10801
10815
  type: ViewChild,
10802
- args: ["associationsDir", { static: false }]
10816
+ args: ['associationsDir', { static: false }]
10803
10817
  }] } });
10804
10818
 
10805
10819
  class EntityDetailDataSource {
@@ -10837,10 +10851,10 @@ class EntityDetailDataSource {
10837
10851
  throw error;
10838
10852
  }
10839
10853
  }
10840
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10841
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailDataSource, providedIn: 'root' });
10854
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10855
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailDataSource, providedIn: 'root' });
10842
10856
  }
10843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailDataSource, decorators: [{
10857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailDataSource, decorators: [{
10844
10858
  type: Injectable,
10845
10859
  args: [{
10846
10860
  providedIn: 'root',
@@ -10902,7 +10916,7 @@ class RtEntityIdHelper {
10902
10916
  return { rtId, ckTypeId };
10903
10917
  }
10904
10918
  catch (error) {
10905
- throw new Error(`Failed to decode entity ID: ${error}`);
10919
+ throw new Error(`Failed to decode entity ID: ${error}`, { cause: error });
10906
10920
  }
10907
10921
  }
10908
10922
  /**
@@ -11255,8 +11269,8 @@ class EntityDetailComponent {
11255
11269
  });
11256
11270
  }
11257
11271
  }
11258
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11259
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", inputs: { messages: "messages" }, ngImport: i0, template: `
11272
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", inputs: { messages: "messages" }, ngImport: i0, template: `
11260
11274
  <div class="entity-detail">
11261
11275
  <div class="entity-detail-header">
11262
11276
  <button
@@ -11300,7 +11314,7 @@ class EntityDetailComponent {
11300
11314
  </div>
11301
11315
  `, isInline: true, 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"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: EntityDetailViewComponent, selector: "mm-entity-detail-view", inputs: ["entity", "loading", "error", "showHeader", "messages", "showDataMapping", "dataMappings", "expressionValidator"], outputs: ["retry", "propertyChange", "navigateToEntity", "addMappingRequested", "removeMappingRequested", "selectMappingTarget", "selectSourceAttributeRequested", "selectTargetAttributeRequested", "mappingChanged", "saveAllMappingsRequested"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
11302
11316
  }
11303
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EntityDetailComponent, decorators: [{
11317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityDetailComponent, decorators: [{
11304
11318
  type: Component,
11305
11319
  args: [{ selector: 'mm-entity-detail', imports: [
11306
11320
  CommonModule,
@@ -11429,10 +11443,10 @@ class AssociationValidationService {
11429
11443
  clearCache() {
11430
11444
  this.outRolesCache.clear();
11431
11445
  }
11432
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AssociationValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11433
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AssociationValidationService, providedIn: 'root' });
11446
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AssociationValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11447
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AssociationValidationService, providedIn: 'root' });
11434
11448
  }
11435
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AssociationValidationService, decorators: [{
11449
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AssociationValidationService, decorators: [{
11436
11450
  type: Injectable,
11437
11451
  args: [{
11438
11452
  providedIn: 'root',
@@ -11473,10 +11487,10 @@ class GetRuntimeEntitiesByTypeDtoGQL extends i1$3.Query {
11473
11487
  constructor(apollo) {
11474
11488
  super(apollo);
11475
11489
  }
11476
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11477
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, providedIn: 'root' });
11490
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11491
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, providedIn: 'root' });
11478
11492
  }
11479
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, decorators: [{
11493
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, decorators: [{
11480
11494
  type: Injectable,
11481
11495
  args: [{
11482
11496
  providedIn: 'root'
@@ -11537,15 +11551,15 @@ class CkTypeEntitiesDataSourceDirective extends OctoGraphQlDataSource {
11537
11551
  return new FetchResultTyped(transformedItems, totalCount);
11538
11552
  }));
11539
11553
  }
11540
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
11541
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.5", type: CkTypeEntitiesDataSourceDirective, isStandalone: true, selector: "[mmCkTypeEntitiesDataSource]", providers: [
11554
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
11555
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.5", type: CkTypeEntitiesDataSourceDirective, isStandalone: true, selector: "[mmCkTypeEntitiesDataSource]", providers: [
11542
11556
  {
11543
11557
  provide: DataSourceBase,
11544
11558
  useExisting: forwardRef(() => CkTypeEntitiesDataSourceDirective),
11545
11559
  },
11546
11560
  ], exportAs: ["mmCkTypeEntitiesDataSource"], usesInheritance: true, ngImport: i0 });
11547
11561
  }
11548
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, decorators: [{
11562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, decorators: [{
11549
11563
  type: Directive,
11550
11564
  args: [{
11551
11565
  selector: '[mmCkTypeEntitiesDataSource]',
@@ -11667,10 +11681,10 @@ class RuntimeBrowserStateService {
11667
11681
  }
11668
11682
  return item.text || 'unknown';
11669
11683
  }
11670
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11671
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserStateService, providedIn: 'root' });
11684
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11685
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserStateService, providedIn: 'root' });
11672
11686
  }
11673
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserStateService, decorators: [{
11687
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserStateService, decorators: [{
11674
11688
  type: Injectable,
11675
11689
  args: [{
11676
11690
  providedIn: 'root',
@@ -11705,12 +11719,12 @@ class AttributeCoordinatorService {
11705
11719
  markStructureAsReady() {
11706
11720
  this.structureReady.set(true);
11707
11721
  }
11708
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeCoordinatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11709
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeCoordinatorService, providedIn: "root" });
11722
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeCoordinatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11723
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeCoordinatorService, providedIn: 'root' });
11710
11724
  }
11711
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeCoordinatorService, decorators: [{
11725
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeCoordinatorService, decorators: [{
11712
11726
  type: Injectable,
11713
- args: [{ providedIn: "root" }]
11727
+ args: [{ providedIn: 'root' }]
11714
11728
  }] });
11715
11729
 
11716
11730
  const GetCkAttributesDetailedDocumentDto = gql `
@@ -11759,10 +11773,10 @@ class GetCkAttributesDetailedDtoGQL extends i1$3.Query {
11759
11773
  constructor(apollo) {
11760
11774
  super(apollo);
11761
11775
  }
11762
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11763
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, providedIn: 'root' });
11776
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11777
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, providedIn: 'root' });
11764
11778
  }
11765
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, decorators: [{
11779
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, decorators: [{
11766
11780
  type: Injectable,
11767
11781
  args: [{
11768
11782
  providedIn: 'root'
@@ -11816,10 +11830,10 @@ class GetCkRecordDetailedDtoGQL extends i1$3.Query {
11816
11830
  constructor(apollo) {
11817
11831
  super(apollo);
11818
11832
  }
11819
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11820
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, providedIn: 'root' });
11833
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11834
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, providedIn: 'root' });
11821
11835
  }
11822
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, decorators: [{
11836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, decorators: [{
11823
11837
  type: Injectable,
11824
11838
  args: [{
11825
11839
  providedIn: 'root'
@@ -11871,10 +11885,10 @@ class AttributeMetadataResolverService {
11871
11885
  .pipe(map$1((res) => (res.data?.constructionKit?.records?.items?.[0]?.attributes
11872
11886
  ?.items ?? []).filter((item) => item != null)));
11873
11887
  }
11874
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMetadataResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11875
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMetadataResolverService, providedIn: 'root' });
11888
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMetadataResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11889
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMetadataResolverService, providedIn: 'root' });
11876
11890
  }
11877
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMetadataResolverService, decorators: [{
11891
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMetadataResolverService, decorators: [{
11878
11892
  type: Injectable,
11879
11893
  args: [{
11880
11894
  providedIn: 'root',
@@ -11883,51 +11897,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
11883
11897
 
11884
11898
  class AttributeRecognitionService {
11885
11899
  isString(attributeValueType) {
11886
- return attributeValueType === "STRING";
11900
+ return attributeValueType === 'STRING';
11887
11901
  }
11888
11902
  isNumber(attributeValueType) {
11889
- return ["INT", "INTEGER", "INTEGER_64", "DOUBLE", "NUMBER", "LONG"].includes(attributeValueType);
11903
+ return ['INT', 'INTEGER', 'INTEGER_64', 'DOUBLE', 'NUMBER', 'LONG'].includes(attributeValueType);
11890
11904
  }
11891
11905
  isEnum(attributeValueType) {
11892
- return attributeValueType === "ENUM";
11906
+ return attributeValueType === 'ENUM';
11893
11907
  }
11894
11908
  isRecord(attributeValueType) {
11895
- return attributeValueType === "RECORD";
11909
+ return attributeValueType === 'RECORD';
11896
11910
  }
11897
11911
  isArray(attributeValueType) {
11898
- return (attributeValueType.endsWith("_ARRAY") &&
11899
- attributeValueType !== "RECORD_ARRAY");
11912
+ return (attributeValueType.endsWith('_ARRAY') &&
11913
+ attributeValueType !== 'RECORD_ARRAY');
11900
11914
  }
11901
11915
  isDate(attributeValueType) {
11902
- return ["DATE", "DATE_TIME", "DATE_TIME_OFFSET"].includes(attributeValueType);
11916
+ return ['DATE', 'DATE_TIME', 'DATE_TIME_OFFSET'].includes(attributeValueType);
11903
11917
  }
11904
11918
  isTime(attributeValueType) {
11905
- return ["TIME_SPAN"].includes(attributeValueType);
11919
+ return ['TIME_SPAN'].includes(attributeValueType);
11906
11920
  }
11907
11921
  isGeoSpatialPoint(attributeValueType) {
11908
- return ["GEOSPATIAL_POINT"].includes(attributeValueType);
11922
+ return ['GEOSPATIAL_POINT'].includes(attributeValueType);
11909
11923
  }
11910
11924
  isBinary(attributeValueType) {
11911
- return ["BINARY", "BINARY_LINKED"].includes(attributeValueType);
11925
+ return ['BINARY', 'BINARY_LINKED'].includes(attributeValueType);
11912
11926
  }
11913
11927
  isRecordArray(attributeValueType) {
11914
- return attributeValueType === "RECORD_ARRAY";
11928
+ return attributeValueType === 'RECORD_ARRAY';
11915
11929
  }
11916
11930
  isBoolean(attributeValueType) {
11917
- return attributeValueType === "BOOLEAN";
11931
+ return attributeValueType === 'BOOLEAN';
11918
11932
  }
11919
11933
  isIntArray(attributeValueType) {
11920
- return ["INT_ARRAY", "INTEGER_ARRAY"].includes(attributeValueType);
11934
+ return ['INT_ARRAY', 'INTEGER_ARRAY'].includes(attributeValueType);
11921
11935
  }
11922
11936
  isStringArray(attributeValueType) {
11923
- return attributeValueType === "STRING_ARRAY";
11937
+ return attributeValueType === 'STRING_ARRAY';
11924
11938
  }
11925
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11926
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeRecognitionService, providedIn: "root" });
11939
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11940
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeRecognitionService, providedIn: 'root' });
11927
11941
  }
11928
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeRecognitionService, decorators: [{
11942
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeRecognitionService, decorators: [{
11929
11943
  type: Injectable,
11930
- args: [{ providedIn: "root" }]
11944
+ args: [{ providedIn: 'root' }]
11931
11945
  }] });
11932
11946
 
11933
11947
  /**
@@ -11935,7 +11949,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
11935
11949
  * Provides convertGeospatialPointToGeoJSON, fileToByteArray, getFileFromValue, base64ToByteArray.
11936
11950
  */
11937
11951
  function isRecordValue(value) {
11938
- return typeof value === "object" && value !== null && !Array.isArray(value);
11952
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
11939
11953
  }
11940
11954
  /**
11941
11955
  * Converts a GeoJSON-like point control ({ longitude, latitude } or { type, longitude, latitude })
@@ -11945,16 +11959,16 @@ function convertGeospatialPointToGeoJSON(point) {
11945
11959
  if (!isRecordValue(point)) {
11946
11960
  return point;
11947
11961
  }
11948
- if ("longitude" in point && "latitude" in point) {
11962
+ if ('longitude' in point && 'latitude' in point) {
11949
11963
  return {
11950
- type: "Point",
11951
- coordinates: [point["longitude"], point["latitude"]],
11964
+ type: 'Point',
11965
+ coordinates: [point['longitude'], point['latitude']],
11952
11966
  };
11953
11967
  }
11954
- if (point["type"] === "Point" && "longitude" in point && "latitude" in point) {
11968
+ if (point['type'] === 'Point' && 'longitude' in point && 'latitude' in point) {
11955
11969
  return {
11956
- type: "Point",
11957
- coordinates: [point["longitude"], point["latitude"]],
11970
+ type: 'Point',
11971
+ coordinates: [point['longitude'], point['latitude']],
11958
11972
  };
11959
11973
  }
11960
11974
  return point;
@@ -11987,9 +12001,9 @@ function base64ToByteArray(base64) {
11987
12001
  }
11988
12002
 
11989
12003
  /** Property set on synthetic BINARY_LINKED File objects (reference/mockup without content). Used by UI to show a preview indicator. */
11990
- const BINARY_LINKED_REFERENCE_FLAG = "__isBinaryLinkedReference";
12004
+ const BINARY_LINKED_REFERENCE_FLAG = '__isBinaryLinkedReference';
11991
12005
  /** Property set on BINARY File objects restored from base64 (content is real; filename is a placeholder). Used by UI to show a reference hint. */
11992
- const BINARY_REFERENCE_FLAG = "__isBinaryFromBase64";
12006
+ const BINARY_REFERENCE_FLAG = '__isBinaryFromBase64';
11993
12007
  /**
11994
12008
  * Maps between form model and GraphQL API: builds form attribute definitions from CK metadata and initial/default
11995
12009
  * values, and maps form values to create/update mutation payloads (including RECORD, BINARY, GEOSPATIAL_POINT, etc.).
@@ -11998,10 +12012,10 @@ class AttributeMapperService {
11998
12012
  recognition = inject(AttributeRecognitionService);
11999
12013
  metadataResolver = inject(AttributeMetadataResolverService);
12000
12014
  isRecordValue(value) {
12001
- return typeof value === "object" && value !== null && !Array.isArray(value);
12015
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
12002
12016
  }
12003
12017
  isCkAttributeMetadata(attr) {
12004
- return "attribute" in attr || "ckAttributeId" in attr;
12018
+ return 'attribute' in attr || 'ckAttributeId' in attr;
12005
12019
  }
12006
12020
  // ─── Form ← API: attribute definition + initial/default value ─────────────────────
12007
12021
  /**
@@ -12009,8 +12023,8 @@ class AttributeMapperService {
12009
12023
  * Value priority: 1. Initial (entity data), 2. Default (CK defaultValues), 3. Empty (placeholder).
12010
12024
  */
12011
12025
  mapToFormAttribute(attr, rawInitialValue) {
12012
- const attributeName = attr?.attributeName ?? "";
12013
- const type = attr?.attributeValueType ?? "";
12026
+ const attributeName = attr?.attributeName ?? '';
12027
+ const type = attr?.attributeValueType ?? '';
12014
12028
  let parsedValue;
12015
12029
  const hasInitial = rawInitialValue !== undefined && rawInitialValue !== null;
12016
12030
  if (hasInitial) {
@@ -12084,20 +12098,20 @@ class AttributeMapperService {
12084
12098
  async mapSingleAttributeToInput(key, value, metadata) {
12085
12099
  const type = metadata?.attributeValueType;
12086
12100
  // type is set only when metadata exists, so the non-null assertion is safe inside these branches.
12087
- if (type === "BINARY_LINKED") {
12101
+ if (type === 'BINARY_LINKED') {
12088
12102
  return this.mapBinaryLinkedAttribute(key, value, metadata);
12089
12103
  }
12090
12104
  if (value === null || value === undefined) {
12091
12105
  return metadata?.isOptional ? { attributeName: key, value: null } : null;
12092
12106
  }
12093
- if (type === "BINARY" && this.isOptionalEmptyBinary(metadata, value)) {
12107
+ if (type === 'BINARY' && this.isOptionalEmptyBinary(metadata, value)) {
12094
12108
  return { attributeName: key, value: null };
12095
12109
  }
12096
12110
  // Empty RECORD (empty object) and RECORD_ARRAY (empty array): send null when optional, skip otherwise.
12097
- if (type === "RECORD" && this.isValueEmpty(value)) {
12111
+ if (type === 'RECORD' && this.isValueEmpty(value)) {
12098
12112
  return metadata?.isOptional ? { attributeName: key, value: null } : null;
12099
12113
  }
12100
- if (type === "RECORD_ARRAY" && Array.isArray(value) && value.length === 0) {
12114
+ if (type === 'RECORD_ARRAY' && Array.isArray(value) && value.length === 0) {
12101
12115
  return metadata?.isOptional ? { attributeName: key, value: null } : null;
12102
12116
  }
12103
12117
  if (metadata?.isOptional &&
@@ -12219,26 +12233,26 @@ class AttributeMapperService {
12219
12233
  async processAttributeValue(value, metadata) {
12220
12234
  const attributeType = metadata?.attributeValueType;
12221
12235
  switch (attributeType) {
12222
- case "RECORD":
12236
+ case 'RECORD':
12223
12237
  return await this.mapRecordValueToGraphQL(value, metadata?.id?.ckId);
12224
- case "RECORD_ARRAY":
12238
+ case 'RECORD_ARRAY':
12225
12239
  return await this.mapRecordArrayValueToGraphQL(value, metadata?.id?.ckId);
12226
- case "GEOSPATIAL_POINT":
12240
+ case 'GEOSPATIAL_POINT':
12227
12241
  return convertGeospatialPointToGeoJSON(value);
12228
- case "TIME_SPAN":
12242
+ case 'TIME_SPAN':
12229
12243
  return this.convertTimeSpanToSeconds(value);
12230
- case "BINARY":
12244
+ case 'BINARY':
12231
12245
  // MeshMakers expects byte[] (array of numbers). Accept File, ArrayBuffer, base64 string, or byte[].
12232
12246
  return await this.convertBinaryToByteArray(value);
12233
- case "BINARY_LINKED":
12247
+ case 'BINARY_LINKED':
12234
12248
  // MeshMakers: prefer File for multipart upload; also accept base64 string, ArrayBuffer or byte[].
12235
12249
  return this.convertBinaryLinkedValue(value);
12236
- case "INTEGER_ARRAY":
12237
- return this.normalizePrimitiveArray(value, "number");
12238
- case "STRING_ARRAY":
12239
- return this.normalizePrimitiveArray(value, "string");
12240
- case "DATE_TIME":
12241
- case "DATE_TIME_OFFSET":
12250
+ case 'INTEGER_ARRAY':
12251
+ return this.normalizePrimitiveArray(value, 'number');
12252
+ case 'STRING_ARRAY':
12253
+ return this.normalizePrimitiveArray(value, 'string');
12254
+ case 'DATE_TIME':
12255
+ case 'DATE_TIME_OFFSET':
12242
12256
  if (value instanceof Date) {
12243
12257
  if (isNaN(value.getTime())) {
12244
12258
  return null;
@@ -12255,17 +12269,17 @@ class AttributeMapperService {
12255
12269
  normalizePrimitiveArray(value, mode) {
12256
12270
  if (!Array.isArray(value) || value.length === 0)
12257
12271
  return null;
12258
- if (mode === "number") {
12272
+ if (mode === 'number') {
12259
12273
  return value.map((v) => {
12260
- if (this.isRecordValue(v) && "key" in v) {
12261
- return Number(v["key"]);
12274
+ if (this.isRecordValue(v) && 'key' in v) {
12275
+ return Number(v['key']);
12262
12276
  }
12263
12277
  return Number(v);
12264
12278
  });
12265
12279
  }
12266
12280
  return value.map((v) => {
12267
- if (this.isRecordValue(v) && "key" in v) {
12268
- return String(v["key"]);
12281
+ if (this.isRecordValue(v) && 'key' in v) {
12282
+ return String(v['key']);
12269
12283
  }
12270
12284
  return String(v);
12271
12285
  });
@@ -12278,7 +12292,7 @@ class AttributeMapperService {
12278
12292
  normalizeGeospatialPointForForm(value) {
12279
12293
  if (value == null)
12280
12294
  return { longitude: null, latitude: null };
12281
- if (typeof value === "string") {
12295
+ if (typeof value === 'string') {
12282
12296
  try {
12283
12297
  value = JSON.parse(value);
12284
12298
  }
@@ -12289,17 +12303,17 @@ class AttributeMapperService {
12289
12303
  if (!this.isRecordValue(value)) {
12290
12304
  return { longitude: null, latitude: null };
12291
12305
  }
12292
- if ("longitude" in value && "latitude" in value) {
12306
+ if ('longitude' in value && 'latitude' in value) {
12293
12307
  return {
12294
- longitude: value["longitude"] != null ? Number(value["longitude"]) : null,
12295
- latitude: value["latitude"] != null ? Number(value["latitude"]) : null,
12308
+ longitude: value['longitude'] != null ? Number(value['longitude']) : null,
12309
+ latitude: value['latitude'] != null ? Number(value['latitude']) : null,
12296
12310
  };
12297
12311
  }
12298
- if (Array.isArray(value["coordinates"]) &&
12299
- value["coordinates"].length >= 2) {
12312
+ if (Array.isArray(value['coordinates']) &&
12313
+ value['coordinates'].length >= 2) {
12300
12314
  return {
12301
- longitude: Number(value["coordinates"][0]),
12302
- latitude: Number(value["coordinates"][1]),
12315
+ longitude: Number(value['coordinates'][0]),
12316
+ latitude: Number(value['coordinates'][1]),
12303
12317
  };
12304
12318
  }
12305
12319
  return { longitude: null, latitude: null };
@@ -12314,7 +12328,7 @@ class AttributeMapperService {
12314
12328
  const seconds = value.getSeconds();
12315
12329
  return hours * 3600 + minutes * 60 + seconds;
12316
12330
  }
12317
- if (typeof value === "number") {
12331
+ if (typeof value === 'number') {
12318
12332
  return value;
12319
12333
  }
12320
12334
  return 0;
@@ -12326,7 +12340,7 @@ class AttributeMapperService {
12326
12340
  * Note: A base64 string carries only the raw bytes; it does not contain filename or other metadata.
12327
12341
  * The filename (and contentType) must be supplied by the caller when known (e.g. from a BINARY_LINKED payload); for plain BINARY we use a default name.
12328
12342
  */
12329
- base64ToFile(base64, filename = "file.bin", contentType = "application/octet-stream") {
12343
+ base64ToFile(base64, filename = 'file.bin', contentType = 'application/octet-stream') {
12330
12344
  try {
12331
12345
  const bytes = base64ToByteArray(base64);
12332
12346
  const uint8 = new Uint8Array(bytes);
@@ -12343,7 +12357,7 @@ class AttributeMapperService {
12343
12357
  */
12344
12358
  async convertBinaryToByteArray(value) {
12345
12359
  if (Array.isArray(value) &&
12346
- (value.length === 0 || typeof value[0] === "number")) {
12360
+ (value.length === 0 || typeof value[0] === 'number')) {
12347
12361
  return value;
12348
12362
  }
12349
12363
  const fileValue = getFileFromValue(value);
@@ -12352,16 +12366,16 @@ class AttributeMapperService {
12352
12366
  return await fileToByteArray(fileValue);
12353
12367
  }
12354
12368
  catch (e) {
12355
- console.error("Error converting File to byte array:", e);
12369
+ console.error('Error converting File to byte array:', e);
12356
12370
  return value;
12357
12371
  }
12358
12372
  }
12359
- if (typeof value === "string") {
12373
+ if (typeof value === 'string') {
12360
12374
  try {
12361
12375
  return base64ToByteArray(value);
12362
12376
  }
12363
12377
  catch (e) {
12364
- console.error("Error converting Base64 to byte array:", e);
12378
+ console.error('Error converting Base64 to byte array:', e);
12365
12379
  return value;
12366
12380
  }
12367
12381
  }
@@ -12377,7 +12391,7 @@ class AttributeMapperService {
12377
12391
  return value;
12378
12392
  if (Array.isArray(value) && value[0] instanceof File)
12379
12393
  return value[0];
12380
- if (typeof value === "string") {
12394
+ if (typeof value === 'string') {
12381
12395
  try {
12382
12396
  return base64ToByteArray(value);
12383
12397
  }
@@ -12385,43 +12399,43 @@ class AttributeMapperService {
12385
12399
  // Re-throw instead of returning null: a malformed base64 must not silently degrade
12386
12400
  // to null, which the backend may interpret as "clear/detach" the linked binary.
12387
12401
  // Surfacing the error lets the caller present a validation message to the user.
12388
- console.error("Error converting BINARY_LINKED base64 to byte array:", e);
12389
- throw new Error("Invalid base64 value for BINARY_LINKED attribute", { cause: e });
12402
+ console.error('Error converting BINARY_LINKED base64 to byte array:', e);
12403
+ throw new Error('Invalid base64 value for BINARY_LINKED attribute', { cause: e });
12390
12404
  }
12391
12405
  }
12392
12406
  if (value instanceof ArrayBuffer) {
12393
12407
  return this.arrayBufferToByteArray(value);
12394
12408
  }
12395
- if (Array.isArray(value) && typeof value[0] === "number") {
12409
+ if (Array.isArray(value) && typeof value[0] === 'number') {
12396
12410
  return value;
12397
12411
  }
12398
12412
  return null;
12399
12413
  }
12400
12414
  // ─── Type recognition (single responsibility: attribute type checks) ─────────────
12401
12415
  isEnum(attr) {
12402
- return attr.attributeValueType === "ENUM";
12416
+ return attr.attributeValueType === 'ENUM';
12403
12417
  }
12404
12418
  /**
12405
12419
  * Checks whether the attribute is a record type.
12406
12420
  */
12407
12421
  isRecord(attr) {
12408
- return attr.attributeValueType === "RECORD";
12422
+ return attr.attributeValueType === 'RECORD';
12409
12423
  }
12410
12424
  /**
12411
12425
  * Checks whether the attribute is a record array type.
12412
12426
  */
12413
12427
  isRecordArray(attr) {
12414
- return attr.attributeValueType === "RECORD_ARRAY";
12428
+ return attr.attributeValueType === 'RECORD_ARRAY';
12415
12429
  }
12416
12430
  /**
12417
12431
  * Checks whether the attribute is a geospatial point type.
12418
12432
  */
12419
12433
  isGeospatialPoint(attr) {
12420
- return attr.attributeValueType === "GEOSPATIAL_POINT";
12434
+ return attr.attributeValueType === 'GEOSPATIAL_POINT';
12421
12435
  }
12422
12436
  /** True when optional scalar/array is "cleared" (send null to remove value). */
12423
12437
  isOptionalEmptyScalarOrArray(value, metadata) {
12424
- if (value === "" || value == null)
12438
+ if (value === '' || value == null)
12425
12439
  return true;
12426
12440
  const t = metadata?.attributeValueType;
12427
12441
  if (this.recognition.isArray(t) && Array.isArray(value) && value.length === 0)
@@ -12455,7 +12469,7 @@ class AttributeMapperService {
12455
12469
  const val = value[key];
12456
12470
  return (val === null ||
12457
12471
  val === undefined ||
12458
- val === "" ||
12472
+ val === '' ||
12459
12473
  (this.isRecordValue(val) && Object.keys(val).length === 0) ||
12460
12474
  (Array.isArray(val) && val.length === 0));
12461
12475
  });
@@ -12475,7 +12489,7 @@ class AttributeMapperService {
12475
12489
  if (Array.isArray(value))
12476
12490
  return value;
12477
12491
  if (this.isRecordValue(value)) {
12478
- const attrs = value["attributes"];
12492
+ const attrs = value['attributes'];
12479
12493
  return Array.isArray(attrs) ? attrs : [];
12480
12494
  }
12481
12495
  return [];
@@ -12488,7 +12502,7 @@ class AttributeMapperService {
12488
12502
  if (Array.isArray(item))
12489
12503
  return item; // Already parsed
12490
12504
  if (this.isRecordValue(item)) {
12491
- const attrs = item["attributes"];
12505
+ const attrs = item['attributes'];
12492
12506
  return Array.isArray(attrs) ? attrs : [];
12493
12507
  }
12494
12508
  return [];
@@ -12509,8 +12523,8 @@ class AttributeMapperService {
12509
12523
  return this.parseTimeSpanForForm(value);
12510
12524
  }
12511
12525
  if (this.recognition.isDate(type)) {
12512
- if (typeof value === "string" ||
12513
- typeof value === "number" ||
12526
+ if (typeof value === 'string' ||
12527
+ typeof value === 'number' ||
12514
12528
  value instanceof Date) {
12515
12529
  const date = new Date(value);
12516
12530
  return isNaN(date.getTime()) ? null : date;
@@ -12520,10 +12534,10 @@ class AttributeMapperService {
12520
12534
  if (this.recognition.isGeoSpatialPoint(type)) {
12521
12535
  return this.normalizeGeospatialPointForForm(value);
12522
12536
  }
12523
- if (type === "BINARY") {
12537
+ if (type === 'BINARY') {
12524
12538
  return this.parseBinaryForForm(value);
12525
12539
  }
12526
- if (type === "BINARY_LINKED") {
12540
+ if (type === 'BINARY_LINKED') {
12527
12541
  return this.parseBinaryLinkedForForm(value);
12528
12542
  }
12529
12543
  return value;
@@ -12537,7 +12551,7 @@ class AttributeMapperService {
12537
12551
  return null;
12538
12552
  if (value instanceof Date)
12539
12553
  return isNaN(value.getTime()) ? null : value;
12540
- if (typeof value === "number") {
12554
+ if (typeof value === 'number') {
12541
12555
  const d = new Date(0);
12542
12556
  d.setUTCHours(0, 0, 0, 0);
12543
12557
  d.setUTCSeconds(value % 86400);
@@ -12559,15 +12573,15 @@ class AttributeMapperService {
12559
12573
  * When a dot is present, the segment before the dot is always days (e.g. "44682.00:00:00" = 44682 days).
12560
12574
  */
12561
12575
  parseTimeSpanStringToSeconds(s) {
12562
- const parts = s.split(".");
12563
- let timePart = parts[0] ?? "";
12576
+ const parts = s.split('.');
12577
+ let timePart = parts[0] ?? '';
12564
12578
  let days = 0;
12565
12579
  if (parts.length >= 2) {
12566
12580
  const firstNum = parseInt(parts[0], 10);
12567
12581
  if (!Number.isNaN(firstNum)) {
12568
12582
  days = firstNum;
12569
12583
  }
12570
- timePart = parts[1] ?? "00:00:00";
12584
+ timePart = parts[1] ?? '00:00:00';
12571
12585
  }
12572
12586
  const timeMatch = timePart.match(/^(\d+):(\d+):(\d+)(?:\.(\d+))?$/);
12573
12587
  if (!timeMatch) {
@@ -12593,8 +12607,8 @@ class AttributeMapperService {
12593
12607
  return [value];
12594
12608
  if (Array.isArray(value) && value[0] instanceof File)
12595
12609
  return value;
12596
- if (typeof value === "string") {
12597
- const file = this.base64ToFile(value, "file.bin", "application/octet-stream");
12610
+ if (typeof value === 'string') {
12611
+ const file = this.base64ToFile(value, 'file.bin', 'application/octet-stream');
12598
12612
  if (file) {
12599
12613
  file[BINARY_REFERENCE_FLAG] =
12600
12614
  true;
@@ -12615,27 +12629,27 @@ class AttributeMapperService {
12615
12629
  return [];
12616
12630
  if (value instanceof File)
12617
12631
  return [value];
12618
- const filename = (typeof value["filename"] === "string"
12619
- ? value["filename"]
12620
- : typeof value["fileName"] === "string"
12621
- ? value["fileName"]
12622
- : null) ?? "document.bin";
12623
- const contentType = (typeof value["contentType"] === "string"
12624
- ? value["contentType"]
12625
- : null) ?? "application/octet-stream";
12626
- const base64 = typeof value["contentBase64"] === "string"
12627
- ? value["contentBase64"]
12628
- : typeof value["data"] === "string"
12629
- ? value["data"]
12630
- : typeof value["base64"] === "string"
12631
- ? value["base64"]
12632
+ const filename = (typeof value['filename'] === 'string'
12633
+ ? value['filename']
12634
+ : typeof value['fileName'] === 'string'
12635
+ ? value['fileName']
12636
+ : null) ?? 'document.bin';
12637
+ const contentType = (typeof value['contentType'] === 'string'
12638
+ ? value['contentType']
12639
+ : null) ?? 'application/octet-stream';
12640
+ const base64 = typeof value['contentBase64'] === 'string'
12641
+ ? value['contentBase64']
12642
+ : typeof value['data'] === 'string'
12643
+ ? value['data']
12644
+ : typeof value['base64'] === 'string'
12645
+ ? value['base64']
12632
12646
  : null;
12633
12647
  if (base64) {
12634
12648
  const file = this.base64ToFile(base64, filename, contentType);
12635
12649
  if (file)
12636
12650
  return [file];
12637
12651
  }
12638
- const size = typeof value["size"] === "number" ? Math.max(0, value["size"]) : 0;
12652
+ const size = typeof value['size'] === 'number' ? Math.max(0, value['size']) : 0;
12639
12653
  const blob = size > 0
12640
12654
  ? new Blob([new ArrayBuffer(size)], { type: contentType })
12641
12655
  : new Blob([], { type: contentType });
@@ -12652,7 +12666,7 @@ class AttributeMapperService {
12652
12666
  return [];
12653
12667
  if (this.recognition.isGeoSpatialPoint(type))
12654
12668
  return { longitude: null, latitude: null };
12655
- if (type === "BINARY" || type === "BINARY_LINKED")
12669
+ if (type === 'BINARY' || type === 'BINARY_LINKED')
12656
12670
  return []; // FileSelect expects File[]
12657
12671
  return null;
12658
12672
  }
@@ -12665,22 +12679,22 @@ class AttributeMapperService {
12665
12679
  }
12666
12680
  if (this.recognition.isEnum(type)) {
12667
12681
  const options = this.getEnumOptions(attrMetadata);
12668
- const key = typeof rawDefault === "number" ? rawDefault : Number(rawDefault);
12682
+ const key = typeof rawDefault === 'number' ? rawDefault : Number(rawDefault);
12669
12683
  const found = options.find((opt) => opt.key === key);
12670
12684
  return found ? found.key : key;
12671
12685
  }
12672
12686
  if (this.recognition.isNumber(type)) {
12673
- return typeof rawDefault === "number" ? rawDefault : Number(rawDefault);
12687
+ return typeof rawDefault === 'number' ? rawDefault : Number(rawDefault);
12674
12688
  }
12675
12689
  if (this.recognition.isString(type)) {
12676
12690
  return String(rawDefault);
12677
12691
  }
12678
12692
  if (this.recognition.isBoolean(type)) {
12679
- return rawDefault === true || rawDefault === "true" || rawDefault === 1;
12693
+ return rawDefault === true || rawDefault === 'true' || rawDefault === 1;
12680
12694
  }
12681
12695
  if (this.recognition.isDate(type)) {
12682
- if (typeof rawDefault === "string" ||
12683
- typeof rawDefault === "number" ||
12696
+ if (typeof rawDefault === 'string' ||
12697
+ typeof rawDefault === 'number' ||
12684
12698
  rawDefault instanceof Date) {
12685
12699
  const date = new Date(rawDefault);
12686
12700
  return isNaN(date.getTime()) ? null : date;
@@ -12688,14 +12702,14 @@ class AttributeMapperService {
12688
12702
  return null;
12689
12703
  }
12690
12704
  if (this.recognition.isTime(type)) {
12691
- if (typeof rawDefault === "number") {
12705
+ if (typeof rawDefault === 'number') {
12692
12706
  const d = new Date(0);
12693
12707
  d.setUTCHours(0, 0, 0, 0);
12694
12708
  d.setSeconds(rawDefault);
12695
12709
  return d;
12696
12710
  }
12697
- if (typeof rawDefault === "string" ||
12698
- typeof rawDefault === "number" ||
12711
+ if (typeof rawDefault === 'string' ||
12712
+ typeof rawDefault === 'number' ||
12699
12713
  rawDefault instanceof Date) {
12700
12714
  const date = new Date(rawDefault);
12701
12715
  return isNaN(date.getTime()) ? null : date;
@@ -12720,16 +12734,16 @@ class AttributeMapperService {
12720
12734
  /** Returns primitive arrays for Kendo MultiSelect (valuePrimitive: true). */
12721
12735
  parseArrayType(type, value) {
12722
12736
  if (this.recognition.isStringArray(type)) {
12723
- const source = this.isRecordValue(value) && "_v" in value ? value["_v"] : value;
12737
+ const source = this.isRecordValue(value) && '_v' in value ? value['_v'] : value;
12724
12738
  if (!Array.isArray(source))
12725
12739
  return [];
12726
- return source.map((v) => this.isRecordValue(v) && "key" in v ? String(v["key"]) : String(v));
12740
+ return source.map((v) => this.isRecordValue(v) && 'key' in v ? String(v['key']) : String(v));
12727
12741
  }
12728
12742
  if (this.recognition.isIntArray(type)) {
12729
- const source = this.isRecordValue(value) && "_v" in value ? value["_v"] : value; // Handle _v wrapper format from upstream
12743
+ const source = this.isRecordValue(value) && '_v' in value ? value['_v'] : value; // Handle _v wrapper format from upstream
12730
12744
  if (!Array.isArray(source))
12731
12745
  return [];
12732
- return source.map((v) => this.isRecordValue(v) && "key" in v ? Number(v["key"]) : Number(v));
12746
+ return source.map((v) => this.isRecordValue(v) && 'key' in v ? Number(v['key']) : Number(v));
12733
12747
  }
12734
12748
  return [];
12735
12749
  }
@@ -12739,19 +12753,19 @@ class AttributeMapperService {
12739
12753
  }
12740
12754
  if (this.isEnum(attr)) {
12741
12755
  return {
12742
- ckId: attr.attribute?.ckEnum?.ckEnumId?.fullName ?? "",
12756
+ ckId: attr.attribute?.ckEnum?.ckEnumId?.fullName ?? '',
12743
12757
  rtId: null,
12744
12758
  };
12745
12759
  }
12746
12760
  else if (this.isRecord(attr) || this.isRecordArray(attr)) {
12747
12761
  return {
12748
- ckId: attr.attribute?.ckRecord?.ckRecordId?.fullName ?? "",
12762
+ ckId: attr.attribute?.ckRecord?.ckRecordId?.fullName ?? '',
12749
12763
  rtId: null,
12750
12764
  };
12751
12765
  }
12752
12766
  else {
12753
12767
  return {
12754
- ckId: attr.ckAttributeId?.fullName ?? "",
12768
+ ckId: attr.ckAttributeId?.fullName ?? '',
12755
12769
  rtId: null,
12756
12770
  };
12757
12771
  }
@@ -12768,13 +12782,13 @@ class AttributeMapperService {
12768
12782
  }
12769
12783
  return [];
12770
12784
  }
12771
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12772
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMapperService, providedIn: "root" });
12785
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12786
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMapperService, providedIn: 'root' });
12773
12787
  }
12774
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeMapperService, decorators: [{
12788
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeMapperService, decorators: [{
12775
12789
  type: Injectable,
12776
12790
  args: [{
12777
- providedIn: "root",
12791
+ providedIn: 'root',
12778
12792
  }]
12779
12793
  }] });
12780
12794
 
@@ -12826,10 +12840,10 @@ class AttributeDataService {
12826
12840
  }));
12827
12841
  }));
12828
12842
  }
12829
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12830
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeDataService, providedIn: 'root' });
12843
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12844
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeDataService, providedIn: 'root' });
12831
12845
  }
12832
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeDataService, decorators: [{
12846
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeDataService, decorators: [{
12833
12847
  type: Injectable,
12834
12848
  args: [{
12835
12849
  providedIn: 'root',
@@ -12850,15 +12864,15 @@ class AttributeFieldComponent {
12850
12864
  /** Value to restore on UNDO. If not set, UNDO resets to null. */
12851
12865
  baselineValue = input(/* @ts-ignore */
12852
12866
  ...(ngDevMode ? [undefined, { debugName: "baselineValue" }] : /* istanbul ignore next */ []));
12853
- fieldId = input("", /* @ts-ignore */
12867
+ fieldId = input('', /* @ts-ignore */
12854
12868
  ...(ngDevMode ? [{ debugName: "fieldId" }] : /* istanbul ignore next */ []));
12855
12869
  overrideLabelText = input(/* @ts-ignore */
12856
12870
  ...(ngDevMode ? [undefined, { debugName: "overrideLabelText" }] : /* istanbul ignore next */ []));
12857
12871
  showUndoButton = input(true, /* @ts-ignore */
12858
12872
  ...(ngDevMode ? [{ debugName: "showUndoButton" }] : /* istanbul ignore next */ []));
12859
- undoButtonSize = input("medium", /* @ts-ignore */
12873
+ undoButtonSize = input('medium', /* @ts-ignore */
12860
12874
  ...(ngDevMode ? [{ debugName: "undoButtonSize" }] : /* istanbul ignore next */ []));
12861
- errorMessage = input("This field is required or invalid.", /* @ts-ignore */
12875
+ errorMessage = input('This field is required or invalid.', /* @ts-ignore */
12862
12876
  ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
12863
12877
  hintText = input(/* @ts-ignore */
12864
12878
  ...(ngDevMode ? [undefined, { debugName: "hintText" }] : /* istanbul ignore next */ []));
@@ -12880,10 +12894,10 @@ class AttributeFieldComponent {
12880
12894
  this.undo.emit();
12881
12895
  }
12882
12896
  hasHint() {
12883
- return this.hintText() != null && this.hintText() !== "";
12897
+ return this.hintText() != null && this.hintText() !== '';
12884
12898
  }
12885
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12886
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: AttributeFieldComponent, isStandalone: true, selector: "mm-attribute-field", inputs: { attribute: { classPropertyName: "attribute", publicName: "attribute", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, baselineValue: { classPropertyName: "baselineValue", publicName: "baselineValue", isSignal: true, isRequired: false, transformFunction: null }, fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: false, transformFunction: null }, overrideLabelText: { classPropertyName: "overrideLabelText", publicName: "overrideLabelText", isSignal: true, isRequired: false, transformFunction: null }, showUndoButton: { classPropertyName: "showUndoButton", publicName: "showUndoButton", isSignal: true, isRequired: false, transformFunction: null }, undoButtonSize: { classPropertyName: "undoButtonSize", publicName: "undoButtonSize", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hintText: { classPropertyName: "hintText", publicName: "hintText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { undo: "undo" }, ngImport: i0, template: `
12899
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12900
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: AttributeFieldComponent, isStandalone: true, selector: "mm-attribute-field", inputs: { attribute: { classPropertyName: "attribute", publicName: "attribute", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, baselineValue: { classPropertyName: "baselineValue", publicName: "baselineValue", isSignal: true, isRequired: false, transformFunction: null }, fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: false, transformFunction: null }, overrideLabelText: { classPropertyName: "overrideLabelText", publicName: "overrideLabelText", isSignal: true, isRequired: false, transformFunction: null }, showUndoButton: { classPropertyName: "showUndoButton", publicName: "showUndoButton", isSignal: true, isRequired: false, transformFunction: null }, undoButtonSize: { classPropertyName: "undoButtonSize", publicName: "undoButtonSize", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hintText: { classPropertyName: "hintText", publicName: "hintText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { undo: "undo" }, ngImport: i0, template: `
12887
12901
  <div class="k-form-field">
12888
12902
  <kendo-label
12889
12903
  [for]="fieldId()"
@@ -12920,9 +12934,9 @@ class AttributeFieldComponent {
12920
12934
  </div>
12921
12935
  `, isInline: true, styles: [".k-form-field{display:flex;flex-direction:column;gap:4px;margin-bottom:12px}.field-input-container{display:flex;flex-direction:row;align-items:center;gap:8px}.field-input-container .input-wrapper{flex:1;min-width:0}.field-input-container .input-wrapper ::ng-deep .k-widget,.field-input-container .input-wrapper ::ng-deep .k-textbox,.field-input-container .input-wrapper ::ng-deep .k-numerictextbox,.field-input-container .input-wrapper ::ng-deep .k-dropdownlist{width:100%}.k-form-error{font-size:.75rem;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: i1$5.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
12922
12936
  }
12923
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributeFieldComponent, decorators: [{
12937
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributeFieldComponent, decorators: [{
12924
12938
  type: Component,
12925
- args: [{ selector: "mm-attribute-field", standalone: true, imports: [CommonModule, ReactiveFormsModule, KENDO_LABEL, KENDO_BUTTONS], template: `
12939
+ args: [{ selector: 'mm-attribute-field', standalone: true, imports: [CommonModule, ReactiveFormsModule, KENDO_LABEL, KENDO_BUTTONS], template: `
12926
12940
  <div class="k-form-field">
12927
12941
  <kendo-label
12928
12942
  [for]="fieldId()"
@@ -12976,7 +12990,7 @@ class AttributesGroupComponent {
12976
12990
  recognition = inject(AttributeRecognitionService);
12977
12991
  mapper = inject(AttributeMapperService);
12978
12992
  isRecordValue(value) {
12979
- return typeof value === "object" && value !== null && !Array.isArray(value);
12993
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
12980
12994
  }
12981
12995
  // ─── Inputs (public API for parent / template) ─────────────────────────────────────
12982
12996
  ckId = input.required(/* @ts-ignore */
@@ -13090,8 +13104,8 @@ class AttributesGroupComponent {
13090
13104
  }
13091
13105
  const geoValue = this.isRecordValue(initialValue) ? initialValue : {};
13092
13106
  const geoGroup = new FormGroup({
13093
- longitude: new FormControl(geoValue["longitude"] ?? null, longitudeValidators),
13094
- latitude: new FormControl(geoValue["latitude"] ?? null, latitudeValidators),
13107
+ longitude: new FormControl(geoValue['longitude'] ?? null, longitudeValidators),
13108
+ latitude: new FormControl(geoValue['latitude'] ?? null, latitudeValidators),
13095
13109
  });
13096
13110
  form.addControl(attr.attributeName, geoGroup);
13097
13111
  this.setBaselineForAttr(attr, initialValue);
@@ -13111,8 +13125,8 @@ class AttributesGroupComponent {
13111
13125
  const key = attr.attributeName;
13112
13126
  if (this.recognition.isGeoSpatialPoint(attr.attributeValueType)) {
13113
13127
  const v = this.isRecordValue(value) ? value : {};
13114
- this.baselineValues.set(key + ".longitude", this.cloneForBaseline(v["longitude"] ?? null));
13115
- this.baselineValues.set(key + ".latitude", this.cloneForBaseline(v["latitude"] ?? null));
13128
+ this.baselineValues.set(key + '.longitude', this.cloneForBaseline(v['longitude'] ?? null));
13129
+ this.baselineValues.set(key + '.latitude', this.cloneForBaseline(v['latitude'] ?? null));
13116
13130
  }
13117
13131
  else if (!this.recognition.isRecord(attr.attributeValueType) &&
13118
13132
  !this.recognition.isRecordArray(attr.attributeValueType)) {
@@ -13124,7 +13138,7 @@ class AttributesGroupComponent {
13124
13138
  return v;
13125
13139
  if (v instanceof Date)
13126
13140
  return new Date(v.getTime());
13127
- if (typeof v === "object" && v instanceof File)
13141
+ if (typeof v === 'object' && v instanceof File)
13128
13142
  return v;
13129
13143
  if (Array.isArray(v))
13130
13144
  return v.map((x) => this.cloneForBaseline(x));
@@ -13154,7 +13168,7 @@ class AttributesGroupComponent {
13154
13168
  : !this.isRecordValue(value) || Object.keys(value).length === 0;
13155
13169
  if (this.recognition.isGeoSpatialPoint(type)) {
13156
13170
  const v = this.isRecordValue(value) ? value : {};
13157
- return v["longitude"] == null && v["latitude"] == null;
13171
+ return v['longitude'] == null && v['latitude'] == null;
13158
13172
  }
13159
13173
  if (this.recognition.isArray(type))
13160
13174
  return Array.isArray(value) && value.length === 0;
@@ -13162,12 +13176,12 @@ class AttributesGroupComponent {
13162
13176
  }
13163
13177
  isControlValueEmpty(control, type) {
13164
13178
  const value = control.value;
13165
- if (value === null || value === undefined || value === "")
13179
+ if (value === null || value === undefined || value === '')
13166
13180
  return true;
13167
13181
  if (this.recognition.isRecordArray(type) || this.recognition.isRecord(type)) {
13168
13182
  if (Array.isArray(value))
13169
13183
  return value.length === 0;
13170
- const obj = value && typeof value === "object" ? value : {};
13184
+ const obj = value && typeof value === 'object' ? value : {};
13171
13185
  return Object.keys(obj).length === 0;
13172
13186
  }
13173
13187
  if (this.recognition.isGeoSpatialPoint(type)) {
@@ -13274,16 +13288,16 @@ class AttributesGroupComponent {
13274
13288
  const item = raw[index]?.attributes ?? EMPTY_INITIAL_VALUES;
13275
13289
  return Array.isArray(item) ? item : EMPTY_INITIAL_VALUES;
13276
13290
  }
13277
- if (this.isRecordValue(raw) && Array.isArray(raw["attributes"])) {
13278
- return raw["attributes"];
13291
+ if (this.isRecordValue(raw) && Array.isArray(raw['attributes'])) {
13292
+ return raw['attributes'];
13279
13293
  }
13280
13294
  if (raw !== undefined && raw !== null && Array.isArray(raw)) {
13281
13295
  return raw;
13282
13296
  }
13283
13297
  return EMPTY_INITIAL_VALUES;
13284
13298
  }
13285
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributesGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13286
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", 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: `
13299
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributesGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13300
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", 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: `
13287
13301
  <div class="attributes-form-container" [formGroup]="parentFormGroup()">
13288
13302
  <kendo-card [style.margin-bottom.px]="10">
13289
13303
  <kendo-card-header>
@@ -13587,9 +13601,9 @@ class AttributesGroupComponent {
13587
13601
  </div>
13588
13602
  `, 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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
13589
13603
  }
13590
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AttributesGroupComponent, decorators: [{
13604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: AttributesGroupComponent, decorators: [{
13591
13605
  type: Component,
13592
- args: [{ selector: "mm-attributes-group", standalone: true, imports: [
13606
+ args: [{ selector: 'mm-attributes-group', standalone: true, imports: [
13593
13607
  CommonModule,
13594
13608
  ReactiveFormsModule,
13595
13609
  KENDO_LAYOUT,
@@ -13938,9 +13952,9 @@ class SharedEditor {
13938
13952
  this.notificationService.show({
13939
13953
  content: message,
13940
13954
  hideAfter: 3000,
13941
- position: { horizontal: "right", vertical: "top" },
13942
- animation: { type: "fade", duration: 400 },
13943
- type: { style: "error", icon: true },
13955
+ position: { horizontal: 'right', vertical: 'top' },
13956
+ animation: { type: 'fade', duration: 400 },
13957
+ type: { style: 'error', icon: true },
13944
13958
  });
13945
13959
  }
13946
13960
  /** Wraps variables with optional multipart context based on whether a File is present anywhere in the payload. */
@@ -13964,18 +13978,18 @@ class SharedEditor {
13964
13978
  if (Array.isArray(value)) {
13965
13979
  return value.some((item) => this.containsFile(item));
13966
13980
  }
13967
- if (typeof value === "object") {
13981
+ if (typeof value === 'object') {
13968
13982
  return Object.values(value).some((v) => this.containsFile(v));
13969
13983
  }
13970
13984
  return false;
13971
13985
  }
13972
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SharedEditor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13973
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SharedEditor, providedIn: "root" });
13986
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SharedEditor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13987
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SharedEditor, providedIn: 'root' });
13974
13988
  }
13975
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SharedEditor, decorators: [{
13989
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SharedEditor, decorators: [{
13976
13990
  type: Injectable,
13977
13991
  args: [{
13978
- providedIn: "root",
13992
+ providedIn: 'root',
13979
13993
  }]
13980
13994
  }] });
13981
13995
 
@@ -14025,7 +14039,7 @@ class CreateEditorComponent {
14025
14039
  const isDirty = this.formIsDifferentFromInitial();
14026
14040
  return (!this.isCreating() &&
14027
14041
  !this.isCanceling() &&
14028
- status === "VALID" &&
14042
+ status === 'VALID' &&
14029
14043
  isLoaded &&
14030
14044
  isDirty);
14031
14045
  }, /* @ts-ignore */
@@ -14044,7 +14058,7 @@ class CreateEditorComponent {
14044
14058
  ...(ngDevMode ? [{ debugName: "formIsDifferentFromInitial" }] : /* istanbul ignore next */ []));
14045
14059
  formStatusSignal = toSignal(toObservable(this.form).pipe(switchMap$1((f) => {
14046
14060
  if (!f)
14047
- return of("INVALID");
14061
+ return of('INVALID');
14048
14062
  return f.statusChanges.pipe(startWith(f.status));
14049
14063
  })));
14050
14064
  formValueSignal = toSignal(toObservable(this.form).pipe(switchMap$1((f) => {
@@ -14097,7 +14111,7 @@ class CreateEditorComponent {
14097
14111
  }
14098
14112
  }
14099
14113
  catch (error) {
14100
- console.error("Error saving entity:", error);
14114
+ console.error('Error saving entity:', error);
14101
14115
  this.sharedEditor.showErrorNotification(this.resolvedMessages().failedToCreateEntity);
14102
14116
  }
14103
14117
  finally {
@@ -14132,7 +14146,7 @@ class CreateEditorComponent {
14132
14146
  if (parent?.ckTypeId && parent?.rtId) {
14133
14147
  entity.associations = [
14134
14148
  {
14135
- roleName: input?.parentRoleName ?? "parent",
14149
+ roleName: input?.parentRoleName ?? 'parent',
14136
14150
  targets: [
14137
14151
  {
14138
14152
  modOption: AssociationModOptionsDto.CreateDto,
@@ -14169,8 +14183,8 @@ class CreateEditorComponent {
14169
14183
  this.selectedRtCkTypeId.set(null);
14170
14184
  this.selectedCkTypeId.set(null);
14171
14185
  }
14172
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CreateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14173
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CreateEditorComponent, isStandalone: true, selector: "mm-create-editor-component", inputs: { createInput: { classPropertyName: "createInput", publicName: "createInput", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { createOutput: "createOutput", cancelRequested: "cancelRequested" }, ngImport: i0, template: `
14186
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CreateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: CreateEditorComponent, isStandalone: true, selector: "mm-create-editor-component", inputs: { createInput: { classPropertyName: "createInput", publicName: "createInput", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { createOutput: "createOutput", cancelRequested: "cancelRequested" }, ngImport: i0, template: `
14174
14188
  <div class="entity-editor-container">
14175
14189
  <kendo-card class="basic-info-card">
14176
14190
  <kendo-card-header>
@@ -14239,9 +14253,9 @@ class CreateEditorComponent {
14239
14253
  </div>
14240
14254
  `, 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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], 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"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
14241
14255
  }
14242
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CreateEditorComponent, decorators: [{
14256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CreateEditorComponent, decorators: [{
14243
14257
  type: Component,
14244
- args: [{ selector: "mm-create-editor-component", imports: [
14258
+ args: [{ selector: 'mm-create-editor-component', imports: [
14245
14259
  ReactiveFormsModule,
14246
14260
  CardModule,
14247
14261
  KENDO_INPUTS,
@@ -14368,7 +14382,7 @@ class UpdateEditorComponent {
14368
14382
  const isDirty = this.formIsDifferentFromInitial();
14369
14383
  return (!this.isUpdating() &&
14370
14384
  !this.isCanceling() &&
14371
- status === "VALID" &&
14385
+ status === 'VALID' &&
14372
14386
  isLoaded &&
14373
14387
  isDirty);
14374
14388
  }, /* @ts-ignore */
@@ -14379,7 +14393,7 @@ class UpdateEditorComponent {
14379
14393
  ...(ngDevMode ? [{ debugName: "isCancelButtonEnabled" }] : /* istanbul ignore next */ []));
14380
14394
  formStatusSignal = toSignal(toObservable(this.form).pipe(switchMap$1((f) => {
14381
14395
  if (!f)
14382
- return of("INVALID");
14396
+ return of('INVALID');
14383
14397
  return f.statusChanges.pipe(startWith(f.status));
14384
14398
  })));
14385
14399
  formValueSignal = toSignal(toObservable(this.form).pipe(switchMap$1((f) => {
@@ -14468,7 +14482,7 @@ class UpdateEditorComponent {
14468
14482
  }
14469
14483
  }
14470
14484
  catch (error) {
14471
- console.error("Error updating entity:", error);
14485
+ console.error('Error updating entity:', error);
14472
14486
  this.sharedEditor.showErrorNotification(this.resolvedMessages().failedToUpdateEntity);
14473
14487
  }
14474
14488
  finally {
@@ -14497,8 +14511,8 @@ class UpdateEditorComponent {
14497
14511
  },
14498
14512
  };
14499
14513
  }
14500
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14501
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: UpdateEditorComponent, isStandalone: true, selector: "mm-update-editor-component", inputs: { updateInput: { classPropertyName: "updateInput", publicName: "updateInput", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updateOutput: "updateOutput", cancelRequested: "cancelRequested" }, ngImport: i0, template: `
14514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UpdateEditorComponent, isStandalone: true, selector: "mm-update-editor-component", inputs: { updateInput: { classPropertyName: "updateInput", publicName: "updateInput", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updateOutput: "updateOutput", cancelRequested: "cancelRequested" }, ngImport: i0, template: `
14502
14516
  <div class="entity-editor-container">
14503
14517
  <kendo-card class="basic-info-card">
14504
14518
  <kendo-card-header>
@@ -14576,9 +14590,9 @@ class UpdateEditorComponent {
14576
14590
  </div>
14577
14591
  `, 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", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues", "messages"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
14578
14592
  }
14579
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: UpdateEditorComponent, decorators: [{
14593
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UpdateEditorComponent, decorators: [{
14580
14594
  type: Component,
14581
- args: [{ selector: "mm-update-editor-component", imports: [
14595
+ args: [{ selector: 'mm-update-editor-component', imports: [
14582
14596
  ReactiveFormsModule,
14583
14597
  CardModule,
14584
14598
  KENDO_INPUTS,
@@ -14704,38 +14718,38 @@ class RuntimeBrowserDetailsComponent {
14704
14718
  get ckTypeColumns() {
14705
14719
  return [
14706
14720
  {
14707
- field: "rtId",
14721
+ field: 'rtId',
14708
14722
  displayName: this._messages.runtimeId,
14709
- dataType: "text",
14723
+ dataType: 'text',
14710
14724
  },
14711
14725
  {
14712
- field: "ckTypeId",
14726
+ field: 'ckTypeId',
14713
14727
  displayName: this._messages.typeId,
14714
- dataType: "text",
14728
+ dataType: 'text',
14715
14729
  },
14716
14730
  {
14717
- field: "rtWellKnownName",
14731
+ field: 'rtWellKnownName',
14718
14732
  displayName: this._messages.wellKnownName,
14719
- dataType: "text",
14733
+ dataType: 'text',
14720
14734
  },
14721
14735
  {
14722
- field: "rtCreationDateTime",
14736
+ field: 'rtCreationDateTime',
14723
14737
  displayName: this._messages.created,
14724
- format: "short",
14725
- dataType: "iso8601",
14738
+ format: 'short',
14739
+ dataType: 'iso8601',
14726
14740
  },
14727
14741
  {
14728
- field: "rtChangedDateTime",
14742
+ field: 'rtChangedDateTime',
14729
14743
  displayName: this._messages.modified,
14730
- format: "short",
14731
- dataType: "iso8601",
14744
+ format: 'short',
14745
+ dataType: 'iso8601',
14732
14746
  },
14733
14747
  ];
14734
14748
  }
14735
14749
  get ckTypeViewDetailsCommand() {
14736
14750
  return {
14737
- id: "view",
14738
- type: "link",
14751
+ id: 'view',
14752
+ type: 'link',
14739
14753
  text: this._messages.viewDetails,
14740
14754
  svgIcon: this.detailsIcon,
14741
14755
  onClick: this.onViewEntityDetails,
@@ -14751,26 +14765,26 @@ class RuntimeBrowserDetailsComponent {
14751
14765
  ngAfterViewInit() {
14752
14766
  // If we have a pending CK type ID, set it now
14753
14767
  if (this.pendingRtCkTypeId && this.dataSourceDirective) {
14754
- console.debug("AfterViewInit: Setting pending CK Type ID:", this.pendingRtCkTypeId);
14768
+ console.debug('AfterViewInit: Setting pending CK Type ID:', this.pendingRtCkTypeId);
14755
14769
  this.dataSourceDirective.setRtCkTypeId(this.pendingRtCkTypeId);
14756
14770
  this.pendingRtCkTypeId = null;
14757
14771
  }
14758
14772
  }
14759
14773
  async ngOnChanges(changes) {
14760
- if (changes["selectedItem"] && this.selectedItem) {
14761
- console.debug("Selected item changed:", this.selectedItem);
14774
+ if (changes['selectedItem'] && this.selectedItem) {
14775
+ console.debug('Selected item changed:', this.selectedItem);
14762
14776
  // If it's a CK Type, update the data source with the type ID
14763
14777
  if (this.isCkType(this.selectedItem.item)) {
14764
14778
  const rtCkTypeId = this.getRtCkTypeId(this.selectedItem.item);
14765
- console.debug("Setting CK Type ID:", rtCkTypeId);
14779
+ console.debug('Setting CK Type ID:', rtCkTypeId);
14766
14780
  // Use setTimeout to ensure ViewChild is initialized
14767
14781
  setTimeout(() => {
14768
14782
  if (this.dataSourceDirective) {
14769
- console.debug("ngOnChanges: ViewChild ready, setting CK Type ID:", rtCkTypeId);
14783
+ console.debug('ngOnChanges: ViewChild ready, setting CK Type ID:', rtCkTypeId);
14770
14784
  this.dataSourceDirective.setRtCkTypeId(rtCkTypeId);
14771
14785
  }
14772
14786
  else {
14773
- console.debug("ngOnChanges: ViewChild not ready, storing pending CK Type ID:", rtCkTypeId);
14787
+ console.debug('ngOnChanges: ViewChild not ready, storing pending CK Type ID:', rtCkTypeId);
14774
14788
  this.pendingRtCkTypeId = rtCkTypeId;
14775
14789
  }
14776
14790
  }, 0);
@@ -14784,7 +14798,7 @@ class RuntimeBrowserDetailsComponent {
14784
14798
  this.pendingRtCkTypeId = null;
14785
14799
  }
14786
14800
  }
14787
- else if (changes["selectedItem"] && !this.selectedItem) {
14801
+ else if (changes['selectedItem'] && !this.selectedItem) {
14788
14802
  this.fullEntity = null;
14789
14803
  this.error = null;
14790
14804
  this.pendingRtCkTypeId = null;
@@ -14821,7 +14835,7 @@ class RuntimeBrowserDetailsComponent {
14821
14835
  if (token !== this.loadRequestToken) {
14822
14836
  return;
14823
14837
  }
14824
- console.error("Failed to load full entity details:", error);
14838
+ console.error('Failed to load full entity details:', error);
14825
14839
  this.error = this._messages.failedToLoadEntityDetails;
14826
14840
  // Fall back to the basic entity data
14827
14841
  this.fullEntity = runtimeEntity;
@@ -14841,16 +14855,16 @@ class RuntimeBrowserDetailsComponent {
14841
14855
  // Save current state before navigating
14842
14856
  this.stateService.saveState(this.selectedItem);
14843
14857
  const encodedId = RtEntityIdHelper.encode(runtimeEntity.rtId, runtimeEntity.ckTypeId);
14844
- await this.router.navigate(["entity", encodedId], {
14858
+ await this.router.navigate(['entity', encodedId], {
14845
14859
  relativeTo: this.route,
14846
14860
  });
14847
14861
  }
14848
14862
  async navigateToEntity(rtId, ckTypeId) {
14849
- if (!rtId || !ckTypeId || rtId === "Unknown" || ckTypeId === "Unknown") {
14863
+ if (!rtId || !ckTypeId || rtId === 'Unknown' || ckTypeId === 'Unknown') {
14850
14864
  return;
14851
14865
  }
14852
14866
  const encodedId = RtEntityIdHelper.encode(rtId, ckTypeId);
14853
- await this.router.navigate(["entity", encodedId], {
14867
+ await this.router.navigate(['entity', encodedId], {
14854
14868
  relativeTo: this.route,
14855
14869
  });
14856
14870
  }
@@ -14865,50 +14879,50 @@ class RuntimeBrowserDetailsComponent {
14865
14879
  return null;
14866
14880
  }
14867
14881
  isCkModel(item) {
14868
- return !!item && "id" in item && !("rtId" in item) && !("ckTypeId" in item);
14882
+ return !!item && 'id' in item && !('rtId' in item) && !('ckTypeId' in item);
14869
14883
  }
14870
14884
  isCkType(item) {
14871
- return !!item && "ckTypeId" in item && !("rtId" in item) && !("id" in item);
14885
+ return !!item && 'ckTypeId' in item && !('rtId' in item) && !('id' in item);
14872
14886
  }
14873
14887
  isCkModelsRoot(item) {
14874
- return !!item && "isCkModelsRoot" in item;
14888
+ return !!item && 'isCkModelsRoot' in item;
14875
14889
  }
14876
14890
  // Helper methods to get CK Model properties
14877
14891
  getCkModelIdFullName(item) {
14878
14892
  if (!this.isCkModel(item))
14879
- return "Unknown";
14880
- return item.id.fullName || "Unknown";
14893
+ return 'Unknown';
14894
+ return item.id.fullName || 'Unknown';
14881
14895
  }
14882
14896
  getCkModelIdName(item) {
14883
14897
  if (!this.isCkModel(item))
14884
- return "Unknown";
14885
- return item.id.name || "Unknown";
14898
+ return 'Unknown';
14899
+ return item.id.name || 'Unknown';
14886
14900
  }
14887
14901
  getCkModelIdVersion(item) {
14888
14902
  if (!this.isCkModel(item))
14889
- return "Unknown";
14890
- return item.id.version || "Unknown";
14903
+ return 'Unknown';
14904
+ return item.id.version || 'Unknown';
14891
14905
  }
14892
14906
  getCkModelIdSemanticName(item) {
14893
14907
  if (!this.isCkModel(item))
14894
- return "Unknown";
14895
- return item.id.semanticVersionedFullName || "Unknown";
14908
+ return 'Unknown';
14909
+ return item.id.semanticVersionedFullName || 'Unknown';
14896
14910
  }
14897
14911
  getCkModelState(item) {
14898
14912
  if (!this.isCkModel(item))
14899
- return "Unknown";
14900
- return item.modelState || "Unknown";
14913
+ return 'Unknown';
14914
+ return item.modelState || 'Unknown';
14901
14915
  }
14902
14916
  // Helper methods to get CK Type properties
14903
14917
  getCkTypeId(item) {
14904
14918
  if (!this.isCkType(item))
14905
- return "Unknown";
14906
- return item.ckTypeId.fullName || "Unknown";
14919
+ return 'Unknown';
14920
+ return item.ckTypeId.fullName || 'Unknown';
14907
14921
  }
14908
14922
  getRtCkTypeId(item) {
14909
14923
  if (!this.isCkType(item))
14910
- return "Unknown";
14911
- return item.rtCkTypeId || "Unknown";
14924
+ return 'Unknown';
14925
+ return item.rtCkTypeId || 'Unknown';
14912
14926
  }
14913
14927
  isCkTypeAbstract(item) {
14914
14928
  return this.isCkType(item) && item.isAbstract === true;
@@ -14938,7 +14952,7 @@ class RuntimeBrowserDetailsComponent {
14938
14952
  parent: {
14939
14953
  ckTypeId: rtEntityDto?.item.ckTypeId,
14940
14954
  rtId: rtEntityDto?.item.rtId,
14941
- name: parentNode?.text ?? "",
14955
+ name: parentNode?.text ?? '',
14942
14956
  },
14943
14957
  derivedFromRtCkTypeId,
14944
14958
  };
@@ -14948,13 +14962,13 @@ class RuntimeBrowserDetailsComponent {
14948
14962
  }
14949
14963
  enterEditMode(selectedItem, rtCkTypeId) {
14950
14964
  const rtEntityDto = selectedItem;
14951
- const rtId = rtEntityDto?.item?.rtId ?? "";
14965
+ const rtId = rtEntityDto?.item?.rtId ?? '';
14952
14966
  const ckTypeId = rtEntityDto?.item?.ckTypeId;
14953
14967
  if (!rtId || !ckTypeId || !rtCkTypeId) {
14954
- console.warn("Enter edit mode skipped: missing rtId, ckTypeId or rtCkTypeId.", { rtId, ckTypeId, rtCkTypeId });
14968
+ console.warn('Enter edit mode skipped: missing rtId, ckTypeId or rtCkTypeId.', { rtId, ckTypeId, rtCkTypeId });
14955
14969
  return;
14956
14970
  }
14957
- const name = rtEntityDto?.text ?? "";
14971
+ const name = rtEntityDto?.text ?? '';
14958
14972
  this.updateInput = {
14959
14973
  name,
14960
14974
  rtId,
@@ -14963,7 +14977,7 @@ class RuntimeBrowserDetailsComponent {
14963
14977
  };
14964
14978
  this.isCreateModeEnabled = false;
14965
14979
  this.isUpdateModeEnabled = true;
14966
- console.debug("Entered update mode with input:", this.updateInput);
14980
+ console.debug('Entered update mode with input:', this.updateInput);
14967
14981
  }
14968
14982
  /**
14969
14983
  * Handles the result of the save operation from the child component
@@ -15009,7 +15023,7 @@ class RuntimeBrowserDetailsComponent {
15009
15023
  this.loadFullEntityDetails();
15010
15024
  }
15011
15025
  onCancel() {
15012
- console.debug("Creation or update cancelled, resetting state.");
15026
+ console.debug('Creation or update cancelled, resetting state.');
15013
15027
  this.isCreateModeEnabled = false;
15014
15028
  this.isUpdateModeEnabled = false;
15015
15029
  this.createInput = undefined;
@@ -15303,8 +15317,8 @@ class RuntimeBrowserDetailsComponent {
15303
15317
  });
15304
15318
  }
15305
15319
  }
15306
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15307
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: RuntimeBrowserDetailsComponent, isStandalone: true, selector: "mm-runtime-browser-details", inputs: { selectedItem: "selectedItem", showDataMapping: "showDataMapping", messages: "messages", expressionValidator: "expressionValidator" }, outputs: { entitySaved: "entitySaved" }, viewQueries: [{ propertyName: "dataSourceDirective", first: true, predicate: ["dir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
15320
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15321
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: RuntimeBrowserDetailsComponent, isStandalone: true, selector: "mm-runtime-browser-details", inputs: { selectedItem: "selectedItem", showDataMapping: "showDataMapping", messages: "messages", expressionValidator: "expressionValidator" }, outputs: { entitySaved: "entitySaved" }, viewQueries: [{ propertyName: "dataSourceDirective", first: true, predicate: ["dir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
15308
15322
  <div class="runtime-browser-details">
15309
15323
  @if (isCreateModeEnabled) {
15310
15324
  <mm-create-editor-component
@@ -15446,9 +15460,9 @@ class RuntimeBrowserDetailsComponent {
15446
15460
  </div>
15447
15461
  `, isInline: true, styles: [":host{display:block;height:100%;width:100%}.runtime-browser-details{display:flex;flex-direction:column;flex:1;min-height:0;padding:24px;box-sizing:border-box;overflow-y:auto;background:linear-gradient(180deg,var(--surface-elevated) 0%,var(--deep-sea) 100%)}.runtime-browser-details .no-selection{display:flex;align-items:center;justify-content:center;flex:1;min-height:0}.runtime-browser-details .no-selection .placeholder-content{text-align:center;max-width:400px;padding:40px;background:linear-gradient(135deg,var(--iron-navy-80),var(--surface-elevated-90));border:1px solid var(--octo-mint-30);border-radius:8px 24px;box-shadow:0 0 30px var(--octo-mint-10),inset 0 0 40px var(--octo-mint-03)}.runtime-browser-details .no-selection .placeholder-content .placeholder-icon{margin-bottom:24px}.runtime-browser-details .no-selection .placeholder-content .placeholder-icon .k-icon{font-size:64px;color:var(--octo-mint-50);text-shadow:0 0 20px var(--octo-mint-50);animation:lcars-icon-pulse 3s ease-in-out infinite}.runtime-browser-details .no-selection .placeholder-content h3{margin:0 0 12px;font-family:Montserrat,sans-serif;font-size:1.4rem;font-weight:700;letter-spacing:2px;text-transform:uppercase;color:var(--octo-mint);text-shadow:0 0 15px var(--octo-mint-50)}.runtime-browser-details .no-selection .placeholder-content p{margin:0;font-family:Montserrat,sans-serif;font-size:.9rem;line-height:1.6;color:rgba(var(--octo-text-color),.7);letter-spacing:.5px}.runtime-browser-details .entity-details{height:100%;display:flex;flex-direction:column;overflow:hidden}.runtime-browser-details .entity-details .details-header{display:flex;align-items:center;gap:16px;padding:16px 20px 16px 24px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;margin-bottom:20px;position:relative;box-shadow:0 4px 20px #0006,0 0 15px var(--octo-mint-08)}.runtime-browser-details .entity-details .details-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}.runtime-browser-details .entity-details .details-header .entity-icon{font-size:28px;color:var(--octo-mint);text-shadow:0 0 10px var(--octo-mint-50)}.runtime-browser-details .entity-details .details-header .entity-title{flex:1}.runtime-browser-details .entity-details .details-header .entity-title h3{margin:0 0 6px;font-family:Montserrat,sans-serif;font-size:1.1rem;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--octo-text-color)}.runtime-browser-details .entity-details .details-header .entity-title .entity-type{margin:0;font-family:Roboto Mono,monospace;font-size:.8rem;color:var(--neo-cyan);background:var(--deep-sea-60);padding:4px 10px;border-radius:4px;border:1px solid var(--neo-cyan-30);display:inline-block}.runtime-browser-details .entity-details mm-entity-detail-view{flex:1;display:flex;flex-direction:column;overflow-y:auto}.runtime-browser-details .entity-details .ck-model-details,.runtime-browser-details .entity-details .ck-models-root{padding:24px;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;position:relative}.runtime-browser-details .entity-details .ck-model-details:before,.runtime-browser-details .entity-details .ck-models-root: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)}.runtime-browser-details .entity-details .ck-model-details h3,.runtime-browser-details .entity-details .ck-models-root h3{margin:0 0 20px;font-family:Montserrat,sans-serif;font-size:1.1rem;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--octo-text-color)}.runtime-browser-details .entity-details .ck-model-details p,.runtime-browser-details .entity-details .ck-models-root p{margin:0 0 12px;font-family:Roboto,sans-serif;font-size:.9rem;color:rgba(var(--octo-text-color),.85)}.runtime-browser-details .entity-details .ck-model-details p strong,.runtime-browser-details .entity-details .ck-models-root p strong{font-family:Montserrat,sans-serif;font-weight:600;font-size:.8rem;letter-spacing:.5px;text-transform:uppercase;color:var(--octo-mint-80);margin-right:12px}.runtime-browser-details .entity-details .ck-model-details p.info-text,.runtime-browser-details .entity-details .ck-models-root p.info-text{color:rgba(var(--octo-text-color),.6);font-style:italic;margin-top:24px;padding:16px 20px;background:linear-gradient(135deg,var(--neo-cyan-10),var(--neo-cyan-05));border:1px solid var(--neo-cyan-30);border-radius:4px 12px}.runtime-browser-details .entity-details .ck-type-details{display:flex;flex-direction:column;height:100%;padding:0}.runtime-browser-details .entity-details .ck-type-details .type-header{margin-bottom:20px;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}.runtime-browser-details .entity-details .ck-type-details .type-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)}.runtime-browser-details .entity-details .ck-type-details .type-header h3{margin:0 0 12px;font-family:Montserrat,sans-serif;font-size:1.1rem;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--octo-text-color)}.runtime-browser-details .entity-details .ck-type-details .type-header .type-metadata{display:flex;gap:10px;align-items:center}.runtime-browser-details .entity-details .ck-type-details .type-header .type-metadata .badge{padding:6px 14px;border-radius:4px;font-family:Montserrat,sans-serif;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.runtime-browser-details .entity-details .ck-type-details .type-header .type-metadata .badge.abstract{background:linear-gradient(135deg,var(--royal-violet-30),var(--royal-violet-15));border:1px solid var(--royal-violet-50);color:var(--royal-violet-light-20);box-shadow:0 0 10px var(--royal-violet-30)}.runtime-browser-details .entity-details .ck-type-details .type-header .type-metadata .badge.final{background:linear-gradient(135deg,var(--toffee-30),var(--toffee-15));border:1px solid var(--toffee-50);color:var(--toffee);box-shadow:0 0 10px var(--toffee-30)}.runtime-browser-details .entity-details .ck-type-details .type-header .type-metadata .base-type{font-family:Roboto Mono,monospace;font-size:.8rem;color:var(--neo-cyan);background:var(--deep-sea-60);padding:4px 10px;border-radius:4px;border:1px solid var(--neo-cyan-30)}.runtime-browser-details .entity-details .ck-type-details .entities-table{flex:1;display:flex;flex-direction:column;overflow:hidden;background:linear-gradient(180deg,var(--iron-navy),var(--surface-elevated));border:1px solid var(--octo-mint-30);border-radius:4px 16px;padding:20px}.runtime-browser-details .entity-details .ck-type-details .entities-table h4{margin:0 0 16px;font-family:Montserrat,sans-serif;font-size:1rem;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--octo-mint)}.runtime-browser-details .entity-details .ck-type-details .entities-table mm-list-view{flex:1;display:flex;flex-direction:column;overflow:hidden}@keyframes lcars-icon-pulse{0%,to{opacity:.5;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}@media(max-width:768px){.runtime-browser-details{padding:16px}.runtime-browser-details .no-selection .placeholder-content{padding:24px}.runtime-browser-details .no-selection .placeholder-content .placeholder-icon .k-icon{font-size:48px}.runtime-browser-details .no-selection .placeholder-content h3{font-size:1.1rem}.runtime-browser-details .entity-details .details-header{flex-direction:column;align-items:flex-start;gap:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: EntityDetailViewComponent, selector: "mm-entity-detail-view", inputs: ["entity", "loading", "error", "showHeader", "messages", "showDataMapping", "dataMappings", "expressionValidator"], outputs: ["retry", "propertyChange", "navigateToEntity", "addMappingRequested", "removeMappingRequested", "selectMappingTarget", "selectSourceAttributeRequested", "selectTargetAttributeRequested", "mappingChanged", "saveAllMappingsRequested"] }, { kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "autoPageSize", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "persistListState", "listStateKey", "resizable", "actionsColumnWidth", "hideCheckboxesBelow", "cardModeBelow", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked", "resetFilters"] }, { kind: "directive", type: CkTypeEntitiesDataSourceDirective, selector: "[mmCkTypeEntitiesDataSource]", exportAs: ["mmCkTypeEntitiesDataSource"] }, { kind: "component", type: CreateEditorComponent, selector: "mm-create-editor-component", inputs: ["createInput", "messages"], outputs: ["createOutput", "cancelRequested"] }, { kind: "component", type: UpdateEditorComponent, selector: "mm-update-editor-component", inputs: ["updateInput", "messages"], outputs: ["updateOutput", "cancelRequested"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
15448
15462
  }
15449
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, decorators: [{
15463
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, decorators: [{
15450
15464
  type: Component,
15451
- args: [{ selector: "mm-runtime-browser-details", imports: [
15465
+ args: [{ selector: 'mm-runtime-browser-details', imports: [
15452
15466
  CommonModule,
15453
15467
  ButtonModule,
15454
15468
  SVGIconModule,
@@ -15608,7 +15622,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
15608
15622
  type: Output
15609
15623
  }], dataSourceDirective: [{
15610
15624
  type: ViewChild,
15611
- args: ["dir", { static: false }]
15625
+ args: ['dir', { static: false }]
15612
15626
  }], expressionValidator: [{
15613
15627
  type: Input
15614
15628
  }] } });
@@ -16220,8 +16234,8 @@ class RuntimeBrowserComponent {
16220
16234
  await this.treeDetail.refreshTree();
16221
16235
  }
16222
16236
  }
16223
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16224
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: RuntimeBrowserComponent, isStandalone: true, selector: "mm-runtime-browser", inputs: { messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, showDataMapping: { classPropertyName: "showDataMapping", publicName: "showDataMapping", isSignal: true, isRequired: false, transformFunction: null }, expressionValidator: { classPropertyName: "expressionValidator", publicName: "expressionValidator", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "treeDetail", first: true, predicate: ["treeDetail"], descendants: true }, { propertyName: "detailsPanel", first: true, predicate: ["detailsPanel"], descendants: true }], ngImport: i0, template: `
16237
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16238
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: RuntimeBrowserComponent, isStandalone: true, selector: "mm-runtime-browser", inputs: { messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, showDataMapping: { classPropertyName: "showDataMapping", publicName: "showDataMapping", isSignal: true, isRequired: false, transformFunction: null }, expressionValidator: { classPropertyName: "expressionValidator", publicName: "expressionValidator", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "treeDetail", first: true, predicate: ["treeDetail"], descendants: true }, { propertyName: "detailsPanel", first: true, predicate: ["detailsPanel"], descendants: true }], ngImport: i0, template: `
16225
16239
  <div class="runtime-browser-container kendo-theme-provider">
16226
16240
  <!-- LCARS Header -->
16227
16241
  <div class="lcars-page-header">
@@ -16291,7 +16305,7 @@ class RuntimeBrowserComponent {
16291
16305
  </div>
16292
16306
  `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}.runtime-browser-container{display:flex;flex-direction:column;height:100%;padding:16px;gap:16px}::ng-deep mm-base-tree-detail .k-splitter{background:transparent;border:none}::ng-deep mm-base-tree-detail .k-splitter .k-splitbar{background:linear-gradient(180deg,var(--octo-mint-30),transparent);width:4px!important}::ng-deep mm-base-tree-detail .k-splitter .k-splitbar:hover{background:linear-gradient(180deg,var(--octo-mint-50),var(--octo-mint-20))}::ng-deep mm-base-tree-detail kendo-treeview .k-treeview-item .k-treeview-leaf{font-family:Roboto,sans-serif;transition:all .2s ease;border-radius:4px}::ng-deep mm-base-tree-detail kendo-treeview .k-treeview-item .k-treeview-leaf:hover{background:var(--octo-mint-10);color:var(--octo-mint)}::ng-deep mm-base-tree-detail kendo-treeview .k-treeview-item .k-treeview-leaf.k-selected{background:linear-gradient(90deg,var(--octo-mint-20),transparent);color:var(--octo-mint);border-left:3px solid var(--octo-mint)}::ng-deep mm-base-tree-detail kendo-treeview .k-treeview-item .k-treeview-leaf.k-selected:hover{background:linear-gradient(90deg,var(--octo-mint-25),transparent)}::ng-deep mm-base-tree-detail .toolbar{background:linear-gradient(90deg,var(--octo-mint-05),transparent);border-bottom:1px solid var(--octo-mint-20)}::ng-deep mm-base-tree-detail .base-tree-detail-container{height:100%;display:flex;flex-direction:column}::ng-deep mm-base-tree-detail .base-tree-detail-container .k-splitter{flex:1;min-height:0}::ng-deep mm-base-tree-detail kendo-splitter-pane.detail-pane{display:flex!important;flex-direction:column!important;height:100%!important}::ng-deep mm-base-tree-detail kendo-splitter-pane.detail-pane>mm-runtime-browser-details{display:flex!important;flex:1!important;min-height:0!important;height:100%!important}::ng-deep mm-base-tree-detail kendo-splitter-pane.detail-pane>mm-runtime-browser-details>.runtime-browser-details{flex:1;display:flex;flex-direction:column;min-height:0}@media(max-width:1024px){.runtime-browser-container{padding:12px;gap:12px}}@media(max-width:768px){.runtime-browser-container{padding:8px;gap:10px}}\n"], dependencies: [{ kind: "component", type: BaseTreeDetailComponent, selector: "mm-base-tree-detail", inputs: ["treeDataSource", "leftPaneSize", "leftToolbarActions", "rightToolbarActions"], outputs: ["nodeSelected", "nodeDropped"] }, { kind: "component", type: RuntimeBrowserDetailsComponent, selector: "mm-runtime-browser-details", inputs: ["selectedItem", "showDataMapping", "messages", "expressionValidator"], outputs: ["entitySaved"] }, { kind: "component", type: PerspectiveSwitcherComponent, selector: "mm-perspective-switcher", inputs: ["perspectives", "activeKey", "label"], outputs: ["perspectiveChange"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
16293
16307
  }
16294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserComponent, decorators: [{
16308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserComponent, decorators: [{
16295
16309
  type: Component,
16296
16310
  args: [{ selector: 'mm-runtime-browser', imports: [
16297
16311
  BaseTreeDetailComponent,
@@ -16379,10 +16393,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
16379
16393
  * Use as the parent component when mounting runtime browser routes as children.
16380
16394
  */
16381
16395
  class RuntimeBrowserOutletComponent {
16382
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16383
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: RuntimeBrowserOutletComponent, isStandalone: true, selector: "mm-runtime-browser-outlet", ngImport: i0, template: `<router-outlet />`, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
16396
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16397
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: RuntimeBrowserOutletComponent, isStandalone: true, selector: "mm-runtime-browser-outlet", ngImport: i0, template: `<router-outlet />`, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
16384
16398
  }
16385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserOutletComponent, decorators: [{
16399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserOutletComponent, decorators: [{
16386
16400
  type: Component,
16387
16401
  args: [{ selector: 'mm-runtime-browser-outlet', standalone: true, imports: [RouterOutlet], changeDetection: ChangeDetectionStrategy.Eager, template: `<router-outlet />`, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"] }]
16388
16402
  }] });
@@ -16404,10 +16418,10 @@ class RuntimeBrowserPageComponent {
16404
16418
  messages = this.injectedMessages
16405
16419
  ? this.injectedMessages
16406
16420
  : DEFAULT_RUNTIME_BROWSER_MESSAGES;
16407
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16408
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: RuntimeBrowserPageComponent, isStandalone: true, selector: "mm-runtime-browser-page", ngImport: i0, template: `<mm-runtime-browser [messages]="messages" />`, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "component", type: RuntimeBrowserComponent, selector: "mm-runtime-browser", inputs: ["messages", "showDataMapping", "expressionValidator"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
16421
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16422
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: RuntimeBrowserPageComponent, isStandalone: true, selector: "mm-runtime-browser-page", ngImport: i0, template: `<mm-runtime-browser [messages]="messages" />`, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "component", type: RuntimeBrowserComponent, selector: "mm-runtime-browser", inputs: ["messages", "showDataMapping", "expressionValidator"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
16409
16423
  }
16410
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RuntimeBrowserPageComponent, decorators: [{
16424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: RuntimeBrowserPageComponent, decorators: [{
16411
16425
  type: Component,
16412
16426
  args: [{ selector: 'mm-runtime-browser-page', standalone: true, imports: [RuntimeBrowserComponent], changeDetection: ChangeDetectionStrategy.Eager, template: `<mm-runtime-browser [messages]="messages" />`, styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"] }]
16413
16427
  }] });
@@ -16620,10 +16634,10 @@ class MappingCoverageConfigService {
16620
16634
  const exists = await firstValueFrom(this.apollo.query({ query: CONFIG_TYPE_EXISTS_QUERY, fetchPolicy: 'network-only' }));
16621
16635
  return (exists.data?.constructionKit?.types?.items?.length ?? 0) > 0;
16622
16636
  }
16623
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
16624
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageConfigService, providedIn: 'root' });
16637
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
16638
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageConfigService, providedIn: 'root' });
16625
16639
  }
16626
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageConfigService, decorators: [{
16640
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageConfigService, decorators: [{
16627
16641
  type: Injectable,
16628
16642
  args: [{
16629
16643
  providedIn: 'root',
@@ -16680,10 +16694,10 @@ class GetDataPointMappingsDtoGQL extends i1$3.Query {
16680
16694
  constructor(apollo) {
16681
16695
  super(apollo);
16682
16696
  }
16683
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
16684
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, providedIn: 'root' });
16697
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
16698
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, providedIn: 'root' });
16685
16699
  }
16686
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, decorators: [{
16700
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetDataPointMappingsDtoGQL, decorators: [{
16687
16701
  type: Injectable,
16688
16702
  args: [{
16689
16703
  providedIn: 'root'
@@ -16914,8 +16928,8 @@ class DataMappingOverviewComponent {
16914
16928
  this.mappings.set([...items]);
16915
16929
  }
16916
16930
  }
16917
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataMappingOverviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16918
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: DataMappingOverviewComponent, isStandalone: true, selector: "mm-data-mapping-overview", outputs: { navigateToEntity: "navigateToEntity" }, ngImport: i0, template: `
16931
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataMappingOverviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16932
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: DataMappingOverviewComponent, isStandalone: true, selector: "mm-data-mapping-overview", outputs: { navigateToEntity: "navigateToEntity" }, ngImport: i0, template: `
16919
16933
  <div class="mapping-overview">
16920
16934
  <!-- Summary Bar -->
16921
16935
  <div class="summary-bar">
@@ -17083,7 +17097,7 @@ class DataMappingOverviewComponent {
17083
17097
  </div>
17084
17098
  `, isInline: true, styles: [".mapping-overview{display:flex;flex-direction:column;gap:12px;padding:16px}.summary-bar{display:flex;gap:16px;align-items:center;padding:8px 12px;border:1px solid var(--kendo-color-border, #dee2e6);border-radius:6px;background:var(--kendo-color-surface-alt, #f8f9fa)}.summary-item{display:flex;flex-direction:column;align-items:center;min-width:60px}.summary-count{font-size:1.2rem;font-weight:700}.summary-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.summary-valid .summary-count{color:var(--kendo-color-success, #28a745)}.summary-warnings .summary-count{color:var(--kendo-color-warning, #ffc107)}.summary-errors .summary-count{color:var(--kendo-color-error, #dc3545)}.summary-disabled .summary-count{color:var(--kendo-color-subtle, #6c757d)}.summary-spacer{flex:1}.status-valid{color:var(--kendo-color-success, #28a745)}.status-warning{color:var(--kendo-color-warning, #ffc107)}.status-error{color:var(--kendo-color-error, #dc3545)}.entity-ref{cursor:pointer;color:var(--kendo-color-primary, #ff6358);font-family:monospace;font-size:.85rem}.entity-ref:hover{text-decoration:underline}.no-target{color:var(--kendo-color-subtle, #6c757d);font-style:italic}.entity-type-hint{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);font-family:monospace}.expression-cell{font-size:.85rem;background:var(--kendo-color-surface-alt, #f8f9fa);padding:2px 4px;border-radius:3px}.detail-panel{border:1px solid var(--kendo-color-border, #dee2e6);border-radius:6px;padding:12px 16px}.detail-panel h4{margin:0 0 12px;font-size:.9rem;font-weight:600}.detail-grid{display:grid;grid-template-columns:120px 1fr;gap:6px 12px}.detail-row{display:contents}.detail-row label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d);padding-top:2px}.detail-row span,.detail-row code{font-size:.85rem}.validation-section{margin-top:12px;padding-top:8px;border-top:1px solid var(--kendo-color-border, #dee2e6)}.validation-section h5{margin:0 0 6px;font-size:.8rem;font-weight:600}.validation-msg{font-size:.8rem;padding:2px 0}.validation-error{color:var(--kendo-color-error, #dc3545)}.validation-warning{color:var(--kendo-color-warning, #ffc107)}.validation-info{color:var(--kendo-color-info, #17a2b8)}.loading-overlay{text-align:center;padding:20px;color:var(--kendo-color-subtle, #6c757d)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }, { 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", "pinnable", "pinnedTopRows", "pinnedBottomRows", "isRowPinnable"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "rowPinChange", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { 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: BadgeModule }, { kind: "ngmodule", type: SwitchModule }, { kind: "component", type: i5.SwitchComponent, selector: "kendo-switch", inputs: ["focusableId", "onLabel", "offLabel", "checked", "disabled", "readonly", "tabindex", "size", "thumbRounded", "trackRounded", "tabIndex"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoSwitch"] }, { kind: "pipe", type: i1$2.SlicePipe, name: "slice" }], changeDetection: i0.ChangeDetectionStrategy.Eager });
17085
17099
  }
17086
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: DataMappingOverviewComponent, decorators: [{
17100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DataMappingOverviewComponent, decorators: [{
17087
17101
  type: Component,
17088
17102
  args: [{ selector: 'mm-data-mapping-overview', standalone: true, imports: [
17089
17103
  CommonModule,
@@ -17300,10 +17314,10 @@ class GetLatestValidationExecutionDtoGQL extends i1$3.Query {
17300
17314
  constructor(apollo) {
17301
17315
  super(apollo);
17302
17316
  }
17303
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17304
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, providedIn: 'root' });
17317
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17318
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, providedIn: 'root' });
17305
17319
  }
17306
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, decorators: [{
17320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetLatestValidationExecutionDtoGQL, decorators: [{
17307
17321
  type: Injectable,
17308
17322
  args: [{
17309
17323
  providedIn: 'root'
@@ -17354,10 +17368,10 @@ class GetNodeMappingsDtoGQL extends i1$3.Query {
17354
17368
  constructor(apollo) {
17355
17369
  super(apollo);
17356
17370
  }
17357
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetNodeMappingsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17358
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetNodeMappingsDtoGQL, providedIn: 'root' });
17371
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetNodeMappingsDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17372
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetNodeMappingsDtoGQL, providedIn: 'root' });
17359
17373
  }
17360
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetNodeMappingsDtoGQL, decorators: [{
17374
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetNodeMappingsDtoGQL, decorators: [{
17361
17375
  type: Injectable,
17362
17376
  args: [{
17363
17377
  providedIn: 'root'
@@ -17474,10 +17488,10 @@ class GetOrphanCandidatesDtoGQL extends i1$3.Query {
17474
17488
  constructor(apollo) {
17475
17489
  super(apollo);
17476
17490
  }
17477
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17478
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, providedIn: 'root' });
17491
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
17492
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, providedIn: 'root' });
17479
17493
  }
17480
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, decorators: [{
17494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetOrphanCandidatesDtoGQL, decorators: [{
17481
17495
  type: Injectable,
17482
17496
  args: [{
17483
17497
  providedIn: 'root'
@@ -17681,8 +17695,8 @@ class BulkMappingDialogComponent {
17681
17695
  this.targetAttributesLoading.set(false);
17682
17696
  }
17683
17697
  }
17684
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BulkMappingDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17685
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BulkMappingDialogComponent, isStandalone: true, selector: "mm-bulk-mapping-dialog", viewQueries: [{ propertyName: "sourcePicker", first: true, predicate: DataPointPickerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
17698
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: BulkMappingDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17699
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: BulkMappingDialogComponent, isStandalone: true, selector: "mm-bulk-mapping-dialog", viewQueries: [{ propertyName: "sourcePicker", first: true, predicate: DataPointPickerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
17686
17700
  <div class="bulk-mapping">
17687
17701
  <div class="bulk-mapping-body">
17688
17702
  <div class="field-row">
@@ -17798,7 +17812,7 @@ class BulkMappingDialogComponent {
17798
17812
  </div>
17799
17813
  `, isInline: true, styles: [".bulk-mapping{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.bulk-mapping-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 18px;display:flex;flex-direction:column;gap:14px}.field-row{display:flex;flex-direction:column;gap:4px}.field-row label{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.field-row .hint{font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-style:italic}.field-row.inline{flex-direction:row;align-items:center;gap:8px}.source-summary{display:flex;flex-direction:column;gap:2px;padding:6px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.source-summary .source-count{font-weight:600;font-size:.85rem}.source-summary .source-preview{font-size:.72rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.entity-display{display:flex;flex-direction:column;gap:2px;padding:6px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.entity-display.empty{flex-direction:row;align-items:center;justify-content:space-between}.entity-main{display:flex;align-items:center;gap:8px}.entity-main .entity-name{flex:1;font-weight:600;font-size:.9rem}.entity-meta{display:flex;align-items:center;flex-wrap:wrap;gap:2px;font-size:.7rem;font-family:monospace;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));word-break:break-all}.entity-meta .sep{opacity:.7}.combo-row{display:flex;align-items:stretch;gap:4px}.combo-row kendo-combobox{flex:1}.loading-pill{margin-left:6px;font-size:.65rem;padding:1px 6px;border-radius:8px;background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);color:var(--kendo-color-info, #0dcaf0);text-transform:none;letter-spacing:0;font-style:italic}.expression-preview{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:4px 10px;border-radius:4px;font-size:.75rem;background:color-mix(in srgb,var(--kendo-color-success, #28a745) 10%,transparent)}.expression-preview.expression-preview-error{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 10%,transparent)}.expression-preview .preview-label{font-weight:600;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.expression-preview code{font-family:monospace}.expression-preview .preview-arrow{opacity:.7}.expression-preview .preview-note{font-style:italic;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.expression-preview .preview-error-text{color:var(--kendo-color-error, #dc3545)}.dialog-actions{flex:0 0 auto;display:flex;gap:8px;justify-content:flex-end;padding:10px 18px;border-top:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 70%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: ComboBoxModule }, { 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: SwitchModule }, { kind: "component", type: i5.SwitchComponent, selector: "kendo-switch", inputs: ["focusableId", "onLabel", "offLabel", "checked", "disabled", "readonly", "tabindex", "size", "thumbRounded", "trackRounded", "tabIndex"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoSwitch"] }, { 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: DataPointPickerComponent, selector: "mm-data-point-picker", inputs: ["entity", "entityRtId", "entityCkTypeId", "value", "placeholder", "disabled"], outputs: ["valueChange", "filterChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17800
17814
  }
17801
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BulkMappingDialogComponent, decorators: [{
17815
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: BulkMappingDialogComponent, decorators: [{
17802
17816
  type: Component,
17803
17817
  args: [{ selector: 'mm-bulk-mapping-dialog', standalone: true, imports: [
17804
17818
  CommonModule,
@@ -17965,10 +17979,10 @@ class BulkMappingDialogService {
17965
17979
  return { confirmed: false };
17966
17980
  }
17967
17981
  }
17968
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BulkMappingDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17969
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BulkMappingDialogService, providedIn: 'root' });
17982
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: BulkMappingDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17983
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: BulkMappingDialogService, providedIn: 'root' });
17970
17984
  }
17971
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BulkMappingDialogService, decorators: [{
17985
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: BulkMappingDialogService, decorators: [{
17972
17986
  type: Injectable,
17973
17987
  args: [{ providedIn: 'root' }]
17974
17988
  }] });
@@ -18043,10 +18057,10 @@ class GetMappingCoverageNodeDtoGQL extends i1$3.Query {
18043
18057
  constructor(apollo) {
18044
18058
  super(apollo);
18045
18059
  }
18046
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
18047
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, providedIn: 'root' });
18060
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, deps: [{ token: i1$3.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
18061
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, providedIn: 'root' });
18048
18062
  }
18049
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, decorators: [{
18063
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: GetMappingCoverageNodeDtoGQL, decorators: [{
18050
18064
  type: Injectable,
18051
18065
  args: [{
18052
18066
  providedIn: 'root'
@@ -18277,7 +18291,7 @@ class MappingCoverageTreeDataSource extends HierarchyDataSourceBase {
18277
18291
  * direct tree parent (`excludeRtId`, back-edge suppression).
18278
18292
  */
18279
18293
  async discoverRoleGroups(rtId, ckTypeId, excludeRtId) {
18280
- let definitions = [];
18294
+ let definitions;
18281
18295
  try {
18282
18296
  const response = await firstValueFrom(this.getEntityAssociationsGQL.fetch({
18283
18297
  variables: {
@@ -18540,10 +18554,10 @@ class MappingCoverageTreeDataSource extends HierarchyDataSourceBase {
18540
18554
  return null;
18541
18555
  }
18542
18556
  }
18543
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageTreeDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
18544
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageTreeDataSource });
18557
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageTreeDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
18558
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageTreeDataSource });
18545
18559
  }
18546
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageTreeDataSource, decorators: [{
18560
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageTreeDataSource, decorators: [{
18547
18561
  type: Injectable
18548
18562
  }] });
18549
18563
  /** Readable fallback label for a role id without a schema navigation name. */
@@ -18889,8 +18903,8 @@ class MappingEditDialogComponent {
18889
18903
  targetAttributePath: '',
18890
18904
  };
18891
18905
  }
18892
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingEditDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18893
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MappingEditDialogComponent, isStandalone: true, selector: "mm-mapping-edit-dialog", viewQueries: [{ propertyName: "sourcePicker", first: true, predicate: DataPointPickerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
18906
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingEditDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18907
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: MappingEditDialogComponent, isStandalone: true, selector: "mm-mapping-edit-dialog", viewQueries: [{ propertyName: "sourcePicker", first: true, predicate: DataPointPickerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
18894
18908
  <div class="mapping-edit">
18895
18909
  <div class="mapping-edit-body">
18896
18910
  <div class="field-row">
@@ -19061,7 +19075,7 @@ class MappingEditDialogComponent {
19061
19075
  </div>
19062
19076
  `, isInline: true, styles: [".mapping-edit{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.mapping-edit-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 18px;display:flex;flex-direction:column;gap:14px}.field-row{display:flex;flex-direction:column;gap:4px}.field-row label{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.field-row .hint{font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-style:italic}.field-row.inline{flex-direction:row;align-items:center;gap:8px}.entity-display{display:flex;flex-direction:column;gap:2px;padding:6px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.entity-display.empty{flex-direction:row;align-items:center;justify-content:space-between}.entity-main{display:flex;align-items:center;gap:8px}.entity-main .entity-name{flex:1;font-weight:600;font-size:.9rem}.entity-meta{display:flex;align-items:center;flex-wrap:wrap;gap:2px;font-size:.7rem;font-family:monospace;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));word-break:break-all}.entity-meta .sep{opacity:.7}.dialog-actions{flex:0 0 auto;display:flex;gap:8px;justify-content:flex-end;padding:10px 18px;border-top:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 70%,transparent)}.combo-row{display:flex;align-items:stretch;gap:4px}.combo-row kendo-combobox{flex:1}.attribute-option{display:flex;justify-content:space-between;align-items:center;width:100%;gap:8px}.attribute-option .attribute-path{flex:1;font-family:monospace;font-size:.85rem}.attribute-option .attribute-type{font-size:.7rem;padding:1px 6px;border-radius:8px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f0f0f0)) 80%,transparent);color:var(--theme-text-secondary, var(--kendo-color-subtle, #888))}.loading-pill{margin-left:6px;font-size:.65rem;padding:1px 6px;border-radius:8px;background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);color:var(--kendo-color-info, #0dcaf0);text-transform:none;letter-spacing:0;font-style:italic}.expression-preview{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:4px 10px;border-radius:4px;font-size:.75rem;background:color-mix(in srgb,var(--kendo-color-success, #28a745) 10%,transparent)}.expression-preview.expression-preview-error{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 10%,transparent)}.expression-preview .preview-label{font-weight:600;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.expression-preview code{font-family:monospace}.expression-preview .preview-arrow{opacity:.7}.expression-preview .preview-note{font-style:italic;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.expression-preview .preview-error-text{color:var(--kendo-color-error, #dc3545)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: ComboBoxModule }, { 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: "directive", type: i3$1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "ngmodule", type: SVGIconModule }, { kind: "ngmodule", type: SwitchModule }, { kind: "component", type: i5.SwitchComponent, selector: "kendo-switch", inputs: ["focusableId", "onLabel", "offLabel", "checked", "disabled", "readonly", "tabindex", "size", "thumbRounded", "trackRounded", "tabIndex"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoSwitch"] }, { 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: DataPointPickerComponent, selector: "mm-data-point-picker", inputs: ["entity", "entityRtId", "entityCkTypeId", "value", "placeholder", "disabled"], outputs: ["valueChange", "filterChange"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
19063
19077
  }
19064
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingEditDialogComponent, decorators: [{
19078
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingEditDialogComponent, decorators: [{
19065
19079
  type: Component,
19066
19080
  args: [{ selector: 'mm-mapping-edit-dialog', standalone: true, imports: [
19067
19081
  CommonModule,
@@ -19312,10 +19326,10 @@ class MappingEditDialogService {
19312
19326
  return { confirmed: false };
19313
19327
  }
19314
19328
  }
19315
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingEditDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19316
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingEditDialogService, providedIn: 'root' });
19329
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingEditDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19330
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingEditDialogService, providedIn: 'root' });
19317
19331
  }
19318
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingEditDialogService, decorators: [{
19332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingEditDialogService, decorators: [{
19319
19333
  type: Injectable,
19320
19334
  args: [{ providedIn: 'root' }]
19321
19335
  }] });
@@ -19390,7 +19404,14 @@ class MappingCoverageTreeComponent {
19390
19404
  dataSource = inject(MappingCoverageTreeDataSource);
19391
19405
  treeView;
19392
19406
  /** Optional override for non-default hierarchies / mapping roles. */
19393
- config = DEFAULT_MAPPING_COVERAGE_TREE_CONFIG;
19407
+ // Assigned in the constructor rather than as a field initialiser: Vite's module-runner
19408
+ // transform (used by the Vitest unit-test builder) snapshots a class field whose
19409
+ // initialiser is a bare imported identifier at module-evaluation time, which is before
19410
+ // esbuild's lazily-initialised shared chunk has assigned the export, so the field would
19411
+ // be `undefined`. A constructor assignment is rewritten to a live read; a getter is not
19412
+ // an option here because Angular has to be able to set an @Input. Test-runner-only:
19413
+ // production and ng-packagr builds do not use the module runner and are unaffected.
19414
+ config;
19394
19415
  /** Pre-select a root on first show (e.g. via route param). */
19395
19416
  initialRoot = null;
19396
19417
  /**
@@ -19669,6 +19690,9 @@ class MappingCoverageTreeComponent {
19669
19690
  }
19670
19691
  }
19671
19692
  }
19693
+ constructor() {
19694
+ this.config = DEFAULT_MAPPING_COVERAGE_TREE_CONFIG;
19695
+ }
19672
19696
  /**
19673
19697
  * The Studio loads the per-tenant source-candidate CK types ASYNCHRONOUSLY
19674
19698
  * (System.UI singleton) and re-emits the `config` input when they arrive —
@@ -20754,10 +20778,10 @@ class MappingCoverageTreeComponent {
20754
20778
  });
20755
20779
  this.mappings.set(next);
20756
20780
  }
20757
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20758
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MappingCoverageTreeComponent, isStandalone: true, selector: "mm-mapping-coverage-tree", inputs: { config: "config", initialRoot: "initialRoot", tenantId: "tenantId", expressionEvaluator: "expressionEvaluator" }, outputs: { entitySelected: "entitySelected" }, providers: [MappingCoverageTreeDataSource], viewQueries: [{ propertyName: "treeView", first: true, predicate: TreeComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"coverage-root\">\n @if (config.sourceCandidateCkTypeIds.length > 0) {\n <div class=\"coverage-tabs\" role=\"tablist\">\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'coverage'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'coverage'\"\n (click)=\"selectTab('coverage')\">Coverage Tree</button>\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'orphans'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'orphans'\"\n (click)=\"selectTab('orphans')\">\n Orphan Sources\n @if (orphanStats(); as s) {\n @if (s.unmapped > 0) { <span class=\"tab-badge\">{{ s.unmapped }}</span> }\n }\n </button>\n </div>\n }\n\n @if (activeTab() === 'coverage') {\n <div class=\"coverage-toolbar\">\n <mm-perspective-switcher\n [perspectives]=\"perspectives()\"\n [activeKey]=\"activePerspectiveKey()\"\n (perspectiveChange)=\"onPerspectiveChange($event)\"></mm-perspective-switcher>\n <label class=\"toolbar-label\">Tree:</label>\n <select class=\"root-select\"\n [value]=\"selectedRoot()?.rtId ?? ''\"\n (change)=\"onRootSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ activeRootCkTypeId() }} \u2014</option>\n @for (root of rootCandidates(); track root.rtId) {\n <option [value]=\"root.rtId\" [title]=\"root.description\">{{ root.name }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshRoots()\" title=\"Refresh tree list\"></button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.folderOpen\"\n (click)=\"pickRoot()\" title=\"Browse for entity\">Browse...</button>\n\n @if (selectedRoot(); as root) {\n <div class=\"toolbar-spacer\"></div>\n <span class=\"toolbar-meta\">\n <span class=\"meta-name\">{{ root.name }}</span>\n <span class=\"meta-type\">{{ root.ckTypeId }}</span>\n </span>\n }\n </div>\n\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Validation:</label>\n <select class=\"root-select\"\n [value]=\"selectedPipeline()?.rtId ?? ''\"\n (change)=\"onPipelineSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ config.validationPipelineCkTypeId }} \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n @if (tenantId) {\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedPipeline() || validationRunning() || validationLoading()\"\n (click)=\"runValidation()\"\n [title]=\"validationRunning() ? 'Validation running\u2026' : 'Run pipeline + load report'\">\n @if (validationRunning()) { Running\u2026 } @else { Run }\n </button>\n }\n <button kendoButton fillMode=\"solid\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!selectedPipeline() || validationLoading() || validationRunning()\"\n (click)=\"refreshValidation()\">Load Report</button>\n @if (validationSummary()) {\n <button kendoButton fillMode=\"flat\" size=\"small\"\n (click)=\"clearValidation()\">Clear</button>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (validationLoading()) {\n <span class=\"toolbar-meta\">Loading\u2026</span>\n } @else if (validationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (validationSummary(); as s) {\n <span class=\"validation-summary\">\n <span class=\"badge badge-error\" title=\"error\">{{ s.error }} err</span>\n <span class=\"badge badge-warning\" title=\"warning\">{{ s.warning }} warn</span>\n <span class=\"badge badge-ok\" title=\"ok\">{{ s.ok }} ok</span>\n <span class=\"badge badge-info\" title=\"info / unscoped\">{{ s.info }} info</span>\n <span class=\"badge\">{{ s.total }} total</span>\n @if (validationExecutedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n }\n </div>\n\n @if (tenantId) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Generation:</label>\n <select class=\"root-select\"\n [value]=\"selectedGenerationPipeline()?.rtId ?? ''\"\n (change)=\"onGenerationSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick an auto-mapping pipeline \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedGenerationPipeline() || generationRunning()\"\n (click)=\"runGeneration()\"\n [title]=\"generationRunning() ? 'Generation running\u2026' : 'Run the auto-mapping pipeline and reload counts'\">\n @if (generationRunning()) { Running\u2026 } @else { Generate }\n </button>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (generationRunning()) {\n <span class=\"toolbar-meta\">Generating mappings\u2026</span>\n } @else if (generationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (generationStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.totalSuggestions !== undefined) {\n <span class=\"badge badge-ok\" title=\"mapping suggestions produced\">{{ s.totalSuggestions }} mappings</span>\n }\n @if (s.matchedContainers !== undefined && s.totalContainers !== undefined) {\n <span class=\"badge\" title=\"containers (e.g. rooms) matched to a target\">\n {{ s.matchedContainers }}/{{ s.totalContainers }} matched\n </span>\n }\n @if (s.unmatchedContainers) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unmatched: ' + (s.unmatchedContainerNames ?? []).join(', ')\">\n {{ s.unmatchedContainers }} unmatched\n </span>\n }\n @if (generationCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (generationCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n @if (tenantId && (exportBackupPipeline() || importBackupPipeline())) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Backup:</label>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.download\"\n [disabled]=\"!exportBackupPipeline() || backupRunning() !== null\"\n (click)=\"exportMappings()\"\n title=\"Run the export pipeline and download the mapping document as JSON\">\n @if (backupRunning() === 'export') { Exporting\u2026 } @else { Export }\n </button>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.upload\"\n [disabled]=\"!importBackupPipeline() || backupRunning() !== null\"\n (click)=\"importFileInput.click()\"\n title=\"Import a previously exported mapping document (JSON)\">\n @if (backupRunning() === 'import') { Importing\u2026 } @else { Import\u2026 }\n </button>\n <input #importFileInput type=\"file\" accept=\".json,application/json\" hidden\n (change)=\"onImportFileSelected($event)\" />\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (backupRunning() === 'export') {\n <span class=\"toolbar-meta\">Exporting mappings\u2026</span>\n } @else if (backupRunning() === 'import') {\n <span class=\"toolbar-meta\">Importing mappings\u2026</span>\n } @else if (backupError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (importStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.resolved !== undefined) {\n <span class=\"badge badge-ok\" title=\"mappings resolved and imported\">{{ s.resolved }} imported</span>\n }\n @if (s.unresolved) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unresolved: ' + unresolvedImportNames()\">\n {{ s.unresolved }} unresolved\n </span>\n }\n @if (s.total !== undefined) {\n <span class=\"badge\">{{ s.total }} total</span>\n }\n @if (importCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (importCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Import completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n <div class=\"coverage-body\">\n <div class=\"coverage-tree-pane\">\n @if (selectedRoot()) {\n <mm-tree-view\n [dataSource]=\"dataSource\"\n (nodeSelected)=\"onNodeSelected($event)\">\n </mm-tree-view>\n } @else {\n <div class=\"empty-hint\">\n Select a tree to start. Counts in brackets show how many mappings\n point to that node.\n </div>\n }\n </div>\n\n <div class=\"coverage-detail-pane\">\n @if (selectedNode(); as node) {\n <div class=\"detail-header\">\n <div class=\"detail-titles\">\n <h3 class=\"detail-name\">{{ node.name }}</h3>\n <div class=\"detail-subtitle\">{{ node.ckTypeId }}@{{ node.rtId }}</div>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshSelected()\" title=\"Refresh\"></button>\n </div>\n\n <div class=\"detail-section-title\">\n <span>Mappings</span>\n @if (summaryLine(); as s) {\n <span class=\"detail-summary\">{{ s }}</span>\n }\n <span class=\"toolbar-spacer\"></span>\n <button kendoButton themeColor=\"primary\" size=\"small\" [svgIcon]=\"icons.plus\"\n (click)=\"addMapping()\">Add</button>\n </div>\n\n @if (mappingsLoading()) {\n <div class=\"empty-hint\">Loading mappings\u2026</div>\n } @else if (mappingsError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (mappings().length === 0) {\n <div class=\"empty-hint\">\n No mappings reference this node yet. Add one using the button above.\n </div>\n } @else {\n <ul class=\"mapping-list\">\n @for (mapping of mappings(); track trackByRtId($index, mapping)) {\n <li class=\"mapping-row\" [class.mapping-disabled]=\"!mapping.enabled\">\n <div class=\"mapping-line\">\n <span class=\"mapping-name\">\n {{ mapping.name || 'Mapping ' + ($index + 1) }}\n </span>\n @if (!mapping.enabled) {\n <span class=\"mapping-badge mapping-badge-off\">disabled</span>\n }\n </div>\n <div class=\"mapping-details\">\n <span class=\"kv\">\n <span class=\"kv-key\">Source:</span>\n <span class=\"kv-val\">\n {{ mapping.sourceName || mapping.sourceRtId || '\u2014 not linked \u2014' }}\n </span>\n </span>\n @if (mapping.sourceAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">Attr:</span>\n <span class=\"kv-val\">{{ mapping.sourceAttributePath }}</span>\n </span>\n }\n @if (mapping.mappingExpression) {\n <span class=\"kv\">\n <span class=\"kv-key\">Expr:</span>\n <code class=\"kv-val\">{{ mapping.mappingExpression }}</code>\n </span>\n }\n @if (mapping.targetAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">\u2192</span>\n <span class=\"kv-val\">{{ mapping.targetAttributePath }}</span>\n </span>\n }\n </div>\n <div class=\"mapping-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.pencil\"\n (click)=\"editMapping(mapping)\"\n title=\"Edit mapping\">Edit\u2026</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.trash\"\n (click)=\"deleteMapping(mapping)\"\n title=\"Delete mapping\"></button>\n </div>\n </li>\n }\n </ul>\n }\n } @else {\n <div class=\"empty-hint\">\n Select a node from the tree to view and edit its mappings.\n </div>\n }\n </div>\n </div>\n }\n\n @if (activeTab() === 'orphans') {\n <div class=\"coverage-toolbar\">\n <label class=\"toolbar-label\">Source type:</label>\n <select class=\"root-select\"\n [value]=\"orphanCkType() ?? ''\"\n (change)=\"onOrphanCkTypeChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a source type \u2014</option>\n @for (ckType of config.sourceCandidateCkTypeIds; track ckType) {\n <option [value]=\"ckType\">{{ ckType }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!orphanCkType() || orphanLoading()\"\n (click)=\"refreshOrphans()\" title=\"Reload\"></button>\n <span class=\"orphan-search-wrap\">\n <input type=\"text\" class=\"root-select orphan-search\"\n placeholder=\"Search name, room, description\u2026\"\n [value]=\"orphanSearchText()\"\n (input)=\"orphanSearchText.set($any($event.target).value)\" />\n @if (orphanSearchText()) {\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.x\"\n class=\"orphan-search-clear\"\n (click)=\"orphanSearchText.set('')\"\n title=\"Clear search\" aria-label=\"Clear search\"></button>\n }\n </span>\n <label class=\"orphan-toggle\">\n <input type=\"checkbox\" [checked]=\"orphanHideMapped()\" (change)=\"toggleOrphanHideMapped()\" />\n Hide already-mapped\n </label>\n <label class=\"toolbar-label\">Group by:</label>\n <select class=\"root-select\"\n [value]=\"orphanGroupParentType() ?? ''\"\n (change)=\"onOrphanGroupParentTypeChange($any($event.target).value)\">\n <option value=\"\">(no grouping)</option>\n @for (t of orphanAvailableParentTypes(); track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n @if (orphanGroupParentType()) {\n <kendo-multiselect class=\"orphan-group-filter\"\n [data]=\"orphanAvailableGroupNames()\"\n [value]=\"orphanSelectedGroupNames()\"\n (valueChange)=\"onOrphanGroupNamesChange($event)\"\n [autoClose]=\"false\"\n [clearButton]=\"true\"\n size=\"small\"\n placeholder=\"Filter groups\u2026\"\n title=\"Show only the selected groups (e.g. specific categories)\">\n </kendo-multiselect>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanVisibleList().length === 0\"\n (click)=\"selectAllVisibleOrphans()\"\n title=\"Select every row visible under the current filter\">Select all</button>\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"clearOrphanSelection()\">Clear</button>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"bulkMapSelected()\"\n title=\"Create one mapping per selected source (shared target + paths)\">\n Map {{ orphanSelectedCount() }} selected\u2026\n </button>\n\n @if (orphanStats(); as s) {\n <span class=\"validation-summary\">\n @if (orphanSearchText().trim() || orphanSelectedGroupNames().length > 0) {\n <span class=\"badge badge-info\" title=\"rows matching search + group filter\">{{ orphanVisibleList().length }} shown</span>\n }\n <span class=\"badge badge-error\" title=\"unmapped \u2014 no DataPointMapping yet\">{{ s.unmapped }} unmapped</span>\n <span class=\"badge badge-ok\" title=\"already covered by at least one mapping\">{{ s.mapped }} mapped</span>\n <span class=\"badge\">{{ s.total }} total</span>\n </span>\n }\n </div>\n\n <div class=\"orphan-body\">\n @if (orphanLoading()) {\n <div class=\"empty-hint\">Loading source candidates\u2026</div>\n } @else if (orphanError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (orphanVisibleList().length === 0) {\n <div class=\"empty-hint\">\n @if (orphanSelectedGroupNames().length > 0) {\n No entries in the selected group(s) match the current filters.\n } @else if (orphanSearchText().trim()) {\n No entries match \"{{ orphanSearchText() }}\".\n } @else if (orphanHideMapped()) {\n All {{ orphanCkType() }} entities are mapped at least once. \uD83C\uDF89\n } @else {\n No entities of type {{ orphanCkType() }} found.\n }\n </div>\n } @else if (orphanGroupParentType()) {\n @for (group of orphanGroupedList(); track group.key) {\n <div class=\"orphan-group\">\n <div class=\"orphan-group-header\">\n <span class=\"orphan-group-label\">{{ group.label }}</span>\n <span class=\"orphan-group-count\">{{ group.items.length }}</span>\n </div>\n <ul class=\"orphan-list\">\n @for (item of group.items; track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n </div>\n }\n } @else {\n <ul class=\"orphan-list\">\n @for (item of orphanVisibleList(); track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n }\n\n <ng-template #orphanRowTpl let-item>\n <li class=\"orphan-row\" [class.orphan-mapped]=\"item.mappingCount > 0\">\n <div class=\"orphan-line\">\n <input type=\"checkbox\" class=\"orphan-check\"\n [checked]=\"isOrphanSelected(item.rtId)\"\n (change)=\"toggleOrphanSelected(item.rtId)\"\n [attr.aria-label]=\"'Select ' + item.name\" />\n <span class=\"orphan-name\">{{ item.name }}</span>\n @if (item.mappingCount > 0) {\n <span class=\"orphan-badge orphan-badge-mapped\">\n {{ item.mappingCount }} mapping{{ item.mappingCount === 1 ? '' : 's' }}\n </span>\n } @else {\n <span class=\"orphan-badge orphan-badge-unmapped\">unmapped</span>\n }\n </div>\n @if (item.parentPath.length > 0) {\n <div class=\"orphan-breadcrumb\" [attr.title]=\"'Parent chain (root-first)'\">\n @for (parent of breadcrumbFor(item); track parent.rtId; let last = $last) {\n <span class=\"crumb\">{{ parent.name }}</span>\n @if (!last) { <span class=\"crumb-sep\">\u203A</span> }\n }\n </div>\n }\n <div class=\"orphan-meta\">\n <span class=\"kv-val\">{{ item.ckTypeId }}&#64;{{ item.rtId }}</span>\n </div>\n @if (item.description) {\n <div class=\"orphan-description\">{{ item.description }}</div>\n }\n <div class=\"orphan-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.plus\"\n (click)=\"createMappingFromOrphan(item)\"\n title=\"Create mapping pre-linked to this source\">\n Map\u2026\n </button>\n </div>\n </li>\n </ng-template>\n </div>\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.coverage-root{display:flex;flex-direction:column;flex:1;min-height:0;gap:12px}.coverage-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface-alt, #f8f9fa)) 70%,transparent)}.coverage-toolbar .toolbar-label{flex:0 0 96px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.coverage-toolbar .root-select{flex:0 0 280px;min-width:0;padding:4px 8px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:var(--theme-bg-elevated, var(--kendo-color-surface, #fff));color:var(--theme-text-primary, inherit);font-size:.9rem;height:30px}.coverage-toolbar .orphan-search-wrap{display:inline-flex;align-items:center;gap:2px}.coverage-toolbar .orphan-search-wrap .orphan-search{flex:1 1 220px;min-width:140px}.coverage-toolbar .orphan-group-filter{flex:0 1 320px;min-width:160px}.coverage-toolbar .toolbar-spacer{flex:1}.coverage-toolbar .toolbar-meta{display:flex;flex-direction:column;align-items:flex-end;line-height:1.1}.coverage-toolbar .toolbar-meta .meta-name{font-size:.85rem;font-weight:600}.coverage-toolbar .toolbar-meta .meta-type{font-size:.7rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d)}.coverage-body{flex:1;display:flex;gap:12px;min-height:0}@media(max-width:900px){.coverage-body{flex-direction:column}.coverage-tree-pane{flex:0 0 38vh;min-width:0;min-height:180px}.coverage-detail-pane{min-height:180px}.coverage-toolbar .toolbar-label{flex:0 0 auto}.coverage-toolbar .root-select{flex:1 1 200px;max-width:100%}}.coverage-tree-pane{flex:0 0 40%;min-width:240px;display:flex;flex-direction:column;min-height:0;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);overflow:auto}.coverage-detail-pane{flex:1;min-width:0;display:flex;flex-direction:column;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);padding:12px 14px;gap:12px;overflow:auto}.detail-header{display:flex;align-items:flex-start;gap:8px}.detail-header .detail-titles{flex:1;min-width:0}.detail-header .detail-name{margin:0;font-size:1.05rem;font-weight:600;word-break:break-word}.detail-header .detail-subtitle{font-size:.72rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d);word-break:break-all}.detail-section-title{display:flex;align-items:center;gap:10px;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.detail-section-title .toolbar-spacer{flex:1}.detail-section-title .detail-summary{text-transform:none;letter-spacing:0;font-weight:500;color:var(--kendo-color-on-app-surface, inherit);font-size:.78rem}.mapping-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.mapping-row{border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.mapping-row.mapping-disabled{opacity:.55}.mapping-line{display:flex;align-items:center;gap:8px}.mapping-line .mapping-name{font-weight:600;font-size:.9rem}.mapping-badge{font-size:.65rem;text-transform:uppercase;letter-spacing:.5px;padding:1px 6px;border-radius:8px;border:1px solid var(--kendo-color-border, #dee2e6)}.mapping-badge.mapping-badge-off{color:var(--kendo-color-subtle, #6c757d)}.mapping-details{display:flex;flex-wrap:wrap;gap:10px;font-size:.8rem}.mapping-details .kv{display:inline-flex;align-items:baseline;gap:4px}.mapping-details .kv-key{font-weight:600;color:var(--kendo-color-subtle, #6c757d)}.mapping-details code.kv-val{font-family:monospace;background:var(--kendo-color-surface, transparent);padding:1px 4px;border-radius:3px}.mapping-actions{display:flex;gap:6px;justify-content:flex-end}.empty-hint,.error-hint{padding:12px;font-size:.85rem;color:var(--kendo-color-subtle, #6c757d);text-align:center}.error-hint{color:var(--kendo-color-error, #dc3545)}.coverage-tabs{display:flex;gap:0;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6))}.coverage-tab{padding:8px 16px;border:none;background:transparent;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px}.coverage-tab:hover{color:var(--theme-text-primary, inherit)}.coverage-tab.active{color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358));border-bottom-color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358))}.coverage-tab .tab-badge{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border-radius:10px;padding:1px 8px;font-size:.7rem;font-weight:700}.orphan-toggle{display:inline-flex;align-items:center;gap:6px;font-size:.8rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));cursor:pointer}.orphan-body{flex:1;min-height:0;overflow:auto;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);padding:8px}.orphan-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.orphan-row{display:flex;flex-direction:column;gap:4px;padding:8px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-left-width:3px;border-left-color:var(--kendo-color-error, #dc3545);border-radius:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.orphan-row.orphan-mapped{border-left-color:var(--kendo-color-success, #28a745);opacity:.7}.orphan-row .orphan-line{display:flex;align-items:center;gap:8px}.orphan-row .orphan-line .orphan-check{flex-shrink:0;margin:0;cursor:pointer;accent-color:var(--kendo-color-primary, #ff6358)}.orphan-row .orphan-line .orphan-name{flex:1;font-weight:600;font-size:.9rem}.orphan-row .orphan-badge{font-size:.7rem;padding:1px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}.orphan-row .orphan-badge-unmapped{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border:1px solid var(--kendo-color-error, #dc3545)}.orphan-row .orphan-badge-mapped{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);color:var(--kendo-color-success, #28a745);border:1px solid var(--kendo-color-success, #28a745)}.orphan-row .orphan-meta{font-family:monospace;font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));word-break:break-all}.orphan-row .orphan-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.75rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.orphan-row .orphan-breadcrumb .crumb{line-height:1.3}.orphan-row .orphan-breadcrumb .crumb-sep{opacity:.55;font-weight:600}.orphan-row .orphan-description{font-size:.78rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-style:italic}.orphan-row .orphan-actions{display:flex;gap:6px;justify-content:flex-end}.orphan-group{display:flex;flex-direction:column;gap:6px}.orphan-group+.orphan-group{margin-top:14px}.orphan-group .orphan-group-header{display:flex;align-items:baseline;gap:8px;padding:4px 8px;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));font-size:.85rem;font-weight:600;color:var(--theme-text-primary, inherit)}.orphan-group .orphan-group-header .orphan-group-label{flex:1}.orphan-group .orphan-group-header .orphan-group-count{font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f1f3f5)) 80%,transparent);border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:10px;padding:0 8px}.validation-summary{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.badge{font-size:.7rem;padding:2px 8px;border-radius:10px;background:var(--kendo-color-surface, #f1f3f5);border:1px solid var(--kendo-color-border, #dee2e6)}.badge-error{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 18%,transparent);border-color:var(--kendo-color-error, #dc3545);color:var(--kendo-color-error, #dc3545);font-weight:600}.badge-warning{background:color-mix(in srgb,var(--kendo-color-warning, #ffc107) 22%,transparent);border-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-warning-on, #6b5500);font-weight:600}.badge-ok{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);border-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-success, #28a745);font-weight:600}.badge-info{background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);border-color:var(--kendo-color-info, #0dcaf0);color:var(--kendo-color-info, #0dcaf0)}.validation-error-text{color:var(--kendo-color-error, #dc3545);font-size:.8rem}.validation-timestamp{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: LayoutModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: 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: "ngmodule", type: SVGIconModule }, { kind: "component", type: TreeComponent, selector: "mm-tree-view", inputs: ["dataSource"], outputs: ["nodeSelected", "nodeClick", "nodeDoubleClick", "nodeDrop", "expand", "collapse"] }, { kind: "component", type: PerspectiveSwitcherComponent, selector: "mm-perspective-switcher", inputs: ["perspectives", "activeKey", "label"], outputs: ["perspectiveChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20781
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20782
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: MappingCoverageTreeComponent, isStandalone: true, selector: "mm-mapping-coverage-tree", inputs: { config: "config", initialRoot: "initialRoot", tenantId: "tenantId", expressionEvaluator: "expressionEvaluator" }, outputs: { entitySelected: "entitySelected" }, providers: [MappingCoverageTreeDataSource], viewQueries: [{ propertyName: "treeView", first: true, predicate: TreeComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"coverage-root\">\n @if (config.sourceCandidateCkTypeIds.length > 0) {\n <div class=\"coverage-tabs\" role=\"tablist\">\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'coverage'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'coverage'\"\n (click)=\"selectTab('coverage')\">Coverage Tree</button>\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'orphans'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'orphans'\"\n (click)=\"selectTab('orphans')\">\n Orphan Sources\n @if (orphanStats(); as s) {\n @if (s.unmapped > 0) { <span class=\"tab-badge\">{{ s.unmapped }}</span> }\n }\n </button>\n </div>\n }\n\n @if (activeTab() === 'coverage') {\n <div class=\"coverage-toolbar\">\n <mm-perspective-switcher\n [perspectives]=\"perspectives()\"\n [activeKey]=\"activePerspectiveKey()\"\n (perspectiveChange)=\"onPerspectiveChange($event)\"></mm-perspective-switcher>\n <label class=\"toolbar-label\">Tree:</label>\n <select class=\"root-select\"\n [value]=\"selectedRoot()?.rtId ?? ''\"\n (change)=\"onRootSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ activeRootCkTypeId() }} \u2014</option>\n @for (root of rootCandidates(); track root.rtId) {\n <option [value]=\"root.rtId\" [title]=\"root.description\">{{ root.name }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshRoots()\" title=\"Refresh tree list\"></button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.folderOpen\"\n (click)=\"pickRoot()\" title=\"Browse for entity\">Browse...</button>\n\n @if (selectedRoot(); as root) {\n <div class=\"toolbar-spacer\"></div>\n <span class=\"toolbar-meta\">\n <span class=\"meta-name\">{{ root.name }}</span>\n <span class=\"meta-type\">{{ root.ckTypeId }}</span>\n </span>\n }\n </div>\n\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Validation:</label>\n <select class=\"root-select\"\n [value]=\"selectedPipeline()?.rtId ?? ''\"\n (change)=\"onPipelineSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ config.validationPipelineCkTypeId }} \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n @if (tenantId) {\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedPipeline() || validationRunning() || validationLoading()\"\n (click)=\"runValidation()\"\n [title]=\"validationRunning() ? 'Validation running\u2026' : 'Run pipeline + load report'\">\n @if (validationRunning()) { Running\u2026 } @else { Run }\n </button>\n }\n <button kendoButton fillMode=\"solid\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!selectedPipeline() || validationLoading() || validationRunning()\"\n (click)=\"refreshValidation()\">Load Report</button>\n @if (validationSummary()) {\n <button kendoButton fillMode=\"flat\" size=\"small\"\n (click)=\"clearValidation()\">Clear</button>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (validationLoading()) {\n <span class=\"toolbar-meta\">Loading\u2026</span>\n } @else if (validationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (validationSummary(); as s) {\n <span class=\"validation-summary\">\n <span class=\"badge badge-error\" title=\"error\">{{ s.error }} err</span>\n <span class=\"badge badge-warning\" title=\"warning\">{{ s.warning }} warn</span>\n <span class=\"badge badge-ok\" title=\"ok\">{{ s.ok }} ok</span>\n <span class=\"badge badge-info\" title=\"info / unscoped\">{{ s.info }} info</span>\n <span class=\"badge\">{{ s.total }} total</span>\n @if (validationExecutedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n }\n </div>\n\n @if (tenantId) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Generation:</label>\n <select class=\"root-select\"\n [value]=\"selectedGenerationPipeline()?.rtId ?? ''\"\n (change)=\"onGenerationSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick an auto-mapping pipeline \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedGenerationPipeline() || generationRunning()\"\n (click)=\"runGeneration()\"\n [title]=\"generationRunning() ? 'Generation running\u2026' : 'Run the auto-mapping pipeline and reload counts'\">\n @if (generationRunning()) { Running\u2026 } @else { Generate }\n </button>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (generationRunning()) {\n <span class=\"toolbar-meta\">Generating mappings\u2026</span>\n } @else if (generationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (generationStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.totalSuggestions !== undefined) {\n <span class=\"badge badge-ok\" title=\"mapping suggestions produced\">{{ s.totalSuggestions }} mappings</span>\n }\n @if (s.matchedContainers !== undefined && s.totalContainers !== undefined) {\n <span class=\"badge\" title=\"containers (e.g. rooms) matched to a target\">\n {{ s.matchedContainers }}/{{ s.totalContainers }} matched\n </span>\n }\n @if (s.unmatchedContainers) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unmatched: ' + (s.unmatchedContainerNames ?? []).join(', ')\">\n {{ s.unmatchedContainers }} unmatched\n </span>\n }\n @if (generationCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (generationCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n @if (tenantId && (exportBackupPipeline() || importBackupPipeline())) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Backup:</label>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.download\"\n [disabled]=\"!exportBackupPipeline() || backupRunning() !== null\"\n (click)=\"exportMappings()\"\n title=\"Run the export pipeline and download the mapping document as JSON\">\n @if (backupRunning() === 'export') { Exporting\u2026 } @else { Export }\n </button>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.upload\"\n [disabled]=\"!importBackupPipeline() || backupRunning() !== null\"\n (click)=\"importFileInput.click()\"\n title=\"Import a previously exported mapping document (JSON)\">\n @if (backupRunning() === 'import') { Importing\u2026 } @else { Import\u2026 }\n </button>\n <input #importFileInput type=\"file\" accept=\".json,application/json\" hidden\n (change)=\"onImportFileSelected($event)\" />\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (backupRunning() === 'export') {\n <span class=\"toolbar-meta\">Exporting mappings\u2026</span>\n } @else if (backupRunning() === 'import') {\n <span class=\"toolbar-meta\">Importing mappings\u2026</span>\n } @else if (backupError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (importStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.resolved !== undefined) {\n <span class=\"badge badge-ok\" title=\"mappings resolved and imported\">{{ s.resolved }} imported</span>\n }\n @if (s.unresolved) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unresolved: ' + unresolvedImportNames()\">\n {{ s.unresolved }} unresolved\n </span>\n }\n @if (s.total !== undefined) {\n <span class=\"badge\">{{ s.total }} total</span>\n }\n @if (importCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (importCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Import completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n <div class=\"coverage-body\">\n <div class=\"coverage-tree-pane\">\n @if (selectedRoot()) {\n <mm-tree-view\n [dataSource]=\"dataSource\"\n (nodeSelected)=\"onNodeSelected($event)\">\n </mm-tree-view>\n } @else {\n <div class=\"empty-hint\">\n Select a tree to start. Counts in brackets show how many mappings\n point to that node.\n </div>\n }\n </div>\n\n <div class=\"coverage-detail-pane\">\n @if (selectedNode(); as node) {\n <div class=\"detail-header\">\n <div class=\"detail-titles\">\n <h3 class=\"detail-name\">{{ node.name }}</h3>\n <div class=\"detail-subtitle\">{{ node.ckTypeId }}@{{ node.rtId }}</div>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshSelected()\" title=\"Refresh\"></button>\n </div>\n\n <div class=\"detail-section-title\">\n <span>Mappings</span>\n @if (summaryLine(); as s) {\n <span class=\"detail-summary\">{{ s }}</span>\n }\n <span class=\"toolbar-spacer\"></span>\n <button kendoButton themeColor=\"primary\" size=\"small\" [svgIcon]=\"icons.plus\"\n (click)=\"addMapping()\">Add</button>\n </div>\n\n @if (mappingsLoading()) {\n <div class=\"empty-hint\">Loading mappings\u2026</div>\n } @else if (mappingsError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (mappings().length === 0) {\n <div class=\"empty-hint\">\n No mappings reference this node yet. Add one using the button above.\n </div>\n } @else {\n <ul class=\"mapping-list\">\n @for (mapping of mappings(); track trackByRtId($index, mapping)) {\n <li class=\"mapping-row\" [class.mapping-disabled]=\"!mapping.enabled\">\n <div class=\"mapping-line\">\n <span class=\"mapping-name\">\n {{ mapping.name || 'Mapping ' + ($index + 1) }}\n </span>\n @if (!mapping.enabled) {\n <span class=\"mapping-badge mapping-badge-off\">disabled</span>\n }\n </div>\n <div class=\"mapping-details\">\n <span class=\"kv\">\n <span class=\"kv-key\">Source:</span>\n <span class=\"kv-val\">\n {{ mapping.sourceName || mapping.sourceRtId || '\u2014 not linked \u2014' }}\n </span>\n </span>\n @if (mapping.sourceAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">Attr:</span>\n <span class=\"kv-val\">{{ mapping.sourceAttributePath }}</span>\n </span>\n }\n @if (mapping.mappingExpression) {\n <span class=\"kv\">\n <span class=\"kv-key\">Expr:</span>\n <code class=\"kv-val\">{{ mapping.mappingExpression }}</code>\n </span>\n }\n @if (mapping.targetAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">\u2192</span>\n <span class=\"kv-val\">{{ mapping.targetAttributePath }}</span>\n </span>\n }\n </div>\n <div class=\"mapping-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.pencil\"\n (click)=\"editMapping(mapping)\"\n title=\"Edit mapping\">Edit\u2026</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.trash\"\n (click)=\"deleteMapping(mapping)\"\n title=\"Delete mapping\"></button>\n </div>\n </li>\n }\n </ul>\n }\n } @else {\n <div class=\"empty-hint\">\n Select a node from the tree to view and edit its mappings.\n </div>\n }\n </div>\n </div>\n }\n\n @if (activeTab() === 'orphans') {\n <div class=\"coverage-toolbar\">\n <label class=\"toolbar-label\">Source type:</label>\n <select class=\"root-select\"\n [value]=\"orphanCkType() ?? ''\"\n (change)=\"onOrphanCkTypeChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a source type \u2014</option>\n @for (ckType of config.sourceCandidateCkTypeIds; track ckType) {\n <option [value]=\"ckType\">{{ ckType }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!orphanCkType() || orphanLoading()\"\n (click)=\"refreshOrphans()\" title=\"Reload\"></button>\n <span class=\"orphan-search-wrap\">\n <input type=\"text\" class=\"root-select orphan-search\"\n placeholder=\"Search name, room, description\u2026\"\n [value]=\"orphanSearchText()\"\n (input)=\"orphanSearchText.set($any($event.target).value)\" />\n @if (orphanSearchText()) {\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.x\"\n class=\"orphan-search-clear\"\n (click)=\"orphanSearchText.set('')\"\n title=\"Clear search\" aria-label=\"Clear search\"></button>\n }\n </span>\n <label class=\"orphan-toggle\">\n <input type=\"checkbox\" [checked]=\"orphanHideMapped()\" (change)=\"toggleOrphanHideMapped()\" />\n Hide already-mapped\n </label>\n <label class=\"toolbar-label\">Group by:</label>\n <select class=\"root-select\"\n [value]=\"orphanGroupParentType() ?? ''\"\n (change)=\"onOrphanGroupParentTypeChange($any($event.target).value)\">\n <option value=\"\">(no grouping)</option>\n @for (t of orphanAvailableParentTypes(); track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n @if (orphanGroupParentType()) {\n <kendo-multiselect class=\"orphan-group-filter\"\n [data]=\"orphanAvailableGroupNames()\"\n [value]=\"orphanSelectedGroupNames()\"\n (valueChange)=\"onOrphanGroupNamesChange($event)\"\n [autoClose]=\"false\"\n [clearButton]=\"true\"\n size=\"small\"\n placeholder=\"Filter groups\u2026\"\n title=\"Show only the selected groups (e.g. specific categories)\">\n </kendo-multiselect>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanVisibleList().length === 0\"\n (click)=\"selectAllVisibleOrphans()\"\n title=\"Select every row visible under the current filter\">Select all</button>\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"clearOrphanSelection()\">Clear</button>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"bulkMapSelected()\"\n title=\"Create one mapping per selected source (shared target + paths)\">\n Map {{ orphanSelectedCount() }} selected\u2026\n </button>\n\n @if (orphanStats(); as s) {\n <span class=\"validation-summary\">\n @if (orphanSearchText().trim() || orphanSelectedGroupNames().length > 0) {\n <span class=\"badge badge-info\" title=\"rows matching search + group filter\">{{ orphanVisibleList().length }} shown</span>\n }\n <span class=\"badge badge-error\" title=\"unmapped \u2014 no DataPointMapping yet\">{{ s.unmapped }} unmapped</span>\n <span class=\"badge badge-ok\" title=\"already covered by at least one mapping\">{{ s.mapped }} mapped</span>\n <span class=\"badge\">{{ s.total }} total</span>\n </span>\n }\n </div>\n\n <div class=\"orphan-body\">\n @if (orphanLoading()) {\n <div class=\"empty-hint\">Loading source candidates\u2026</div>\n } @else if (orphanError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (orphanVisibleList().length === 0) {\n <div class=\"empty-hint\">\n @if (orphanSelectedGroupNames().length > 0) {\n No entries in the selected group(s) match the current filters.\n } @else if (orphanSearchText().trim()) {\n No entries match \"{{ orphanSearchText() }}\".\n } @else if (orphanHideMapped()) {\n All {{ orphanCkType() }} entities are mapped at least once. \uD83C\uDF89\n } @else {\n No entities of type {{ orphanCkType() }} found.\n }\n </div>\n } @else if (orphanGroupParentType()) {\n @for (group of orphanGroupedList(); track group.key) {\n <div class=\"orphan-group\">\n <div class=\"orphan-group-header\">\n <span class=\"orphan-group-label\">{{ group.label }}</span>\n <span class=\"orphan-group-count\">{{ group.items.length }}</span>\n </div>\n <ul class=\"orphan-list\">\n @for (item of group.items; track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n </div>\n }\n } @else {\n <ul class=\"orphan-list\">\n @for (item of orphanVisibleList(); track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n }\n\n <ng-template #orphanRowTpl let-item>\n <li class=\"orphan-row\" [class.orphan-mapped]=\"item.mappingCount > 0\">\n <div class=\"orphan-line\">\n <input type=\"checkbox\" class=\"orphan-check\"\n [checked]=\"isOrphanSelected(item.rtId)\"\n (change)=\"toggleOrphanSelected(item.rtId)\"\n [attr.aria-label]=\"'Select ' + item.name\" />\n <span class=\"orphan-name\">{{ item.name }}</span>\n @if (item.mappingCount > 0) {\n <span class=\"orphan-badge orphan-badge-mapped\">\n {{ item.mappingCount }} mapping{{ item.mappingCount === 1 ? '' : 's' }}\n </span>\n } @else {\n <span class=\"orphan-badge orphan-badge-unmapped\">unmapped</span>\n }\n </div>\n @if (item.parentPath.length > 0) {\n <div class=\"orphan-breadcrumb\" [attr.title]=\"'Parent chain (root-first)'\">\n @for (parent of breadcrumbFor(item); track parent.rtId; let last = $last) {\n <span class=\"crumb\">{{ parent.name }}</span>\n @if (!last) { <span class=\"crumb-sep\">\u203A</span> }\n }\n </div>\n }\n <div class=\"orphan-meta\">\n <span class=\"kv-val\">{{ item.ckTypeId }}&#64;{{ item.rtId }}</span>\n </div>\n @if (item.description) {\n <div class=\"orphan-description\">{{ item.description }}</div>\n }\n <div class=\"orphan-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.plus\"\n (click)=\"createMappingFromOrphan(item)\"\n title=\"Create mapping pre-linked to this source\">\n Map\u2026\n </button>\n </div>\n </li>\n </ng-template>\n </div>\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.coverage-root{display:flex;flex-direction:column;flex:1;min-height:0;gap:12px}.coverage-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface-alt, #f8f9fa)) 70%,transparent)}.coverage-toolbar .toolbar-label{flex:0 0 96px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.coverage-toolbar .root-select{flex:0 0 280px;min-width:0;padding:4px 8px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:var(--theme-bg-elevated, var(--kendo-color-surface, #fff));color:var(--theme-text-primary, inherit);font-size:.9rem;height:30px}.coverage-toolbar .orphan-search-wrap{display:inline-flex;align-items:center;gap:2px}.coverage-toolbar .orphan-search-wrap .orphan-search{flex:1 1 220px;min-width:140px}.coverage-toolbar .orphan-group-filter{flex:0 1 320px;min-width:160px}.coverage-toolbar .toolbar-spacer{flex:1}.coverage-toolbar .toolbar-meta{display:flex;flex-direction:column;align-items:flex-end;line-height:1.1}.coverage-toolbar .toolbar-meta .meta-name{font-size:.85rem;font-weight:600}.coverage-toolbar .toolbar-meta .meta-type{font-size:.7rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d)}.coverage-body{flex:1;display:flex;gap:12px;min-height:0}@media(max-width:900px){.coverage-body{flex-direction:column}.coverage-tree-pane{flex:0 0 38vh;min-width:0;min-height:180px}.coverage-detail-pane{min-height:180px}.coverage-toolbar .toolbar-label{flex:0 0 auto}.coverage-toolbar .root-select{flex:1 1 200px;max-width:100%}}.coverage-tree-pane{flex:0 0 40%;min-width:240px;display:flex;flex-direction:column;min-height:0;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);overflow:auto}.coverage-detail-pane{flex:1;min-width:0;display:flex;flex-direction:column;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);padding:12px 14px;gap:12px;overflow:auto}.detail-header{display:flex;align-items:flex-start;gap:8px}.detail-header .detail-titles{flex:1;min-width:0}.detail-header .detail-name{margin:0;font-size:1.05rem;font-weight:600;word-break:break-word}.detail-header .detail-subtitle{font-size:.72rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d);word-break:break-all}.detail-section-title{display:flex;align-items:center;gap:10px;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.detail-section-title .toolbar-spacer{flex:1}.detail-section-title .detail-summary{text-transform:none;letter-spacing:0;font-weight:500;color:var(--kendo-color-on-app-surface, inherit);font-size:.78rem}.mapping-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.mapping-row{border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.mapping-row.mapping-disabled{opacity:.55}.mapping-line{display:flex;align-items:center;gap:8px}.mapping-line .mapping-name{font-weight:600;font-size:.9rem}.mapping-badge{font-size:.65rem;text-transform:uppercase;letter-spacing:.5px;padding:1px 6px;border-radius:8px;border:1px solid var(--kendo-color-border, #dee2e6)}.mapping-badge.mapping-badge-off{color:var(--kendo-color-subtle, #6c757d)}.mapping-details{display:flex;flex-wrap:wrap;gap:10px;font-size:.8rem}.mapping-details .kv{display:inline-flex;align-items:baseline;gap:4px}.mapping-details .kv-key{font-weight:600;color:var(--kendo-color-subtle, #6c757d)}.mapping-details code.kv-val{font-family:monospace;background:var(--kendo-color-surface, transparent);padding:1px 4px;border-radius:3px}.mapping-actions{display:flex;gap:6px;justify-content:flex-end}.empty-hint,.error-hint{padding:12px;font-size:.85rem;color:var(--kendo-color-subtle, #6c757d);text-align:center}.error-hint{color:var(--kendo-color-error, #dc3545)}.coverage-tabs{display:flex;gap:0;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6))}.coverage-tab{padding:8px 16px;border:none;background:transparent;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px}.coverage-tab:hover{color:var(--theme-text-primary, inherit)}.coverage-tab.active{color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358));border-bottom-color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358))}.coverage-tab .tab-badge{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border-radius:10px;padding:1px 8px;font-size:.7rem;font-weight:700}.orphan-toggle{display:inline-flex;align-items:center;gap:6px;font-size:.8rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));cursor:pointer}.orphan-body{flex:1;min-height:0;overflow:auto;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);padding:8px}.orphan-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.orphan-row{display:flex;flex-direction:column;gap:4px;padding:8px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-left-width:3px;border-left-color:var(--kendo-color-error, #dc3545);border-radius:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.orphan-row.orphan-mapped{border-left-color:var(--kendo-color-success, #28a745);opacity:.7}.orphan-row .orphan-line{display:flex;align-items:center;gap:8px}.orphan-row .orphan-line .orphan-check{flex-shrink:0;margin:0;cursor:pointer;accent-color:var(--kendo-color-primary, #ff6358)}.orphan-row .orphan-line .orphan-name{flex:1;font-weight:600;font-size:.9rem}.orphan-row .orphan-badge{font-size:.7rem;padding:1px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}.orphan-row .orphan-badge-unmapped{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border:1px solid var(--kendo-color-error, #dc3545)}.orphan-row .orphan-badge-mapped{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);color:var(--kendo-color-success, #28a745);border:1px solid var(--kendo-color-success, #28a745)}.orphan-row .orphan-meta{font-family:monospace;font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));word-break:break-all}.orphan-row .orphan-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.75rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.orphan-row .orphan-breadcrumb .crumb{line-height:1.3}.orphan-row .orphan-breadcrumb .crumb-sep{opacity:.55;font-weight:600}.orphan-row .orphan-description{font-size:.78rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-style:italic}.orphan-row .orphan-actions{display:flex;gap:6px;justify-content:flex-end}.orphan-group{display:flex;flex-direction:column;gap:6px}.orphan-group+.orphan-group{margin-top:14px}.orphan-group .orphan-group-header{display:flex;align-items:baseline;gap:8px;padding:4px 8px;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));font-size:.85rem;font-weight:600;color:var(--theme-text-primary, inherit)}.orphan-group .orphan-group-header .orphan-group-label{flex:1}.orphan-group .orphan-group-header .orphan-group-count{font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f1f3f5)) 80%,transparent);border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:10px;padding:0 8px}.validation-summary{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.badge{font-size:.7rem;padding:2px 8px;border-radius:10px;background:var(--kendo-color-surface, #f1f3f5);border:1px solid var(--kendo-color-border, #dee2e6)}.badge-error{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 18%,transparent);border-color:var(--kendo-color-error, #dc3545);color:var(--kendo-color-error, #dc3545);font-weight:600}.badge-warning{background:color-mix(in srgb,var(--kendo-color-warning, #ffc107) 22%,transparent);border-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-warning-on, #6b5500);font-weight:600}.badge-ok{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);border-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-success, #28a745);font-weight:600}.badge-info{background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);border-color:var(--kendo-color-info, #0dcaf0);color:var(--kendo-color-info, #0dcaf0)}.validation-error-text{color:var(--kendo-color-error, #dc3545);font-size:.8rem}.validation-timestamp{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);margin-left:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: LayoutModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: 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: "ngmodule", type: SVGIconModule }, { kind: "component", type: TreeComponent, selector: "mm-tree-view", inputs: ["dataSource"], outputs: ["nodeSelected", "nodeClick", "nodeDoubleClick", "nodeDrop", "expand", "collapse"] }, { kind: "component", type: PerspectiveSwitcherComponent, selector: "mm-perspective-switcher", inputs: ["perspectives", "activeKey", "label"], outputs: ["perspectiveChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20759
20783
  }
20760
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MappingCoverageTreeComponent, decorators: [{
20784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MappingCoverageTreeComponent, decorators: [{
20761
20785
  type: Component,
20762
20786
  args: [{ selector: 'mm-mapping-coverage-tree', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
20763
20787
  CommonModule,
@@ -20769,7 +20793,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
20769
20793
  TreeComponent,
20770
20794
  PerspectiveSwitcherComponent,
20771
20795
  ], providers: [MappingCoverageTreeDataSource], template: "<div class=\"coverage-root\">\n @if (config.sourceCandidateCkTypeIds.length > 0) {\n <div class=\"coverage-tabs\" role=\"tablist\">\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'coverage'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'coverage'\"\n (click)=\"selectTab('coverage')\">Coverage Tree</button>\n <button class=\"coverage-tab\"\n [class.active]=\"activeTab() === 'orphans'\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab() === 'orphans'\"\n (click)=\"selectTab('orphans')\">\n Orphan Sources\n @if (orphanStats(); as s) {\n @if (s.unmapped > 0) { <span class=\"tab-badge\">{{ s.unmapped }}</span> }\n }\n </button>\n </div>\n }\n\n @if (activeTab() === 'coverage') {\n <div class=\"coverage-toolbar\">\n <mm-perspective-switcher\n [perspectives]=\"perspectives()\"\n [activeKey]=\"activePerspectiveKey()\"\n (perspectiveChange)=\"onPerspectiveChange($event)\"></mm-perspective-switcher>\n <label class=\"toolbar-label\">Tree:</label>\n <select class=\"root-select\"\n [value]=\"selectedRoot()?.rtId ?? ''\"\n (change)=\"onRootSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ activeRootCkTypeId() }} \u2014</option>\n @for (root of rootCandidates(); track root.rtId) {\n <option [value]=\"root.rtId\" [title]=\"root.description\">{{ root.name }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshRoots()\" title=\"Refresh tree list\"></button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.folderOpen\"\n (click)=\"pickRoot()\" title=\"Browse for entity\">Browse...</button>\n\n @if (selectedRoot(); as root) {\n <div class=\"toolbar-spacer\"></div>\n <span class=\"toolbar-meta\">\n <span class=\"meta-name\">{{ root.name }}</span>\n <span class=\"meta-type\">{{ root.ckTypeId }}</span>\n </span>\n }\n </div>\n\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Validation:</label>\n <select class=\"root-select\"\n [value]=\"selectedPipeline()?.rtId ?? ''\"\n (change)=\"onPipelineSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a {{ config.validationPipelineCkTypeId }} \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n @if (tenantId) {\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedPipeline() || validationRunning() || validationLoading()\"\n (click)=\"runValidation()\"\n [title]=\"validationRunning() ? 'Validation running\u2026' : 'Run pipeline + load report'\">\n @if (validationRunning()) { Running\u2026 } @else { Run }\n </button>\n }\n <button kendoButton fillMode=\"solid\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!selectedPipeline() || validationLoading() || validationRunning()\"\n (click)=\"refreshValidation()\">Load Report</button>\n @if (validationSummary()) {\n <button kendoButton fillMode=\"flat\" size=\"small\"\n (click)=\"clearValidation()\">Clear</button>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (validationLoading()) {\n <span class=\"toolbar-meta\">Loading\u2026</span>\n } @else if (validationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (validationSummary(); as s) {\n <span class=\"validation-summary\">\n <span class=\"badge badge-error\" title=\"error\">{{ s.error }} err</span>\n <span class=\"badge badge-warning\" title=\"warning\">{{ s.warning }} warn</span>\n <span class=\"badge badge-ok\" title=\"ok\">{{ s.ok }} ok</span>\n <span class=\"badge badge-info\" title=\"info / unscoped\">{{ s.info }} info</span>\n <span class=\"badge\">{{ s.total }} total</span>\n @if (validationExecutedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n }\n </div>\n\n @if (tenantId) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Generation:</label>\n <select class=\"root-select\"\n [value]=\"selectedGenerationPipeline()?.rtId ?? ''\"\n (change)=\"onGenerationSelectChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick an auto-mapping pipeline \u2014</option>\n @for (p of validationPipelines(); track p.rtId) {\n <option [value]=\"p.rtId\">{{ p.name }}</option>\n }\n </select>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"!selectedGenerationPipeline() || generationRunning()\"\n (click)=\"runGeneration()\"\n [title]=\"generationRunning() ? 'Generation running\u2026' : 'Run the auto-mapping pipeline and reload counts'\">\n @if (generationRunning()) { Running\u2026 } @else { Generate }\n </button>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (generationRunning()) {\n <span class=\"toolbar-meta\">Generating mappings\u2026</span>\n } @else if (generationError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (generationStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.totalSuggestions !== undefined) {\n <span class=\"badge badge-ok\" title=\"mapping suggestions produced\">{{ s.totalSuggestions }} mappings</span>\n }\n @if (s.matchedContainers !== undefined && s.totalContainers !== undefined) {\n <span class=\"badge\" title=\"containers (e.g. rooms) matched to a target\">\n {{ s.matchedContainers }}/{{ s.totalContainers }} matched\n </span>\n }\n @if (s.unmatchedContainers) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unmatched: ' + (s.unmatchedContainerNames ?? []).join(', ')\">\n {{ s.unmatchedContainers }} unmatched\n </span>\n }\n @if (generationCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (generationCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n @if (tenantId && (exportBackupPipeline() || importBackupPipeline())) {\n <div class=\"coverage-toolbar coverage-toolbar-validation\">\n <label class=\"toolbar-label\">Backup:</label>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.download\"\n [disabled]=\"!exportBackupPipeline() || backupRunning() !== null\"\n (click)=\"exportMappings()\"\n title=\"Run the export pipeline and download the mapping document as JSON\">\n @if (backupRunning() === 'export') { Exporting\u2026 } @else { Export }\n </button>\n <button kendoButton size=\"small\" [svgIcon]=\"icons.upload\"\n [disabled]=\"!importBackupPipeline() || backupRunning() !== null\"\n (click)=\"importFileInput.click()\"\n title=\"Import a previously exported mapping document (JSON)\">\n @if (backupRunning() === 'import') { Importing\u2026 } @else { Import\u2026 }\n </button>\n <input #importFileInput type=\"file\" accept=\".json,application/json\" hidden\n (change)=\"onImportFileSelected($event)\" />\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (backupRunning() === 'export') {\n <span class=\"toolbar-meta\">Exporting mappings\u2026</span>\n } @else if (backupRunning() === 'import') {\n <span class=\"toolbar-meta\">Importing mappings\u2026</span>\n } @else if (backupError(); as err) {\n <span class=\"toolbar-meta validation-error-text\">{{ err }}</span>\n } @else if (importStats(); as s) {\n <span class=\"validation-summary\">\n @if (s.resolved !== undefined) {\n <span class=\"badge badge-ok\" title=\"mappings resolved and imported\">{{ s.resolved }} imported</span>\n }\n @if (s.unresolved) {\n <span class=\"badge badge-warning\"\n [attr.title]=\"'Unresolved: ' + unresolvedImportNames()\">\n {{ s.unresolved }} unresolved\n </span>\n }\n @if (s.total !== undefined) {\n <span class=\"badge\">{{ s.total }} total</span>\n }\n @if (importCompletedAt(); as ts) {\n <span class=\"validation-timestamp\">{{ ts }}</span>\n }\n </span>\n } @else if (importCompletedAt(); as ts) {\n <span class=\"toolbar-meta\">Import completed {{ ts }} (no statistics in OutputData)</span>\n }\n </div>\n }\n\n <div class=\"coverage-body\">\n <div class=\"coverage-tree-pane\">\n @if (selectedRoot()) {\n <mm-tree-view\n [dataSource]=\"dataSource\"\n (nodeSelected)=\"onNodeSelected($event)\">\n </mm-tree-view>\n } @else {\n <div class=\"empty-hint\">\n Select a tree to start. Counts in brackets show how many mappings\n point to that node.\n </div>\n }\n </div>\n\n <div class=\"coverage-detail-pane\">\n @if (selectedNode(); as node) {\n <div class=\"detail-header\">\n <div class=\"detail-titles\">\n <h3 class=\"detail-name\">{{ node.name }}</h3>\n <div class=\"detail-subtitle\">{{ node.ckTypeId }}@{{ node.rtId }}</div>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n (click)=\"refreshSelected()\" title=\"Refresh\"></button>\n </div>\n\n <div class=\"detail-section-title\">\n <span>Mappings</span>\n @if (summaryLine(); as s) {\n <span class=\"detail-summary\">{{ s }}</span>\n }\n <span class=\"toolbar-spacer\"></span>\n <button kendoButton themeColor=\"primary\" size=\"small\" [svgIcon]=\"icons.plus\"\n (click)=\"addMapping()\">Add</button>\n </div>\n\n @if (mappingsLoading()) {\n <div class=\"empty-hint\">Loading mappings\u2026</div>\n } @else if (mappingsError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (mappings().length === 0) {\n <div class=\"empty-hint\">\n No mappings reference this node yet. Add one using the button above.\n </div>\n } @else {\n <ul class=\"mapping-list\">\n @for (mapping of mappings(); track trackByRtId($index, mapping)) {\n <li class=\"mapping-row\" [class.mapping-disabled]=\"!mapping.enabled\">\n <div class=\"mapping-line\">\n <span class=\"mapping-name\">\n {{ mapping.name || 'Mapping ' + ($index + 1) }}\n </span>\n @if (!mapping.enabled) {\n <span class=\"mapping-badge mapping-badge-off\">disabled</span>\n }\n </div>\n <div class=\"mapping-details\">\n <span class=\"kv\">\n <span class=\"kv-key\">Source:</span>\n <span class=\"kv-val\">\n {{ mapping.sourceName || mapping.sourceRtId || '\u2014 not linked \u2014' }}\n </span>\n </span>\n @if (mapping.sourceAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">Attr:</span>\n <span class=\"kv-val\">{{ mapping.sourceAttributePath }}</span>\n </span>\n }\n @if (mapping.mappingExpression) {\n <span class=\"kv\">\n <span class=\"kv-key\">Expr:</span>\n <code class=\"kv-val\">{{ mapping.mappingExpression }}</code>\n </span>\n }\n @if (mapping.targetAttributePath) {\n <span class=\"kv\">\n <span class=\"kv-key\">\u2192</span>\n <span class=\"kv-val\">{{ mapping.targetAttributePath }}</span>\n </span>\n }\n </div>\n <div class=\"mapping-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.pencil\"\n (click)=\"editMapping(mapping)\"\n title=\"Edit mapping\">Edit\u2026</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.trash\"\n (click)=\"deleteMapping(mapping)\"\n title=\"Delete mapping\"></button>\n </div>\n </li>\n }\n </ul>\n }\n } @else {\n <div class=\"empty-hint\">\n Select a node from the tree to view and edit its mappings.\n </div>\n }\n </div>\n </div>\n }\n\n @if (activeTab() === 'orphans') {\n <div class=\"coverage-toolbar\">\n <label class=\"toolbar-label\">Source type:</label>\n <select class=\"root-select\"\n [value]=\"orphanCkType() ?? ''\"\n (change)=\"onOrphanCkTypeChange($any($event.target).value)\">\n <option value=\"\" disabled>\u2014 Pick a source type \u2014</option>\n @for (ckType of config.sourceCandidateCkTypeIds; track ckType) {\n <option [value]=\"ckType\">{{ ckType }}</option>\n }\n </select>\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.refresh\"\n [disabled]=\"!orphanCkType() || orphanLoading()\"\n (click)=\"refreshOrphans()\" title=\"Reload\"></button>\n <span class=\"orphan-search-wrap\">\n <input type=\"text\" class=\"root-select orphan-search\"\n placeholder=\"Search name, room, description\u2026\"\n [value]=\"orphanSearchText()\"\n (input)=\"orphanSearchText.set($any($event.target).value)\" />\n @if (orphanSearchText()) {\n <button kendoButton fillMode=\"flat\" size=\"small\" [svgIcon]=\"icons.x\"\n class=\"orphan-search-clear\"\n (click)=\"orphanSearchText.set('')\"\n title=\"Clear search\" aria-label=\"Clear search\"></button>\n }\n </span>\n <label class=\"orphan-toggle\">\n <input type=\"checkbox\" [checked]=\"orphanHideMapped()\" (change)=\"toggleOrphanHideMapped()\" />\n Hide already-mapped\n </label>\n <label class=\"toolbar-label\">Group by:</label>\n <select class=\"root-select\"\n [value]=\"orphanGroupParentType() ?? ''\"\n (change)=\"onOrphanGroupParentTypeChange($any($event.target).value)\">\n <option value=\"\">(no grouping)</option>\n @for (t of orphanAvailableParentTypes(); track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n @if (orphanGroupParentType()) {\n <kendo-multiselect class=\"orphan-group-filter\"\n [data]=\"orphanAvailableGroupNames()\"\n [value]=\"orphanSelectedGroupNames()\"\n (valueChange)=\"onOrphanGroupNamesChange($event)\"\n [autoClose]=\"false\"\n [clearButton]=\"true\"\n size=\"small\"\n placeholder=\"Filter groups\u2026\"\n title=\"Show only the selected groups (e.g. specific categories)\">\n </kendo-multiselect>\n }\n\n <div class=\"toolbar-spacer\"></div>\n\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanVisibleList().length === 0\"\n (click)=\"selectAllVisibleOrphans()\"\n title=\"Select every row visible under the current filter\">Select all</button>\n <button kendoButton size=\"small\" fillMode=\"flat\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"clearOrphanSelection()\">Clear</button>\n <button kendoButton themeColor=\"primary\" size=\"small\"\n [disabled]=\"orphanSelectedCount() === 0\"\n (click)=\"bulkMapSelected()\"\n title=\"Create one mapping per selected source (shared target + paths)\">\n Map {{ orphanSelectedCount() }} selected\u2026\n </button>\n\n @if (orphanStats(); as s) {\n <span class=\"validation-summary\">\n @if (orphanSearchText().trim() || orphanSelectedGroupNames().length > 0) {\n <span class=\"badge badge-info\" title=\"rows matching search + group filter\">{{ orphanVisibleList().length }} shown</span>\n }\n <span class=\"badge badge-error\" title=\"unmapped \u2014 no DataPointMapping yet\">{{ s.unmapped }} unmapped</span>\n <span class=\"badge badge-ok\" title=\"already covered by at least one mapping\">{{ s.mapped }} mapped</span>\n <span class=\"badge\">{{ s.total }} total</span>\n </span>\n }\n </div>\n\n <div class=\"orphan-body\">\n @if (orphanLoading()) {\n <div class=\"empty-hint\">Loading source candidates\u2026</div>\n } @else if (orphanError(); as err) {\n <div class=\"error-hint\">{{ err }}</div>\n } @else if (orphanVisibleList().length === 0) {\n <div class=\"empty-hint\">\n @if (orphanSelectedGroupNames().length > 0) {\n No entries in the selected group(s) match the current filters.\n } @else if (orphanSearchText().trim()) {\n No entries match \"{{ orphanSearchText() }}\".\n } @else if (orphanHideMapped()) {\n All {{ orphanCkType() }} entities are mapped at least once. \uD83C\uDF89\n } @else {\n No entities of type {{ orphanCkType() }} found.\n }\n </div>\n } @else if (orphanGroupParentType()) {\n @for (group of orphanGroupedList(); track group.key) {\n <div class=\"orphan-group\">\n <div class=\"orphan-group-header\">\n <span class=\"orphan-group-label\">{{ group.label }}</span>\n <span class=\"orphan-group-count\">{{ group.items.length }}</span>\n </div>\n <ul class=\"orphan-list\">\n @for (item of group.items; track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n </div>\n }\n } @else {\n <ul class=\"orphan-list\">\n @for (item of orphanVisibleList(); track trackOrphanByRtId($index, item)) {\n <ng-container *ngTemplateOutlet=\"orphanRowTpl; context: { $implicit: item }\"></ng-container>\n }\n </ul>\n }\n\n <ng-template #orphanRowTpl let-item>\n <li class=\"orphan-row\" [class.orphan-mapped]=\"item.mappingCount > 0\">\n <div class=\"orphan-line\">\n <input type=\"checkbox\" class=\"orphan-check\"\n [checked]=\"isOrphanSelected(item.rtId)\"\n (change)=\"toggleOrphanSelected(item.rtId)\"\n [attr.aria-label]=\"'Select ' + item.name\" />\n <span class=\"orphan-name\">{{ item.name }}</span>\n @if (item.mappingCount > 0) {\n <span class=\"orphan-badge orphan-badge-mapped\">\n {{ item.mappingCount }} mapping{{ item.mappingCount === 1 ? '' : 's' }}\n </span>\n } @else {\n <span class=\"orphan-badge orphan-badge-unmapped\">unmapped</span>\n }\n </div>\n @if (item.parentPath.length > 0) {\n <div class=\"orphan-breadcrumb\" [attr.title]=\"'Parent chain (root-first)'\">\n @for (parent of breadcrumbFor(item); track parent.rtId; let last = $last) {\n <span class=\"crumb\">{{ parent.name }}</span>\n @if (!last) { <span class=\"crumb-sep\">\u203A</span> }\n }\n </div>\n }\n <div class=\"orphan-meta\">\n <span class=\"kv-val\">{{ item.ckTypeId }}&#64;{{ item.rtId }}</span>\n </div>\n @if (item.description) {\n <div class=\"orphan-description\">{{ item.description }}</div>\n }\n <div class=\"orphan-actions\">\n <button kendoButton themeColor=\"primary\" fillMode=\"flat\" size=\"small\"\n [svgIcon]=\"icons.plus\"\n (click)=\"createMappingFromOrphan(item)\"\n title=\"Create mapping pre-linked to this source\">\n Map\u2026\n </button>\n </div>\n </li>\n </ng-template>\n </div>\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.coverage-root{display:flex;flex-direction:column;flex:1;min-height:0;gap:12px}.coverage-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface-alt, #f8f9fa)) 70%,transparent)}.coverage-toolbar .toolbar-label{flex:0 0 96px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.coverage-toolbar .root-select{flex:0 0 280px;min-width:0;padding:4px 8px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:4px;background:var(--theme-bg-elevated, var(--kendo-color-surface, #fff));color:var(--theme-text-primary, inherit);font-size:.9rem;height:30px}.coverage-toolbar .orphan-search-wrap{display:inline-flex;align-items:center;gap:2px}.coverage-toolbar .orphan-search-wrap .orphan-search{flex:1 1 220px;min-width:140px}.coverage-toolbar .orphan-group-filter{flex:0 1 320px;min-width:160px}.coverage-toolbar .toolbar-spacer{flex:1}.coverage-toolbar .toolbar-meta{display:flex;flex-direction:column;align-items:flex-end;line-height:1.1}.coverage-toolbar .toolbar-meta .meta-name{font-size:.85rem;font-weight:600}.coverage-toolbar .toolbar-meta .meta-type{font-size:.7rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d)}.coverage-body{flex:1;display:flex;gap:12px;min-height:0}@media(max-width:900px){.coverage-body{flex-direction:column}.coverage-tree-pane{flex:0 0 38vh;min-width:0;min-height:180px}.coverage-detail-pane{min-height:180px}.coverage-toolbar .toolbar-label{flex:0 0 auto}.coverage-toolbar .root-select{flex:1 1 200px;max-width:100%}}.coverage-tree-pane{flex:0 0 40%;min-width:240px;display:flex;flex-direction:column;min-height:0;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);overflow:auto}.coverage-detail-pane{flex:1;min-width:0;display:flex;flex-direction:column;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);color:var(--theme-text-primary, inherit);padding:12px 14px;gap:12px;overflow:auto}.detail-header{display:flex;align-items:flex-start;gap:8px}.detail-header .detail-titles{flex:1;min-width:0}.detail-header .detail-name{margin:0;font-size:1.05rem;font-weight:600;word-break:break-word}.detail-header .detail-subtitle{font-size:.72rem;font-family:monospace;color:var(--kendo-color-subtle, #6c757d);word-break:break-all}.detail-section-title{display:flex;align-items:center;gap:10px;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #6c757d)}.detail-section-title .toolbar-spacer{flex:1}.detail-section-title .detail-summary{text-transform:none;letter-spacing:0;font-weight:500;color:var(--kendo-color-on-app-surface, inherit);font-size:.78rem}.mapping-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.mapping-row{border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.mapping-row.mapping-disabled{opacity:.55}.mapping-line{display:flex;align-items:center;gap:8px}.mapping-line .mapping-name{font-weight:600;font-size:.9rem}.mapping-badge{font-size:.65rem;text-transform:uppercase;letter-spacing:.5px;padding:1px 6px;border-radius:8px;border:1px solid var(--kendo-color-border, #dee2e6)}.mapping-badge.mapping-badge-off{color:var(--kendo-color-subtle, #6c757d)}.mapping-details{display:flex;flex-wrap:wrap;gap:10px;font-size:.8rem}.mapping-details .kv{display:inline-flex;align-items:baseline;gap:4px}.mapping-details .kv-key{font-weight:600;color:var(--kendo-color-subtle, #6c757d)}.mapping-details code.kv-val{font-family:monospace;background:var(--kendo-color-surface, transparent);padding:1px 4px;border-radius:3px}.mapping-actions{display:flex;gap:6px;justify-content:flex-end}.empty-hint,.error-hint{padding:12px;font-size:.85rem;color:var(--kendo-color-subtle, #6c757d);text-align:center}.error-hint{color:var(--kendo-color-error, #dc3545)}.coverage-tabs{display:flex;gap:0;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6))}.coverage-tab{padding:8px 16px;border:none;background:transparent;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px}.coverage-tab:hover{color:var(--theme-text-primary, inherit)}.coverage-tab.active{color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358));border-bottom-color:var(--theme-text-accent, var(--kendo-color-primary, #ff6358))}.coverage-tab .tab-badge{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border-radius:10px;padding:1px 8px;font-size:.7rem;font-weight:700}.orphan-toggle{display:inline-flex;align-items:center;gap:6px;font-size:.8rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));cursor:pointer}.orphan-body{flex:1;min-height:0;overflow:auto;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:6px;background:color-mix(in srgb,var(--theme-bg-surface, var(--kendo-color-surface, #fff)) 60%,transparent);padding:8px}.orphan-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.orphan-row{display:flex;flex-direction:column;gap:4px;padding:8px 10px;border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-left-width:3px;border-left-color:var(--kendo-color-error, #dc3545);border-radius:6px;background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f8f9fa)) 65%,transparent)}.orphan-row.orphan-mapped{border-left-color:var(--kendo-color-success, #28a745);opacity:.7}.orphan-row .orphan-line{display:flex;align-items:center;gap:8px}.orphan-row .orphan-line .orphan-check{flex-shrink:0;margin:0;cursor:pointer;accent-color:var(--kendo-color-primary, #ff6358)}.orphan-row .orphan-line .orphan-name{flex:1;font-weight:600;font-size:.9rem}.orphan-row .orphan-badge{font-size:.7rem;padding:1px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}.orphan-row .orphan-badge-unmapped{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 22%,transparent);color:var(--kendo-color-error, #dc3545);border:1px solid var(--kendo-color-error, #dc3545)}.orphan-row .orphan-badge-mapped{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);color:var(--kendo-color-success, #28a745);border:1px solid var(--kendo-color-success, #28a745)}.orphan-row .orphan-meta{font-family:monospace;font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));word-break:break-all}.orphan-row .orphan-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.75rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d))}.orphan-row .orphan-breadcrumb .crumb{line-height:1.3}.orphan-row .orphan-breadcrumb .crumb-sep{opacity:.55;font-weight:600}.orphan-row .orphan-description{font-size:.78rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));font-style:italic}.orphan-row .orphan-actions{display:flex;gap:6px;justify-content:flex-end}.orphan-group{display:flex;flex-direction:column;gap:6px}.orphan-group+.orphan-group{margin-top:14px}.orphan-group .orphan-group-header{display:flex;align-items:baseline;gap:8px;padding:4px 8px;border-bottom:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));font-size:.85rem;font-weight:600;color:var(--theme-text-primary, inherit)}.orphan-group .orphan-group-header .orphan-group-label{flex:1}.orphan-group .orphan-group-header .orphan-group-count{font-size:.7rem;color:var(--theme-text-secondary, var(--kendo-color-subtle, #6c757d));background:color-mix(in srgb,var(--theme-bg-elevated, var(--kendo-color-surface-alt, #f1f3f5)) 80%,transparent);border:1px solid var(--theme-border-subtle, var(--kendo-color-border, #dee2e6));border-radius:10px;padding:0 8px}.validation-summary{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.badge{font-size:.7rem;padding:2px 8px;border-radius:10px;background:var(--kendo-color-surface, #f1f3f5);border:1px solid var(--kendo-color-border, #dee2e6)}.badge-error{background:color-mix(in srgb,var(--kendo-color-error, #dc3545) 18%,transparent);border-color:var(--kendo-color-error, #dc3545);color:var(--kendo-color-error, #dc3545);font-weight:600}.badge-warning{background:color-mix(in srgb,var(--kendo-color-warning, #ffc107) 22%,transparent);border-color:var(--kendo-color-warning, #ffc107);color:var(--kendo-color-warning-on, #6b5500);font-weight:600}.badge-ok{background:color-mix(in srgb,var(--kendo-color-success, #28a745) 18%,transparent);border-color:var(--kendo-color-success, #28a745);color:var(--kendo-color-success, #28a745);font-weight:600}.badge-info{background:color-mix(in srgb,var(--kendo-color-info, #0dcaf0) 18%,transparent);border-color:var(--kendo-color-info, #0dcaf0);color:var(--kendo-color-info, #0dcaf0)}.validation-error-text{color:var(--kendo-color-error, #dc3545);font-size:.8rem}.validation-timestamp{font-size:.7rem;color:var(--kendo-color-subtle, #6c757d);margin-left:4px}\n"] }]
20772
- }], propDecorators: { treeView: [{
20796
+ }], ctorParameters: () => [], propDecorators: { treeView: [{
20773
20797
  type: ViewChild,
20774
20798
  args: [TreeComponent, { static: false }]
20775
20799
  }], config: [{
@@ -21040,8 +21064,8 @@ class TenantSwitcherComponent {
21040
21064
  return ((this.anchor?.nativeElement.contains(target) ?? false) ||
21041
21065
  (this.popup?.nativeElement.contains(target) ?? false));
21042
21066
  }
21043
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TenantSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21044
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TenantSwitcherComponent, isStandalone: true, selector: "mm-tenant-switcher", inputs: { currentTenantId: "currentTenantId", allowedTenants: "allowedTenants", isDenied: "isDenied" }, outputs: { tenantSelected: "tenantSelected", refreshRequested: "refreshRequested" }, host: { listeners: { "document:keydown": "onKeydown($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["badgeEl"], descendants: true, read: ElementRef }, { propertyName: "popup", first: true, predicate: ["popupContent"], descendants: true, read: ElementRef }], ngImport: i0, template: `
21067
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TenantSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21068
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: TenantSwitcherComponent, isStandalone: true, selector: "mm-tenant-switcher", inputs: { currentTenantId: "currentTenantId", allowedTenants: "allowedTenants", isDenied: "isDenied" }, outputs: { tenantSelected: "tenantSelected", refreshRequested: "refreshRequested" }, host: { listeners: { "document:keydown": "onKeydown($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["badgeEl"], descendants: true, read: ElementRef }, { propertyName: "popup", first: true, predicate: ["popupContent"], descendants: true, read: ElementRef }], ngImport: i0, template: `
21045
21069
  @if (currentTenantId) {
21046
21070
  <div #badgeEl class="tenant-badge" [class.denied]="isDenied" (click)="onToggle()">
21047
21071
  <span class="tenant-icon">{{ isDenied ? '\u26A0' : '\u25C6' }}</span>
@@ -21080,7 +21104,7 @@ class TenantSwitcherComponent {
21080
21104
  }
21081
21105
  `, isInline: true, styles: [":host{display:inline-flex;align-items:center}.tenant-badge{display:flex;align-items:center;gap:8px;padding:6px 14px;background:var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent));border:1px solid var(--mm-tenant-switcher-border, var(--kendo-color-border, #dee2e6));border-radius:var(--mm-tenant-switcher-radius, 4px 16px 16px 4px);box-shadow:var(--mm-tenant-switcher-shadow, none);cursor:pointer;transition:all .2s ease}.tenant-badge:hover{background:var(--mm-tenant-switcher-bg-hover, var(--kendo-color-base-hover, rgba(0, 0, 0, .04)));box-shadow:var(--mm-tenant-switcher-shadow-hover, var(--mm-tenant-switcher-shadow, none))}.tenant-icon{font-size:.7rem;color:var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));animation:var(--mm-tenant-switcher-icon-animation, none)}.tenant-name{font-family:var(--mm-tenant-switcher-font, inherit);font-size:.85rem;font-weight:600;letter-spacing:1px;color:var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));text-transform:uppercase;text-shadow:var(--mm-tenant-switcher-text-shadow, none)}.denied{background:var(--mm-tenant-switcher-denied-bg, var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent)));border-color:var(--mm-tenant-switcher-denied-border, var(--kendo-color-error, #d9534f));box-shadow:var(--mm-tenant-switcher-denied-shadow, none)}.denied .tenant-icon,.denied .tenant-name{color:var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));text-shadow:var(--mm-tenant-switcher-denied-text-shadow, none)}.denied-label{font-family:var(--mm-tenant-switcher-font, inherit);font-size:.55rem;font-weight:700;letter-spacing:1px;color:var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));background:var(--mm-tenant-switcher-denied-label-bg, color-mix(in srgb, var(--kendo-color-error, #d9534f) 15%, transparent));padding:2px 6px;border-radius:3px}.tenant-popup{min-width:220px;padding:8px 0;background:var(--kendo-color-surface, #fff);border:1px solid var(--kendo-color-border, #dee2e6);border-radius:4px}.tenant-popup-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--kendo-color-subtle, #666);border-bottom:1px solid var(--kendo-color-border, #dee2e6);margin-bottom:4px}.refresh-btn{padding:2px;min-width:unset}.spinning{animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.tenant-list{list-style:none;margin:0;padding:0}.tenant-list-item{display:flex;align-items:center;gap:10px;padding:8px 16px;cursor:pointer;font-size:.85rem;transition:background .15s ease}.tenant-list-item:hover{background:var(--kendo-color-base-hover, rgba(0, 0, 0, .04))}.tenant-list-item.active{color:var(--kendo-color-primary, #ff6358);font-weight:600}.tenant-list-icon{font-size:.5rem;color:var(--kendo-color-subtle, #666)}.tenant-list-item.active .tenant-list-icon{color:var(--kendo-color-primary, #ff6358)}@keyframes mm-icon-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.1)}}\n"], dependencies: [{ kind: "component", type: PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchor", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "popupClass", "positionMode", "offset", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
21082
21106
  }
21083
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TenantSwitcherComponent, decorators: [{
21107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TenantSwitcherComponent, decorators: [{
21084
21108
  type: Component,
21085
21109
  args: [{ selector: 'mm-tenant-switcher', standalone: true, imports: [
21086
21110
  PopupComponent,