@meshmakers/octo-ui 3.3.470 → 3.3.480

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';
@@ -3102,10 +3102,14 @@ class CkTypeSelectorInputComponent {
3102
3102
  onChange = () => { };
3103
3103
  onTouched = () => { };
3104
3104
  searchIcon = searchIcon;
3105
+ popupSettings = { appendTo: 'root', popupClass: 'mm-ck-type-popup' };
3106
+ static popupStyleInjected = false;
3105
3107
  ckTypeSelectorService = inject(CkTypeSelectorService);
3106
3108
  dialogService = inject(CkTypeSelectorDialogService, { optional: true });
3109
+ elementRef = inject(ElementRef);
3107
3110
  ngOnInit() {
3108
3111
  this.setupSearch();
3112
+ this.injectPopupStyles();
3109
3113
  }
3110
3114
  ngOnDestroy() {
3111
3115
  this.subscriptions.unsubscribe();
@@ -3223,6 +3227,29 @@ class CkTypeSelectorInputComponent {
3223
3227
  this.typeMap = new Map(items.map(item => [item.rtCkTypeId, item]));
3224
3228
  }));
3225
3229
  }
3230
+ injectPopupStyles() {
3231
+ if (CkTypeSelectorInputComponent.popupStyleInjected)
3232
+ return;
3233
+ const style = document.createElement('style');
3234
+ style.setAttribute('data-mm-ck-type-popup', '');
3235
+ style.textContent = `
3236
+ .mm-ck-type-popup {
3237
+ max-width: 500px !important;
3238
+ min-width: 0 !important;
3239
+ }
3240
+ .mm-ck-type-popup .k-child-animation-container {
3241
+ max-width: 500px !important;
3242
+ }
3243
+ .mm-ck-type-popup .k-list-item {
3244
+ padding: 4px 12px !important;
3245
+ min-height: 0 !important;
3246
+ font-size: 13px !important;
3247
+ line-height: 20px !important;
3248
+ }
3249
+ `;
3250
+ document.head.appendChild(style);
3251
+ CkTypeSelectorInputComponent.popupStyleInjected = true;
3252
+ }
3226
3253
  selectCkType(ckType) {
3227
3254
  this.selectedCkType = ckType;
3228
3255
  this.searchFormControl.setValue(ckType.rtCkTypeId, { emitEvent: false });
@@ -3276,6 +3303,7 @@ class CkTypeSelectorInputComponent {
3276
3303
  [suggest]="true"
3277
3304
  [clearButton]="true"
3278
3305
  [filterable]="true"
3306
+ [popupSettings]="popupSettings"
3279
3307
  (filterChange)="onFilterChange($event)"
3280
3308
  (valueChange)="onSelectionChange($event)"
3281
3309
  (blur)="onBlur()"
@@ -3352,6 +3380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
3352
3380
  [suggest]="true"
3353
3381
  [clearButton]="true"
3354
3382
  [filterable]="true"
3383
+ [popupSettings]="popupSettings"
3355
3384
  (filterChange)="onFilterChange($event)"
3356
3385
  (valueChange)="onSelectionChange($event)"
3357
3386
  (blur)="onBlur()"
@@ -3427,6 +3456,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
3427
3456
  }] } });
3428
3457
 
