@meshmakers/octo-ui 3.3.470 → 3.3.490

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Component, Injectable, EventEmitter, Output, Input, forwardRef, ViewChild, makeEnvironmentProviders } from '@angular/core';
2
+ import { inject, Component, Injectable, EventEmitter, Output, Input, ElementRef, forwardRef, ViewChild, makeEnvironmentProviders } from '@angular/core';
3
3
  import { AttributeSelectorService, AttributeValueTypeDto as AttributeValueTypeDto$1, CkTypeAttributeService, CkTypeSelectorService, SearchFilterTypesDto, SortOrdersDto, FieldFilterOperatorsDto, provideOctoServices } from '@meshmakers/octo-services';
4
4
  import { DataSourceTyped, HierarchyDataSourceBase, NotificationDisplayService, provideMmSharedUi } from '@meshmakers/shared-ui';
5
5
  import { provideMmSharedAuth } from '@meshmakers/shared-auth';
@@ -18,8 +18,7 @@ import { DropDownListModule, DropDownsModule, AutoCompleteModule } from '@progre
18
18
  import * as i5$1 from '@progress/kendo-angular-icons';
19
19
  import { IconsModule, SVGIconModule } from '@progress/kendo-angular-icons';
20
20
  import { searchIcon, sortAscSmallIcon, sortDescSmallIcon, chevronRightIcon, chevronDownIcon, downloadIcon, fileIcon, folderIcon, calendarIcon, checkboxCheckedIcon, listUnorderedIcon, filterClearIcon, arrowRightIcon, arrowLeftIcon, chevronDoubleRightIcon, chevronDoubleLeftIcon, arrowUpIcon, arrowDownIcon, plusIcon, minusIcon, trashIcon, dollarIcon, copyIcon } from '@progress/kendo-svg-icons';
