@meshmakers/octo-ui 3.3.600 → 3.3.620

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 +1 @@
1
- {"version":3,"file":"meshmakers-octo-ui.mjs","sources":["../../../../projects/meshmakers/octo-ui/src/lib/attribute-sort-selector-dialog/attribute-sort-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-sort-selector-dialog/attribute-sort-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/models/property-grid.models.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/services/property-converter.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/components/property-value-display.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/components/property-grid.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/index.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-dialog/ck-type-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-dialog/ck-type-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-input/ck-type-selector-input.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-selector-dialog/attribute-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-selector-dialog/attribute-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/runtime-entity-variable-dialog/runtime-entity-variable-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/runtime-entity-variable-dialog/runtime-entity-variable-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/data-sources/octo-graph-ql-data-source.ts","../../../../projects/meshmakers/octo-ui/src/lib/data-sources/octo-graph-ql-hierarchy-data-source.ts","../../../../projects/meshmakers/octo-ui/src/lib/field-filter-editor/field-filter-editor.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/entity-id-info/entity-id-info.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/octo-loader/octo-loader.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/tenant-switcher/tenant-switcher.component.ts","../../../../projects/meshmakers/octo-ui/src/public-api.ts","../../../../projects/meshmakers/octo-ui/src/meshmakers-octo-ui.ts"],"sourcesContent":["import { Component, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule, GridDataResult, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { searchIcon, sortAscSmallIcon, sortDescSmallIcon } from '@progress/kendo-svg-icons';\nimport { AttributeSelectorService, AttributeItem, AttributeValueTypeDto } from '@meshmakers/octo-services';\nimport { WindowModule, WindowRef } from '@progress/kendo-angular-dialog';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface AttributeSortItem {\n attributePath: string;\n attributeValueType: string;\n sortOrder: 'standard' | 'ascending' | 'descending';\n}\n\nexport interface AttributeSortSelectorDialogData {\n ckTypeId: string;\n selectedAttributes?: AttributeSortItem[];\n dialogTitle?: string;\n /** When set, controls whether navigation properties are included in the attribute list */\n includeNavigationProperties?: boolean;\n /** When true, hides the navigation property controls (if they were to be added) */\n hideNavigationControls?: boolean;\n /** When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching) */\n attributePaths?: string[];\n}\n\nexport interface AttributeSortSelectorDialogResult {\n selectedAttributes: AttributeSortItem[];\n}\n\nexport interface SortOption {\n text: string;\n value: 'standard' | 'ascending' | 'descending';\n}\n\ninterface ValueTypeFilterOption {\n text: string;\n value: AttributeValueTypeDto | null;\n}\n\n@Component({\n selector: 'mm-attribute-sort-selector-dialog',\n standalone: true,\n host: { 'data-component': 'attribute-sort-selector' },\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownListModule,\n IconsModule,\n WindowModule\n ],\n template: `\n <div class=\"attribute-sort-selector-container\">\n <!-- Filter Section -->\n <div class=\"filter-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search path & description...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\n <kendo-dropdownlist\n [data]=\"valueTypeOptions\"\n [(ngModel)]=\"selectedValueTypeFilter\"\n (valueChange)=\"onValueTypeFilterChange($event)\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"type-filter-dropdown\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Main Content Area - All side by side -->\n <div class=\"lists-container\">\n <!-- Available Attributes -->\n <div class=\"list-section\">\n <h4>Available Attributes</h4>\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <!-- Sort Options in center -->\n <div class=\"sort-options-section\">\n <h4>Sort Order</h4>\n <div class=\"sort-buttons\">\n <button\n kendoButton\n [fillMode]=\"currentSortOrder === 'standard' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'standard' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('standard')\"\n class=\"sort-button\"\n title=\"Standard (no sort)\">\n —\n </button>\n <button\n kendoButton\n [svgIcon]=\"sortAscIcon\"\n [fillMode]=\"currentSortOrder === 'ascending' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'ascending' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('ascending')\"\n class=\"sort-button\"\n title=\"Ascending\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"sortDescIcon\"\n [fillMode]=\"currentSortOrder === 'descending' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'descending' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('descending')\"\n class=\"sort-button\"\n title=\"Descending\">\n </button>\n </div>\n\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"selectedAvailableKeys.length === 0\"\n (click)=\"addAttributeWithSort()\"\n class=\"add-button\">\n Add →\n </button>\n </div>\n\n <!-- Selected Attributes -->\n <div class=\"list-section\">\n <h4>Selected ({{ selectedAttributes.length }})</h4>\n <kendo-grid\n [data]=\"selectedGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"180\"></kendo-grid-column>\n <kendo-grid-column field=\"sortOrder\" title=\"Sort\" [width]=\"100\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"sort-display\">\n <span class=\"sort-indicator\">{{ getSortIndicator(dataItem.sortOrder) }}</span>\n <span>{{ getSortText(dataItem.sortOrder) }}</span>\n </div>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column title=\"\" [width]=\"50\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <button\n kendoButton\n size=\"small\"\n fillMode=\"flat\"\n (click)=\"removeAttribute(dataItem)\"\n title=\"Remove\">\n ✕\n </button>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </div>\n\n <!-- Action Bar -->\n <div class=\"action-bar\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" (click)=\"onOk()\">Apply</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .attribute-sort-selector-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .filter-container {\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .search-input {\n flex: 1;\n }\n\n .type-filter-dropdown {\n width: 160px;\n flex-shrink: 0;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .list-section h4, .sort-options-section h4 {\n margin: 0 0 10px 0;\n font-size: 0.85rem;\n font-weight: 600;\n flex-shrink: 0;\n }\n\n .attribute-grid {\n border-radius: 4px;\n flex: 1;\n min-height: 200px;\n }\n\n .attribute-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .sort-options-section {\n width: 120px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding-top: 32px;\n }\n\n .sort-buttons {\n display: flex;\n flex-direction: row;\n gap: 4px;\n }\n\n .sort-button {\n flex: 1;\n min-width: 36px;\n height: 36px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .add-button {\n width: 100%;\n margin-top: 16px;\n }\n\n .sort-display {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .sort-indicator {\n font-size: 14px;\n font-weight: bold;\n color: var(--kendo-color-primary, #ff6358);\n }\n\n .action-bar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #dee2e6);\n }\n `]\n})\nexport class AttributeSortSelectorDialogComponent implements OnInit {\n private readonly windowRef = inject(WindowRef);\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n // Dialog data\n public data!: AttributeSortSelectorDialogData;\n public ckTypeId!: string;\n public includeNavigationProperties: boolean | undefined = undefined;\n private attributePathsSet: Set<string> | null = null;\n public searchText = '';\n public currentSortOrder: 'standard' | 'ascending' | 'descending' = 'standard';\n public selectedValueTypeFilter: AttributeValueTypeDto | null = null;\n\n // Grid data\n public availableAttributes: AttributeItem[] = [];\n public selectedAttributes: AttributeSortItem[] = [];\n public availableGridData: GridDataResult = { data: [], total: 0 };\n public selectedGridData: GridDataResult = { data: [], total: 0 };\n\n // Selection tracking\n public selectedAvailableKeys: string[] = [];\n public selectedChosenKeys: string[] = [];\n\n // Double-click tracking\n private lastClickTime = 0;\n private lastClickedItem: string | null = null;\n private readonly doubleClickDelay = 300;\n\n // UI configuration\n public dialogTitle = 'Select Attributes with Sort Order';\n\n public sortOptions: SortOption[] = [\n { text: 'Standard', value: 'standard' },\n { text: 'Ascending', value: 'ascending' },\n { text: 'Descending', value: 'descending' }\n ];\n\n public valueTypeOptions: ValueTypeFilterOption[] = [\n { text: 'All Types', value: null },\n { text: 'String', value: AttributeValueTypeDto.StringDto },\n { text: 'Integer', value: AttributeValueTypeDto.IntegerDto },\n { text: 'Double', value: AttributeValueTypeDto.DoubleDto },\n { text: 'Boolean', value: AttributeValueTypeDto.BooleanDto },\n { text: 'DateTime', value: AttributeValueTypeDto.DateTimeDto },\n { text: 'DateTimeOffset', value: AttributeValueTypeDto.DateTimeOffsetDto },\n { text: 'Enum', value: AttributeValueTypeDto.EnumDto },\n { text: 'TimeSpan', value: AttributeValueTypeDto.TimeSpanDto }\n ];\n\n // Icons\n protected readonly searchIcon = searchIcon;\n protected readonly sortAscIcon = sortAscSmallIcon;\n protected readonly sortDescIcon = sortDescSmallIcon;\n\n ngOnInit(): void {\n // Get dialog data\n if (this.data) {\n this.ckTypeId = this.data.ckTypeId;\n this.dialogTitle = this.data.dialogTitle || 'Select Attributes with Sort Order';\n this.includeNavigationProperties = this.data.includeNavigationProperties;\n this.attributePathsSet = this.data.attributePaths ? new Set(this.data.attributePaths) : null;\n\n if (this.data.selectedAttributes && this.data.selectedAttributes.length > 0) {\n this.selectedAttributes = [...this.data.selectedAttributes];\n this.updateSelectedGrid();\n }\n }\n\n // Set up search debouncing\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(searchText => {\n this.loadAvailableAttributes(searchText);\n });\n\n // Load initial data\n this.loadAvailableAttributes();\n }\n\n private loadAvailableAttributes(searchTerm?: string): void {\n this.attributeService.getAvailableAttributes(\n this.ckTypeId, undefined, undefined, undefined,\n this.selectedValueTypeFilter || undefined,\n searchTerm || undefined,\n this.includeNavigationProperties,\n undefined\n ).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n\n // Apply client-side attribute path restriction if set\n const filteredItems = this.attributePathsSet\n ? result.items.filter(item => this.attributePathsSet!.has(item.attributePath))\n : result.items;\n\n this.availableAttributes = filteredItems.filter(item => !selectedPaths.has(item.attributePath));\n this.updateAvailableGrid();\n });\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onValueTypeFilterChange(_value: AttributeValueTypeDto | null): void {\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public setSortOrder(order: 'standard' | 'ascending' | 'descending'): void {\n this.currentSortOrder = order;\n }\n\n public addAttributeWithSort(): void {\n if (this.selectedAvailableKeys.length === 0) return;\n\n const attributePath = this.selectedAvailableKeys[0];\n const attribute = this.availableAttributes.find(a => a.attributePath === attributePath);\n\n if (attribute) {\n this.addAttributeToSelected(attribute);\n }\n }\n\n public onAvailableCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - add attribute with current sort\n this.addAttributeToSelected(dataItem);\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n public onSelectedCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeSortItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - remove attribute\n this.removeAttribute(dataItem);\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n private addAttributeToSelected(attribute: AttributeItem): void {\n const sortItem: AttributeSortItem = {\n attributePath: attribute.attributePath,\n attributeValueType: attribute.attributeValueType,\n sortOrder: this.currentSortOrder\n };\n\n this.selectedAttributes.push(sortItem);\n\n // Remove from available\n this.availableAttributes = this.availableAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Clear selections\n this.selectedAvailableKeys = [];\n\n this.updateGrids();\n }\n\n public removeAttribute(attribute: AttributeSortItem): void {\n // Remove from selected\n this.selectedAttributes = this.selectedAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add back to available (convert back to AttributeItem)\n const availableItem: AttributeItem = {\n attributePath: attribute.attributePath,\n attributeValueType: attribute.attributeValueType\n };\n\n this.availableAttributes.push(availableItem);\n this.availableAttributes.sort((a, b) => a.attributePath.localeCompare(b.attributePath));\n\n // Clear selections\n this.selectedChosenKeys = this.selectedChosenKeys.filter(\n key => key !== attribute.attributePath\n );\n\n this.updateGrids();\n }\n\n public getSortIndicator(sortOrder: string): string {\n switch (sortOrder) {\n case 'ascending': return '↑';\n case 'descending': return '↓';\n default: return '';\n }\n }\n\n public getSortText(sortOrder: string): string {\n const option = this.sortOptions.find(opt => opt.value === sortOrder);\n return option?.text || sortOrder;\n }\n\n private updateGrids(): void {\n this.updateAvailableGrid();\n this.updateSelectedGrid();\n }\n\n private updateAvailableGrid(): void {\n this.availableGridData = {\n data: this.availableAttributes,\n total: this.availableAttributes.length\n };\n }\n\n private updateSelectedGrid(): void {\n this.selectedGridData = {\n data: this.selectedAttributes,\n total: this.selectedAttributes.length\n };\n }\n\n public onOk(): void {\n const result: AttributeSortSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n this.windowRef.close(result);\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n AttributeSortSelectorDialogComponent,\n AttributeSortSelectorDialogData,\n AttributeSortSelectorDialogResult,\n AttributeSortItem\n} from './attribute-sort-selector-dialog.component';\n\nexport interface AttributeSortSelectorResult {\n confirmed: boolean;\n selectedAttributes: AttributeSortItem[];\n}\n\n@Injectable()\nexport class AttributeSortSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the attribute sort selector dialog\n * @param ckTypeId The CkType ID to fetch attributes for\n * @param selectedAttributes Optional array of pre-selected attributes with sort orders\n * @param dialogTitle Optional custom dialog title\n * @param includeNavigationProperties Optional flag to control navigation property inclusion\n * @param hideNavigationControls Optional flag to hide the navigation property controls\n * @returns Promise that resolves with the result containing selected attributes with sort orders and confirmation status\n */\n public async openAttributeSortSelector(\n ckTypeId: string,\n selectedAttributes?: AttributeSortItem[],\n dialogTitle?: string,\n includeNavigationProperties?: boolean,\n hideNavigationControls?: boolean,\n attributePaths?: string[]\n ): Promise<AttributeSortSelectorResult> {\n const data: AttributeSortSelectorDialogData = {\n ckTypeId,\n selectedAttributes,\n dialogTitle,\n includeNavigationProperties,\n hideNavigationControls,\n attributePaths\n };\n\n const size = this.windowStateService.resolveWindowSize('attribute-sort-selector', { width: 1200, height: 750 });\n\n const windowRef: WindowRef = this.windowService.open({\n content: AttributeSortSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 1050,\n minHeight: 700,\n resizable: true,\n title: dialogTitle || 'Select Attributes with Sort Order'\n });\n\n this.windowStateService.applyModalBehavior('attribute-sort-selector', windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: AttributeSortSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n\n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n const dialogResult = result as AttributeSortSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes || []\n };\n } else {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n }\n}\n","// Note: This should eventually be imported from a shared location\n// For now, we define our own enum that matches the GraphQL generated types\nexport enum AttributeValueTypeDto {\n BinaryDto = 'BINARY',\n BinaryLinkedDto = 'BINARY_LINKED',\n BooleanDto = 'BOOLEAN',\n DateTimeDto = 'DATE_TIME',\n DateTimeOffsetDto = 'DATE_TIME_OFFSET',\n DoubleDto = 'DOUBLE',\n EnumDto = 'ENUM',\n GeospatialPointDto = 'GEOSPATIAL_POINT',\n IntDto = 'INT',\n IntegerDto = 'INTEGER',\n Integer_64Dto = 'INTEGER_64',\n IntegerArrayDto = 'INTEGER_ARRAY',\n Int_64Dto = 'INT_64',\n IntArrayDto = 'INT_ARRAY',\n RecordDto = 'RECORD',\n RecordArrayDto = 'RECORD_ARRAY',\n StringDto = 'STRING',\n StringArrayDto = 'STRING_ARRAY',\n TimeSpanDto = 'TIME_SPAN'\n}\n\n/**\n * Represents a property item in the property grid\n */\nexport interface PropertyGridItem {\n /** Unique identifier for the property */\n id: string;\n /** Property name/key */\n name: string;\n /** Display name for the property (optional, falls back to name) */\n displayName?: string;\n /** Current value of the property */\n value: unknown;\n /** Data type of the property */\n type: AttributeValueTypeDto;\n /** Description/tooltip for the property */\n description?: string;\n /** Whether the property is read-only */\n readOnly?: boolean;\n /** Category for grouping properties */\n category?: string;\n /** Whether the property is required */\n required?: boolean;\n /** Custom validation rules */\n validators?: Record<string, unknown>[];\n /** Custom editor configuration */\n editorConfig?: Record<string, unknown>;\n}\n\n/**\n * Configuration options for the property grid\n */\nexport interface PropertyGridConfig {\n /** Whether the grid is in read-only mode */\n readOnlyMode?: boolean;\n /** Custom editors for specific types */\n customEditors?: Record<string, unknown>;\n /** Whether to show type icons */\n showTypeIcons?: boolean;\n /** Height of the grid */\n height?: string;\n /** Whether to show the search box */\n showSearch?: boolean;\n}\n\n/**\n * Event data for property changes\n */\nexport interface PropertyChangeEvent {\n /** The property that changed */\n property: PropertyGridItem;\n /** The old value */\n oldValue: unknown;\n /** The new value */\n newValue: unknown;\n}\n\n/**\n * Supported display modes for complex values\n */\nexport enum PropertyDisplayMode {\n /** Simple text representation */\n Text = 'text',\n /** JSON formatted display */\n Json = 'json',\n /** Custom template display */\n Custom = 'custom'\n}\n\n/**\n * Categories for default property grouping\n */\nexport enum DefaultPropertyCategory {\n General = 'General',\n System = 'System',\n Attributes = 'Attributes',\n Associations = 'Associations',\n Metadata = 'Metadata'\n}\n\n/**\n * Event data for binary download requests\n */\nexport interface BinaryDownloadEvent {\n /** The binary ID to download */\n binaryId: string;\n /** Optional filename for the download */\n filename?: string;\n /** Optional content type */\n contentType?: string;\n /** Optional download URI if already available */\n downloadUri?: string;\n}","import { Injectable, inject } from '@angular/core';\nimport { Observable, of, forkJoin } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { PropertyGridItem, DefaultPropertyCategory, AttributeValueTypeDto } from '../models/property-grid.models';\nimport { CkTypeAttributeService, CkTypeAttributeInfo } from '@meshmakers/octo-services';\n\n/** Represents an attribute from an RtEntity */\ninterface RtAttribute {\n attributeName?: string | null;\n value?: unknown;\n}\n\n/** Represents an RtRecord with a ckRecordId and attributes */\ninterface RtRecord {\n ckRecordId?: string;\n attributes?: RtAttribute[];\n}\n\n/** Represents an RtEntity with system properties and attributes */\ninterface RtEntity {\n rtId?: string;\n ckTypeId?: string;\n rtCreationDateTime?: string;\n rtChangedDateTime?: string;\n rtWellKnownName?: string;\n attributes?: { items?: RtAttribute[] };\n}\n\n/**\n * Service for converting various data structures to PropertyGridItem format.\n * Uses Construction Kit (CK) type definitions for accurate attribute type resolution.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PropertyConverterService {\n private readonly ckTypeAttributeService = inject(CkTypeAttributeService);\n\n /**\n * Convert OctoMesh RtEntity attributes to property grid items using CK type definitions.\n * @param attributes The attributes array from RtEntity\n * @param ckTypeId The fullName of the CK type to look up attribute types\n * @returns Observable of PropertyGridItem array\n */\n convertRtEntityAttributes(attributes: RtAttribute[] | null | undefined, ckTypeId: string): Observable<PropertyGridItem[]> {\n if (!attributes || attributes.length === 0) {\n return of([]);\n }\n\n return this.ckTypeAttributeService.getCkTypeAttributes(ckTypeId).pipe(\n switchMap(ckAttributes => {\n const ckAttributeMap = this.buildAttributeTypeMap(ckAttributes);\n return this.convertAttributesWithCkTypes(attributes, ckAttributeMap);\n })\n );\n }\n\n /**\n * Convert any JavaScript object to property grid items using reflection.\n * This method remains synchronous as there is no CK type for generic JS objects.\n */\n convertObjectToProperties(obj: Record<string, unknown> | null | undefined, category?: string): PropertyGridItem[] {\n if (!obj || typeof obj !== 'object') {\n return [];\n }\n\n return Object.keys(obj).map(key => ({\n id: `obj_${key}`,\n name: key,\n displayName: key,\n value: obj[key],\n type: this.inferAttributeType(obj[key]),\n category: category || DefaultPropertyCategory.General,\n readOnly: false,\n description: `Property: ${key}`\n }));\n }\n\n /**\n * Convert RtRecord to property grid items using CK type definitions.\n * @param record The record object containing ckRecordId and attributes\n * @returns Observable of PropertyGridItem array\n */\n convertRtRecordToProperties(record: RtRecord | null | undefined): Observable<PropertyGridItem[]> {\n if (!record || typeof record !== 'object' || !record.attributes) {\n return of([]);\n }\n\n const ckRecordId = record.ckRecordId;\n if (!ckRecordId) {\n return of([]);\n }\n\n return this.ckTypeAttributeService.getCkRecordAttributes(ckRecordId).pipe(\n switchMap(ckAttributes => {\n const ckAttributeMap = this.buildAttributeTypeMap(ckAttributes);\n const properties: PropertyGridItem[] = [];\n\n // Add ckRecordId as system property\n properties.push({\n id: 'ckRecordId',\n name: 'ckRecordId',\n displayName: 'Record ID',\n value: ckRecordId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Construction kit record identifier'\n });\n\n // Convert attributes with CK types (record.attributes is guaranteed non-null by the guard above)\n return this.convertAttributesWithCkTypes(record.attributes!, ckAttributeMap).pipe(\n map(attributeProperties => {\n properties.push(...attributeProperties);\n return properties;\n })\n );\n })\n );\n }\n\n /**\n * Convert OctoMesh RtEntity to comprehensive property list using CK type definitions.\n * @param entity The RtEntity object\n * @returns Observable of PropertyGridItem array\n */\n convertRtEntityToProperties(entity: RtEntity): Observable<PropertyGridItem[]> {\n const properties: PropertyGridItem[] = [];\n\n // System properties\n if (entity.rtId) {\n properties.push({\n id: 'rtId',\n name: 'rtId',\n displayName: 'Runtime ID',\n value: entity.rtId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Unique runtime identifier'\n });\n }\n\n if (entity.ckTypeId) {\n properties.push({\n id: 'ckTypeId',\n name: 'ckTypeId',\n displayName: 'Type ID',\n value: entity.ckTypeId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Construction kit type identifier'\n });\n }\n\n if (entity.rtCreationDateTime) {\n properties.push({\n id: 'rtCreationDateTime',\n name: 'rtCreationDateTime',\n displayName: 'Created',\n value: entity.rtCreationDateTime,\n type: AttributeValueTypeDto.DateTimeDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Creation date and time'\n });\n }\n\n if (entity.rtChangedDateTime) {\n properties.push({\n id: 'rtChangedDateTime',\n name: 'rtChangedDateTime',\n displayName: 'Modified',\n value: entity.rtChangedDateTime,\n type: AttributeValueTypeDto.DateTimeDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Last modification date and time'\n });\n }\n\n if (entity.rtWellKnownName) {\n properties.push({\n id: 'rtWellKnownName',\n name: 'rtWellKnownName',\n displayName: 'Well Known Name',\n value: entity.rtWellKnownName,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.General,\n readOnly: false,\n description: 'Well-known name for the entity'\n });\n }\n\n // If no ckTypeId or no attributes, return system properties only\n if (!entity.ckTypeId || !entity.attributes?.items) {\n return of(properties);\n }\n\n // Load CK type attributes and convert entity attributes\n return this.convertRtEntityAttributes(entity.attributes.items, entity.ckTypeId).pipe(\n map(attributeProperties => {\n properties.push(...attributeProperties);\n return properties;\n })\n );\n }\n\n /**\n * Build a map from attribute name to attribute value type from CK definitions\n */\n private buildAttributeTypeMap(ckAttributes: CkTypeAttributeInfo[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const attr of ckAttributes) {\n map.set(attr.attributeName, attr.attributeValueType);\n }\n return map;\n }\n\n /**\n * Convert attributes using CK type map for type resolution\n */\n private convertAttributesWithCkTypes(\n attributes: RtAttribute[],\n ckAttributeMap: Map<string, string>\n ): Observable<PropertyGridItem[]> {\n if (!attributes || attributes.length === 0) {\n return of([]);\n }\n\n // Check if any attributes have nested records that need async conversion\n const hasNestedRecords = attributes.some(attr =>\n attr?.value && typeof attr.value === 'object' && attr.value !== null && 'attributes' in attr.value\n );\n\n if (!hasNestedRecords) {\n // No nested records - convert synchronously\n const items = attributes.map((attr, index) => this.convertSingleAttribute(attr, index, ckAttributeMap));\n return of(items);\n }\n\n // Has nested records - need to handle async conversion\n const conversionObservables = attributes.map((attr, index) => {\n if (attr?.value && typeof attr.value === 'object' && attr.value !== null && 'attributes' in attr.value) {\n // Nested record - convert async\n return this.convertRtRecordToProperties(attr.value as RtRecord).pipe(\n map(nestedProperties => ({\n id: `attr_${index}_${attr?.attributeName || 'unknown'}`,\n name: attr?.attributeName || `attribute_${index}`,\n displayName: attr?.attributeName || `attribute_${index}`,\n value: nestedProperties,\n type: this.getAttributeType(attr?.attributeName, ckAttributeMap),\n category: DefaultPropertyCategory.Attributes,\n readOnly: false,\n description: `Attribute: ${attr?.attributeName}`\n }))\n );\n } else {\n // Regular attribute - return as observable\n return of(this.convertSingleAttribute(attr, index, ckAttributeMap));\n }\n });\n\n return forkJoin(conversionObservables);\n }\n\n /**\n * Convert a single attribute to PropertyGridItem\n */\n private convertSingleAttribute(\n attr: RtAttribute,\n index: number,\n ckAttributeMap: Map<string, string>\n ): PropertyGridItem {\n const value = this.convertRtEntityAttributeValueSync(attr?.value);\n\n return {\n id: `attr_${index}_${attr?.attributeName || 'unknown'}`,\n name: attr?.attributeName || `attribute_${index}`,\n displayName: attr?.attributeName || `attribute_${index}`,\n value: value,\n type: this.getAttributeType(attr?.attributeName, ckAttributeMap),\n category: DefaultPropertyCategory.Attributes,\n readOnly: false,\n description: `Attribute: ${attr?.attributeName}`\n };\n }\n\n /**\n * Get attribute type from CK map\n */\n private getAttributeType(attributeName: string | null | undefined, ckAttributeMap: Map<string, string>): AttributeValueTypeDto {\n if (!attributeName) {\n return AttributeValueTypeDto.StringDto;\n }\n\n const ckType = ckAttributeMap.get(attributeName);\n if (ckType) {\n return this.mapCkTypeToAttributeValueType(ckType);\n }\n\n // Fallback for attributes not found in CK (should not happen in normal cases)\n return AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Map CK type string to AttributeValueTypeDto enum\n */\n private mapCkTypeToAttributeValueType(ckType: string): AttributeValueTypeDto {\n // The ckType from GraphQL should match the enum values\n const typeMap: Record<string, AttributeValueTypeDto> = {\n 'BINARY': AttributeValueTypeDto.BinaryDto,\n 'BINARY_LINKED': AttributeValueTypeDto.BinaryLinkedDto,\n 'BOOLEAN': AttributeValueTypeDto.BooleanDto,\n 'DATE_TIME': AttributeValueTypeDto.DateTimeDto,\n 'DATE_TIME_OFFSET': AttributeValueTypeDto.DateTimeOffsetDto,\n 'DOUBLE': AttributeValueTypeDto.DoubleDto,\n 'ENUM': AttributeValueTypeDto.EnumDto,\n 'GEOSPATIAL_POINT': AttributeValueTypeDto.GeospatialPointDto,\n 'INT': AttributeValueTypeDto.IntDto,\n 'INTEGER': AttributeValueTypeDto.IntegerDto,\n 'INTEGER_64': AttributeValueTypeDto.Integer_64Dto,\n 'INTEGER_ARRAY': AttributeValueTypeDto.IntegerArrayDto,\n 'INT_64': AttributeValueTypeDto.Int_64Dto,\n 'INT_ARRAY': AttributeValueTypeDto.IntArrayDto,\n 'RECORD': AttributeValueTypeDto.RecordDto,\n 'RECORD_ARRAY': AttributeValueTypeDto.RecordArrayDto,\n 'STRING': AttributeValueTypeDto.StringDto,\n 'STRING_ARRAY': AttributeValueTypeDto.StringArrayDto,\n 'TIME_SPAN': AttributeValueTypeDto.TimeSpanDto\n };\n\n return typeMap[ckType] || AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Convert attribute value synchronously (for non-record values)\n */\n private convertRtEntityAttributeValueSync(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n return value.map(v => this.convertRtEntityAttributeValueSync(v));\n }\n\n // For nested records, return as-is (will be handled by async conversion if needed)\n if (typeof value === 'object' && 'attributes' in value) {\n return value;\n }\n\n return value;\n }\n\n /**\n * Infer attribute type from JavaScript value.\n * Used only for convertObjectToProperties where no CK type is available.\n */\n private inferAttributeType(value: unknown): AttributeValueTypeDto {\n if (value === null || value === undefined) {\n return AttributeValueTypeDto.StringDto;\n }\n\n if (typeof value === 'boolean') {\n return AttributeValueTypeDto.BooleanDto;\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? AttributeValueTypeDto.IntDto : AttributeValueTypeDto.DoubleDto;\n }\n\n if (typeof value === 'string') {\n if (this.isIsoDateString(value)) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n return AttributeValueTypeDto.StringDto;\n }\n\n if (value instanceof Date) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n const firstType = this.inferAttributeType(value[0]);\n switch (firstType) {\n case AttributeValueTypeDto.StringDto:\n return AttributeValueTypeDto.StringArrayDto;\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.DoubleDto:\n return AttributeValueTypeDto.IntegerArrayDto;\n case AttributeValueTypeDto.RecordDto:\n return AttributeValueTypeDto.RecordArrayDto;\n default:\n return AttributeValueTypeDto.StringArrayDto;\n }\n }\n return AttributeValueTypeDto.StringArrayDto;\n }\n\n if (typeof value === 'object') {\n return AttributeValueTypeDto.RecordDto;\n }\n\n return AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Check if string is ISO date format\n */\n private isIsoDateString(value: string): boolean {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n return isoDateRegex.test(value) && !isNaN(Date.parse(value));\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { chevronRightIcon, chevronDownIcon, downloadIcon } from '@progress/kendo-svg-icons';\nimport { AttributeValueTypeDto, PropertyDisplayMode, BinaryDownloadEvent } from '../models/property-grid.models';\n\n/** Shape of binary linked value from OctoMesh */\ninterface BinaryLinkedValue {\n binaryId?: string;\n downloadUri?: string;\n filename?: string;\n size?: number;\n contentType?: string;\n}\n\n/**\n * Component for displaying property values with appropriate formatting\n */\n@Component({\n selector: 'mm-property-value-display',\n standalone: true,\n imports: [CommonModule, SVGIconModule, ButtonModule],\n template: `\n <div class=\"property-value-display\" [ngClass]=\"'type-' + type.toLowerCase()\">\n\n @if (isExpandableRecord()) {\n <div class=\"expandable-record\">\n <!-- Expand/Collapse Button and Summary -->\n <div class=\"record-header\" (click)=\"toggleExpansion()\">\n <kendo-svgicon\n [icon]=\"isExpanded ? chevronDownIcon : chevronRightIcon\"\n class=\"expand-icon\">\n </kendo-svgicon>\n <span class=\"record-summary\">{{ getRecordSummary() }}</span>\n <span class=\"type-indicator\" [title]=\"getTypeDescription()\">\n {{ getTypeIndicator() }}\n </span>\n </div>\n\n <!-- Expanded Content -->\n @if (isExpanded) {\n <div class=\"record-content\">\n @if (type === AttributeValueTypeDto.RecordArrayDto && Array.isArray(value)) {\n @for (item of value; track $index) {\n <div class=\"array-item\">\n <span class=\"array-index\">[{{ $index }}]</span>\n <div class=\"nested-properties\">\n @for (prop of getObjectProperties(item); track prop.key) {\n <div class=\"nested-property\">\n <span class=\"property-key\">{{ prop.key }}:</span>\n <mm-property-value-display\n [value]=\"prop.value\"\n [type]=\"getPropertyType(prop.value)\">\n </mm-property-value-display>\n </div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"nested-properties\">\n @for (prop of getObjectProperties(value); track prop.key) {\n <div class=\"nested-property\">\n <span class=\"property-key\">{{ prop.key }}:</span>\n <mm-property-value-display\n [value]=\"prop.value\"\n [type]=\"getPropertyType(prop.value)\">\n </mm-property-value-display>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (isBinaryLinkedWithDownload()) {\n <!-- Binary Linked with download capability -->\n <div class=\"binary-linked-display\">\n <div class=\"binary-info\">\n @if (getBinaryFilename()) {\n <span class=\"filename\">{{ getBinaryFilename() }}</span>\n }\n @if (getBinarySize()) {\n <span class=\"file-size\">({{ formatFileSize(getBinarySize()) }})</span>\n }\n @if (getBinaryContentType()) {\n <span class=\"content-type\">{{ getBinaryContentType() }}</span>\n }\n </div>\n <button\n kendoButton\n size=\"small\"\n fillMode=\"flat\"\n [svgIcon]=\"downloadIcon\"\n title=\"Download file\"\n (click)=\"onDownload()\">\n Download\n </button>\n </div>\n } @else {\n <!-- Non-expandable value display -->\n @switch (displayMode) {\n @case (PropertyDisplayMode.Json) {\n <pre class=\"json-display\">{{ getFormattedValue() }}</pre>\n }\n @case (PropertyDisplayMode.Text) {\n <span class=\"text-display\" [innerHTML]=\"getFormattedValue()\"></span>\n }\n @default {\n <span class=\"default-display\">{{ getFormattedValue() }}</span>\n }\n }\n\n @if (isComplexType() && !isExpandableRecord()) {\n <span class=\"type-indicator\" [title]=\"getTypeDescription()\">\n {{ getTypeIndicator() }}\n </span>\n }\n }\n </div>\n `,\n styles: [`\n .property-value-display {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-height: 20px;\n font-family: inherit;\n width: 100%;\n }\n\n .expandable-record {\n width: 100%;\n }\n\n .record-header {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .record-header:hover {\n background: var(--kendo-color-base-subtle);\n }\n\n .expand-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n transition: transform 0.2s;\n }\n\n .record-summary {\n flex: 1;\n font-size: 0.9em;\n }\n\n .record-content {\n margin-left: 22px;\n margin-top: 8px;\n border-left: 2px solid var(--kendo-color-border);\n padding-left: 12px;\n background: var(--kendo-color-base-subtle);\n border-radius: 0 4px 4px 0;\n }\n\n .nested-properties {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px;\n }\n\n .nested-property {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-height: 24px;\n }\n\n .property-key {\n font-weight: 500;\n color: var(--kendo-color-primary);\n min-width: 100px;\n flex-shrink: 0;\n font-size: 0.9em;\n }\n\n .array-item {\n border: 1px solid var(--kendo-color-border);\n border-radius: 4px;\n margin-bottom: 8px;\n background: transparent;\n }\n\n .array-index {\n display: inline-block;\n background: var(--kendo-color-primary);\n color: white;\n padding: 2px 8px;\n font-size: 0.8em;\n font-weight: bold;\n border-radius: 4px 0 4px 0;\n margin-bottom: 4px;\n }\n\n .json-display {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n margin: 0;\n padding: 4px 8px;\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n max-width: 300px;\n overflow: auto;\n }\n\n .text-display,\n .default-display {\n flex: 1;\n word-break: break-word;\n overflow-wrap: anywhere;\n }\n\n .type-boolean {\n .default-display {\n font-weight: 500;\n &.value-true { color: #28a745; }\n &.value-false { color: #dc3545; }\n }\n }\n\n .type-datetime,\n .type-datetimeoffset {\n .default-display {\n font-family: monospace;\n font-size: 0.9em;\n }\n }\n\n .type-int,\n .type-integer,\n .type-double {\n .default-display {\n font-family: monospace;\n text-align: right;\n }\n }\n\n .type-indicator {\n font-size: 0.75em;\n padding: 2px 6px;\n background: var(--kendo-color-primary);\n color: white;\n border-radius: 3px;\n text-transform: uppercase;\n font-weight: 500;\n flex-shrink: 0;\n }\n\n .empty-value {\n color: var(--kendo-color-subtle);\n font-style: italic;\n }\n\n .null-value {\n color: var(--kendo-color-error);\n font-style: italic;\n }\n\n .binary-linked-display {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n }\n\n .binary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .filename {\n font-weight: 500;\n color: var(--kendo-color-on-app-surface);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .file-size {\n font-size: 0.85em;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n\n .content-type {\n font-size: 0.75em;\n padding: 2px 6px;\n background: var(--kendo-color-base-subtle);\n border-radius: 3px;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n `]\n})\nexport class PropertyValueDisplayComponent implements OnInit {\n @Input() value: unknown;\n @Input() type: AttributeValueTypeDto = AttributeValueTypeDto.StringDto;\n @Input() displayMode: PropertyDisplayMode = PropertyDisplayMode.Text;\n\n /** Emitted when a binary download is requested */\n @Output() binaryDownload = new EventEmitter<BinaryDownloadEvent>();\n\n // Expansion state\n isExpanded = false;\n\n readonly PropertyDisplayMode = PropertyDisplayMode;\n readonly AttributeValueTypeDto = AttributeValueTypeDto;\n readonly Array = Array;\n readonly chevronRightIcon = chevronRightIcon;\n readonly chevronDownIcon = chevronDownIcon;\n readonly downloadIcon = downloadIcon;\n\n ngOnInit() {\n // Debug every property value display component creation\n console.log('PropertyValueDisplayComponent ngOnInit:', {\n type: this.type,\n value: this.value,\n valueType: typeof this.value,\n valueStringified: JSON.stringify(this.value),\n isExpandableRecord: this.isExpandableRecord()\n });\n }\n\n /**\n * Get formatted display value\n */\n getFormattedValue(): string {\n if (this.value === null) {\n return '<null>';\n }\n\n if (this.value === undefined) {\n return '<undefined>';\n }\n\n if (this.value === '') {\n return '<empty>';\n }\n\n switch (this.type) {\n case AttributeValueTypeDto.BooleanDto:\n return this.value ? '✓ True' : '✗ False';\n\n case AttributeValueTypeDto.DateTimeDto:\n case AttributeValueTypeDto.DateTimeOffsetDto:\n return this.formatDateTime(this.value);\n\n case AttributeValueTypeDto.StringArrayDto:\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return this.formatArray(this.value);\n\n case AttributeValueTypeDto.RecordDto:\n case AttributeValueTypeDto.RecordArrayDto:\n return this.displayMode === PropertyDisplayMode.Json\n ? JSON.stringify(this.value, null, 2)\n : this.formatObject(this.value);\n\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return this.formatBinary(this.value);\n\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.IntegerDto:\n case AttributeValueTypeDto.Integer_64Dto:\n case AttributeValueTypeDto.Int_64Dto:\n return this.formatNumber(this.value, 0);\n\n case AttributeValueTypeDto.DoubleDto:\n return this.formatNumber(this.value, 2);\n\n default:\n return String(this.value);\n }\n }\n\n /**\n * Check if this is an expandable record type\n */\n isExpandableRecord(): boolean {\n // Comprehensive debug logging\n console.log('PropertyValueDisplay: isExpandableRecord check:', {\n type: this.type,\n typeString: String(this.type),\n typeOf: typeof this.type,\n AttributeValueTypeDtoRecordDto: AttributeValueTypeDto.RecordDto,\n AttributeValueTypeDtoRecordArrayDto: AttributeValueTypeDto.RecordArrayDto,\n typeIsRecordDto: this.type === AttributeValueTypeDto.RecordDto,\n typeIsRecordDtoString: this.type === 'RECORD',\n typeIsRecordArrayDto: this.type === AttributeValueTypeDto.RecordArrayDto,\n value: this.value,\n valueType: typeof this.value,\n valueIsNull: this.value == null,\n valueKeys: this.value && typeof this.value === 'object' ? Object.keys(this.value) : 'not object'\n });\n\n // Check for record types\n const isRecordDto = this.type === AttributeValueTypeDto.RecordDto;\n const isRecordArrayDto = this.type === AttributeValueTypeDto.RecordArrayDto;\n const isRecordType = isRecordDto || isRecordArrayDto;\n\n // Simple check: does it have a value?\n const hasValue = this.value != null;\n\n // Simple check: is it an object or array?\n const isObjectLike = typeof this.value === 'object' && this.value != null;\n\n const result = isRecordType && hasValue && isObjectLike;\n\n console.log('PropertyValueDisplay: Expandable result:', {\n isRecordDto,\n isRecordArrayDto,\n isRecordType,\n hasValue,\n isObjectLike,\n finalResult: result\n });\n\n return result;\n }\n\n /**\n * Check if the type is complex (object/array)\n */\n isComplexType(): boolean {\n return [\n AttributeValueTypeDto.RecordDto,\n AttributeValueTypeDto.RecordArrayDto,\n AttributeValueTypeDto.StringArrayDto,\n AttributeValueTypeDto.IntegerArrayDto,\n AttributeValueTypeDto.IntArrayDto,\n AttributeValueTypeDto.BinaryDto,\n AttributeValueTypeDto.BinaryLinkedDto\n ].includes(this.type);\n }\n\n /**\n * Get type indicator text\n */\n getTypeIndicator(): string {\n switch (this.type) {\n case AttributeValueTypeDto.RecordDto:\n return 'RECORD';\n case AttributeValueTypeDto.RecordArrayDto:\n return 'ARR[RECORD]';\n case AttributeValueTypeDto.StringArrayDto:\n return 'ARR[STR]';\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return 'ARR[INT]';\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return 'BIN';\n default:\n return this.type.replace('_DTO', '').replace('DTO', '');\n }\n }\n\n /**\n * Get type description for tooltip\n */\n getTypeDescription(): string {\n switch (this.type) {\n case AttributeValueTypeDto.RecordDto:\n return 'Complex object';\n case AttributeValueTypeDto.RecordArrayDto:\n return 'Array of complex objects';\n case AttributeValueTypeDto.StringArrayDto:\n return 'Array of strings';\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return 'Array of numbers';\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return 'Binary data';\n default:\n return `Type: ${this.type}`;\n }\n }\n\n /**\n * Format date/time values\n */\n private formatDateTime(value: unknown): string {\n try {\n const date = value instanceof Date ? value : new Date(String(value));\n if (isNaN(date.getTime())) {\n return String(value);\n }\n return date.toLocaleString();\n } catch {\n return String(value);\n }\n }\n\n /**\n * Format array values\n */\n private formatArray(value: unknown): string {\n if (!Array.isArray(value)) {\n return String(value);\n }\n\n if (value.length === 0) {\n return '[]';\n }\n\n if (value.length <= 3) {\n return `[${value.join(', ')}]`;\n }\n\n return `[${value.slice(0, 3).join(', ')}, ... +${value.length - 3} more]`;\n }\n\n /**\n * Format object values\n */\n private formatObject(value: unknown): string {\n if (typeof value !== 'object' || value === null) {\n return String(value);\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 0) {\n return '{}';\n }\n\n if (keys.length <= 2) {\n const preview = keys.map(key => `${key}: ${this.truncateValue(obj[key])}`).join(', ');\n return `{${preview}}`;\n }\n\n return `{${keys.slice(0, 2).map(key => `${key}: ${this.truncateValue(obj[key])}`).join(', ')}, ... +${keys.length - 2} more}`;\n }\n\n /**\n * Format binary data\n */\n private formatBinary(value: unknown): string {\n if (value instanceof ArrayBuffer) {\n return `<Binary: ${value.byteLength} bytes>`;\n }\n if (typeof value === 'string' && value.startsWith('data:')) {\n return '<Base64 Data>';\n }\n return '<Binary Data>';\n }\n\n /**\n * Format numeric values\n */\n private formatNumber(value: unknown, decimals: number): string {\n const num = Number(value);\n if (isNaN(num)) {\n return String(value);\n }\n return decimals > 0 ? num.toFixed(decimals) : num.toString();\n }\n\n /**\n * Truncate long values for preview\n */\n private truncateValue(value: unknown): string {\n const str = String(value);\n return str.length > 20 ? str.substring(0, 20) + '...' : str;\n }\n\n /**\n * Toggle expansion state\n */\n toggleExpansion(): void {\n this.isExpanded = !this.isExpanded;\n }\n\n /**\n * Get summary text for record header\n */\n getRecordSummary(): string {\n if (this.type === AttributeValueTypeDto.RecordArrayDto && Array.isArray(this.value)) {\n return `Array with ${this.value.length} item${this.value.length !== 1 ? 's' : ''}`;\n }\n\n if (typeof this.value === 'object' && this.value !== null) {\n\n // Handle regular objects\n const keys = Object.keys(this.value);\n return `Object with ${keys.length} propert${keys.length !== 1 ? 'ies' : 'y'}`;\n }\n\n return 'Complex object';\n }\n\n /**\n * Get properties of an object for display\n */\n getObjectProperties(obj: unknown): {key: string, value: unknown}[] {\n if (typeof obj !== 'object' || obj === null) {\n return [];\n }\n\n if (Array.isArray(obj) && obj.length > 0 && typeof obj[0] === 'object' && obj[0] !== null && 'id' in obj[0] && obj[0].id === 'ckRecordId') {\n // Handle array of records\n return obj.map((item: Record<string, unknown>) => ({\n key: String(item['name']),\n value: item['value']\n }));\n }\n\n // Handle regular objects\n const record = obj as Record<string, unknown>;\n return Object.keys(record).map(key => ({\n key,\n value: record[key]\n }));\n }\n\n /**\n * Determine the appropriate type for a nested property value\n */\n getPropertyType(value: unknown): AttributeValueTypeDto {\n if (value === null || value === undefined) {\n return AttributeValueTypeDto.StringDto;\n }\n\n if (typeof value === 'boolean') {\n return AttributeValueTypeDto.BooleanDto;\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? AttributeValueTypeDto.IntegerDto : AttributeValueTypeDto.DoubleDto;\n }\n\n if (typeof value === 'string') {\n // Check if it looks like a date\n if (value.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/)) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n return AttributeValueTypeDto.StringDto;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null && 'id' in value[0] && value[0].id === 'ckRecordId') {\n return AttributeValueTypeDto.RecordDto;\n }\n if (value.length > 0 && typeof value[0] === 'object') {\n return AttributeValueTypeDto.RecordArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'string') {\n return AttributeValueTypeDto.StringArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'number') {\n return AttributeValueTypeDto.IntegerArrayDto;\n }\n return AttributeValueTypeDto.StringArrayDto; // fallback\n }\n\n\n return AttributeValueTypeDto.StringDto;\n }\n\n // ========== Binary Linked Methods ==========\n\n /**\n * Check if this is a BINARY_LINKED type with download capability\n */\n isBinaryLinkedWithDownload(): boolean {\n if (this.type !== AttributeValueTypeDto.BinaryLinkedDto) {\n return false;\n }\n\n // Check if value has binaryId or downloadUri (LargeBinaryInfo structure)\n return !!this.value && typeof this.value === 'object' && ('binaryId' in this.value || 'downloadUri' in this.value);\n }\n\n /**\n * Get the filename from binary info\n */\n getBinaryFilename(): string | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).filename || null;\n }\n\n /**\n * Get the file size from binary info\n */\n getBinarySize(): number | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).size || null;\n }\n\n /**\n * Get the content type from binary info\n */\n getBinaryContentType(): string | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).contentType || null;\n }\n\n /**\n * Format file size to human readable format\n */\n formatFileSize(bytes: number | null): string {\n if (bytes === null || bytes === undefined) {\n return '';\n }\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n let size = bytes;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(unitIndex > 0 ? 1 : 0)} ${units[unitIndex]}`;\n }\n\n /**\n * Handle download button click\n */\n onDownload(): void {\n if (!this.value || typeof this.value !== 'object') {\n console.warn('No binary value available');\n return;\n }\n\n const binaryValue = this.value as BinaryLinkedValue;\n\n // If downloadUri is available, open directly\n if (binaryValue.downloadUri) {\n window.open(binaryValue.downloadUri, '_blank', 'noopener,noreferrer');\n return;\n }\n\n // Otherwise, emit event for parent to handle (needs to load downloadUri)\n if (binaryValue.binaryId) {\n const event: BinaryDownloadEvent = {\n binaryId: binaryValue.binaryId,\n filename: binaryValue.filename,\n contentType: binaryValue.contentType\n };\n this.binaryDownload.emit(event);\n } else {\n console.warn('No binaryId or downloadUri available');\n }\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n SVGIcon,\n fileIcon,\n folderIcon,\n calendarIcon,\n checkboxCheckedIcon,\n listUnorderedIcon\n} from '@progress/kendo-svg-icons';\n\nimport { PropertyGridItem, PropertyGridConfig, PropertyChangeEvent, AttributeValueTypeDto, BinaryDownloadEvent } from '../models/property-grid.models';\nimport { PropertyValueDisplayComponent } from './property-value-display.component';\n\n/**\n * Generic property grid component for OctoMesh\n */\n@Component({\n selector: 'mm-property-grid',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n InputsModule,\n DropDownsModule,\n ButtonsModule,\n SVGIconModule,\n PropertyValueDisplayComponent\n ],\n template: `\n <div class=\"mm-property-grid\" [style.height]=\"config.height || '400px'\">\n\n @if (config.showSearch) {\n <div class=\"search-toolbar\">\n <kendo-textbox\n [(ngModel)]=\"searchTerm\"\n placeholder=\"Search attributes...\"\n (input)=\"onSearch()\"\n [clearButton]=\"true\">\n </kendo-textbox>\n </div>\n }\n\n <kendo-grid\n [data]=\"filteredData\"\n [sortable]=\"true\"\n [resizable]=\"true\"\n [style.height]=\"gridHeight\"\n [selectable]=\"{mode: 'single'}\"\n class=\"property-grid\">\n\n <!-- Property Name Column -->\n <kendo-grid-column\n field=\"displayName\"\n title=\"Property\"\n [width]=\"200\"\n [sortable]=\"true\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <div class=\"property-name-cell\">\n @if (config.showTypeIcons !== false) {\n <kendo-svgicon\n [icon]=\"getTypeIcon(dataItem.type)\"\n class=\"type-icon\">\n </kendo-svgicon>\n }\n <div class=\"property-info\">\n <span class=\"property-name\" [title]=\"dataItem.description\">\n {{ dataItem.displayName || dataItem.name }}\n </span>\n @if (dataItem.required) {\n <span class=\"required-indicator\">*</span>\n }\n @if (dataItem.readOnly) {\n <span class=\"readonly-indicator\" title=\"Read-only\">🔒</span>\n }\n </div>\n </div>\n </ng-template>\n </kendo-grid-column>\n\n <!-- Property Value Column -->\n <kendo-grid-column\n field=\"value\"\n title=\"Value\"\n [sortable]=\"false\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <mm-property-value-display\n [value]=\"dataItem.value\"\n [type]=\"dataItem.type\"\n (binaryDownload)=\"onBinaryDownload($event)\">\n </mm-property-value-display>\n </ng-template>\n </kendo-grid-column>\n\n <!-- Type Column (optional) -->\n @if (showTypeColumn) {\n <kendo-grid-column\n field=\"type\"\n title=\"Type\"\n [width]=\"120\"\n [sortable]=\"true\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <span class=\"type-badge\" [ngClass]=\"'type-' + dataItem.type.toLowerCase()\">\n {{ formatTypeName(dataItem.type) }}\n </span>\n </ng-template>\n </kendo-grid-column>\n }\n\n </kendo-grid>\n </div>\n `,\n styles: [`\n .mm-property-grid {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--kendo-color-border);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .search-toolbar {\n padding: 8px;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n }\n\n .property-grid {\n flex: 1;\n border: none;\n }\n\n .property-name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 24px;\n }\n\n .type-icon {\n width: 16px;\n height: 16px;\n opacity: 0.7;\n }\n\n .property-info {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n }\n\n .property-name {\n font-weight: 500;\n }\n\n .required-indicator {\n color: var(--kendo-color-error);\n font-weight: bold;\n }\n\n .readonly-indicator {\n font-size: 12px;\n opacity: 0.7;\n }\n\n .property-editor {\n width: 100%;\n min-width: 200px;\n }\n\n .validation-error {\n color: var(--kendo-color-error);\n font-size: 0.8em;\n margin-top: 4px;\n }\n\n .type-badge {\n font-size: 0.75em;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n font-weight: 500;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-base);\n }\n\n .grid-toolbar {\n padding: 8px;\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .changes-indicator {\n margin-left: auto;\n font-size: 0.9em;\n color: var(--kendo-color-primary);\n font-style: italic;\n }\n\n `]\n})\nexport class PropertyGridComponent implements OnInit, OnChanges {\n @Input() data: PropertyGridItem[] = [];\n @Input() config: PropertyGridConfig = {};\n @Input() showTypeColumn = false;\n\n @Output() propertyChange = new EventEmitter<PropertyChangeEvent>();\n @Output() saveRequested = new EventEmitter<PropertyGridItem[]>();\n @Output() binaryDownload = new EventEmitter<BinaryDownloadEvent>();\n\n // Component state\n filteredData: PropertyGridItem[] = [];\n searchTerm = '';\n hasChanges = false;\n pendingChanges: PropertyChangeEvent[] = [];\n\n // Icons\n readonly fileIcon = fileIcon;\n readonly folderIcon = folderIcon;\n readonly calendarIcon = calendarIcon;\n readonly checkboxCheckedIcon = checkboxCheckedIcon;\n readonly listUnorderedIcon = listUnorderedIcon;\n\n // Enum reference\n readonly AttributeValueTypeDto = AttributeValueTypeDto;\n\n ngOnInit() {\n this.updateFilteredData();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['data']) {\n this.updateFilteredData();\n this.hasChanges = false;\n this.pendingChanges = [];\n }\n }\n\n get gridHeight(): string {\n const baseHeight = this.config.height || '400px';\n const searchHeight = this.config.showSearch ? 40 : 0;\n const toolbarHeight = !this.config.readOnlyMode ? 50 : 0;\n const totalOffset = searchHeight + toolbarHeight;\n\n if (baseHeight.includes('px')) {\n const px = parseInt(baseHeight) - totalOffset;\n return `${Math.max(px, 200)}px`;\n }\n return baseHeight;\n }\n\n /**\n * Update filtered data based on search term\n */\n updateFilteredData() {\n if (!this.searchTerm.trim()) {\n this.filteredData = [...this.data];\n return;\n }\n\n const term = this.searchTerm.toLowerCase();\n this.filteredData = this.data.filter(item =>\n item.name.toLowerCase().includes(term) ||\n (item.displayName?.toLowerCase().includes(term)) ||\n (item.description?.toLowerCase().includes(term)) ||\n String(item.value).toLowerCase().includes(term)\n );\n }\n\n /**\n * Handle search input\n */\n onSearch() {\n this.updateFilteredData();\n }\n\n /**\n * Get appropriate icon for property type\n */\n getTypeIcon(type: AttributeValueTypeDto): SVGIcon {\n switch (type) {\n case AttributeValueTypeDto.BooleanDto:\n return checkboxCheckedIcon;\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.IntegerDto:\n case AttributeValueTypeDto.DoubleDto:\n return fileIcon;\n case AttributeValueTypeDto.DateTimeDto:\n case AttributeValueTypeDto.DateTimeOffsetDto:\n return calendarIcon;\n case AttributeValueTypeDto.StringArrayDto:\n case AttributeValueTypeDto.IntegerArrayDto:\n return listUnorderedIcon;\n case AttributeValueTypeDto.RecordDto:\n case AttributeValueTypeDto.RecordArrayDto:\n return folderIcon;\n default:\n return fileIcon;\n }\n }\n\n /**\n * Format type name for display\n */\n formatTypeName(type: AttributeValueTypeDto): string {\n return type.replace('_DTO', '').replace('DTO', '').replace('_', ' ');\n }\n\n /**\n * Save pending changes\n */\n saveChanges() {\n if (this.pendingChanges.length > 0) {\n const updatedData = this.data.map(item => {\n const change = this.pendingChanges.find(c => c.property.id === item.id);\n return change ? { ...item, value: change.newValue } : item;\n });\n\n this.saveRequested.emit(updatedData);\n this.hasChanges = false;\n this.pendingChanges = [];\n }\n }\n\n /**\n * Discard pending changes\n */\n discardChanges() {\n this.hasChanges = false;\n this.pendingChanges = [];\n this.updateFilteredData();\n }\n\n /**\n * Handle property value change\n */\n onPropertyChange(property: PropertyGridItem, oldValue: unknown, newValue: unknown) {\n const changeEvent: PropertyChangeEvent = {\n property,\n oldValue,\n newValue\n };\n\n // Update or add to pending changes\n const existingIndex = this.pendingChanges.findIndex(c => c.property.id === property.id);\n if (existingIndex >= 0) {\n this.pendingChanges[existingIndex] = changeEvent;\n } else {\n this.pendingChanges.push(changeEvent);\n }\n\n this.hasChanges = this.pendingChanges.length > 0;\n this.propertyChange.emit(changeEvent);\n }\n\n /**\n * Handle binary download request from property value display\n */\n onBinaryDownload(event: BinaryDownloadEvent): void {\n this.binaryDownload.emit(event);\n }\n}\n","// Models\nexport * from './models/property-grid.models';\n\n// Services\nexport * from './services/property-converter.service';\n\n// Components\nexport * from './components/property-grid.component';\nexport * from './components/property-value-display.component';","import { Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowRef, WindowModule } from '@progress/kendo-angular-dialog';\nimport { GridModule, GridDataResult, SelectionEvent, PageChangeEvent, RowArgs, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { LoaderModule } from '@progress/kendo-angular-indicators';\nimport { searchIcon, filterClearIcon } from '@progress/kendo-svg-icons';\nimport { CkTypeSelectorService, CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface CkTypeSelectorDialogData {\n selectedCkTypeId?: string;\n ckModelIds?: string[];\n dialogTitle?: string;\n allowAbstract?: boolean;\n derivedFromRtCkTypeId?: string;\n}\n\nexport interface CkTypeSelectorDialogResult {\n selectedCkType: CkTypeSelectorItem;\n}\n\n@Component({\n selector: 'mm-ck-type-selector-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n IconsModule,\n LoaderModule,\n WindowModule\n ],\n template: `\n <div class=\"ck-type-selector-container\">\n <div class=\"filter-container\">\n <div class=\"filter-row\">\n <div class=\"filter-item\" *ngIf=\"!derivedFromRtCkTypeId\">\n <label>Model Filter</label>\n <kendo-combobox\n [data]=\"availableModels\"\n [(ngModel)]=\"selectedModel\"\n (valueChange)=\"onModelFilterChange($event)\"\n [allowCustom]=\"false\"\n [clearButton]=\"true\"\n placeholder=\"All Models\"\n class=\"filter-input\">\n </kendo-combobox>\n </div>\n <div class=\"filter-item flex-grow\">\n <label>Type Search</label>\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search types...\"\n class=\"filter-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\" size=\"small\"></button>\n </ng-template>\n </kendo-textbox>\n </div>\n <div class=\"filter-item filter-actions\">\n <label>&nbsp;</label>\n <button kendoButton [svgIcon]=\"filterClearIcon\" (click)=\"clearFilters()\" title=\"Clear filters\"></button>\n </div>\n </div>\n </div>\n\n <div class=\"grid-container\">\n <kendo-grid\n [data]=\"gridData\"\n [loading]=\"isLoading\"\n [selectable]=\"{ mode: 'single' }\"\n [pageable]=\"{ pageSizes: [25, 50, 100] }\"\n [pageSize]=\"pageSize\"\n [skip]=\"skip\"\n (pageChange)=\"onPageChange($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (cellClick)=\"onCellClick($event)\"\n [kendoGridSelectBy]=\"selectItemBy\"\n [(selectedKeys)]=\"selectedKeys\"\n class=\"type-grid\">\n <kendo-grid-column field=\"rtCkTypeId\" title=\"Type\" [width]=\"300\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span [class.abstract-type]=\"dataItem.isAbstract\" [class.final-type]=\"dataItem.isFinal\">\n {{ dataItem.rtCkTypeId }}\n </span>\n <span *ngIf=\"dataItem.isAbstract\" class=\"type-badge abstract\">abstract</span>\n <span *ngIf=\"dataItem.isFinal\" class=\"type-badge final\">final</span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"baseTypeRtCkTypeId\" title=\"Base Type\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n {{ dataItem.baseTypeRtCkTypeId || '-' }}\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\">\n <ng-template kendoGridCellTemplate let-dataItem>\n {{ dataItem.description || '-' }}\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"selection-info\" *ngIf=\"selectedType\">\n <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}\n </div>\n\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" [disabled]=\"!selectedType || (selectedType.isAbstract && !allowAbstract)\" (click)=\"onConfirm()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .ck-type-selector-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n padding: 20px;\n box-sizing: border-box;\n gap: 12px;\n }\n\n .filter-container {\n margin-bottom: 16px;\n flex-shrink: 0;\n }\n\n .filter-row {\n display: flex;\n gap: 16px;\n align-items: flex-end;\n }\n\n .filter-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .filter-item label {\n font-size: 12px;\n font-weight: 500;\n }\n\n .filter-item.flex-grow {\n flex: 1;\n }\n\n .filter-item.filter-actions {\n flex-shrink: 0;\n }\n\n .filter-input {\n min-width: 180px;\n }\n\n .grid-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .grid-container kendo-grid,\n .grid-container .type-grid {\n flex: 1;\n min-height: 200px;\n }\n\n .type-grid {\n border-radius: 4px;\n }\n\n .type-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .abstract-type {\n font-style: italic;\n opacity: 0.7;\n }\n\n .final-type {\n font-weight: 600;\n }\n\n .type-badge {\n display: inline-block;\n font-size: 10px;\n padding: 1px 6px;\n border-radius: 10px;\n margin-left: 8px;\n text-transform: uppercase;\n }\n\n .type-badge.abstract {\n background-color: var(--kendo-color-warning, #ffc107);\n color: var(--kendo-color-on-warning, #000);\n opacity: 0.8;\n }\n\n .type-badge.final {\n background-color: var(--kendo-color-success, #28a745);\n color: var(--kendo-color-on-success, #fff);\n opacity: 0.8;\n }\n\n .selection-info {\n margin-top: 12px;\n padding: 8px 12px;\n background: var(--kendo-color-success-subtle, #d4edda);\n border: 1px solid var(--kendo-color-success, #28a745);\n border-radius: 4px;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 20px 0 20px;\n flex-shrink: 0;\n }\n `]\n})\nexport class CkTypeSelectorDialogComponent implements OnInit, OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private searchSubject = new Subject<string>();\n private subscriptions = new Subscription();\n\n protected readonly searchIcon = searchIcon;\n protected readonly filterClearIcon = filterClearIcon;\n\n public dialogTitle = 'Select Construction Kit Type';\n public allowAbstract = true;\n\n public searchText = '';\n public selectedModel: string | null = null;\n public availableModels: string[] = [];\n\n public gridData: GridDataResult = { data: [], total: 0 };\n public isLoading = false;\n public pageSize = 50;\n public skip = 0;\n\n public selectedKeys: string[] = [];\n public selectedType: CkTypeSelectorItem | null = null;\n\n // Selection key function - returns fullName as unique identifier\n public selectItemBy = (context: RowArgs): string => (context.dataItem as CkTypeSelectorItem).fullName;\n\n private initialCkModelIds?: string[];\n public derivedFromRtCkTypeId?: string;\n private lastClickTime = 0;\n private lastClickRtCkTypeId: string | null = null;\n\n /** Data passed from the service */\n public data?: CkTypeSelectorDialogData;\n\n ngOnInit(): void {\n if (this.data) {\n this.dialogTitle = this.data.dialogTitle || 'Select Construction Kit Type';\n this.allowAbstract = this.data.allowAbstract ?? true;\n this.initialCkModelIds = this.data.ckModelIds;\n this.derivedFromRtCkTypeId = this.data.derivedFromRtCkTypeId;\n\n if (this.data.selectedCkTypeId) {\n this.selectedKeys = [this.data.selectedCkTypeId];\n }\n }\n\n // Set up search debouncing\n this.subscriptions.add(\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(() => {\n this.skip = 0;\n this.loadTypes();\n })\n );\n\n // Load initial types and extract available models\n this.loadTypes();\n if (!this.derivedFromRtCkTypeId) {\n this.loadAvailableModels();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n private loadTypes(): void {\n this.isLoading = true;\n\n const source$ = this.derivedFromRtCkTypeId\n ? this.ckTypeSelectorService.getDerivedCkTypes(this.derivedFromRtCkTypeId, {\n searchText: this.searchText || undefined\n })\n : this.ckTypeSelectorService.getCkTypes({\n ckModelIds: this.selectedModel ? [this.selectedModel] : this.initialCkModelIds,\n searchText: this.searchText || undefined,\n first: this.pageSize,\n skip: this.skip\n });\n\n this.subscriptions.add(\n source$.subscribe({\n next: result => {\n this.gridData = {\n data: result.items,\n total: result.totalCount\n };\n\n // Restore selection if exists\n if (this.selectedKeys.length > 0) {\n const selectedItem = result.items.find(item => item.fullName === this.selectedKeys[0]);\n if (selectedItem) {\n this.selectedType = selectedItem;\n }\n }\n\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n this.gridData = { data: [], total: 0 };\n }\n })\n );\n }\n\n private loadAvailableModels(): void {\n // Load all types to extract unique models\n this.subscriptions.add(\n this.ckTypeSelectorService.getCkTypes({\n first: 1000\n }).subscribe(result => {\n const modelSet = new Set<string>();\n result.items.forEach(item => {\n // Extract model from fullName (format: \"ModelName-Version/TypeName-Version\")\n const modelMatch = item.fullName.match(/^([^/]+)\\//);\n if (modelMatch) {\n modelSet.add(modelMatch[1]);\n }\n });\n this.availableModels = Array.from(modelSet).sort();\n })\n );\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onModelFilterChange(_value: string | null): void {\n this.skip = 0;\n this.loadTypes();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedModel = null;\n this.skip = 0;\n this.loadTypes();\n }\n\n public onPageChange(event: PageChangeEvent): void {\n this.skip = event.skip;\n this.pageSize = event.take;\n this.loadTypes();\n }\n\n public onSelectionChange(event: SelectionEvent): void {\n const selectedItems = event.selectedRows;\n if (selectedItems && selectedItems.length > 0) {\n this.selectedType = selectedItems[0].dataItem as CkTypeSelectorItem;\n } else {\n this.selectedType = null;\n }\n }\n\n public onCellClick(event: CellClickEvent): void {\n const item = event.dataItem as CkTypeSelectorItem;\n const now = Date.now();\n if (item && item.rtCkTypeId === this.lastClickRtCkTypeId && (now - this.lastClickTime) < 400) {\n // Double-click detected\n if (!item.isAbstract || this.allowAbstract) {\n this.selectedType = item;\n this.onConfirm();\n }\n }\n this.lastClickTime = now;\n this.lastClickRtCkTypeId = item?.rtCkTypeId ?? null;\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n\n public onConfirm(): void {\n if (this.selectedType) {\n const result: CkTypeSelectorDialogResult = {\n selectedCkType: this.selectedType\n };\n this.windowRef.close(result);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n CkTypeSelectorDialogComponent,\n CkTypeSelectorDialogData,\n CkTypeSelectorDialogResult\n} from './ck-type-selector-dialog.component';\n\nexport interface CkTypeSelectorResult {\n confirmed: boolean;\n selectedCkType: CkTypeSelectorItem | null;\n}\n\n@Injectable()\nexport class CkTypeSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the CkType selector dialog\n * @param options Dialog options\n * @returns Promise that resolves with the result containing selected CkType and confirmation status\n */\n public async openCkTypeSelector(options: {\n selectedCkTypeId?: string;\n ckModelIds?: string[];\n dialogTitle?: string;\n allowAbstract?: boolean;\n derivedFromRtCkTypeId?: string;\n } = {}): Promise<CkTypeSelectorResult> {\n const data: CkTypeSelectorDialogData = {\n selectedCkTypeId: options.selectedCkTypeId,\n ckModelIds: options.ckModelIds,\n dialogTitle: options.dialogTitle,\n allowAbstract: options.allowAbstract,\n derivedFromRtCkTypeId: options.derivedFromRtCkTypeId\n };\n\n const size = this.windowStateService.resolveWindowSize('ck-type-selector', { width: 900, height: 650 });\n\n const windowRef = this.windowService.open({\n content: CkTypeSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 750,\n minHeight: 550,\n resizable: true,\n title: options.dialogTitle || 'Select Construction Kit Type'\n });\n\n this.windowStateService.applyModalBehavior('ck-type-selector', windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: CkTypeSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n\n if (result && typeof result === 'object' && 'selectedCkType' in result) {\n const dialogResult = result as CkTypeSelectorDialogResult;\n return {\n confirmed: true,\n selectedCkType: dialogResult.selectedCkType\n };\n } else {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n inject,\n ElementRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormControl,\n ReactiveFormsModule,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n Validator,\n AbstractControl,\n ValidationErrors,\n NG_VALIDATORS\n} from '@angular/forms';\nimport { AutoCompleteModule, AutoCompleteComponent, PopupSettings } from '@progress/kendo-angular-dropdowns';\nimport { LoaderModule } from '@progress/kendo-angular-indicators';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { IconsModule, SVGIconModule } from '@progress/kendo-angular-icons';\nimport { searchIcon } from '@progress/kendo-svg-icons';\nimport { CkTypeSelectorService, CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap, catchError } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { CkTypeSelectorDialogService } from '../ck-type-selector-dialog/ck-type-selector-dialog.service';\n\n@Component({\n selector: 'mm-ck-type-selector-input',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AutoCompleteModule,\n LoaderModule,\n ButtonsModule,\n IconsModule,\n SVGIconModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CkTypeSelectorInputComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => CkTypeSelectorInputComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"ck-type-select-wrapper\" [class.disabled]=\"disabled\">\n <kendo-autocomplete\n #autocomplete\n [formControl]=\"searchFormControl\"\n [data]=\"filteredTypes\"\n [loading]=\"isLoading\"\n [placeholder]=\"placeholder\"\n [suggest]=\"true\"\n [clearButton]=\"true\"\n [filterable]=\"true\"\n [popupSettings]=\"popupSettings\"\n (filterChange)=\"onFilterChange($event)\"\n (valueChange)=\"onSelectionChange($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n class=\"ck-type-autocomplete\">\n\n <ng-template kendoAutoCompleteItemTemplate let-dataItem>\n <div class=\"ck-type-item\">\n {{ dataItem }}\n </div>\n </ng-template>\n\n <ng-template kendoAutoCompleteNoDataTemplate>\n <div class=\"no-data-message\">\n <span *ngIf=\"!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength\">\n No types found for \"{{ searchFormControl.value }}\"\n </span>\n <span *ngIf=\"!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)\">\n Type at least {{ minSearchLength }} characters to search...\n </span>\n </div>\n </ng-template>\n\n <ng-template kendoAutoCompleteFooterTemplate>\n <div class=\"advanced-search-footer\" (click)=\"openDialog($event)\">\n <kendo-svg-icon [icon]=\"searchIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ advancedSearchLabel }}</span>\n </div>\n </ng-template>\n\n </kendo-autocomplete>\n\n <button\n kendoButton\n type=\"button\"\n [svgIcon]=\"searchIcon\"\n [disabled]=\"disabled\"\n [title]=\"advancedSearchLabel\"\n class=\"dialog-button\"\n (click)=\"openDialog()\">\n </button>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .ck-type-select-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n }\n\n .ck-type-select-wrapper.disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .ck-type-autocomplete {\n flex: 1;\n min-width: 0;\n }\n\n .dialog-button {\n flex-shrink: 0;\n height: 30px;\n width: 30px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .ck-type-item {\n padding: 4px 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-data-message {\n padding: 8px 12px;\n color: var(--kendo-color-subtle);\n font-style: italic;\n text-align: center;\n }\n\n .advanced-search-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--kendo-color-primary);\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface-alt);\n transition: background-color 0.2s;\n }\n\n .advanced-search-footer:hover {\n background: var(--kendo-color-base-hover);\n }\n `]\n})\nexport class CkTypeSelectorInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {\n @ViewChild('autocomplete', { static: true }) autocomplete!: AutoCompleteComponent;\n\n @Input() placeholder = 'Select a CK type...';\n @Input() minSearchLength = 2;\n @Input() maxResults = 50;\n @Input() debounceMs = 300;\n @Input() ckModelIds?: string[];\n @Input() allowAbstract = true;\n @Input() dialogTitle = 'Select Construction Kit Type';\n @Input() advancedSearchLabel = 'Advanced Search...';\n @Input() derivedFromRtCkTypeId?: string;\n\n private _disabled = false;\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = !!value;\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n }\n\n private _required = false;\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = !!value;\n }\n\n @Output() ckTypeSelected = new EventEmitter<CkTypeSelectorItem>();\n @Output() ckTypeCleared = new EventEmitter<void>();\n\n public searchFormControl = new FormControl();\n public filteredTypes: string[] = [];\n public selectedCkType: CkTypeSelectorItem | null = null;\n public isLoading = false;\n private typeMap = new Map<string, CkTypeSelectorItem>();\n\n private searchSubject = new Subject<string>();\n private subscriptions = new Subscription();\n private onChange: (value: CkTypeSelectorItem | null) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n protected readonly searchIcon = searchIcon;\n protected popupSettings: PopupSettings = { appendTo: 'root', popupClass: 'mm-ck-type-popup' };\n\n private static popupStyleInjected = false;\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly dialogService = inject(CkTypeSelectorDialogService, { optional: true });\n private readonly elementRef = inject(ElementRef);\n\n ngOnInit(): void {\n this.setupSearch();\n this.injectPopupStyles();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.searchSubject.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: CkTypeSelectorItem | null): void {\n if (value !== this.selectedCkType) {\n this.selectedCkType = value;\n if (value) {\n // Ensure the value is in the data list so the autocomplete can display it\n if (!this.typeMap.has(value.rtCkTypeId)) {\n this.typeMap.set(value.rtCkTypeId, value);\n this.filteredTypes = [value.rtCkTypeId];\n }\n this.searchFormControl.setValue(value.rtCkTypeId, { emitEvent: false });\n } else {\n this.searchFormControl.setValue('', { emitEvent: false });\n }\n }\n }\n\n registerOnChange(fn: (value: CkTypeSelectorItem | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this.selectedCkType) {\n return { required: true };\n }\n\n const value = control.value;\n if (value && typeof value === 'string') {\n return { invalidCkType: true };\n }\n\n return null;\n }\n\n // Event handlers\n onFilterChange(filter: string): void {\n if (!filter || filter.length < this.minSearchLength) {\n this.filteredTypes = [];\n return;\n }\n\n this.searchSubject.next(filter);\n }\n\n onSelectionChange(value: string): void {\n if (value && typeof value === 'string') {\n const ckType = this.typeMap.get(value);\n if (ckType) {\n this.selectCkType(ckType);\n }\n }\n }\n\n onFocus(): void {\n const currentValue = this.searchFormControl.value;\n if (currentValue && currentValue.length >= this.minSearchLength && this.filteredTypes.length === 0) {\n this.searchSubject.next(currentValue);\n }\n }\n\n onBlur(): void {\n this.onTouched();\n\n if (this.filteredTypes.length === 1 && !this.selectedCkType) {\n const displayText = this.filteredTypes[0];\n const ckType = this.typeMap.get(displayText);\n if (ckType) {\n this.selectCkType(ckType);\n }\n }\n }\n\n // Public methods\n public clear(): void {\n this.selectedCkType = null;\n this.filteredTypes = [];\n this.typeMap.clear();\n this.searchFormControl.setValue('', { emitEvent: false });\n this.onChange(null);\n this.ckTypeCleared.emit();\n this.autocomplete.focus();\n }\n\n public focus(): void {\n if (this.autocomplete) {\n this.autocomplete.focus();\n }\n }\n\n public reset(): void {\n this.clear();\n }\n\n // Private methods\n private setupSearch(): void {\n this.subscriptions.add(\n this.searchSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isLoading = true;\n this.filteredTypes = [];\n }),\n switchMap(filter => {\n const source$ = this.derivedFromRtCkTypeId\n ? this.ckTypeSelectorService.getDerivedCkTypes(this.derivedFromRtCkTypeId, {\n searchText: filter\n })\n : this.ckTypeSelectorService.getCkTypes({\n ckModelIds: this.ckModelIds,\n searchText: filter,\n first: this.maxResults\n });\n return source$.pipe(\n catchError(error => {\n console.error('CK type search error:', error);\n return of({ items: [], totalCount: 0 });\n })\n );\n })\n ).subscribe(result => {\n this.isLoading = false;\n\n // Filter out abstract types if not allowed\n let items = result.items;\n if (!this.allowAbstract) {\n items = items.filter(item => !item.isAbstract);\n }\n\n this.filteredTypes = items.map(item => item.rtCkTypeId);\n this.typeMap = new Map(items.map(item => [item.rtCkTypeId, item]));\n })\n );\n }\n\n private injectPopupStyles(): void {\n if (CkTypeSelectorInputComponent.popupStyleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-mm-ck-type-popup', '');\n style.textContent = `\n .mm-ck-type-popup {\n max-width: 500px !important;\n min-width: 0 !important;\n }\n .mm-ck-type-popup .k-child-animation-container {\n max-width: 500px !important;\n }\n .mm-ck-type-popup .k-list-item {\n padding: 4px 12px !important;\n min-height: 0 !important;\n font-size: 13px !important;\n line-height: 20px !important;\n }\n `;\n document.head.appendChild(style);\n CkTypeSelectorInputComponent.popupStyleInjected = true;\n }\n\n private selectCkType(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.searchFormControl.setValue(ckType.rtCkTypeId, { emitEvent: false });\n this.filteredTypes = [];\n this.onChange(ckType);\n this.ckTypeSelected.emit(ckType);\n this.autocomplete.toggle(false);\n }\n\n // Dialog\n public async openDialog(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!this.dialogService) {\n console.warn('CkTypeSelectorDialogService not available');\n return;\n }\n\n this.autocomplete.toggle(false);\n\n const result = await this.dialogService.openCkTypeSelector({\n selectedCkTypeId: this.selectedCkType?.fullName,\n ckModelIds: this.ckModelIds,\n dialogTitle: this.dialogTitle,\n allowAbstract: this.allowAbstract,\n derivedFromRtCkTypeId: this.derivedFromRtCkTypeId\n });\n\n if (result.confirmed && result.selectedCkType) {\n this.selectCkType(result.selectedCkType);\n }\n }\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowModule, WindowRef } from '@progress/kendo-angular-dialog';\nimport { GridModule, GridDataResult, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { arrowRightIcon, arrowLeftIcon, searchIcon, arrowUpIcon, arrowDownIcon, chevronDoubleRightIcon, chevronDoubleLeftIcon } from '@progress/kendo-svg-icons';\nimport { AttributeSelectorService, AttributeItem, AttributeValueTypeDto } from '@meshmakers/octo-services';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface AttributeSelectorDialogData {\n rtCkTypeId: string;\n selectedAttributes?: string[];\n dialogTitle?: string;\n singleSelect?: boolean;\n includeNavigationProperties?: boolean;\n maxDepth?: number;\n /** Additional virtual attributes to include in the available list (e.g., Timestamp for stream data queries) */\n additionalAttributes?: AttributeItem[];\n /** When true, hides the navigation properties checkbox and max depth controls */\n hideNavigationControls?: boolean;\n /** When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching) */\n attributePaths?: string[];\n}\n\nexport interface AttributeSelectorDialogResult {\n selectedAttributes: AttributeItem[];\n}\n\ninterface ValueTypeFilterOption {\n text: string;\n value: AttributeValueTypeDto | null;\n}\n\n@Component({\n selector: 'mm-attribute-selector-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownListModule,\n IconsModule,\n WindowModule\n ],\n template: `\n <div class=\"attribute-selector-container\">\n <div class=\"filter-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search path & description...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\n <kendo-dropdownlist\n [data]=\"valueTypeOptions\"\n [(ngModel)]=\"selectedValueTypeFilter\"\n (valueChange)=\"onValueTypeFilterChange($event)\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"type-filter-dropdown\">\n </kendo-dropdownlist>\n </div>\n\n @if (!hideNavigationControls) {\n <div class=\"options-container\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"includeNavigationProperties\"\n (ngModelChange)=\"onNavigationPropertiesChange()\" />\n <label class=\"option-label\">Include Navigation Properties</label>\n\n <kendo-numerictextbox\n [(ngModel)]=\"maxDepth\"\n [min]=\"1\" [max]=\"5\" [step]=\"1\" [format]=\"'n0'\"\n [placeholder]=\"'Depth'\"\n [spinners]=\"true\"\n [disabled]=\"!includeNavigationProperties\"\n (valueChange)=\"onMaxDepthChange($event)\"\n class=\"depth-input\">\n </kendo-numerictextbox>\n <label class=\"option-label\">Max Depth</label>\n </div>\n }\n\n <div class=\"lists-container\" *ngIf=\"!singleSelect\">\n <div class=\"list-section\">\n <h4>Available Attributes</h4>\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'multiple', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"action-buttons\">\n <button\n kendoButton\n [svgIcon]=\"arrowRightIcon\"\n [disabled]=\"selectedAvailableKeys.length === 0\"\n (click)=\"addSelected()\"\n title=\"Add selected\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"arrowLeftIcon\"\n [disabled]=\"selectedChosenKeys.length === 0\"\n (click)=\"removeSelected()\"\n title=\"Remove selected\">\n </button>\n <div class=\"separator\"></div>\n <button\n kendoButton\n [svgIcon]=\"chevronDoubleRightIcon\"\n [disabled]=\"availableAttributes.length === 0\"\n (click)=\"addAll()\"\n title=\"Add all\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"chevronDoubleLeftIcon\"\n [disabled]=\"selectedAttributes.length === 0\"\n (click)=\"removeAll()\"\n title=\"Remove all\">\n </button>\n </div>\n\n <div class=\"list-section\">\n <h4>Selected Attributes ({{ selectedAttributes.length }})</h4>\n <kendo-grid\n [data]=\"selectedGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\n <span class=\"order-number\">{{ rowIndex + 1 }}.</span>\n {{ dataItem.attributePath }}\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"order-buttons\">\n <button\n kendoButton\n [svgIcon]=\"arrowUpIcon\"\n [disabled]=\"!canMoveUp()\"\n (click)=\"moveUp()\"\n title=\"Move up\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"arrowDownIcon\"\n [disabled]=\"!canMoveDown()\"\n (click)=\"moveDown()\"\n title=\"Move down\">\n </button>\n </div>\n </div>\n\n <div class=\"single-select-container\" *ngIf=\"singleSelect\">\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedSingleKey\"\n (cellClick)=\"onSingleSelectCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"action-bar\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" [disabled]=\"singleSelect && selectedSingleKey.length === 0\" (click)=\"onConfirm()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .attribute-selector-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .filter-container {\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .search-input {\n flex: 1;\n }\n\n .type-filter-dropdown {\n width: 160px;\n flex-shrink: 0;\n }\n\n .options-container {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n flex-shrink: 0;\n }\n\n .option-label {\n cursor: pointer;\n }\n\n .depth-input {\n width: 90px;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .list-section h4 {\n margin: 0 0 10px 0;\n font-size: 0.85rem;\n font-weight: 600;\n flex-shrink: 0;\n }\n\n .attribute-grid {\n border-radius: 4px;\n flex: 1;\n min-height: 200px;\n }\n\n .attribute-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .action-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n justify-content: center;\n padding: 0 8px;\n padding-top: 32px;\n }\n\n .separator {\n height: 1px;\n background-color: var(--kendo-color-border, #dee2e6);\n margin: 8px 0;\n }\n\n .order-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n justify-content: center;\n padding: 0 8px;\n padding-top: 32px;\n }\n\n .order-number {\n color: var(--kendo-color-primary, #ff6358);\n font-weight: 600;\n margin-right: 8px;\n min-width: 24px;\n display: inline-block;\n }\n\n .single-select-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .single-select-container .attribute-grid {\n flex: 1;\n }\n\n .action-bar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #dee2e6);\n }\n `]\n})\nexport class AttributeSelectorDialogComponent implements OnInit {\n private readonly windowRef = inject(WindowRef);\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n protected readonly arrowRightIcon = arrowRightIcon;\n protected readonly arrowLeftIcon = arrowLeftIcon;\n protected readonly chevronDoubleRightIcon = chevronDoubleRightIcon;\n protected readonly chevronDoubleLeftIcon = chevronDoubleLeftIcon;\n protected readonly searchIcon = searchIcon;\n protected readonly arrowUpIcon = arrowUpIcon;\n protected readonly arrowDownIcon = arrowDownIcon;\n\n public data!: AttributeSelectorDialogData;\n public dialogTitle = 'Select Attributes';\n public rtCkTypeId!: string;\n public singleSelect = false;\n private additionalAttributes: AttributeItem[] = [];\n public searchText = '';\n public selectedSingleKey: string[] = [];\n public selectedValueTypeFilter: AttributeValueTypeDto | null = null;\n public includeNavigationProperties = true;\n public maxDepth: number | null = null;\n public hideNavigationControls = false;\n private attributePathsSet: Set<string> | null = null;\n\n public availableAttributes: AttributeItem[] = [];\n public selectedAttributes: AttributeItem[] = [];\n\n public availableGridData: GridDataResult = { data: [], total: 0 };\n public selectedGridData: GridDataResult = { data: [], total: 0 };\n\n public selectedAvailableKeys: string[] = [];\n public selectedChosenKeys: string[] = [];\n\n public valueTypeOptions: ValueTypeFilterOption[] = [\n { text: 'All Types', value: null },\n { text: 'String', value: AttributeValueTypeDto.StringDto },\n { text: 'Integer', value: AttributeValueTypeDto.IntegerDto },\n { text: 'Double', value: AttributeValueTypeDto.DoubleDto },\n { text: 'Boolean', value: AttributeValueTypeDto.BooleanDto },\n { text: 'DateTime', value: AttributeValueTypeDto.DateTimeDto },\n { text: 'DateTimeOffset', value: AttributeValueTypeDto.DateTimeOffsetDto },\n { text: 'Enum', value: AttributeValueTypeDto.EnumDto },\n { text: 'TimeSpan', value: AttributeValueTypeDto.TimeSpanDto }\n ];\n\n // Double-click tracking\n private lastClickTime = 0;\n private lastClickedItem: string | null = null;\n private readonly doubleClickDelay = 300; // milliseconds\n\n ngOnInit(): void {\n if (this.data) {\n this.rtCkTypeId = this.data.rtCkTypeId;\n this.dialogTitle = this.data.dialogTitle || 'Select Attributes';\n this.singleSelect = this.data.singleSelect ?? false;\n this.includeNavigationProperties = this.data.includeNavigationProperties ?? true;\n this.maxDepth = this.data.maxDepth ?? null;\n this.additionalAttributes = this.data.additionalAttributes ?? [];\n this.hideNavigationControls = this.data.hideNavigationControls ?? false;\n this.attributePathsSet = this.data.attributePaths ? new Set(this.data.attributePaths) : null;\n\n if (this.data.selectedAttributes && this.data.selectedAttributes.length > 0) {\n if (this.singleSelect) {\n this.selectedSingleKey = [this.data.selectedAttributes[0]];\n } else {\n // Pre-populate selected attributes if provided\n this.loadInitialSelectedAttributes(this.data.selectedAttributes);\n }\n }\n }\n\n // Set up search debouncing\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(searchText => {\n this.loadAvailableAttributes(searchText);\n });\n\n // Load initial attributes\n this.loadAvailableAttributes();\n }\n\n private loadAvailableAttributes(searchTerm?: string): void {\n this.attributeService.getAvailableAttributes(\n this.rtCkTypeId, undefined, undefined, undefined,\n this.selectedValueTypeFilter || undefined,\n searchTerm || undefined,\n this.includeNavigationProperties,\n this.maxDepth ?? undefined\n ).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n\n // Apply client-side attribute path restriction if set (additionalAttributes bypass this filter intentionally)\n const filteredItems = this.attributePathsSet\n ? result.items.filter(item => this.attributePathsSet!.has(item.attributePath))\n : result.items;\n\n // Include additional virtual attributes (e.g., Timestamp for stream data), filtered by search/type\n const filteredAdditional = this.additionalAttributes.filter(attr => {\n if (selectedPaths.has(attr.attributePath)) return false;\n if (searchTerm && !attr.attributePath.toLowerCase().includes(searchTerm.toLowerCase())) return false;\n if (this.selectedValueTypeFilter && attr.attributeValueType !== this.selectedValueTypeFilter) return false;\n return true;\n });\n\n this.availableAttributes = [\n ...filteredAdditional,\n ...filteredItems.filter(item => !selectedPaths.has(item.attributePath))\n ];\n this.updateAvailableGrid();\n });\n }\n\n private loadInitialSelectedAttributes(attributePaths: string[]): void {\n // Load all attributes to get the details for selected ones\n this.attributeService.getAvailableAttributes(this.rtCkTypeId).subscribe(result => {\n // Create a map for quick lookup, including additional virtual attributes\n const attributeMap = new Map(result.items.map(item => [item.attributePath, item]));\n for (const attr of this.additionalAttributes) {\n attributeMap.set(attr.attributePath, attr);\n }\n\n // Preserve the order from attributePaths\n this.selectedAttributes = attributePaths\n .map(path => attributeMap.get(path))\n .filter((item): item is AttributeItem => item !== undefined);\n\n this.updateSelectedGrid();\n\n // Filter out selected from available\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n this.availableAttributes = [\n ...this.additionalAttributes.filter(attr => !selectedPaths.has(attr.attributePath)),\n ...result.items.filter(item => !selectedPaths.has(item.attributePath))\n ];\n this.updateAvailableGrid();\n });\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onValueTypeFilterChange(_value: AttributeValueTypeDto | null): void {\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public onNavigationPropertiesChange(): void {\n if (!this.includeNavigationProperties) {\n this.maxDepth = null;\n }\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public onMaxDepthChange(value: number | null): void {\n this.maxDepth = value;\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public addSelected(): void {\n const itemsToAdd = this.availableAttributes.filter(\n item => this.selectedAvailableKeys.includes(item.attributePath)\n );\n\n this.selectedAttributes.push(...itemsToAdd);\n this.availableAttributes = this.availableAttributes.filter(\n item => !this.selectedAvailableKeys.includes(item.attributePath)\n );\n\n this.selectedAvailableKeys = [];\n this.updateGrids();\n }\n\n public removeSelected(): void {\n const itemsToRemove = this.selectedAttributes.filter(\n item => this.selectedChosenKeys.includes(item.attributePath)\n );\n\n this.availableAttributes.push(...itemsToRemove);\n this.selectedAttributes = this.selectedAttributes.filter(\n item => !this.selectedChosenKeys.includes(item.attributePath)\n );\n\n this.selectedChosenKeys = [];\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n\n public addAll(): void {\n this.selectedAttributes.push(...this.availableAttributes);\n this.availableAttributes = [];\n this.selectedAvailableKeys = [];\n this.updateGrids();\n }\n\n public removeAll(): void {\n this.availableAttributes.push(...this.selectedAttributes);\n this.selectedAttributes = [];\n this.selectedChosenKeys = [];\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n\n private sortAvailableAttributes(): void {\n this.availableAttributes.sort((a, b) =>\n a.attributePath.localeCompare(b.attributePath)\n );\n }\n\n public canMoveUp(): boolean {\n if (this.selectedChosenKeys.length !== 1) return false;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n return index > 0;\n }\n\n public canMoveDown(): boolean {\n if (this.selectedChosenKeys.length !== 1) return false;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n return index >= 0 && index < this.selectedAttributes.length - 1;\n }\n\n public moveUp(): void {\n if (!this.canMoveUp()) return;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n [this.selectedAttributes[index - 1], this.selectedAttributes[index]] =\n [this.selectedAttributes[index], this.selectedAttributes[index - 1]];\n this.updateSelectedGrid();\n }\n\n public moveDown(): void {\n if (!this.canMoveDown()) return;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n [this.selectedAttributes[index], this.selectedAttributes[index + 1]] =\n [this.selectedAttributes[index + 1], this.selectedAttributes[index]];\n this.updateSelectedGrid();\n }\n\n private updateGrids(): void {\n this.updateAvailableGrid();\n this.updateSelectedGrid();\n }\n\n private updateAvailableGrid(): void {\n this.availableGridData = {\n data: this.availableAttributes,\n total: this.availableAttributes.length\n };\n }\n\n private updateSelectedGrid(): void {\n this.selectedGridData = {\n data: this.selectedAttributes,\n total: this.selectedAttributes.length\n };\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n\n public onConfirm(): void {\n if (this.singleSelect) {\n const selected = this.availableAttributes.find(\n a => a.attributePath === this.selectedSingleKey[0]\n );\n const result: AttributeSelectorDialogResult = {\n selectedAttributes: selected ? [selected] : []\n };\n this.windowRef.close(result);\n } else {\n const result: AttributeSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n this.windowRef.close(result);\n }\n }\n\n /**\n * Handle cell click on available attributes grid to detect double-click\n */\n public onAvailableCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - move attribute to selected\n this.moveAttributeToSelected(dataItem);\n // Reset to prevent triple-click\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n // Single click - just update tracking\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Handle cell click on selected attributes grid to detect double-click\n */\n public onSelectedCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - move attribute to available\n this.moveAttributeToAvailable(dataItem);\n // Reset to prevent triple-click\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n // Single click - just update tracking\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Handle cell click on single-select grid to detect double-click (confirm immediately)\n */\n public onSingleSelectCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - confirm immediately\n this.selectedSingleKey = [attributePath];\n this.onConfirm();\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Move a single attribute from available to selected\n */\n private moveAttributeToSelected(attribute: AttributeItem): void {\n // Remove from available\n this.availableAttributes = this.availableAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add to selected\n this.selectedAttributes.push(attribute);\n\n // Clear selections\n this.selectedAvailableKeys = this.selectedAvailableKeys.filter(\n key => key !== attribute.attributePath\n );\n\n this.updateGrids();\n }\n\n /**\n * Move a single attribute from selected to available\n */\n private moveAttributeToAvailable(attribute: AttributeItem): void {\n // Remove from selected\n this.selectedAttributes = this.selectedAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add to available\n this.availableAttributes.push(attribute);\n\n // Clear selections\n this.selectedChosenKeys = this.selectedChosenKeys.filter(\n key => key !== attribute.attributePath\n );\n\n // Sort available attributes\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n AttributeSelectorDialogComponent,\n AttributeSelectorDialogData,\n AttributeSelectorDialogResult\n} from './attribute-selector-dialog.component';\nimport { AttributeItem } from '@meshmakers/octo-services';\n\nexport interface AttributeSelectorResult {\n confirmed: boolean;\n selectedAttributes: AttributeItem[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AttributeSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the attribute selector dialog\n * @param rtCkTypeId The RtCkType ID to fetch attributes for\n * @param selectedAttributes Optional array of pre-selected attribute paths\n * @param dialogTitle Optional custom dialog title\n * @param singleSelect Optional flag for single-select mode\n * @param additionalAttributes Optional virtual attributes to include (e.g., Timestamp for stream data)\n * @param includeNavigationProperties Optional flag to control navigation property inclusion\n * @param maxDepth Optional max depth for navigation properties\n * @param hideNavigationControls Optional flag to hide the navigation property controls in the dialog\n * @returns Promise that resolves with the result containing selected attributes and confirmation status\n */\n public async openAttributeSelector(\n rtCkTypeId: string,\n selectedAttributes?: string[],\n dialogTitle?: string,\n singleSelect?: boolean,\n additionalAttributes?: AttributeItem[],\n includeNavigationProperties?: boolean,\n maxDepth?: number,\n hideNavigationControls?: boolean,\n attributePaths?: string[]\n ): Promise<AttributeSelectorResult> {\n const data: AttributeSelectorDialogData = {\n rtCkTypeId,\n selectedAttributes,\n dialogTitle,\n singleSelect,\n additionalAttributes,\n includeNavigationProperties,\n maxDepth,\n hideNavigationControls,\n attributePaths\n };\n\n const dialogKey = singleSelect ? 'attribute-selector-single' : 'attribute-selector';\n const defaultWidth = singleSelect ? 550 : 1000;\n const defaultHeight = singleSelect ? 650 : 700;\n const size = this.windowStateService.resolveWindowSize(dialogKey, { width: defaultWidth, height: defaultHeight });\n\n const windowRef: WindowRef = this.windowService.open({\n content: AttributeSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: singleSelect ? 450 : 850,\n minHeight: singleSelect ? 550 : 650,\n resizable: true,\n title: dialogTitle || 'Select Attributes'\n });\n\n this.windowStateService.applyModalBehavior(dialogKey, windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: AttributeSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n\n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n const dialogResult = result as AttributeSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes\n };\n } else {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n }\n}\n","import { Component, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { pencilIcon, trashIcon } from '@progress/kendo-svg-icons';\nimport {\n GetEntitiesByCkTypeDtoGQL,\n RuntimeEntitySelectDataSource,\n RuntimeEntityDialogDataSource,\n RuntimeEntityItem,\n AttributeItem\n} from '@meshmakers/octo-services';\nimport { EntitySelectInputComponent } from '@meshmakers/shared-ui';\nimport { CkTypeSelectorInputComponent } from '../ck-type-selector-input';\nimport { AttributeSelectorDialogService } from '../attribute-selector-dialog';\nimport {\n RuntimeEntityVariableDialogData,\n RuntimeEntityVariableDialogResult,\n RuntimeEntityVariableMapping\n} from './runtime-entity-variable-dialog.models';\n\ninterface CkTypeSelectorItem {\n fullName: string;\n rtCkTypeId: string;\n baseTypeFullName?: string;\n baseTypeRtCkTypeId?: string;\n isAbstract: boolean;\n isFinal: boolean;\n description?: string;\n}\n\n@Component({\n selector: 'mm-runtime-entity-variable-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonsModule,\n InputsModule,\n GridModule,\n IconsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent\n ],\n template: `\n <div class=\"dialog-content\">\n <div class=\"form-row\">\n <label class=\"form-label\">CK Type</label>\n <mm-ck-type-selector-input\n [placeholder]=\"'Select CK Type...'\"\n [minSearchLength]=\"2\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n </div>\n\n <div class=\"form-row\">\n <label class=\"form-label\">Entity</label>\n <mm-entity-select-input\n [dataSource]=\"entityDataSource()!\"\n [dialogDataSource]=\"entityDialogDataSource()!\"\n [placeholder]=\"'Select Entity...'\"\n [disabled]=\"!selectedCkType()\"\n [minSearchLength]=\"1\"\n dialogTitle=\"Select Entity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n </div>\n\n <div class=\"form-row\">\n <label class=\"form-label\">Attributes</label>\n <button\n kendoButton\n (click)=\"openAttributeSelector()\"\n [disabled]=\"!selectedCkType()\"\n themeColor=\"primary\"\n fillMode=\"outline\">\n Select Attributes...\n </button>\n </div>\n\n @if (variableMappings().length > 0) {\n <div class=\"mappings-grid\">\n <div class=\"grid-header\">\n <span class=\"col-name\">Variable Name</span>\n <span class=\"col-path\">Attribute Path</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-actions\"></span>\n </div>\n @for (mapping of variableMappings(); track mapping.attributePath; let i = $index) {\n <div class=\"grid-row\">\n <div class=\"col-name\">\n <kendo-textbox\n [value]=\"mapping.name\"\n (valueChange)=\"onNameChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n @if (getNameError(mapping.name, i); as error) {\n <span class=\"error-text\">{{ error }}</span>\n }\n </div>\n <div class=\"col-path\">{{ mapping.attributePath }}</div>\n <div class=\"col-type\">{{ mapping.attributeValueType }}</div>\n <div class=\"col-actions\">\n <button\n kendoButton\n (click)=\"removeMapping(i)\"\n [svgIcon]=\"trashIcon\"\n fillMode=\"flat\"\n themeColor=\"error\"\n title=\"Remove\">\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"onCancel()\" fillMode=\"outline\">Cancel</button>\n <button kendoButton (click)=\"onOk()\" themeColor=\"primary\" [disabled]=\"!isValid()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n .dialog-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 20px;\n }\n\n .form-row {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--kendo-color-subtle, #666);\n }\n\n .mappings-grid {\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-surface-alt, #fafafa);\n }\n\n .grid-header {\n display: grid;\n grid-template-columns: 1fr 1fr 100px 40px;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: var(--kendo-color-surface, #f5f5f5);\n border-bottom: 1px solid var(--kendo-color-border, #e0e0e0);\n font-size: 12px;\n font-weight: 600;\n color: var(--kendo-color-subtle, #666);\n }\n\n .grid-row {\n display: grid;\n grid-template-columns: 1fr 1fr 100px 40px;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n align-items: start;\n border-bottom: 1px solid var(--kendo-color-border, #e0e0e0);\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n .col-name {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .col-path, .col-type {\n font-size: 13px;\n padding-top: 6px;\n color: var(--kendo-color-on-app-surface, #424242);\n }\n\n .col-actions {\n display: flex;\n justify-content: center;\n padding-top: 2px;\n }\n\n .error-text {\n font-size: 11px;\n color: var(--kendo-color-error, #f44336);\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #e0e0e0);\n }\n `]\n})\nexport class RuntimeEntityVariableDialogComponent {\n private readonly windowRef = inject(WindowRef);\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly attributeSelectorDialogService = inject(AttributeSelectorDialogService);\n\n protected readonly pencilIcon = pencilIcon;\n protected readonly trashIcon = trashIcon;\n\n /** Data passed to the dialog (set by service) */\n data: RuntimeEntityVariableDialogData = {};\n\n // Signals\n readonly selectedCkType = signal<CkTypeSelectorItem | null>(null);\n readonly selectedEntity = signal<RuntimeEntityItem | null>(null);\n readonly variableMappings = signal<RuntimeEntityVariableMapping[]>([]);\n\n readonly entityDataSource = computed(() => {\n const ckType = this.selectedCkType();\n if (!ckType) return null;\n return new RuntimeEntitySelectDataSource(this.getEntitiesByCkTypeGQL, ckType.rtCkTypeId);\n });\n\n readonly entityDialogDataSource = computed(() => {\n const ckType = this.selectedCkType();\n if (!ckType) return null;\n return new RuntimeEntityDialogDataSource(this.getEntitiesByCkTypeGQL, ckType.rtCkTypeId);\n });\n\n private readonly VALID_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType.set(ckType);\n this.selectedEntity.set(null);\n // Don't clear mappings — keep them if user is just switching type\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType.set(null);\n this.selectedEntity.set(null);\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity.set(entity);\n }\n\n onEntityCleared(): void {\n this.selectedEntity.set(null);\n }\n\n async openAttributeSelector(): Promise<void> {\n const ckType = this.selectedCkType();\n if (!ckType) return;\n\n const existingPaths = this.variableMappings().map(m => m.attributePath);\n\n const result = await this.attributeSelectorDialogService.openAttributeSelector(\n ckType.rtCkTypeId,\n existingPaths,\n 'Select Attributes'\n );\n\n if (result.confirmed && result.selectedAttributes.length > 0) {\n this.addAttributeMappings(result.selectedAttributes);\n }\n }\n\n onNameChange(index: number, name: string): void {\n const sanitized = name.replace(/[^a-zA-Z0-9_]/g, '');\n const mappings = [...this.variableMappings()];\n mappings[index] = { ...mappings[index], name: sanitized };\n this.variableMappings.set(mappings);\n }\n\n removeMapping(index: number): void {\n const mappings = this.variableMappings().filter((_, i) => i !== index);\n this.variableMappings.set(mappings);\n }\n\n getNameError(name: string, index: number): string | null {\n if (!name) return 'Name required';\n if (!this.VALID_NAME_REGEX.test(name)) return 'Invalid name';\n if (this.isDuplicateName(name, index)) return 'Duplicate';\n return null;\n }\n\n isValid(): boolean {\n const entity = this.selectedEntity();\n const mappings = this.variableMappings();\n if (!entity || mappings.length === 0) return false;\n\n return mappings.every((m, i) =>\n m.name &&\n this.VALID_NAME_REGEX.test(m.name) &&\n !this.isDuplicateName(m.name, i)\n );\n }\n\n onOk(): void {\n const ckType = this.selectedCkType();\n const entity = this.selectedEntity();\n if (!ckType || !entity) return;\n\n const result: RuntimeEntityVariableDialogResult = {\n entityCkTypeId: ckType.rtCkTypeId,\n entityRtId: entity.rtId,\n entityDisplayName: entity.displayName,\n variables: this.variableMappings()\n };\n\n this.windowRef.close(result);\n }\n\n onCancel(): void {\n this.windowRef.close();\n }\n\n private addAttributeMappings(attributes: AttributeItem[]): void {\n const existingMappings = this.variableMappings();\n const existingPaths = new Set(existingMappings.map(m => m.attributePath));\n const allNames = new Set([\n ...existingMappings.map(m => m.name),\n ...(this.data.existingVariableNames ?? [])\n ]);\n\n const newMappings: RuntimeEntityVariableMapping[] = [];\n for (const attr of attributes) {\n if (existingPaths.has(attr.attributePath)) continue;\n\n let name = this.attributePathToVariableName(attr.attributePath);\n let counter = 1;\n while (allNames.has(name)) {\n name = `${this.attributePathToVariableName(attr.attributePath)}${counter}`;\n counter++;\n }\n allNames.add(name);\n\n newMappings.push({\n name,\n attributePath: attr.attributePath,\n attributeValueType: attr.attributeValueType\n });\n }\n\n this.variableMappings.set([...existingMappings, ...newMappings]);\n }\n\n private attributePathToVariableName(attributePath: string): string {\n const parts = attributePath.split('.');\n return parts\n .map((part, index) =>\n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n }\n\n private isDuplicateName(name: string, currentIndex: number): boolean {\n const mappings = this.variableMappings();\n const existingNames = this.data.existingVariableNames ?? [];\n\n // Check within dialog mappings\n if (mappings.some((m, i) => i !== currentIndex && m.name === name)) return true;\n // Check against existing external variable names\n if (existingNames.includes(name)) return true;\n\n return false;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport { RuntimeEntityVariableDialogComponent } from './runtime-entity-variable-dialog.component';\nimport {\n RuntimeEntityVariableDialogData,\n RuntimeEntityVariableDialogResult\n} from './runtime-entity-variable-dialog.models';\n\nexport interface RuntimeEntityVariableResult {\n confirmed: boolean;\n result?: RuntimeEntityVariableDialogResult;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RuntimeEntityVariableDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the runtime entity variable dialog.\n * @param data Optional pre-populated data for editing\n * @returns Promise with confirmation status and dialog result\n */\n public async openRuntimeEntityVariableDialog(\n data?: RuntimeEntityVariableDialogData\n ): Promise<RuntimeEntityVariableResult> {\n const size = this.windowStateService.resolveWindowSize('runtime-entity-variable', { width: 800, height: 600 });\n\n const windowRef = this.windowService.open({\n content: RuntimeEntityVariableDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 650,\n minHeight: 500,\n resizable: true,\n title: 'Runtime Entity Variables'\n });\n\n this.windowStateService.applyModalBehavior('runtime-entity-variable', windowRef);\n\n const contentRef = windowRef.content as { instance?: RuntimeEntityVariableDialogComponent } | undefined;\n if (contentRef?.instance && data) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return { confirmed: false };\n }\n\n if (result && typeof result === 'object' && 'variables' in result) {\n return {\n confirmed: true,\n result: result as RuntimeEntityVariableDialogResult\n };\n }\n\n return { confirmed: false };\n } catch {\n return { confirmed: false };\n }\n }\n}\n","import {\n FieldFilterDto,\n FieldFilterOperatorsDto,\n SearchFilterDto,\n SearchFilterTypesDto, SortDto, SortOrdersDto\n} from '@meshmakers/octo-services';\nimport {DataSourceTyped, ListViewComponent} from '@meshmakers/shared-ui';\nimport {FilterOperator, isCompositeFilterDescriptor} from '@progress/kendo-data-query';\nimport {State} from '@progress/kendo-data-query/dist/npm/state';\n\n// noinspection JSUnusedGlobalSymbols\nexport abstract class OctoGraphQlDataSource<TDto> extends DataSourceTyped<TDto | null> {\n\n private _searchFilterAttributePaths: string[] = [];\n\n // noinspection JSUnusedGlobalSymbols\n protected constructor(listViewComponent: ListViewComponent) {\n super(listViewComponent);\n }\n\n protected get searchFilterAttributePaths(): string[] {\n return this._searchFilterAttributePaths;\n }\n protected set searchFilterAttributePaths(value: string[]) {\n this._searchFilterAttributePaths = value;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getFieldFilterDefinitions(state: State) {\n let fieldFilters: FieldFilterDto[] | null = null;\n if (state.filter?.filters) {\n fieldFilters = state.filter.filters.map((f) => {\n\n if (isCompositeFilterDescriptor(f)) {\n throw new Error('Composite filter descriptor not supported');\n }\n\n const {operator, value} = OctoGraphQlDataSource.getOperatorAndValue(f.operator as FilterOperator, f.value);\n\n return {\n attributePath: f.field,\n operator: operator,\n comparisonValue: value\n } as FieldFilterDto;\n });\n }\n return fieldFilters;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getSearchFilterDefinitions(textSearchValue: string | null): SearchFilterDto | null {\n let searchFilterDto: SearchFilterDto | null = null;\n if (textSearchValue) {\n searchFilterDto = {\n type: SearchFilterTypesDto.AttributeFilterDto,\n attributePaths: this.searchFilterAttributePaths,\n searchTerm: textSearchValue,\n };\n }\n return searchFilterDto;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getSortDefinitions(state: State): SortDto[] | null {\n let sort: SortDto[] | null = null;\n if (state.sort) {\n sort = new Array<SortDto>()\n state.sort.forEach((s) => {\n\n switch (s.dir) {\n case 'asc':\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.AscendingDto\n });\n break;\n case 'desc':\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.DescendingDto,\n });\n break;\n default:\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.DefaultDto,\n });\n break;\n }\n\n });\n }\n return sort;\n }\n\n private static getOperatorAndValue(operator: FilterOperator, value: unknown): {\n operator: FieldFilterOperatorsDto,\n value: unknown\n } {\n\n switch (operator) {\n case 'eq':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: value};\n case 'neq':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: value};\n case 'lt':\n return {operator: FieldFilterOperatorsDto.LessThanDto, value: value};\n case 'lte':\n return {operator: FieldFilterOperatorsDto.LessEqualThanDto, value: value};\n case 'gt':\n return {operator: FieldFilterOperatorsDto.GreaterThanDto, value: value};\n case 'gte':\n return {operator: FieldFilterOperatorsDto.GreaterEqualThanDto, value: value};\n case 'contains':\n return {operator: FieldFilterOperatorsDto.LikeDto, value: value};\n case 'doesnotcontain':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: `^(?!.*${value}).*$`};\n case 'startswith':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: value + '.*'};\n case 'endswith':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: '.*' + value};\n case 'isnull':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: null};\n case 'isnotnull':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: null};\n case 'isempty':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: \"\"};\n case 'isnotempty':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: \"\"};\n default:\n throw new Error('The filter operator is not supported');\n }\n }\n}\n","import {TreeItemDataTyped} from \"@meshmakers/shared-services\";\nimport {HierarchyDataSourceBase} from \"@meshmakers/shared-ui\";\n\nexport abstract class OctoGraphQlHierarchyDataSource<TQueryDto> extends HierarchyDataSourceBase<TQueryDto> {\n public abstract override fetchChildren(item: TreeItemDataTyped<TQueryDto>): Promise<TreeItemDataTyped<TQueryDto>[]>;\n\n public abstract override fetchRootNodes(): Promise<TreeItemDataTyped<TQueryDto>[]>;\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DateInputsModule } from '@progress/kendo-angular-dateinputs';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { PopupModule } from '@progress/kendo-angular-popup';\nimport { IntlModule } from '@progress/kendo-angular-intl';\n// Note: Kendo locale data (de/en) should be loaded via polyfills in the consuming application\nimport { plusIcon, minusIcon, trashIcon, dollarIcon } from '@progress/kendo-svg-icons';\nimport {\n FieldFilterDto,\n FieldFilterOperatorsDto,\n AttributeValueTypeDto,\n AttributeItem,\n AttributeSelectorService\n} from '@meshmakers/octo-services';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Variable definition for use in filter values.\n * Generic interface that can be provided by any consumer (e.g., MeshBoard).\n */\nexport interface FilterVariable {\n /** Variable name (without $ prefix) */\n name: string;\n /** Display label for UI */\n label?: string;\n /** Variable data type */\n type?: 'string' | 'number' | 'boolean' | 'date' | 'datetime';\n}\n\nexport interface FieldFilterItem extends FieldFilterDto {\n id: number;\n /** If true, comparisonValue contains a variable reference (e.g., $myVar) */\n useVariable?: boolean;\n}\n\ntype InputType = 'text' | 'number' | 'boolean' | 'datetime';\n\n@Component({\n selector: 'mm-field-filter-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n DropDownsModule,\n InputsModule,\n DateInputsModule,\n IconsModule,\n PopupModule,\n IntlModule\n ],\n template: `\n <div class=\"field-filter-editor\">\n @if (ckTypeId && !hideNavigationProperties) {\n <div class=\"attribute-options\">\n <label class=\"inline-checkbox\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"includeNavigationProperties\"\n (ngModelChange)=\"onNavigationPropertiesChange()\" />\n Include Navigation Properties\n </label>\n <label class=\"inline-field\">\n Max Depth\n <kendo-numerictextbox\n [(ngModel)]=\"maxDepth\"\n [min]=\"1\" [max]=\"5\" [step]=\"1\" [format]=\"'n0'\"\n [spinners]=\"true\"\n [disabled]=\"!includeNavigationProperties\"\n (valueChange)=\"onMaxDepthChange($event)\"\n class=\"depth-input\">\n </kendo-numerictextbox>\n </label>\n @if (isLoadingAttributes) {\n <span class=\"loading-hint\">Loading...</span>\n }\n </div>\n }\n <div class=\"toolbar\">\n <button\n kendoButton\n [svgIcon]=\"plusIcon\"\n themeColor=\"primary\"\n (click)=\"addFilter()\"\n title=\"Add filter\">\n Add Filter\n </button>\n <button\n kendoButton\n [svgIcon]=\"trashIcon\"\n themeColor=\"error\"\n (click)=\"removeSelected()\"\n [disabled]=\"selectedKeys.length === 0\"\n title=\"Remove selected filters\">\n Remove Selected\n </button>\n </div>\n\n <kendo-grid\n [data]=\"filters\"\n [selectable]=\"{ mode: 'multiple', enabled: true }\"\n [kendoGridSelectBy]=\"'id'\"\n [(selectedKeys)]=\"selectedKeys\"\n class=\"filter-grid\">\n\n <kendo-grid-column title=\"\" [width]=\"50\" [class]=\"'checkbox-column'\">\n <ng-template kendoGridHeaderTemplate>\n <input\n type=\"checkbox\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event)\" />\n </ng-template>\n <ng-template kendoGridCellTemplate let-dataItem>\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(dataItem)\"\n (change)=\"toggleSelection(dataItem)\" />\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"280\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @if (availableAttributes.length > 0) {\n <kendo-combobox\n [data]=\"filteredAttributeList\"\n [(ngModel)]=\"dataItem.attributePath\"\n (valueChange)=\"onAttributeChange(dataItem, $event)\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [allowCustom]=\"true\"\n [filterable]=\"true\"\n (filterChange)=\"onAttributeFilterChange($event)\"\n [listHeight]=\"300\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"attribute-dropdown\">\n <ng-template kendoComboBoxItemTemplate let-item>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ item.attributePath }}</span>\n <span class=\"attribute-type\">{{ item.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox\n [(ngModel)]=\"dataItem.attributePath\"\n (valueChange)=\"onFilterChange()\"\n placeholder=\"Enter attribute path\"\n class=\"attribute-input\">\n </kendo-textbox>\n }\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"operator\" title=\"Operator\" [width]=\"180\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <kendo-dropdownlist\n [data]=\"operators\"\n [(ngModel)]=\"dataItem.operator\"\n (valueChange)=\"onOperatorChange(dataItem)\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [listHeight]=\"300\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"operator-dropdown\">\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"comparisonValue\" title=\"Value\" [width]=\"280\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"value-cell\">\n @if (dataItem.useVariable && enableVariables) {\n <!-- Variable mode: show variable dropdown -->\n <kendo-dropdownlist\n [data]=\"availableVariables\"\n [value]=\"getSelectedVariable(dataItem)\"\n (valueChange)=\"onVariableSelected(dataItem, $event)\"\n [textField]=\"'label'\"\n [valueField]=\"'name'\"\n [valuePrimitive]=\"false\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n placeholder=\"Select variable...\"\n class=\"value-input variable-dropdown\">\n <ng-template kendoDropDownListItemTemplate let-item>\n <div class=\"variable-item\">\n <span class=\"variable-name\">{{ formatVariableDisplay(item.name) }}</span>\n @if (item.label && item.label !== item.name) {\n <span class=\"variable-label\">{{ item.label }}</span>\n }\n </div>\n </ng-template>\n <ng-template kendoDropDownListValueTemplate let-item>\n @if (item) {\n <span class=\"variable-value\">{{ formatVariableDisplay(item.name) }}</span>\n } @else {\n <span class=\"variable-placeholder\">Select variable...</span>\n }\n </ng-template>\n </kendo-dropdownlist>\n } @else {\n <!-- Literal value mode: show type-specific input -->\n @switch (getInputType(dataItem)) {\n @case ('boolean') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"true, false\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-dropdownlist\n [data]=\"booleanOptions\"\n [value]=\"getBooleanValue(dataItem)\"\n (valueChange)=\"onBooleanValueChange(dataItem, $event)\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"value-input\">\n </kendo-dropdownlist>\n }\n }\n @case ('number') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"1, 2, 3\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-numerictextbox\n [value]=\"getNumericValue(dataItem)\"\n (valueChange)=\"onNumericValueChange(dataItem, $event)\"\n [decimals]=\"getDecimals(dataItem)\"\n [format]=\"getNumberFormat(dataItem)\"\n class=\"value-input\">\n </kendo-numerictextbox>\n }\n }\n @case ('datetime') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"2024-01-15, 2024-02-20\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-datetimepicker\n [value]=\"getDateTimeValue(dataItem)\"\n (valueChange)=\"onDateTimeValueChange(dataItem, $event)\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"value-input\">\n </kendo-datetimepicker>\n }\n }\n @default {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n (blur)=\"onComparisonValueBlur(dataItem)\"\n [placeholder]=\"getValuePlaceholder(dataItem)\"\n class=\"value-input\">\n </kendo-textbox>\n }\n }\n }\n <!-- Variable toggle button -->\n @if (enableVariables && availableVariables.length > 0) {\n <button\n kendoButton\n [svgIcon]=\"dollarIcon\"\n fillMode=\"flat\"\n [themeColor]=\"dataItem.useVariable ? 'primary' : 'base'\"\n (click)=\"toggleVariableMode(dataItem)\"\n [title]=\"dataItem.useVariable ? 'Switch to literal value' : 'Use variable'\"\n class=\"variable-toggle\">\n </button>\n }\n </div>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column title=\"\" [width]=\"60\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <button\n kendoButton\n [svgIcon]=\"minusIcon\"\n fillMode=\"flat\"\n themeColor=\"error\"\n (click)=\"removeFilter(dataItem)\"\n title=\"Remove this filter\">\n </button>\n </ng-template>\n </kendo-grid-column>\n\n </kendo-grid>\n\n @if (filters.length === 0) {\n <div class=\"empty-state\">\n <p>No filters defined. Click \"Add Filter\" to create a new filter.</p>\n </div>\n }\n </div>\n `,\n styles: [`\n .field-filter-editor {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .attribute-options {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85rem;\n }\n\n .inline-checkbox {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .inline-field {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: normal;\n }\n\n .depth-input {\n width: 80px;\n }\n\n .loading-hint {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .toolbar {\n display: flex;\n gap: 10px;\n margin-bottom: 5px;\n }\n\n .filter-grid {\n border: 1px solid #d5d5d5;\n }\n\n .filter-grid ::ng-deep .k-grid-header .k-header {\n font-weight: 600;\n }\n\n .checkbox-column {\n text-align: center;\n }\n\n .attribute-dropdown,\n .operator-dropdown,\n .attribute-input {\n width: 100%;\n }\n\n .value-input {\n width: 100%;\n }\n\n .attribute-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .attribute-path {\n flex: 1;\n }\n\n .attribute-type {\n font-size: 11px;\n color: #888;\n margin-left: 8px;\n padding: 2px 6px;\n background: #f0f0f0;\n border-radius: 3px;\n }\n\n .empty-state {\n padding: 40px;\n text-align: center;\n border: 1px dashed;\n border-radius: 8px;\n font-family: 'Montserrat', sans-serif;\n font-size: 0.9rem;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .value-cell {\n display: flex;\n gap: 4px;\n align-items: center;\n }\n\n .value-cell .value-input {\n flex: 1;\n }\n\n .variable-toggle {\n flex-shrink: 0;\n }\n\n .variable-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .variable-name {\n font-family: monospace;\n font-weight: 500;\n }\n\n .variable-label {\n font-size: 11px;\n color: var(--kendo-color-subtle, #888);\n }\n\n .variable-value {\n font-family: monospace;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .variable-placeholder {\n color: var(--kendo-color-subtle, #888);\n }\n\n .variable-dropdown ::ng-deep .k-input-value-text {\n font-family: monospace;\n }\n `]\n})\nexport class FieldFilterEditorComponent implements OnChanges {\n private readonly attributeService = inject(AttributeSelectorService, { optional: true });\n\n protected readonly plusIcon = plusIcon;\n protected readonly minusIcon = minusIcon;\n protected readonly trashIcon = trashIcon;\n protected readonly dollarIcon = dollarIcon;\n\n private readonly arrayOperators = [\n FieldFilterOperatorsDto.InDto,\n FieldFilterOperatorsDto.NotInDto\n ];\n\n public readonly operators: { label: string; value: FieldFilterOperatorsDto }[] = [\n { label: 'Equals', value: FieldFilterOperatorsDto.EqualsDto },\n { label: 'Not Equals', value: FieldFilterOperatorsDto.NotEqualsDto },\n { label: 'Greater Than', value: FieldFilterOperatorsDto.GreaterThanDto },\n { label: 'Greater Equal', value: FieldFilterOperatorsDto.GreaterEqualThanDto },\n { label: 'Less Than', value: FieldFilterOperatorsDto.LessThanDto },\n { label: 'Less Equal', value: FieldFilterOperatorsDto.LessEqualThanDto },\n { label: 'Like', value: FieldFilterOperatorsDto.LikeDto },\n { label: 'In', value: FieldFilterOperatorsDto.InDto },\n { label: 'Not In', value: FieldFilterOperatorsDto.NotInDto },\n { label: 'Any Equals', value: FieldFilterOperatorsDto.AnyEqDto },\n { label: 'Any Like', value: FieldFilterOperatorsDto.AnyLikeDto },\n { label: 'Match RegEx', value: FieldFilterOperatorsDto.MatchRegExDto }\n ];\n\n public readonly booleanOptions = ['true', 'false'];\n\n @Input() public availableAttributes: AttributeItem[] = [];\n\n /**\n * Optional CK type ID for self-loading attributes.\n * When set, the component loads available attributes itself and shows\n * navigation property controls (checkbox + max depth).\n * When not set, the component uses the externally provided availableAttributes input.\n */\n @Input() public ckTypeId?: string;\n\n /**\n * When true, hides the \"Include Navigation Properties\" checkbox and Max Depth controls,\n * and forces attribute loading without navigation properties.\n * Used for stream data queries which don't support navigation properties.\n */\n @Input() public hideNavigationProperties = false;\n\n /**\n * When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching).\n * Used for stream data queries to show only stream-data-enabled attributes.\n */\n @Input() public attributePaths?: string[];\n\n /** Enable variable mode - allows using variables instead of literal values */\n @Input() public enableVariables = false;\n\n /** Available variables for selection when enableVariables is true */\n @Input() public availableVariables: FilterVariable[] = [];\n\n /** Controls for self-loading mode (when ckTypeId is set) */\n public includeNavigationProperties = true;\n public maxDepth: number | null = null;\n public isLoadingAttributes = false;\n\n private _filters: FieldFilterItem[] = [];\n private nextId = 1;\n public filteredAttributeList: AttributeItem[] = [];\n private attributeTypeMap = new Map<string, AttributeValueTypeDto>();\n\n @Input()\n public get filters(): FieldFilterItem[] {\n return this._filters;\n }\n public set filters(value: FieldFilterItem[]) {\n this._filters = value;\n this.filtersChange.emit(this._filters);\n }\n\n @Output() public filtersChange = new EventEmitter<FieldFilterItem[]>();\n\n public selectedKeys: number[] = [];\n\n ngOnChanges(changes?: SimpleChanges): void {\n // When hideNavigationProperties changes to true, reset nav props\n if (changes?.['hideNavigationProperties'] && this.hideNavigationProperties) {\n this.includeNavigationProperties = false;\n this.maxDepth = null;\n }\n\n // Reload attributes when ckTypeId, hideNavigationProperties, or attributePaths changes\n if ((changes?.['ckTypeId'] || changes?.['hideNavigationProperties'] || changes?.['attributePaths']) && this.ckTypeId) {\n this.loadAttributesFromCkType();\n }\n\n this.filteredAttributeList = [...this.availableAttributes];\n this.buildAttributeTypeMap();\n // Ensure useVariable flag is set correctly for filters with variable values\n this.detectVariableFilters();\n }\n\n /**\n * Detects filters that contain variable references and sets useVariable flag.\n * This ensures proper display when filters are loaded from saved configuration.\n */\n private detectVariableFilters(): void {\n for (const filter of this._filters) {\n // Always check if the value is a variable reference and update the flag\n const isVariable = this.isVariableValue(filter.comparisonValue);\n if (isVariable && !filter.useVariable) {\n filter.useVariable = true;\n }\n }\n }\n\n private buildAttributeTypeMap(): void {\n this.attributeTypeMap.clear();\n for (const attr of this.availableAttributes) {\n this.attributeTypeMap.set(attr.attributePath, attr.attributeValueType as AttributeValueTypeDto);\n }\n }\n\n // ============================================================================\n // Self-loading attribute methods (when ckTypeId is set)\n // ============================================================================\n\n public onNavigationPropertiesChange(): void {\n if (!this.includeNavigationProperties) {\n this.maxDepth = null;\n }\n this.loadAttributesFromCkType();\n }\n\n public onMaxDepthChange(value: number | null): void {\n this.maxDepth = value;\n this.loadAttributesFromCkType();\n }\n\n private async loadAttributesFromCkType(): Promise<void> {\n if (!this.ckTypeId || !this.attributeService) return;\n\n this.isLoadingAttributes = true;\n const includeNavProps = this.hideNavigationProperties ? false : this.includeNavigationProperties;\n try {\n const result = await firstValueFrom(\n this.attributeService.getAvailableAttributes(\n this.ckTypeId,\n undefined, // filter\n 1000, // first\n undefined, // after\n undefined, // attributeValueType\n undefined, // searchTerm\n includeNavProps,\n this.maxDepth ?? undefined\n )\n );\n // Apply client-side attribute path restriction if set\n const allowedPathsSet = this.attributePaths ? new Set(this.attributePaths) : null;\n this.availableAttributes = allowedPathsSet\n ? result.items.filter(item => allowedPathsSet.has(item.attributePath))\n : result.items;\n this.filteredAttributeList = [...this.availableAttributes];\n this.buildAttributeTypeMap();\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.availableAttributes = [];\n this.filteredAttributeList = [];\n } finally {\n this.isLoadingAttributes = false;\n }\n }\n\n public addFilter(): void {\n const newFilter: FieldFilterItem = {\n id: this.nextId++,\n attributePath: '',\n operator: FieldFilterOperatorsDto.EqualsDto,\n comparisonValue: ''\n };\n this._filters = [...this._filters, newFilter];\n this.filtersChange.emit(this._filters);\n }\n\n public removeFilter(filter: FieldFilterItem): void {\n this._filters = this._filters.filter(f => f.id !== filter.id);\n this.selectedKeys = this.selectedKeys.filter(k => k !== filter.id);\n this.filtersChange.emit(this._filters);\n }\n\n public removeSelected(): void {\n this._filters = this._filters.filter(f => !this.selectedKeys.includes(f.id));\n this.selectedKeys = [];\n this.filtersChange.emit(this._filters);\n }\n\n public onFilterChange(): void {\n this.filtersChange.emit(this._filters);\n }\n\n public onAttributeChange(filter: FieldFilterItem, attributePath: string): void {\n filter.attributePath = attributePath;\n // Reset comparison value when attribute changes\n filter.comparisonValue = '';\n this.onFilterChange();\n }\n\n public onOperatorChange(filter: FieldFilterItem): void {\n if (!filter.comparisonValue) {\n this.onFilterChange();\n return;\n }\n\n const currentValue = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator)) {\n const valuesToProcess = this.extractArrayContent(currentValue);\n const cleanedValues = this.parseAndCleanArrayValues(valuesToProcess);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n const scalarValue = this.extractArrayContent(currentValue);\n if (scalarValue.includes(',')) {\n filter.comparisonValue = scalarValue.split(',')[0].trim();\n } else {\n filter.comparisonValue = scalarValue.trim();\n }\n }\n\n this.onFilterChange();\n }\n\n public onComparisonValueChange(filter: FieldFilterItem, inputValue: string | null): void {\n if (inputValue === null) {\n filter.comparisonValue = '';\n return;\n }\n\n if (this.isArrayOperator(filter.operator)) {\n const cleanedValues = this.parseAndCleanArrayValues(inputValue);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n filter.comparisonValue = this.extractArrayContent(inputValue);\n }\n\n this.onFilterChange();\n }\n\n public onComparisonValueBlur(filter: FieldFilterItem): void {\n if (!filter.comparisonValue) return;\n\n const value = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator)) {\n const cleanedValues = this.parseAndCleanArrayValues(value);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n filter.comparisonValue = this.extractArrayContent(value).trim();\n }\n\n this.onFilterChange();\n }\n\n public onBooleanValueChange(filter: FieldFilterItem, value: string): void {\n filter.comparisonValue = value;\n this.onFilterChange();\n }\n\n public onNumericValueChange(filter: FieldFilterItem, value: number | null): void {\n filter.comparisonValue = value !== null ? String(value) : '';\n this.onFilterChange();\n }\n\n public onDateTimeValueChange(filter: FieldFilterItem, value: Date | null): void {\n filter.comparisonValue = value !== null ? value.toISOString() : '';\n this.onFilterChange();\n }\n\n public getDisplayValue(filter: FieldFilterItem): string {\n if (!filter.comparisonValue) {\n return '';\n }\n\n const value = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator) && this.isArrayValue(value)) {\n return this.extractArrayContent(value);\n }\n\n return value;\n }\n\n public getBooleanValue(filter: FieldFilterItem): string {\n const value = filter.comparisonValue;\n if (value === 'true' || value === true) return 'true';\n if (value === 'false' || value === false) return 'false';\n return '';\n }\n\n public getNumericValue(filter: FieldFilterItem): number {\n const value = filter.comparisonValue;\n if (value === null || value === undefined || value === '') return 0;\n const num = Number(value);\n return isNaN(num) ? 0 : num;\n }\n\n public getDateTimeValue(filter: FieldFilterItem): Date | null {\n const value = filter.comparisonValue;\n if (!value) return null;\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? null : date;\n }\n\n public getInputType(filter: FieldFilterItem): InputType {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n if (!attrType) return 'text';\n\n // Normalize to uppercase for case-insensitive comparison\n const normalizedType = String(attrType).toUpperCase();\n\n // Boolean types\n if (normalizedType === 'BOOLEAN') {\n return 'boolean';\n }\n\n // Numeric types\n if (normalizedType === 'INT' || normalizedType === 'INTEGER' ||\n normalizedType === 'INT_64' || normalizedType === 'INTEGER_64' ||\n normalizedType === 'DOUBLE') {\n return 'number';\n }\n\n // DateTime types\n if (normalizedType === 'DATE_TIME' || normalizedType === 'DATE_TIME_OFFSET' ||\n normalizedType === 'DATETIME' || normalizedType === 'DATETIMEOFFSET') {\n return 'datetime';\n }\n\n return 'text';\n }\n\n public getDecimals(filter: FieldFilterItem): number {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n return attrType === AttributeValueTypeDto.DoubleDto ? 4 : 0;\n }\n\n public getNumberFormat(filter: FieldFilterItem): string {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n return attrType === AttributeValueTypeDto.DoubleDto ? 'n4' : 'n0';\n }\n\n public getValuePlaceholder(filter: FieldFilterItem): string {\n if (this.isArrayOperator(filter.operator)) {\n return 'Values: A,B,C or \"value,with,comma\"';\n }\n return 'Enter value';\n }\n\n public isArrayOperator(operator: FieldFilterOperatorsDto): boolean {\n return this.arrayOperators.includes(operator);\n }\n\n public isSelected(filter: FieldFilterItem): boolean {\n return this.selectedKeys.includes(filter.id);\n }\n\n public toggleSelection(filter: FieldFilterItem): void {\n if (this.isSelected(filter)) {\n this.selectedKeys = this.selectedKeys.filter(k => k !== filter.id);\n } else {\n this.selectedKeys = [...this.selectedKeys, filter.id];\n }\n }\n\n public isAllSelected(): boolean {\n return this._filters.length > 0 && this.selectedKeys.length === this._filters.length;\n }\n\n public isIndeterminate(): boolean {\n return this.selectedKeys.length > 0 && this.selectedKeys.length < this._filters.length;\n }\n\n public toggleSelectAll(event: Event): void {\n const checkbox = event.target as HTMLInputElement;\n if (checkbox.checked) {\n this.selectedKeys = this._filters.map(f => f.id);\n } else {\n this.selectedKeys = [];\n }\n }\n\n public onAttributeFilterChange(filter: string): void {\n this.filteredAttributeList = this.availableAttributes.filter(\n attr => attr.attributePath.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n // ============================================================================\n // Variable Mode Methods\n // ============================================================================\n\n /**\n * Toggles between literal value and variable mode for a filter.\n */\n public toggleVariableMode(filter: FieldFilterItem): void {\n filter.useVariable = !filter.useVariable;\n // Clear the value when switching modes\n filter.comparisonValue = '';\n this.onFilterChange();\n }\n\n /**\n * Gets the selected variable object for a filter that uses variable mode.\n */\n public getSelectedVariable(filter: FieldFilterItem): FilterVariable | null {\n if (!filter.comparisonValue) return null;\n\n const varName = this.extractVariableName(String(filter.comparisonValue));\n if (!varName) return null;\n\n return this.availableVariables.find(v => v.name === varName) || null;\n }\n\n /**\n * Handles variable selection from the dropdown.\n */\n public onVariableSelected(filter: FieldFilterItem, variable: FilterVariable | null): void {\n if (variable) {\n // Store as ${variableName} format\n filter.comparisonValue = `\\${${variable.name}}`;\n } else {\n filter.comparisonValue = '';\n }\n this.onFilterChange();\n }\n\n /**\n * Extracts variable name from ${variableName} or $variableName format.\n */\n private extractVariableName(value: string): string | null {\n // Match ${varName} format\n const bracketMatch = value.match(/^\\$\\{([^}]+)\\}$/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n // Match $varName format (without braces)\n const simpleMatch = value.match(/^\\$([a-zA-Z_][a-zA-Z0-9_]*)$/);\n if (simpleMatch) {\n return simpleMatch[1];\n }\n\n return null;\n }\n\n /**\n * Checks if a filter value is a variable reference.\n */\n public isVariableValue(value: unknown): boolean {\n if (!value || typeof value !== 'string') return false;\n return /^\\$\\{[^}]+\\}$/.test(value) || /^\\$[a-zA-Z_][a-zA-Z0-9_]*$/.test(value);\n }\n\n /**\n * Formats a variable name for display (e.g., \"myVar\" -> \"${myVar}\").\n */\n public formatVariableDisplay(name: string): string {\n return '$' + '{' + name + '}';\n }\n\n public getFieldFilters(): FieldFilterDto[] {\n return this._filters\n .filter(f => f.attributePath && f.attributePath.trim() !== '')\n .map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }));\n }\n\n public setFieldFilters(filters: FieldFilterDto[]): void {\n this._filters = filters.map(f => ({\n ...f,\n id: this.nextId++,\n // Detect if the value is a variable reference\n useVariable: this.isVariableValue(f.comparisonValue)\n }));\n this.filtersChange.emit(this._filters);\n }\n\n public clear(): void {\n this._filters = [];\n this.selectedKeys = [];\n this.filtersChange.emit(this._filters);\n }\n\n private isArrayValue(value: string): boolean {\n return value.trim().startsWith('[') && value.trim().endsWith(']');\n }\n\n private extractArrayContent(value: string): string {\n const trimmed = value.trim();\n if (this.isArrayValue(trimmed)) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n }\n\n private parseAndCleanArrayValues(inputValue: string): string[] {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n\n for (const char of inputValue) {\n if (!inQuotes && (char === '\"' || char === \"'\")) {\n inQuotes = true;\n quoteChar = char;\n current += char;\n } else if (inQuotes && char === quoteChar) {\n inQuotes = false;\n current += char;\n quoteChar = '';\n } else if (!inQuotes && char === ',') {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n values.push(trimmed);\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n values.push(trimmed);\n }\n\n return values;\n }\n}\n","import {Component, Input, inject} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ButtonsModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {copyIcon} from '@progress/kendo-svg-icons';\nimport {NotificationDisplayService} from '@meshmakers/shared-ui';\n\ninterface CopyOption {\n label: string;\n value: string;\n displayText: string;\n}\n\n/**\n * A reusable component for displaying and copying entity identifiers.\n * Provides a dropdown button with options to copy:\n * - RtId: The runtime ObjectId\n * - CkTypeId: The full versioned Construction Kit type ID\n * - RtCkTypeId: The runtime CK type ID (unversioned)\n * - RtEntityId: Combined format {RtCkTypeId}@{RtId}\n *\n * @example\n * ```html\n * <mm-entity-id-info\n * [rtId]=\"entity.rtId\"\n * [rtCkTypeId]=\"entity.ckTypeId\"\n * [ckTypeId]=\"entity.constructionKitType?.ckTypeId?.fullName\">\n * </mm-entity-id-info>\n * ```\n */\n@Component({\n selector: 'mm-entity-id-info',\n standalone: true,\n imports: [\n CommonModule,\n ButtonsModule,\n SVGIconModule\n ],\n template: `\n <kendo-dropdownbutton\n [data]=\"copyOptions\"\n [svgIcon]=\"copyIcon\"\n look=\"flat\"\n size=\"small\"\n title=\"Copy Entity ID to clipboard\"\n (itemClick)=\"copyToClipboard($event)\">\n <ng-template kendoDropDownButtonItemTemplate let-item>\n <div class=\"copy-item\">\n <span class=\"copy-label\">{{ item.label }}</span>\n <span class=\"copy-value\">{{ item.displayText }}</span>\n </div>\n </ng-template>\n Copy ID\n </kendo-dropdownbutton>\n `,\n styles: [`\n :host {\n display: inline-block;\n }\n\n kendo-dropdownbutton {\n ::ng-deep {\n .k-button {\n color: var(--kendo-color-primary, #64ceb9) !important;\n border: 1px solid var(--kendo-color-border, rgba(100, 206, 185, 0.3)) !important;\n\n &:hover {\n background: var(--kendo-color-base-hover, rgba(100, 206, 185, 0.15)) !important;\n border-color: var(--kendo-color-primary, rgba(100, 206, 185, 0.5)) !important;\n }\n }\n\n .k-popup {\n min-width: 350px;\n }\n\n .k-menu-item {\n padding: 0 !important;\n }\n }\n }\n\n .copy-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 12px;\n width: 100%;\n }\n\n .copy-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--kendo-color-primary, #64ceb9);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .copy-value {\n font-family: 'Roboto Mono', monospace;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #9292a6);\n word-break: break-all;\n }\n `]\n})\nexport class EntityIdInfoComponent {\n private readonly notificationService = inject(NotificationDisplayService);\n\n protected readonly copyIcon = copyIcon;\n\n /** The RtId (ObjectId) of the entity */\n @Input({ required: true }) rtId!: string;\n\n /** The RtCkTypeId - runtime CK type ID (e.g., System.Communication/MeshAdapter) */\n @Input({ required: true }) rtCkTypeId!: string;\n\n /** The CkTypeId - full versioned Construction Kit type ID (e.g., System.Communication-2.0.3/MeshAdapter-1) */\n @Input() ckTypeId?: string;\n\n protected get copyOptions(): CopyOption[] {\n const fullCkTypeId = this.ckTypeId || this.rtCkTypeId;\n const rtEntityId = `${this.rtCkTypeId}@${this.rtId}`;\n\n return [\n {\n label: 'RtId',\n value: this.rtId,\n displayText: this.truncateValue(this.rtId, 24)\n },\n {\n label: 'CkTypeId',\n value: fullCkTypeId,\n displayText: this.truncateValue(fullCkTypeId, 40)\n },\n {\n label: 'RtCkTypeId',\n value: this.rtCkTypeId,\n displayText: this.truncateValue(this.rtCkTypeId, 40)\n },\n {\n label: 'RtEntityId',\n value: rtEntityId,\n displayText: this.truncateValue(rtEntityId, 40)\n }\n ];\n }\n\n private truncateValue(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength - 3) + '...';\n }\n\n protected async copyToClipboard(option: CopyOption): Promise<void> {\n try {\n await navigator.clipboard.writeText(option.value);\n this.notificationService.showSuccess(`${option.label} copied`, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n this.notificationService.showError('Failed to copy to clipboard');\n }\n }\n}\n","import {Component, Input} from '@angular/core';\n\n/**\n * Animated OctoMesh logo loader component.\n * Displays the OctoMesh octopus SVG with wiggling tentacles\n * and orbiting data blocks representing data loading.\n *\n * Uses `--kendo-color-primary` for theme-independent coloring.\n * Override the color via CSS `color` property on the host element.\n *\n * @example\n * ```html\n * <mm-octo-loader [size]=\"'medium'\"></mm-octo-loader>\n * <mm-octo-loader [size]=\"'small'\"></mm-octo-loader>\n * ```\n */\n@Component({\n selector: 'mm-octo-loader',\n standalone: true,\n template: `\n <div class=\"octo-loader\" [class.octo-loader--small]=\"size === 'small'\" [class.octo-loader--medium]=\"size === 'medium'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 -8 112 118\" class=\"octo-loader__svg\" overflow=\"visible\">\n <!-- Orbit track -->\n <circle class=\"octo-orbit\" cx=\"34\" cy=\"48\" r=\"52\" fill=\"none\" stroke-width=\"2.5\" stroke-dasharray=\"5 9\" opacity=\"0.5\">\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"0 34 48\" to=\"360 34 48\" dur=\"12s\" repeatCount=\"indefinite\"/>\n </circle>\n\n <!-- Orbiting data blocks -->\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"0 34 48\" to=\"360 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.95\"/>\n </g>\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"120 34 48\" to=\"480 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.75\"/>\n </g>\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"240 34 48\" to=\"600 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.5\"/>\n </g>\n\n <!-- Octo character -->\n <g>\n <!-- Body -->\n <polygon fill=\"currentColor\"\n points=\"63.04 52.74 63.04 43.04 63.04 38.19 63.04 28.49 67.89 0 43.64 4.24 34.01 4.24 14.61 4.24 0 4.24 0 18.79 0 28.49 0 40.61 0 52.74 14.55 52.74 14.55 52.13 14.55 47.89 4.85 47.89 4.85 43.04 4.85 36.37 4.85 23.64 4.85 17.58 4.85 9.09 19.4 9.09 33.94 9.09 43.64 9.09 62.01 6.02 58.19 28.49 58.19 33.34 58.19 38.19 58.19 43.04 58.19 47.89 48.49 47.89 48.49 52.13 48.49 52.74\"/>\n <!-- Eyes -->\n <rect fill=\"currentColor\" x=\"18.79\" y=\"19.4\" width=\"4.85\" height=\"13.94\"/>\n <rect fill=\"currentColor\" x=\"38.79\" y=\"19.4\" width=\"4.85\" height=\"13.94\"/>\n <!-- Left outer arm -->\n <g class=\"octo-arm octo-arm--ol\">\n <polygon fill=\"currentColor\"\n points=\"0 52.74 9.7 52.74 9.7 72.13 4.85 72.13 4.85 67.28 0 67.28 0 72.13 0 76.98 4.85 76.98 14.55 76.98 14.55 72.13 14.55 52.74\"/>\n </g>\n <!-- Left inner leg -->\n <g class=\"octo-leg octo-leg--left\">\n <polygon fill=\"currentColor\"\n points=\"19.4 91.53 14.55 91.53 14.55 81.83 9.7 81.83 9.7 91.53 9.7 96.38 14.55 96.38 19.4 96.38 24.25 96.38 24.25 91.53 24.25 52.74 19.4 52.74 19.4 91.53\"/>\n </g>\n <!-- Center leg -->\n <g class=\"octo-leg octo-leg--center\">\n <rect fill=\"currentColor\" x=\"29.1\" y=\"52.74\" width=\"4.85\" height=\"33.94\"/>\n </g>\n <!-- Right inner leg -->\n <g class=\"octo-leg octo-leg--right\">\n <polygon fill=\"currentColor\"\n points=\"48.49 91.53 43.64 91.53 43.64 52.74 38.79 52.74 38.79 91.53 38.79 96.38 43.64 96.38 48.49 96.38 53.34 96.38 53.34 91.53 53.34 81.83 48.49 81.83 48.49 91.53\"/>\n </g>\n <!-- Right outer arm -->\n <g class=\"octo-arm octo-arm--or\">\n <polygon fill=\"currentColor\"\n points=\"48.49 52.74 48.49 72.13 48.49 76.98 58.19 76.98 63.04 76.98 63.04 67.28 58.19 67.28 58.19 72.13 53.34 72.13 53.34 52.74 63.04 52.74\"/>\n </g>\n </g>\n\n <!-- Data flow: orbit → left arm → body → left arm → orbit -->\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" begin=\"-2s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-2s\" repeatCount=\"indefinite\"/>\n </rect>\n\n <!-- Data flow: orbit → right arm → body → right arm → orbit -->\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-1.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-1.5s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-2.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-2.5s\" repeatCount=\"indefinite\"/>\n </rect>\n </svg>\n </div>\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--kendo-color-primary, #64ceb9);\n }\n\n .octo-loader {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .octo-loader--small .octo-loader__svg {\n width: 24px;\n height: 24px;\n }\n\n .octo-loader--medium .octo-loader__svg {\n width: 48px;\n height: 48px;\n }\n\n /* Outer arms wiggle */\n .octo-arm--ol {\n transform-origin: 7px 52.74px;\n animation: octo-wiggle-outer 1.2s ease-in-out infinite;\n }\n\n .octo-arm--or {\n transform-origin: 56px 52.74px;\n animation: octo-wiggle-outer 1.2s ease-in-out infinite;\n animation-delay: -0.6s;\n }\n\n /* Inner legs wiggle */\n .octo-leg--left {\n transform-origin: 21.8px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite;\n }\n\n .octo-leg--center {\n transform-origin: 31.5px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite reverse;\n animation-delay: -0.33s;\n }\n\n .octo-leg--right {\n transform-origin: 46px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite;\n animation-delay: -0.66s;\n }\n\n @keyframes octo-wiggle-inner {\n 0%, 100% { transform: rotate(-5deg); }\n 50% { transform: rotate(5deg); }\n }\n\n @keyframes octo-wiggle-outer {\n 0%, 100% { transform: rotate(-4deg); }\n 50% { transform: rotate(4deg); }\n }\n\n .octo-orbit {\n stroke: var(--neo-cyan, #00a8dc);\n }\n\n .octo-data {\n fill: var(--neo-cyan, #00a8dc);\n }\n `]\n})\nexport class OctoLoaderComponent {\n @Input() size: 'small' | 'medium' = 'medium';\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output,\n ViewChild\n} from '@angular/core';\nimport { PopupComponent } from '@progress/kendo-angular-popup';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { SVGIconComponent } from '@progress/kendo-angular-icons';\nimport { arrowRotateCwIcon } from '@progress/kendo-svg-icons';\n\n@Component({\n selector: 'mm-tenant-switcher',\n standalone: true,\n imports: [\n PopupComponent,\n ButtonComponent,\n SVGIconComponent\n ],\n template: `\n @if (currentTenantId) {\n <div #badgeEl class=\"tenant-badge\" [class.denied]=\"isDenied\" (click)=\"onToggle()\">\n <span class=\"tenant-icon\">{{ isDenied ? '\\u26A0' : '\\u25C6' }}</span>\n <span class=\"tenant-name\">{{ currentTenantId }}</span>\n @if (isDenied) {\n <span class=\"denied-label\">NO ACCESS</span>\n }\n </div>\n\n @if (showPopup && !isDenied) {\n <kendo-popup #popupContent [anchor]=\"badgeEl\"\n (anchorViewportLeave)=\"showPopup = false\">\n <div class=\"tenant-popup\">\n <div class=\"tenant-popup-header\">\n <span>Switch Tenant</span>\n <button kendoButton fillMode=\"flat\" size=\"small\" class=\"refresh-btn\"\n [disabled]=\"isRefreshing\"\n title=\"Refresh tenant list\"\n (click)=\"onRefresh($event)\">\n <kendo-svgicon [icon]=\"refreshIcon\" size=\"small\"\n [class.spinning]=\"isRefreshing\"></kendo-svgicon>\n </button>\n </div>\n <ul class=\"tenant-list\">\n @for (tenant of allowedTenants; track tenant) {\n <li class=\"tenant-list-item\" [class.active]=\"tenant === currentTenantId\"\n (click)=\"onSelectTenant(tenant)\">\n <span class=\"tenant-list-icon\">&#9670;</span>\n <span>{{ tenant }}</span>\n </li>\n }\n </ul>\n </div>\n </kendo-popup>\n }\n }\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n .tenant-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent));\n border: 1px solid var(--mm-tenant-switcher-border, var(--kendo-color-border, #dee2e6));\n border-radius: var(--mm-tenant-switcher-radius, 4px 16px 16px 4px);\n box-shadow: var(--mm-tenant-switcher-shadow, none);\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--mm-tenant-switcher-bg-hover, var(--kendo-color-base-hover, rgba(0, 0, 0, 0.04)));\n box-shadow: var(--mm-tenant-switcher-shadow-hover, var(--mm-tenant-switcher-shadow, none));\n }\n }\n\n .tenant-icon {\n font-size: 0.7rem;\n color: var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));\n animation: var(--mm-tenant-switcher-icon-animation, none);\n }\n\n .tenant-name {\n font-family: var(--mm-tenant-switcher-font, inherit);\n font-size: 0.85rem;\n font-weight: 600;\n letter-spacing: 1px;\n color: var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));\n text-transform: uppercase;\n text-shadow: var(--mm-tenant-switcher-text-shadow, none);\n }\n\n .denied {\n background: var(--mm-tenant-switcher-denied-bg, var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent)));\n border-color: var(--mm-tenant-switcher-denied-border, var(--kendo-color-error, #d9534f));\n box-shadow: var(--mm-tenant-switcher-denied-shadow, none);\n }\n\n .denied .tenant-icon,\n .denied .tenant-name {\n color: var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));\n text-shadow: var(--mm-tenant-switcher-denied-text-shadow, none);\n }\n\n .denied-label {\n font-family: var(--mm-tenant-switcher-font, inherit);\n font-size: 0.55rem;\n font-weight: 700;\n letter-spacing: 1px;\n color: var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));\n background: var(--mm-tenant-switcher-denied-label-bg, color-mix(in srgb, var(--kendo-color-error, #d9534f) 15%, transparent));\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .tenant-popup {\n min-width: 220px;\n padding: 8px 0;\n background: var(--kendo-color-surface, #fff);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .tenant-popup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--kendo-color-subtle, #666);\n border-bottom: 1px solid var(--kendo-color-border, #dee2e6);\n margin-bottom: 4px;\n }\n\n .refresh-btn {\n padding: 2px;\n min-width: unset;\n }\n\n .spinning {\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n .tenant-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .tenant-list-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 16px;\n cursor: pointer;\n font-size: 0.85rem;\n transition: background 0.15s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover, rgba(0, 0, 0, 0.04));\n }\n\n &.active {\n color: var(--kendo-color-primary, #ff6358);\n font-weight: 600;\n }\n }\n\n .tenant-list-icon {\n font-size: 0.5rem;\n color: var(--kendo-color-subtle, #666);\n }\n\n .tenant-list-item.active .tenant-list-icon {\n color: var(--kendo-color-primary, #ff6358);\n }\n\n @keyframes mm-icon-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.7; transform: scale(1.1); }\n }\n `]\n})\nexport class TenantSwitcherComponent {\n @Input() currentTenantId: string | null = null;\n @Input() allowedTenants: string[] = [];\n @Input() isDenied = false;\n\n @Output() tenantSelected = new EventEmitter<string>();\n @Output() refreshRequested = new EventEmitter<void>();\n\n protected readonly refreshIcon = arrowRotateCwIcon;\n protected isRefreshing = false;\n\n @ViewChild('badgeEl', { read: ElementRef })\n private anchor: ElementRef | null = null;\n\n @ViewChild('popupContent', { read: ElementRef })\n private popup: ElementRef | null = null;\n\n showPopup = false;\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.code === 'Escape') {\n this.showPopup = false;\n }\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.contains(event.target)) {\n this.showPopup = false;\n }\n }\n\n onToggle(): void {\n if (!this.isDenied) {\n this.showPopup = !this.showPopup;\n }\n }\n\n onSelectTenant(tenantId: string): void {\n if (tenantId !== this.currentTenantId) {\n this.tenantSelected.emit(tenantId);\n }\n this.showPopup = false;\n }\n\n onRefresh(event: MouseEvent): void {\n event.stopPropagation();\n if (!this.isRefreshing) {\n this.isRefreshing = true;\n this.refreshRequested.emit();\n // Reset spinning after a short delay to give visual feedback\n setTimeout(() => this.isRefreshing = false, 1500);\n }\n }\n\n private contains(target: EventTarget | null): boolean {\n return (\n (this.anchor?.nativeElement.contains(target) ?? false) ||\n (this.popup?.nativeElement.contains(target) ?? false)\n );\n }\n}\n","/*\n * Public API Surface of octo-ui\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport { provideOctoServices } from \"@meshmakers/octo-services\";\nimport { provideMmSharedUi } from \"@meshmakers/shared-ui\";\nimport { provideMmSharedAuth } from \"@meshmakers/shared-auth\";\nimport { AttributeSortSelectorDialogService } from './lib/attribute-sort-selector-dialog';\nimport { PropertyConverterService } from './lib/property-grid';\nimport { CkTypeSelectorDialogService } from './lib/ck-type-selector-dialog';\nimport { RuntimeEntityVariableDialogService } from './lib/runtime-entity-variable-dialog';\n\nexport * from './lib/data-sources/octo-graph-ql-data-source';\nexport * from './lib/data-sources/octo-graph-ql-hierarchy-data-source';\nexport * from './lib/property-grid';\nexport * from './lib/attribute-selector-dialog';\nexport * from './lib/attribute-sort-selector-dialog';\nexport * from './lib/ck-type-selector-dialog';\nexport * from './lib/ck-type-selector-input';\nexport * from './lib/field-filter-editor';\nexport * from './lib/entity-id-info';\nexport * from './lib/octo-loader';\nexport * from './lib/tenant-switcher';\nexport * from './lib/runtime-entity-variable-dialog';\n\n/**\n * Provides OctoUi services using modern Angular provider functions.\n * This is the recommended approach for library providers.\n */\nexport function provideOctoUi(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideOctoServices(),\n provideMmSharedUi(),\n provideMmSharedAuth(),\n AttributeSortSelectorDialogService,\n PropertyConverterService,\n CkTypeSelectorDialogService,\n RuntimeEntityVariableDialogService\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["AttributeValueTypeDto","i1","i2","i3","i4","i5","i6"],"mappings":"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"}
1
+ {"version":3,"file":"meshmakers-octo-ui.mjs","sources":["../../../../projects/meshmakers/octo-ui/src/lib/attribute-sort-selector-dialog/attribute-sort-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-sort-selector-dialog/attribute-sort-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/models/property-grid.models.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/services/property-converter.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/components/property-value-display.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/components/property-grid.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/property-grid/index.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-dialog/ck-type-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-dialog/ck-type-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/ck-type-selector-input/ck-type-selector-input.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-selector-dialog/attribute-selector-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/attribute-selector-dialog/attribute-selector-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/runtime-entity-variable-dialog/runtime-entity-variable-dialog.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/runtime-entity-variable-dialog/runtime-entity-variable-dialog.service.ts","../../../../projects/meshmakers/octo-ui/src/lib/data-sources/octo-graph-ql-data-source.ts","../../../../projects/meshmakers/octo-ui/src/lib/data-sources/octo-graph-ql-hierarchy-data-source.ts","../../../../projects/meshmakers/octo-ui/src/lib/field-filter-editor/field-filter-editor.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/entity-id-info/entity-id-info.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/octo-loader/octo-loader.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/tenant-switcher/tenant-switcher.component.ts","../../../../projects/meshmakers/octo-ui/src/public-api.ts","../../../../projects/meshmakers/octo-ui/src/meshmakers-octo-ui.ts"],"sourcesContent":["import { Component, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule, GridDataResult, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { searchIcon, sortAscSmallIcon, sortDescSmallIcon } from '@progress/kendo-svg-icons';\nimport { AttributeSelectorService, AttributeItem, AttributeValueTypeDto } from '@meshmakers/octo-services';\nimport { WindowModule, WindowRef } from '@progress/kendo-angular-dialog';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface AttributeSortItem {\n attributePath: string;\n attributeValueType: string;\n sortOrder: 'standard' | 'ascending' | 'descending';\n}\n\nexport interface AttributeSortSelectorDialogData {\n ckTypeId: string;\n selectedAttributes?: AttributeSortItem[];\n dialogTitle?: string;\n /** When set, controls whether navigation properties are included in the attribute list */\n includeNavigationProperties?: boolean;\n /** When true, hides the navigation property controls (if they were to be added) */\n hideNavigationControls?: boolean;\n /** When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching) */\n attributePaths?: string[];\n}\n\nexport interface AttributeSortSelectorDialogResult {\n selectedAttributes: AttributeSortItem[];\n}\n\nexport interface SortOption {\n text: string;\n value: 'standard' | 'ascending' | 'descending';\n}\n\ninterface ValueTypeFilterOption {\n text: string;\n value: AttributeValueTypeDto | null;\n}\n\n@Component({\n selector: 'mm-attribute-sort-selector-dialog',\n standalone: true,\n host: { 'data-component': 'attribute-sort-selector' },\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownListModule,\n IconsModule,\n WindowModule\n ],\n template: `\n <div class=\"attribute-sort-selector-container\">\n <!-- Filter Section -->\n <div class=\"filter-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search path & description...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\n <kendo-dropdownlist\n [data]=\"valueTypeOptions\"\n [(ngModel)]=\"selectedValueTypeFilter\"\n (valueChange)=\"onValueTypeFilterChange($event)\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"type-filter-dropdown\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Main Content Area - All side by side -->\n <div class=\"lists-container\">\n <!-- Available Attributes -->\n <div class=\"list-section\">\n <h4>Available Attributes</h4>\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <!-- Sort Options in center -->\n <div class=\"sort-options-section\">\n <h4>Sort Order</h4>\n <div class=\"sort-buttons\">\n <button\n kendoButton\n [fillMode]=\"currentSortOrder === 'standard' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'standard' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('standard')\"\n class=\"sort-button\"\n title=\"Standard (no sort)\">\n —\n </button>\n <button\n kendoButton\n [svgIcon]=\"sortAscIcon\"\n [fillMode]=\"currentSortOrder === 'ascending' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'ascending' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('ascending')\"\n class=\"sort-button\"\n title=\"Ascending\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"sortDescIcon\"\n [fillMode]=\"currentSortOrder === 'descending' ? 'solid' : 'outline'\"\n [themeColor]=\"currentSortOrder === 'descending' ? 'primary' : 'base'\"\n (click)=\"setSortOrder('descending')\"\n class=\"sort-button\"\n title=\"Descending\">\n </button>\n </div>\n\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"selectedAvailableKeys.length === 0\"\n (click)=\"addAttributeWithSort()\"\n class=\"add-button\">\n Add →\n </button>\n </div>\n\n <!-- Selected Attributes -->\n <div class=\"list-section\">\n <h4>Selected ({{ selectedAttributes.length }})</h4>\n <kendo-grid\n [data]=\"selectedGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"180\"></kendo-grid-column>\n <kendo-grid-column field=\"sortOrder\" title=\"Sort\" [width]=\"100\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"sort-display\">\n <span class=\"sort-indicator\">{{ getSortIndicator(dataItem.sortOrder) }}</span>\n <span>{{ getSortText(dataItem.sortOrder) }}</span>\n </div>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column title=\"\" [width]=\"50\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <button\n kendoButton\n size=\"small\"\n fillMode=\"flat\"\n (click)=\"removeAttribute(dataItem)\"\n title=\"Remove\">\n ✕\n </button>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </div>\n\n <!-- Action Bar -->\n <div class=\"action-bar\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" (click)=\"onOk()\">Apply</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .attribute-sort-selector-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .filter-container {\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .search-input {\n flex: 1;\n }\n\n .type-filter-dropdown {\n width: 160px;\n flex-shrink: 0;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .list-section h4, .sort-options-section h4 {\n margin: 0 0 10px 0;\n font-size: 0.85rem;\n font-weight: 600;\n flex-shrink: 0;\n }\n\n .attribute-grid {\n border-radius: 4px;\n flex: 1;\n min-height: 200px;\n }\n\n .attribute-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .sort-options-section {\n width: 120px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n padding-top: 32px;\n }\n\n .sort-buttons {\n display: flex;\n flex-direction: row;\n gap: 4px;\n }\n\n .sort-button {\n flex: 1;\n min-width: 36px;\n height: 36px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .add-button {\n width: 100%;\n margin-top: 16px;\n }\n\n .sort-display {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .sort-indicator {\n font-size: 14px;\n font-weight: bold;\n color: var(--kendo-color-primary, #ff6358);\n }\n\n .action-bar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #dee2e6);\n }\n `]\n})\nexport class AttributeSortSelectorDialogComponent implements OnInit {\n private readonly windowRef = inject(WindowRef);\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n // Dialog data\n public data!: AttributeSortSelectorDialogData;\n public ckTypeId!: string;\n public includeNavigationProperties: boolean | undefined = undefined;\n private attributePathsSet: Set<string> | null = null;\n public searchText = '';\n public currentSortOrder: 'standard' | 'ascending' | 'descending' = 'standard';\n public selectedValueTypeFilter: AttributeValueTypeDto | null = null;\n\n // Grid data\n public availableAttributes: AttributeItem[] = [];\n public selectedAttributes: AttributeSortItem[] = [];\n public availableGridData: GridDataResult = { data: [], total: 0 };\n public selectedGridData: GridDataResult = { data: [], total: 0 };\n\n // Selection tracking\n public selectedAvailableKeys: string[] = [];\n public selectedChosenKeys: string[] = [];\n\n // Double-click tracking\n private lastClickTime = 0;\n private lastClickedItem: string | null = null;\n private readonly doubleClickDelay = 300;\n\n // UI configuration\n public dialogTitle = 'Select Attributes with Sort Order';\n\n public sortOptions: SortOption[] = [\n { text: 'Standard', value: 'standard' },\n { text: 'Ascending', value: 'ascending' },\n { text: 'Descending', value: 'descending' }\n ];\n\n public valueTypeOptions: ValueTypeFilterOption[] = [\n { text: 'All Types', value: null },\n { text: 'String', value: AttributeValueTypeDto.StringDto },\n { text: 'Integer', value: AttributeValueTypeDto.IntegerDto },\n { text: 'Double', value: AttributeValueTypeDto.DoubleDto },\n { text: 'Boolean', value: AttributeValueTypeDto.BooleanDto },\n { text: 'DateTime', value: AttributeValueTypeDto.DateTimeDto },\n { text: 'DateTimeOffset', value: AttributeValueTypeDto.DateTimeOffsetDto },\n { text: 'Enum', value: AttributeValueTypeDto.EnumDto },\n { text: 'TimeSpan', value: AttributeValueTypeDto.TimeSpanDto }\n ];\n\n // Icons\n protected readonly searchIcon = searchIcon;\n protected readonly sortAscIcon = sortAscSmallIcon;\n protected readonly sortDescIcon = sortDescSmallIcon;\n\n ngOnInit(): void {\n // Get dialog data\n if (this.data) {\n this.ckTypeId = this.data.ckTypeId;\n this.dialogTitle = this.data.dialogTitle || 'Select Attributes with Sort Order';\n this.includeNavigationProperties = this.data.includeNavigationProperties;\n this.attributePathsSet = this.data.attributePaths ? new Set(this.data.attributePaths) : null;\n\n if (this.data.selectedAttributes && this.data.selectedAttributes.length > 0) {\n this.selectedAttributes = [...this.data.selectedAttributes];\n this.updateSelectedGrid();\n }\n }\n\n // Set up search debouncing\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(searchText => {\n this.loadAvailableAttributes(searchText);\n });\n\n // Load initial data\n this.loadAvailableAttributes();\n }\n\n private loadAvailableAttributes(searchTerm?: string): void {\n this.attributeService.getAvailableAttributes(\n this.ckTypeId, undefined, undefined, undefined,\n this.selectedValueTypeFilter || undefined,\n searchTerm || undefined,\n this.includeNavigationProperties,\n undefined\n ).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n\n // Apply client-side attribute path restriction if set\n const filteredItems = this.attributePathsSet\n ? result.items.filter(item => this.attributePathsSet!.has(item.attributePath))\n : result.items;\n\n this.availableAttributes = filteredItems.filter(item => !selectedPaths.has(item.attributePath));\n this.updateAvailableGrid();\n });\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onValueTypeFilterChange(_value: AttributeValueTypeDto | null): void {\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public setSortOrder(order: 'standard' | 'ascending' | 'descending'): void {\n this.currentSortOrder = order;\n }\n\n public addAttributeWithSort(): void {\n if (this.selectedAvailableKeys.length === 0) return;\n\n const attributePath = this.selectedAvailableKeys[0];\n const attribute = this.availableAttributes.find(a => a.attributePath === attributePath);\n\n if (attribute) {\n this.addAttributeToSelected(attribute);\n }\n }\n\n public onAvailableCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - add attribute with current sort\n this.addAttributeToSelected(dataItem);\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n public onSelectedCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeSortItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - remove attribute\n this.removeAttribute(dataItem);\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n private addAttributeToSelected(attribute: AttributeItem): void {\n const sortItem: AttributeSortItem = {\n attributePath: attribute.attributePath,\n attributeValueType: attribute.attributeValueType,\n sortOrder: this.currentSortOrder\n };\n\n this.selectedAttributes.push(sortItem);\n\n // Remove from available\n this.availableAttributes = this.availableAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Clear selections\n this.selectedAvailableKeys = [];\n\n this.updateGrids();\n }\n\n public removeAttribute(attribute: AttributeSortItem): void {\n // Remove from selected\n this.selectedAttributes = this.selectedAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add back to available (convert back to AttributeItem)\n const availableItem: AttributeItem = {\n attributePath: attribute.attributePath,\n attributeValueType: attribute.attributeValueType\n };\n\n this.availableAttributes.push(availableItem);\n this.availableAttributes.sort((a, b) => a.attributePath.localeCompare(b.attributePath));\n\n // Clear selections\n this.selectedChosenKeys = this.selectedChosenKeys.filter(\n key => key !== attribute.attributePath\n );\n\n this.updateGrids();\n }\n\n public getSortIndicator(sortOrder: string): string {\n switch (sortOrder) {\n case 'ascending': return '↑';\n case 'descending': return '↓';\n default: return '';\n }\n }\n\n public getSortText(sortOrder: string): string {\n const option = this.sortOptions.find(opt => opt.value === sortOrder);\n return option?.text || sortOrder;\n }\n\n private updateGrids(): void {\n this.updateAvailableGrid();\n this.updateSelectedGrid();\n }\n\n private updateAvailableGrid(): void {\n this.availableGridData = {\n data: this.availableAttributes,\n total: this.availableAttributes.length\n };\n }\n\n private updateSelectedGrid(): void {\n this.selectedGridData = {\n data: this.selectedAttributes,\n total: this.selectedAttributes.length\n };\n }\n\n public onOk(): void {\n const result: AttributeSortSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n this.windowRef.close(result);\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n AttributeSortSelectorDialogComponent,\n AttributeSortSelectorDialogData,\n AttributeSortSelectorDialogResult,\n AttributeSortItem\n} from './attribute-sort-selector-dialog.component';\n\nexport interface AttributeSortSelectorResult {\n confirmed: boolean;\n selectedAttributes: AttributeSortItem[];\n}\n\n@Injectable()\nexport class AttributeSortSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the attribute sort selector dialog\n * @param ckTypeId The CkType ID to fetch attributes for\n * @param selectedAttributes Optional array of pre-selected attributes with sort orders\n * @param dialogTitle Optional custom dialog title\n * @param includeNavigationProperties Optional flag to control navigation property inclusion\n * @param hideNavigationControls Optional flag to hide the navigation property controls\n * @returns Promise that resolves with the result containing selected attributes with sort orders and confirmation status\n */\n public async openAttributeSortSelector(\n ckTypeId: string,\n selectedAttributes?: AttributeSortItem[],\n dialogTitle?: string,\n includeNavigationProperties?: boolean,\n hideNavigationControls?: boolean,\n attributePaths?: string[]\n ): Promise<AttributeSortSelectorResult> {\n const data: AttributeSortSelectorDialogData = {\n ckTypeId,\n selectedAttributes,\n dialogTitle,\n includeNavigationProperties,\n hideNavigationControls,\n attributePaths\n };\n\n const size = this.windowStateService.resolveWindowSize('attribute-sort-selector', { width: 1200, height: 750 });\n\n const windowRef: WindowRef = this.windowService.open({\n content: AttributeSortSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 1050,\n minHeight: 700,\n resizable: true,\n title: dialogTitle || 'Select Attributes with Sort Order'\n });\n\n this.windowStateService.applyModalBehavior('attribute-sort-selector', windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: AttributeSortSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n\n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n const dialogResult = result as AttributeSortSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes || []\n };\n } else {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n }\n}\n","// Note: This should eventually be imported from a shared location\n// For now, we define our own enum that matches the GraphQL generated types\nexport enum AttributeValueTypeDto {\n BinaryDto = 'BINARY',\n BinaryLinkedDto = 'BINARY_LINKED',\n BooleanDto = 'BOOLEAN',\n DateTimeDto = 'DATE_TIME',\n DateTimeOffsetDto = 'DATE_TIME_OFFSET',\n DoubleDto = 'DOUBLE',\n EnumDto = 'ENUM',\n GeospatialPointDto = 'GEOSPATIAL_POINT',\n IntDto = 'INT',\n IntegerDto = 'INTEGER',\n Integer_64Dto = 'INTEGER_64',\n IntegerArrayDto = 'INTEGER_ARRAY',\n Int_64Dto = 'INT_64',\n IntArrayDto = 'INT_ARRAY',\n RecordDto = 'RECORD',\n RecordArrayDto = 'RECORD_ARRAY',\n StringDto = 'STRING',\n StringArrayDto = 'STRING_ARRAY',\n TimeSpanDto = 'TIME_SPAN'\n}\n\n/**\n * Represents a property item in the property grid\n */\nexport interface PropertyGridItem {\n /** Unique identifier for the property */\n id: string;\n /** Property name/key */\n name: string;\n /** Display name for the property (optional, falls back to name) */\n displayName?: string;\n /** Current value of the property */\n value: unknown;\n /** Data type of the property */\n type: AttributeValueTypeDto;\n /** Description/tooltip for the property */\n description?: string;\n /** Whether the property is read-only */\n readOnly?: boolean;\n /** Category for grouping properties */\n category?: string;\n /** Whether the property is required */\n required?: boolean;\n /** Custom validation rules */\n validators?: Record<string, unknown>[];\n /** Custom editor configuration */\n editorConfig?: Record<string, unknown>;\n}\n\n/**\n * Configuration options for the property grid\n */\nexport interface PropertyGridConfig {\n /** Whether the grid is in read-only mode */\n readOnlyMode?: boolean;\n /** Custom editors for specific types */\n customEditors?: Record<string, unknown>;\n /** Whether to show type icons */\n showTypeIcons?: boolean;\n /** Height of the grid */\n height?: string;\n /** Whether to show the search box */\n showSearch?: boolean;\n}\n\n/**\n * Event data for property changes\n */\nexport interface PropertyChangeEvent {\n /** The property that changed */\n property: PropertyGridItem;\n /** The old value */\n oldValue: unknown;\n /** The new value */\n newValue: unknown;\n}\n\n/**\n * Supported display modes for complex values\n */\nexport enum PropertyDisplayMode {\n /** Simple text representation */\n Text = 'text',\n /** JSON formatted display */\n Json = 'json',\n /** Custom template display */\n Custom = 'custom'\n}\n\n/**\n * Categories for default property grouping\n */\nexport enum DefaultPropertyCategory {\n General = 'General',\n System = 'System',\n Attributes = 'Attributes',\n Associations = 'Associations',\n Metadata = 'Metadata'\n}\n\n/**\n * Event data for binary download requests\n */\nexport interface BinaryDownloadEvent {\n /** The binary ID to download */\n binaryId: string;\n /** Optional filename for the download */\n filename?: string;\n /** Optional content type */\n contentType?: string;\n /** Optional download URI if already available */\n downloadUri?: string;\n}","import { Injectable, inject } from '@angular/core';\nimport { Observable, of, forkJoin } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { PropertyGridItem, DefaultPropertyCategory, AttributeValueTypeDto } from '../models/property-grid.models';\nimport { CkTypeAttributeService, CkTypeAttributeInfo } from '@meshmakers/octo-services';\n\n/** Represents an attribute from an RtEntity */\ninterface RtAttribute {\n attributeName?: string | null;\n value?: unknown;\n}\n\n/** Represents an RtRecord with a ckRecordId and attributes */\ninterface RtRecord {\n ckRecordId?: string;\n attributes?: RtAttribute[];\n}\n\n/** Represents an RtEntity with system properties and attributes */\ninterface RtEntity {\n rtId?: string;\n ckTypeId?: string;\n rtCreationDateTime?: string;\n rtChangedDateTime?: string;\n rtWellKnownName?: string;\n attributes?: { items?: RtAttribute[] };\n}\n\n/**\n * Service for converting various data structures to PropertyGridItem format.\n * Uses Construction Kit (CK) type definitions for accurate attribute type resolution.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PropertyConverterService {\n private readonly ckTypeAttributeService = inject(CkTypeAttributeService);\n\n /**\n * Convert OctoMesh RtEntity attributes to property grid items using CK type definitions.\n * @param attributes The attributes array from RtEntity\n * @param ckTypeId The fullName of the CK type to look up attribute types\n * @returns Observable of PropertyGridItem array\n */\n convertRtEntityAttributes(attributes: RtAttribute[] | null | undefined, ckTypeId: string): Observable<PropertyGridItem[]> {\n if (!attributes || attributes.length === 0) {\n return of([]);\n }\n\n return this.ckTypeAttributeService.getCkTypeAttributes(ckTypeId).pipe(\n switchMap(ckAttributes => {\n const ckAttributeMap = this.buildAttributeTypeMap(ckAttributes);\n return this.convertAttributesWithCkTypes(attributes, ckAttributeMap);\n })\n );\n }\n\n /**\n * Convert any JavaScript object to property grid items using reflection.\n * This method remains synchronous as there is no CK type for generic JS objects.\n */\n convertObjectToProperties(obj: Record<string, unknown> | null | undefined, category?: string): PropertyGridItem[] {\n if (!obj || typeof obj !== 'object') {\n return [];\n }\n\n return Object.keys(obj).map(key => ({\n id: `obj_${key}`,\n name: key,\n displayName: key,\n value: obj[key],\n type: this.inferAttributeType(obj[key]),\n category: category || DefaultPropertyCategory.General,\n readOnly: false,\n description: `Property: ${key}`\n }));\n }\n\n /**\n * Convert RtRecord to property grid items using CK type definitions.\n * @param record The record object containing ckRecordId and attributes\n * @returns Observable of PropertyGridItem array\n */\n convertRtRecordToProperties(record: RtRecord | null | undefined): Observable<PropertyGridItem[]> {\n if (!record || typeof record !== 'object' || !record.attributes) {\n return of([]);\n }\n\n const ckRecordId = record.ckRecordId;\n if (!ckRecordId) {\n return of([]);\n }\n\n return this.ckTypeAttributeService.getCkRecordAttributes(ckRecordId).pipe(\n switchMap(ckAttributes => {\n const ckAttributeMap = this.buildAttributeTypeMap(ckAttributes);\n const properties: PropertyGridItem[] = [];\n\n // Add ckRecordId as system property\n properties.push({\n id: 'ckRecordId',\n name: 'ckRecordId',\n displayName: 'Record ID',\n value: ckRecordId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Construction kit record identifier'\n });\n\n // Convert attributes with CK types (record.attributes is guaranteed non-null by the guard above)\n return this.convertAttributesWithCkTypes(record.attributes!, ckAttributeMap).pipe(\n map(attributeProperties => {\n properties.push(...attributeProperties);\n return properties;\n })\n );\n })\n );\n }\n\n /**\n * Convert OctoMesh RtEntity to comprehensive property list using CK type definitions.\n * @param entity The RtEntity object\n * @returns Observable of PropertyGridItem array\n */\n convertRtEntityToProperties(entity: RtEntity): Observable<PropertyGridItem[]> {\n const properties: PropertyGridItem[] = [];\n\n // System properties\n if (entity.rtId) {\n properties.push({\n id: 'rtId',\n name: 'rtId',\n displayName: 'Runtime ID',\n value: entity.rtId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Unique runtime identifier'\n });\n }\n\n if (entity.ckTypeId) {\n properties.push({\n id: 'ckTypeId',\n name: 'ckTypeId',\n displayName: 'Type ID',\n value: entity.ckTypeId,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Construction kit type identifier'\n });\n }\n\n if (entity.rtCreationDateTime) {\n properties.push({\n id: 'rtCreationDateTime',\n name: 'rtCreationDateTime',\n displayName: 'Created',\n value: entity.rtCreationDateTime,\n type: AttributeValueTypeDto.DateTimeDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Creation date and time'\n });\n }\n\n if (entity.rtChangedDateTime) {\n properties.push({\n id: 'rtChangedDateTime',\n name: 'rtChangedDateTime',\n displayName: 'Modified',\n value: entity.rtChangedDateTime,\n type: AttributeValueTypeDto.DateTimeDto,\n category: DefaultPropertyCategory.System,\n readOnly: true,\n description: 'Last modification date and time'\n });\n }\n\n if (entity.rtWellKnownName) {\n properties.push({\n id: 'rtWellKnownName',\n name: 'rtWellKnownName',\n displayName: 'Well Known Name',\n value: entity.rtWellKnownName,\n type: AttributeValueTypeDto.StringDto,\n category: DefaultPropertyCategory.General,\n readOnly: false,\n description: 'Well-known name for the entity'\n });\n }\n\n // If no ckTypeId or no attributes, return system properties only\n if (!entity.ckTypeId || !entity.attributes?.items) {\n return of(properties);\n }\n\n // Load CK type attributes and convert entity attributes\n return this.convertRtEntityAttributes(entity.attributes.items, entity.ckTypeId).pipe(\n map(attributeProperties => {\n properties.push(...attributeProperties);\n return properties;\n })\n );\n }\n\n /**\n * Build a map from attribute name to attribute value type from CK definitions\n */\n private buildAttributeTypeMap(ckAttributes: CkTypeAttributeInfo[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const attr of ckAttributes) {\n map.set(attr.attributeName, attr.attributeValueType);\n }\n return map;\n }\n\n /**\n * Convert attributes using CK type map for type resolution\n */\n private convertAttributesWithCkTypes(\n attributes: RtAttribute[],\n ckAttributeMap: Map<string, string>\n ): Observable<PropertyGridItem[]> {\n if (!attributes || attributes.length === 0) {\n return of([]);\n }\n\n // Check if any attributes have nested records that need async conversion\n const hasNestedRecords = attributes.some(attr =>\n attr?.value && typeof attr.value === 'object' && attr.value !== null && 'attributes' in attr.value\n );\n\n if (!hasNestedRecords) {\n // No nested records - convert synchronously\n const items = attributes.map((attr, index) => this.convertSingleAttribute(attr, index, ckAttributeMap));\n return of(items);\n }\n\n // Has nested records - need to handle async conversion\n const conversionObservables = attributes.map((attr, index) => {\n if (attr?.value && typeof attr.value === 'object' && attr.value !== null && 'attributes' in attr.value) {\n // Nested record - convert async\n return this.convertRtRecordToProperties(attr.value as RtRecord).pipe(\n map(nestedProperties => ({\n id: `attr_${index}_${attr?.attributeName || 'unknown'}`,\n name: attr?.attributeName || `attribute_${index}`,\n displayName: attr?.attributeName || `attribute_${index}`,\n value: nestedProperties,\n type: this.getAttributeType(attr?.attributeName, ckAttributeMap),\n category: DefaultPropertyCategory.Attributes,\n readOnly: false,\n description: `Attribute: ${attr?.attributeName}`\n }))\n );\n } else {\n // Regular attribute - return as observable\n return of(this.convertSingleAttribute(attr, index, ckAttributeMap));\n }\n });\n\n return forkJoin(conversionObservables);\n }\n\n /**\n * Convert a single attribute to PropertyGridItem\n */\n private convertSingleAttribute(\n attr: RtAttribute,\n index: number,\n ckAttributeMap: Map<string, string>\n ): PropertyGridItem {\n const value = this.convertRtEntityAttributeValueSync(attr?.value);\n\n return {\n id: `attr_${index}_${attr?.attributeName || 'unknown'}`,\n name: attr?.attributeName || `attribute_${index}`,\n displayName: attr?.attributeName || `attribute_${index}`,\n value: value,\n type: this.getAttributeType(attr?.attributeName, ckAttributeMap),\n category: DefaultPropertyCategory.Attributes,\n readOnly: false,\n description: `Attribute: ${attr?.attributeName}`\n };\n }\n\n /**\n * Get attribute type from CK map\n */\n private getAttributeType(attributeName: string | null | undefined, ckAttributeMap: Map<string, string>): AttributeValueTypeDto {\n if (!attributeName) {\n return AttributeValueTypeDto.StringDto;\n }\n\n const ckType = ckAttributeMap.get(attributeName);\n if (ckType) {\n return this.mapCkTypeToAttributeValueType(ckType);\n }\n\n // Fallback for attributes not found in CK (should not happen in normal cases)\n return AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Map CK type string to AttributeValueTypeDto enum\n */\n private mapCkTypeToAttributeValueType(ckType: string): AttributeValueTypeDto {\n // The ckType from GraphQL should match the enum values\n const typeMap: Record<string, AttributeValueTypeDto> = {\n 'BINARY': AttributeValueTypeDto.BinaryDto,\n 'BINARY_LINKED': AttributeValueTypeDto.BinaryLinkedDto,\n 'BOOLEAN': AttributeValueTypeDto.BooleanDto,\n 'DATE_TIME': AttributeValueTypeDto.DateTimeDto,\n 'DATE_TIME_OFFSET': AttributeValueTypeDto.DateTimeOffsetDto,\n 'DOUBLE': AttributeValueTypeDto.DoubleDto,\n 'ENUM': AttributeValueTypeDto.EnumDto,\n 'GEOSPATIAL_POINT': AttributeValueTypeDto.GeospatialPointDto,\n 'INT': AttributeValueTypeDto.IntDto,\n 'INTEGER': AttributeValueTypeDto.IntegerDto,\n 'INTEGER_64': AttributeValueTypeDto.Integer_64Dto,\n 'INTEGER_ARRAY': AttributeValueTypeDto.IntegerArrayDto,\n 'INT_64': AttributeValueTypeDto.Int_64Dto,\n 'INT_ARRAY': AttributeValueTypeDto.IntArrayDto,\n 'RECORD': AttributeValueTypeDto.RecordDto,\n 'RECORD_ARRAY': AttributeValueTypeDto.RecordArrayDto,\n 'STRING': AttributeValueTypeDto.StringDto,\n 'STRING_ARRAY': AttributeValueTypeDto.StringArrayDto,\n 'TIME_SPAN': AttributeValueTypeDto.TimeSpanDto\n };\n\n return typeMap[ckType] || AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Convert attribute value synchronously (for non-record values)\n */\n private convertRtEntityAttributeValueSync(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n return value.map(v => this.convertRtEntityAttributeValueSync(v));\n }\n\n // For nested records, return as-is (will be handled by async conversion if needed)\n if (typeof value === 'object' && 'attributes' in value) {\n return value;\n }\n\n return value;\n }\n\n /**\n * Infer attribute type from JavaScript value.\n * Used only for convertObjectToProperties where no CK type is available.\n */\n private inferAttributeType(value: unknown): AttributeValueTypeDto {\n if (value === null || value === undefined) {\n return AttributeValueTypeDto.StringDto;\n }\n\n if (typeof value === 'boolean') {\n return AttributeValueTypeDto.BooleanDto;\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? AttributeValueTypeDto.IntDto : AttributeValueTypeDto.DoubleDto;\n }\n\n if (typeof value === 'string') {\n if (this.isIsoDateString(value)) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n return AttributeValueTypeDto.StringDto;\n }\n\n if (value instanceof Date) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n const firstType = this.inferAttributeType(value[0]);\n switch (firstType) {\n case AttributeValueTypeDto.StringDto:\n return AttributeValueTypeDto.StringArrayDto;\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.DoubleDto:\n return AttributeValueTypeDto.IntegerArrayDto;\n case AttributeValueTypeDto.RecordDto:\n return AttributeValueTypeDto.RecordArrayDto;\n default:\n return AttributeValueTypeDto.StringArrayDto;\n }\n }\n return AttributeValueTypeDto.StringArrayDto;\n }\n\n if (typeof value === 'object') {\n return AttributeValueTypeDto.RecordDto;\n }\n\n return AttributeValueTypeDto.StringDto;\n }\n\n /**\n * Check if string is ISO date format\n */\n private isIsoDateString(value: string): boolean {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n return isoDateRegex.test(value) && !isNaN(Date.parse(value));\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { chevronRightIcon, chevronDownIcon, downloadIcon } from '@progress/kendo-svg-icons';\nimport { AttributeValueTypeDto, PropertyDisplayMode, BinaryDownloadEvent } from '../models/property-grid.models';\n\n/** Shape of binary linked value from OctoMesh */\ninterface BinaryLinkedValue {\n binaryId?: string;\n downloadUri?: string;\n filename?: string;\n size?: number;\n contentType?: string;\n}\n\n/**\n * Component for displaying property values with appropriate formatting\n */\n@Component({\n selector: 'mm-property-value-display',\n standalone: true,\n imports: [CommonModule, SVGIconModule, ButtonModule],\n template: `\n <div class=\"property-value-display\" [ngClass]=\"'type-' + type.toLowerCase()\">\n\n @if (isExpandableRecord()) {\n <div class=\"expandable-record\">\n <!-- Expand/Collapse Button and Summary -->\n <div class=\"record-header\" (click)=\"toggleExpansion()\">\n <kendo-svgicon\n [icon]=\"isExpanded ? chevronDownIcon : chevronRightIcon\"\n class=\"expand-icon\">\n </kendo-svgicon>\n <span class=\"record-summary\">{{ getRecordSummary() }}</span>\n <span class=\"type-indicator\" [title]=\"getTypeDescription()\">\n {{ getTypeIndicator() }}\n </span>\n </div>\n\n <!-- Expanded Content -->\n @if (isExpanded) {\n <div class=\"record-content\">\n @if (type === AttributeValueTypeDto.RecordArrayDto && Array.isArray(value)) {\n @for (item of value; track $index) {\n <div class=\"array-item\">\n <span class=\"array-index\">[{{ $index }}]</span>\n <div class=\"nested-properties\">\n @for (prop of getObjectProperties(item); track prop.key) {\n <div class=\"nested-property\">\n <span class=\"property-key\">{{ prop.key }}:</span>\n <mm-property-value-display\n [value]=\"prop.value\"\n [type]=\"getPropertyType(prop.value)\">\n </mm-property-value-display>\n </div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"nested-properties\">\n @for (prop of getObjectProperties(value); track prop.key) {\n <div class=\"nested-property\">\n <span class=\"property-key\">{{ prop.key }}:</span>\n <mm-property-value-display\n [value]=\"prop.value\"\n [type]=\"getPropertyType(prop.value)\">\n </mm-property-value-display>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (isBinaryLinkedWithDownload()) {\n <!-- Binary Linked with download capability -->\n <div class=\"binary-linked-display\">\n <div class=\"binary-info\">\n @if (getBinaryFilename()) {\n <span class=\"filename\">{{ getBinaryFilename() }}</span>\n }\n @if (getBinarySize()) {\n <span class=\"file-size\">({{ formatFileSize(getBinarySize()) }})</span>\n }\n @if (getBinaryContentType()) {\n <span class=\"content-type\">{{ getBinaryContentType() }}</span>\n }\n </div>\n <button\n kendoButton\n size=\"small\"\n fillMode=\"flat\"\n [svgIcon]=\"downloadIcon\"\n title=\"Download file\"\n (click)=\"onDownload()\">\n Download\n </button>\n </div>\n } @else {\n <!-- Non-expandable value display -->\n @switch (displayMode) {\n @case (PropertyDisplayMode.Json) {\n <pre class=\"json-display\">{{ getFormattedValue() }}</pre>\n }\n @case (PropertyDisplayMode.Text) {\n <span class=\"text-display\" [innerHTML]=\"getFormattedValue()\"></span>\n }\n @default {\n <span class=\"default-display\">{{ getFormattedValue() }}</span>\n }\n }\n\n @if (isComplexType() && !isExpandableRecord()) {\n <span class=\"type-indicator\" [title]=\"getTypeDescription()\">\n {{ getTypeIndicator() }}\n </span>\n }\n }\n </div>\n `,\n styles: [`\n .property-value-display {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-height: 20px;\n font-family: inherit;\n width: 100%;\n }\n\n .expandable-record {\n width: 100%;\n }\n\n .record-header {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .record-header:hover {\n background: var(--kendo-color-base-subtle);\n }\n\n .expand-icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n transition: transform 0.2s;\n }\n\n .record-summary {\n flex: 1;\n font-size: 0.9em;\n }\n\n .record-content {\n margin-left: 22px;\n margin-top: 8px;\n border-left: 2px solid var(--kendo-color-border);\n padding-left: 12px;\n background: var(--kendo-color-base-subtle);\n border-radius: 0 4px 4px 0;\n }\n\n .nested-properties {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px;\n }\n\n .nested-property {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-height: 24px;\n }\n\n .property-key {\n font-weight: 500;\n color: var(--kendo-color-primary);\n min-width: 100px;\n flex-shrink: 0;\n font-size: 0.9em;\n }\n\n .array-item {\n border: 1px solid var(--kendo-color-border);\n border-radius: 4px;\n margin-bottom: 8px;\n background: transparent;\n }\n\n .array-index {\n display: inline-block;\n background: var(--kendo-color-primary);\n color: white;\n padding: 2px 8px;\n font-size: 0.8em;\n font-weight: bold;\n border-radius: 4px 0 4px 0;\n margin-bottom: 4px;\n }\n\n .json-display {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n margin: 0;\n padding: 4px 8px;\n background: var(--kendo-color-base-subtle);\n border-radius: 4px;\n max-width: 300px;\n overflow: auto;\n }\n\n .text-display,\n .default-display {\n flex: 1;\n word-break: break-word;\n overflow-wrap: anywhere;\n }\n\n .type-boolean {\n .default-display {\n font-weight: 500;\n &.value-true { color: #28a745; }\n &.value-false { color: #dc3545; }\n }\n }\n\n .type-datetime,\n .type-datetimeoffset {\n .default-display {\n font-family: monospace;\n font-size: 0.9em;\n }\n }\n\n .type-int,\n .type-integer,\n .type-double {\n .default-display {\n font-family: monospace;\n text-align: right;\n }\n }\n\n .type-indicator {\n font-size: 0.75em;\n padding: 2px 6px;\n background: var(--kendo-color-primary);\n color: white;\n border-radius: 3px;\n text-transform: uppercase;\n font-weight: 500;\n flex-shrink: 0;\n }\n\n .empty-value {\n color: var(--kendo-color-subtle);\n font-style: italic;\n }\n\n .null-value {\n color: var(--kendo-color-error);\n font-style: italic;\n }\n\n .binary-linked-display {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n }\n\n .binary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .filename {\n font-weight: 500;\n color: var(--kendo-color-on-app-surface);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .file-size {\n font-size: 0.85em;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n\n .content-type {\n font-size: 0.75em;\n padding: 2px 6px;\n background: var(--kendo-color-base-subtle);\n border-radius: 3px;\n color: var(--kendo-color-subtle);\n flex-shrink: 0;\n }\n `]\n})\nexport class PropertyValueDisplayComponent implements OnInit {\n @Input() value: unknown;\n @Input() type: AttributeValueTypeDto = AttributeValueTypeDto.StringDto;\n @Input() displayMode: PropertyDisplayMode = PropertyDisplayMode.Text;\n\n /** Emitted when a binary download is requested */\n @Output() binaryDownload = new EventEmitter<BinaryDownloadEvent>();\n\n // Expansion state\n isExpanded = false;\n\n readonly PropertyDisplayMode = PropertyDisplayMode;\n readonly AttributeValueTypeDto = AttributeValueTypeDto;\n readonly Array = Array;\n readonly chevronRightIcon = chevronRightIcon;\n readonly chevronDownIcon = chevronDownIcon;\n readonly downloadIcon = downloadIcon;\n\n ngOnInit() {\n // Debug every property value display component creation\n console.log('PropertyValueDisplayComponent ngOnInit:', {\n type: this.type,\n value: this.value,\n valueType: typeof this.value,\n valueStringified: JSON.stringify(this.value),\n isExpandableRecord: this.isExpandableRecord()\n });\n }\n\n /**\n * Get formatted display value\n */\n getFormattedValue(): string {\n if (this.value === null) {\n return '<null>';\n }\n\n if (this.value === undefined) {\n return '<undefined>';\n }\n\n if (this.value === '') {\n return '<empty>';\n }\n\n switch (this.type) {\n case AttributeValueTypeDto.BooleanDto:\n return this.value ? '✓ True' : '✗ False';\n\n case AttributeValueTypeDto.DateTimeDto:\n case AttributeValueTypeDto.DateTimeOffsetDto:\n return this.formatDateTime(this.value);\n\n case AttributeValueTypeDto.StringArrayDto:\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return this.formatArray(this.value);\n\n case AttributeValueTypeDto.RecordDto:\n case AttributeValueTypeDto.RecordArrayDto:\n return this.displayMode === PropertyDisplayMode.Json\n ? JSON.stringify(this.value, null, 2)\n : this.formatObject(this.value);\n\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return this.formatBinary(this.value);\n\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.IntegerDto:\n case AttributeValueTypeDto.Integer_64Dto:\n case AttributeValueTypeDto.Int_64Dto:\n return this.formatNumber(this.value, 0);\n\n case AttributeValueTypeDto.DoubleDto:\n return this.formatNumber(this.value, 2);\n\n default:\n return String(this.value);\n }\n }\n\n /**\n * Check if this is an expandable record type\n */\n isExpandableRecord(): boolean {\n // Comprehensive debug logging\n console.log('PropertyValueDisplay: isExpandableRecord check:', {\n type: this.type,\n typeString: String(this.type),\n typeOf: typeof this.type,\n AttributeValueTypeDtoRecordDto: AttributeValueTypeDto.RecordDto,\n AttributeValueTypeDtoRecordArrayDto: AttributeValueTypeDto.RecordArrayDto,\n typeIsRecordDto: this.type === AttributeValueTypeDto.RecordDto,\n typeIsRecordDtoString: this.type === 'RECORD',\n typeIsRecordArrayDto: this.type === AttributeValueTypeDto.RecordArrayDto,\n value: this.value,\n valueType: typeof this.value,\n valueIsNull: this.value == null,\n valueKeys: this.value && typeof this.value === 'object' ? Object.keys(this.value) : 'not object'\n });\n\n // Check for record types\n const isRecordDto = this.type === AttributeValueTypeDto.RecordDto;\n const isRecordArrayDto = this.type === AttributeValueTypeDto.RecordArrayDto;\n const isRecordType = isRecordDto || isRecordArrayDto;\n\n // Simple check: does it have a value?\n const hasValue = this.value != null;\n\n // Simple check: is it an object or array?\n const isObjectLike = typeof this.value === 'object' && this.value != null;\n\n const result = isRecordType && hasValue && isObjectLike;\n\n console.log('PropertyValueDisplay: Expandable result:', {\n isRecordDto,\n isRecordArrayDto,\n isRecordType,\n hasValue,\n isObjectLike,\n finalResult: result\n });\n\n return result;\n }\n\n /**\n * Check if the type is complex (object/array)\n */\n isComplexType(): boolean {\n return [\n AttributeValueTypeDto.RecordDto,\n AttributeValueTypeDto.RecordArrayDto,\n AttributeValueTypeDto.StringArrayDto,\n AttributeValueTypeDto.IntegerArrayDto,\n AttributeValueTypeDto.IntArrayDto,\n AttributeValueTypeDto.BinaryDto,\n AttributeValueTypeDto.BinaryLinkedDto\n ].includes(this.type);\n }\n\n /**\n * Get type indicator text\n */\n getTypeIndicator(): string {\n switch (this.type) {\n case AttributeValueTypeDto.RecordDto:\n return 'RECORD';\n case AttributeValueTypeDto.RecordArrayDto:\n return 'ARR[RECORD]';\n case AttributeValueTypeDto.StringArrayDto:\n return 'ARR[STR]';\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return 'ARR[INT]';\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return 'BIN';\n default:\n return this.type.replace('_DTO', '').replace('DTO', '');\n }\n }\n\n /**\n * Get type description for tooltip\n */\n getTypeDescription(): string {\n switch (this.type) {\n case AttributeValueTypeDto.RecordDto:\n return 'Complex object';\n case AttributeValueTypeDto.RecordArrayDto:\n return 'Array of complex objects';\n case AttributeValueTypeDto.StringArrayDto:\n return 'Array of strings';\n case AttributeValueTypeDto.IntegerArrayDto:\n case AttributeValueTypeDto.IntArrayDto:\n return 'Array of numbers';\n case AttributeValueTypeDto.BinaryDto:\n case AttributeValueTypeDto.BinaryLinkedDto:\n return 'Binary data';\n default:\n return `Type: ${this.type}`;\n }\n }\n\n /**\n * Format date/time values\n */\n private formatDateTime(value: unknown): string {\n try {\n const date = value instanceof Date ? value : new Date(String(value));\n if (isNaN(date.getTime())) {\n return String(value);\n }\n return date.toLocaleString();\n } catch {\n return String(value);\n }\n }\n\n /**\n * Format array values\n */\n private formatArray(value: unknown): string {\n if (!Array.isArray(value)) {\n return String(value);\n }\n\n if (value.length === 0) {\n return '[]';\n }\n\n if (value.length <= 3) {\n return `[${value.join(', ')}]`;\n }\n\n return `[${value.slice(0, 3).join(', ')}, ... +${value.length - 3} more]`;\n }\n\n /**\n * Format object values\n */\n private formatObject(value: unknown): string {\n if (typeof value !== 'object' || value === null) {\n return String(value);\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 0) {\n return '{}';\n }\n\n if (keys.length <= 2) {\n const preview = keys.map(key => `${key}: ${this.truncateValue(obj[key])}`).join(', ');\n return `{${preview}}`;\n }\n\n return `{${keys.slice(0, 2).map(key => `${key}: ${this.truncateValue(obj[key])}`).join(', ')}, ... +${keys.length - 2} more}`;\n }\n\n /**\n * Format binary data\n */\n private formatBinary(value: unknown): string {\n if (value instanceof ArrayBuffer) {\n return `<Binary: ${value.byteLength} bytes>`;\n }\n if (typeof value === 'string' && value.startsWith('data:')) {\n return '<Base64 Data>';\n }\n return '<Binary Data>';\n }\n\n /**\n * Format numeric values\n */\n private formatNumber(value: unknown, decimals: number): string {\n const num = Number(value);\n if (isNaN(num)) {\n return String(value);\n }\n return decimals > 0 ? num.toFixed(decimals) : num.toString();\n }\n\n /**\n * Truncate long values for preview\n */\n private truncateValue(value: unknown): string {\n const str = String(value);\n return str.length > 20 ? str.substring(0, 20) + '...' : str;\n }\n\n /**\n * Toggle expansion state\n */\n toggleExpansion(): void {\n this.isExpanded = !this.isExpanded;\n }\n\n /**\n * Get summary text for record header\n */\n getRecordSummary(): string {\n if (this.type === AttributeValueTypeDto.RecordArrayDto && Array.isArray(this.value)) {\n return `Array with ${this.value.length} item${this.value.length !== 1 ? 's' : ''}`;\n }\n\n if (typeof this.value === 'object' && this.value !== null) {\n\n // Handle regular objects\n const keys = Object.keys(this.value);\n return `Object with ${keys.length} propert${keys.length !== 1 ? 'ies' : 'y'}`;\n }\n\n return 'Complex object';\n }\n\n /**\n * Get properties of an object for display\n */\n getObjectProperties(obj: unknown): {key: string, value: unknown}[] {\n if (typeof obj !== 'object' || obj === null) {\n return [];\n }\n\n if (Array.isArray(obj) && obj.length > 0 && typeof obj[0] === 'object' && obj[0] !== null && 'id' in obj[0] && obj[0].id === 'ckRecordId') {\n // Handle array of records\n return obj.map((item: Record<string, unknown>) => ({\n key: String(item['name']),\n value: item['value']\n }));\n }\n\n // Handle regular objects\n const record = obj as Record<string, unknown>;\n return Object.keys(record).map(key => ({\n key,\n value: record[key]\n }));\n }\n\n /**\n * Determine the appropriate type for a nested property value\n */\n getPropertyType(value: unknown): AttributeValueTypeDto {\n if (value === null || value === undefined) {\n return AttributeValueTypeDto.StringDto;\n }\n\n if (typeof value === 'boolean') {\n return AttributeValueTypeDto.BooleanDto;\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? AttributeValueTypeDto.IntegerDto : AttributeValueTypeDto.DoubleDto;\n }\n\n if (typeof value === 'string') {\n // Check if it looks like a date\n if (value.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/)) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n return AttributeValueTypeDto.StringDto;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null && 'id' in value[0] && value[0].id === 'ckRecordId') {\n return AttributeValueTypeDto.RecordDto;\n }\n if (value.length > 0 && typeof value[0] === 'object') {\n return AttributeValueTypeDto.RecordArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'string') {\n return AttributeValueTypeDto.StringArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'number') {\n return AttributeValueTypeDto.IntegerArrayDto;\n }\n return AttributeValueTypeDto.StringArrayDto; // fallback\n }\n\n\n return AttributeValueTypeDto.StringDto;\n }\n\n // ========== Binary Linked Methods ==========\n\n /**\n * Check if this is a BINARY_LINKED type with download capability\n */\n isBinaryLinkedWithDownload(): boolean {\n if (this.type !== AttributeValueTypeDto.BinaryLinkedDto) {\n return false;\n }\n\n // Check if value has binaryId or downloadUri (LargeBinaryInfo structure)\n return !!this.value && typeof this.value === 'object' && ('binaryId' in this.value || 'downloadUri' in this.value);\n }\n\n /**\n * Get the filename from binary info\n */\n getBinaryFilename(): string | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).filename || null;\n }\n\n /**\n * Get the file size from binary info\n */\n getBinarySize(): number | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).size || null;\n }\n\n /**\n * Get the content type from binary info\n */\n getBinaryContentType(): string | null {\n if (!this.value || typeof this.value !== 'object') {\n return null;\n }\n return (this.value as BinaryLinkedValue).contentType || null;\n }\n\n /**\n * Format file size to human readable format\n */\n formatFileSize(bytes: number | null): string {\n if (bytes === null || bytes === undefined) {\n return '';\n }\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n let size = bytes;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(unitIndex > 0 ? 1 : 0)} ${units[unitIndex]}`;\n }\n\n /**\n * Handle download button click\n */\n onDownload(): void {\n if (!this.value || typeof this.value !== 'object') {\n console.warn('No binary value available');\n return;\n }\n\n const binaryValue = this.value as BinaryLinkedValue;\n\n // If downloadUri is available, open directly\n if (binaryValue.downloadUri) {\n window.open(binaryValue.downloadUri, '_blank', 'noopener,noreferrer');\n return;\n }\n\n // Otherwise, emit event for parent to handle (needs to load downloadUri)\n if (binaryValue.binaryId) {\n const event: BinaryDownloadEvent = {\n binaryId: binaryValue.binaryId,\n filename: binaryValue.filename,\n contentType: binaryValue.contentType\n };\n this.binaryDownload.emit(event);\n } else {\n console.warn('No binaryId or downloadUri available');\n }\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n SVGIcon,\n fileIcon,\n folderIcon,\n calendarIcon,\n checkboxCheckedIcon,\n listUnorderedIcon\n} from '@progress/kendo-svg-icons';\n\nimport { PropertyGridItem, PropertyGridConfig, PropertyChangeEvent, AttributeValueTypeDto, BinaryDownloadEvent } from '../models/property-grid.models';\nimport { PropertyValueDisplayComponent } from './property-value-display.component';\n\n/**\n * Generic property grid component for OctoMesh\n */\n@Component({\n selector: 'mm-property-grid',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n InputsModule,\n DropDownsModule,\n ButtonsModule,\n SVGIconModule,\n PropertyValueDisplayComponent\n ],\n template: `\n <div class=\"mm-property-grid\" [style.height]=\"config.height || '400px'\">\n\n @if (config.showSearch) {\n <div class=\"search-toolbar\">\n <kendo-textbox\n [(ngModel)]=\"searchTerm\"\n placeholder=\"Search attributes...\"\n (input)=\"onSearch()\"\n [clearButton]=\"true\">\n </kendo-textbox>\n </div>\n }\n\n <kendo-grid\n [data]=\"filteredData\"\n [sortable]=\"true\"\n [resizable]=\"true\"\n [style.height]=\"gridHeight\"\n [selectable]=\"{mode: 'single'}\"\n class=\"property-grid\">\n\n <!-- Property Name Column -->\n <kendo-grid-column\n field=\"displayName\"\n title=\"Property\"\n [width]=\"200\"\n [sortable]=\"true\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <div class=\"property-name-cell\">\n @if (config.showTypeIcons !== false) {\n <kendo-svgicon\n [icon]=\"getTypeIcon(dataItem.type)\"\n class=\"type-icon\">\n </kendo-svgicon>\n }\n <div class=\"property-info\">\n <span class=\"property-name\" [title]=\"dataItem.description\">\n {{ dataItem.displayName || dataItem.name }}\n </span>\n @if (dataItem.required) {\n <span class=\"required-indicator\">*</span>\n }\n @if (dataItem.readOnly) {\n <span class=\"readonly-indicator\" title=\"Read-only\">🔒</span>\n }\n </div>\n </div>\n </ng-template>\n </kendo-grid-column>\n\n <!-- Property Value Column -->\n <kendo-grid-column\n field=\"value\"\n title=\"Value\"\n [sortable]=\"false\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <mm-property-value-display\n [value]=\"dataItem.value\"\n [type]=\"dataItem.type\"\n (binaryDownload)=\"onBinaryDownload($event)\">\n </mm-property-value-display>\n </ng-template>\n </kendo-grid-column>\n\n <!-- Type Column (optional) -->\n @if (showTypeColumn) {\n <kendo-grid-column\n field=\"type\"\n title=\"Type\"\n [width]=\"120\"\n [sortable]=\"true\">\n <ng-template kendoGridCellTemplate let-dataItem=\"dataItem\">\n <span class=\"type-badge\" [ngClass]=\"'type-' + dataItem.type.toLowerCase()\">\n {{ formatTypeName(dataItem.type) }}\n </span>\n </ng-template>\n </kendo-grid-column>\n }\n\n </kendo-grid>\n </div>\n `,\n styles: [`\n .mm-property-grid {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--kendo-color-border);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .search-toolbar {\n padding: 8px;\n border-bottom: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n }\n\n .property-grid {\n flex: 1;\n border: none;\n }\n\n .property-name-cell {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 24px;\n }\n\n .type-icon {\n width: 16px;\n height: 16px;\n opacity: 0.7;\n }\n\n .property-info {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n }\n\n .property-name {\n font-weight: 500;\n }\n\n .required-indicator {\n color: var(--kendo-color-error);\n font-weight: bold;\n }\n\n .readonly-indicator {\n font-size: 12px;\n opacity: 0.7;\n }\n\n .property-editor {\n width: 100%;\n min-width: 200px;\n }\n\n .validation-error {\n color: var(--kendo-color-error);\n font-size: 0.8em;\n margin-top: 4px;\n }\n\n .type-badge {\n font-size: 0.75em;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n font-weight: 500;\n background: var(--kendo-color-base-subtle);\n color: var(--kendo-color-on-base);\n }\n\n .grid-toolbar {\n padding: 8px;\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-base-subtle);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .changes-indicator {\n margin-left: auto;\n font-size: 0.9em;\n color: var(--kendo-color-primary);\n font-style: italic;\n }\n\n `]\n})\nexport class PropertyGridComponent implements OnInit, OnChanges {\n @Input() data: PropertyGridItem[] = [];\n @Input() config: PropertyGridConfig = {};\n @Input() showTypeColumn = false;\n\n @Output() propertyChange = new EventEmitter<PropertyChangeEvent>();\n @Output() saveRequested = new EventEmitter<PropertyGridItem[]>();\n @Output() binaryDownload = new EventEmitter<BinaryDownloadEvent>();\n\n // Component state\n filteredData: PropertyGridItem[] = [];\n searchTerm = '';\n hasChanges = false;\n pendingChanges: PropertyChangeEvent[] = [];\n\n // Icons\n readonly fileIcon = fileIcon;\n readonly folderIcon = folderIcon;\n readonly calendarIcon = calendarIcon;\n readonly checkboxCheckedIcon = checkboxCheckedIcon;\n readonly listUnorderedIcon = listUnorderedIcon;\n\n // Enum reference\n readonly AttributeValueTypeDto = AttributeValueTypeDto;\n\n ngOnInit() {\n this.updateFilteredData();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['data']) {\n this.updateFilteredData();\n this.hasChanges = false;\n this.pendingChanges = [];\n }\n }\n\n get gridHeight(): string {\n const baseHeight = this.config.height || '400px';\n const searchHeight = this.config.showSearch ? 40 : 0;\n const toolbarHeight = !this.config.readOnlyMode ? 50 : 0;\n const totalOffset = searchHeight + toolbarHeight;\n\n if (baseHeight.includes('px')) {\n const px = parseInt(baseHeight) - totalOffset;\n return `${Math.max(px, 200)}px`;\n }\n return baseHeight;\n }\n\n /**\n * Update filtered data based on search term\n */\n updateFilteredData() {\n if (!this.searchTerm.trim()) {\n this.filteredData = [...this.data];\n return;\n }\n\n const term = this.searchTerm.toLowerCase();\n this.filteredData = this.data.filter(item =>\n item.name.toLowerCase().includes(term) ||\n (item.displayName?.toLowerCase().includes(term)) ||\n (item.description?.toLowerCase().includes(term)) ||\n String(item.value).toLowerCase().includes(term)\n );\n }\n\n /**\n * Handle search input\n */\n onSearch() {\n this.updateFilteredData();\n }\n\n /**\n * Get appropriate icon for property type\n */\n getTypeIcon(type: AttributeValueTypeDto): SVGIcon {\n switch (type) {\n case AttributeValueTypeDto.BooleanDto:\n return checkboxCheckedIcon;\n case AttributeValueTypeDto.IntDto:\n case AttributeValueTypeDto.IntegerDto:\n case AttributeValueTypeDto.DoubleDto:\n return fileIcon;\n case AttributeValueTypeDto.DateTimeDto:\n case AttributeValueTypeDto.DateTimeOffsetDto:\n return calendarIcon;\n case AttributeValueTypeDto.StringArrayDto:\n case AttributeValueTypeDto.IntegerArrayDto:\n return listUnorderedIcon;\n case AttributeValueTypeDto.RecordDto:\n case AttributeValueTypeDto.RecordArrayDto:\n return folderIcon;\n default:\n return fileIcon;\n }\n }\n\n /**\n * Format type name for display\n */\n formatTypeName(type: AttributeValueTypeDto): string {\n return type.replace('_DTO', '').replace('DTO', '').replace('_', ' ');\n }\n\n /**\n * Save pending changes\n */\n saveChanges() {\n if (this.pendingChanges.length > 0) {\n const updatedData = this.data.map(item => {\n const change = this.pendingChanges.find(c => c.property.id === item.id);\n return change ? { ...item, value: change.newValue } : item;\n });\n\n this.saveRequested.emit(updatedData);\n this.hasChanges = false;\n this.pendingChanges = [];\n }\n }\n\n /**\n * Discard pending changes\n */\n discardChanges() {\n this.hasChanges = false;\n this.pendingChanges = [];\n this.updateFilteredData();\n }\n\n /**\n * Handle property value change\n */\n onPropertyChange(property: PropertyGridItem, oldValue: unknown, newValue: unknown) {\n const changeEvent: PropertyChangeEvent = {\n property,\n oldValue,\n newValue\n };\n\n // Update or add to pending changes\n const existingIndex = this.pendingChanges.findIndex(c => c.property.id === property.id);\n if (existingIndex >= 0) {\n this.pendingChanges[existingIndex] = changeEvent;\n } else {\n this.pendingChanges.push(changeEvent);\n }\n\n this.hasChanges = this.pendingChanges.length > 0;\n this.propertyChange.emit(changeEvent);\n }\n\n /**\n * Handle binary download request from property value display\n */\n onBinaryDownload(event: BinaryDownloadEvent): void {\n this.binaryDownload.emit(event);\n }\n}\n","// Models\nexport * from './models/property-grid.models';\n\n// Services\nexport * from './services/property-converter.service';\n\n// Components\nexport * from './components/property-grid.component';\nexport * from './components/property-value-display.component';","import { Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowRef, WindowModule } from '@progress/kendo-angular-dialog';\nimport { GridModule, GridDataResult, SelectionEvent, PageChangeEvent, RowArgs, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { LoaderModule } from '@progress/kendo-angular-indicators';\nimport { searchIcon, filterClearIcon } from '@progress/kendo-svg-icons';\nimport { CkTypeSelectorService, CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface CkTypeSelectorDialogData {\n selectedCkTypeId?: string;\n ckModelIds?: string[];\n dialogTitle?: string;\n allowAbstract?: boolean;\n derivedFromRtCkTypeId?: string;\n}\n\nexport interface CkTypeSelectorDialogResult {\n selectedCkType: CkTypeSelectorItem;\n}\n\n@Component({\n selector: 'mm-ck-type-selector-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n IconsModule,\n LoaderModule,\n WindowModule\n ],\n template: `\n <div class=\"ck-type-selector-container\">\n <div class=\"filter-container\">\n <div class=\"filter-row\">\n <div class=\"filter-item\" *ngIf=\"!derivedFromRtCkTypeId\">\n <label>Model Filter</label>\n <kendo-combobox\n [data]=\"availableModels\"\n [(ngModel)]=\"selectedModel\"\n (valueChange)=\"onModelFilterChange($event)\"\n [allowCustom]=\"false\"\n [clearButton]=\"true\"\n placeholder=\"All Models\"\n class=\"filter-input\">\n </kendo-combobox>\n </div>\n <div class=\"filter-item flex-grow\">\n <label>Type Search</label>\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search types...\"\n class=\"filter-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\" size=\"small\"></button>\n </ng-template>\n </kendo-textbox>\n </div>\n <div class=\"filter-item filter-actions\">\n <label>&nbsp;</label>\n <button kendoButton [svgIcon]=\"filterClearIcon\" (click)=\"clearFilters()\" title=\"Clear filters\"></button>\n </div>\n </div>\n </div>\n\n <div class=\"grid-container\">\n <kendo-grid\n [data]=\"gridData\"\n [loading]=\"isLoading\"\n [selectable]=\"{ mode: 'single' }\"\n [pageable]=\"{ pageSizes: [25, 50, 100] }\"\n [pageSize]=\"pageSize\"\n [skip]=\"skip\"\n (pageChange)=\"onPageChange($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (cellClick)=\"onCellClick($event)\"\n [kendoGridSelectBy]=\"selectItemBy\"\n [(selectedKeys)]=\"selectedKeys\"\n class=\"type-grid\">\n <kendo-grid-column field=\"rtCkTypeId\" title=\"Type\" [width]=\"300\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span [class.abstract-type]=\"dataItem.isAbstract\" [class.final-type]=\"dataItem.isFinal\">\n {{ dataItem.rtCkTypeId }}\n </span>\n <span *ngIf=\"dataItem.isAbstract\" class=\"type-badge abstract\">abstract</span>\n <span *ngIf=\"dataItem.isFinal\" class=\"type-badge final\">final</span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"baseTypeRtCkTypeId\" title=\"Base Type\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n {{ dataItem.baseTypeRtCkTypeId || '-' }}\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\">\n <ng-template kendoGridCellTemplate let-dataItem>\n {{ dataItem.description || '-' }}\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"selection-info\" *ngIf=\"selectedType\">\n <strong>Selected:</strong> {{ selectedType.rtCkTypeId }}\n </div>\n\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" [disabled]=\"!selectedType || (selectedType.isAbstract && !allowAbstract)\" (click)=\"onConfirm()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .ck-type-selector-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n padding: 20px;\n box-sizing: border-box;\n gap: 12px;\n }\n\n .filter-container {\n margin-bottom: 16px;\n flex-shrink: 0;\n }\n\n .filter-row {\n display: flex;\n gap: 16px;\n align-items: flex-end;\n }\n\n .filter-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .filter-item label {\n font-size: 12px;\n font-weight: 500;\n }\n\n .filter-item.flex-grow {\n flex: 1;\n }\n\n .filter-item.filter-actions {\n flex-shrink: 0;\n }\n\n .filter-input {\n min-width: 180px;\n }\n\n .grid-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .grid-container kendo-grid,\n .grid-container .type-grid {\n flex: 1;\n min-height: 200px;\n }\n\n .type-grid {\n border-radius: 4px;\n }\n\n .type-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .abstract-type {\n font-style: italic;\n opacity: 0.7;\n }\n\n .final-type {\n font-weight: 600;\n }\n\n .type-badge {\n display: inline-block;\n font-size: 10px;\n padding: 1px 6px;\n border-radius: 10px;\n margin-left: 8px;\n text-transform: uppercase;\n }\n\n .type-badge.abstract {\n background-color: var(--kendo-color-warning, #ffc107);\n color: var(--kendo-color-on-warning, #000);\n opacity: 0.8;\n }\n\n .type-badge.final {\n background-color: var(--kendo-color-success, #28a745);\n color: var(--kendo-color-on-success, #fff);\n opacity: 0.8;\n }\n\n .selection-info {\n margin-top: 12px;\n padding: 8px 12px;\n background: var(--kendo-color-success-subtle, #d4edda);\n border: 1px solid var(--kendo-color-success, #28a745);\n border-radius: 4px;\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 20px 0 20px;\n flex-shrink: 0;\n }\n `]\n})\nexport class CkTypeSelectorDialogComponent implements OnInit, OnDestroy {\n private readonly windowRef = inject(WindowRef);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private searchSubject = new Subject<string>();\n private subscriptions = new Subscription();\n\n protected readonly searchIcon = searchIcon;\n protected readonly filterClearIcon = filterClearIcon;\n\n public dialogTitle = 'Select Construction Kit Type';\n public allowAbstract = true;\n\n public searchText = '';\n public selectedModel: string | null = null;\n public availableModels: string[] = [];\n\n public gridData: GridDataResult = { data: [], total: 0 };\n public isLoading = false;\n public pageSize = 50;\n public skip = 0;\n\n public selectedKeys: string[] = [];\n public selectedType: CkTypeSelectorItem | null = null;\n\n // Selection key function - returns fullName as unique identifier\n public selectItemBy = (context: RowArgs): string => (context.dataItem as CkTypeSelectorItem).fullName;\n\n private initialCkModelIds?: string[];\n public derivedFromRtCkTypeId?: string;\n private lastClickTime = 0;\n private lastClickRtCkTypeId: string | null = null;\n\n /** Data passed from the service */\n public data?: CkTypeSelectorDialogData;\n\n ngOnInit(): void {\n if (this.data) {\n this.dialogTitle = this.data.dialogTitle || 'Select Construction Kit Type';\n this.allowAbstract = this.data.allowAbstract ?? true;\n this.initialCkModelIds = this.data.ckModelIds;\n this.derivedFromRtCkTypeId = this.data.derivedFromRtCkTypeId;\n\n if (this.data.selectedCkTypeId) {\n this.selectedKeys = [this.data.selectedCkTypeId];\n }\n }\n\n // Set up search debouncing\n this.subscriptions.add(\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(() => {\n this.skip = 0;\n this.loadTypes();\n })\n );\n\n // Load initial types and extract available models\n this.loadTypes();\n if (!this.derivedFromRtCkTypeId) {\n this.loadAvailableModels();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n private loadTypes(): void {\n this.isLoading = true;\n\n const source$ = this.derivedFromRtCkTypeId\n ? this.ckTypeSelectorService.getDerivedCkTypes(this.derivedFromRtCkTypeId, {\n searchText: this.searchText || undefined\n })\n : this.ckTypeSelectorService.getCkTypes({\n ckModelIds: this.selectedModel ? [this.selectedModel] : this.initialCkModelIds,\n searchText: this.searchText || undefined,\n first: this.pageSize,\n skip: this.skip\n });\n\n this.subscriptions.add(\n source$.subscribe({\n next: result => {\n this.gridData = {\n data: result.items,\n total: result.totalCount\n };\n\n // Restore selection if exists\n if (this.selectedKeys.length > 0) {\n const selectedItem = result.items.find(item => item.fullName === this.selectedKeys[0]);\n if (selectedItem) {\n this.selectedType = selectedItem;\n }\n }\n\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n this.gridData = { data: [], total: 0 };\n }\n })\n );\n }\n\n private loadAvailableModels(): void {\n // Load all types to extract unique models\n this.subscriptions.add(\n this.ckTypeSelectorService.getCkTypes({\n first: 1000\n }).subscribe(result => {\n const modelSet = new Set<string>();\n result.items.forEach(item => {\n // Extract model from fullName (format: \"ModelName-Version/TypeName-Version\")\n const modelMatch = item.fullName.match(/^([^/]+)\\//);\n if (modelMatch) {\n modelSet.add(modelMatch[1]);\n }\n });\n this.availableModels = Array.from(modelSet).sort();\n })\n );\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onModelFilterChange(_value: string | null): void {\n this.skip = 0;\n this.loadTypes();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedModel = null;\n this.skip = 0;\n this.loadTypes();\n }\n\n public onPageChange(event: PageChangeEvent): void {\n this.skip = event.skip;\n this.pageSize = event.take;\n this.loadTypes();\n }\n\n public onSelectionChange(event: SelectionEvent): void {\n const selectedItems = event.selectedRows;\n if (selectedItems && selectedItems.length > 0) {\n this.selectedType = selectedItems[0].dataItem as CkTypeSelectorItem;\n } else {\n this.selectedType = null;\n }\n }\n\n public onCellClick(event: CellClickEvent): void {\n const item = event.dataItem as CkTypeSelectorItem;\n const now = Date.now();\n if (item && item.rtCkTypeId === this.lastClickRtCkTypeId && (now - this.lastClickTime) < 400) {\n // Double-click detected\n if (!item.isAbstract || this.allowAbstract) {\n this.selectedType = item;\n this.onConfirm();\n }\n }\n this.lastClickTime = now;\n this.lastClickRtCkTypeId = item?.rtCkTypeId ?? null;\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n\n public onConfirm(): void {\n if (this.selectedType) {\n const result: CkTypeSelectorDialogResult = {\n selectedCkType: this.selectedType\n };\n this.windowRef.close(result);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n CkTypeSelectorDialogComponent,\n CkTypeSelectorDialogData,\n CkTypeSelectorDialogResult\n} from './ck-type-selector-dialog.component';\n\nexport interface CkTypeSelectorResult {\n confirmed: boolean;\n selectedCkType: CkTypeSelectorItem | null;\n}\n\n@Injectable()\nexport class CkTypeSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the CkType selector dialog\n * @param options Dialog options\n * @returns Promise that resolves with the result containing selected CkType and confirmation status\n */\n public async openCkTypeSelector(options: {\n selectedCkTypeId?: string;\n ckModelIds?: string[];\n dialogTitle?: string;\n allowAbstract?: boolean;\n derivedFromRtCkTypeId?: string;\n } = {}): Promise<CkTypeSelectorResult> {\n const data: CkTypeSelectorDialogData = {\n selectedCkTypeId: options.selectedCkTypeId,\n ckModelIds: options.ckModelIds,\n dialogTitle: options.dialogTitle,\n allowAbstract: options.allowAbstract,\n derivedFromRtCkTypeId: options.derivedFromRtCkTypeId\n };\n\n const size = this.windowStateService.resolveWindowSize('ck-type-selector', { width: 900, height: 650 });\n\n const windowRef = this.windowService.open({\n content: CkTypeSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 750,\n minHeight: 550,\n resizable: true,\n title: options.dialogTitle || 'Select Construction Kit Type'\n });\n\n this.windowStateService.applyModalBehavior('ck-type-selector', windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: CkTypeSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n\n if (result && typeof result === 'object' && 'selectedCkType' in result) {\n const dialogResult = result as CkTypeSelectorDialogResult;\n return {\n confirmed: true,\n selectedCkType: dialogResult.selectedCkType\n };\n } else {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n inject,\n ElementRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormControl,\n ReactiveFormsModule,\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n Validator,\n AbstractControl,\n ValidationErrors,\n NG_VALIDATORS\n} from '@angular/forms';\nimport { AutoCompleteModule, AutoCompleteComponent, PopupSettings } from '@progress/kendo-angular-dropdowns';\nimport { LoaderModule } from '@progress/kendo-angular-indicators';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { IconsModule, SVGIconModule } from '@progress/kendo-angular-icons';\nimport { searchIcon } from '@progress/kendo-svg-icons';\nimport { CkTypeSelectorService, CkTypeSelectorItem } from '@meshmakers/octo-services';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap, catchError } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { CkTypeSelectorDialogService } from '../ck-type-selector-dialog/ck-type-selector-dialog.service';\n\n@Component({\n selector: 'mm-ck-type-selector-input',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AutoCompleteModule,\n LoaderModule,\n ButtonsModule,\n IconsModule,\n SVGIconModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CkTypeSelectorInputComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => CkTypeSelectorInputComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"ck-type-select-wrapper\" [class.disabled]=\"disabled\">\n <kendo-autocomplete\n #autocomplete\n [formControl]=\"searchFormControl\"\n [data]=\"filteredTypes\"\n [loading]=\"isLoading\"\n [placeholder]=\"placeholder\"\n [suggest]=\"true\"\n [clearButton]=\"true\"\n [filterable]=\"true\"\n [popupSettings]=\"popupSettings\"\n (filterChange)=\"onFilterChange($event)\"\n (valueChange)=\"onSelectionChange($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n class=\"ck-type-autocomplete\">\n\n <ng-template kendoAutoCompleteItemTemplate let-dataItem>\n <div class=\"ck-type-item\">\n {{ dataItem }}\n </div>\n </ng-template>\n\n <ng-template kendoAutoCompleteNoDataTemplate>\n <div class=\"no-data-message\">\n <span *ngIf=\"!isLoading && searchFormControl.value && searchFormControl.value.length >= minSearchLength\">\n No types found for \"{{ searchFormControl.value }}\"\n </span>\n <span *ngIf=\"!isLoading && (!searchFormControl.value || searchFormControl.value.length < minSearchLength)\">\n Type at least {{ minSearchLength }} characters to search...\n </span>\n </div>\n </ng-template>\n\n <ng-template kendoAutoCompleteFooterTemplate>\n <div class=\"advanced-search-footer\" (click)=\"openDialog($event)\">\n <kendo-svg-icon [icon]=\"searchIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ advancedSearchLabel }}</span>\n </div>\n </ng-template>\n\n </kendo-autocomplete>\n\n <button\n kendoButton\n type=\"button\"\n [svgIcon]=\"searchIcon\"\n [disabled]=\"disabled\"\n [title]=\"advancedSearchLabel\"\n class=\"dialog-button\"\n (click)=\"openDialog()\">\n </button>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n }\n\n .ck-type-select-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n }\n\n .ck-type-select-wrapper.disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .ck-type-autocomplete {\n flex: 1;\n min-width: 0;\n }\n\n .dialog-button {\n flex-shrink: 0;\n height: 30px;\n width: 30px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .ck-type-item {\n padding: 4px 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-data-message {\n padding: 8px 12px;\n color: var(--kendo-color-subtle);\n font-style: italic;\n text-align: center;\n }\n\n .advanced-search-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--kendo-color-primary);\n border-top: 1px solid var(--kendo-color-border);\n background: var(--kendo-color-surface-alt);\n transition: background-color 0.2s;\n }\n\n .advanced-search-footer:hover {\n background: var(--kendo-color-base-hover);\n }\n `]\n})\nexport class CkTypeSelectorInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {\n @ViewChild('autocomplete', { static: true }) autocomplete!: AutoCompleteComponent;\n\n @Input() placeholder = 'Select a CK type...';\n @Input() minSearchLength = 2;\n @Input() maxResults = 50;\n @Input() debounceMs = 300;\n @Input() ckModelIds?: string[];\n @Input() allowAbstract = true;\n @Input() dialogTitle = 'Select Construction Kit Type';\n @Input() advancedSearchLabel = 'Advanced Search...';\n @Input() derivedFromRtCkTypeId?: string;\n\n private _disabled = false;\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = !!value;\n if (this._disabled) {\n this.searchFormControl.disable();\n } else {\n this.searchFormControl.enable();\n }\n }\n\n private _required = false;\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = !!value;\n }\n\n @Output() ckTypeSelected = new EventEmitter<CkTypeSelectorItem>();\n @Output() ckTypeCleared = new EventEmitter<void>();\n\n public searchFormControl = new FormControl();\n public filteredTypes: string[] = [];\n public selectedCkType: CkTypeSelectorItem | null = null;\n public isLoading = false;\n private typeMap = new Map<string, CkTypeSelectorItem>();\n\n private searchSubject = new Subject<string>();\n private subscriptions = new Subscription();\n private onChange: (value: CkTypeSelectorItem | null) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n protected readonly searchIcon = searchIcon;\n protected popupSettings: PopupSettings = { appendTo: 'root', popupClass: 'mm-ck-type-popup' };\n\n private static popupStyleInjected = false;\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly dialogService = inject(CkTypeSelectorDialogService, { optional: true });\n private readonly elementRef = inject(ElementRef);\n\n ngOnInit(): void {\n this.setupSearch();\n this.injectPopupStyles();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n this.searchSubject.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: CkTypeSelectorItem | null): void {\n if (value !== this.selectedCkType) {\n this.selectedCkType = value;\n if (value) {\n // Ensure the value is in the data list so the autocomplete can display it\n if (!this.typeMap.has(value.rtCkTypeId)) {\n this.typeMap.set(value.rtCkTypeId, value);\n this.filteredTypes = [value.rtCkTypeId];\n }\n this.searchFormControl.setValue(value.rtCkTypeId, { emitEvent: false });\n } else {\n this.searchFormControl.setValue('', { emitEvent: false });\n }\n }\n }\n\n registerOnChange(fn: (value: CkTypeSelectorItem | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n if (this.required && !this.selectedCkType) {\n return { required: true };\n }\n\n const value = control.value;\n if (value && typeof value === 'string') {\n return { invalidCkType: true };\n }\n\n return null;\n }\n\n // Event handlers\n onFilterChange(filter: string): void {\n if (!filter || filter.length < this.minSearchLength) {\n this.filteredTypes = [];\n return;\n }\n\n this.searchSubject.next(filter);\n }\n\n onSelectionChange(value: string): void {\n if (value && typeof value === 'string') {\n const ckType = this.typeMap.get(value);\n if (ckType) {\n this.selectCkType(ckType);\n }\n }\n }\n\n onFocus(): void {\n const currentValue = this.searchFormControl.value;\n if (currentValue && currentValue.length >= this.minSearchLength && this.filteredTypes.length === 0) {\n this.searchSubject.next(currentValue);\n }\n }\n\n onBlur(): void {\n this.onTouched();\n\n if (this.filteredTypes.length === 1 && !this.selectedCkType) {\n const displayText = this.filteredTypes[0];\n const ckType = this.typeMap.get(displayText);\n if (ckType) {\n this.selectCkType(ckType);\n }\n }\n }\n\n // Public methods\n public clear(): void {\n this.selectedCkType = null;\n this.filteredTypes = [];\n this.typeMap.clear();\n this.searchFormControl.setValue('', { emitEvent: false });\n this.onChange(null);\n this.ckTypeCleared.emit();\n this.autocomplete.focus();\n }\n\n public focus(): void {\n if (this.autocomplete) {\n this.autocomplete.focus();\n }\n }\n\n public reset(): void {\n this.clear();\n }\n\n // Private methods\n private setupSearch(): void {\n this.subscriptions.add(\n this.searchSubject.pipe(\n debounceTime(this.debounceMs),\n distinctUntilChanged(),\n tap(() => {\n this.isLoading = true;\n this.filteredTypes = [];\n }),\n switchMap(filter => {\n const source$ = this.derivedFromRtCkTypeId\n ? this.ckTypeSelectorService.getDerivedCkTypes(this.derivedFromRtCkTypeId, {\n searchText: filter\n })\n : this.ckTypeSelectorService.getCkTypes({\n ckModelIds: this.ckModelIds,\n searchText: filter,\n first: this.maxResults\n });\n return source$.pipe(\n catchError(error => {\n console.error('CK type search error:', error);\n return of({ items: [], totalCount: 0 });\n })\n );\n })\n ).subscribe(result => {\n this.isLoading = false;\n\n // Filter out abstract types if not allowed\n let items = result.items;\n if (!this.allowAbstract) {\n items = items.filter(item => !item.isAbstract);\n }\n\n this.filteredTypes = items.map(item => item.rtCkTypeId);\n this.typeMap = new Map(items.map(item => [item.rtCkTypeId, item]));\n })\n );\n }\n\n private injectPopupStyles(): void {\n if (CkTypeSelectorInputComponent.popupStyleInjected) return;\n const style = document.createElement('style');\n style.setAttribute('data-mm-ck-type-popup', '');\n style.textContent = `\n .mm-ck-type-popup {\n max-width: 500px !important;\n min-width: 0 !important;\n }\n .mm-ck-type-popup .k-child-animation-container {\n max-width: 500px !important;\n }\n .mm-ck-type-popup .k-list-item {\n padding: 4px 12px !important;\n min-height: 0 !important;\n font-size: 13px !important;\n line-height: 20px !important;\n }\n `;\n document.head.appendChild(style);\n CkTypeSelectorInputComponent.popupStyleInjected = true;\n }\n\n private selectCkType(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.searchFormControl.setValue(ckType.rtCkTypeId, { emitEvent: false });\n this.filteredTypes = [];\n this.onChange(ckType);\n this.ckTypeSelected.emit(ckType);\n this.autocomplete.toggle(false);\n }\n\n // Dialog\n public async openDialog(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!this.dialogService) {\n console.warn('CkTypeSelectorDialogService not available');\n return;\n }\n\n this.autocomplete.toggle(false);\n\n const result = await this.dialogService.openCkTypeSelector({\n selectedCkTypeId: this.selectedCkType?.fullName,\n ckModelIds: this.ckModelIds,\n dialogTitle: this.dialogTitle,\n allowAbstract: this.allowAbstract,\n derivedFromRtCkTypeId: this.derivedFromRtCkTypeId\n });\n\n if (result.confirmed && result.selectedCkType) {\n this.selectCkType(result.selectedCkType);\n }\n }\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowModule, WindowRef } from '@progress/kendo-angular-dialog';\nimport { GridModule, GridDataResult, CellClickEvent } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { arrowRightIcon, arrowLeftIcon, searchIcon, arrowUpIcon, arrowDownIcon, chevronDoubleRightIcon, chevronDoubleLeftIcon } from '@progress/kendo-svg-icons';\nimport { AttributeSelectorService, AttributeItem, AttributeValueTypeDto } from '@meshmakers/octo-services';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface AttributeSelectorDialogData {\n rtCkTypeId: string;\n selectedAttributes?: string[];\n dialogTitle?: string;\n singleSelect?: boolean;\n includeNavigationProperties?: boolean;\n maxDepth?: number;\n /** Additional virtual attributes to include in the available list (e.g., Timestamp for stream data queries) */\n additionalAttributes?: AttributeItem[];\n /** When true, hides the navigation properties checkbox and max depth controls */\n hideNavigationControls?: boolean;\n /** When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching) */\n attributePaths?: string[];\n}\n\nexport interface AttributeSelectorDialogResult {\n selectedAttributes: AttributeItem[];\n}\n\ninterface ValueTypeFilterOption {\n text: string;\n value: AttributeValueTypeDto | null;\n}\n\n@Component({\n selector: 'mm-attribute-selector-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n InputsModule,\n DropDownListModule,\n IconsModule,\n WindowModule\n ],\n template: `\n <div class=\"attribute-selector-container\">\n <div class=\"filter-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search path & description...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\n <kendo-dropdownlist\n [data]=\"valueTypeOptions\"\n [(ngModel)]=\"selectedValueTypeFilter\"\n (valueChange)=\"onValueTypeFilterChange($event)\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"type-filter-dropdown\">\n </kendo-dropdownlist>\n </div>\n\n @if (!hideNavigationControls) {\n <div class=\"options-container\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"includeNavigationProperties\"\n (ngModelChange)=\"onNavigationPropertiesChange()\" />\n <label class=\"option-label\">Include Navigation Properties</label>\n\n <kendo-numerictextbox\n [(ngModel)]=\"maxDepth\"\n [min]=\"1\" [max]=\"5\" [step]=\"1\" [format]=\"'n0'\"\n [placeholder]=\"'Depth'\"\n [spinners]=\"true\"\n [disabled]=\"!includeNavigationProperties\"\n (valueChange)=\"onMaxDepthChange($event)\"\n class=\"depth-input\">\n </kendo-numerictextbox>\n <label class=\"option-label\">Max Depth</label>\n </div>\n }\n\n <div class=\"lists-container\" *ngIf=\"!singleSelect\">\n <div class=\"list-section\">\n <h4>Available Attributes</h4>\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'multiple', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"action-buttons\">\n <button\n kendoButton\n [svgIcon]=\"arrowRightIcon\"\n [disabled]=\"selectedAvailableKeys.length === 0\"\n (click)=\"addSelected()\"\n title=\"Add selected\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"arrowLeftIcon\"\n [disabled]=\"selectedChosenKeys.length === 0\"\n (click)=\"removeSelected()\"\n title=\"Remove selected\">\n </button>\n <div class=\"separator\"></div>\n <button\n kendoButton\n [svgIcon]=\"chevronDoubleRightIcon\"\n [disabled]=\"availableAttributes.length === 0\"\n (click)=\"addAll()\"\n title=\"Add all\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"chevronDoubleLeftIcon\"\n [disabled]=\"selectedAttributes.length === 0\"\n (click)=\"removeAll()\"\n title=\"Remove all\">\n </button>\n </div>\n\n <div class=\"list-section\">\n <h4>Selected Attributes ({{ selectedAttributes.length }})</h4>\n <kendo-grid\n [data]=\"selectedGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\n <span class=\"order-number\">{{ rowIndex + 1 }}.</span>\n {{ dataItem.attributePath }}\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"order-buttons\">\n <button\n kendoButton\n [svgIcon]=\"arrowUpIcon\"\n [disabled]=\"!canMoveUp()\"\n (click)=\"moveUp()\"\n title=\"Move up\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"arrowDownIcon\"\n [disabled]=\"!canMoveDown()\"\n (click)=\"moveDown()\"\n title=\"Move down\">\n </button>\n </div>\n </div>\n\n <div class=\"single-select-container\" *ngIf=\"singleSelect\">\n <kendo-grid\n [data]=\"availableGridData\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedSingleKey\"\n (cellClick)=\"onSingleSelectCellClick($event)\"\n [resizable]=\"true\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"250\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"action-bar\">\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" [disabled]=\"singleSelect && selectedSingleKey.length === 0\" (click)=\"onConfirm()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n\n .attribute-selector-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .filter-container {\n display: flex;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .search-input {\n flex: 1;\n }\n\n .type-filter-dropdown {\n width: 160px;\n flex-shrink: 0;\n }\n\n .options-container {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n flex-shrink: 0;\n }\n\n .option-label {\n cursor: pointer;\n }\n\n .depth-input {\n width: 90px;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .list-section h4 {\n margin: 0 0 10px 0;\n font-size: 0.85rem;\n font-weight: 600;\n flex-shrink: 0;\n }\n\n .attribute-grid {\n border-radius: 4px;\n flex: 1;\n min-height: 200px;\n }\n\n .attribute-grid ::ng-deep .k-grid-table tbody tr {\n cursor: pointer;\n }\n\n .action-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n justify-content: center;\n padding: 0 8px;\n padding-top: 32px;\n }\n\n .separator {\n height: 1px;\n background-color: var(--kendo-color-border, #dee2e6);\n margin: 8px 0;\n }\n\n .order-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n justify-content: center;\n padding: 0 8px;\n padding-top: 32px;\n }\n\n .order-number {\n color: var(--kendo-color-primary, #ff6358);\n font-weight: 600;\n margin-right: 8px;\n min-width: 24px;\n display: inline-block;\n }\n\n .single-select-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .single-select-container .attribute-grid {\n flex: 1;\n }\n\n .action-bar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #dee2e6);\n }\n `]\n})\nexport class AttributeSelectorDialogComponent implements OnInit {\n private readonly windowRef = inject(WindowRef);\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n protected readonly arrowRightIcon = arrowRightIcon;\n protected readonly arrowLeftIcon = arrowLeftIcon;\n protected readonly chevronDoubleRightIcon = chevronDoubleRightIcon;\n protected readonly chevronDoubleLeftIcon = chevronDoubleLeftIcon;\n protected readonly searchIcon = searchIcon;\n protected readonly arrowUpIcon = arrowUpIcon;\n protected readonly arrowDownIcon = arrowDownIcon;\n\n private _data!: AttributeSelectorDialogData;\n public get data(): AttributeSelectorDialogData { return this._data; }\n public set data(value: AttributeSelectorDialogData) {\n this._data = value;\n if (value) {\n this.initializeFromData(value);\n }\n }\n\n public dialogTitle = 'Select Attributes';\n public rtCkTypeId!: string;\n public singleSelect = false;\n private additionalAttributes: AttributeItem[] = [];\n public searchText = '';\n public selectedSingleKey: string[] = [];\n public selectedValueTypeFilter: AttributeValueTypeDto | null = null;\n public includeNavigationProperties = true;\n public maxDepth: number | null = null;\n public hideNavigationControls = false;\n private attributePathsSet: Set<string> | null = null;\n\n public availableAttributes: AttributeItem[] = [];\n public selectedAttributes: AttributeItem[] = [];\n\n public availableGridData: GridDataResult = { data: [], total: 0 };\n public selectedGridData: GridDataResult = { data: [], total: 0 };\n\n public selectedAvailableKeys: string[] = [];\n public selectedChosenKeys: string[] = [];\n\n public valueTypeOptions: ValueTypeFilterOption[] = [\n { text: 'All Types', value: null },\n { text: 'String', value: AttributeValueTypeDto.StringDto },\n { text: 'Integer', value: AttributeValueTypeDto.IntegerDto },\n { text: 'Double', value: AttributeValueTypeDto.DoubleDto },\n { text: 'Boolean', value: AttributeValueTypeDto.BooleanDto },\n { text: 'DateTime', value: AttributeValueTypeDto.DateTimeDto },\n { text: 'DateTimeOffset', value: AttributeValueTypeDto.DateTimeOffsetDto },\n { text: 'Enum', value: AttributeValueTypeDto.EnumDto },\n { text: 'TimeSpan', value: AttributeValueTypeDto.TimeSpanDto }\n ];\n\n // Double-click tracking\n private lastClickTime = 0;\n private lastClickedItem: string | null = null;\n private readonly doubleClickDelay = 300; // milliseconds\n\n ngOnInit(): void {\n // Set up search debouncing (always, regardless of data timing)\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(searchText => {\n this.loadAvailableAttributes(searchText);\n });\n }\n\n private initializeFromData(data: AttributeSelectorDialogData): void {\n this.rtCkTypeId = data.rtCkTypeId;\n this.dialogTitle = data.dialogTitle || 'Select Attributes';\n this.singleSelect = data.singleSelect ?? false;\n this.includeNavigationProperties = data.includeNavigationProperties ?? true;\n this.maxDepth = data.maxDepth ?? null;\n this.additionalAttributes = data.additionalAttributes ?? [];\n this.hideNavigationControls = data.hideNavigationControls ?? false;\n this.attributePathsSet = data.attributePaths ? new Set(data.attributePaths) : null;\n\n if (data.selectedAttributes && data.selectedAttributes.length > 0) {\n if (this.singleSelect) {\n this.selectedSingleKey = [data.selectedAttributes[0]];\n } else {\n this.loadInitialSelectedAttributes(data.selectedAttributes);\n }\n }\n\n // Load initial attributes\n this.loadAvailableAttributes();\n }\n\n private loadAvailableAttributes(searchTerm?: string): void {\n this.attributeService.getAvailableAttributes(\n this.rtCkTypeId, undefined, undefined, undefined,\n this.selectedValueTypeFilter || undefined,\n searchTerm || undefined,\n this.includeNavigationProperties,\n this.maxDepth ?? undefined\n ).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n\n // Apply client-side attribute path restriction if set (additionalAttributes bypass this filter intentionally)\n const filteredItems = this.attributePathsSet\n ? result.items.filter(item => this.attributePathsSet!.has(item.attributePath))\n : result.items;\n\n // Include additional virtual attributes (e.g., Timestamp for stream data), filtered by search/type\n const filteredAdditional = this.additionalAttributes.filter(attr => {\n if (selectedPaths.has(attr.attributePath)) return false;\n if (searchTerm && !attr.attributePath.toLowerCase().includes(searchTerm.toLowerCase())) return false;\n if (this.selectedValueTypeFilter && attr.attributeValueType !== this.selectedValueTypeFilter) return false;\n return true;\n });\n\n this.availableAttributes = [\n ...filteredAdditional,\n ...filteredItems.filter(item => !selectedPaths.has(item.attributePath))\n ];\n this.updateAvailableGrid();\n });\n }\n\n private loadInitialSelectedAttributes(attributePaths: string[]): void {\n // Load all attributes to get the details for selected ones\n this.attributeService.getAvailableAttributes(\n this.rtCkTypeId, undefined, undefined, undefined,\n undefined, undefined,\n this.includeNavigationProperties,\n this.maxDepth ?? undefined\n ).subscribe(result => {\n // Create a map for quick lookup, including additional virtual attributes\n const attributeMap = new Map(result.items.map(item => [item.attributePath, item]));\n for (const attr of this.additionalAttributes) {\n attributeMap.set(attr.attributePath, attr);\n }\n\n // Preserve the order from attributePaths\n this.selectedAttributes = attributePaths\n .map(path => attributeMap.get(path))\n .filter((item): item is AttributeItem => item !== undefined);\n\n this.updateSelectedGrid();\n\n // Filter out selected from available, and apply attributePathsSet restriction\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n const filteredItems = this.attributePathsSet\n ? result.items.filter(item => this.attributePathsSet!.has(item.attributePath))\n : result.items;\n this.availableAttributes = [\n ...this.additionalAttributes.filter(attr => !selectedPaths.has(attr.attributePath)),\n ...filteredItems.filter(item => !selectedPaths.has(item.attributePath))\n ];\n this.updateAvailableGrid();\n });\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public onValueTypeFilterChange(_value: AttributeValueTypeDto | null): void {\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public onNavigationPropertiesChange(): void {\n if (!this.includeNavigationProperties) {\n this.maxDepth = null;\n }\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public onMaxDepthChange(value: number | null): void {\n this.maxDepth = value;\n this.loadAvailableAttributes(this.searchText || undefined);\n }\n\n public addSelected(): void {\n const itemsToAdd = this.availableAttributes.filter(\n item => this.selectedAvailableKeys.includes(item.attributePath)\n );\n\n this.selectedAttributes.push(...itemsToAdd);\n this.availableAttributes = this.availableAttributes.filter(\n item => !this.selectedAvailableKeys.includes(item.attributePath)\n );\n\n this.selectedAvailableKeys = [];\n this.updateGrids();\n }\n\n public removeSelected(): void {\n const itemsToRemove = this.selectedAttributes.filter(\n item => this.selectedChosenKeys.includes(item.attributePath)\n );\n\n this.availableAttributes.push(...itemsToRemove);\n this.selectedAttributes = this.selectedAttributes.filter(\n item => !this.selectedChosenKeys.includes(item.attributePath)\n );\n\n this.selectedChosenKeys = [];\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n\n public addAll(): void {\n this.selectedAttributes.push(...this.availableAttributes);\n this.availableAttributes = [];\n this.selectedAvailableKeys = [];\n this.updateGrids();\n }\n\n public removeAll(): void {\n this.availableAttributes.push(...this.selectedAttributes);\n this.selectedAttributes = [];\n this.selectedChosenKeys = [];\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n\n private sortAvailableAttributes(): void {\n this.availableAttributes.sort((a, b) =>\n a.attributePath.localeCompare(b.attributePath)\n );\n }\n\n public canMoveUp(): boolean {\n if (this.selectedChosenKeys.length !== 1) return false;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n return index > 0;\n }\n\n public canMoveDown(): boolean {\n if (this.selectedChosenKeys.length !== 1) return false;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n return index >= 0 && index < this.selectedAttributes.length - 1;\n }\n\n public moveUp(): void {\n if (!this.canMoveUp()) return;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n [this.selectedAttributes[index - 1], this.selectedAttributes[index]] =\n [this.selectedAttributes[index], this.selectedAttributes[index - 1]];\n this.updateSelectedGrid();\n }\n\n public moveDown(): void {\n if (!this.canMoveDown()) return;\n const index = this.selectedAttributes.findIndex(\n a => a.attributePath === this.selectedChosenKeys[0]\n );\n [this.selectedAttributes[index], this.selectedAttributes[index + 1]] =\n [this.selectedAttributes[index + 1], this.selectedAttributes[index]];\n this.updateSelectedGrid();\n }\n\n private updateGrids(): void {\n this.updateAvailableGrid();\n this.updateSelectedGrid();\n }\n\n private updateAvailableGrid(): void {\n this.availableGridData = {\n data: this.availableAttributes,\n total: this.availableAttributes.length\n };\n }\n\n private updateSelectedGrid(): void {\n this.selectedGridData = {\n data: this.selectedAttributes,\n total: this.selectedAttributes.length\n };\n }\n\n public onCancel(): void {\n this.windowRef.close();\n }\n\n public onConfirm(): void {\n if (this.singleSelect) {\n const selected = this.availableAttributes.find(\n a => a.attributePath === this.selectedSingleKey[0]\n );\n const result: AttributeSelectorDialogResult = {\n selectedAttributes: selected ? [selected] : []\n };\n this.windowRef.close(result);\n } else {\n const result: AttributeSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n this.windowRef.close(result);\n }\n }\n\n /**\n * Handle cell click on available attributes grid to detect double-click\n */\n public onAvailableCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - move attribute to selected\n this.moveAttributeToSelected(dataItem);\n // Reset to prevent triple-click\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n // Single click - just update tracking\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Handle cell click on selected attributes grid to detect double-click\n */\n public onSelectedCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - move attribute to available\n this.moveAttributeToAvailable(dataItem);\n // Reset to prevent triple-click\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n // Single click - just update tracking\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Handle cell click on single-select grid to detect double-click (confirm immediately)\n */\n public onSingleSelectCellClick(event: CellClickEvent): void {\n const dataItem = event.dataItem as AttributeItem;\n if (!dataItem) return;\n\n const currentTime = Date.now();\n const attributePath = dataItem.attributePath;\n\n if (\n this.lastClickedItem === attributePath &&\n currentTime - this.lastClickTime <= this.doubleClickDelay\n ) {\n // Double-click detected - confirm immediately\n this.selectedSingleKey = [attributePath];\n this.onConfirm();\n this.lastClickTime = 0;\n this.lastClickedItem = null;\n } else {\n this.lastClickTime = currentTime;\n this.lastClickedItem = attributePath;\n }\n }\n\n /**\n * Move a single attribute from available to selected\n */\n private moveAttributeToSelected(attribute: AttributeItem): void {\n // Remove from available\n this.availableAttributes = this.availableAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add to selected\n this.selectedAttributes.push(attribute);\n\n // Clear selections\n this.selectedAvailableKeys = this.selectedAvailableKeys.filter(\n key => key !== attribute.attributePath\n );\n\n this.updateGrids();\n }\n\n /**\n * Move a single attribute from selected to available\n */\n private moveAttributeToAvailable(attribute: AttributeItem): void {\n // Remove from selected\n this.selectedAttributes = this.selectedAttributes.filter(\n item => item.attributePath !== attribute.attributePath\n );\n\n // Add to available\n this.availableAttributes.push(attribute);\n\n // Clear selections\n this.selectedChosenKeys = this.selectedChosenKeys.filter(\n key => key !== attribute.attributePath\n );\n\n // Sort available attributes\n this.sortAvailableAttributes();\n this.updateGrids();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowRef, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport {\n AttributeSelectorDialogComponent,\n AttributeSelectorDialogData,\n AttributeSelectorDialogResult\n} from './attribute-selector-dialog.component';\nimport { AttributeItem } from '@meshmakers/octo-services';\n\nexport interface AttributeSelectorResult {\n confirmed: boolean;\n selectedAttributes: AttributeItem[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AttributeSelectorDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the attribute selector dialog\n * @param rtCkTypeId The RtCkType ID to fetch attributes for\n * @param selectedAttributes Optional array of pre-selected attribute paths\n * @param dialogTitle Optional custom dialog title\n * @param singleSelect Optional flag for single-select mode\n * @param additionalAttributes Optional virtual attributes to include (e.g., Timestamp for stream data)\n * @param includeNavigationProperties Optional flag to control navigation property inclusion\n * @param maxDepth Optional max depth for navigation properties\n * @param hideNavigationControls Optional flag to hide the navigation property controls in the dialog\n * @returns Promise that resolves with the result containing selected attributes and confirmation status\n */\n public async openAttributeSelector(\n rtCkTypeId: string,\n selectedAttributes?: string[],\n dialogTitle?: string,\n singleSelect?: boolean,\n additionalAttributes?: AttributeItem[],\n includeNavigationProperties?: boolean,\n maxDepth?: number,\n hideNavigationControls?: boolean,\n attributePaths?: string[]\n ): Promise<AttributeSelectorResult> {\n const data: AttributeSelectorDialogData = {\n rtCkTypeId,\n selectedAttributes,\n dialogTitle,\n singleSelect,\n additionalAttributes,\n includeNavigationProperties,\n maxDepth,\n hideNavigationControls,\n attributePaths\n };\n\n const dialogKey = singleSelect ? 'attribute-selector-single' : 'attribute-selector';\n const defaultWidth = singleSelect ? 550 : 1000;\n const defaultHeight = singleSelect ? 650 : 700;\n const size = this.windowStateService.resolveWindowSize(dialogKey, { width: defaultWidth, height: defaultHeight });\n\n const windowRef: WindowRef = this.windowService.open({\n content: AttributeSelectorDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: singleSelect ? 450 : 850,\n minHeight: singleSelect ? 550 : 650,\n resizable: true,\n title: dialogTitle || 'Select Attributes'\n });\n\n this.windowStateService.applyModalBehavior(dialogKey, windowRef);\n\n // Pass data to the component\n const contentRef = windowRef.content as { instance?: AttributeSelectorDialogComponent } | undefined;\n if (contentRef?.instance) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n\n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n const dialogResult = result as AttributeSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes\n };\n } else {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n }\n}\n","import { Component, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { pencilIcon, trashIcon } from '@progress/kendo-svg-icons';\nimport {\n GetEntitiesByCkTypeDtoGQL,\n RuntimeEntitySelectDataSource,\n RuntimeEntityDialogDataSource,\n RuntimeEntityItem,\n AttributeItem\n} from '@meshmakers/octo-services';\nimport { EntitySelectInputComponent } from '@meshmakers/shared-ui';\nimport { CkTypeSelectorInputComponent } from '../ck-type-selector-input';\nimport { AttributeSelectorDialogService } from '../attribute-selector-dialog';\nimport {\n RuntimeEntityVariableDialogData,\n RuntimeEntityVariableDialogResult,\n RuntimeEntityVariableMapping\n} from './runtime-entity-variable-dialog.models';\n\ninterface CkTypeSelectorItem {\n fullName: string;\n rtCkTypeId: string;\n baseTypeFullName?: string;\n baseTypeRtCkTypeId?: string;\n isAbstract: boolean;\n isFinal: boolean;\n description?: string;\n}\n\n@Component({\n selector: 'mm-runtime-entity-variable-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonsModule,\n InputsModule,\n GridModule,\n IconsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent\n ],\n template: `\n <div class=\"dialog-content\">\n <div class=\"form-row\">\n <label class=\"form-label\">CK Type</label>\n <mm-ck-type-selector-input\n [placeholder]=\"'Select CK Type...'\"\n [minSearchLength]=\"2\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n </div>\n\n <div class=\"form-row\">\n <label class=\"form-label\">Entity</label>\n <mm-entity-select-input\n [dataSource]=\"entityDataSource()!\"\n [dialogDataSource]=\"entityDialogDataSource()!\"\n [placeholder]=\"'Select Entity...'\"\n [disabled]=\"!selectedCkType()\"\n [minSearchLength]=\"1\"\n dialogTitle=\"Select Entity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n </div>\n\n <div class=\"form-row\">\n <label class=\"form-label\">Attributes</label>\n <button\n kendoButton\n (click)=\"openAttributeSelector()\"\n [disabled]=\"!selectedCkType()\"\n themeColor=\"primary\"\n fillMode=\"outline\">\n Select Attributes...\n </button>\n </div>\n\n @if (variableMappings().length > 0) {\n <div class=\"mappings-grid\">\n <div class=\"grid-header\">\n <span class=\"col-name\">Variable Name</span>\n <span class=\"col-path\">Attribute Path</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-actions\"></span>\n </div>\n @for (mapping of variableMappings(); track mapping.attributePath; let i = $index) {\n <div class=\"grid-row\">\n <div class=\"col-name\">\n <kendo-textbox\n [value]=\"mapping.name\"\n (valueChange)=\"onNameChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n @if (getNameError(mapping.name, i); as error) {\n <span class=\"error-text\">{{ error }}</span>\n }\n </div>\n <div class=\"col-path\">{{ mapping.attributePath }}</div>\n <div class=\"col-type\">{{ mapping.attributeValueType }}</div>\n <div class=\"col-actions\">\n <button\n kendoButton\n (click)=\"removeMapping(i)\"\n [svgIcon]=\"trashIcon\"\n fillMode=\"flat\"\n themeColor=\"error\"\n title=\"Remove\">\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"onCancel()\" fillMode=\"outline\">Cancel</button>\n <button kendoButton (click)=\"onOk()\" themeColor=\"primary\" [disabled]=\"!isValid()\">OK</button>\n </div>\n </div>\n `,\n styles: [`\n .dialog-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 20px;\n }\n\n .form-row {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--kendo-color-subtle, #666);\n }\n\n .mappings-grid {\n border: 1px solid var(--kendo-color-border, #e0e0e0);\n border-radius: 4px;\n background: var(--kendo-color-surface-alt, #fafafa);\n }\n\n .grid-header {\n display: grid;\n grid-template-columns: 1fr 1fr 100px 40px;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: var(--kendo-color-surface, #f5f5f5);\n border-bottom: 1px solid var(--kendo-color-border, #e0e0e0);\n font-size: 12px;\n font-weight: 600;\n color: var(--kendo-color-subtle, #666);\n }\n\n .grid-row {\n display: grid;\n grid-template-columns: 1fr 1fr 100px 40px;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n align-items: start;\n border-bottom: 1px solid var(--kendo-color-border, #e0e0e0);\n\n &:last-child {\n border-bottom: none;\n }\n }\n\n .col-name {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .col-path, .col-type {\n font-size: 13px;\n padding-top: 6px;\n color: var(--kendo-color-on-app-surface, #424242);\n }\n\n .col-actions {\n display: flex;\n justify-content: center;\n padding-top: 2px;\n }\n\n .error-text {\n font-size: 11px;\n color: var(--kendo-color-error, #f44336);\n }\n\n .dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--kendo-color-border, #e0e0e0);\n }\n `]\n})\nexport class RuntimeEntityVariableDialogComponent {\n private readonly windowRef = inject(WindowRef);\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly attributeSelectorDialogService = inject(AttributeSelectorDialogService);\n\n protected readonly pencilIcon = pencilIcon;\n protected readonly trashIcon = trashIcon;\n\n /** Data passed to the dialog (set by service) */\n data: RuntimeEntityVariableDialogData = {};\n\n // Signals\n readonly selectedCkType = signal<CkTypeSelectorItem | null>(null);\n readonly selectedEntity = signal<RuntimeEntityItem | null>(null);\n readonly variableMappings = signal<RuntimeEntityVariableMapping[]>([]);\n\n readonly entityDataSource = computed(() => {\n const ckType = this.selectedCkType();\n if (!ckType) return null;\n return new RuntimeEntitySelectDataSource(this.getEntitiesByCkTypeGQL, ckType.rtCkTypeId);\n });\n\n readonly entityDialogDataSource = computed(() => {\n const ckType = this.selectedCkType();\n if (!ckType) return null;\n return new RuntimeEntityDialogDataSource(this.getEntitiesByCkTypeGQL, ckType.rtCkTypeId);\n });\n\n private readonly VALID_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType.set(ckType);\n this.selectedEntity.set(null);\n // Don't clear mappings — keep them if user is just switching type\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType.set(null);\n this.selectedEntity.set(null);\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity.set(entity);\n }\n\n onEntityCleared(): void {\n this.selectedEntity.set(null);\n }\n\n async openAttributeSelector(): Promise<void> {\n const ckType = this.selectedCkType();\n if (!ckType) return;\n\n const existingPaths = this.variableMappings().map(m => m.attributePath);\n\n const result = await this.attributeSelectorDialogService.openAttributeSelector(\n ckType.rtCkTypeId,\n existingPaths,\n 'Select Attributes'\n );\n\n if (result.confirmed && result.selectedAttributes.length > 0) {\n this.addAttributeMappings(result.selectedAttributes);\n }\n }\n\n onNameChange(index: number, name: string): void {\n const sanitized = name.replace(/[^a-zA-Z0-9_]/g, '');\n const mappings = [...this.variableMappings()];\n mappings[index] = { ...mappings[index], name: sanitized };\n this.variableMappings.set(mappings);\n }\n\n removeMapping(index: number): void {\n const mappings = this.variableMappings().filter((_, i) => i !== index);\n this.variableMappings.set(mappings);\n }\n\n getNameError(name: string, index: number): string | null {\n if (!name) return 'Name required';\n if (!this.VALID_NAME_REGEX.test(name)) return 'Invalid name';\n if (this.isDuplicateName(name, index)) return 'Duplicate';\n return null;\n }\n\n isValid(): boolean {\n const entity = this.selectedEntity();\n const mappings = this.variableMappings();\n if (!entity || mappings.length === 0) return false;\n\n return mappings.every((m, i) =>\n m.name &&\n this.VALID_NAME_REGEX.test(m.name) &&\n !this.isDuplicateName(m.name, i)\n );\n }\n\n onOk(): void {\n const ckType = this.selectedCkType();\n const entity = this.selectedEntity();\n if (!ckType || !entity) return;\n\n const result: RuntimeEntityVariableDialogResult = {\n entityCkTypeId: ckType.rtCkTypeId,\n entityRtId: entity.rtId,\n entityDisplayName: entity.displayName,\n variables: this.variableMappings()\n };\n\n this.windowRef.close(result);\n }\n\n onCancel(): void {\n this.windowRef.close();\n }\n\n private addAttributeMappings(attributes: AttributeItem[]): void {\n const existingMappings = this.variableMappings();\n const existingPaths = new Set(existingMappings.map(m => m.attributePath));\n const allNames = new Set([\n ...existingMappings.map(m => m.name),\n ...(this.data.existingVariableNames ?? [])\n ]);\n\n const newMappings: RuntimeEntityVariableMapping[] = [];\n for (const attr of attributes) {\n if (existingPaths.has(attr.attributePath)) continue;\n\n let name = this.attributePathToVariableName(attr.attributePath);\n let counter = 1;\n while (allNames.has(name)) {\n name = `${this.attributePathToVariableName(attr.attributePath)}${counter}`;\n counter++;\n }\n allNames.add(name);\n\n newMappings.push({\n name,\n attributePath: attr.attributePath,\n attributeValueType: attr.attributeValueType\n });\n }\n\n this.variableMappings.set([...existingMappings, ...newMappings]);\n }\n\n private attributePathToVariableName(attributePath: string): string {\n const parts = attributePath.split('.');\n return parts\n .map((part, index) =>\n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n }\n\n private isDuplicateName(name: string, currentIndex: number): boolean {\n const mappings = this.variableMappings();\n const existingNames = this.data.existingVariableNames ?? [];\n\n // Check within dialog mappings\n if (mappings.some((m, i) => i !== currentIndex && m.name === name)) return true;\n // Check against existing external variable names\n if (existingNames.includes(name)) return true;\n\n return false;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WindowService, WindowCloseResult } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { WindowStateService } from '@meshmakers/shared-ui';\nimport { RuntimeEntityVariableDialogComponent } from './runtime-entity-variable-dialog.component';\nimport {\n RuntimeEntityVariableDialogData,\n RuntimeEntityVariableDialogResult\n} from './runtime-entity-variable-dialog.models';\n\nexport interface RuntimeEntityVariableResult {\n confirmed: boolean;\n result?: RuntimeEntityVariableDialogResult;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RuntimeEntityVariableDialogService {\n private readonly windowService = inject(WindowService);\n private readonly windowStateService = inject(WindowStateService);\n\n /**\n * Opens the runtime entity variable dialog.\n * @param data Optional pre-populated data for editing\n * @returns Promise with confirmation status and dialog result\n */\n public async openRuntimeEntityVariableDialog(\n data?: RuntimeEntityVariableDialogData\n ): Promise<RuntimeEntityVariableResult> {\n const size = this.windowStateService.resolveWindowSize('runtime-entity-variable', { width: 800, height: 600 });\n\n const windowRef = this.windowService.open({\n content: RuntimeEntityVariableDialogComponent,\n width: size.width,\n height: size.height,\n minWidth: 650,\n minHeight: 500,\n resizable: true,\n title: 'Runtime Entity Variables'\n });\n\n this.windowStateService.applyModalBehavior('runtime-entity-variable', windowRef);\n\n const contentRef = windowRef.content as { instance?: RuntimeEntityVariableDialogComponent } | undefined;\n if (contentRef?.instance && data) {\n contentRef.instance.data = data;\n }\n\n try {\n const result = await firstValueFrom(windowRef.result);\n\n if (result instanceof WindowCloseResult) {\n return { confirmed: false };\n }\n\n if (result && typeof result === 'object' && 'variables' in result) {\n return {\n confirmed: true,\n result: result as RuntimeEntityVariableDialogResult\n };\n }\n\n return { confirmed: false };\n } catch {\n return { confirmed: false };\n }\n }\n}\n","import {\n FieldFilterDto,\n FieldFilterOperatorsDto,\n SearchFilterDto,\n SearchFilterTypesDto, SortDto, SortOrdersDto\n} from '@meshmakers/octo-services';\nimport {DataSourceTyped, ListViewComponent} from '@meshmakers/shared-ui';\nimport {FilterOperator, isCompositeFilterDescriptor} from '@progress/kendo-data-query';\nimport {State} from '@progress/kendo-data-query/dist/npm/state';\n\n// noinspection JSUnusedGlobalSymbols\nexport abstract class OctoGraphQlDataSource<TDto> extends DataSourceTyped<TDto | null> {\n\n private _searchFilterAttributePaths: string[] = [];\n\n // noinspection JSUnusedGlobalSymbols\n protected constructor(listViewComponent: ListViewComponent) {\n super(listViewComponent);\n }\n\n protected get searchFilterAttributePaths(): string[] {\n return this._searchFilterAttributePaths;\n }\n protected set searchFilterAttributePaths(value: string[]) {\n this._searchFilterAttributePaths = value;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getFieldFilterDefinitions(state: State) {\n let fieldFilters: FieldFilterDto[] | null = null;\n if (state.filter?.filters) {\n fieldFilters = state.filter.filters.map((f) => {\n\n if (isCompositeFilterDescriptor(f)) {\n throw new Error('Composite filter descriptor not supported');\n }\n\n const {operator, value} = OctoGraphQlDataSource.getOperatorAndValue(f.operator as FilterOperator, f.value);\n\n return {\n attributePath: f.field,\n operator: operator,\n comparisonValue: value\n } as FieldFilterDto;\n });\n }\n return fieldFilters;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getSearchFilterDefinitions(textSearchValue: string | null): SearchFilterDto | null {\n let searchFilterDto: SearchFilterDto | null = null;\n if (textSearchValue) {\n searchFilterDto = {\n type: SearchFilterTypesDto.AttributeFilterDto,\n attributePaths: this.searchFilterAttributePaths,\n searchTerm: textSearchValue,\n };\n }\n return searchFilterDto;\n }\n\n // noinspection JSUnusedGlobalSymbols\n protected getSortDefinitions(state: State): SortDto[] | null {\n let sort: SortDto[] | null = null;\n if (state.sort) {\n sort = new Array<SortDto>()\n state.sort.forEach((s) => {\n\n switch (s.dir) {\n case 'asc':\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.AscendingDto\n });\n break;\n case 'desc':\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.DescendingDto,\n });\n break;\n default:\n sort?.push({\n attributePath: s.field,\n sortOrder: SortOrdersDto.DefaultDto,\n });\n break;\n }\n\n });\n }\n return sort;\n }\n\n private static getOperatorAndValue(operator: FilterOperator, value: unknown): {\n operator: FieldFilterOperatorsDto,\n value: unknown\n } {\n\n switch (operator) {\n case 'eq':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: value};\n case 'neq':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: value};\n case 'lt':\n return {operator: FieldFilterOperatorsDto.LessThanDto, value: value};\n case 'lte':\n return {operator: FieldFilterOperatorsDto.LessEqualThanDto, value: value};\n case 'gt':\n return {operator: FieldFilterOperatorsDto.GreaterThanDto, value: value};\n case 'gte':\n return {operator: FieldFilterOperatorsDto.GreaterEqualThanDto, value: value};\n case 'contains':\n return {operator: FieldFilterOperatorsDto.LikeDto, value: value};\n case 'doesnotcontain':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: `^(?!.*${value}).*$`};\n case 'startswith':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: value + '.*'};\n case 'endswith':\n return {operator: FieldFilterOperatorsDto.MatchRegExDto, value: '.*' + value};\n case 'isnull':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: null};\n case 'isnotnull':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: null};\n case 'isempty':\n return {operator: FieldFilterOperatorsDto.EqualsDto, value: \"\"};\n case 'isnotempty':\n return {operator: FieldFilterOperatorsDto.NotEqualsDto, value: \"\"};\n default:\n throw new Error('The filter operator is not supported');\n }\n }\n}\n","import {TreeItemDataTyped} from \"@meshmakers/shared-services\";\nimport {HierarchyDataSourceBase} from \"@meshmakers/shared-ui\";\n\nexport abstract class OctoGraphQlHierarchyDataSource<TQueryDto> extends HierarchyDataSourceBase<TQueryDto> {\n public abstract override fetchChildren(item: TreeItemDataTyped<TQueryDto>): Promise<TreeItemDataTyped<TQueryDto>[]>;\n\n public abstract override fetchRootNodes(): Promise<TreeItemDataTyped<TQueryDto>[]>;\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DateInputsModule } from '@progress/kendo-angular-dateinputs';\nimport { IconsModule } from '@progress/kendo-angular-icons';\nimport { PopupModule } from '@progress/kendo-angular-popup';\nimport { IntlModule } from '@progress/kendo-angular-intl';\n// Note: Kendo locale data (de/en) should be loaded via polyfills in the consuming application\nimport { plusIcon, minusIcon, trashIcon, dollarIcon } from '@progress/kendo-svg-icons';\nimport {\n FieldFilterDto,\n FieldFilterOperatorsDto,\n AttributeValueTypeDto,\n AttributeItem,\n AttributeSelectorService\n} from '@meshmakers/octo-services';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Variable definition for use in filter values.\n * Generic interface that can be provided by any consumer (e.g., MeshBoard).\n */\nexport interface FilterVariable {\n /** Variable name (without $ prefix) */\n name: string;\n /** Display label for UI */\n label?: string;\n /** Variable data type */\n type?: 'string' | 'number' | 'boolean' | 'date' | 'datetime';\n}\n\nexport interface FieldFilterItem extends FieldFilterDto {\n id: number;\n /** If true, comparisonValue contains a variable reference (e.g., $myVar) */\n useVariable?: boolean;\n}\n\ntype InputType = 'text' | 'number' | 'boolean' | 'datetime';\n\n@Component({\n selector: 'mm-field-filter-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n ButtonsModule,\n DropDownsModule,\n InputsModule,\n DateInputsModule,\n IconsModule,\n PopupModule,\n IntlModule\n ],\n template: `\n <div class=\"field-filter-editor\">\n @if (ckTypeId && !hideNavigationProperties) {\n <div class=\"attribute-options\">\n <label class=\"inline-checkbox\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"includeNavigationProperties\"\n (ngModelChange)=\"onNavigationPropertiesChange()\" />\n Include Navigation Properties\n </label>\n <label class=\"inline-field\">\n Max Depth\n <kendo-numerictextbox\n [(ngModel)]=\"maxDepth\"\n [min]=\"1\" [max]=\"5\" [step]=\"1\" [format]=\"'n0'\"\n [spinners]=\"true\"\n [disabled]=\"!includeNavigationProperties\"\n (valueChange)=\"onMaxDepthChange($event)\"\n class=\"depth-input\">\n </kendo-numerictextbox>\n </label>\n @if (isLoadingAttributes) {\n <span class=\"loading-hint\">Loading...</span>\n }\n </div>\n }\n <div class=\"toolbar\">\n <button\n kendoButton\n [svgIcon]=\"plusIcon\"\n themeColor=\"primary\"\n (click)=\"addFilter()\"\n title=\"Add filter\">\n Add Filter\n </button>\n <button\n kendoButton\n [svgIcon]=\"trashIcon\"\n themeColor=\"error\"\n (click)=\"removeSelected()\"\n [disabled]=\"selectedKeys.length === 0\"\n title=\"Remove selected filters\">\n Remove Selected\n </button>\n </div>\n\n <kendo-grid\n [data]=\"filters\"\n [selectable]=\"{ mode: 'multiple', enabled: true }\"\n [kendoGridSelectBy]=\"'id'\"\n [(selectedKeys)]=\"selectedKeys\"\n class=\"filter-grid\">\n\n <kendo-grid-column title=\"\" [width]=\"50\" [class]=\"'checkbox-column'\">\n <ng-template kendoGridHeaderTemplate>\n <input\n type=\"checkbox\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event)\" />\n </ng-template>\n <ng-template kendoGridCellTemplate let-dataItem>\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(dataItem)\"\n (change)=\"toggleSelection(dataItem)\" />\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"280\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @if (availableAttributes.length > 0) {\n <kendo-combobox\n [data]=\"filteredAttributeList\"\n [(ngModel)]=\"dataItem.attributePath\"\n (valueChange)=\"onAttributeChange(dataItem, $event)\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [allowCustom]=\"true\"\n [filterable]=\"true\"\n (filterChange)=\"onAttributeFilterChange($event)\"\n [listHeight]=\"300\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"attribute-dropdown\">\n <ng-template kendoComboBoxItemTemplate let-item>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ item.attributePath }}</span>\n <span class=\"attribute-type\">{{ item.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox\n [(ngModel)]=\"dataItem.attributePath\"\n (valueChange)=\"onFilterChange()\"\n placeholder=\"Enter attribute path\"\n class=\"attribute-input\">\n </kendo-textbox>\n }\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"operator\" title=\"Operator\" [width]=\"180\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <kendo-dropdownlist\n [data]=\"operators\"\n [(ngModel)]=\"dataItem.operator\"\n (valueChange)=\"onOperatorChange(dataItem)\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [listHeight]=\"300\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"operator-dropdown\">\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"comparisonValue\" title=\"Value\" [width]=\"280\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"value-cell\">\n @if (dataItem.useVariable && enableVariables) {\n <!-- Variable mode: show variable dropdown -->\n <kendo-dropdownlist\n [data]=\"availableVariables\"\n [value]=\"getSelectedVariable(dataItem)\"\n (valueChange)=\"onVariableSelected(dataItem, $event)\"\n [textField]=\"'label'\"\n [valueField]=\"'name'\"\n [valuePrimitive]=\"false\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n placeholder=\"Select variable...\"\n class=\"value-input variable-dropdown\">\n <ng-template kendoDropDownListItemTemplate let-item>\n <div class=\"variable-item\">\n <span class=\"variable-name\">{{ formatVariableDisplay(item.name) }}</span>\n @if (item.label && item.label !== item.name) {\n <span class=\"variable-label\">{{ item.label }}</span>\n }\n </div>\n </ng-template>\n <ng-template kendoDropDownListValueTemplate let-item>\n @if (item) {\n <span class=\"variable-value\">{{ formatVariableDisplay(item.name) }}</span>\n } @else {\n <span class=\"variable-placeholder\">Select variable...</span>\n }\n </ng-template>\n </kendo-dropdownlist>\n } @else {\n <!-- Literal value mode: show type-specific input -->\n @switch (getInputType(dataItem)) {\n @case ('boolean') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"true, false\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-dropdownlist\n [data]=\"booleanOptions\"\n [value]=\"getBooleanValue(dataItem)\"\n (valueChange)=\"onBooleanValueChange(dataItem, $event)\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"value-input\">\n </kendo-dropdownlist>\n }\n }\n @case ('number') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"1, 2, 3\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-numerictextbox\n [value]=\"getNumericValue(dataItem)\"\n (valueChange)=\"onNumericValueChange(dataItem, $event)\"\n [decimals]=\"getDecimals(dataItem)\"\n [format]=\"getNumberFormat(dataItem)\"\n class=\"value-input\">\n </kendo-numerictextbox>\n }\n }\n @case ('datetime') {\n @if (isArrayOperator(dataItem.operator)) {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n placeholder=\"2024-01-15, 2024-02-20\"\n class=\"value-input\">\n </kendo-textbox>\n } @else {\n <kendo-datetimepicker\n [value]=\"getDateTimeValue(dataItem)\"\n (valueChange)=\"onDateTimeValueChange(dataItem, $event)\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"value-input\">\n </kendo-datetimepicker>\n }\n }\n @default {\n <kendo-textbox\n [value]=\"getDisplayValue(dataItem)\"\n (valueChange)=\"onComparisonValueChange(dataItem, $event)\"\n (blur)=\"onComparisonValueBlur(dataItem)\"\n [placeholder]=\"getValuePlaceholder(dataItem)\"\n class=\"value-input\">\n </kendo-textbox>\n }\n }\n }\n <!-- Variable toggle button -->\n @if (enableVariables && availableVariables.length > 0) {\n <button\n kendoButton\n [svgIcon]=\"dollarIcon\"\n fillMode=\"flat\"\n [themeColor]=\"dataItem.useVariable ? 'primary' : 'base'\"\n (click)=\"toggleVariableMode(dataItem)\"\n [title]=\"dataItem.useVariable ? 'Switch to literal value' : 'Use variable'\"\n class=\"variable-toggle\">\n </button>\n }\n </div>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column title=\"\" [width]=\"60\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <button\n kendoButton\n [svgIcon]=\"minusIcon\"\n fillMode=\"flat\"\n themeColor=\"error\"\n (click)=\"removeFilter(dataItem)\"\n title=\"Remove this filter\">\n </button>\n </ng-template>\n </kendo-grid-column>\n\n </kendo-grid>\n\n @if (filters.length === 0) {\n <div class=\"empty-state\">\n <p>No filters defined. Click \"Add Filter\" to create a new filter.</p>\n </div>\n }\n </div>\n `,\n styles: [`\n .field-filter-editor {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .attribute-options {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85rem;\n }\n\n .inline-checkbox {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .inline-field {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: normal;\n }\n\n .depth-input {\n width: 80px;\n }\n\n .loading-hint {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .toolbar {\n display: flex;\n gap: 10px;\n margin-bottom: 5px;\n }\n\n .filter-grid {\n border: 1px solid #d5d5d5;\n }\n\n .filter-grid ::ng-deep .k-grid-header .k-header {\n font-weight: 600;\n }\n\n .checkbox-column {\n text-align: center;\n }\n\n .attribute-dropdown,\n .operator-dropdown,\n .attribute-input {\n width: 100%;\n }\n\n .value-input {\n width: 100%;\n }\n\n .attribute-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n }\n\n .attribute-path {\n flex: 1;\n }\n\n .attribute-type {\n font-size: 11px;\n color: #888;\n margin-left: 8px;\n padding: 2px 6px;\n background: #f0f0f0;\n border-radius: 3px;\n }\n\n .empty-state {\n padding: 40px;\n text-align: center;\n border: 1px dashed;\n border-radius: 8px;\n font-family: 'Montserrat', sans-serif;\n font-size: 0.9rem;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .value-cell {\n display: flex;\n gap: 4px;\n align-items: center;\n }\n\n .value-cell .value-input {\n flex: 1;\n }\n\n .variable-toggle {\n flex-shrink: 0;\n }\n\n .variable-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .variable-name {\n font-family: monospace;\n font-weight: 500;\n }\n\n .variable-label {\n font-size: 11px;\n color: var(--kendo-color-subtle, #888);\n }\n\n .variable-value {\n font-family: monospace;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .variable-placeholder {\n color: var(--kendo-color-subtle, #888);\n }\n\n .variable-dropdown ::ng-deep .k-input-value-text {\n font-family: monospace;\n }\n `]\n})\nexport class FieldFilterEditorComponent implements OnChanges {\n private readonly attributeService = inject(AttributeSelectorService, { optional: true });\n\n protected readonly plusIcon = plusIcon;\n protected readonly minusIcon = minusIcon;\n protected readonly trashIcon = trashIcon;\n protected readonly dollarIcon = dollarIcon;\n\n private readonly arrayOperators = [\n FieldFilterOperatorsDto.InDto,\n FieldFilterOperatorsDto.NotInDto\n ];\n\n public readonly operators: { label: string; value: FieldFilterOperatorsDto }[] = [\n { label: 'Equals', value: FieldFilterOperatorsDto.EqualsDto },\n { label: 'Not Equals', value: FieldFilterOperatorsDto.NotEqualsDto },\n { label: 'Greater Than', value: FieldFilterOperatorsDto.GreaterThanDto },\n { label: 'Greater Equal', value: FieldFilterOperatorsDto.GreaterEqualThanDto },\n { label: 'Less Than', value: FieldFilterOperatorsDto.LessThanDto },\n { label: 'Less Equal', value: FieldFilterOperatorsDto.LessEqualThanDto },\n { label: 'Like', value: FieldFilterOperatorsDto.LikeDto },\n { label: 'In', value: FieldFilterOperatorsDto.InDto },\n { label: 'Not In', value: FieldFilterOperatorsDto.NotInDto },\n { label: 'Any Equals', value: FieldFilterOperatorsDto.AnyEqDto },\n { label: 'Any Like', value: FieldFilterOperatorsDto.AnyLikeDto },\n { label: 'Match RegEx', value: FieldFilterOperatorsDto.MatchRegExDto }\n ];\n\n public readonly booleanOptions = ['true', 'false'];\n\n @Input() public availableAttributes: AttributeItem[] = [];\n\n /**\n * Optional CK type ID for self-loading attributes.\n * When set, the component loads available attributes itself and shows\n * navigation property controls (checkbox + max depth).\n * When not set, the component uses the externally provided availableAttributes input.\n */\n @Input() public ckTypeId?: string;\n\n /**\n * When true, hides the \"Include Navigation Properties\" checkbox and Max Depth controls,\n * and forces attribute loading without navigation properties.\n * Used for stream data queries which don't support navigation properties.\n */\n @Input() public hideNavigationProperties = false;\n\n /**\n * When set, restricts the available attributes to only these attribute paths (filtered client-side after fetching).\n * Used for stream data queries to show only stream-data-enabled attributes.\n */\n @Input() public attributePaths?: string[];\n\n /** Enable variable mode - allows using variables instead of literal values */\n @Input() public enableVariables = false;\n\n /** Available variables for selection when enableVariables is true */\n @Input() public availableVariables: FilterVariable[] = [];\n\n /** Controls for self-loading mode (when ckTypeId is set) */\n public includeNavigationProperties = true;\n public maxDepth: number | null = null;\n public isLoadingAttributes = false;\n\n private _filters: FieldFilterItem[] = [];\n private nextId = 1;\n public filteredAttributeList: AttributeItem[] = [];\n private attributeTypeMap = new Map<string, AttributeValueTypeDto>();\n\n @Input()\n public get filters(): FieldFilterItem[] {\n return this._filters;\n }\n public set filters(value: FieldFilterItem[]) {\n this._filters = value;\n this.filtersChange.emit(this._filters);\n }\n\n @Output() public filtersChange = new EventEmitter<FieldFilterItem[]>();\n\n public selectedKeys: number[] = [];\n\n ngOnChanges(changes?: SimpleChanges): void {\n // When hideNavigationProperties changes to true, reset nav props\n if (changes?.['hideNavigationProperties'] && this.hideNavigationProperties) {\n this.includeNavigationProperties = false;\n this.maxDepth = null;\n }\n\n // Reload attributes when ckTypeId, hideNavigationProperties, or attributePaths changes\n if ((changes?.['ckTypeId'] || changes?.['hideNavigationProperties'] || changes?.['attributePaths']) && this.ckTypeId) {\n this.loadAttributesFromCkType();\n }\n\n this.filteredAttributeList = [...this.availableAttributes];\n this.buildAttributeTypeMap();\n // Ensure useVariable flag is set correctly for filters with variable values\n this.detectVariableFilters();\n }\n\n /**\n * Detects filters that contain variable references and sets useVariable flag.\n * This ensures proper display when filters are loaded from saved configuration.\n */\n private detectVariableFilters(): void {\n for (const filter of this._filters) {\n // Always check if the value is a variable reference and update the flag\n const isVariable = this.isVariableValue(filter.comparisonValue);\n if (isVariable && !filter.useVariable) {\n filter.useVariable = true;\n }\n }\n }\n\n private buildAttributeTypeMap(): void {\n this.attributeTypeMap.clear();\n for (const attr of this.availableAttributes) {\n this.attributeTypeMap.set(attr.attributePath, attr.attributeValueType as AttributeValueTypeDto);\n }\n }\n\n // ============================================================================\n // Self-loading attribute methods (when ckTypeId is set)\n // ============================================================================\n\n public onNavigationPropertiesChange(): void {\n if (!this.includeNavigationProperties) {\n this.maxDepth = null;\n }\n this.loadAttributesFromCkType();\n }\n\n public onMaxDepthChange(value: number | null): void {\n this.maxDepth = value;\n this.loadAttributesFromCkType();\n }\n\n private async loadAttributesFromCkType(): Promise<void> {\n if (!this.ckTypeId || !this.attributeService) return;\n\n this.isLoadingAttributes = true;\n const includeNavProps = this.hideNavigationProperties ? false : this.includeNavigationProperties;\n try {\n const result = await firstValueFrom(\n this.attributeService.getAvailableAttributes(\n this.ckTypeId,\n undefined, // filter\n 1000, // first\n undefined, // after\n undefined, // attributeValueType\n undefined, // searchTerm\n includeNavProps,\n this.maxDepth ?? undefined\n )\n );\n // Apply client-side attribute path restriction if set\n const allowedPathsSet = this.attributePaths ? new Set(this.attributePaths) : null;\n this.availableAttributes = allowedPathsSet\n ? result.items.filter(item => allowedPathsSet.has(item.attributePath))\n : result.items;\n this.filteredAttributeList = [...this.availableAttributes];\n this.buildAttributeTypeMap();\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.availableAttributes = [];\n this.filteredAttributeList = [];\n } finally {\n this.isLoadingAttributes = false;\n }\n }\n\n public addFilter(): void {\n const newFilter: FieldFilterItem = {\n id: this.nextId++,\n attributePath: '',\n operator: FieldFilterOperatorsDto.EqualsDto,\n comparisonValue: ''\n };\n this._filters = [...this._filters, newFilter];\n this.filtersChange.emit(this._filters);\n }\n\n public removeFilter(filter: FieldFilterItem): void {\n this._filters = this._filters.filter(f => f.id !== filter.id);\n this.selectedKeys = this.selectedKeys.filter(k => k !== filter.id);\n this.filtersChange.emit(this._filters);\n }\n\n public removeSelected(): void {\n this._filters = this._filters.filter(f => !this.selectedKeys.includes(f.id));\n this.selectedKeys = [];\n this.filtersChange.emit(this._filters);\n }\n\n public onFilterChange(): void {\n this.filtersChange.emit(this._filters);\n }\n\n public onAttributeChange(filter: FieldFilterItem, attributePath: string): void {\n filter.attributePath = attributePath;\n // Reset comparison value when attribute changes\n filter.comparisonValue = '';\n this.onFilterChange();\n }\n\n public onOperatorChange(filter: FieldFilterItem): void {\n if (!filter.comparisonValue) {\n this.onFilterChange();\n return;\n }\n\n const currentValue = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator)) {\n const valuesToProcess = this.extractArrayContent(currentValue);\n const cleanedValues = this.parseAndCleanArrayValues(valuesToProcess);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n const scalarValue = this.extractArrayContent(currentValue);\n if (scalarValue.includes(',')) {\n filter.comparisonValue = scalarValue.split(',')[0].trim();\n } else {\n filter.comparisonValue = scalarValue.trim();\n }\n }\n\n this.onFilterChange();\n }\n\n public onComparisonValueChange(filter: FieldFilterItem, inputValue: string | null): void {\n if (inputValue === null) {\n filter.comparisonValue = '';\n return;\n }\n\n if (this.isArrayOperator(filter.operator)) {\n const cleanedValues = this.parseAndCleanArrayValues(inputValue);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n filter.comparisonValue = this.extractArrayContent(inputValue);\n }\n\n this.onFilterChange();\n }\n\n public onComparisonValueBlur(filter: FieldFilterItem): void {\n if (!filter.comparisonValue) return;\n\n const value = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator)) {\n const cleanedValues = this.parseAndCleanArrayValues(value);\n filter.comparisonValue = `[${cleanedValues.join(', ')}]`;\n } else {\n filter.comparisonValue = this.extractArrayContent(value).trim();\n }\n\n this.onFilterChange();\n }\n\n public onBooleanValueChange(filter: FieldFilterItem, value: string): void {\n filter.comparisonValue = value;\n this.onFilterChange();\n }\n\n public onNumericValueChange(filter: FieldFilterItem, value: number | null): void {\n filter.comparisonValue = value !== null ? String(value) : '';\n this.onFilterChange();\n }\n\n public onDateTimeValueChange(filter: FieldFilterItem, value: Date | null): void {\n filter.comparisonValue = value !== null ? value.toISOString() : '';\n this.onFilterChange();\n }\n\n public getDisplayValue(filter: FieldFilterItem): string {\n if (!filter.comparisonValue) {\n return '';\n }\n\n const value = String(filter.comparisonValue);\n\n if (this.isArrayOperator(filter.operator) && this.isArrayValue(value)) {\n return this.extractArrayContent(value);\n }\n\n return value;\n }\n\n public getBooleanValue(filter: FieldFilterItem): string {\n const value = filter.comparisonValue;\n if (value === 'true' || value === true) return 'true';\n if (value === 'false' || value === false) return 'false';\n return '';\n }\n\n public getNumericValue(filter: FieldFilterItem): number {\n const value = filter.comparisonValue;\n if (value === null || value === undefined || value === '') return 0;\n const num = Number(value);\n return isNaN(num) ? 0 : num;\n }\n\n public getDateTimeValue(filter: FieldFilterItem): Date | null {\n const value = filter.comparisonValue;\n if (!value) return null;\n const date = new Date(String(value));\n return isNaN(date.getTime()) ? null : date;\n }\n\n public getInputType(filter: FieldFilterItem): InputType {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n if (!attrType) return 'text';\n\n // Normalize to uppercase for case-insensitive comparison\n const normalizedType = String(attrType).toUpperCase();\n\n // Boolean types\n if (normalizedType === 'BOOLEAN') {\n return 'boolean';\n }\n\n // Numeric types\n if (normalizedType === 'INT' || normalizedType === 'INTEGER' ||\n normalizedType === 'INT_64' || normalizedType === 'INTEGER_64' ||\n normalizedType === 'DOUBLE') {\n return 'number';\n }\n\n // DateTime types\n if (normalizedType === 'DATE_TIME' || normalizedType === 'DATE_TIME_OFFSET' ||\n normalizedType === 'DATETIME' || normalizedType === 'DATETIMEOFFSET') {\n return 'datetime';\n }\n\n return 'text';\n }\n\n public getDecimals(filter: FieldFilterItem): number {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n return attrType === AttributeValueTypeDto.DoubleDto ? 4 : 0;\n }\n\n public getNumberFormat(filter: FieldFilterItem): string {\n const attrType = this.attributeTypeMap.get(filter.attributePath);\n return attrType === AttributeValueTypeDto.DoubleDto ? 'n4' : 'n0';\n }\n\n public getValuePlaceholder(filter: FieldFilterItem): string {\n if (this.isArrayOperator(filter.operator)) {\n return 'Values: A,B,C or \"value,with,comma\"';\n }\n return 'Enter value';\n }\n\n public isArrayOperator(operator: FieldFilterOperatorsDto): boolean {\n return this.arrayOperators.includes(operator);\n }\n\n public isSelected(filter: FieldFilterItem): boolean {\n return this.selectedKeys.includes(filter.id);\n }\n\n public toggleSelection(filter: FieldFilterItem): void {\n if (this.isSelected(filter)) {\n this.selectedKeys = this.selectedKeys.filter(k => k !== filter.id);\n } else {\n this.selectedKeys = [...this.selectedKeys, filter.id];\n }\n }\n\n public isAllSelected(): boolean {\n return this._filters.length > 0 && this.selectedKeys.length === this._filters.length;\n }\n\n public isIndeterminate(): boolean {\n return this.selectedKeys.length > 0 && this.selectedKeys.length < this._filters.length;\n }\n\n public toggleSelectAll(event: Event): void {\n const checkbox = event.target as HTMLInputElement;\n if (checkbox.checked) {\n this.selectedKeys = this._filters.map(f => f.id);\n } else {\n this.selectedKeys = [];\n }\n }\n\n public onAttributeFilterChange(filter: string): void {\n this.filteredAttributeList = this.availableAttributes.filter(\n attr => attr.attributePath.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n // ============================================================================\n // Variable Mode Methods\n // ============================================================================\n\n /**\n * Toggles between literal value and variable mode for a filter.\n */\n public toggleVariableMode(filter: FieldFilterItem): void {\n filter.useVariable = !filter.useVariable;\n // Clear the value when switching modes\n filter.comparisonValue = '';\n this.onFilterChange();\n }\n\n /**\n * Gets the selected variable object for a filter that uses variable mode.\n */\n public getSelectedVariable(filter: FieldFilterItem): FilterVariable | null {\n if (!filter.comparisonValue) return null;\n\n const varName = this.extractVariableName(String(filter.comparisonValue));\n if (!varName) return null;\n\n return this.availableVariables.find(v => v.name === varName) || null;\n }\n\n /**\n * Handles variable selection from the dropdown.\n */\n public onVariableSelected(filter: FieldFilterItem, variable: FilterVariable | null): void {\n if (variable) {\n // Store as ${variableName} format\n filter.comparisonValue = `\\${${variable.name}}`;\n } else {\n filter.comparisonValue = '';\n }\n this.onFilterChange();\n }\n\n /**\n * Extracts variable name from ${variableName} or $variableName format.\n */\n private extractVariableName(value: string): string | null {\n // Match ${varName} format\n const bracketMatch = value.match(/^\\$\\{([^}]+)\\}$/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n // Match $varName format (without braces)\n const simpleMatch = value.match(/^\\$([a-zA-Z_][a-zA-Z0-9_]*)$/);\n if (simpleMatch) {\n return simpleMatch[1];\n }\n\n return null;\n }\n\n /**\n * Checks if a filter value is a variable reference.\n */\n public isVariableValue(value: unknown): boolean {\n if (!value || typeof value !== 'string') return false;\n return /^\\$\\{[^}]+\\}$/.test(value) || /^\\$[a-zA-Z_][a-zA-Z0-9_]*$/.test(value);\n }\n\n /**\n * Formats a variable name for display (e.g., \"myVar\" -> \"${myVar}\").\n */\n public formatVariableDisplay(name: string): string {\n return '$' + '{' + name + '}';\n }\n\n public getFieldFilters(): FieldFilterDto[] {\n return this._filters\n .filter(f => f.attributePath && f.attributePath.trim() !== '')\n .map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }));\n }\n\n public setFieldFilters(filters: FieldFilterDto[]): void {\n this._filters = filters.map(f => ({\n ...f,\n id: this.nextId++,\n // Detect if the value is a variable reference\n useVariable: this.isVariableValue(f.comparisonValue)\n }));\n this.filtersChange.emit(this._filters);\n }\n\n public clear(): void {\n this._filters = [];\n this.selectedKeys = [];\n this.filtersChange.emit(this._filters);\n }\n\n private isArrayValue(value: string): boolean {\n return value.trim().startsWith('[') && value.trim().endsWith(']');\n }\n\n private extractArrayContent(value: string): string {\n const trimmed = value.trim();\n if (this.isArrayValue(trimmed)) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n }\n\n private parseAndCleanArrayValues(inputValue: string): string[] {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n\n for (const char of inputValue) {\n if (!inQuotes && (char === '\"' || char === \"'\")) {\n inQuotes = true;\n quoteChar = char;\n current += char;\n } else if (inQuotes && char === quoteChar) {\n inQuotes = false;\n current += char;\n quoteChar = '';\n } else if (!inQuotes && char === ',') {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n values.push(trimmed);\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n values.push(trimmed);\n }\n\n return values;\n }\n}\n","import {Component, Input, inject} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ButtonsModule} from '@progress/kendo-angular-buttons';\nimport {SVGIconModule} from '@progress/kendo-angular-icons';\nimport {copyIcon} from '@progress/kendo-svg-icons';\nimport {NotificationDisplayService} from '@meshmakers/shared-ui';\n\ninterface CopyOption {\n label: string;\n value: string;\n displayText: string;\n}\n\n/**\n * A reusable component for displaying and copying entity identifiers.\n * Provides a dropdown button with options to copy:\n * - RtId: The runtime ObjectId\n * - CkTypeId: The full versioned Construction Kit type ID\n * - RtCkTypeId: The runtime CK type ID (unversioned)\n * - RtEntityId: Combined format {RtCkTypeId}@{RtId}\n *\n * @example\n * ```html\n * <mm-entity-id-info\n * [rtId]=\"entity.rtId\"\n * [rtCkTypeId]=\"entity.ckTypeId\"\n * [ckTypeId]=\"entity.constructionKitType?.ckTypeId?.fullName\">\n * </mm-entity-id-info>\n * ```\n */\n@Component({\n selector: 'mm-entity-id-info',\n standalone: true,\n imports: [\n CommonModule,\n ButtonsModule,\n SVGIconModule\n ],\n template: `\n <kendo-dropdownbutton\n [data]=\"copyOptions\"\n [svgIcon]=\"copyIcon\"\n look=\"flat\"\n size=\"small\"\n title=\"Copy Entity ID to clipboard\"\n (itemClick)=\"copyToClipboard($event)\">\n <ng-template kendoDropDownButtonItemTemplate let-item>\n <div class=\"copy-item\">\n <span class=\"copy-label\">{{ item.label }}</span>\n <span class=\"copy-value\">{{ item.displayText }}</span>\n </div>\n </ng-template>\n Copy ID\n </kendo-dropdownbutton>\n `,\n styles: [`\n :host {\n display: inline-block;\n }\n\n kendo-dropdownbutton {\n ::ng-deep {\n .k-button {\n color: var(--kendo-color-primary, #64ceb9) !important;\n border: 1px solid var(--kendo-color-border, rgba(100, 206, 185, 0.3)) !important;\n\n &:hover {\n background: var(--kendo-color-base-hover, rgba(100, 206, 185, 0.15)) !important;\n border-color: var(--kendo-color-primary, rgba(100, 206, 185, 0.5)) !important;\n }\n }\n\n .k-popup {\n min-width: 350px;\n }\n\n .k-menu-item {\n padding: 0 !important;\n }\n }\n }\n\n .copy-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 12px;\n width: 100%;\n }\n\n .copy-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--kendo-color-primary, #64ceb9);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .copy-value {\n font-family: 'Roboto Mono', monospace;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #9292a6);\n word-break: break-all;\n }\n `]\n})\nexport class EntityIdInfoComponent {\n private readonly notificationService = inject(NotificationDisplayService);\n\n protected readonly copyIcon = copyIcon;\n\n /** The RtId (ObjectId) of the entity */\n @Input({ required: true }) rtId!: string;\n\n /** The RtCkTypeId - runtime CK type ID (e.g., System.Communication/MeshAdapter) */\n @Input({ required: true }) rtCkTypeId!: string;\n\n /** The CkTypeId - full versioned Construction Kit type ID (e.g., System.Communication-2.0.3/MeshAdapter-1) */\n @Input() ckTypeId?: string;\n\n protected get copyOptions(): CopyOption[] {\n const fullCkTypeId = this.ckTypeId || this.rtCkTypeId;\n const rtEntityId = `${this.rtCkTypeId}@${this.rtId}`;\n\n return [\n {\n label: 'RtId',\n value: this.rtId,\n displayText: this.truncateValue(this.rtId, 24)\n },\n {\n label: 'CkTypeId',\n value: fullCkTypeId,\n displayText: this.truncateValue(fullCkTypeId, 40)\n },\n {\n label: 'RtCkTypeId',\n value: this.rtCkTypeId,\n displayText: this.truncateValue(this.rtCkTypeId, 40)\n },\n {\n label: 'RtEntityId',\n value: rtEntityId,\n displayText: this.truncateValue(rtEntityId, 40)\n }\n ];\n }\n\n private truncateValue(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength - 3) + '...';\n }\n\n protected async copyToClipboard(option: CopyOption): Promise<void> {\n try {\n await navigator.clipboard.writeText(option.value);\n this.notificationService.showSuccess(`${option.label} copied`, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n this.notificationService.showError('Failed to copy to clipboard');\n }\n }\n}\n","import {Component, Input} from '@angular/core';\n\n/**\n * Animated OctoMesh logo loader component.\n * Displays the OctoMesh octopus SVG with wiggling tentacles\n * and orbiting data blocks representing data loading.\n *\n * Uses `--kendo-color-primary` for theme-independent coloring.\n * Override the color via CSS `color` property on the host element.\n *\n * @example\n * ```html\n * <mm-octo-loader [size]=\"'medium'\"></mm-octo-loader>\n * <mm-octo-loader [size]=\"'small'\"></mm-octo-loader>\n * ```\n */\n@Component({\n selector: 'mm-octo-loader',\n standalone: true,\n template: `\n <div class=\"octo-loader\" [class.octo-loader--small]=\"size === 'small'\" [class.octo-loader--medium]=\"size === 'medium'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 -8 112 118\" class=\"octo-loader__svg\" overflow=\"visible\">\n <!-- Orbit track -->\n <circle class=\"octo-orbit\" cx=\"34\" cy=\"48\" r=\"52\" fill=\"none\" stroke-width=\"2.5\" stroke-dasharray=\"5 9\" opacity=\"0.5\">\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"0 34 48\" to=\"360 34 48\" dur=\"12s\" repeatCount=\"indefinite\"/>\n </circle>\n\n <!-- Orbiting data blocks -->\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"0 34 48\" to=\"360 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.95\"/>\n </g>\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"120 34 48\" to=\"480 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.75\"/>\n </g>\n <g>\n <animateTransform attributeName=\"transform\" type=\"rotate\"\n from=\"240 34 48\" to=\"600 34 48\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <rect class=\"octo-data\" x=\"28\" y=\"-9\" width=\"12\" height=\"8\" rx=\"1.5\" opacity=\"0.5\"/>\n </g>\n\n <!-- Octo character -->\n <g>\n <!-- Body -->\n <polygon fill=\"currentColor\"\n points=\"63.04 52.74 63.04 43.04 63.04 38.19 63.04 28.49 67.89 0 43.64 4.24 34.01 4.24 14.61 4.24 0 4.24 0 18.79 0 28.49 0 40.61 0 52.74 14.55 52.74 14.55 52.13 14.55 47.89 4.85 47.89 4.85 43.04 4.85 36.37 4.85 23.64 4.85 17.58 4.85 9.09 19.4 9.09 33.94 9.09 43.64 9.09 62.01 6.02 58.19 28.49 58.19 33.34 58.19 38.19 58.19 43.04 58.19 47.89 48.49 47.89 48.49 52.13 48.49 52.74\"/>\n <!-- Eyes -->\n <rect fill=\"currentColor\" x=\"18.79\" y=\"19.4\" width=\"4.85\" height=\"13.94\"/>\n <rect fill=\"currentColor\" x=\"38.79\" y=\"19.4\" width=\"4.85\" height=\"13.94\"/>\n <!-- Left outer arm -->\n <g class=\"octo-arm octo-arm--ol\">\n <polygon fill=\"currentColor\"\n points=\"0 52.74 9.7 52.74 9.7 72.13 4.85 72.13 4.85 67.28 0 67.28 0 72.13 0 76.98 4.85 76.98 14.55 76.98 14.55 72.13 14.55 52.74\"/>\n </g>\n <!-- Left inner leg -->\n <g class=\"octo-leg octo-leg--left\">\n <polygon fill=\"currentColor\"\n points=\"19.4 91.53 14.55 91.53 14.55 81.83 9.7 81.83 9.7 91.53 9.7 96.38 14.55 96.38 19.4 96.38 24.25 96.38 24.25 91.53 24.25 52.74 19.4 52.74 19.4 91.53\"/>\n </g>\n <!-- Center leg -->\n <g class=\"octo-leg octo-leg--center\">\n <rect fill=\"currentColor\" x=\"29.1\" y=\"52.74\" width=\"4.85\" height=\"33.94\"/>\n </g>\n <!-- Right inner leg -->\n <g class=\"octo-leg octo-leg--right\">\n <polygon fill=\"currentColor\"\n points=\"48.49 91.53 43.64 91.53 43.64 52.74 38.79 52.74 38.79 91.53 38.79 96.38 43.64 96.38 48.49 96.38 53.34 96.38 53.34 91.53 53.34 81.83 48.49 81.83 48.49 91.53\"/>\n </g>\n <!-- Right outer arm -->\n <g class=\"octo-arm octo-arm--or\">\n <polygon fill=\"currentColor\"\n points=\"48.49 52.74 48.49 72.13 48.49 76.98 58.19 76.98 63.04 76.98 63.04 67.28 58.19 67.28 58.19 72.13 53.34 72.13 53.34 52.74 63.04 52.74\"/>\n </g>\n </g>\n\n <!-- Data flow: orbit → left arm → body → left arm → orbit -->\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M -10,88 L 7,76 L 7,54 L 7,76 L -10,88\" dur=\"3s\" begin=\"-2s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-2s\" repeatCount=\"indefinite\"/>\n </rect>\n\n <!-- Data flow: orbit → right arm → body → right arm → orbit -->\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-1.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-1.5s\" repeatCount=\"indefinite\"/>\n </rect>\n <rect class=\"octo-data\" x=\"-7\" y=\"-4\" width=\"14\" height=\"8\" rx=\"1.5\" opacity=\"0\">\n <animateMotion path=\"M 73,88 L 56,76 L 56,54 L 56,76 L 73,88\" dur=\"3s\" begin=\"-2.5s\" repeatCount=\"indefinite\"/>\n <animate attributeName=\"opacity\" values=\"0.3;0.8;0.9;0.8;0.3\" keyTimes=\"0;0.25;0.5;0.75;1\" dur=\"3s\" begin=\"-2.5s\" repeatCount=\"indefinite\"/>\n </rect>\n </svg>\n </div>\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--kendo-color-primary, #64ceb9);\n }\n\n .octo-loader {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .octo-loader--small .octo-loader__svg {\n width: 24px;\n height: 24px;\n }\n\n .octo-loader--medium .octo-loader__svg {\n width: 48px;\n height: 48px;\n }\n\n /* Outer arms wiggle */\n .octo-arm--ol {\n transform-origin: 7px 52.74px;\n animation: octo-wiggle-outer 1.2s ease-in-out infinite;\n }\n\n .octo-arm--or {\n transform-origin: 56px 52.74px;\n animation: octo-wiggle-outer 1.2s ease-in-out infinite;\n animation-delay: -0.6s;\n }\n\n /* Inner legs wiggle */\n .octo-leg--left {\n transform-origin: 21.8px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite;\n }\n\n .octo-leg--center {\n transform-origin: 31.5px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite reverse;\n animation-delay: -0.33s;\n }\n\n .octo-leg--right {\n transform-origin: 46px 52.74px;\n animation: octo-wiggle-inner 1s ease-in-out infinite;\n animation-delay: -0.66s;\n }\n\n @keyframes octo-wiggle-inner {\n 0%, 100% { transform: rotate(-5deg); }\n 50% { transform: rotate(5deg); }\n }\n\n @keyframes octo-wiggle-outer {\n 0%, 100% { transform: rotate(-4deg); }\n 50% { transform: rotate(4deg); }\n }\n\n .octo-orbit {\n stroke: var(--neo-cyan, #00a8dc);\n }\n\n .octo-data {\n fill: var(--neo-cyan, #00a8dc);\n }\n `]\n})\nexport class OctoLoaderComponent {\n @Input() size: 'small' | 'medium' = 'medium';\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output,\n ViewChild\n} from '@angular/core';\nimport { PopupComponent } from '@progress/kendo-angular-popup';\nimport { ButtonComponent } from '@progress/kendo-angular-buttons';\nimport { SVGIconComponent } from '@progress/kendo-angular-icons';\nimport { arrowRotateCwIcon } from '@progress/kendo-svg-icons';\n\n@Component({\n selector: 'mm-tenant-switcher',\n standalone: true,\n imports: [\n PopupComponent,\n ButtonComponent,\n SVGIconComponent\n ],\n template: `\n @if (currentTenantId) {\n <div #badgeEl class=\"tenant-badge\" [class.denied]=\"isDenied\" (click)=\"onToggle()\">\n <span class=\"tenant-icon\">{{ isDenied ? '\\u26A0' : '\\u25C6' }}</span>\n <span class=\"tenant-name\">{{ currentTenantId }}</span>\n @if (isDenied) {\n <span class=\"denied-label\">NO ACCESS</span>\n }\n </div>\n\n @if (showPopup && !isDenied) {\n <kendo-popup #popupContent [anchor]=\"badgeEl\"\n (anchorViewportLeave)=\"showPopup = false\">\n <div class=\"tenant-popup\">\n <div class=\"tenant-popup-header\">\n <span>Switch Tenant</span>\n <button kendoButton fillMode=\"flat\" size=\"small\" class=\"refresh-btn\"\n [disabled]=\"isRefreshing\"\n title=\"Refresh tenant list\"\n (click)=\"onRefresh($event)\">\n <kendo-svgicon [icon]=\"refreshIcon\" size=\"small\"\n [class.spinning]=\"isRefreshing\"></kendo-svgicon>\n </button>\n </div>\n <ul class=\"tenant-list\">\n @for (tenant of allowedTenants; track tenant) {\n <li class=\"tenant-list-item\" [class.active]=\"tenant === currentTenantId\"\n (click)=\"onSelectTenant(tenant)\">\n <span class=\"tenant-list-icon\">&#9670;</span>\n <span>{{ tenant }}</span>\n </li>\n }\n </ul>\n </div>\n </kendo-popup>\n }\n }\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n .tenant-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent));\n border: 1px solid var(--mm-tenant-switcher-border, var(--kendo-color-border, #dee2e6));\n border-radius: var(--mm-tenant-switcher-radius, 4px 16px 16px 4px);\n box-shadow: var(--mm-tenant-switcher-shadow, none);\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--mm-tenant-switcher-bg-hover, var(--kendo-color-base-hover, rgba(0, 0, 0, 0.04)));\n box-shadow: var(--mm-tenant-switcher-shadow-hover, var(--mm-tenant-switcher-shadow, none));\n }\n }\n\n .tenant-icon {\n font-size: 0.7rem;\n color: var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));\n animation: var(--mm-tenant-switcher-icon-animation, none);\n }\n\n .tenant-name {\n font-family: var(--mm-tenant-switcher-font, inherit);\n font-size: 0.85rem;\n font-weight: 600;\n letter-spacing: 1px;\n color: var(--mm-tenant-switcher-accent, var(--kendo-color-primary, #ff6358));\n text-transform: uppercase;\n text-shadow: var(--mm-tenant-switcher-text-shadow, none);\n }\n\n .denied {\n background: var(--mm-tenant-switcher-denied-bg, var(--mm-tenant-switcher-bg, var(--kendo-color-surface, transparent)));\n border-color: var(--mm-tenant-switcher-denied-border, var(--kendo-color-error, #d9534f));\n box-shadow: var(--mm-tenant-switcher-denied-shadow, none);\n }\n\n .denied .tenant-icon,\n .denied .tenant-name {\n color: var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));\n text-shadow: var(--mm-tenant-switcher-denied-text-shadow, none);\n }\n\n .denied-label {\n font-family: var(--mm-tenant-switcher-font, inherit);\n font-size: 0.55rem;\n font-weight: 700;\n letter-spacing: 1px;\n color: var(--mm-tenant-switcher-denied-accent, var(--kendo-color-error, #d9534f));\n background: var(--mm-tenant-switcher-denied-label-bg, color-mix(in srgb, var(--kendo-color-error, #d9534f) 15%, transparent));\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .tenant-popup {\n min-width: 220px;\n padding: 8px 0;\n background: var(--kendo-color-surface, #fff);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .tenant-popup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--kendo-color-subtle, #666);\n border-bottom: 1px solid var(--kendo-color-border, #dee2e6);\n margin-bottom: 4px;\n }\n\n .refresh-btn {\n padding: 2px;\n min-width: unset;\n }\n\n .spinning {\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n .tenant-list {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .tenant-list-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 16px;\n cursor: pointer;\n font-size: 0.85rem;\n transition: background 0.15s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover, rgba(0, 0, 0, 0.04));\n }\n\n &.active {\n color: var(--kendo-color-primary, #ff6358);\n font-weight: 600;\n }\n }\n\n .tenant-list-icon {\n font-size: 0.5rem;\n color: var(--kendo-color-subtle, #666);\n }\n\n .tenant-list-item.active .tenant-list-icon {\n color: var(--kendo-color-primary, #ff6358);\n }\n\n @keyframes mm-icon-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.7; transform: scale(1.1); }\n }\n `]\n})\nexport class TenantSwitcherComponent {\n @Input() currentTenantId: string | null = null;\n @Input() allowedTenants: string[] = [];\n @Input() isDenied = false;\n\n @Output() tenantSelected = new EventEmitter<string>();\n @Output() refreshRequested = new EventEmitter<void>();\n\n protected readonly refreshIcon = arrowRotateCwIcon;\n protected isRefreshing = false;\n\n @ViewChild('badgeEl', { read: ElementRef })\n private anchor: ElementRef | null = null;\n\n @ViewChild('popupContent', { read: ElementRef })\n private popup: ElementRef | null = null;\n\n showPopup = false;\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.code === 'Escape') {\n this.showPopup = false;\n }\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.contains(event.target)) {\n this.showPopup = false;\n }\n }\n\n onToggle(): void {\n if (!this.isDenied) {\n this.showPopup = !this.showPopup;\n }\n }\n\n onSelectTenant(tenantId: string): void {\n if (tenantId !== this.currentTenantId) {\n this.tenantSelected.emit(tenantId);\n }\n this.showPopup = false;\n }\n\n onRefresh(event: MouseEvent): void {\n event.stopPropagation();\n if (!this.isRefreshing) {\n this.isRefreshing = true;\n this.refreshRequested.emit();\n // Reset spinning after a short delay to give visual feedback\n setTimeout(() => this.isRefreshing = false, 1500);\n }\n }\n\n private contains(target: EventTarget | null): boolean {\n return (\n (this.anchor?.nativeElement.contains(target) ?? false) ||\n (this.popup?.nativeElement.contains(target) ?? false)\n );\n }\n}\n","/*\n * Public API Surface of octo-ui\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport { provideOctoServices } from \"@meshmakers/octo-services\";\nimport { provideMmSharedUi } from \"@meshmakers/shared-ui\";\nimport { provideMmSharedAuth } from \"@meshmakers/shared-auth\";\nimport { AttributeSortSelectorDialogService } from './lib/attribute-sort-selector-dialog';\nimport { PropertyConverterService } from './lib/property-grid';\nimport { CkTypeSelectorDialogService } from './lib/ck-type-selector-dialog';\nimport { RuntimeEntityVariableDialogService } from './lib/runtime-entity-variable-dialog';\n\nexport * from './lib/data-sources/octo-graph-ql-data-source';\nexport * from './lib/data-sources/octo-graph-ql-hierarchy-data-source';\nexport * from './lib/property-grid';\nexport * from './lib/attribute-selector-dialog';\nexport * from './lib/attribute-sort-selector-dialog';\nexport * from './lib/ck-type-selector-dialog';\nexport * from './lib/ck-type-selector-input';\nexport * from './lib/field-filter-editor';\nexport * from './lib/entity-id-info';\nexport * from './lib/octo-loader';\nexport * from './lib/tenant-switcher';\nexport * from './lib/runtime-entity-variable-dialog';\n\n/**\n * Provides OctoUi services using modern Angular provider functions.\n * This is the recommended approach for library providers.\n */\nexport function provideOctoUi(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideOctoServices(),\n provideMmSharedUi(),\n provideMmSharedAuth(),\n AttributeSortSelectorDialogService,\n PropertyConverterService,\n CkTypeSelectorDialogService,\n RuntimeEntityVariableDialogService\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["AttributeValueTypeDto","i1","i2","i3","i4","i5","i6"],"mappings":"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"}