@meshmakers/octo-ui 3.3.780 → 3.3.790

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.
@@ -20,7 +20,7 @@ import { IconsModule, SVGIconModule, SVGIconComponent } from '@progress/kendo-an
20
20
  import * as i5 from '@progress/kendo-angular-inputs';
21
21
  import { InputsModule, TextBoxModule, KENDO_INPUTS } from '@progress/kendo-angular-inputs';
22
22
  import { searchIcon, sortAscSmallIcon, sortDescSmallIcon, filterClearIcon, chevronRightIcon, chevronDownIcon, downloadIcon, fileIcon, folderIcon, calendarIcon, checkboxCheckedIcon, listUnorderedIcon, arrowRightIcon, arrowLeftIcon, chevronDoubleRightIcon, chevronDoubleLeftIcon, arrowUpIcon, arrowDownIcon, pencilIcon, trashIcon, copyIcon, plusIcon, minusIcon, dollarIcon, infoCircleIcon, gearIcon, eyeIcon, arrowRotateCcwIcon, folderMoreIcon, folderOpenIcon, locationsIcon, arrowRotateCwIcon, xIcon } from '@progress/kendo-svg-icons';
23
- import { Subject, firstValueFrom, Subscription, of, forkJoin, takeUntil as takeUntil$1, defer, from, map as map$1, catchError as catchError$1, finalize, switchMap as switchMap$1, startWith } from 'rxjs';
23
+ import { Subject, firstValueFrom, Subscription, of, forkJoin, takeUntil as takeUntil$1, catchError as catchError$1, map as map$1, defer, from, finalize, switchMap as switchMap$1, startWith } from 'rxjs';
24
24
  import { debounceTime, distinctUntilChanged, map, switchMap, tap, catchError, takeUntil } from 'rxjs/operators';
25
25
  import { LoaderModule } from '@progress/kendo-angular-indicators';
26
26
  import { isCompositeFilterDescriptor } from '@progress/kendo-data-query';
@@ -242,8 +242,8 @@ class AttributeSortSelectorDialogComponent {
242
242
  onCancel() {
243
243
  this.windowRef.close();
244
244
  }
245
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
246
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: AttributeSortSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-sort-selector-dialog", host: { attributes: { "data-component": "attribute-sort-selector" } }, ngImport: i0, template: `
245
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSortSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
246
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: AttributeSortSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-sort-selector-dialog", host: { attributes: { "data-component": "attribute-sort-selector" } }, ngImport: i0, template: `
247
247
  <div class="attribute-sort-selector-container">
248
248
  <!-- Filter Section -->
249
249
  <div class="filter-container">
@@ -413,7 +413,7 @@ class AttributeSortSelectorDialogComponent {
413
413
  </div>
414
414
  `, 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"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownListModule }, { kind: "component", type: i4.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 }] });
415
415
  }
416
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSortSelectorDialogComponent, decorators: [{
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSortSelectorDialogComponent, decorators: [{
417
417
  type: Component,
418
418
  args: [{ selector: 'mm-attribute-sort-selector-dialog', standalone: true, host: { 'data-component': 'attribute-sort-selector' }, imports: [
419
419
  CommonModule,
@@ -661,10 +661,10 @@ class AttributeSortSelectorDialogService {
661
661
  };
662
662
  }
663
663
  }
664
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSortSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
665
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSortSelectorDialogService });
664
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSortSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
665
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSortSelectorDialogService });
666
666
  }
667
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSortSelectorDialogService, decorators: [{
667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSortSelectorDialogService, decorators: [{
668
668
  type: Injectable
669
669
  }] });
670
670
 
@@ -848,8 +848,8 @@ class CkTypeSelectorDialogComponent {
848
848
  this.windowRef.close(result);
849
849
  }
850
850
  }
851
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
852
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", ngImport: i0, template: `
851
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
852
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", ngImport: i0, template: `
853
853
  <div class="ck-type-selector-container">
854
854
  <div class="filter-container">
855
855
  <div class="filter-row">
@@ -931,7 +931,7 @@ class CkTypeSelectorDialogComponent {
931
931
  </div>
932
932
  `, 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$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: GridModule }, { kind: "component", type: i3.GridComponent, selector: "kendo-grid", inputs: ["data", "pageSize", "height", "rowHeight", "adaptiveMode", "detailRowHeight", "skip", "scrollable", "selectable", "sort", "size", "trackBy", "filter", "group", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "gridResizable", "rowReorderable", "navigable", "autoSize", "rowClass", "rowSticky", "rowSelected", "isRowSelectable", "cellSelected", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "showInactiveTools", "isDetailExpanded", "isGroupExpanded", "dataLayoutMode"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "component", type: i4.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 }] });
933
933
  }
934
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
934
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
935
935
  type: Component,
936
936
  args: [{ selector: 'mm-ck-type-selector-dialog', standalone: true, imports: [
937
937
  CommonModule,
@@ -1087,10 +1087,10 @@ class CkTypeSelectorDialogService {
1087
1087
  };
1088
1088
  }
1089
1089
  }
1090
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1091
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorDialogService });
1090
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1091
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorDialogService });
1092
1092
  }
1093
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorDialogService, decorators: [{
1093
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorDialogService, decorators: [{
1094
1094
  type: Injectable
1095
1095
  }] });
1096
1096
 
@@ -1466,10 +1466,10 @@ class PropertyConverterService {
1466
1466
  const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/;
1467
1467
  return isoDateRegex.test(value) && !isNaN(Date.parse(value));
1468
1468
  }
1469
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1470
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyConverterService, providedIn: 'root' });
1469
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1470
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyConverterService, providedIn: 'root' });
1471
1471
  }
1472
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyConverterService, decorators: [{
1472
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyConverterService, decorators: [{
1473
1473
  type: Injectable,
1474
1474
  args: [{
1475
1475
  providedIn: 'root'
@@ -1812,8 +1812,8 @@ class PropertyValueDisplayComponent {
1812
1812
  this.binaryDownload.emit(event);
1813
1813
  }
1814
1814
  }
1815
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyValueDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1816
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: PropertyValueDisplayComponent, isStandalone: true, selector: "mm-property-value-display", inputs: { value: "value", type: "type", displayMode: "displayMode" }, outputs: { binaryDownload: "binaryDownload" }, ngImport: i0, template: `
1815
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyValueDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1816
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: PropertyValueDisplayComponent, isStandalone: true, selector: "mm-property-value-display", inputs: { value: "value", type: "type", displayMode: "displayMode" }, outputs: { binaryDownload: "binaryDownload" }, ngImport: i0, template: `
1817
1817
  <div class="property-value-display" [ngClass]="'type-' + type.toLowerCase()">
1818
1818
 
1819
1819
  @if (expandableRecord) {
@@ -1913,7 +1913,7 @@ class PropertyValueDisplayComponent {
1913
1913
  </div>
1914
1914
  `, 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:var(--kendo-color-base-subtle);border-radius:3px;color:var(--kendo-color-subtle);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}.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)}.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"], outputs: ["binaryDownload"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1915
1915
  }