21
- import * as i7 from '@progress/kendo-angular-dialog';
22
- import { WindowRef, WindowModule, WindowService, WindowCloseResult, DialogContentBase, DialogRef, DialogModule, DialogService } from '@progress/kendo-angular-dialog';
21
+ import { WindowRef, WindowModule, WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';
23
22
  import { Subject, firstValueFrom, of, forkJoin, Subscription } from 'rxjs';
24
23
  import { debounceTime, distinctUntilChanged, switchMap, map, tap, catchError } from 'rxjs/operators';
25
24
  import { LoaderModule } from '@progress/kendo-angular-indicators';
@@ -1891,7 +1890,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1891
1890
 
1892
1891
  // Models
1893
1892
 
1894
- class CkTypeSelectorDialogComponent extends DialogContentBase {
1893
+ class CkTypeSelectorDialogComponent {
1894
+ windowRef = inject(WindowRef);
1895
1895
  ckTypeSelectorService = inject(CkTypeSelectorService);
1896
1896
  searchSubject = new Subject();
1897
1897
  subscriptions = new Subscription();
@@ -1912,18 +1912,18 @@ class CkTypeSelectorDialogComponent extends DialogContentBase {
1912
1912
  selectItemBy = (context) => context.dataItem.fullName;
1913
1913
  initialCkModelIds;
1914
1914
  derivedFromRtCkTypeId;
1915
- constructor() {
1916
- super(inject(DialogRef));
1917
- }
1915
+ lastClickTime = 0;
1916
+ lastClickRtCkTypeId = null;
1917
+ /** Data passed from the service */
1918
+ data;
1918
1919
  ngOnInit() {
1919
- const data = this.dialog.content?.instance?.data;
1920
- if (data) {
1921
- this.dialogTitle = data.dialogTitle || 'Select Construction Kit Type';
1922
- this.allowAbstract = data.allowAbstract ?? false;
1923
- this.initialCkModelIds = data.ckModelIds;
1924
- this.derivedFromRtCkTypeId = data.derivedFromRtCkTypeId;
1925
- if (data.selectedCkTypeId) {
1926
- this.selectedKeys = [data.selectedCkTypeId];
1920
+ if (this.data) {
1921
+ this.dialogTitle = this.data.dialogTitle || 'Select Construction Kit Type';
1922
+ this.allowAbstract = this.data.allowAbstract ?? false;
1923
+ this.initialCkModelIds = this.data.ckModelIds;
1924
+ this.derivedFromRtCkTypeId = this.data.derivedFromRtCkTypeId;
1925
+ if (this.data.selectedCkTypeId) {
1926
+ this.selectedKeys = [this.data.selectedCkTypeId];
1927
1927
  }
1928
1928
  }
1929
1929
  // Set up search debouncing
@@ -2016,19 +2016,32 @@ class CkTypeSelectorDialogComponent extends DialogContentBase {
2016
2016
  this.selectedType = null;
2017
2017
  }
2018
2018
  }
2019
+ onCellClick(event) {
2020
+ const item = event.dataItem;
2021
+ const now = Date.now();
2022
+ if (item && item.rtCkTypeId === this.lastClickRtCkTypeId && (now - this.lastClickTime) < 400) {
2023
+ // Double-click detected
2024
+ if (!item.isAbstract || this.allowAbstract) {
2025
+ this.selectedType = item;
2026
+ this.onConfirm();
2027
+ }
2028
+ }
2029
+ this.lastClickTime = now;
2030
+ this.lastClickRtCkTypeId = item?.rtCkTypeId ?? null;
2031
+ }
2019
2032
  onCancel() {
2020
- this.dialog.close();
2033
+ this.windowRef.close();
2021
2034
  }
2022
2035
  onConfirm() {
2023
2036
  if (this.selectedType) {
2024
2037
  const result = {
2025
2038
  selectedCkType: this.selectedType
2026
2039
  };
2027
- this.dialog.close(result);
2040
+ this.windowRef.close(result);
2028
2041
  }
2029
2042
  }
2030
2043
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CkTypeSelectorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2031
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", usesInheritance: true, ngImport: i0, template: `
2044
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: CkTypeSelectorDialogComponent, isStandalone: true, selector: "mm-ck-type-selector-dialog", ngImport: i0, template: `
2032
2045
  <div class="ck-type-selector-container">
2033
2046
  <div class="filter-container">
2034
2047
  <div class="filter-row">
@@ -2067,13 +2080,13 @@ class CkTypeSelectorDialogComponent extends DialogContentBase {
2067
2080
  <kendo-grid
2068
2081
  [data]="gridData"
2069
2082
  [loading]="isLoading"
2070
- [height]="400"
2071
2083
  [selectable]="{ mode: 'single' }"
2072
2084
  [pageable]="{ pageSizes: [25, 50, 100] }"
2073
2085
  [pageSize]="pageSize"
2074
2086
  [skip]="skip"
2075
2087
  (pageChange)="onPageChange($event)"
2076
2088
  (selectionChange)="onSelectionChange($event)"
2089
+ (cellClick)="onCellClick($event)"
2077
2090
  [kendoGridSelectBy]="selectItemBy"
2078
2091
  [(selectedKeys)]="selectedKeys"
2079
2092
  class="type-grid">
@@ -2102,13 +2115,13 @@ class CkTypeSelectorDialogComponent extends DialogContentBase {
2102
2115
  <div class="selection-info" *ngIf="selectedType">
2103
2116
  <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}
2104
2117
  </div>
2105
- </div>
2106
2118
 
2107
- <kendo-dialog-actions>
2108
- <button kendoButton (click)="onCancel()">Cancel</button>
2109
- <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
2110
- </kendo-dialog-actions>
2111
- `, isInline: true, styles: [".ck-type-selector-container{display:flex;flex-direction:column;height:100%;padding:20px;min-width:700px;box-sizing:border-box}.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}.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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.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", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "component", type: i3$1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "ngmodule", type: IconsModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i7.DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }] });
2119
+ <div class="dialog-actions">
2120
+ <button kendoButton (click)="onCancel()">Cancel</button>
2121
+ <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
2122
+ </div>
2123
+ </div>
2124
+ `, 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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.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", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i4.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: i5.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]", inputs: ["showSeparator"] }, { kind: "ngmodule", type: DropDownsModule }, { kind: "component", type: i3$1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "ngmodule", type: IconsModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: WindowModule }] });
2112
2125
  }
2113
2126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CkTypeSelectorDialogComponent, decorators: [{
2114
2127
  type: Component,
@@ -2121,7 +2134,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
2121
2134
  DropDownsModule,
2122
2135
  IconsModule,
2123
2136
  LoaderModule,
2124
- DialogModule
2137
+ WindowModule
2125
2138
  ], template: `
2126
2139
  <div class="ck-type-selector-container">
2127
2140
  <div class="filter-container">
@@ -2161,13 +2174,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
2161
2174
  <kendo-grid
2162
2175
  [data]="gridData"
2163
2176
  [loading]="isLoading"
2164
- [height]="400"
2165
2177
  [selectable]="{ mode: 'single' }"
2166
2178
  [pageable]="{ pageSizes: [25, 50, 100] }"
2167
2179
  [pageSize]="pageSize"
2168
2180
  [skip]="skip"
2169
2181
  (pageChange)="onPageChange($event)"
2170
2182
  (selectionChange)="onSelectionChange($event)"
2183
+ (cellClick)="onCellClick($event)"
2171
2184
  [kendoGridSelectBy]="selectItemBy"
2172
2185
  [(selectedKeys)]="selectedKeys"
2173
2186
  class="type-grid">
@@ -2196,17 +2209,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
2196
2209
  <div class="selection-info" *ngIf="selectedType">
2197
2210
  <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}
2198
2211
  </div>
2199
- </div>
2200
2212
 
2201
- <kendo-dialog-actions>
2202
- <button kendoButton (click)="onCancel()">Cancel</button>
2203
- <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
2204
- </kendo-dialog-actions>
2205
- `, styles: [".ck-type-selector-container{display:flex;flex-direction:column;height:100%;padding:20px;min-width:700px;box-sizing:border-box}.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}.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}\n"] }]
2206
- }], ctorParameters: () => [] });
2213
+ <div class="dialog-actions">
2214
+ <button kendoButton (click)="onCancel()">Cancel</button>
2215
+ <button kendoButton themeColor="primary" [disabled]="!selectedType || (selectedType.isAbstract && !allowAbstract)" (click)="onConfirm()">OK</button>
2216
+ </div>
2217
+ </div>
2218
+ `, 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"] }]
2219
+ }] });
2207
2220
 