3429
3458
  class FieldFilterEditorComponent {
3459
+ attributeService = inject(AttributeSelectorService, { optional: true });
3430
3460
  plusIcon = plusIcon;
3431
3461
  minusIcon = minusIcon;
3432
3462
  trashIcon = trashIcon;
@@ -3451,10 +3481,21 @@ class FieldFilterEditorComponent {
3451
3481
  ];
3452
3482
  booleanOptions = ['true', 'false'];
3453
3483
  availableAttributes = [];
3484
+ /**
3485
+ * Optional CK type ID for self-loading attributes.
3486
+ * When set, the component loads available attributes itself and shows
3487
+ * navigation property controls (checkbox + max depth).
3488
+ * When not set, the component uses the externally provided availableAttributes input.
3489
+ */
3490
+ ckTypeId;
3454
3491
  /** Enable variable mode - allows using variables instead of literal values */
3455
3492
  enableVariables = false;
3456
3493
  /** Available variables for selection when enableVariables is true */
3457
3494
  availableVariables = [];
3495
+ /** Controls for self-loading mode (when ckTypeId is set) */
3496
+ includeNavigationProperties = true;
3497
+ maxDepth = null;
3498
+ isLoadingAttributes = false;
3458
3499
  _filters = [];
3459
3500
  nextId = 1;
3460
3501
  filteredAttributeList = [];
@@ -3468,7 +3509,11 @@ class FieldFilterEditorComponent {
3468
3509
  }
3469
3510
  filtersChange = new EventEmitter();
3470
3511
  selectedKeys = [];
3471
- ngOnChanges() {
3512
+ ngOnChanges(changes) {
3513
+ // Self-load attributes when ckTypeId changes
3514
+ if (changes?.['ckTypeId'] && this.ckTypeId) {
3515
+ this.loadAttributesFromCkType();
3516
+ }
3472
3517
  this.filteredAttributeList = [...this.availableAttributes];
3473
3518
  this.buildAttributeTypeMap();
3474
3519
  // Ensure useVariable flag is set correctly for filters with variable values
@@ -3493,6 +3538,43 @@ class FieldFilterEditorComponent {
3493
3538
  this.attributeTypeMap.set(attr.attributePath, attr.attributeValueType);
3494
3539
  }
3495
3540
  }
3541
+ // ============================================================================
3542
+ // Self-loading attribute methods (when ckTypeId is set)
3543
+ // ============================================================================
3544
+ onNavigationPropertiesChange() {
3545
+ if (!this.includeNavigationProperties) {
3546
+ this.maxDepth = null;
3547
+ }
3548
+ this.loadAttributesFromCkType();
3549
+ }
3550
+ onMaxDepthChange(value) {
3551
+ this.maxDepth = value;
3552
+ this.loadAttributesFromCkType();
3553
+ }
3554
+ async loadAttributesFromCkType() {
3555
+ if (!this.ckTypeId || !this.attributeService)
3556
+ return;
3557
+ this.isLoadingAttributes = true;
3558
+ try {
3559
+ const result = await firstValueFrom(this.attributeService.getAvailableAttributes(this.ckTypeId, undefined, // filter
3560
+ 1000, // first
3561
+ undefined, // after
3562
+ undefined, // attributeValueType
3563
+ undefined, // searchTerm
3564
+ this.includeNavigationProperties, this.maxDepth ?? undefined));
3565
+ this.availableAttributes = result.items;
3566
+ this.filteredAttributeList = [...this.availableAttributes];
3567
+ this.buildAttributeTypeMap();
3568
+ }
3569
+ catch (error) {
3570
+ console.error('Error loading filter attributes:', error);
3571
+ this.availableAttributes = [];
3572
+ this.filteredAttributeList = [];
3573
+ }
3574
+ finally {
3575
+ this.isLoadingAttributes = false;
3576
+ }
3577
+ }
3496
3578
  addFilter() {
3497
3579
  const newFilter = {
3498
3580
  id: this.nextId++,
@@ -3817,8 +3899,32 @@ class FieldFilterEditorComponent {
3817
3899
  return values;
3818
3900
  }
3819
3901
  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: `
3902
+ 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
3903
  <div class="field-filter-editor">
3904
+ @if (ckTypeId) {
3905
+ <div class="attribute-options">
3906
+ <label class="inline-checkbox">
3907
+ <input type="checkbox" kendoCheckBox
3908
+ [(ngModel)]="includeNavigationProperties"
3909
+ (ngModelChange)="onNavigationPropertiesChange()" />
3910
+ Include Navigation Properties
3911
+ </label>
3912
+ <label class="inline-field">
3913
+ Max Depth
3914
+ <kendo-numerictextbox
3915
+ [(ngModel)]="maxDepth"
3916
+ [min]="1" [max]="5" [step]="1" [format]="'n0'"
3917
+ [spinners]="true"
3918
+ [disabled]="!includeNavigationProperties"
3919
+ (valueChange)="onMaxDepthChange($event)"
3920
+ class="depth-input">
3921
+ </kendo-numerictextbox>
3922
+ </label>
3923
+ @if (isLoadingAttributes) {
3924
+ <span class="loading-hint">Loading...</span>
3925
+ }
3926
+ </div>
3927
+ }
3822
3928
  <div class="toolbar">
3823
3929
  <button
3824
3930
  kendoButton
@@ -3865,25 +3971,26 @@ class FieldFilterEditorComponent {
3865
3971
  <kendo-grid-column field="attributePath" title="Attribute Path" [width]="280">
3866
3972
  <ng-template kendoGridCellTemplate let-dataItem>
3867
3973
  @if (availableAttributes.length > 0) {
3868
- <kendo-dropdownlist
3974
+ <kendo-combobox
3869
3975
  [data]="filteredAttributeList"
3870
3976
  [(ngModel)]="dataItem.attributePath"
3871
3977
  (valueChange)="onAttributeChange(dataItem, $event)"
3872
3978
  [textField]="'attributePath'"
3873
3979
  [valueField]="'attributePath'"
3874
3980
  [valuePrimitive]="true"
3981
+ [allowCustom]="true"
3875
3982
  [filterable]="true"
3876
3983
  (filterChange)="onAttributeFilterChange($event)"
3877
3984
  [listHeight]="300"
3878
3985
  [popupSettings]="{ appendTo: 'root', animate: true }"
3879
3986
  class="attribute-dropdown">
3880
- <ng-template kendoDropDownListItemTemplate let-item>
3987
+ <ng-template kendoComboBoxItemTemplate let-item>
3881
3988
  <div class="attribute-item">
3882
3989
  <span class="attribute-path">{{ item.attributePath }}</span>
3883
3990
  <span class="attribute-type">{{ item.attributeValueType }}</span>
3884
3991
  </div>
3885
3992
  </ng-template>
3886
- </kendo-dropdownlist>
3993
+ </kendo-combobox>
3887
3994
  } @else {
3888
3995
  <kendo-textbox
3889
3996
  [(ngModel)]="dataItem.attributePath"
@@ -4046,7 +4153,7 @@ class FieldFilterEditorComponent {
4046
4153
  </div>
4047
4154
  }
4048
4155
  </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 }] });
4156
+ `, 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
4157
  }
4051
4158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FieldFilterEditorComponent, decorators: [{
4052
4159
  type: Component,
@@ -4063,6 +4170,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4063
4170
  IntlModule
4064
4171
  ], template: `
4065
4172
  <div class="field-filter-editor">
4173
+ @if (ckTypeId) {
4174
+ <div class="attribute-options">
4175
+ <label class="inline-checkbox">
4176
+ <input type="checkbox" kendoCheckBox
4177
+ [(ngModel)]="includeNavigationProperties"
4178
+ (ngModelChange)="onNavigationPropertiesChange()" />
4179
+ Include Navigation Properties
4180
+ </label>
4181
+ <label class="inline-field">
4182
+ Max Depth
4183
+ <kendo-numerictextbox
4184
+ [(ngModel)]="maxDepth"
4185
+ [min]="1" [max]="5" [step]="1" [format]="'n0'"
4186
+ [spinners]="true"
4187
+ [disabled]="!includeNavigationProperties"
4188
+ (valueChange)="onMaxDepthChange($event)"
4189
+ class="depth-input">
4190
+ </kendo-numerictextbox>
4191
+ </label>
4192
+ @if (isLoadingAttributes) {
4193
+ <span class="loading-hint">Loading...</span>
4194
+ }
4195
+ </div>
4196
+ }
4066
4197
  <div class="toolbar">
4067
4198
  <button
4068
4199
  kendoButton
@@ -4109,25 +4240,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4109
4240
  <kendo-grid-column field="attributePath" title="Attribute Path" [width]="280">
4110
4241
  <ng-template kendoGridCellTemplate let-dataItem>
4111
4242
  @if (availableAttributes.length > 0) {
4112
- <kendo-dropdownlist
4243
+ <kendo-combobox
4113
4244
  [data]="filteredAttributeList"
4114
4245
  [(ngModel)]="dataItem.attributePath"
4115
4246
  (valueChange)="onAttributeChange(dataItem, $event)"
4116
4247
  [textField]="'attributePath'"
4117
4248
  [valueField]="'attributePath'"
4118
4249
  [valuePrimitive]="true"
4250
+ [allowCustom]="true"
4119
4251
  [filterable]="true"
4120
4252
  (filterChange)="onAttributeFilterChange($event)"
4121
4253
  [listHeight]="300"
4122
4254
  [popupSettings]="{ appendTo: 'root', animate: true }"
4123
4255
  class="attribute-dropdown">
4124
- <ng-template kendoDropDownListItemTemplate let-item>
4256
+ <ng-template kendoComboBoxItemTemplate let-item>
4125
4257
  <div class="attribute-item">
4126
4258
  <span class="attribute-path">{{ item.attributePath }}</span>
4127
4259
  <span class="attribute-type">{{ item.attributeValueType }}</span>
4128
4260
  </div>
4129
4261
  </ng-template>
4130
- </kendo-dropdownlist>
4262
+ </kendo-combobox>
4131
4263
  } @else {
4132
4264
  <kendo-textbox
4133
4265
  [(ngModel)]="dataItem.attributePath"
@@ -4290,9 +4422,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4290
4422
  </div>
4291
4423
  }
4292
4424
  </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"] }]
4425
+ `, 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
4426
  }], propDecorators: { availableAttributes: [{
4295
4427
  type: Input
4428
+ }], ckTypeId: [{
4429
+ type: Input
4296
4430
  }], enableVariables: [{
4297
4431
  type: Input
4298
4432
  }], availableVariables: [{