1916
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyValueDisplayComponent, decorators: [{
1916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyValueDisplayComponent, decorators: [{
1917
1917
  type: Component,
1918
1918
  args: [{ selector: 'mm-property-value-display', standalone: true, imports: [CommonModule, SVGIconModule, ButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1919
1919
  <div class="property-value-display" [ngClass]="'type-' + type.toLowerCase()">
@@ -2166,8 +2166,8 @@ class PropertyGridComponent {
2166
2166
  onBinaryDownload(event) {
2167
2167
  this.binaryDownload.emit(event);
2168
2168
  }
2169
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: PropertyGridComponent, isStandalone: true, selector: "mm-property-grid", inputs: { data: "data", config: "config", showTypeColumn: "showTypeColumn" }, outputs: { propertyChange: "propertyChange", saveRequested: "saveRequested", binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2169
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2170
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: PropertyGridComponent, isStandalone: true, selector: "mm-property-grid", inputs: { data: "data", config: "config", showTypeColumn: "showTypeColumn" }, outputs: { propertyChange: "propertyChange", saveRequested: "saveRequested", binaryDownload: "binaryDownload" }, usesOnChanges: true, ngImport: i0, template: `
2171
2171
  <div class="mm-property-grid" [style.height]="config.height || '400px'">
2172
2172
 
2173
2173
  @if (config.showSearch) {
@@ -2251,7 +2251,7 @@ class PropertyGridComponent {
2251
2251
  </div>
2252
2252
  `, 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$1.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"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "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"], exportAs: ["kendoSVGIcon"] }, { kind: "component", type: PropertyValueDisplayComponent, selector: "mm-property-value-display", inputs: ["value", "type", "displayMode"], outputs: ["binaryDownload"] }] });
2253
2253
  }
2254
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: PropertyGridComponent, decorators: [{
2254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertyGridComponent, decorators: [{
2255
2255
  type: Component,
2256
2256
  args: [{ selector: 'mm-property-grid', standalone: true, imports: [
2257
2257
  CommonModule,
@@ -2622,8 +2622,8 @@ class CkTypeSelectorInputComponent {
2622
2622
  this.selectCkType(result.selectedCkType);
2623
2623
  }
2624
2624
  }
2625
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2626
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.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", disabled: "disabled", required: "required" }, outputs: { ckTypeSelected: "ckTypeSelected", ckTypeCleared: "ckTypeCleared" }, providers: [
2625
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2626
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: CkTypeSelectorInputComponent, isStandalone: true, selector: "mm-ck-type-selector-input", inputs: { placeholder: "placeholder", minSearchLength: "minSearchLength", maxResults: "maxResults", debounceMs: "debounceMs", ckModelIds: "ckModelIds", allowAbstract: "allowAbstract", dialogTitle: "dialogTitle", advancedSearchLabel: "advancedSearchLabel", derivedFromRtCkTypeId: "derivedFromRtCkTypeId", disabled: "disabled", required: "required" }, outputs: { ckTypeSelected: "ckTypeSelected", ckTypeCleared: "ckTypeCleared" }, providers: [
2627
2627
  {
2628
2628
  provide: NG_VALUE_ACCESSOR,
2629
2629
  useExisting: forwardRef(() => CkTypeSelectorInputComponent),
@@ -2690,7 +2690,7 @@ class CkTypeSelectorInputComponent {
2690
2690
  </div>
2691
2691
  `, 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$1.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: i4.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: i4.FooterTemplateDirective, selector: "[kendoDropDownListFooterTemplate],[kendoComboBoxFooterTemplate],[kendoDropDownTreeFooterTemplate],[kendoMultiColumnComboBoxFooterTemplate],[kendoAutoCompleteFooterTemplate],[kendoMultiSelectFooterTemplate],[kendoMultiSelectTreeFooterTemplate]" }, { kind: "directive", type: i4.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: i4.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: SVGIconModule }] });
2692
2692
  }
2693
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeSelectorInputComponent, decorators: [{
2693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeSelectorInputComponent, decorators: [{
2694
2694
  type: Component,
2695
2695
  args: [{ selector: 'mm-ck-type-selector-input', standalone: true, imports: [
2696
2696
  CommonModule,
@@ -3143,8 +3143,8 @@ class AttributeSelectorDialogComponent {
3143
3143
  this.sortAvailableAttributes();
3144
3144
  this.updateGrids();
3145
3145
  }
3146
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3147
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: AttributeSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-selector-dialog", ngImport: i0, template: `
3146
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3147
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: AttributeSelectorDialogComponent, isStandalone: true, selector: "mm-attribute-selector-dialog", ngImport: i0, template: `
3148
3148
  <div class="attribute-selector-container">
3149
3149
  <div class="filter-container">
3150
3150
  <kendo-textbox
@@ -3356,7 +3356,7 @@ class AttributeSelectorDialogComponent {
3356
3356
  </div>
3357
3357
  `, 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}.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$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][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"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "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: i4.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 }] });
3358
3358
  }
3359
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSelectorDialogComponent, decorators: [{
3359
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSelectorDialogComponent, decorators: [{
3360
3360
  type: Component,
3361
3361
  args: [{ selector: 'mm-attribute-selector-dialog', standalone: true, imports: [
3362
3362
  CommonModule,
@@ -3655,10 +3655,10 @@ class AttributeSelectorDialogService {
3655
3655
  };
3656
3656
  }
3657
3657
  }
3658
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3659
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSelectorDialogService, providedIn: 'root' });
3658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSelectorDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3659
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSelectorDialogService, providedIn: 'root' });
3660
3660
  }
3661
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeSelectorDialogService, decorators: [{
3661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeSelectorDialogService, decorators: [{
3662
3662
  type: Injectable,
3663
3663
  args: [{
3664
3664
  providedIn: 'root'
@@ -3802,8 +3802,8 @@ class RuntimeEntityVariableDialogComponent {
3802
3802
  return true;
3803
3803
  return false;
3804
3804
  }
3805
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3806
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: RuntimeEntityVariableDialogComponent, isStandalone: true, selector: "mm-runtime-entity-variable-dialog", ngImport: i0, template: `
3805
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeEntityVariableDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3806
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: RuntimeEntityVariableDialogComponent, isStandalone: true, selector: "mm-runtime-entity-variable-dialog", ngImport: i0, template: `
3807
3807
  <div class="dialog-content">
3808
3808
  <div class="form-row">
3809
3809
  <label class="form-label">CK Type</label>
@@ -3885,7 +3885,7 @@ class RuntimeEntityVariableDialogComponent {
3885
3885
  </div>
3886
3886
  `, 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: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "ngmodule", type: GridModule }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: EntitySelectInputComponent, selector: "mm-entity-select-input", inputs: ["dataSource", "placeholder", "minSearchLength", "maxResults", "debounceMs", "prefix", "initialDisplayValue", "dialogDataSource", "dialogTitle", "multiSelect", "advancedSearchLabel", "dialogMessages", "messages", "disabled", "required"], outputs: ["entitySelected", "entityCleared", "entitiesSelected"] }] });
3887
3887
  }
3888
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeEntityVariableDialogComponent, decorators: [{
3888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeEntityVariableDialogComponent, decorators: [{
3889
3889
  type: Component,
3890
3890
  args: [{ selector: 'mm-runtime-entity-variable-dialog', standalone: true, imports: [
3891
3891
  CommonModule,
@@ -4020,10 +4020,10 @@ class RuntimeEntityVariableDialogService {
4020
4020
  return { confirmed: false };
4021
4021
  }
4022
4022
  }
4023
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeEntityVariableDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4024
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeEntityVariableDialogService, providedIn: 'root' });
4023
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeEntityVariableDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4024
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeEntityVariableDialogService, providedIn: 'root' });
4025
4025
  }
4026
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeEntityVariableDialogService, decorators: [{
4026
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeEntityVariableDialogService, decorators: [{
4027
4027
  type: Injectable,
4028
4028
  args: [{
4029
4029
  providedIn: 'root'
@@ -4209,8 +4209,8 @@ class EntityIdInfoComponent {
4209
4209
  this.notificationService.showError('Failed to copy to clipboard');
4210
4210
  }
4211
4211
  }
4212
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityIdInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: EntityIdInfoComponent, isStandalone: true, selector: "mm-entity-id-info", inputs: { rtId: "rtId", rtCkTypeId: "rtCkTypeId", ckTypeId: "ckTypeId" }, ngImport: i0, template: `
4212
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityIdInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4213
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: EntityIdInfoComponent, isStandalone: true, selector: "mm-entity-id-info", inputs: { rtId: "rtId", rtCkTypeId: "rtCkTypeId", ckTypeId: "ckTypeId" }, ngImport: i0, template: `
4214
4214
  <kendo-dropdownbutton
4215
4215
  [data]="copyOptions"
4216
4216
  [svgIcon]="copyIcon"
@@ -4228,7 +4228,7 @@ class EntityIdInfoComponent {
4228
4228
  </kendo-dropdownbutton>
4229
4229
  `, 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: i3$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: i3$1.ButtonItemTemplateDirective, selector: "[kendoDropDownButtonItemTemplate],[kendoSplitButtonItemTemplate]" }, { kind: "ngmodule", type: SVGIconModule }] });
4230
4230
  }
4231
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityIdInfoComponent, decorators: [{
4231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityIdInfoComponent, decorators: [{
4232
4232
  type: Component,
4233
4233
  args: [{ selector: 'mm-entity-id-info', standalone: true, imports: [
4234
4234
  CommonModule,
@@ -4754,8 +4754,8 @@ class FieldFilterEditorComponent {
4754
4754
  }
4755
4755
  return values;
4756
4756
  }
4757
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: FieldFilterEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4758
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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: `
4757
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FieldFilterEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4758
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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: `
4759
4759
  <div class="field-filter-editor">
4760
4760
  @if (ckTypeId && !hideNavigationProperties) {
4761
4761
  <div class="attribute-options">
@@ -5054,7 +5054,7 @@ class FieldFilterEditorComponent {
5054
5054
  </div>
5055
5055
  `, 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][formControlName],input[type=checkbox][formControl],input[type=checkbox][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"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "rowReorder", "dataStateChange", "gridStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "directive", type: i3.HeaderTemplateDirective, selector: "[kendoGridHeaderTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "directive", type: i4.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "component", type: i4.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: i4.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: i4.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 }] });
5056
5056
  }
5057
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
5057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
5058
5058
  type: Component,
5059
5059
  args: [{ selector: 'mm-field-filter-editor', standalone: true, imports: [
5060
5060
  CommonModule,
@@ -5399,8 +5399,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
5399
5399
  */
5400
5400
  class OctoLoaderComponent {
5401
5401
  size = 'medium';
5402
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: OctoLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5403
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: OctoLoaderComponent, isStandalone: true, selector: "mm-octo-loader", inputs: { size: "size" }, ngImport: i0, template: `
5402
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: OctoLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5403
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: OctoLoaderComponent, isStandalone: true, selector: "mm-octo-loader", inputs: { size: "size" }, ngImport: i0, template: `
5404
5404
  <div class="octo-loader" [class.octo-loader--small]="size === 'small'" [class.octo-loader--medium]="size === 'medium'">
5405
5405
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-22 -8 112 118" class="octo-loader__svg" overflow="visible">
5406
5406
  <!-- Orbit track -->
@@ -5491,7 +5491,7 @@ class OctoLoaderComponent {
5491
5491
  </div>
5492
5492
  `, 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"] });
5493
5493
  }
5494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: OctoLoaderComponent, decorators: [{
5494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: OctoLoaderComponent, decorators: [{
5495
5495
  type: Component,
5496
5496
  args: [{ selector: 'mm-octo-loader', standalone: true, template: `
5497
5497
  <div class="octo-loader" [class.octo-loader--small]="size === 'small'" [class.octo-loader--medium]="size === 'medium'">
@@ -5612,10 +5612,10 @@ class GetBinaryInfoDtoGQL extends i1$2.Query {
5612
5612
  constructor(apollo) {
5613
5613
  super(apollo);
5614
5614
  }
5615
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetBinaryInfoDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5616
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetBinaryInfoDtoGQL, providedIn: 'root' });
5615
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetBinaryInfoDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5616
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetBinaryInfoDtoGQL, providedIn: 'root' });
5617
5617
  }
5618
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetBinaryInfoDtoGQL, decorators: [{
5618
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetBinaryInfoDtoGQL, decorators: [{
5619
5619
  type: Injectable,
5620
5620
  args: [{
5621
5621
  providedIn: 'root'
@@ -5658,10 +5658,10 @@ class GetRuntimeEntityAssociationsByIdDtoGQL extends i1$2.Query {
5658
5658
  constructor(apollo) {
5659
5659
  super(apollo);
5660
5660
  }
5661
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5662
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, providedIn: 'root' });
5661
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
5662
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, providedIn: 'root' });
5663
5663
  }
5664
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, decorators: [{
5664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityAssociationsByIdDtoGQL, decorators: [{
5665
5665
  type: Injectable,
5666
5666
  args: [{
5667
5667
  providedIn: 'root'
@@ -5746,15 +5746,15 @@ class EntityAssociationsDataSourceDirective extends OctoGraphQlDataSource {
5746
5746
  return new FetchResultTyped(transformedItems, totalCount);
5747
5747
  }));
5748
5748
  }
5749
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5750
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.5", type: EntityAssociationsDataSourceDirective, isStandalone: true, selector: "[mmEntityAssociationsDataSource]", providers: [
5749
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityAssociationsDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5750
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.8", type: EntityAssociationsDataSourceDirective, isStandalone: true, selector: "[mmEntityAssociationsDataSource]", providers: [
5751
5751
  {
5752
5752
  provide: DataSourceBase,
5753
5753
  useExisting: forwardRef(() => EntityAssociationsDataSourceDirective),
5754
5754
  },
5755
5755
  ], exportAs: ["mmEntityAssociationsDataSource"], usesInheritance: true, ngImport: i0 });
5756
5756
  }
5757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityAssociationsDataSourceDirective, decorators: [{
5757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityAssociationsDataSourceDirective, decorators: [{
5758
5758
  type: Directive,
5759
5759
  args: [{
5760
5760
  selector: '[mmEntityAssociationsDataSource]',
@@ -6110,8 +6110,8 @@ class EntityDetailViewComponent {
6110
6110
  });
6111
6111
  }
6112
6112
  }
6113
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6114
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: EntityDetailViewComponent, isStandalone: true, selector: "mm-entity-detail-view", inputs: { entity: "entity", loading: "loading", error: "error", showHeader: "showHeader", messages: "messages" }, outputs: { retry: "retry", propertyChange: "propertyChange", navigateToEntity: "navigateToEntity" }, viewQueries: [{ propertyName: "associationsDataSource", first: true, predicate: ["associationsDir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6113
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6114
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: EntityDetailViewComponent, isStandalone: true, selector: "mm-entity-detail-view", inputs: { entity: "entity", loading: "loading", error: "error", showHeader: "showHeader", messages: "messages" }, outputs: { retry: "retry", propertyChange: "propertyChange", navigateToEntity: "navigateToEntity" }, viewQueries: [{ propertyName: "associationsDataSource", first: true, predicate: ["associationsDir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6115
6115
  @if (loading) {
6116
6116
  <div class="loading-state">
6117
6117
  <p>{{ _messages.loadingEntityDetails }}</p>
@@ -6325,7 +6325,7 @@ class EntityDetailViewComponent {
6325
6325
  }
6326
6326
  `, 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)}@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$3.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$3.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i1$3.TabContentDirective, selector: "[kendoTabContent]" }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i5$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i1$3.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$3.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$3.CardHeaderComponent, selector: "kendo-card-header" }, { kind: "ngmodule", type: DropDownListModule }, { kind: "component", type: i4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "ngmodule", type: TextBoxModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: PropertyGridComponent, selector: "mm-property-grid", inputs: ["data", "config", "showTypeColumn"], outputs: ["propertyChange", "saveRequested", "binaryDownload"] }, { kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked"] }, { kind: "directive", type: EntityAssociationsDataSourceDirective, selector: "[mmEntityAssociationsDataSource]", exportAs: ["mmEntityAssociationsDataSource"] }] });
6327
6327
  }
6328
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailViewComponent, decorators: [{
6328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailViewComponent, decorators: [{
6329
6329
  type: Component,
6330
6330
  args: [{ selector: "mm-entity-detail-view", standalone: true, imports: [
6331
6331
  CommonModule,
@@ -6603,10 +6603,10 @@ class GetRuntimeEntityByIdDtoGQL extends i1$2.Query {
6603
6603
  constructor(apollo) {
6604
6604
  super(apollo);
6605
6605
  }
6606
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6607
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, providedIn: 'root' });
6606
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
6607
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, providedIn: 'root' });
6608
6608
  }
6609
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, decorators: [{
6609
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntityByIdDtoGQL, decorators: [{
6610
6610
  type: Injectable,
6611
6611
  args: [{
6612
6612
  providedIn: 'root'
@@ -6648,10 +6648,10 @@ class EntityDetailDataSource {
6648
6648
  throw error;
6649
6649
  }
6650
6650
  }
6651
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6652
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailDataSource, providedIn: 'root' });
6651
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6652
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailDataSource, providedIn: 'root' });
6653
6653
  }
6654
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailDataSource, decorators: [{
6654
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailDataSource, decorators: [{
6655
6655
  type: Injectable,
6656
6656
  args: [{
6657
6657
  providedIn: 'root',
@@ -6806,8 +6806,8 @@ class EntityDetailComponent {
6806
6806
  // TODO: Implement property change handling
6807
6807
  // This could be used to track modifications and enable save functionality
6808
6808
  }
6809
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6810
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", ngImport: i0, template: `
6809
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6810
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: EntityDetailComponent, isStandalone: true, selector: "mm-entity-detail", ngImport: i0, template: `
6811
6811
  <div class="entity-detail">
6812
6812
  <div class="entity-detail-header">
6813
6813
  <button
@@ -6841,7 +6841,7 @@ class EntityDetailComponent {
6841
6841
  </div>
6842
6842
  `, 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: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: EntityDetailViewComponent, selector: "mm-entity-detail-view", inputs: ["entity", "loading", "error", "showHeader", "messages"], outputs: ["retry", "propertyChange", "navigateToEntity"] }] });
6843
6843
  }
6844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: EntityDetailComponent, decorators: [{
6844
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityDetailComponent, decorators: [{
6845
6845
  type: Component,
6846
6846
  args: [{ selector: 'mm-entity-detail', imports: [
6847
6847
  CommonModule,
@@ -7156,6 +7156,149 @@ const article = {
7156
7156
  viewBox: '0 -960 960 960'
7157
7157
  };
7158
7158
 
7159
+ const GetCkTypeAssociationRolesDocumentDto = gql `
7160
+ query getCkTypeAssociationRoles($ckTypeId: String!) {
7161
+ constructionKit {
7162
+ types(rtCkId: $ckTypeId, first: 1) {
7163
+ items {
7164
+ rtCkTypeId
7165
+ associations {
7166
+ in {
7167
+ all {
7168
+ roleId {
7169
+ fullName
7170
+ semanticVersionedFullName
7171
+ }
7172
+ rtRoleId
7173
+ navigationPropertyName
7174
+ multiplicity
7175
+ targetCkTypeId {
7176
+ fullName
7177
+ }
7178
+ rtTargetCkTypeId
7179
+ }
7180
+ }
7181
+ out {
7182
+ all {
7183
+ roleId {
7184
+ fullName
7185
+ semanticVersionedFullName
7186
+ }
7187
+ rtRoleId
7188
+ navigationPropertyName
7189
+ multiplicity
7190
+ targetCkTypeId {
7191
+ fullName
7192
+ }
7193
+ rtTargetCkTypeId
7194
+ }
7195
+ }
7196
+ }
7197
+ }
7198
+ }
7199
+ }
7200
+ }
7201
+ `;
7202
+ class GetCkTypeAssociationRolesDtoGQL extends i1$2.Query {
7203
+ document = GetCkTypeAssociationRolesDocumentDto;
7204
+ constructor(apollo) {
7205
+ super(apollo);
7206
+ }
7207
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7208
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, providedIn: 'root' });
7209
+ }
7210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkTypeAssociationRolesDtoGQL, decorators: [{
7211
+ type: Injectable,
7212
+ args: [{
7213
+ providedIn: 'root'
7214
+ }]
7215
+ }], ctorParameters: () => [{ type: i1$2.Apollo }] });
7216
+
7217
+ /**
7218
+ * Validates whether a drag-and-drop move (reparenting) is allowed by the CK model.
7219
+ *
7220
+ * Strategy: query the SOURCE type's OUTBOUND association roles and look for a
7221
+ * `System/ParentChild` role whose `rtTargetCkTypeId` matches the destination type.
7222
+ * This means "source entity can have a parent of destination type".
7223
+ */
7224
+ class AssociationValidationService {
7225
+ getCkTypeAssociationRolesGQL = inject(GetCkTypeAssociationRolesDtoGQL);
7226
+ /** Cache: sourceCkTypeId → outbound roles */
7227
+ outRolesCache = new Map();
7228
+ /**
7229
+ * Checks whether an entity of `sourceCkTypeId` can be moved (reparented)
7230
+ * to an entity of `destinationCkTypeId` via a ParentChild association.
7231
+ */
7232
+ async canMove(sourceCkTypeId, destinationCkTypeId) {
7233
+ const outRoles = await this.getOutboundRoles(sourceCkTypeId);
7234
+ // Find a ParentChild outbound role where the target matches the destination type.
7235
+ // Use rtTargetCkTypeId (runtime format) for matching — it matches event.ckTypeId.
7236
+ const matchingRole = outRoles.find((r) => r.rtRoleId === 'System/ParentChild' &&
7237
+ r.rtTargetCkTypeId === destinationCkTypeId);
7238
+ if (matchingRole) {
7239
+ return {
7240
+ allowed: true,
7241
+ rtRoleId: matchingRole.rtRoleId,
7242
+ roleId: matchingRole.roleId,
7243
+ navigationPropertyName: this.toLowerCamelCase(matchingRole.navigationPropertyName),
7244
+ };
7245
+ }
7246
+ return {
7247
+ allowed: false,
7248
+ reason: `CK model does not define a ParentChild association from "${sourceCkTypeId}" to "${destinationCkTypeId}"`,
7249
+ };
7250
+ }
7251
+ /**
7252
+ * Fetches and caches the outbound association roles for a given CK type.
7253
+ */
7254
+ async getOutboundRoles(ckTypeId) {
7255
+ const cached = this.outRolesCache.get(ckTypeId);
7256
+ if (cached) {
7257
+ return cached;
7258
+ }
7259
+ const result = await firstValueFrom(this.getCkTypeAssociationRolesGQL.fetch({
7260
+ variables: { ckTypeId },
7261
+ fetchPolicy: 'network-only',
7262
+ }));
7263
+ const typeData = result.data?.constructionKit?.types?.items?.[0];
7264
+ const rawRoles = typeData?.associations?.out?.all ?? [];
7265
+ const roles = rawRoles
7266
+ .filter((r) => r !== null && r !== undefined)
7267
+ .map((r) => ({
7268
+ roleId: r.roleId?.fullName ?? '',
7269
+ rtRoleId: String(r.rtRoleId ?? ''),
7270
+ targetCkTypeId: r.targetCkTypeId?.fullName ?? '',
7271
+ rtTargetCkTypeId: String(r.rtTargetCkTypeId ?? ''),
7272
+ multiplicity: r.multiplicity ?? '',
7273
+ navigationPropertyName: r.navigationPropertyName ?? '',
7274
+ }));
7275
+ this.outRolesCache.set(ckTypeId, roles);
7276
+ return roles;
7277
+ }
7278
+ /**
7279
+ * Normalizes navigation property name to lowerCamelCase, matching the
7280
+ * backend convention used by typed input types (e.g. "Parent" → "parent").
7281
+ */
7282
+ toLowerCamelCase(name) {
7283
+ if (!name) {
7284
+ return name;
7285
+ }
7286
+ return name.charAt(0).toLowerCase() + name.slice(1);
7287
+ }
7288
+ /** Clears the role cache (e.g. on tenant switch). */
7289
+ clearCache() {
7290
+ this.outRolesCache.clear();
7291
+ }
7292
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AssociationValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7293
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AssociationValidationService, providedIn: 'root' });
7294
+ }
7295
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AssociationValidationService, decorators: [{
7296
+ type: Injectable,
7297
+ args: [{
7298
+ providedIn: 'root',
7299
+ }]
7300
+ }] });
7301
+
7159
7302
  const GetRuntimeEntitiesByTypeDocumentDto = gql `
7160
7303
  query getRuntimeEntitiesByType($ckTypeId: String!, $after: String, $first: Int, $searchFilter: SearchFilter, $fieldFilters: [FieldFilter], $sort: [Sort]) {
7161
7304
  runtime {
@@ -7188,10 +7331,10 @@ class GetRuntimeEntitiesByTypeDtoGQL extends i1$2.Query {
7188
7331
  constructor(apollo) {
7189
7332
  super(apollo);
7190
7333
  }
7191
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7192
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, providedIn: 'root' });
7334
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7335
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, providedIn: 'root' });
7193
7336
  }
7194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, decorators: [{
7337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetRuntimeEntitiesByTypeDtoGQL, decorators: [{
7195
7338
  type: Injectable,
7196
7339
  args: [{
7197
7340
  providedIn: 'root'
@@ -7252,15 +7395,15 @@ class CkTypeEntitiesDataSourceDirective extends OctoGraphQlDataSource {
7252
7395
  return new FetchResultTyped(transformedItems, totalCount);
7253
7396
  }));
7254
7397
  }
7255
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7256
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.5", type: CkTypeEntitiesDataSourceDirective, isStandalone: true, selector: "[mmCkTypeEntitiesDataSource]", providers: [
7398
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7399
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.8", type: CkTypeEntitiesDataSourceDirective, isStandalone: true, selector: "[mmCkTypeEntitiesDataSource]", providers: [
7257
7400
  {
7258
7401
  provide: DataSourceBase,
7259
7402
  useExisting: forwardRef(() => CkTypeEntitiesDataSourceDirective),
7260
7403
  },
7261
7404
  ], exportAs: ["mmCkTypeEntitiesDataSource"], usesInheritance: true, ngImport: i0 });
7262
7405
  }
7263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, decorators: [{
7406
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CkTypeEntitiesDataSourceDirective, decorators: [{
7264
7407
  type: Directive,
7265
7408
  args: [{
7266
7409
  selector: '[mmCkTypeEntitiesDataSource]',
@@ -7352,21 +7495,29 @@ class RuntimeBrowserStateService {
7352
7495
  */
7353
7496
  getItemId(item) {
7354
7497
  const itemData = item.item;
7355
- // Runtime entity
7498
+ // Runtime entity — has both rtId and ckTypeId as scalar strings
7356
7499
  if ('rtId' in itemData && 'ckTypeId' in itemData) {
7357
7500
  return `${String(itemData.ckTypeId)}@${String(itemData.rtId)}`;
7358
7501
  }
7359
- // CK Model
7502
+ // CK Model — id is CkModelIdDto (object with fullName)
7360
7503
  if ('id' in itemData &&
7361
7504
  !('rtId' in itemData) &&
7362
7505
  !('ckTypeId' in itemData)) {
7363
- return `ck-model:${String(itemData.id)}`;
7506
+ const modelId = itemData.id;
7507
+ const name = typeof modelId === 'object' && modelId !== null && 'fullName' in modelId
7508
+ ? modelId.fullName
7509
+ : String(modelId);
7510
+ return `ck-model:${name}`;
7364
7511
  }
7365
- // CK Type
7512
+ // CK Type — ckTypeId is CkTypeIdDto (object with fullName)
7366
7513
  if ('ckTypeId' in itemData &&
7367
7514
  !('rtId' in itemData) &&
7368
7515
  !('id' in itemData)) {
7369
- return `ck-type:${String(itemData.ckTypeId)}`;
7516
+ const typeId = itemData.ckTypeId;
7517
+ const name = typeof typeId === 'object' && typeId !== null && 'fullName' in typeId
7518
+ ? typeId.fullName
7519
+ : String(typeId);
7520
+ return `ck-type:${name}`;
7370
7521
  }
7371
7522
  // CK Models root
7372
7523
  if ('isCkModelsRoot' in itemData && itemData.isCkModelsRoot) {
@@ -7374,10 +7525,10 @@ class RuntimeBrowserStateService {
7374
7525
  }
7375
7526
  return item.text || 'unknown';
7376
7527
  }
7377
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7378
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserStateService, providedIn: 'root' });
7528
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7529
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserStateService, providedIn: 'root' });
7379
7530
  }
7380
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserStateService, decorators: [{
7531
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserStateService, decorators: [{
7381
7532
  type: Injectable,
7382
7533
  args: [{
7383
7534
  providedIn: 'root',
@@ -7399,10 +7550,10 @@ class TypeHelperService {
7399
7550
  && item.rtId
7400
7551
  && item.ckTypeId);
7401
7552
  }
7402
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TypeHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7403
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TypeHelperService, providedIn: 'root' });
7553
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TypeHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7554
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TypeHelperService, providedIn: 'root' });
7404
7555
  }
7405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TypeHelperService, decorators: [{
7556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TypeHelperService, decorators: [{
7406
7557
  type: Injectable,
7407
7558
  args: [{
7408
7559
  providedIn: 'root',
@@ -7425,10 +7576,10 @@ class CreateEntitiesDtoGQL extends i1$2.Mutation {
7425
7576
  constructor(apollo) {
7426
7577
  super(apollo);
7427
7578
  }
7428
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CreateEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7429
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CreateEntitiesDtoGQL, providedIn: 'root' });
7579
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CreateEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7580
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CreateEntitiesDtoGQL, providedIn: 'root' });
7430
7581
  }
7431
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CreateEntitiesDtoGQL, decorators: [{
7582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CreateEntitiesDtoGQL, decorators: [{
7432
7583
  type: Injectable,
7433
7584
  args: [{
7434
7585
  providedIn: 'root'
@@ -7460,10 +7611,10 @@ class AttributeCoordinatorService {
7460
7611
  markStructureAsReady() {
7461
7612
  this.structureReady.set(true);
7462
7613
  }
7463
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeCoordinatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7464
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeCoordinatorService, providedIn: "root" });
7614
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeCoordinatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7615
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeCoordinatorService, providedIn: "root" });
7465
7616
  }
7466
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeCoordinatorService, decorators: [{
7617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeCoordinatorService, decorators: [{
7467
7618
  type: Injectable,
7468
7619
  args: [{ providedIn: "root" }]
7469
7620
  }] });
@@ -7514,10 +7665,10 @@ class GetCkAttributesDetailedDtoGQL extends i1$2.Query {
7514
7665
  constructor(apollo) {
7515
7666
  super(apollo);
7516
7667
  }
7517
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7518
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, providedIn: 'root' });
7668
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7669
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, providedIn: 'root' });
7519
7670
  }
7520
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, decorators: [{
7671
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkAttributesDetailedDtoGQL, decorators: [{
7521
7672
  type: Injectable,
7522
7673
  args: [{
7523
7674
  providedIn: 'root'
@@ -7571,16 +7722,71 @@ class GetCkRecordDetailedDtoGQL extends i1$2.Query {
7571
7722
  constructor(apollo) {
7572
7723
  super(apollo);
7573
7724
  }
7574
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7575
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, providedIn: 'root' });
7725
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkRecordDetailedDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
7726
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkRecordDetailedDtoGQL, providedIn: 'root' });
7576
7727
  }
7577
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkRecordDetailedDtoGQL, decorators: [{
7728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkRecordDetailedDtoGQL, decorators: [{
7578
7729
  type: Injectable,
7579
7730
  args: [{
7580
7731
  providedIn: 'root'
7581
7732
  }]
7582
7733
  }], ctorParameters: () => [{ type: i1$2.Apollo }] });
7583
7734
 
7735
+ /**
7736
+ * Resolves raw CK attribute definitions for a CK type or CK record by id.
7737
+ *
7738
+ * Extracted from AttributeDataService to break a potential circular dependency:
7739
+ * AttributeMapperService needs to look up nested record attribute definitions when mapping
7740
+ * RECORD / RECORD_ARRAY values to GraphQL, while AttributeDataService already depends on
7741
+ * AttributeMapperService for mapping raw definitions into form-ready Attribute shapes.
7742
+ *
7743
+ * This resolver is intentionally minimal: it fetches and returns raw CkAttributeMetadata[]
7744
+ * with no mapping. Callers that need form-ready Attribute objects should map them via
7745
+ * AttributeMapperService.mapToFormAttribute.
7746
+ *
7747
+ * Apollo's default cache-first fetchPolicy deduplicates repeated lookups for the same ckId,
7748
+ * so callers do not need to memoize externally.
7749
+ */
7750
+ class AttributeMetadataResolverService {
7751
+ getCkAttributesDetailedGQL = inject(GetCkAttributesDetailedDtoGQL);
7752
+ getCkRecordDetailedGQL = inject(GetCkRecordDetailedDtoGQL);
7753
+ /**
7754
+ * Fetches raw attribute metadata for a CK type or CK record.
7755
+ * Returns an empty array when the id is missing or the request fails.
7756
+ */
7757
+ getRawAttributes$(ckId, isRecord = false) {
7758
+ if (!ckId)
7759
+ return of([]);
7760
+ const stream$ = isRecord
7761
+ ? this.fetchCkRecordAttributes(ckId)
7762
+ : this.fetchCkAttributes(ckId);
7763
+ return stream$.pipe(catchError$1((err) => {
7764
+ console.error('AttributeMetadataResolverService error:', err);
7765
+ return of([]);
7766
+ }));
7767
+ }
7768
+ fetchCkAttributes(ckTypeId) {
7769
+ return this.getCkAttributesDetailedGQL
7770
+ .fetch({ variables: { ckId: ckTypeId } })
7771
+ .pipe(map$1((res) => (res.data?.constructionKit?.types?.items?.[0]?.attributes?.items ??
7772
+ []).filter((item) => item != null)));
7773
+ }
7774
+ fetchCkRecordAttributes(ckRecordId) {
7775
+ return this.getCkRecordDetailedGQL
7776
+ .fetch({ variables: { ckId: ckRecordId } })
7777
+ .pipe(map$1((res) => (res.data?.constructionKit?.records?.items?.[0]?.attributes
7778
+ ?.items ?? []).filter((item) => item != null)));
7779
+ }
7780
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMetadataResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7781
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMetadataResolverService, providedIn: 'root' });
7782
+ }
7783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMetadataResolverService, decorators: [{
7784
+ type: Injectable,
7785
+ args: [{
7786
+ providedIn: 'root',
7787
+ }]
7788
+ }] });
7789
+
7584
7790
  class AttributeRecognitionService {
7585
7791
  isString(attributeValueType) {
7586
7792
  return attributeValueType === "STRING";
@@ -7622,10 +7828,10 @@ class AttributeRecognitionService {
7622
7828
  isStringArray(attributeValueType) {
7623
7829
  return attributeValueType === "STRING_ARRAY";
7624
7830
  }
7625
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7626
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeRecognitionService, providedIn: "root" });
7831
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7832
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeRecognitionService, providedIn: "root" });
7627
7833
  }
7628
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeRecognitionService, decorators: [{
7834
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeRecognitionService, decorators: [{
7629
7835
  type: Injectable,
7630
7836
  args: [{ providedIn: "root" }]
7631
7837
  }] });
@@ -7696,6 +7902,7 @@ const BINARY_REFERENCE_FLAG = "__isBinaryFromBase64";
7696
7902
  */
7697
7903
  class AttributeMapperService {
7698
7904
  recognition = inject(AttributeRecognitionService);
7905
+ metadataResolver = inject(AttributeMetadataResolverService);
7699
7906
  isRecordValue(value) {
7700
7907
  return typeof value === "object" && value !== null && !Array.isArray(value);
7701
7908
  }
@@ -7751,115 +7958,187 @@ class AttributeMapperService {
7751
7958
  return defer(() => from(this.mapFormValueToGraphQLAttributes(formValue, attributesMetadata)));
7752
7959
  }
7753
7960
  /**
7754
- * Maps form values to GraphQL format for createEntities / updateRuntimeEntities.
7755
- * Record and RecordArray are passed as nested objects/arrays. BINARY_LINKED is included only when value is a File.
7961
+ * Maps form values to GraphQL format for createEntities / updateRuntimeEntities. Top-level RECORD and
7962
+ * RECORD_ARRAY attribute values are recursively mapped via the same per-attribute logic so nested
7963
+ * scalars (BINARY, GEO, TIME_SPAN, …) get type conversion identical to their top-level siblings.
7756
7964
  */
7757
7965
  async mapFormValueToGraphQLAttributes(formValue, attributesMetadata) {
7758
- const result = [];
7759
7966
  if (!this.isRecordValue(formValue)) {
7760
- return result;
7761
- }
7762
- const metadataMap = new Map();
7763
- if (attributesMetadata) {
7764
- attributesMetadata.forEach((attr) => {
7765
- metadataMap.set(attr.attributeName, attr);
7766
- });
7967
+ return [];
7767
7968
  }
7969
+ const metadataMap = new Map((attributesMetadata ?? []).map((attr) => [attr.attributeName, attr]));
7970
+ const result = [];
7768
7971
  for (const [key, value] of Object.entries(formValue)) {
7769
- if (!key) {
7770
- continue;
7771
- }
7772
- const metadata = metadataMap.get(key);
7773
- if (metadata?.attributeValueType === "BINARY_LINKED") {
7774
- const processedValue = await this.processAttributeValue(value, metadata?.attributeValueType);
7775
- if (processedValue instanceof File) {
7776
- // Skip synthetic reference/preview files — they are placeholders created by
7777
- // parseBinaryLinkedForForm and must not be re-uploaded (would overwrite real data with zeros).
7778
- if (processedValue[BINARY_LINKED_REFERENCE_FLAG]) {
7779
- continue;
7780
- }
7781
- result.push({ attributeName: key, value: processedValue });
7782
- }
7783
- else {
7784
- // Value was cleared (null / empty array) — send null so the backend removes the linked binary.
7785
- result.push({ attributeName: key, value: null });
7786
- }
7972
+ if (!key)
7787
7973
  continue;
7974
+ const mapped = await this.mapSingleAttributeToInput(key, value, metadataMap.get(key));
7975
+ if (mapped !== null) {
7976
+ result.push(mapped);
7788
7977
  }
7789
- if (value === null || value === undefined) {
7790
- if (metadata?.isOptional) {
7791
- result.push({ attributeName: key, value: null });
7792
- }
7793
- continue;
7978
+ }
7979
+ return result;
7980
+ }
7981
+ /**
7982
+ * Maps a single (key, value, metadata) triple into a GraphQL RtEntityAttributeInput, or null when the
7983
+ * attribute should be omitted from the payload entirely (typically: required scalar with no value).
7984
+ *
7985
+ * Single source of truth for empty / null / optional / type-conversion rules. Used by both the top-level
7986
+ * mapping and the recursive RECORD / RECORD_ARRAY mapping so nested attributes follow the exact same
7987
+ * contract. Branch order matters: BINARY_LINKED handling must come before the generic null/undefined
7988
+ * skip because cleared linked binaries are sent as explicit null (to detach the link on the backend).
7989
+ */
7990
+ async mapSingleAttributeToInput(key, value, metadata) {
7991
+ const type = metadata?.attributeValueType;
7992
+ // type is set only when metadata exists, so the non-null assertion is safe inside these branches.
7993
+ if (type === "BINARY_LINKED") {
7994
+ return this.mapBinaryLinkedAttribute(key, value, metadata);
7995
+ }
7996
+ if (value === null || value === undefined) {
7997
+ return metadata?.isOptional ? { attributeName: key, value: null } : null;
7998
+ }
7999
+ if (type === "BINARY" && this.isOptionalEmptyBinary(metadata, value)) {
8000
+ return { attributeName: key, value: null };
8001
+ }
8002
+ // Empty RECORD (empty object) and RECORD_ARRAY (empty array): send null when optional, skip otherwise.
8003
+ if (type === "RECORD" && this.isValueEmpty(value)) {
8004
+ return metadata?.isOptional ? { attributeName: key, value: null } : null;
8005
+ }
8006
+ if (type === "RECORD_ARRAY" && Array.isArray(value) && value.length === 0) {
8007
+ return metadata?.isOptional ? { attributeName: key, value: null } : null;
8008
+ }
8009
+ if (metadata?.isOptional &&
8010
+ this.isOptionalEmptyScalarOrArray(value, metadata)) {
8011
+ return { attributeName: key, value: null };
8012
+ }
8013
+ const processedValue = await this.processAttributeValue(value, metadata);
8014
+ return { attributeName: key, value: processedValue };
8015
+ }
8016
+ /**
8017
+ * BINARY_LINKED has its own decision tree because synthetic reference Files (created by
8018
+ * parseBinaryLinkedForForm to display existing-file metadata) must NOT be re-uploaded — re-uploading
8019
+ * a synthetic File would overwrite the real binary with zero-filled placeholder content.
8020
+ * Cleared values (null / empty array) emit explicit null so the backend detaches the linked binary.
8021
+ */
8022
+ async mapBinaryLinkedAttribute(key, value, metadata) {
8023
+ const processedValue = await this.processAttributeValue(value, metadata);
8024
+ if (processedValue instanceof File) {
8025
+ const isReference = processedValue[BINARY_LINKED_REFERENCE_FLAG] === true;
8026
+ if (isReference) {
8027
+ return null;
7794
8028
  }
7795
- if (metadata?.attributeValueType === "BINARY" &&
7796
- this.isOptionalEmptyBinary(metadata, value)) {
7797
- result.push({ attributeName: key, value: null });
8029
+ return { attributeName: key, value: processedValue };
8030
+ }
8031
+ return { attributeName: key, value: null };
8032
+ }
8033
+ /**
8034
+ * Recursively maps a RECORD form value (flat object { subAttr: subVal, ... }) to the wire shape expected
8035
+ * by the backend mutation: a flat object { subAttr: processedSubVal, ... }.
8036
+ *
8037
+ * Important asymmetry between query response and mutation input: queries return RECORD as
8038
+ * { attributes: [{ attributeName, value }, ...] } (the GraphQL RtRecord type wraps it), but the mutation
8039
+ * input field RtEntityAttributeInput.value is SimpleScalar — opaque to GraphQL — so the backend reads
8040
+ * the raw dictionary directly and matches keys against CK sub-attribute names. Sending the wrapped
8041
+ * { attributes: [...] } shape resulted in ASSET1004 (mandatory attribute missing) because the backend
8042
+ * never iterated the wrapper.
8043
+ *
8044
+ * Fetches sub-attribute definitions for the given recordCkId via AttributeMetadataResolverService and
8045
+ * routes each entry through mapSingleAttributeToInput so type conversion (BINARY → byte[], GEO → GeoJSON,
8046
+ * TIME_SPAN → seconds, …) and empty/null/optional rules apply identically to nested attributes.
8047
+ * Sub-attribute keys are kept in their form-side camelCase form (matches the previously working code path).
8048
+ */
8049
+ async mapRecordValueToGraphQL(value, recordCkId) {
8050
+ if (!this.isRecordValue(value)) {
8051
+ return {};
8052
+ }
8053
+ const subMetadataMap = await this.resolveSubMetadataMap(recordCkId);
8054
+ return this.mapRecordEntries(value, subMetadataMap);
8055
+ }
8056
+ /**
8057
+ * Resolves sub-attribute metadata for a given recordCkId. Returns an empty map (pass-through mode)
8058
+ * when recordCkId is missing or resolver fails — caller must preserve user values in that case.
8059
+ */
8060
+ async resolveSubMetadataMap(recordCkId) {
8061
+ if (!recordCkId) {
8062
+ return new Map();
8063
+ }
8064
+ try {
8065
+ const rawDefinitions = await firstValueFrom(this.metadataResolver.getRawAttributes$(recordCkId, true));
8066
+ return new Map(rawDefinitions.map((meta) => {
8067
+ const subAttr = this.mapToFormAttribute(meta, undefined);
8068
+ return [subAttr.attributeName, subAttr];
8069
+ }));
8070
+ }
8071
+ catch (err) {
8072
+ // Resolver failure (network/auth/cache) must not abort the whole mapping pipeline. Falling back
8073
+ // to an empty map means sub-attributes are emitted with their form values without type conversion;
8074
+ // the backend will reject the payload with a meaningful error rather than the user seeing nothing.
8075
+ console.error(`AttributeMapperService: failed to resolve sub-attributes for record '${recordCkId}'`, err);
8076
+ return new Map();
8077
+ }
8078
+ }
8079
+ /**
8080
+ * Maps record entries to GraphQL payload using the resolved metadata map.
8081
+ * Pass-through mode (empty metadata map) preserves user values verbatim, including explicit
8082
+ * nulls — required so cleared nested fields still reach the backend.
8083
+ */
8084
+ async mapRecordEntries(value, subMetadataMap) {
8085
+ const result = {};
8086
+ for (const [subKey, subValue] of Object.entries(value)) {
8087
+ if (!subKey)
7798
8088
  continue;
7799
- }
7800
- // Skip empty RECORD (empty object) and RECORD_ARRAY (empty array) unless optional (then send null)
7801
- if (metadata?.attributeValueType === "RECORD" &&
7802
- this.isValueEmpty(value)) {
7803
- if (metadata?.isOptional) {
7804
- result.push({ attributeName: key, value: null });
7805
- }
8089
+ const subMeta = subMetadataMap.get(subKey);
8090
+ if (!subMeta) {
8091
+ // Pass-through: no metadata available, preserve the value as-is (including nulls).
8092
+ result[subKey] = subValue;
7806
8093
  continue;
7807
8094
  }
7808
- if (metadata?.attributeValueType === "RECORD_ARRAY" &&
7809
- Array.isArray(value) &&
7810
- value.length === 0) {
7811
- if (metadata?.isOptional) {
7812
- result.push({ attributeName: key, value: null });
7813
- }
7814
- continue;
8095
+ const mapped = await this.mapSingleAttributeToInput(subKey, subValue, subMeta);
8096
+ if (mapped !== null) {
8097
+ result[mapped.attributeName] = mapped.value;
7815
8098
  }
7816
- if (metadata?.isOptional && this.isOptionalEmptyScalarOrArray(value, metadata)) {
7817
- result.push({ attributeName: key, value: null });
8099
+ }
8100
+ return result;
8101
+ }
8102
+ /**
8103
+ * Recursively maps a RECORD_ARRAY form value (array of flat objects) to the wire shape expected by the
8104
+ * backend mutation: an array of flat objects [{ subAttr: subVal }, { subAttr: subVal }].
8105
+ *
8106
+ * Each item is a record sharing the same recordCkId; metadata is fetched (and Apollo-cached) once per item
8107
+ * via mapRecordValueToGraphQL.
8108
+ */
8109
+ async mapRecordArrayValueToGraphQL(value, recordCkId) {
8110
+ if (!Array.isArray(value))
8111
+ return [];
8112
+ // Resolve metadata once for the whole array — items share the same recordCkId.
8113
+ const subMetadataMap = await this.resolveSubMetadataMap(recordCkId);
8114
+ const result = [];
8115
+ for (const item of value) {
8116
+ if (!this.isRecordValue(item)) {
8117
+ result.push({});
7818
8118
  continue;
7819
8119
  }
7820
- const processedValue = await this.processAttributeValue(value, metadata?.attributeValueType);
7821
- result.push({
7822
- attributeName: key,
7823
- value: processedValue,
7824
- });
8120
+ result.push(await this.mapRecordEntries(item, subMetadataMap));
7825
8121
  }
7826
8122
  return result;
7827
8123
  }
7828
8124
  /** Processes a single attribute value for mutation payload (type-specific conversion). */
7829
- async processAttributeValue(value, attributeType) {
8125
+ async processAttributeValue(value, metadata) {
8126
+ const attributeType = metadata?.attributeValueType;
7830
8127
  switch (attributeType) {
7831
8128
  case "RECORD":
7832
- return value;
8129
+ return await this.mapRecordValueToGraphQL(value, metadata?.id?.ckId);
7833
8130
  case "RECORD_ARRAY":
7834
- return value;
8131
+ return await this.mapRecordArrayValueToGraphQL(value, metadata?.id?.ckId);
7835
8132
  case "GEOSPATIAL_POINT":
7836
8133
  return convertGeospatialPointToGeoJSON(value);
7837
8134
  case "TIME_SPAN":
7838
8135
  return this.convertTimeSpanToSeconds(value);
7839
- case "BINARY": {
8136
+ case "BINARY":
7840
8137
  // MeshMakers expects byte[] (array of numbers). Accept File, ArrayBuffer, base64 string, or byte[].
7841
8138
  return await this.convertBinaryToByteArray(value);
7842
- }
7843
- case "BINARY_LINKED": {
7844
- // MeshMakers: prefer File for multipart, but also accept base64 or byte[]
7845
- if (value instanceof File) {
7846
- return value;
7847
- }
7848
- if (Array.isArray(value) && value[0] instanceof File) {
7849
- return value[0];
7850
- }
7851
- if (typeof value === "string") {
7852
- // base64 string
7853
- return base64ToByteArray(value);
7854
- }
7855
- if (value instanceof ArrayBuffer) {
7856
- return this.arrayBufferToByteArray(value);
7857
- }
7858
- if (Array.isArray(value) && typeof value[0] === "number") {
7859
- return value;
7860
- }
7861
- return null;
7862
- }
8139
+ case "BINARY_LINKED":
8140
+ // MeshMakers: prefer File for multipart upload; also accept base64 string, ArrayBuffer or byte[].
8141
+ return this.convertBinaryLinkedValue(value);
7863
8142
  case "INTEGER_ARRAY":
7864
8143
  return this.normalizePrimitiveArray(value, "number");
7865
8144
  case "STRING_ARRAY":
@@ -7965,7 +8244,8 @@ class AttributeMapperService {
7965
8244
  }
7966
8245
  }
7967
8246
  /**
7968
- * Converts supported binary representations into byte arrays.
8247
+ * Converts supported binary representations into byte arrays. Returns the original value as a fallback
8248
+ * when the input shape is not recognized so the backend can produce a meaningful validation error.
7969
8249
  */
7970
8250
  async convertBinaryToByteArray(value) {
7971
8251
  if (Array.isArray(value) &&
@@ -7993,6 +8273,36 @@ class AttributeMapperService {
7993
8273
  }
7994
8274
  return value;
7995
8275
  }
8276
+ /**
8277
+ * Normalizes a BINARY_LINKED form value to one of the wire shapes the backend accepts. Order matters:
8278
+ * a real File is preferred (multipart upload preserves filename and content type), with byte[] / base64
8279
+ * accepted as fallbacks for callers that already have raw bytes.
8280
+ */
8281
+ convertBinaryLinkedValue(value) {
8282
+ if (value instanceof File)
8283
+ return value;
8284
+ if (Array.isArray(value) && value[0] instanceof File)
8285
+ return value[0];
8286
+ if (typeof value === "string") {
8287
+ try {
8288
+ return base64ToByteArray(value);
8289
+ }
8290
+ catch (e) {
8291
+ // Re-throw instead of returning null: a malformed base64 must not silently degrade
8292
+ // to null, which the backend may interpret as "clear/detach" the linked binary.
8293
+ // Surfacing the error lets the caller present a validation message to the user.
8294
+ console.error("Error converting BINARY_LINKED base64 to byte array:", e);
8295
+ throw new Error("Invalid base64 value for BINARY_LINKED attribute", { cause: e });
8296
+ }
8297
+ }
8298
+ if (value instanceof ArrayBuffer) {
8299
+ return this.arrayBufferToByteArray(value);
8300
+ }
8301
+ if (Array.isArray(value) && typeof value[0] === "number") {
8302
+ return value;
8303
+ }
8304
+ return null;
8305
+ }
7996
8306
  // ─── Type recognition (single responsibility: attribute type checks) ─────────────
7997
8307
  isEnum(attr) {
7998
8308
  return attr.attributeValueType === "ENUM";
@@ -8364,10 +8674,10 @@ class AttributeMapperService {
8364
8674
  }
8365
8675
  return [];
8366
8676
  }
8367
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeMapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8368
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeMapperService, providedIn: "root" });
8677
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8678
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMapperService, providedIn: "root" });
8369
8679
  }
8370
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeMapperService, decorators: [{
8680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeMapperService, decorators: [{
8371
8681
  type: Injectable,
8372
8682
  args: [{
8373
8683
  providedIn: "root",
@@ -8375,25 +8685,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
8375
8685
  }] });
8376
8686
 
8377
8687
  /**
8378
- * Single responsibility: fetch attribute definitions (CK types/records) and runtime entity values for the repository browser.
8688
+ * Fetches form-ready attribute definitions and runtime entity values for the repository browser.
8379
8689
  * Used by attributes-group (rxResource), create-editor and update-editor (firstValueFrom for mutations).
8690
+ *
8691
+ * Raw definition lookups are delegated to AttributeMetadataResolverService; this service
8692
+ * only adds the form-ready mapping (mapToFormAttribute) and required-first sort.
8380
8693
  */
8381
8694
  class AttributeDataService {
8382
8695
  mapper = inject(AttributeMapperService);
8383
- getCkAttributesDetailedGQL = inject(GetCkAttributesDetailedDtoGQL);
8384
- getCkRecordDetailedGQL = inject(GetCkRecordDetailedDtoGQL);
8696
+ resolver = inject(AttributeMetadataResolverService);
8385
8697
  getRtEntityAttributesGQL = inject(GetRuntimeEntityByIdDtoGQL);
8386
8698
  /** Observable of attribute list for a CK type or record. Sorted: required first, optional last. */
8387
8699
  getAttributesDefinition$(ckTypeId, isRecord = false) {
8388
8700
  if (!ckTypeId)
8389
8701
  return of([]);
8390
- const stream$ = isRecord
8391
- ? this.fetchCkRecordAttributes(ckTypeId)
8392
- : this.fetchCkAttributes(ckTypeId);
8393
- return stream$.pipe(map$1((items) => this.sortAttributesByOptional(items.map((meta) => this.mapper.mapToFormAttribute(meta, undefined)))), catchError$1((err) => {
8394
- console.error('Service error:', err);
8395
- return of([]);
8396
- }));
8702
+ return this.resolver.getRawAttributes$(ckTypeId, isRecord).pipe(map$1((items) => this.sortAttributesByOptional(items.map((meta) => this.mapper.mapToFormAttribute(meta, undefined)))));
8397
8703
  }
8398
8704
  /** Observable of initial attribute values for an existing entity (edit mode). */
8399
8705
  getRtEntityValues$(rtId, ckTypeId) {
@@ -8411,18 +8717,6 @@ class AttributeDataService {
8411
8717
  return a.isOptional ? 1 : -1;
8412
8718
  });
8413
8719
  }
8414
- fetchCkAttributes(ckTypeId) {
8415
- return this.getCkAttributesDetailedGQL
8416
- .fetch({ variables: { ckId: ckTypeId } })
8417
- .pipe(map$1((res) => (res.data?.constructionKit?.types?.items?.[0]?.attributes?.items ??
8418
- []).filter((item) => item != null)));
8419
- }
8420
- fetchCkRecordAttributes(ckRecordId) {
8421
- return this.getCkRecordDetailedGQL
8422
- .fetch({ variables: { ckId: ckRecordId } })
8423
- .pipe(map$1((res) => (res.data?.constructionKit?.records?.items?.[0]?.attributes
8424
- ?.items ?? []).filter((item) => item != null)));
8425
- }
8426
8720
  /** Fetches runtime entity attribute items by rtId and ckTypeId; returns empty array when absent. */
8427
8721
  fetchRtEntityAttributes(rtId, ckTypeId) {
8428
8722
  return this.getRtEntityAttributesGQL
@@ -8438,10 +8732,10 @@ class AttributeDataService {
8438
8732
  }));
8439
8733
  }));
8440
8734
  }
8441
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8442
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeDataService, providedIn: 'root' });
8735
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8736
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeDataService, providedIn: 'root' });
8443
8737
  }
8444
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeDataService, decorators: [{
8738
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeDataService, decorators: [{
8445
8739
  type: Injectable,
8446
8740
  args: [{
8447
8741
  providedIn: 'root',
@@ -8485,8 +8779,8 @@ class AttributeFieldComponent {
8485
8779
  hasHint() {
8486
8780
  return this.hintText() != null && this.hintText() !== "";
8487
8781
  }
8488
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8489
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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: `
8782
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8783
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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: `
8490
8784
  <div class="k-form-field">
8491
8785
  <kendo-label
8492
8786
  [for]="fieldId()"
@@ -8523,7 +8817,7 @@ class AttributeFieldComponent {
8523
8817
  </div>
8524
8818
  `, 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$4.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "component", type: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
8525
8819
  }
8526
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributeFieldComponent, decorators: [{
8820
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributeFieldComponent, decorators: [{
8527
8821
  type: Component,
8528
8822
  args: [{ selector: "mm-attribute-field", standalone: true, imports: [CommonModule, ReactiveFormsModule, KENDO_LABEL, KENDO_BUTTONS], template: `
8529
8823
  <div class="k-form-field">
@@ -8882,8 +9176,8 @@ class AttributesGroupComponent {
8882
9176
  }
8883
9177
  return EMPTY_INITIAL_VALUES;
8884
9178
  }
8885
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributesGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8886
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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 } }, ngImport: i0, template: `
9179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributesGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: AttributesGroupComponent, isStandalone: true, selector: "mm-attributes-group", inputs: { ckId: { classPropertyName: "ckId", publicName: "ckId", isSignal: true, isRequired: true, transformFunction: null }, parentFormGroup: { classPropertyName: "parentFormGroup", publicName: "parentFormGroup", isSignal: true, isRequired: true, transformFunction: null }, isRecord: { classPropertyName: "isRecord", publicName: "isRecord", isSignal: true, isRequired: false, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
8887
9181
  <div class="attributes-form-container" [formGroup]="parentFormGroup()">
8888
9182
  <kendo-card [style.margin-bottom.px]="10">
8889
9183
  <kendo-card-header>
@@ -9170,7 +9464,7 @@ class AttributesGroupComponent {
9170
9464
  </div>
9171
9465
  `, isInline: true, styles: [".attributes-form-container ::ng-deep kendo-card kendo-card-body{display:flex;flex-direction:column;gap:16px}.attributes-form-container ::ng-deep kendo-label{display:flex;flex-direction:column;gap:4px}.attributes-form-container ::ng-deep kendo-label label{text-transform:uppercase}.header-content{display:flex;flex-direction:column;gap:4px}.record-array-content,.tab-content-wrapper{display:flex;flex-direction:column;gap:16px}.record-actions-info{display:flex;flex-direction:column;gap:12px;padding:16px;background-color:var(--kendo-color-surface-alt, rgba(0, 0, 0, .05));border:1px solid var(--kendo-color-border, rgba(0, 0, 0, .1));border-radius:4px;margin-bottom:16px}.record-actions-description{margin:0;font-size:13px;color:var(--kendo-color-subtle, rgba(0, 0, 0, .6));line-height:1.5}.record-array-actions{display:flex;gap:8px;justify-content:flex-start;padding-top:0}.record-actions{margin-top:16px;display:flex;gap:8px;justify-content:flex-start;padding-top:0}.binary-linked-wrap{display:flex;flex-direction:column;gap:6px}.binary-linked-reference-hint{font-size:.75rem;color:var(--kendo-color-primary, #0f6dff);font-style:italic}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => AttributesGroupComponent), selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }, { kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatus), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(() => i1.NgControlStatusGroup), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupDirective), selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormControlName), selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i0.forwardRef(() => i1.FormGroupName), selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i0.forwardRef(() => i1$3.CardComponent), selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i0.forwardRef(() => i1$3.CardBodyComponent), selector: "kendo-card-body" }, { kind: "component", type: i0.forwardRef(() => i1$3.CardHeaderComponent), selector: "kendo-card-header" }, { kind: "component", type: i0.forwardRef(() => i1$3.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$3.ExpansionPanelTitleDirective), selector: "[kendoExpansionPanelTitleDirective]" }, { kind: "component", type: i0.forwardRef(() => i1$3.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$3.TabStripTabComponent), selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: i0.forwardRef(() => i1$3.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$4.LabelComponent), selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }, { kind: "component", type: i0.forwardRef(() => i3$1.ButtonComponent), selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: i0.forwardRef(() => i4.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(() => i4.MultiSelectComponent), selector: "kendo-multiselect", inputs: ["showStickyHeader", "focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer", "inputAttributes"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { kind: "component", type: i0.forwardRef(() => i7.DateTimePickerComponent), selector: "kendo-datetimepicker", inputs: ["focusableId", "weekDaysFormat", "showOtherMonthDays", "value", "format", "twoDigitYearMax", "tabindex", "disabledDates", "popupSettings", "adaptiveTitle", "adaptiveSubtitle", "disabled", "readonly", "readOnlyInput", "cancelButton", "formatPlaceholder", "placeholder", "steps", "focusedDate", "calendarType", "animateCalendarNavigation", "weekNumber", "min", "max", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "clearButton", "autoFill", "adaptiveMode", "inputAttributes", "defaultTab", "size", "rounded", "fillMode", "headerTemplate", "footerTemplate", "footer"], outputs: ["valueChange", "open", "close", "focus", "blur", "escape"], exportAs: ["kendo-datetimepicker"] }, { kind: "component", type: i0.forwardRef(() => i7.TimePickerComponent), selector: "kendo-timepicker", inputs: ["focusableId", "disabled", "readonly", "readOnlyInput", "clearButton", "format", "formatPlaceholder", "placeholder", "min", "max", "incompleteDateValidation", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "cancelButton", "nowButton", "steps", "popupSettings", "tabindex", "tabIndex", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "adaptiveMode", "value", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-timepicker"] }, { kind: "component", type: i0.forwardRef(() => i8.FileSelectComponent), selector: "kendo-fileselect", inputs: ["name"], outputs: ["valueChange"], exportAs: ["kendoFileSelect"] }, { kind: "component", type: i0.forwardRef(() => AttributeFieldComponent), selector: "mm-attribute-field", inputs: ["attribute", "control", "baselineValue", "fieldId", "overrideLabelText", "showUndoButton", "undoButtonSize", "errorMessage", "hintText"], outputs: ["undo"] }] });
9172
9466
  }
9173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AttributesGroupComponent, decorators: [{
9467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AttributesGroupComponent, decorators: [{
9174
9468
  type: Component,
9175
9469
  args: [{ selector: "mm-attributes-group", standalone: true, imports: [
9176
9470
  CommonModule,
@@ -9475,50 +9769,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
9475
9769
  const EMPTY_INITIAL_VALUES = [];
9476
9770
 
9477
9771
  /**
9478
- * Shared utilities for create and update entity editors: mutation options (including multipart for binary uploads)
9479
- * and error notifications. Injected by both CreateEditorComponent and UpdateEditorComponent.
9772
+ * Shared utilities for create and update entity editors: builds Apollo mutation options (with multipart
9773
+ * context for binary uploads) and shows error notifications. Injected by both CreateEditorComponent and
9774
+ * UpdateEditorComponent.
9480
9775
  */
9481
9776
  class SharedEditor {
9482
9777
  notificationService = inject(NotificationService);
9483
9778
  /**
9484
- * Builds Apollo mutation options for createEntities: variables and optional multipart context when attributes contain File(s).
9779
+ * Builds Apollo mutation options for createEntities. Multipart context is enabled when any attribute
9780
+ * value (top-level or nested in RECORD / RECORD_ARRAY) contains a File instance.
9485
9781
  */
9486
9782
  prepareMutationOptions(entityInput) {
9487
- const mutationOptions = {
9488
- variables: { entities: [entityInput] },
9489
- };
9490
- // Use multipart for binary file uploads (BINARY_LINKED or BINARY)
9491
- const hasBinaryFiles = entityInput.attributes?.some((attr) => {
9492
- // BINARY_LINKED: File, BINARY: File or File[]
9493
- if (attr?.value instanceof File)
9494
- return true;
9495
- if (Array.isArray(attr?.value) && attr?.value[0] instanceof File)
9496
- return true;
9497
- return false;
9498
- }) ?? false;
9499
- if (hasBinaryFiles) {
9500
- mutationOptions.context = { useMultipart: true };
9501
- }
9502
- return mutationOptions;
9783
+ return this.buildMutationOptions({ entities: [entityInput] });
9503
9784
  }
9504
9785
  /**
9505
- * Builds Apollo mutation options for updateRuntimeEntities: variables and optional multipart context when attributes contain File(s).
9786
+ * Builds Apollo mutation options for updateRuntimeEntities. Multipart context is enabled when any
9787
+ * attribute value (top-level or nested in RECORD / RECORD_ARRAY) contains a File instance.
9506
9788
  */
9507
9789
  prepareUpdateMutationOptions(entities) {
9508
- const mutationOptions = {
9509
- variables: { entities },
9510
- };
9511
- const hasBinaryFiles = entities?.some((e) => e?.item?.attributes?.some((attr) => {
9512
- if (attr?.value instanceof File)
9513
- return true;
9514
- if (Array.isArray(attr?.value) && attr?.value[0] instanceof File)
9515
- return true;
9516
- return false;
9517
- })) ?? false;
9518
- if (hasBinaryFiles) {
9519
- mutationOptions.context = { useMultipart: true };
9520
- }
9521
- return mutationOptions;
9790
+ return this.buildMutationOptions({ entities });
9522
9791
  }
9523
9792
  /**
9524
9793
  * Shows an error notification to the user.
@@ -9532,10 +9801,36 @@ class SharedEditor {
9532
9801
  type: { style: "error", icon: true },
9533
9802
  });
9534
9803
  }
9535
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SharedEditor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
9536
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SharedEditor, providedIn: "root" });
9804
+ /** Wraps variables with optional multipart context based on whether a File is present anywhere in the payload. */
9805
+ buildMutationOptions(variables) {
9806
+ const options = { variables };
9807
+ if (this.containsFile(variables)) {
9808
+ options.context = { useMultipart: true };
9809
+ }
9810
+ return options;
9811
+ }
9812
+ /**
9813
+ * Recursively checks whether the given value contains a File instance anywhere in its structure
9814
+ * (top-level, inside arrays or inside nested objects). Used to decide whether the mutation must
9815
+ * be sent as a multipart request so that nested BINARY_LINKED files are uploaded correctly.
9816
+ */
9817
+ containsFile(value) {
9818
+ if (value == null)
9819
+ return false;
9820
+ if (value instanceof File)
9821
+ return true;
9822
+ if (Array.isArray(value)) {
9823
+ return value.some((item) => this.containsFile(item));
9824
+ }
9825
+ if (typeof value === "object") {
9826
+ return Object.values(value).some((v) => this.containsFile(v));
9827
+ }
9828
+ return false;
9829
+ }
9830
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SharedEditor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
9831
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SharedEditor, providedIn: "root" });
9537
9832
  }
9538
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SharedEditor, decorators: [{
9833
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SharedEditor, decorators: [{
9539
9834
  type: Injectable,
9540
9835
  args: [{
9541
9836
  providedIn: "root",
@@ -9667,18 +9962,23 @@ class CreateEditorComponent {
9667
9962
  hasValidMappedAttributes(mapped) {
9668
9963
  return Array.isArray(mapped) && mapped.length > 0;
9669
9964
  }
9670
- /** Builds the create mutation payload: ckTypeId, attributes, optional parent association. */
9965
+ /**
9966
+ * Builds the create mutation payload: ckTypeId, attributes, and an optional parent association.
9967
+ * The association role defaults to "parent" (Basic/TreeNode convention) and can be overridden via
9968
+ * CreateInput.parentRoleName for CK Types that expose the parent link under a different role name.
9969
+ */
9671
9970
  buildCreatePayload(attributes) {
9672
9971
  const ckTypeId = this.selectedCkTypeId() ?? this.selectedRtCkTypeId();
9673
9972
  const entity = {
9674
9973
  ckTypeId: ckTypeId,
9675
9974
  attributes,
9676
9975
  };
9677
- const parent = this.createInput()?.parent;
9976
+ const input = this.createInput();
9977
+ const parent = input?.parent;
9678
9978
  if (parent?.ckTypeId && parent?.rtId) {
9679
9979
  entity.associations = [
9680
9980
  {
9681
- roleName: "parent",
9981
+ roleName: input?.parentRoleName ?? "parent",
9682
9982
  targets: [
9683
9983
  {
9684
9984
  modOption: AssociationModOptionsDto.CreateDto,
@@ -9715,8 +10015,8 @@ class CreateEditorComponent {
9715
10015
  this.selectedRtCkTypeId.set(null);
9716
10016
  this.selectedCkTypeId.set(null);
9717
10017
  }
9718
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CreateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9719
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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: `
10018
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CreateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10019
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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: `
9720
10020
  <div class="entity-editor-container">
9721
10021
  <kendo-card class="basic-info-card">
9722
10022
  <kendo-card-header>
@@ -9783,7 +10083,7 @@ class CreateEditorComponent {
9783
10083
  </div>
9784
10084
  `, 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$3.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$3.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$3.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: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: CkTypeSelectorInputComponent, selector: "mm-ck-type-selector-input", inputs: ["placeholder", "minSearchLength", "maxResults", "debounceMs", "ckModelIds", "allowAbstract", "dialogTitle", "advancedSearchLabel", "derivedFromRtCkTypeId", "disabled", "required"], outputs: ["ckTypeSelected", "ckTypeCleared"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }] });
9785
10085
  }
9786
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CreateEditorComponent, decorators: [{
10086
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CreateEditorComponent, decorators: [{
9787
10087
  type: Component,
9788
10088
  args: [{ selector: "mm-create-editor-component", imports: [
9789
10089
  ReactiveFormsModule,
@@ -9884,10 +10184,10 @@ class UpdateRuntimeEntitiesDtoGQL extends i1$2.Mutation {
9884
10184
  constructor(apollo) {
9885
10185
  super(apollo);
9886
10186
  }
9887
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
9888
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, providedIn: 'root' });
10187
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
10188
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, providedIn: 'root' });
9889
10189
  }
9890
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, decorators: [{
10190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateRuntimeEntitiesDtoGQL, decorators: [{
9891
10191
  type: Injectable,
9892
10192
  args: [{
9893
10193
  providedIn: 'root'
@@ -10058,8 +10358,8 @@ class UpdateEditorComponent {
10058
10358
  },
10059
10359
  };
10060
10360
  }
10061
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10062
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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: `
10361
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10362
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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: `
10063
10363
  <div class="entity-editor-container">
10064
10364
  <kendo-card class="basic-info-card">
10065
10365
  <kendo-card-header>
@@ -10136,7 +10436,7 @@ class UpdateEditorComponent {
10136
10436
  </div>
10137
10437
  `, 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$3.CardComponent, selector: "kendo-card", inputs: ["orientation", "width"] }, { kind: "component", type: i1$3.CardBodyComponent, selector: "kendo-card-body" }, { kind: "component", type: i1$3.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: i3$1.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: AttributesGroupComponent, selector: "mm-attributes-group", inputs: ["ckId", "parentFormGroup", "isRecord", "initialValues"] }] });
10138
10438
  }
10139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateEditorComponent, decorators: [{
10439
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateEditorComponent, decorators: [{
10140
10440
  type: Component,
10141
10441
  args: [{ selector: "mm-update-editor-component", imports: [
10142
10442
  ReactiveFormsModule,
@@ -10541,8 +10841,8 @@ class RuntimeBrowserDetailsComponent {
10541
10841
  this.createInput = undefined;
10542
10842
  this.updateInput = undefined;
10543
10843
  }
10544
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10545
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: RuntimeBrowserDetailsComponent, isStandalone: true, selector: "mm-runtime-browser-details", inputs: { selectedItem: "selectedItem", messages: "messages" }, outputs: { entitySaved: "entitySaved" }, viewQueries: [{ propertyName: "dataSourceDirective", first: true, predicate: ["dir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
10844
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10845
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: RuntimeBrowserDetailsComponent, isStandalone: true, selector: "mm-runtime-browser-details", inputs: { selectedItem: "selectedItem", messages: "messages" }, outputs: { entitySaved: "entitySaved" }, viewQueries: [{ propertyName: "dataSourceDirective", first: true, predicate: ["dir"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
10546
10846
  <div class="runtime-browser-details">
10547
10847
  @if (isCreateModeEnabled) {
10548
10848
  <mm-create-editor-component
@@ -10674,7 +10974,7 @@ class RuntimeBrowserDetailsComponent {
10674
10974
  </div>
10675
10975
  `, 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"], outputs: ["retry", "propertyChange", "navigateToEntity"] }, { kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "rowClass", "messages", "selectable", "columns"], outputs: ["rowClicked"] }, { kind: "directive", type: 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"] }] });
10676
10976
  }
10677
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserDetailsComponent, decorators: [{
10977
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserDetailsComponent, decorators: [{
10678
10978
  type: Component,
10679
10979
  args: [{ selector: "mm-runtime-browser-details", imports: [
10680
10980
  CommonModule,
@@ -10841,10 +11141,10 @@ class DeleteEntitiesDtoGQL extends i1$2.Mutation {
10841
11141
  constructor(apollo) {
10842
11142
  super(apollo);
10843
11143
  }
10844
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DeleteEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
10845
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DeleteEntitiesDtoGQL, providedIn: 'root' });
11144
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DeleteEntitiesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11145
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DeleteEntitiesDtoGQL, providedIn: 'root' });
10846
11146
  }
10847
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DeleteEntitiesDtoGQL, decorators: [{
11147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DeleteEntitiesDtoGQL, decorators: [{
10848
11148
  type: Injectable,
10849
11149
  args: [{
10850
11150
  providedIn: 'root'
@@ -10884,10 +11184,10 @@ class GetCkModelsDtoGQL extends i1$2.Query {
10884
11184
  constructor(apollo) {
10885
11185
  super(apollo);
10886
11186
  }
10887
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkModelsDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
10888
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkModelsDtoGQL, providedIn: 'root' });
11187
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkModelsDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11188
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkModelsDtoGQL, providedIn: 'root' });
10889
11189
  }
10890
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetCkModelsDtoGQL, decorators: [{
11190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetCkModelsDtoGQL, decorators: [{
10891
11191
  type: Injectable,
10892
11192
  args: [{
10893
11193
  providedIn: 'root'
@@ -10940,10 +11240,10 @@ class GetTreeNodesDtoGQL extends i1$2.Query {
10940
11240
  constructor(apollo) {
10941
11241
  super(apollo);
10942
11242
  }
10943
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreeNodesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
10944
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreeNodesDtoGQL, providedIn: 'root' });
11243
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreeNodesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11244
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreeNodesDtoGQL, providedIn: 'root' });
10945
11245
  }
10946
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreeNodesDtoGQL, decorators: [{
11246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreeNodesDtoGQL, decorators: [{
10947
11247
  type: Injectable,
10948
11248
  args: [{
10949
11249
  providedIn: 'root'
@@ -10982,10 +11282,10 @@ class GetTreesDtoGQL extends i1$2.Query {
10982
11282
  constructor(apollo) {
10983
11283
  super(apollo);
10984
11284
  }
10985
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
10986
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreesDtoGQL, providedIn: 'root' });
11285
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11286
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreesDtoGQL, providedIn: 'root' });
10987
11287
  }
10988
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: GetTreesDtoGQL, decorators: [{
11288
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: GetTreesDtoGQL, decorators: [{
10989
11289
  type: Injectable,
10990
11290
  args: [{
10991
11291
  providedIn: 'root'
@@ -11008,10 +11308,10 @@ class UpdateTreeNodesDtoGQL extends i1$2.Mutation {
11008
11308
  constructor(apollo) {
11009
11309
  super(apollo);
11010
11310
  }
11011
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11012
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, providedIn: 'root' });
11311
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateTreeNodesDtoGQL, deps: [{ token: i1$2.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
11312
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateTreeNodesDtoGQL, providedIn: 'root' });
11013
11313
  }
11014
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: UpdateTreeNodesDtoGQL, decorators: [{
11314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UpdateTreeNodesDtoGQL, decorators: [{
11015
11315
  type: Injectable,
11016
11316
  args: [{
11017
11317
  providedIn: 'root'
@@ -11026,6 +11326,7 @@ class RuntimeBrowserDataSource extends OctoGraphQlHierarchyDataSource {
11026
11326
  getCkModelByIdDtoGQL = inject(GetCkModelByIdDtoGQL);
11027
11327
  deleteEntitiesDtoGQL = inject(DeleteEntitiesDtoGQL);
11028
11328
  getRuntimeEntityAssociationsByIdDtoGQL = inject(GetRuntimeEntityAssociationsByIdDtoGQL);
11329
+ updateRuntimeEntitiesDtoGQL = inject(UpdateRuntimeEntitiesDtoGQL);
11029
11330
  updateTreeNodesDtoGQL = inject(UpdateTreeNodesDtoGQL);
11030
11331
  typeHelperService = inject(TypeHelperService);
11031
11332
  isCkModelsRoot(item) {
@@ -11304,6 +11605,70 @@ class RuntimeBrowserDataSource extends OctoGraphQlHierarchyDataSource {
11304
11605
  }
11305
11606
  return true;
11306
11607
  }
11608
+ /**
11609
+ * Moves an entity to a new parent using the generic `runtimeEntities.update` mutation.
11610
+ * Works for any entity type (not just Basic/TreeNode).
11611
+ *
11612
+ * Uses the `associations` field on `RtEntityInputDto` with `roleName` set to
11613
+ * the navigation property name (e.g. "parent") and modOption CREATE/DELETE.
11614
+ *
11615
+ * @param srcObjRtId Runtime ID of the entity being moved.
11616
+ * @param srcObjCkTypeId CK type of the entity being moved.
11617
+ * @param navigationPropertyName Navigation property for the parent association (e.g. "parent").
11618
+ * @param oldParentCkTypeId CK type of the current parent.
11619
+ * @param oldParentRtId Runtime ID of the current parent.
11620
+ * @param newParentCkTypeId CK type of the new parent.
11621
+ * @param newParentRtId Runtime ID of the new parent.
11622
+ * @returns true if the move succeeded.
11623
+ */
11624
+ async updateEntityAssociation(srcObjRtId, srcObjCkTypeId, navigationPropertyName, oldParentCkTypeId, oldParentRtId, newParentCkTypeId, newParentRtId) {
11625
+ const entitiesToUpdate = [
11626
+ {
11627
+ rtId: srcObjRtId,
11628
+ item: {
11629
+ ckTypeId: srcObjCkTypeId,
11630
+ attributes: [],
11631
+ associations: [
11632
+ {
11633
+ roleName: navigationPropertyName,
11634
+ targets: [
11635
+ {
11636
+ target: {
11637
+ rtId: oldParentRtId,
11638
+ ckTypeId: oldParentCkTypeId,
11639
+ },
11640
+ modOption: AssociationModOptionsDto.DeleteDto,
11641
+ },
11642
+ {
11643
+ target: {
11644
+ rtId: newParentRtId,
11645
+ ckTypeId: newParentCkTypeId,
11646
+ },
11647
+ modOption: AssociationModOptionsDto.CreateDto,
11648
+ },
11649
+ ],
11650
+ },
11651
+ ],
11652
+ },
11653
+ },
11654
+ ];
11655
+ try {
11656
+ const response = await firstValueFrom(this.updateRuntimeEntitiesDtoGQL.mutate({
11657
+ variables: {
11658
+ entities: entitiesToUpdate,
11659
+ },
11660
+ fetchPolicy: 'network-only',
11661
+ }));
11662
+ if (response.error) {
11663
+ throw response.error;
11664
+ }
11665
+ return true;
11666
+ }
11667
+ catch (error) {
11668
+ console.error('Error on attempt to move entity by changing association', srcObjRtId, error);
11669
+ return false;
11670
+ }
11671
+ }
11307
11672
  /**
11308
11673
  * Returns ckTypeId and rtId of a parent of given runtime entity.
11309
11674
  *
@@ -11430,10 +11795,10 @@ class RuntimeBrowserDataSource extends OctoGraphQlHierarchyDataSource {
11430
11795
  return [];
11431
11796
  }
11432
11797
  }
11433
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
11434
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserDataSource, providedIn: 'root' });
11798
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserDataSource, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
11799
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserDataSource, providedIn: 'root' });
11435
11800
  }
11436
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserDataSource, decorators: [{
11801
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserDataSource, decorators: [{
11437
11802
  type: Injectable,
11438
11803
  args: [{
11439
11804
  providedIn: 'root',
@@ -11450,6 +11815,7 @@ class RuntimeBrowserComponent {
11450
11815
  stateService = inject(RuntimeBrowserStateService);
11451
11816
  typeHelperService = inject(TypeHelperService);
11452
11817
  notificationService = inject(NotificationService);
11818
+ associationValidationService = inject(AssociationValidationService);
11453
11819
  isSelectedItemAnRtEntity = false;
11454
11820
  isLoading = false;
11455
11821
  isEditing = false;
@@ -11676,25 +12042,33 @@ class RuntimeBrowserComponent {
11676
12042
  console.debug(msg, event);
11677
12043
  return;
11678
12044
  }
11679
- const allowedSrcItemCkTypeIds = ['Basic/TreeNode'];
11680
- if (allowedSrcItemCkTypeIds.indexOf(event.sourceItem.ckTypeId) === -1) {
11681
- const msg = 'Moving item other than Basic/TreeNode is not supported';
11682
- this._showWarningNotification(msg);
11683
- console.debug(msg, event);
11684
- return;
11685
- }
11686
- const allowedDstParentItemCkTypeIds = ['Basic/TreeNode', 'Basic/Tree'];
11687
- if (allowedDstParentItemCkTypeIds.indexOf(event.destinationItem.ckTypeId) ===
11688
- -1) {
11689
- const msg = 'Moving item to given parent is not supported';
11690
- this._showWarningNotification(msg);
11691
- console.debug(msg, event);
11692
- return;
11693
- }
11694
12045
  try {
12046
+ const validation = await this.associationValidationService.canMove(event.sourceItem.ckTypeId, event.destinationItem.ckTypeId);
12047
+ if (!validation.allowed || !validation.navigationPropertyName) {
12048
+ const msg = validation.reason ??
12049
+ `Moving "${event.sourceItem.ckTypeId}" to "${event.destinationItem.ckTypeId}" is not allowed`;
12050
+ this._showWarningNotification(msg);
12051
+ return;
12052
+ }
11695
12053
  this.isLoading = true;
11696
12054
  this.treeDetail.setEnabledState(false);
11697
- const updateSucceeded = await this.dataSource.updateParentChildAssociation(event.sourceItem.rtId, event.sourceParent.ckTypeId, event.sourceParent.rtId, event.destinationItem.ckTypeId, event.destinationItem.rtId);
12055
+ // Use legacy TreeNode-specific mutation for Basic/TreeNode, generic mutation for all others
12056
+ let updateSucceeded;
12057
+ if (event.sourceItem.ckTypeId === 'Basic/TreeNode') {
12058
+ updateSucceeded =
12059
+ await this.dataSource.updateParentChildAssociation(event.sourceItem.rtId, event.sourceParent.ckTypeId, event.sourceParent.rtId, event.destinationItem.ckTypeId, event.destinationItem.rtId);
12060
+ }
12061
+ else {
12062
+ // Resolve actual ParentChild parent from backend — the tree parent (event.sourceParent)
12063
+ // may differ if the entity was loaded via RelatedClassification instead of ParentChild.
12064
+ const actualParent = await this.dataSource.getRuntimeEntityParentData(event.sourceItem.ckTypeId, event.sourceItem.rtId);
12065
+ if (!actualParent) {
12066
+ this._showWarningNotification('Cannot move entity: no ParentChild parent found');
12067
+ return;
12068
+ }
12069
+ updateSucceeded =
12070
+ await this.dataSource.updateEntityAssociation(event.sourceItem.rtId, event.sourceItem.ckTypeId, validation.navigationPropertyName, actualParent.ckTypeId, actualParent.rtId, event.destinationItem.ckTypeId, event.destinationItem.rtId);
12071
+ }
11698
12072
  // Update failed due to query / db error.
11699
12073
  if (!updateSucceeded) {
11700
12074
  console.debug('Cannot update association due to an error in the GraphQL request.');
@@ -11730,6 +12104,7 @@ class RuntimeBrowserComponent {
11730
12104
  }
11731
12105
  catch (error) {
11732
12106
  console.error('Error updating tree node parent after drag-and-drop:', error);
12107
+ this._showWarningNotification('An error occurred while moving the entity');
11733
12108
  }
11734
12109
  finally {
11735
12110
  this.treeDetail.setEnabledState(true);
@@ -12005,8 +12380,8 @@ class RuntimeBrowserComponent {
12005
12380
  await this.treeDetail.refreshTree();
12006
12381
  }
12007
12382
  }
12008
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12009
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: RuntimeBrowserComponent, isStandalone: true, selector: "mm-runtime-browser", inputs: { messages: { classPropertyName: "messages", publicName: "messages", 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: `
12383
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12384
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: RuntimeBrowserComponent, isStandalone: true, selector: "mm-runtime-browser", inputs: { messages: { classPropertyName: "messages", publicName: "messages", 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: `
12010
12385
  <div class="runtime-browser-container kendo-theme-provider">
12011
12386
  <!-- LCARS Header -->
12012
12387
  <div class="lcars-page-header">
@@ -12068,7 +12443,7 @@ class RuntimeBrowserComponent {
12068
12443
  </div>
12069
12444
  `, isInline: true, styles: [".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", "messages"], outputs: ["entitySaved"] }] });
12070
12445
  }
12071
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserComponent, decorators: [{
12446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserComponent, decorators: [{
12072
12447
  type: Component,
12073
12448
  args: [{ selector: 'mm-runtime-browser', imports: [BaseTreeDetailComponent, RuntimeBrowserDetailsComponent], template: `
12074
12449
  <div class="runtime-browser-container kendo-theme-provider">
@@ -12144,10 +12519,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
12144
12519
  * Use as the parent component when mounting runtime browser routes as children.
12145
12520
  */
12146
12521
  class RuntimeBrowserOutletComponent {
12147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: RuntimeBrowserOutletComponent, isStandalone: true, selector: "mm-runtime-browser-outlet", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
12522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12523
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: RuntimeBrowserOutletComponent, isStandalone: true, selector: "mm-runtime-browser-outlet", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
12149
12524
  }
12150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserOutletComponent, decorators: [{
12525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserOutletComponent, decorators: [{
12151
12526
  type: Component,
12152
12527
  args: [{
12153
12528
  selector: 'mm-runtime-browser-outlet',
@@ -12174,10 +12549,10 @@ class RuntimeBrowserPageComponent {
12174
12549
  messages = this.injectedMessages
12175
12550
  ? this.injectedMessages
12176
12551
  : DEFAULT_RUNTIME_BROWSER_MESSAGES;
12177
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12178
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: RuntimeBrowserPageComponent, isStandalone: true, selector: "mm-runtime-browser-page", ngImport: i0, template: `<mm-runtime-browser [messages]="messages" />`, isInline: true, dependencies: [{ kind: "component", type: RuntimeBrowserComponent, selector: "mm-runtime-browser", inputs: ["messages"] }] });
12552
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12553
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: RuntimeBrowserPageComponent, isStandalone: true, selector: "mm-runtime-browser-page", ngImport: i0, template: `<mm-runtime-browser [messages]="messages" />`, isInline: true, dependencies: [{ kind: "component", type: RuntimeBrowserComponent, selector: "mm-runtime-browser", inputs: ["messages"] }] });
12179
12554
  }
12180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RuntimeBrowserPageComponent, decorators: [{
12555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RuntimeBrowserPageComponent, decorators: [{
12181
12556
  type: Component,
12182
12557
  args: [{
12183
12558
  selector: 'mm-runtime-browser-page',
@@ -12289,8 +12664,8 @@ class TenantSwitcherComponent {
12289
12664
  return ((this.anchor?.nativeElement.contains(target) ?? false) ||
12290
12665
  (this.popup?.nativeElement.contains(target) ?? false));
12291
12666
  }
12292
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TenantSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12293
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.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: `
12667
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TenantSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12668
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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: `
12294
12669
  @if (currentTenantId) {
12295
12670
  <div #badgeEl class="tenant-badge" [class.denied]="isDenied" (click)="onToggle()">
12296
12671
  <span class="tenant-icon">{{ isDenied ? '\u26A0' : '\u25C6' }}</span>
@@ -12329,7 +12704,7 @@ class TenantSwitcherComponent {
12329
12704
  }
12330
12705
  `, 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", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "component", type: SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }] });
12331
12706
  }
12332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TenantSwitcherComponent, decorators: [{
12707
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TenantSwitcherComponent, decorators: [{
12333
12708
  type: Component,
12334
12709
  args: [{ selector: 'mm-tenant-switcher', standalone: true, imports: [
12335
12710
  PopupComponent,
@@ -12421,5 +12796,5 @@ function provideOctoUi() {
12421
12796
  * Generated bundle index. Do not edit.
12422
12797
  */
12423
12798
 
12424
- export { AttributeSelectorDialogComponent, AttributeSelectorDialogService, AttributeSortSelectorDialogComponent, AttributeSortSelectorDialogService, AttributeValueTypeDto, CkTypeSelectorDialogComponent, CkTypeSelectorDialogService, CkTypeSelectorInputComponent, DEFAULT_RUNTIME_BROWSER_MESSAGES, DefaultPropertyCategory, EntityDetailComponent, EntityIdInfoComponent, FieldFilterEditorComponent, OctoGraphQlDataSource, OctoGraphQlHierarchyDataSource, OctoLoaderComponent, PropertyConverterService, PropertyDisplayMode, PropertyGridComponent, PropertyValueDisplayComponent, RUNTIME_BROWSER_MESSAGES, RtEntityIdHelper, RuntimeBrowserComponent, RuntimeBrowserOutletComponent, RuntimeBrowserPageComponent, RuntimeBrowserStateService, RuntimeEntityVariableDialogComponent, RuntimeEntityVariableDialogService, TenantSwitcherComponent, account_tree, add, analytics, app_registration, article, botService, category, chat, checklist, code, component_exchange, computer, createRuntimeBrowserRoutes, customer, dashboard, event_list, graphic_eq, group, identityService, insert_link, manage_accounts, more_time, notifications, page_info, pages, person_search, playlist_add_check, pool, power, provideOctoUi, publicIcon, query_builder, schedule_send, settings, sort, storage, swagger, swagger_asset, swagger_bot, swagger_communication, swagger_identity, team_dashboard, tenancy, text_snippet, travel_explore, user_diagnostics, webhook, work };
12799
+ export { AssociationValidationService, AttributeSelectorDialogComponent, AttributeSelectorDialogService, AttributeSortSelectorDialogComponent, AttributeSortSelectorDialogService, AttributeValueTypeDto, CkTypeSelectorDialogComponent, CkTypeSelectorDialogService, CkTypeSelectorInputComponent, DEFAULT_RUNTIME_BROWSER_MESSAGES, DefaultPropertyCategory, EntityDetailComponent, EntityIdInfoComponent, FieldFilterEditorComponent, OctoGraphQlDataSource, OctoGraphQlHierarchyDataSource, OctoLoaderComponent, PropertyConverterService, PropertyDisplayMode, PropertyGridComponent, PropertyValueDisplayComponent, RUNTIME_BROWSER_MESSAGES, RtEntityIdHelper, RuntimeBrowserComponent, RuntimeBrowserOutletComponent, RuntimeBrowserPageComponent, RuntimeBrowserStateService, RuntimeEntityVariableDialogComponent, RuntimeEntityVariableDialogService, TenantSwitcherComponent, account_tree, add, analytics, app_registration, article, botService, category, chat, checklist, code, component_exchange, computer, createRuntimeBrowserRoutes, customer, dashboard, event_list, graphic_eq, group, identityService, insert_link, manage_accounts, more_time, notifications, page_info, pages, person_search, playlist_add_check, pool, power, provideOctoUi, publicIcon, query_builder, schedule_send, settings, sort, storage, swagger, swagger_asset, swagger_bot, swagger_communication, swagger_identity, team_dashboard, tenancy, text_snippet, travel_explore, user_diagnostics, webhook, work };
12425
12800
  //# sourceMappingURL=meshmakers-octo-ui.mjs.map