2208
2221
  class CkTypeSelectorDialogService {
2209
- dialogService = inject(DialogService);
2222
+ windowService = inject(WindowService);
2210
2223
  /**
2211
2224
  * Opens the CkType selector dialog
2212
2225
  * @param options Dialog options
@@ -2220,20 +2233,28 @@ class CkTypeSelectorDialogService {
2220
2233
  allowAbstract: options.allowAbstract,
2221
2234
  derivedFromRtCkTypeId: options.derivedFromRtCkTypeId
2222
2235
  };
2223
- const dialogRef = this.dialogService.open({
2236
+ const windowRef = this.windowService.open({
2224
2237
  content: CkTypeSelectorDialogComponent,
2225
2238
  width: 900,
2226
2239
  height: 650,
2227
2240
  minWidth: 750,
2228
2241
  minHeight: 550,
2242
+ resizable: true,
2229
2243
  title: options.dialogTitle || 'Select Construction Kit Type'
2230
2244
  });
2231
2245
  // Pass data to the component
2232
- if (dialogRef.content?.instance) {
2233
- dialogRef.content.instance.data = data;
2246
+ const contentRef = windowRef.content;
2247
+ if (contentRef?.instance) {
2248
+ contentRef.instance.data = data;
2234
2249
  }
2235
2250
  try {
2236
- const result = await firstValueFrom(dialogRef.result);
2251
+ const result = await firstValueFrom(windowRef.result);
2252
+ if (result instanceof WindowCloseResult) {
2253
+ return {
2254
+ confirmed: false,
2255
+ selectedCkType: null
2256
+ };
2257
+ }
2237
2258
  if (result && typeof result === 'object' && 'selectedCkType' in result) {
2238
2259
  // User clicked OK and we have a result
2239
2260
  const dialogResult = result;
@@ -3102,10 +3123,14 @@ class CkTypeSelectorInputComponent {
3102
3123
  onChange = () => { };
3103
3124
  onTouched = () => { };
3104
3125
  searchIcon = searchIcon;
3126
+ popupSettings = { appendTo: 'root', popupClass: 'mm-ck-type-popup' };
3127
+ static popupStyleInjected = false;
3105
3128
  ckTypeSelectorService = inject(CkTypeSelectorService);
3106
3129
  dialogService = inject(CkTypeSelectorDialogService, { optional: true });
3130
+ elementRef = inject(ElementRef);
3107
3131
  ngOnInit() {
3108
3132
  this.setupSearch();
3133
+ this.injectPopupStyles();
3109
3134
  }
3110
3135
  ngOnDestroy() {
3111
3136
  this.subscriptions.unsubscribe();
@@ -3223,6 +3248,29 @@ class CkTypeSelectorInputComponent {
3223
3248
  this.typeMap = new Map(items.map(item => [item.rtCkTypeId, item]));
3224
3249
  }));
3225
3250
  }
3251
+ injectPopupStyles() {
3252
+ if (CkTypeSelectorInputComponent.popupStyleInjected)
3253
+ return;
3254
+ const style = document.createElement('style');
3255
+ style.setAttribute('data-mm-ck-type-popup', '');
3256
+ style.textContent = `
3257
+ .mm-ck-type-popup {
3258
+ max-width: 500px !important;
3259
+ min-width: 0 !important;
3260
+ }
3261
+ .mm-ck-type-popup .k-child-animation-container {
3262
+ max-width: 500px !important;
3263
+ }
3264
+ .mm-ck-type-popup .k-list-item {
3265
+ padding: 4px 12px !important;
3266
+ min-height: 0 !important;
3267
+ font-size: 13px !important;
3268
+ line-height: 20px !important;
3269
+ }
3270
+ `;
3271
+ document.head.appendChild(style);
3272
+ CkTypeSelectorInputComponent.popupStyleInjected = true;
3273
+ }
3226
3274
  selectCkType(ckType) {
3227
3275
  this.selectedCkType = ckType;
3228
3276
  this.searchFormControl.setValue(ckType.rtCkTypeId, { emitEvent: false });
@@ -3276,6 +3324,7 @@ class CkTypeSelectorInputComponent {
3276
3324
  [suggest]="true"
3277
3325
  [clearButton]="true"
3278
3326
  [filterable]="true"
3327
+ [popupSettings]="popupSettings"
3279
3328
  (filterChange)="onFilterChange($event)"
3280
3329
  (valueChange)="onSelectionChange($event)"
3281
3330
  (blur)="onBlur()"
@@ -3352,6 +3401,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
3352
3401
  [suggest]="true"
3353
3402
  [clearButton]="true"
3354
3403
  [filterable]="true"
3404
+ [popupSettings]="popupSettings"
3355
3405
  (filterChange)="onFilterChange($event)"
3356
3406
  (valueChange)="onSelectionChange($event)"
3357
3407
  (blur)="onBlur()"
@@ -3427,6 +3477,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
3427
3477
  }] } });
3428
3478
 
3429
3479
  class FieldFilterEditorComponent {
3480
+ attributeService = inject(AttributeSelectorService, { optional: true });
3430
3481
  plusIcon = plusIcon;
3431
3482
  minusIcon = minusIcon;
3432
3483
  trashIcon = trashIcon;
@@ -3451,10 +3502,21 @@ class FieldFilterEditorComponent {
3451
3502
  ];
3452
3503
  booleanOptions = ['true', 'false'];
3453
3504
  availableAttributes = [];
3505
+ /**
3506
+ * Optional CK type ID for self-loading attributes.
3507
+ * When set, the component loads available attributes itself and shows
3508
+ * navigation property controls (checkbox + max depth).
3509
+ * When not set, the component uses the externally provided availableAttributes input.
3510
+ */
3511
+ ckTypeId;
3454
3512
  /** Enable variable mode - allows using variables instead of literal values */
3455
3513
  enableVariables = false;
3456
3514
  /** Available variables for selection when enableVariables is true */
3457
3515
  availableVariables = [];
3516
+ /** Controls for self-loading mode (when ckTypeId is set) */
3517
+ includeNavigationProperties = true;
3518
+ maxDepth = null;
3519
+ isLoadingAttributes = false;
3458
3520
  _filters = [];
3459
3521
  nextId = 1;
3460
3522
  filteredAttributeList = [];
@@ -3468,7 +3530,11 @@ class FieldFilterEditorComponent {
3468
3530
  }
3469
3531
  filtersChange = new EventEmitter();
3470
3532
  selectedKeys = [];
3471
- ngOnChanges() {
3533
+ ngOnChanges(changes) {
3534
+ // Self-load attributes when ckTypeId changes
3535
+ if (changes?.['ckTypeId'] && this.ckTypeId) {
3536
+ this.loadAttributesFromCkType();
3537
+ }
3472
3538
  this.filteredAttributeList = [...this.availableAttributes];
3473
3539
  this.buildAttributeTypeMap();
3474
3540
  // Ensure useVariable flag is set correctly for filters with variable values
@@ -3493,6 +3559,43 @@ class FieldFilterEditorComponent {
3493
3559
  this.attributeTypeMap.set(attr.attributePath, attr.attributeValueType);
3494
3560
  }
3495
3561
  }
3562
+ // ============================================================================
3563
+ // Self-loading attribute methods (when ckTypeId is set)
3564
+ // ============================================================================
3565
+ onNavigationPropertiesChange() {
3566
+ if (!this.includeNavigationProperties) {
3567
+ this.maxDepth = null;
3568
+ }
3569
+ this.loadAttributesFromCkType();
3570
+ }
3571
+ onMaxDepthChange(value) {
3572
+ this.maxDepth = value;
3573
+ this.loadAttributesFromCkType();
3574
+ }
3575
+ async loadAttributesFromCkType() {
3576
+ if (!this.ckTypeId || !this.attributeService)
3577
+ return;
3578
+ this.isLoadingAttributes = true;
3579
+ try {
3580
+ const result = await firstValueFrom(this.attributeService.getAvailableAttributes(this.ckTypeId, undefined, // filter
3581
+ 1000, // first
3582
+ undefined, // after
3583
+ undefined, // attributeValueType
3584
+ undefined, // searchTerm
3585
+ this.includeNavigationProperties, this.maxDepth ?? undefined));
3586
+ this.availableAttributes = result.items;
3587
+ this.filteredAttributeList = [...this.availableAttributes];
3588
+ this.buildAttributeTypeMap();
3589
+ }
3590
+ catch (error) {
3591
+ console.error('Error loading filter attributes:', error);
3592
+ this.availableAttributes = [];
3593
+ this.filteredAttributeList = [];
3594
+ }
3595
+ finally {
3596
+ this.isLoadingAttributes = false;
3597
+ }
3598
+ }
3496
3599
  addFilter() {
3497
3600
  const newFilter = {
3498
3601
  id: this.nextId++,
@@ -3817,8 +3920,32 @@ class FieldFilterEditorComponent {
3817
3920
  return values;
3818
3921
  }
3819
3922
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FieldFilterEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3820
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: FieldFilterEditorComponent, isStandalone: true, selector: "mm-field-filter-editor", inputs: { availableAttributes: "availableAttributes", enableVariables: "enableVariables", availableVariables: "availableVariables", filters: "filters" }, outputs: { filtersChange: "filtersChange" }, usesOnChanges: true, ngImport: i0, template: `
3923
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: FieldFilterEditorComponent, isStandalone: true, selector: "mm-field-filter-editor", inputs: { availableAttributes: "availableAttributes", ckTypeId: "ckTypeId", enableVariables: "enableVariables", availableVariables: "availableVariables", filters: "filters" }, outputs: { filtersChange: "filtersChange" }, usesOnChanges: true, ngImport: i0, template: `
3821
3924
  <div class="field-filter-editor">
3925
+ @if (ckTypeId) {
3926
+ <div class="attribute-options">
3927
+ <label class="inline-checkbox">
3928
+ <input type="checkbox" kendoCheckBox
3929
+ [(ngModel)]="includeNavigationProperties"
3930
+ (ngModelChange)="onNavigationPropertiesChange()" />
3931
+ Include Navigation Properties
3932
+ </label>
3933
+ <label class="inline-field">
3934
+ Max Depth
3935
+ <kendo-numerictextbox
3936
+ [(ngModel)]="maxDepth"
3937
+ [min]="1" [max]="5" [step]="1" [format]="'n0'"
3938
+ [spinners]="true"
3939
+ [disabled]="!includeNavigationProperties"
3940
+ (valueChange)="onMaxDepthChange($event)"
3941
+ class="depth-input">
3942
+ </kendo-numerictextbox>
3943
+ </label>
3944
+ @if (isLoadingAttributes) {
3945
+ <span class="loading-hint">Loading...</span>
3946
+ }
3947
+ </div>
3948
+ }
3822
3949
  <div class="toolbar">
3823
3950
  <button
3824
3951
  kendoButton
@@ -3865,25 +3992,26 @@ class FieldFilterEditorComponent {
3865
3992
  <kendo-grid-column field="attributePath" title="Attribute Path" [width]="280">
3866
3993
  <ng-template kendoGridCellTemplate let-dataItem>
3867
3994
  @if (availableAttributes.length > 0) {
3868
- <kendo-dropdownlist
3995
+ <kendo-combobox
3869
3996
  [data]="filteredAttributeList"
3870
3997
  [(ngModel)]="dataItem.attributePath"
3871
3998
  (valueChange)="onAttributeChange(dataItem, $event)"
3872
3999
  [textField]="'attributePath'"
3873
4000
  [valueField]="'attributePath'"
3874
4001
  [valuePrimitive]="true"
4002
+ [allowCustom]="true"
3875
4003
  [filterable]="true"
3876
4004
  (filterChange)="onAttributeFilterChange($event)"
3877
4005
  [listHeight]="300"
3878
4006
  [popupSettings]="{ appendTo: 'root', animate: true }"
3879
4007
  class="attribute-dropdown">
3880
- <ng-template kendoDropDownListItemTemplate let-item>
4008
+ <ng-template kendoComboBoxItemTemplate let-item>
3881
4009
  <div class="attribute-item">
3882
4010
  <span class="attribute-path">{{ item.attributePath }}</span>
3883
4011
  <span class="attribute-type">{{ item.attributeValueType }}</span>
3884
4012
  </div>
3885
4013
  </ng-template>
3886
- </kendo-dropdownlist>
4014
+ </kendo-combobox>
3887
4015
  } @else {
3888
4016
  <kendo-textbox
3889
4017
  [(ngModel)]="dataItem.attributePath"
@@ -4046,7 +4174,7 @@ class FieldFilterEditorComponent {
4046
4174
  </div>
4047
4175
  }
4048
4176
  </div>
4049
- `, isInline: true, styles: [".field-filter-editor{display:flex;flex-direction:column;gap:10px}.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.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", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "directive", type: i3.HeaderTemplateDirective, selector: "[kendoGridHeaderTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i4.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: i3$1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "component", type: i3$1.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "directive", type: i3$1.ValueTemplateDirective, selector: "[kendoDropDownListValueTemplate],[kendoDropDownTreeValueTemplate]" }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i5.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "ngmodule", type: DateInputsModule }, { kind: "component", type: i6.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 }] });
4177
+ `, 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: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.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", "csvExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { kind: "directive", type: i3.SelectionDirective, selector: "[kendoGridSelectBy]" }, { kind: "component", type: i3.ColumnComponent, selector: "kendo-grid-column", inputs: ["field", "format", "sortable", "groupable", "editor", "filter", "filterVariant", "filterable", "editable"] }, { kind: "directive", type: i3.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { kind: "directive", type: i3.HeaderTemplateDirective, selector: "[kendoGridHeaderTemplate]" }, { kind: "ngmodule", type: ButtonsModule }, { kind: "component", type: i4.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: i3$1.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "component", type: i3$1.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "component", type: i3$1.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "directive", type: i3$1.ValueTemplateDirective, selector: "[kendoDropDownListValueTemplate],[kendoDropDownTreeValueTemplate]" }, { kind: "ngmodule", type: InputsModule }, { kind: "component", type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "component", type: i5.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "directive", type: i5.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }, { kind: "ngmodule", type: DateInputsModule }, { kind: "component", type: i6.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 }] });
4050
4178
  }
4051
4179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
4052
4180
  type: Component,
@@ -4063,6 +4191,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4063
4191
  IntlModule
4064
4192
  ], template: `
4065
4193
  <div class="field-filter-editor">
4194
+ @if (ckTypeId) {
4195
+ <div class="attribute-options">
4196
+ <label class="inline-checkbox">
4197
+ <input type="checkbox" kendoCheckBox
4198
+ [(ngModel)]="includeNavigationProperties"
4199
+ (ngModelChange)="onNavigationPropertiesChange()" />
4200
+ Include Navigation Properties
4201
+ </label>
4202
+ <label class="inline-field">
4203
+ Max Depth
4204
+ <kendo-numerictextbox
4205
+ [(ngModel)]="maxDepth"
4206
+ [min]="1" [max]="5" [step]="1" [format]="'n0'"
4207
+ [spinners]="true"
4208
+ [disabled]="!includeNavigationProperties"
4209
+ (valueChange)="onMaxDepthChange($event)"
4210
+ class="depth-input">
4211
+ </kendo-numerictextbox>
4212
+ </label>
4213
+ @if (isLoadingAttributes) {
4214
+ <span class="loading-hint">Loading...</span>
4215
+ }
4216
+ </div>
4217
+ }
4066
4218
  <div class="toolbar">
4067
4219
  <button
4068
4220
  kendoButton
@@ -4109,25 +4261,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4109
4261
  <kendo-grid-column field="attributePath" title="Attribute Path" [width]="280">
4110
4262
  <ng-template kendoGridCellTemplate let-dataItem>
4111
4263
  @if (availableAttributes.length > 0) {
4112
- <kendo-dropdownlist
4264
+ <kendo-combobox
4113
4265
  [data]="filteredAttributeList"
4114
4266
  [(ngModel)]="dataItem.attributePath"
4115
4267
  (valueChange)="onAttributeChange(dataItem, $event)"
4116
4268
  [textField]="'attributePath'"
4117
4269
  [valueField]="'attributePath'"
4118
4270
  [valuePrimitive]="true"
4271
+ [allowCustom]="true"
4119
4272
  [filterable]="true"
4120
4273
  (filterChange)="onAttributeFilterChange($event)"
4121
4274
  [listHeight]="300"
4122
4275
  [popupSettings]="{ appendTo: 'root', animate: true }"
4123
4276
  class="attribute-dropdown">
4124
- <ng-template kendoDropDownListItemTemplate let-item>
4277
+ <ng-template kendoComboBoxItemTemplate let-item>
4125
4278
  <div class="attribute-item">
4126
4279
  <span class="attribute-path">{{ item.attributePath }}</span>
4127
4280
  <span class="attribute-type">{{ item.attributeValueType }}</span>
4128
4281
  </div>
4129
4282
  </ng-template>
4130
- </kendo-dropdownlist>
4283
+ </kendo-combobox>
4131
4284
  } @else {
4132
4285
  <kendo-textbox
4133
4286
  [(ngModel)]="dataItem.attributePath"
@@ -4290,9 +4443,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4290
4443
  </div>
4291
4444
  }
4292
4445
  </div>
4293
- `, styles: [".field-filter-editor{display:flex;flex-direction:column;gap:10px}.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"] }]
4446
+ `, 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"] }]
4294
4447
  }], propDecorators: { availableAttributes: [{
4295
4448
  type: Input
4449
+ }], ckTypeId: [{
4450
+ type: Input
4296
4451
  }], enableVariables: [{
4297
4452
  type: Input
4298
4453
  }], availableVariables: [{