@meshmakers/octo-ui 3.3.34 → 3.3.390

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/list-element/list-element.module.ts","../../../../projects/meshmakers/octo-ui/src/lib/list-element/octoListNavigation.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.model.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.html","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-ui.module.ts","../../../../projects/meshmakers/octo-ui/src/public-api.ts","../../../../projects/meshmakers/octo-ui/src/meshmakers-octo-ui.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule]\n})\nexport class ListElementModule {}\n","import { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, SortDirection } from '@angular/material/sort';\nimport { ElementRef, EventEmitter } from '@angular/core';\nimport { fromEvent, merge } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\nimport { SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from \"@meshmakers/octo-services\";\n\nexport class OctoListNavigationDataInfo {\n skip: number;\n take: number;\n searchFilter?: SearchFilterDto;\n sort?: SortDto[];\n\n constructor() {\n this.skip = 0;\n this.take = 10;\n }\n}\n\nexport class OctoListNavigationOptions {\n language: string | null;\n searchFilterType?: SearchFilterTypesDto;\n searchFilterAttributePaths?: string[];\n\n constructor() {\n this.language = null;\n }\n}\n\nexport class OctoListNavigation {\n public loadDataRequest = new EventEmitter<OctoListNavigationDataInfo>();\n\n lastSortDirection: SortDirection | null;\n lastSortField: string | null;\n lastSearchText: string | null;\n\n constructor(\n private readonly paginator: MatPaginator,\n private readonly sort: MatSort,\n private readonly searchBox?: ElementRef<HTMLInputElement>,\n private readonly octoOptions?: OctoListNavigationOptions\n ) {\n this.lastSortDirection = null;\n this.lastSortField = null;\n this.lastSearchText = null;\n }\n\n public get loadDataInfo(): OctoListNavigationDataInfo {\n const filterString = this.searchBox?.nativeElement.value;\n const sortField = this.sort.active;\n const sortDirection = this.sort.direction;\n\n let filter = null;\n if (filterString && this.octoOptions) {\n filter = {\n language: this.octoOptions.language,\n searchTerm: filterString,\n type: this.octoOptions.searchFilterType,\n attributePaths: this.octoOptions.searchFilterAttributePaths\n } as SearchFilterDto;\n }\n\n const sort = [];\n if (sortField && sortDirection) {\n sort.push(({\n attributePath: sortField,\n sortOrder: sortDirection === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto));\n }\n\n return {\n skip: this.paginator.pageIndex * this.paginator.pageSize,\n take: this.paginator.pageSize,\n searchFilter: filter,\n sort\n } as OctoListNavigationDataInfo;\n }\n\n init(): void {\n\n if (this.searchBox) {\n // server-side search\n fromEvent<ElementRef>(this.searchBox.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n this.paginator.pageIndex = 0;\n if (!this.searchBox) {\n return;\n }\n\n const searchText = this.searchBox.nativeElement.value;\n\n if (!this.lastSearchText && searchText) {\n this.lastSortDirection = this.sort.direction;\n this.lastSortField = this.sort.active;\n\n // Reset sorting to see the score rating (default sorting returned from server)\n this.sort.sort({ id: '', start: 'asc', disableClear: false });\n }\n\n this.lastSearchText = searchText;\n\n if (!searchText && this.lastSortField) {\n if (this.lastSortDirection === 'asc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'asc',\n disableClear: true\n });\n } else if (this.lastSortDirection === 'desc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'desc',\n disableClear: true\n });\n }\n }\n\n this.loadData();\n })\n )\n .subscribe();\n }\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n\n private loadData(): void {\n this.loadDataRequest.emit(this.loadDataInfo);\n }\n}\n","export interface TableColumn {\n displayName?: string | null;\n dataKey: string;\n templateName?: string;\n sortingDisabled?: boolean;\n}\n\nexport function getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.dataKey;\n}\n\nexport function getDataKey(column: TableColumn): string {\n return column.dataKey;\n}\n\nexport type ColumnDefinition = string | TableColumn;\n","import {\n Component,\n ElementRef,\n Input,\n ViewChild,\n OnInit,\n AfterViewInit,\n AfterContentInit,\n OnDestroy,\n Output,\n EventEmitter,\n ContentChildren,\n QueryList,\n TemplateRef\n} from '@angular/core';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { MatSort, MatSortHeader } from '@angular/material/sort';\nimport { BehaviorSubject, fromEvent, merge, Observable, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\n\nimport { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport {\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatHeaderCell,\n MatHeaderCellDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatRow,\n MatRowDef,\n MatTable\n} from '@angular/material/table';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatToolbar } from '@angular/material/toolbar';\n\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { MatListItemIcon } from '@angular/material/list';\nimport { RouterLink } from '@angular/router';\nimport { AssetRepoGraphQlDataSource, SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from '@meshmakers/octo-services';\nimport { ColumnDefinition, getDisplayName, getDataKey, TableColumn } from './mm-octo-table.model';\n\nexport interface ActionColumn {\n displayText: string; // Display text for the action button\n actionId: string; // Unique identifier for the action\n iconName?: string; // Name of the icon to display in the button\n svgIconName?: string; // Name of the SVG icon to display in the button\n}\n\nexport interface ToolbarAction {\n iconName?: string;\n svgIconName?: string;\n route?: string;\n clickHandler?: () => void;\n actionText: string;\n isDisabled?: Observable<boolean>;\n isHidden?: Observable<boolean>;\n}\n\n@Component({\n selector: 'mm-octo-table',\n standalone: true,\n imports: [\n AsyncPipe,\n MatButton,\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFormField,\n MatHeaderCell,\n MatIcon,\n MatInput,\n MatLabel,\n MatPaginator,\n MatProgressBar,\n MatRow,\n MatRowDef,\n MatSort,\n MatSortHeader,\n MatTable,\n MatToolbar,\n NgIf,\n MatHeaderCellDef,\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger,\n MatIcon,\n MatIcon,\n MatListItemIcon,\n MatHeaderRow,\n MatHeaderRowDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatButton,\n MatIcon,\n RouterLink,\n MatIcon,\n MatHeaderCellDef,\n MatCellDef,\n MatHeaderRowDef,\n MatRowDef,\n NgTemplateOutlet\n ],\n templateUrl: './mm-octo-table.component.html',\n styleUrl: './mm-octo-table.component.scss'\n})\nexport class MmOctoTableComponent implements OnInit, AfterViewInit, AfterContentInit, OnDestroy {\n @Input() dataSource!: AssetRepoGraphQlDataSource<any, any, any>;\n @ContentChildren(TemplateRef) cellTemplates!: QueryList<TemplateRef<any>>;\n templateMap = new Map<string, TemplateRef<any>>();\n\n @Input() actionColumns: ActionColumn[] = [];\n @Input() leftToolbarActions: ToolbarAction[] = [];\n @Input() optionActions: ActionColumn[] = [];\n @Input() searchFilterColumns: string[] = [];\n @Input() currentId = '';\n @Input() defaultSortColumn = '';\n @Input() rowIsClickable = true;\n\n @Input() pageSizeOptions = [5, 10, 20, 50];\n @Input() selectedPageSize = 5;\n\n @Output() rowClicked = new EventEmitter<any>();\n @Output() searchFilterStringUpdated = new EventEmitter<string>();\n @Input() selectedRowId = '';\n\n @Output() actionColumnClick = new EventEmitter<{ action: string; id: string; entry: any }>();\n\n @Input() set columns(cols: ColumnDefinition[]) {\n if (cols === null || cols === undefined || cols.length === 0) {\n this._columns = [];\n return;\n }\n\n this._columns = [];\n\n for (const column of cols) {\n if (typeof column === 'string') {\n this._columns.push({ dataKey: column });\n } else {\n this._columns.push(column);\n }\n }\n }\n\n get columns(): TableColumn[] {\n return this._columns;\n }\n _columns: TableColumn[] = [];\n\n selectedRow: any = null; // Track the selected row\n\n selectedPageSizeSubject: BehaviorSubject<number> = new BehaviorSubject<number>(this.selectedPageSize);\n\n @ViewChild(MatPaginator, { static: false }) paginator?: MatPaginator;\n @ViewChild(MatSort, { static: false }) sort?: MatSort;\n @ViewChild('input', { static: false }) input?: ElementRef<HTMLInputElement>;\n\n private loadingSubscription?: Subscription;\n private wasLoadingPreviously = false;\n private hadFocusBeforeLoading = false;\n\n get columnDataKeys(): string[] {\n return this._columns.map((c) => getDataKey(c));\n }\n\n get columnDisplayNames(): string[] {\n return this._columns.map((c) => getDisplayName(c));\n }\n\n ngOnInit(): void {\n this.selectedPageSizeSubject.next(this.selectedPageSize);\n\n if (!this.dataSource) {\n throw new Error('No dataSource provided');\n }\n\n this.checkSelectedRow();\n }\n\n ngAfterContentInit(): void {\n // Build a map from template reference name to TemplateRef\n this.templateMap.clear();\n if (this.cellTemplates) {\n this.cellTemplates.forEach((template: any) => {\n // Try to get the reference name from the template\n const refName = template._declarationTContainer?.localNames?.[0];\n if (refName) {\n this.templateMap.set(refName, template);\n }\n });\n }\n }\n\n ngAfterViewInit(): void {\n // Subscribe to loading state changes to restore focus\n if (this.dataSource?.loading$) {\n this.loadingSubscription = this.dataSource.loading$.subscribe((isLoading) => {\n // Check if we're transitioning from loading to not loading\n if (this.wasLoadingPreviously && !isLoading && this.hadFocusBeforeLoading && this.input) {\n // Use setTimeout to ensure focus happens after Angular's change detection\n setTimeout(() => {\n this.input?.nativeElement?.focus();\n this.hadFocusBeforeLoading = false;\n }, 0);\n }\n\n // Track if input has focus before it gets disabled\n if (!this.wasLoadingPreviously && isLoading && this.input) {\n this.hadFocusBeforeLoading = document.activeElement === this.input.nativeElement;\n }\n\n this.wasLoadingPreviously = isLoading;\n });\n }\n\n if (this.sort && this.input && this.paginator) {\n fromEvent(this.input.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n // server-side search\n if (this.paginator) {\n this.paginator.pageIndex = 0;\n }\n this.searchFilterStringUpdated.emit(this.input?.nativeElement?.value ?? '');\n this.loadData();\n })\n )\n .subscribe();\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => {\n if (this.paginator) this.paginator.pageIndex = 0;\n });\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n this.loadData();\n }\n\n loadData(): void {\n if (!this.input || !this.sort) {\n return;\n }\n const filterString = this.input.nativeElement.value;\n const field = this.sort.active;\n const direction = this.sort.direction;\n\n let filter: SearchFilterDto | null = null;\n if (filterString) {\n filter = {\n type: SearchFilterTypesDto.AttributeFilterDto,\n attributePaths: this.searchFilterColumns,\n searchTerm: filterString\n };\n }\n\n const sort = [];\n if (field) {\n sort.push({\n attributePath: field,\n sortOrder: direction === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto);\n }\n\n if (this.paginator) {\n this.dataSource?.loadData(this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, filter, null, sort);\n }\n }\n\n protected readonly encodeURIComponent = encodeURIComponent;\n\n accessElement(element: any, column: TableColumn): any {\n if (column.templateName) {\n return element;\n }\n if (column.dataKey.indexOf('.') === -1) {\n return element[column.dataKey];\n }\n const keys = column.dataKey.split('.');\n let value = element;\n for (const key of keys) {\n value = value[key];\n }\n return value;\n }\n\n selectedPageSizeChanged($event: PageEvent) {\n console.log($event.pageSize);\n this.selectedPageSizeSubject.next($event.pageSize);\n }\n\n getActionDisplayTexts(): string[] {\n return this.actionColumns.map((ac) => ac.displayText);\n }\n\n onRowClick(row: any) {\n if (this.rowIsClickable) {\n this.selectedRow = row; // Set the clicked row as the selected one\n this.rowClicked.emit(row); // Emit the clicked row data\n }\n }\n\n isRowSelected(row: any): boolean {\n return this.selectedRow === row; // Check if the row is selected\n }\n\n checkSelectedRow() {\n // @ts-expect-error jnu\n this.dataSource.connect(null).subscribe((data) => {\n for (const entry of data) {\n if (entry.rtId === this.selectedRowId) {\n this.onRowClick(entry);\n }\n }\n });\n }\n\n emitRowData(data: { action: string; id: string; entry: any }) {\n this.actionColumnClick.emit(data);\n }\n\n // Predicate for rows with optionActions\n hasOptionActions = (_row: any) => {\n return this.optionActions.length > 0;\n };\n\n // Predicate for rows with actionColumns but no optionActions\n hasActionColumns = () => {\n return this.actionColumns.length > 0 || this.optionActions.length > 0;\n };\n protected readonly getDisplayName = getDisplayName;\n protected readonly getDataKey = getDataKey;\n\n isSortable(column: TableColumn): boolean {\n // If sortingDisabled is explicitly set, use that setting\n if (column.sortingDisabled !== undefined) {\n return !column.sortingDisabled;\n }\n\n return true;\n }\n\n getTemplate(templateName: string): TemplateRef<any> | undefined {\n return this.templateMap.get(templateName);\n }\n\n ngOnDestroy(): void {\n // Clean up the loading subscription to prevent memory leaks\n if (this.loadingSubscription) {\n this.loadingSubscription.unsubscribe();\n }\n }\n}\n","<div>\n @if (dataSource?.loading$ | async) {\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n }\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n @if (toolbarAction.route) {\n <button\n mat-flat-button\n [routerLink]=\"toolbarAction.route\"\n type=\"button\"\n [hidden]=\"!toolbarAction.isHidden ? false : (toolbarAction.isHidden | async)\"\n [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\"\n >\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n } @else {\n <button\n mat-flat-button\n type=\"button\"\n (click)=\"toolbarAction.clickHandler?.()\"\n [hidden]=\"!toolbarAction.isHidden ? false : (toolbarAction.isHidden | async)\"\n [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\"\n >\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"dataSource?.loading$ | async\"/>\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table\n [dataSource]=\"dataSource\"\n class=\"mat-elevation-z8 table-container\"\n mat-table\n matSort\n matSortActive=\"{{ defaultSortColumn }}\"\n matSortDirection=\"asc\"\n matSortDisableClear=\"true\"\n>\n @for (column of columns; track column) {\n <ng-container [matColumnDef]=\"getDataKey(column)\">\n <mat-header-cell *matHeaderCellDef>\n <span *ngIf=\"isSortable(column); else nonSortableHeader\" mat-sort-header>\n {{ getDisplayName(column) }}\n </span>\n <ng-template #nonSortableHeader>\n {{ getDisplayName(column) }}\n </ng-template>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span class=\"mobile-label\">{{ getDisplayName(column)}}</span>\n @if (column.templateName) {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(column.templateName); context: { $implicit: element }\"></ng-container>\n } @else {\n {{ accessElement(element, column) }}\n }\n </mat-cell>\n </ng-container>\n }\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button\n (click)=\"emitRowData({ action: column.actionId, id: encodeURIComponent(element[currentId]), entry: element })\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\"\n matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button\n mat-menu-item\n (click)=\"emitRowData({ action: optionAction.actionId, id: encodeURIComponent(element[currentId]), entry: element })\"\n >\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.displayText }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"columnDataKeys.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnDataKeys.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"columnDataKeys\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnDataKeys\"></mat-row>\n }\n</mat-table>\n\n<mat-paginator\n [length]=\"dataSource?.totalCount$ | async\"\n (page)=\"selectedPageSizeChanged($event)\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"\n></mat-paginator>\n","import { NgModule } from '@angular/core';\nimport { MmOctoTableComponent } from \"./mm-octo-table/mm-octo-table.component\";\n\n\n\n@NgModule({\n declarations: [\n\n ],\n imports: [\n MmOctoTableComponent\n ],\n exports: [\n MmOctoTableComponent\n ]\n})\nexport class MmOctoUiModule { }\n","/*\n * Public API Surface of octo-ui\n */\n\nexport * from './lib/list-element/list-element.module';\nexport * from './lib/list-element/octoListNavigation';\n\n\nexport * from './lib/mm-octo-table/mm-octo-table.component';\nexport * from './lib/mm-octo-ui.module';\n\nexport * from './lib/mm-octo-table/mm-octo-table.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"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/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/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/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/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/ck-type-selector-input/ck-type-selector-input.component.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/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 } from '@meshmakers/octo-services';\nimport { DialogContentBase, DialogRef, DialogModule } 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}\n\nexport interface AttributeSortSelectorDialogResult {\n selectedAttributes: AttributeSortItem[];\n}\n\nexport interface SortOption {\n text: string;\n value: 'standard' | 'ascending' | 'descending';\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 DialogModule\n ],\n template: `\n <div class=\"attribute-sort-selector-container\">\n <!-- Search Section -->\n <div class=\"search-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search attributes...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\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 [height]=\"350\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"200\"></kendo-grid-column>\n <kendo-grid-column field=\"attributeValueType\" title=\"Type\" [width]=\"140\"></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 [height]=\"350\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\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 </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" (click)=\"onOk()\">Apply</button>\n </kendo-dialog-actions>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .attribute-sort-selector-container {\n display: flex;\n flex-direction: column;\n padding: 16px 20px;\n min-width: 1000px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .search-container {\n flex-shrink: 0;\n }\n\n .search-input {\n width: 100%;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n align-items: flex-start;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\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 }\n\n .attribute-grid {\n border-radius: 4px;\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})\nexport class AttributeSortSelectorDialogComponent extends DialogContentBase implements OnInit {\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n constructor() {\n super(inject(DialogRef));\n }\n\n // Dialog data\n public ckTypeId!: string;\n public searchText = '';\n public currentSortOrder: 'standard' | 'ascending' | 'descending' = 'standard';\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 // 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 const data = (this.dialog.content as any)?.instance?.data as AttributeSortSelectorDialogData;\n console.log('ngOnInit - received data:', data);\n\n if (data) {\n this.ckTypeId = data.ckTypeId;\n this.dialogTitle = data.dialogTitle || 'Select Attributes with Sort Order';\n console.log('Set ckTypeId:', this.ckTypeId);\n\n if (data.selectedAttributes && data.selectedAttributes.length > 0) {\n this.selectedAttributes = [...data.selectedAttributes];\n this.updateSelectedGrid();\n console.log('Pre-populated selectedAttributes:', this.selectedAttributes);\n }\n } else {\n console.warn('No dialog data received');\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(filter?: string): void {\n this.attributeService.getAvailableAttributes(this.ckTypeId, filter).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n this.availableAttributes = result.items.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 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 console.log('Adding attribute to selected:', attribute, 'with sort order:', this.currentSortOrder);\n const sortItem: AttributeSortItem = {\n attributePath: attribute.attributePath,\n attributeValueType: attribute.attributeValueType,\n sortOrder: this.currentSortOrder\n };\n\n this.selectedAttributes.push(sortItem);\n console.log('Selected attributes after add:', this.selectedAttributes);\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 console.log('onOk called, selectedAttributes:', this.selectedAttributes);\n const result: AttributeSortSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n console.log('Closing dialog with result:', result);\n this.dialog.close(result);\n }\n\n public onCancel(): void {\n console.log('onCancel called');\n this.dialog.close();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\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 dialogService = inject(DialogService);\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 * @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 ): Promise<AttributeSortSelectorResult> {\n const data: AttributeSortSelectorDialogData = {\n ckTypeId,\n selectedAttributes,\n dialogTitle\n };\n\n const dialogRef: DialogRef = this.dialogService.open({\n content: AttributeSortSelectorDialogComponent,\n width: 1100,\n height: 750,\n minWidth: 1050,\n minHeight: 700,\n title: dialogTitle || 'Select Attributes with Sort Order'\n });\n\n // Pass data to the component\n if ((dialogRef.content as any)?.instance) {\n ((dialogRef.content as any).instance as any).data = data;\n }\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n \n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n // User clicked OK\n const dialogResult = result as AttributeSortSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes || []\n };\n } else {\n // User clicked Cancel or closed dialog (result is undefined)\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n // Dialog was closed without result (e.g., ESC key, X button)\n return {\n confirmed: false,\n selectedAttributes: []\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: any;\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?: any[];\n /** Custom editor configuration */\n editorConfig?: any;\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, any>;\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: any;\n /** The new value */\n newValue: any;\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/**\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: any[], 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: any, 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: any): 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\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: any): 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: any[],\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.attributes !== undefined\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.attributes !== undefined) {\n // Nested record - convert async\n return this.convertRtRecordToProperties(attr.value).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: any,\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 | 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: any): any {\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' && value.attributes !== undefined) {\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: any): 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, OnInit, OnDestroy, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogRef, DialogModule, DialogContentBase } from '@progress/kendo-angular-dialog';\nimport { GridModule, GridDataResult, SelectionEvent, PageChangeEvent, RowArgs } 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}\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 DialogModule\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\">\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 [height]=\"400\"\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 [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 </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" [disabled]=\"!selectedType || (selectedType.isAbstract && !allowAbstract)\" (click)=\"onConfirm()\">OK</button>\n </kendo-dialog-actions>\n `,\n styles: [`\n .ck-type-selector-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 20px;\n min-width: 700px;\n box-sizing: border-box;\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 }\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})\nexport class CkTypeSelectorDialogComponent extends DialogContentBase implements OnInit, OnDestroy {\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 = false;\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\n constructor() {\n super(inject(DialogRef));\n }\n\n ngOnInit(): void {\n const data = (this.dialog.content as any)?.instance?.data as CkTypeSelectorDialogData;\n\n if (data) {\n this.dialogTitle = data.dialogTitle || 'Select Construction Kit Type';\n this.allowAbstract = data.allowAbstract ?? false;\n this.initialCkModelIds = data.ckModelIds;\n\n if (data.selectedCkTypeId) {\n this.selectedKeys = [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 this.loadAvailableModels();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n private loadTypes(): void {\n this.isLoading = true;\n\n const ckModelIds = this.selectedModel\n ? [this.selectedModel]\n : this.initialCkModelIds;\n\n this.subscriptions.add(\n this.ckTypeSelectorService.getCkTypes({\n ckModelIds,\n searchText: this.searchText || undefined,\n first: this.pageSize,\n skip: this.skip\n }).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 onCancel(): void {\n this.dialog.close();\n }\n\n public onConfirm(): void {\n if (this.selectedType) {\n const result: CkTypeSelectorDialogResult = {\n selectedCkType: this.selectedType\n };\n this.dialog.close(result);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { CkTypeSelectorItem } from '@meshmakers/octo-services';\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 dialogService = inject(DialogService);\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 } = {}): Promise<CkTypeSelectorResult> {\n const data: CkTypeSelectorDialogData = {\n selectedCkTypeId: options.selectedCkTypeId,\n ckModelIds: options.ckModelIds,\n dialogTitle: options.dialogTitle,\n allowAbstract: options.allowAbstract\n };\n\n const dialogRef: DialogRef = this.dialogService.open({\n content: CkTypeSelectorDialogComponent,\n width: 900,\n height: 650,\n minWidth: 750,\n minHeight: 550,\n title: options.dialogTitle || 'Select Construction Kit Type'\n });\n\n // Pass data to the component\n if ((dialogRef.content as any)?.instance) {\n ((dialogRef.content as any).instance as any).data = data;\n }\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n\n if (result && typeof result === 'object' && 'selectedCkType' in result) {\n // User clicked OK and we have a result\n const dialogResult = result as CkTypeSelectorDialogResult;\n return {\n confirmed: true,\n selectedCkType: dialogResult.selectedCkType\n };\n } else {\n // User clicked Cancel or closed dialog\n return {\n confirmed: false,\n selectedCkType: null\n };\n }\n } catch {\n // Dialog was closed without result (e.g., ESC key, X button)\n return {\n confirmed: false,\n selectedCkType: null\n };\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: any): {\n operator: FieldFilterOperatorsDto,\n value: any\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, 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/**\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: any;\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: any): string {\n try {\n const date = value instanceof Date ? value : new Date(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: any): 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: any): string {\n if (typeof value !== 'object' || value === null) {\n return String(value);\n }\n\n const keys = Object.keys(value);\n if (keys.length === 0) {\n return '{}';\n }\n\n if (keys.length <= 2) {\n const preview = keys.map(key => `${key}: ${this.truncateValue(value[key])}`).join(', ');\n return `{${preview}}`;\n }\n\n return `{${keys.slice(0, 2).map(key => `${key}: ${this.truncateValue(value[key])}`).join(', ')}, ... +${keys.length - 2} more}`;\n }\n\n /**\n * Format binary data\n */\n private formatBinary(value: any): 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: any, 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: any): 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: any): {key: string, value: any}[] {\n if (typeof obj !== 'object' || obj === null) {\n return [];\n }\n\n if (Array.isArray(obj) && obj.length > 0 && obj[0].id === 'ckRecordId') {\n // Handle array of records\n return obj.map((item, _) => ({\n key: item.name,\n value: item.value\n }));\n }\n\n // Handle regular objects\n return Object.keys(obj).map(key => ({\n key,\n value: obj[key]\n }));\n }\n\n /**\n * Determine the appropriate type for a nested property value\n */\n getPropertyType(value: any): 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].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.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.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.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 // If downloadUri is available, open directly\n if (this.value.downloadUri) {\n window.open(this.value.downloadUri, '_blank', 'noopener,noreferrer');\n return;\n }\n\n // Otherwise, emit event for parent to handle (needs to load downloadUri)\n if (this.value.binaryId) {\n const event: BinaryDownloadEvent = {\n binaryId: this.value.binaryId,\n filename: this.value.filename,\n contentType: this.value.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 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): any {\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: any, newValue: any) {\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, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogRef, DialogModule, DialogContentBase } 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 { IconsModule } from '@progress/kendo-angular-icons';\nimport { arrowRightIcon, arrowLeftIcon, searchIcon, arrowUpIcon, arrowDownIcon, chevronDoubleRightIcon, chevronDoubleLeftIcon } from '@progress/kendo-svg-icons';\nimport { AttributeSelectorService, AttributeItem } 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}\n\nexport interface AttributeSelectorDialogResult {\n selectedAttributes: AttributeItem[];\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 IconsModule,\n DialogModule\n ],\n template: `\n <div class=\"attribute-selector-container\">\n <div class=\"search-container\">\n <kendo-textbox\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search attributes...\"\n class=\"search-input\">\n <ng-template kendoTextBoxSuffixTemplate>\n <button kendoButton [svgIcon]=\"searchIcon\" fillMode=\"clear\"></button>\n </ng-template>\n </kendo-textbox>\n </div>\n\n <div class=\"lists-container\">\n <div class=\"list-section\">\n <h4>Available Attributes</h4>\n <kendo-grid\n [data]=\"availableGridData\"\n [height]=\"350\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'multiple', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedAvailableKeys\"\n (cellClick)=\"onAvailableCellClick($event)\"\n class=\"attribute-grid\">\n <kendo-grid-column field=\"attributePath\" title=\"Attribute Path\" [width]=\"200\"></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=\"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 [height]=\"350\"\n [scrollable]=\"'scrollable'\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [kendoGridSelectBy]=\"'attributePath'\"\n [(selectedKeys)]=\"selectedChosenKeys\"\n (cellClick)=\"onSelectedCellClick($event)\"\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 </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" (click)=\"onConfirm()\">OK</button>\n </kendo-dialog-actions>\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .attribute-selector-container {\n display: flex;\n flex-direction: column;\n padding: 16px 20px;\n min-width: 800px;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .search-container {\n flex-shrink: 0;\n }\n\n .search-input {\n width: 100%;\n }\n\n .lists-container {\n display: flex;\n gap: 16px;\n align-items: flex-start;\n }\n\n .list-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .list-section h4 {\n margin: 0 0 10px 0;\n font-size: 0.85rem;\n font-weight: 600;\n }\n\n .attribute-grid {\n border-radius: 4px;\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})\nexport class AttributeSelectorDialogComponent extends DialogContentBase implements OnInit {\n private readonly attributeService = inject(AttributeSelectorService);\n private searchSubject = new Subject<string>();\n\n constructor() {\n super(inject(DialogRef));\n }\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 dialogTitle = 'Select Attributes';\n public rtCkTypeId!: string;\n public searchText = '';\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 // Double-click tracking\n private lastClickTime = 0;\n private lastClickedItem: string | null = null;\n private readonly doubleClickDelay = 300; // milliseconds\n\n ngOnInit(): void {\n const data = (this.dialog.content as any)?.instance?.data as AttributeSelectorDialogData;\n\n if (data) {\n this.rtCkTypeId = data.rtCkTypeId;\n this.dialogTitle = data.dialogTitle || 'Select Attributes';\n\n if (data.selectedAttributes && data.selectedAttributes.length > 0) {\n // Pre-populate selected attributes if provided\n this.loadInitialSelectedAttributes(data.selectedAttributes);\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(filter?: string): void {\n this.attributeService.getAvailableAttributes(this.rtCkTypeId, filter).subscribe(result => {\n // Filter out already selected attributes\n const selectedPaths = new Set(this.selectedAttributes.map(a => a.attributePath));\n this.availableAttributes = result.items.filter(item => !selectedPaths.has(item.attributePath));\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\n const attributeMap = new Map(result.items.map(item => [item.attributePath, item]));\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 = result.items.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 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.dialog.close();\n }\n\n public onConfirm(): void {\n const result: AttributeSelectorDialogResult = {\n selectedAttributes: this.selectedAttributes\n };\n this.dialog.close(result);\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 * 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 { DialogService, DialogRef } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\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()\nexport class AttributeSelectorDialogService {\n private readonly dialogService = inject(DialogService);\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 * @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 ): Promise<AttributeSelectorResult> {\n const data: AttributeSelectorDialogData = {\n rtCkTypeId,\n selectedAttributes,\n dialogTitle\n };\n\n const dialogRef: DialogRef = this.dialogService.open({\n content: AttributeSelectorDialogComponent,\n width: 900,\n height: 700,\n minWidth: 800,\n minHeight: 650,\n title: dialogTitle || 'Select Attributes'\n });\n\n // Pass data to the component\n if ((dialogRef.content as any)?.instance) {\n ((dialogRef.content as any).instance as any).data = data;\n }\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n\n if (result && typeof result === 'object' && 'selectedAttributes' in result) {\n // User clicked OK and we have a result\n const dialogResult = result as AttributeSelectorDialogResult;\n return {\n confirmed: true,\n selectedAttributes: dialogResult.selectedAttributes\n };\n } else {\n // User clicked Cancel or closed dialog\n return {\n confirmed: false,\n selectedAttributes: []\n };\n }\n } catch {\n // Dialog was closed without result (e.g., ESC key, X button)\n return {\n confirmed: false,\n selectedAttributes: []\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} 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 } 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 (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 = false;\n @Input() dialogTitle = 'Select Construction Kit Type';\n @Input() advancedSearchLabel = 'Advanced Search...';\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\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly dialogService = inject(CkTypeSelectorDialogService, { optional: true });\n\n ngOnInit(): void {\n this.setupSearch();\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 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 this.ckTypeSelectorService.getCkTypes({\n ckModelIds: this.ckModelIds,\n searchText: filter,\n first: this.maxResults\n }).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 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 });\n\n if (result.confirmed && result.selectedCkType) {\n this.selectCkType(result.selectedCkType);\n }\n }\n}\n","import { Component, EventEmitter, Input, OnChanges, Output } 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} from '@meshmakers/octo-services';\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 <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-dropdownlist\n [data]=\"filteredAttributeList\"\n [(ngModel)]=\"dataItem.attributePath\"\n (valueChange)=\"onAttributeChange(dataItem, $event)\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [filterable]=\"true\"\n (filterChange)=\"onAttributeFilterChange($event)\"\n [listHeight]=\"300\"\n [popupSettings]=\"{ appendTo: 'root', animate: true }\"\n class=\"attribute-dropdown\">\n <ng-template kendoDropDownListItemTemplate 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-dropdownlist>\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 .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 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 /** 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 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(): void {\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 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","/*\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/services/property-converter.service';\nimport { CkTypeSelectorDialogService } from './lib/ck-type-selector-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';\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 ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4","i5","i6","i7","i3","AttributeValueTypeDto"],"mappings":"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"}