ngx-bimplus-components 0.0.239-angular22-1.1 → 0.0.240-packageUpdates-1.0

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":"ngx-bimplus-components.mjs","names":[],"sources":["../../../projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.service.ts","../../../projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.html","../../../projects/ngx-bimplus-components/src/lib/services/resize-observer.service.ts","../../../projects/ngx-bimplus-components/src/lib/services/local-storage.service.ts","../../../projects/ngx-bimplus-components/src/lib/services/layout-manager.service.ts","../../../projects/ngx-bimplus-components/src/lib/utils/utils.ts","../../../projects/ngx-bimplus-components/src/lib/directives/resizable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.html","../../../projects/ngx-bimplus-components/src/lib/directives/draggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.html","../../../projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/pxsuffix.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/directives/x-draggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/svg-generator.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.html","../../../projects/ngx-bimplus-components/src/lib/directives/click-outside/click-outside.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.interface.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/format-value.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/datetime.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.html","../../../projects/ngx-bimplus-components/src/lib/utils/filterString.ts","../../../projects/ngx-bimplus-components/src/lib/utils/filterStructureFetcher.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.html","../../../projects/ngx-bimplus-components/src/lib/services/cursors.service.ts","../../../projects/ngx-bimplus-components/src/lib/directives/component-draggable/componentsDraggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.html","../../../projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/round.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value-as-string.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/utils/objectProperties.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/validators/double.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/integer.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/guid.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/double-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.service.ts","../../../projects/ngx-bimplus-components/src/lib/validators/guid-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/string-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/string-combobox.validator.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.html","../../../projects/ngx-bimplus-components/src/lib/services/decorators.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/bit-converter.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/services/bimplus-attachments.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/auto-resize-textarea.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.html","../../../projects/ngx-bimplus-components/src/lib/testing/bimplus-missing-translatetranslation-handler.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxBimplusComponentsService {\r\n\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\n selector: 'lib-ngx-bimplus-components',\n imports: [],\n template: `\r\n <p>\r\n ngx-bimplus-components works!\r\n </p>\r\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: ``\n})\r\nexport class NgxBimplusComponentsComponent {\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\n\r\nexport class BimplusConnectionDesignerService {\r\n private _activeStep: number = 0;\r\n\r\n activeStepChange$: Subject<number> = new Subject<number>();\r\n\r\n set activeStep(activeStep: number) {\r\n this._activeStep = activeStep;\r\n this.activeStepChange$.next(this._activeStep);\r\n }\r\n\r\n get activeStep(): number {\r\n return this._activeStep;\r\n }\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input, booleanAttribute, computed, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\ntype SpinnerTexts = string[] | null | undefined;\r\ntype SpinnerText = string | null | undefined;\r\n\r\n@Component({\r\n selector: 'lib-loading-spinner',\r\n templateUrl: './loading-spinner.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loading-spinner.component.less'\r\n})\r\nexport class LoadingSpinnerComponent {\r\n @Input({ transform: booleanAttribute }) spinnerSpinActive: boolean = false;\r\n @Input({ transform: booleanAttribute }) spinnerHoverEnabled: boolean = false;\r\n @Input({ transform: booleanAttribute }) spinnerDisabled: boolean = false;\r\n spinnerText = input<SpinnerText>(undefined);\r\n spinnerTexts = input<SpinnerTexts>(undefined);\r\n\r\n protected readonly isSpinnerTextsArray = computed(() => {\r\n const spinnerTexts = this.spinnerTexts();\r\n return !!(spinnerTexts && typeof spinnerTexts === 'object' && Array.isArray(spinnerTexts) && Boolean(spinnerTexts.length))\r\n });\r\n}\r\n","<div class=\"loading-spinner\">\r\n <div class=\"spinner-conatiner\">\r\n <div\r\n class=\"spinner-icon\"\r\n [class.spinner-spin-active]=\"spinnerSpinActive\"\r\n [class.spinner-disabled]=\"spinnerDisabled\"\r\n [class.hover-enabled]=\"spinnerHoverEnabled && !spinnerDisabled\"\r\n ></div>\r\n @if (spinnerText(); as spinnerText) {\r\n <div class=\"spinner-text\" data-test=\"spinner-text\">\r\n {{ spinnerText }}\r\n </div>\r\n }\r\n @if (isSpinnerTextsArray()) {\r\n <div class=\"spinner-texts\" data-test=\"spinner-texts\">\r\n @for (_spinnerText of spinnerTexts(); track _spinnerText) {\r\n <div class=\"spinner-text\">\r\n {{ _spinnerText }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>","import { Component, input, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-sidenav-drawer-content',\r\n imports: [\r\n LoadingSpinnerComponent\r\n ],\r\n templateUrl: './bimplus-sidenav-drawer-content.component.html',\r\n styleUrl: './bimplus-sidenav-drawer-content.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BimplusSidenavDrawerContentComponent {\r\n header = input<string>('');\r\n isLoading = input<boolean>(false);\r\n @Input() loadingSpinnerText: string = \"\"\r\n}\r\n","<div class=\"sidenav-drawer-content-layout\">\r\n @if (header(); as header) {\r\n <div class=\"sidenav-drawer-header\">\r\n <div class=\"sidenav-drawer-header-title\">\r\n <span>{{ header }}</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"sidenav-drawer-content-offset\">\r\n <ng-content></ng-content>\r\n </div>\r\n @if(isLoading()){\r\n <div class=\"sidenav-drawer-loading-overlay\">\r\n <lib-loading-spinner\r\n [spinnerHoverEnabled]=\"false\"\r\n [spinnerSpinActive]=\"true\"\r\n [spinnerDisabled]=\"false\"\r\n [spinnerText]=\"loadingSpinnerText\"\r\n >\r\n </lib-loading-spinner>\r\n </div>\r\n }\r\n</div>\r\n","import { Observable } from \"rxjs\";\r\n\r\nexport interface BimplusButtonRowItem {\r\n id: string;\r\n iconClass?: string;\r\n icon?: string;\r\n title?: string;\r\n tooltip?: string;\r\n disabled?: boolean | Observable<boolean>;\r\n buttonStyle?: 'primary' | 'secondary';\r\n buttonType?: 'text' | 'icon' | 'combined';\r\n type?: typeof BimplusButtonType['FILE' | 'TEXT'];\r\n}\r\n\r\nexport interface BimplusButtonClickEvent {\r\n id: string;\r\n}\r\n\r\nexport const BimplusButtonType = {\r\n FILE: 'file',\r\n TEXT: 'text'\r\n} as const;","import { Observable, take } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport {\r\n BimplusButtonRowItem,\r\n BimplusButtonClickEvent,\r\n BimplusButtonType,\r\n} from './bimplus-buttons-row.interface';\r\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ViewEncapsulation, EventEmitter, Output, Input, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-buttons-row',\r\n imports: [NgTemplateOutlet, AsyncPipe],\r\n templateUrl: './bimplus-buttons-row.component.html',\r\n styleUrl: './bimplus-buttons-row.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusButtonsRowComponent extends BimplusLocalizedWidgetComponent {\r\n protected readonly BimplusButtonType = BimplusButtonType;\r\n @Input () isMultiple = false;\r\n items = input<BimplusButtonRowItem[]>([]);\r\n canUpdateObject = input<boolean>(false);\r\n\r\n @Output() fileChanged = new EventEmitter<File[]>();\r\n @Output() buttonClicked = new EventEmitter<BimplusButtonClickEvent>();\r\n\r\n protected onChange(event: Event, inputElement: HTMLInputElement) {\r\n const files = (event.target as unknown as { files: File[] }).files; \r\n\r\n if (files) {\r\n this.fileChanged.emit(files);\r\n // reset value to be able select same value again\r\n inputElement.value = '';\r\n }\r\n }\r\n\r\n protected _buttonClicked(item: BimplusButtonRowItem) {\r\n if (item.disabled && this.isObservable(item.disabled)) {\r\n // evaluate observable once\r\n item.disabled.pipe(take(1)).subscribe((disabled) => {\r\n if (!disabled) {\r\n this.buttonClicked.emit({ id: item.id });\r\n }\r\n });\r\n return;\r\n }\r\n if (item.disabled) {\r\n return;\r\n }\r\n this.buttonClicked.emit({ id: item.id });\r\n }\r\n\r\n protected isObservable(value: Observable<boolean> | boolean): value is Observable<boolean> {\r\n return typeof value === 'object' && 'subscribe' in value;\r\n }\r\n}\r\n","<div class=\"button-row\">\r\n @for(item of items(); track item.id; let last=$last; let first=$first;) {\r\n @switch(item.type) {\r\n @case (BimplusButtonType.FILE) {\r\n <ng-container\r\n *ngTemplateOutlet=\"fileButton; context: { $implicit: item, last, first }\"\r\n ></ng-container>\r\n } @default {\r\n <ng-container\r\n *ngTemplateOutlet=\"button; context: { $implicit: item, last, first }\"\r\n ></ng-container>\r\n }\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #fileButton let-item let-last=\"last\" let-first=\"first\">\r\n <input\r\n #fileInput\r\n hidden\r\n type=\"file\"\r\n (change)=\"onChange($event, fileInput)\"\r\n [id]=\"item.id\"\r\n [attr.multiple]=\"isMultiple ? true : null\"\r\n />\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n button;\r\n context: { $implicit: item, last, first, fileInput }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template\r\n #button\r\n let-item\r\n let-last=\"last\"\r\n let-first=\"first\"\r\n let-fileInput=\"fileInput\"\r\n>\r\n <button\r\n data-test=\"button\"\r\n [class.last]=\"last\"\r\n [class.first]=\"first\"\r\n [class.primary-button]=\"\r\n item.buttonStyle === undefined || item.buttonStyle === 'primary'\r\n \"\r\n [class.secondary-button]=\"item.buttonStyle === 'secondary'\"\r\n [class.text-button]=\"\r\n item.buttonType === undefined || item.buttonType === 'text'\r\n \"\r\n [class.icon-button]=\"item.buttonType === 'icon'\"\r\n [class.combined-button]=\"item.buttonType === 'combined'\"\r\n [class.disabled]=\"item.disabled === true\"\r\n (click)=\"fileInput ? fileInput.click() : _buttonClicked(item)\"\r\n title=\"{{ item.tooltip }}\"\r\n [disabled]=\"isObservable(item.disabled) ? !!(item.disabled | async) : !!item.disabled\"\r\n >\r\n {{ item.title }}\r\n </button>\r\n</ng-template>\r\n","\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusConnectionDesignerService } from \"./bimplus-connection-designer.service\"\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport { DesignCode } from './bimplus-connection-designer.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-connection-designer',\r\n imports: [\r\n FormsModule,\r\n NgSelectModule,\r\n TranslateModule,\r\n BimplusSidenavDrawerContentComponent,\r\n BimplusButtonsRowComponent,\r\n BimplusSidenavDrawerContentComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-connection-designer.component.html',\r\n styleUrl: './bimplus-connection-designer.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusConnectionDesignerComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n protected connectionDesignerService = inject(BimplusConnectionDesignerService);\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n config: Array<BimplusButtonRowItem> = [];\r\n constructor() {\r\n super();\r\n\r\n const connectionDesignerService = this.connectionDesignerService;\r\n\r\n connectionDesignerService.activeStepChange$.subscribe((step) => {\r\n if (step === 0) {\r\n this.resetDesignCode();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.config.push({\r\n id: \"next\"\r\n , title: this.translateService.instant('_Next')\r\n , tooltip: this.translateService.instant('_Next')\r\n , disabled: true\r\n , buttonStyle: 'primary'\r\n });\r\n this.buttonRowItems = this.config;\r\n }\r\n\r\n // #region Design codes\r\n\r\n chooseCode: string = \"_Choose_a_design_code\"; // Message for drop down list\r\n\r\n // Design method codes defined in SDS2 (see WebSdk Connexis service for possible values)\r\n @Input() designCodes: Array<DesignCode> = [\r\n { id: \"0\", name: \"EN 1993-1-8 (Eurocode 3)\", code: \"EURO05\", codeNumber: 9 },\r\n { id: \"1\", name: \"AISC 360-22 (16th Ed.): LRFD\", code: \"LRFD16\", codeNumber: 19 },\r\n { id: \"2\", name: \"AISC 360-22 (16th Ed.): ASD\", code: \"ASD16\", codeNumber: 18 },\r\n { id: \"3\", name: \"CSA S16:19 (CISC 12th Ed.)\", code: \"CSA12\", codeNumber: 17 },\r\n ];\r\n @Input() currentDesignCode: DesignCode | null = null;\r\n\r\n @Output() designCodeChanged = new EventEmitter<DesignCode | null>();\r\n\r\n set activeDesignCode(value: DesignCode | null) {\r\n this.currentDesignCode = value;\r\n this.designCodeChanged.emit(this.currentDesignCode);\r\n }\r\n\r\n get activeDesignCode(): DesignCode | null {\r\n return this.currentDesignCode;\r\n }\r\n\r\n private _updateButtonState(buttonId: string, disabled: boolean) {\r\n const _button = this.config.find(btn => btn.id === buttonId);\r\n if (!_button) {\r\n return;\r\n }\r\n _button.disabled = disabled;\r\n }\r\n\r\n private _calculationCanBeStarted: boolean = true;\r\n @Input()\r\n set calculationCanBeStarted(value: boolean) {\r\n this._calculationCanBeStarted = value;\r\n this._updateButtonState(\"next\", !value);\r\n }\r\n get calculationCanBeStarted() {\r\n return this._calculationCanBeStarted;\r\n }\r\n\r\n @Output() startCalculationClicked = new EventEmitter<void>();\r\n\r\n buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"next\") {\r\n this.connectionDesignerService.activeStep = 1;\r\n if (this._calculationCanBeStarted) {\r\n this.startCalculationClicked.emit();\r\n }\r\n }\r\n }\r\n\r\n resetDesignCode() {\r\n this.activeDesignCode = null;\r\n }\r\n // #endregion\r\n}\r\n","<lib-bimplus-sidenav-drawer-content\r\n [header]=\"'_Connection_designer' | translate\"\r\n >\r\n <div class=\"connection-designer-content\">\r\n @if(connectionDesignerService.activeStep === 0) {\r\n <div class=\"cross-button\">\r\n <div class=\"cross\"\r\n (click)=\"resetDesignCode()\"\r\n (keypress)=\"resetDesignCode()\"\r\n >\r\n </div>\r\n </div>\r\n <div class=\"title\">\r\n {{ \"_Select_the_code\" | translate }}\r\n </div>\r\n <div class=\"description\">\r\n {{ \"_Activate_all_objects_to_make_a_connection\" | translate }}\r\n </div>\r\n <div class=\"note\">\r\n {{ \"_Activate_all_objects_note\" | translate }}\r\n </div>\r\n\r\n @if(designCodes.length > 0){\r\n <div class=\"design-codes\">\r\n <ng-select\r\n class=\"design-codes-dropdown\"\r\n [(ngModel)]=\"activeDesignCode\"\r\n [clearable]=\"false\"\r\n [searchable]=\"false\"\r\n [placeholder]=\"chooseCode | translate\"\r\n >\r\n @for (code of designCodes; track code) {\r\n <ng-option [value]=\"code\">{{\r\n code.name\r\n }}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n } @else {\r\n <div class=\"no-design-codes\">\r\n {{ \"_No_design_codes_defined\" | translate }}\r\n </div>\r\n }\r\n\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n ></lib-bimplus-buttons-row>\r\n\r\n } @else {\r\n <ng-content select=\"lib-bimplus-connection-designer-results\"></ng-content>\r\n }\r\n </div>\r\n</lib-bimplus-sidenav-drawer-content>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, model, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel',\r\n imports: [CommonModule],\r\n templateUrl: './expansion-panel.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './expansion-panel.component.less'\r\n})\r\nexport class ExpansionPanelComponent {\r\n // #region public fields\r\n expanded = model<boolean>(true);\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n toggleExpand(){\r\n this.expanded.update(value => !value);\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"expansion-panel\">\r\n <div class=\"expansion-panel-header-row\">\r\n <div \r\n class=\"expansion-panel-expander-icon\" \r\n data-test=\"expansion-panel\"\r\n [ngClass]=\"expanded() ? 'open' : 'closed'\" \r\n (click)=\"toggleExpand()\"\r\n (keypress)=\"toggleExpand()\"\r\n ></div>\r\n <div class=\"expansion-panel-header-content\">\r\n <ng-content select=\"lib-expansion-panel-header\"></ng-content>\r\n </div>\r\n </div>\r\n <div class=\"expansion-panel-content-container\" [ngClass]=\"expanded() ? '' : 'collapsed'\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n","import { Component, HostBinding, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel-header',\r\n imports: [],\r\n templateUrl: './expansion-panel-header.component.html',\r\n styleUrl: './expansion-panel-header.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ExpansionPanelHeaderComponent {\r\n @HostBinding('class.expansion-panel-header-container') centerMenuButtonClass: boolean = true;\r\n}\r\n"," <div class=\"expansion-panel-header-title\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div>\r\n <ng-content select=\"lib-expansion-panel-header-actions\"></ng-content>\r\n </div>","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel-header-actions',\r\n imports: [],\r\n templateUrl: './expansion-panel-header-actions.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './expansion-panel-header-actions.component.less'\r\n})\r\nexport class ExpansionPanelHeaderActionsComponent {\r\n\r\n}\r\n","<ng-content></ng-content>\r\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-text-message',\r\n templateUrl: './bimplus-text-message.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-text-message.component.less'\r\n})\r\nexport class BimplusTextMessageComponent {\r\n message = input<string | undefined>(undefined);\r\n}\r\n","@if(message(); as message) {\r\n <div class=\"message\">\r\n {{ message }}\r\n </div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit, OnChanges, SimpleChanges, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport { ConnexisResultsRoot, ConnexisResultList, ConnexisResult } from './bimplus-connection-designer-results.interface';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\nimport { BimplusConnectionDesignerService } from \"../bimplus-connection-designer/bimplus-connection-designer.service\";\r\nimport { BimplusTextMessageComponent } from \"../bimplus-text-message/bimplus-text-message.component\";\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\n\r\n@Component({\r\n selector: 'lib-bimplus-connection-designer-results',\r\n imports: [\r\n TranslateModule,\r\n CommonModule,\r\n BimplusButtonsRowComponent,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n BimplusTextMessageComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-connection-designer-results.component.html',\r\n styleUrl: './bimplus-connection-designer-results.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusConnectionDesignerResultsComponent extends BimplusLocalizedWidgetComponent\r\n implements OnInit, OnChanges {\r\n protected connectionDesignerService = inject(BimplusConnectionDesignerService);\r\n\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n\r\n @Input() errorMessage: string = \"\";\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.buttonRowItems = [\r\n {\r\n id: \"done\"\r\n , title: this.translateService.instant('_Done')\r\n , tooltip: this.translateService.instant('_Done')\r\n , disabled: false\r\n , buttonStyle: 'primary'\r\n }\r\n ];\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const changedResults = changes['results']?.currentValue as ConnexisResultsRoot | null;\r\n if (changedResults === null) {\r\n this.connectionDesignerService.activeStep = 0;\r\n }\r\n }\r\n\r\n @Output() doneClicked = new EventEmitter<void>();\r\n\r\n buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"done\") {\r\n this.connectionDesignerService.activeStep = 0;\r\n this.doneClicked.emit();\r\n }\r\n }\r\n\r\n // #region Results\r\n @Input() resultTreeRootTitle: string = \"\"; // Tooltip root node of tree\r\n @Input() resultTreeRootName: string = \"\"; // Visible root node name of tree\r\n @Input() expandedTreeRoot: boolean = false; // Root tree is expanded\r\n @Input() expandedResultTrees: boolean = false; // failed and passed sub-tree expanded\r\n @Input() results: ConnexisResultsRoot | null = null; // Root for all result lists (failed, passed)\r\n @Output() toggleVisibilityResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() toggleVisibilityResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() toggleVisibilityResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() clickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() clickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() clickedResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() doubleClickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() doubleClickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() doubleClickedResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() mouseEnteredResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() mouseLeftResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n\r\n totalResults(): number {\r\n let totalCount = 0;\r\n if (!this.results) return totalCount;\r\n for (const resultList of this.results.resultList) {\r\n totalCount += resultList.results.length;\r\n }\r\n return totalCount\r\n }\r\n private statusMessage(result: ConnexisResult): string {\r\n let message = \"\\n\";\r\n message += result.isValid ? \"PASSED : \" : \"FAILED : \";\r\n message += \"Unity Ratio \" + result.unityRatio;\r\n return message;\r\n }\r\n private infoMessage(result: ConnexisResult): string {\r\n if (!result.message) {\r\n return \"\";\r\n }\r\n\r\n let message = \"\\n\";\r\n message += \"Message: \";\r\n message += result.message;\r\n return message;\r\n }\r\n\r\n getTitle(result: ConnexisResult): string {\r\n return `${result.name}${this.statusMessage(result)}${this.infoMessage(result)}`;\r\n }\r\n // #endregion\r\n}\r\n","<div class=\"connection-designer-content-result\">\r\n <div class=\"title\">\r\n {{ \"_Connection_Designer_results_title\" | translate }}\r\n </div>\r\n <div class=\"description\">\r\n {{ \"_Connection_Designer_results_description\" | translate }}\r\n </div>\r\n\r\n @if(results !== null){\r\n <lib-bimplus-scrollable-container>\r\n <div class=\"scrollable-content-container\">\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedTreeRoot\"\r\n >\r\n <lib-expansion-panel-header\r\n [title]=\"resultTreeRootTitle ? resultTreeRootTitle : results.name + ' (' + totalResults() + ')'\"\r\n (click)=\"clickedResultsRoot.emit(results)\"\r\n (keypress)=\"clickedResultsRoot.emit(results)\"\r\n (dblclick)=\"doubleClickedResultsRoot.emit(results)\"\r\n >\r\n <span class=\"project-navigator-root-node\">\r\n {{ results.name }} ({{ totalResults() }})\r\n </span>\r\n\r\n <lib-expansion-panel-header-actions>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_results'\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: results.isVisible,\r\n invisible: !results.isVisible,\r\n semivisible: results.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResultsRoot.emit(results)\"\r\n ></div> -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Show all result lists as expansion panels -->\r\n <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\r\n @for (resultList of results.resultList; track resultList) {\r\n <div>\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedResultTrees\"\r\n >\r\n <lib-expansion-panel-header>\r\n <span\r\n class=\"project-navigator-model-node\"\r\n [ngClass]=\"{\r\n visible: resultList.isVisible\r\n }\"\r\n [style.color]=\"resultList.colorHexCode\"\r\n [title]=\"resultList.name + ' (' + resultList.results.length + ')'\"\r\n (click)=\"clickedResultList.emit(resultList)\"\r\n (keypress)=\"clickedResultList.emit(resultList)\"\r\n (dblclick)=\"doubleClickedResultList.emit(resultList)\"\r\n >\r\n {{ resultList.name }} ({{ resultList.results.length }})\r\n </span>\r\n <lib-expansion-panel-header-actions>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_resultlist_' + resultList.id\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: resultList.isVisible,\r\n invisible: !resultList.isVisible,\r\n semivisible: resultList.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResultList.emit(resultList)\"\r\n ></div> -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n <!-- Content of panel -->\r\n @for (result of resultList.results; track result) {\r\n <div\r\n class=\"project-navigator-layer-node\"\r\n >\r\n <div\r\n class=\"project-navigator-layer-node-name\"\r\n [class.selected-node]=\"result.isSelected\"\r\n [attr.data-test]=\"'result' + result.id\"\r\n [ngClass]=\"{\r\n visible: result.isVisible\r\n }\"\r\n [title]=\"getTitle(result)\"\r\n (click)=\"clickedResult.emit(result)\"\r\n (keypress)=\"clickedResult.emit(result)\"\r\n (dblclick)=\"doubleClickedResult.emit(result)\"\r\n (mouseenter)=\"mouseEnteredResult.emit(result)\"\r\n (mouseleave)=\"mouseLeftResult.emit(result)\"\r\n >\r\n {{ result.name }}\r\n </div>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_result_' + result.id\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: result.isVisible,\r\n invisible: !result.isVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResult.emit(result)\"\r\n ></div> -->\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n</div>\r\n</lib-bimplus-scrollable-container>\r\n\r\n} @else {\r\n @if (errorMessage) {\r\n <lib-bimplus-text-message\r\n class=\"error-message\"\r\n [message]=\"errorMessage\"\r\n >\r\n </lib-bimplus-text-message>\r\n }\r\n}\r\n\r\n<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n >\r\n</lib-bimplus-buttons-row>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ResizeObserverService {\r\n\r\n private rectSize$: BehaviorSubject<DOMRect |undefined > = new BehaviorSubject<DOMRect|undefined>(undefined);\r\n private internalRectSize :DOMRect = new DOMRect(1,1,1,1);\r\n // Observable that components can subscribe to\r\n public parentAppRect$: Observable<DOMRect | undefined> = this.rectSize$.asObservable();\r\n\r\n constructor() { }\r\n\r\n public setSize(newValue: DOMRect): void {\r\n this.rectSize$.next(newValue); \r\n this.internalRectSize = newValue; \r\n }\r\n\r\n public getParentAppRect ():DOMRect{\r\n if( this.internalRectSize.width<=1 || this.internalRectSize?.height<=1 ) { // not set up with real data yet\r\n const parentView:HTMLElement|null = document.querySelector('.mainView');\r\n if(!parentView){\r\n return this.internalRectSize;\r\n }\r\n return parentView.getBoundingClientRect();\r\n }\r\n return this.internalRectSize;\r\n } \r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalStorageService {\r\n\r\n private storageSubject = new BehaviorSubject<{ key: string, value: unknown } | null>(null);\r\n\r\n constructor() { }\r\n\r\n // Set a string value in localStorage\r\n setItem(key: string, value: string): void {\r\n try {\r\n localStorage.setItem(key, value);\r\n this.storageSubject.next({ key, value });\r\n } catch (e) {\r\n console.error('Error saving to localStorage', e);\r\n }\r\n }\r\n\r\n // Get a string value from localStorage\r\n getItem(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch (e) {\r\n console.error('Error reading from localStorage', e);\r\n return null;\r\n }\r\n }\r\n\r\n // Remove an item from localStorage\r\n removeItem(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n this.storageSubject.next({ key, value: null });\r\n } catch (e) {\r\n console.error('Error removing from localStorage', e);\r\n }\r\n }\r\n\r\n // Clear all items in localStorage\r\n clear(): void {\r\n try {\r\n localStorage.clear();\r\n this.storageSubject.next(null);\r\n } catch (e) {\r\n console.error('Error clearing localStorage', e);\r\n }\r\n }\r\n\r\n // Set an object in localStorage\r\n setObject(key: string, value: unknown): void {\r\n this.setItem(key, JSON.stringify(value));\r\n }\r\n\r\n // Get an object from localStorage\r\n getObject(key: string): unknown {\r\n const value = this.getItem(key);\r\n return value ? JSON.parse(value) : null;\r\n }\r\n\r\n // Watch for changes in localStorage\r\n watchStorage(): Observable<{ key: string, value: unknown } | null> {\r\n return this.storageSubject.asObservable();\r\n }\r\n}\r\n","import { ElementRef, Injectable, inject } from '@angular/core';\r\nimport { ResizeObserverService } from './resize-observer.service';\r\nimport { LocalStorageService } from './local-storage.service';\r\nimport { BehaviorSubject } from 'rxjs';\r\n//import { ItemsList } from '@ng-select/ng-select/lib/items-list';\r\n//import { NotFoundError } from 'rxjs';\r\n\r\n\r\nexport interface LayoutManagerItem {\r\n element:ElementRef;\r\n id: string;\r\n selector?:string;\r\n isCollapsed:boolean;\r\n rememberPosition?:boolean\r\n left?: number;\r\n top?:number;\r\n width?:number;\r\n height?:number;\r\n}\r\n\r\nexport interface LayoutManagerConfigItem {\r\n id: string;\r\n isCollapsed:boolean; \r\n left?: number;\r\n top?:number; \r\n width?:number;\r\n height?:number;\r\n}\r\n\r\n\r\ninterface LayoutManagerConfig {\r\n [key:string]: LayoutManagerConfigItem\r\n}\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LayoutManagerService {\r\n private resizeObserverService = inject(ResizeObserverService);\r\n private localStorageService = inject(LocalStorageService);\r\n\r\n\r\n registeredItems$: BehaviorSubject<LayoutManagerItem[]> = new BehaviorSubject<LayoutManagerItem[]>([])\r\n private registeredItems:LayoutManagerItem[] = [];\r\n \r\n get RegisteredItems(): LayoutManagerItem[] {\r\n return this.registeredItems;\r\n }\r\n CONFIG:string = 'layoutManagerConfig';\r\n\r\n \r\n/**--------------------------------------------------------------------------\r\n * register object. object must have unique id or elementId\r\n --------------------------------------------------------------------------*/\r\n registerObject(obj:ElementRef, id:string, selector:string | undefined, rememberPosition:boolean,left:number = 100, top:number = 100,width:number = 0, height:number = 0) {\r\n let foundIndex = -1;\r\n if(this.registeredItems.some((item,index) => {\r\n const retval = item.id === id;\r\n if(retval){\r\n foundIndex = index;\r\n }\r\n return retval;\r\n })){\r\n if(foundIndex >= 0){\r\n this.registeredItems.splice(foundIndex,1);\r\n } \r\n }\r\n const newItem: LayoutManagerItem = { \r\n element:obj,\r\n id:id,\r\n selector:selector,\r\n rememberPosition:!!rememberPosition,\r\n left:left,\r\n top:top,\r\n width:width,\r\n height:height,\r\n isCollapsed: false \r\n };\r\n\r\n this.registeredItems.push(newItem);\r\n this.registeredItems$.next(this.registeredItems);\r\n this._initObject(newItem);\r\n }\r\n \r\n _initObject(obj:LayoutManagerItem){\r\n this._adjustObjectByConfig(obj);\r\n this._adjustObjectByWindowSize(obj);\r\n \r\n }\r\n /**--------------------------------------------------------------------------\r\n * get object configuration\r\n * return {left, top, width, heigth}\r\n --------------------------------------------------------------------------*/\r\n _getObjectConfig(obj:LayoutManagerItem):LayoutManagerConfigItem|null {\r\n if(!obj){\r\n return null;\r\n }\r\n const configValue = this.localStorageService.getItem(this.CONFIG);\r\n const config = configValue ? JSON.parse(configValue) : {};\r\n const objId = obj.id ;\r\n let configObj = config[objId];\r\n if(!configObj) {\r\n configObj = {id:objId,left:obj.left,top:obj.top,width:obj.width,height:obj.height}; \r\n }\r\n return configObj;\r\n }\r\n\r\n _adjustObjectByConfig(obj:LayoutManagerItem){\r\n const config:LayoutManagerConfigItem|null = this._getObjectConfig(obj);\r\n if(!config){\r\n return; \r\n }\r\n const parentElement = this._getDomParentElement(obj);\r\n const internalElement = this._getDomInternalElement(obj,'');\r\n if(!parentElement || !internalElement){\r\n return;\r\n }\r\n parentElement.style.left = (config.left) + 'px';\r\n parentElement.style.top = (config.top) + 'px';\r\n if(config.width && config.width > 0){\r\n internalElement.style.width = config.width + 'px';\r\n }\r\n if(config.height && config.height > 0){\r\n internalElement.style.height = config.height + 'px';\r\n }\r\n \r\n this.checkPosition(obj.id,\"\",undefined,0,0,true); \r\n }\r\n\r\n _adjustObjectByWindowSize(obj:LayoutManagerItem){\r\n this.checkPosition(obj.id,\"\",undefined,0,0,true); \r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * returns object registered in the layout manager \r\n --------------------------------------------------------------------------*/\r\n getItem(id: string ):LayoutManagerItem|null { \r\n let foundItem:LayoutManagerItem|null = null;\r\n this.registeredItems.forEach(item =>{\r\n if(item.id === id){\r\n foundItem = item;\r\n }\r\n });\r\n return foundItem;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * set object configuration\r\n --------------------------------------------------------------------------*/\r\n _setObjectConfig(obj:LayoutManagerItem, left:number,top:number,width:number,height:number) {\r\n const objId = obj?.id ;\r\n if (!objId) {\r\n return;\r\n }\r\n let config = this.localStorageService.getObject(this.CONFIG) as LayoutManagerConfig;\r\n //let config = configValue && JSON.parse(configValue) as LayoutManagerConfig;\r\n if (!config) {\r\n config = {};\r\n }\r\n if(obj?.isCollapsed){ // do not overtake collapsed size\r\n if (!config[objId]) { \r\n config[objId] = obj;\r\n }\r\n config[objId].left = left;\r\n config[objId].top = top;\r\n //config[objId].width = width;\r\n //config[objId].height = height ;\r\n this.localStorageService.setObject(this.CONFIG, config);\r\n return;\r\n }\r\n\r\n const newItem :LayoutManagerConfigItem = {\r\n id: objId,\r\n isCollapsed: false,\r\n left: left,\r\n top: top,\r\n width: width,\r\n height: height\r\n };\r\n config[objId] = newItem;\r\n this.localStorageService.setObject(this.CONFIG,config);\r\n }\r\n \r\n getDomParentElement(id:string ):HTMLElement|null {\r\n const item:LayoutManagerItem|null = this.getItem(id);\r\n if(item){\r\n return this._getDomParentElement(item);\r\n }\r\n return null;\r\n }\r\n\r\n _getDomParentElement(item:LayoutManagerItem ):HTMLElement|null {\r\n let element:HTMLElement;\r\n if(item.element?.nativeElement?.shadowRoot){\r\n element = item.element?.nativeElement?.shadowRoot.querySelector(item.selector);\r\n } else {\r\n element = item.element?.nativeElement; \r\n }\r\n if(!element){\r\n console.error('_getDomParentElement: missing element');\r\n return null;\r\n }\r\n return element; \r\n }\r\n\r\n _getDomInternalElement(item:LayoutManagerItem,selector:string | undefined ):HTMLElement|null {\r\n const element:HTMLElement = item.element?.nativeElement?.shadowRoot || item.element?.nativeElement; \r\n if(!element){\r\n console.error('_getDomInternalElement: missing element');\r\n return null;\r\n }\r\n const mySelector =selector && selector?.length > 0 ?selector:item.selector; \r\n const retval: HTMLElement|null= mySelector?element.querySelector(mySelector):element;\r\n if(!retval){\r\n console.error(`_getDomInternalElement: selection of element ${element} failed with selector ${mySelector}`);\r\n }\r\n return retval;\r\n }\r\n\r\n\r\n _getElementRect(item:LayoutManagerItem,selector:string | undefined ,parentRectangle:DOMRect |undefined ):DOMRect | null{\r\n const selectedObj : HTMLElement|null = this._getDomInternalElement(item,selector);\r\n if(!selectedObj){\r\n console.error('_getElementRect: missing selected object');\r\n return null;\r\n }\r\n\r\n const parentRect:DOMRect = parentRectangle || this.resizeObserverService.getParentAppRect();\r\n if( !parentRect || parentRect?.width<=1 || parentRect?.height<=1 ) {\r\n console.log('_getElementRect: missing parent rect');\r\n }\r\n const elementRect:DOMRect|null = selectedObj.getBoundingClientRect();\r\n if(!elementRect){\r\n console.error('_getElementRect: missing bounding rect');\r\n }\r\n return elementRect;\r\n }\r\n\r\n // checks whether element or element with additional selection of subelement is placed within the give rectangle\r\n // if not then calculates the offset to be moved to fit in\r\n checkPosition(id:string,selector:string,parentRectangle:DOMRect|undefined ,deltaX:number,deltaY:number,forceCheck:boolean = false){\r\n if(!id){\r\n return {deltaX:0,deltaY:0};\r\n }\r\n const e1 = this.getItem(id);\r\n if(!e1){\r\n return {deltaX:0,deltaY:0};\r\n }\r\n const parentRect:DOMRect = parentRectangle || this.resizeObserverService.getParentAppRect();\r\n const elementRect:DOMRect | null = this._getElementRect(e1,selector,parentRect);\r\n if(!elementRect){\r\n console.error('checkPosition: missing elementRect');\r\n return {deltaX:0,deltaY:0};\r\n }\r\n \r\n if(!elementRect?.width || !elementRect?.height){\r\n console.error('checkPosition:element rect empty ');\r\n return {deltaX:0,deltaY:0};\r\n } \r\n \r\n let checkAll = true;\r\n if(parentRect?.width < 2 || parentRect?.height < 2){ // empty parent rect , (after init before first usefull info) nothing to check \r\n checkAll = false; \r\n } \r\n if(checkAll){\r\n let checkBoundaries = true;\r\n if(this._isInsideRect(elementRect, parentRect) === false && !forceCheck) {\r\n checkBoundaries = false;\r\n }\r\n \r\n // copy of real element rectangle to perform calculation over before set to the real element\r\n const elementDOMRect = DOMRect.fromRect(elementRect);\r\n\r\n //set the element rectangle by deltas\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n\r\n if(checkBoundaries) {\r\n if(this._isInsideRect(elementDOMRect, parentRect) === false) {\r\n const newElementPos = this.getAlignedPosition(elementDOMRect, parentRect);\r\n deltaX = newElementPos.x - elementRect.x;\r\n deltaY = newElementPos.y - elementRect.y;\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n }\r\n } else {\r\n if (this._isInsideLeftTopRect(parentRect, elementDOMRect) === false) {\r\n const newElementPos = this._getAlignedLeftTopPosition(elementDOMRect, parentRect);\r\n deltaX = newElementPos.x - elementRect.x;\r\n deltaY = newElementPos.y - elementRect.y;\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n }\r\n }\r\n }\r\n\r\n const selectedElement = this._getDomParentElement(e1);\r\n if(!selectedElement){\r\n return;\r\n }\r\n const computedStyle = window.getComputedStyle(selectedElement);\r\n const top = parseInt(computedStyle.top, 10);\r\n const left = parseInt(computedStyle.left, 10);\r\n selectedElement.style.top = (top + deltaY) + 'px';\r\n selectedElement.style.left = (left + deltaX) + 'px';\r\n return {deltaX,deltaY};\r\n }\r\n /**--------------------------------------------------------------------------\r\n * find if rectangle 1 is inside rectangle 2\r\n --------------------------------------------------------------------------*/\r\n _isInsideRect(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return false;\r\n }\r\n return r2.left <= r1.left && r2.top <= r1.top && r2.right >= r1.right && r2.bottom >= r1.bottom;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * find if rectangles do not overlap the left and top sides\r\n --------------------------------------------------------------------------*/\r\n _isInsideLeftTopRect(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return false;\r\n }\r\n const r1Inside = r2.left <= r1.left && r2.top <= r1.top;\r\n const r2Inside = r1.left <= r2.left && r1.top <= r2.top;\r\n return r1Inside || r2Inside;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * get position of r1 aligned with the r2 sides\r\n --------------------------------------------------------------------------*/\r\n getAlignedPosition(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return {x:0,y:0};\r\n }\r\n const to = { x: r1.x, y: r1.y };\r\n //align left or right sides. preferably left\r\n if(r1.left < r2.left) {\r\n to.x = r2.x;\r\n } else if(r1.right > r2.right) {\r\n to.x = r2.right - r1.width;\r\n }\r\n //align top or bottom. preferably top\r\n if(r1.top < r2.top) {\r\n to.y = r2.y;\r\n } else if(r1.bottom > r2.bottom) {\r\n to.y = r2.bottom - r1.height;\r\n }\r\n return to;\r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * get position of r1 aligned with the r2 left, top sides\r\n --------------------------------------------------------------------------*/\r\n _getAlignedLeftTopPosition(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return {x:0,y:0};\r\n }\r\n\r\n const to = { x: r1.x, y: r1.y };\r\n //align left\r\n if(r1.left < r2.left) {\r\n to.x = r2.x;\r\n }\r\n //align top\r\n if(r1.top < r2.top) {\r\n to.y = r2.y;\r\n }\r\n return to;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * translate rectangle by x, y\r\n --------------------------------------------------------------------------*/\r\n _translateRectangle(rect:DOMRect, translateX:number, translateY:number) {\r\n if(!rect) {\r\n return;\r\n }\r\n rect.x += translateX;\r\n rect.y += translateY;\r\n return rect;\r\n }\r\n \r\n updateCollapsed(value:boolean, id:string = ''):void{ \r\n const foundItem = this.getItem(id);\r\n if(!foundItem){\r\n return;\r\n }\r\n foundItem.isCollapsed = value;\r\n this.registeredItems$.next(this.registeredItems);\r\n setTimeout(()=>{ \r\n this.checkPosition(foundItem.id,\"\",undefined,0,0,true); \r\n });\r\n } \r\n\r\n\r\n handleDragEnd(id:string){//},left:number,top:number){\r\n this.finalizeObjectChanges(id);\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * finalize object changes (position). object must be registered in the layout manager\r\n * object: object to finalize \r\n --------------------------------------------------------------------------*/\r\n finalizeObjectChanges(id:string):void {\r\n const item:LayoutManagerItem|null = this.getItem(id);\r\n if(!item){\r\n return;\r\n }\r\n const element = this._getDomParentElement(item);\r\n if(!element){\r\n return;\r\n }\r\n const computedStyle = window.getComputedStyle(element); \r\n const top = parseInt(computedStyle.top, 10);\r\n const left = parseInt(computedStyle.left, 10);\r\n \r\n const elementRect = this._getElementRect(item,undefined,undefined);\r\n this._setObjectConfig(item,left,top,\r\n elementRect && elementRect.width > 0 ? elementRect.width:0 ,\r\n elementRect && elementRect.height > 0 ? elementRect.height:0);\r\n }\r\n}\r\n\r\n","// Define the type of the window.BimPlus object\r\nexport interface BimPlusObject {\r\n [key: string]: (dataDetail: { detail: unknown }) => void;\r\n}\r\nexport interface Source {\r\n [key: string]: { emit: (arg0: unknown) => void; };\r\n}\r\n\r\n\r\n/**--------------------------------------------------------------------------\r\n* fire event from component in two ways : \r\n - fire custom event from component in standard recommended way via. this.eventName.emit function\r\n \r\n - call window.BimPlus.eventName function directly on window object (eventName is name\r\n of the event we want to fire e.g. bimplusNavbarClicked so it will be window.BimPlus.bimplusNavbarClicked).\r\n Function must be defined in app. where we are using our components.\r\n This was implemented because MS Edge browser has problems with custom events and in some \r\n situations(e.g. after file download) it stops handling custom events.\r\n Disadvantage is that we can have only one event handler which is shared between the multiple components.\r\n--------------------------------------------------------------------------*/\r\nexport function fireEvent(source: unknown, eventName: string, data: unknown = null){\r\n if ( !eventName ) {\r\n console.error(\"ERROR: Missing event name in fireEvent function in Bimplus components!\");\r\n return;\r\n }\r\n // Check if eventName exists on window.BimPlus and if it's a function\r\n const bimPlus = ('BimPlus' in window) && typeof window.BimPlus === 'object' && (window.BimPlus as BimPlusObject);\r\n if (bimPlus && typeof bimPlus[eventName] === 'function') {\r\n bimPlus[eventName]({detail: data});\r\n }\r\n\r\n const _source = (source as Source);\r\n if (eventName in _source) {\r\n _source[eventName].emit(data);\r\n }\r\n}","import { Directive, ElementRef, Output, EventEmitter, OnInit, OnDestroy, inject } from '@angular/core';\r\nimport { LayoutManagerService } from '../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../services/resize-observer.service';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\ninterface ResizerItem {\r\n 'className' : string ,\r\n 'resizeStrategy' : string \r\n}\r\n\r\nexport interface ResizableElement extends HTMLElement{\r\n resizeStrategy?: string;\r\n}\r\n\r\n@Directive({\r\n selector: '[libResizable]',\r\n standalone: true\r\n})\r\n\r\nexport class ResizableDirective implements OnDestroy, OnInit{\r\n private elementRef = inject(ElementRef);\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n\r\n resizeContactPointX = 0;\r\n resizeContactPointY = 0;\r\n resizableElements:ResizableElement[] = [];\r\n resizeEnabled = true;\r\n resizeStarted = false;\r\n resizeStart : (event: MouseEvent | TouchEvent) => void;\r\n resizeInProgress: (event: MouseEvent | TouchEvent) => void; \r\n boundResizeStart: (event: MouseEvent | TouchEvent) => void;\r\n boundResizeInProgress: (event: MouseEvent | TouchEvent) => void;\r\n boundResizeEnd: (event: MouseEvent | TouchEvent) => void;\r\n \r\n _element:HTMLElement; \r\n actResizeStrategy = \"se\";\r\n \r\n\r\n @Output()\r\n resizedEnd = new EventEmitter<MouseEvent>();\r\n\r\n\r\n // list of resizers, resizers are specified by class name\r\n resizersList:ResizerItem[] = [ \r\n { className : \"resizer-nw\" , resizeStrategy : \"nw\" },\r\n { className : \"resizer-n\" , resizeStrategy: \"n\" },\r\n { className : \"resizer-ne\" , resizeStrategy: \"ne\" },\r\n { className : \"resizer-e\" , resizeStrategy: \"e\" },\r\n { className : \"resizer-se\" , resizeStrategy: \"se\" },\r\n { className : \"resizer-s\" , resizeStrategy: \"s\" },\r\n { className : \"resizer-sw\" , resizeStrategy: \"sw\" },\r\n { className : \"resizer-w\" , resizeStrategy: \"w\" }\r\n ];\r\n \r\n constructor() {\r\n const elementRef = this.elementRef;\r\n const layoutManagerService = this.layoutManagerService;\r\n \r\n \r\n this._element = elementRef.nativeElement;\r\n this.layoutManagerService = layoutManagerService;\r\n \r\n this.resizeStart = (event:MouseEvent|TouchEvent) => {\r\n //get mouse/finger X Y positions\r\n event.stopPropagation();\r\n if(this.resizeStarted){\r\n return;\r\n }\r\n this.resizeStarted = true;\r\n const touchList = (event as TouchEvent).targetTouches? (event as TouchEvent).targetTouches: [];\r\n const clientX = event.type === 'touchstart' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\r\n const clientY = event.type === 'touchstart' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\r\n this.resizeContactPointX = clientX;\r\n this.resizeContactPointY = clientY;\r\n this.openDocumentListenersResize(); \r\n this.setupResizeStrategy(event);\r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * calcuates and sets the new position\r\n --------------------------------------------------------------------------*/\r\n this.resizeInProgress = (event:MouseEvent|TouchEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n //get mouse/finger X Y positions\r\n const touchList = (event as TouchEvent).targetTouches ? (event as TouchEvent).targetTouches: [];\r\n const clientX = event.type === 'touchmove' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\r\n const clientY = event.type === 'touchmove' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\r\n //const clientX = (event as MouseEvent).clientX;\r\n //const clientY = (event as MouseEvent).clientY;\r\n\r\n const moved = this.resizeFromTo(this._element,this.resizeContactPointX, this.resizeContactPointY,clientX,clientY, this.actResizeStrategy);\r\n if(moved) {\r\n this.resizeContactPointX = clientX;\r\n this.resizeContactPointY = clientY;\r\n }\r\n }\r\n this.boundResizeStart = this.resizeStart.bind(this);\r\n this.boundResizeInProgress = this.resizeInProgress.bind(this);\r\n this.boundResizeEnd = this.resizeEnd.bind(this);\r\n this.resizeInProgress.bind(this);\r\n this.setResizers(this._element); \r\n }\r\n ngOnInit(): void {\r\n this.boundResizeStart = this.resizeStart.bind(this);\r\n this.boundResizeInProgress = this.resizeInProgress.bind(this);\r\n this.boundResizeEnd = this.resizeEnd.bind(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeAllListenersResize(); \r\n }\r\n\r\n resizeEnd(){ \r\n //this.closeDocumentListenersResize();\r\n if(!this.resizeStarted){\r\n return;\r\n } \r\n this.resizeStarted = false;\r\n this.closeAllListenersResize(); \r\n this.openElementListenersResize();\r\n fireEvent(this, \"resizedEnd\", ['$event']); \r\n }\r\n \r\n // Unused function at the moment\r\n // _getViewRect() {\r\n // const view = document.getElementById('#containerView'); // we should get here the parent object selector as input parameter\r\n // if(view){\r\n // return view.getBoundingClientRect();\r\n // }\r\n // return new DOMRect(0,0,0,0);\r\n // }\r\n\r\n/**--------------------------------------------------------------------------\r\n * find if rectangle 1 is inside rectangle 2\r\n --------------------------------------------------------------------------*/\r\n isInsideRect(rect1:DOMRect, rect2:DOMRect) {\r\n if(!rect1 || !rect2) {\r\n return false;\r\n }\r\n const rect1Inside:boolean = rect2.left <= rect1.left\r\n && rect2.top <= rect1.top \r\n && rect2.right >= rect1.right \r\n && rect2.bottom >= rect1.bottom;\r\n\r\n return rect1Inside;\r\n }\r\n /**--------------------------------------------------------------------------\r\n * resize rectangle by x, y\r\n --------------------------------------------------------------------------*/\r\n _resizeRectangle(rect:DOMRect, resizeX:number, resizeY:number, resizeStrategy:string) {\r\n if(!rect) {\r\n return;\r\n }\r\n\r\n if(['nw','w', 'sw'].includes(resizeStrategy)) {\r\n rect.x += resizeX;\r\n resizeX = resizeX * -1;\r\n }\r\n\r\n if(['nw','n', 'ne'].includes(resizeStrategy)) {\r\n rect.y += resizeY;\r\n resizeY = resizeY * -1;\r\n }\r\n\r\n if(typeof(resizeX) === 'number' && !['n','s'].includes(resizeStrategy)) {\r\n rect.width += resizeX;\r\n }\r\n\r\n if(typeof(resizeY) === 'number' && !['w','e'].includes(resizeStrategy)) {\r\n rect.height += resizeY;\r\n }\r\n\r\n return rect;\r\n }\r\n\r\n _maxHeightReset(obj:HTMLElement, elementRect:DOMRect) { \r\n this.resizeFromTo(obj, elementRect.right, elementRect.bottom, elementRect.left,elementRect.top, \"se\");\r\n }\r\n\r\n /*--------------------------------------------------------------------\r\n * resize object from {x,y} to {x,y} based on resize strategy\r\n --------------------------------------------------------------------------*/\r\n resizeFromTo (obj:HTMLElement, fromX:number, fromY:number, toX:number,toY:number, resizeStrategy:string){\r\n const posXDelta = toX - fromX;\r\n const posYDelta = toY - fromY;\r\n const element = obj ?? this._element;\r\n const elementRect = element.getBoundingClientRect();\r\n //const viewRect = this._getViewRect();\r\n const viewRect = this.resizeObserverService.getParentAppRect();\r\n \r\n let checkBoundaries = true;\r\n\r\n resizeStrategy = resizeStrategy || \"se\";\r\n\r\n //if the object is outside the view rect because it's bigger, do not check boundaries,\r\n //allow moving outside the view rect\r\n if(this.isInsideRect(elementRect, viewRect) === false) {\r\n checkBoundaries = false; \r\n }\r\n\r\n this._resizeRectangle(elementRect, posXDelta, posYDelta, resizeStrategy);\r\n\r\n if (checkBoundaries && this.isInsideRect(elementRect, viewRect) === false) {\r\n return false;\r\n }\r\n \r\n const computedStyle = window.getComputedStyle(element);\r\n let top = parseInt(computedStyle.top, 10);\r\n let left = parseInt(computedStyle.left, 10);\r\n let width = parseInt(computedStyle.width, 10);\r\n let height = parseInt(computedStyle.height, 10);\r\n \r\n if(['nw','w', 'sw'].includes(resizeStrategy)) {\r\n left = left + posXDelta; \r\n }\r\n\r\n if(['nw','n', 'ne'].includes(resizeStrategy)) {\r\n top = top + posYDelta; \r\n }\r\n\r\n if(!['n','s'].includes(resizeStrategy)) {\r\n width = elementRect.width;\r\n }\r\n \r\n if( viewRect.height < elementRect.height ){\r\n this._maxHeightReset(element, elementRect);\r\n }\r\n else if(!['w','e'].includes(resizeStrategy)) {\r\n height = elementRect.height;\r\n }\r\n\r\n \r\n element.style.top = top + 'px';\r\n element.style.left = left + 'px';\r\n element.style.width = width + 'px';\r\n element.style.height = height + 'px';\r\n\r\n return true;\r\n }\r\n/**--------------------------------------------------------------------------\r\n * resize start at the layout managaer\r\n * open document listeners\r\n --------------------------------------------------------------------------*/\r\n \r\n /**--------------------------------------------------------------------------\r\n * set the elements used for resizing\r\n --------------------------------------------------------------------------*/\r\n setResizers(element:HTMLElement) {\r\n const setResizableElements = () => {\r\n let resizableElements:ResizableElement[] = [];\r\n // get dom elements of all resizers\r\n this.resizersList.forEach( item => {\r\n const resizeElems = element.getElementsByClassName(item.className);\r\n if( resizeElems?.length ) {\r\n // set resize strategy in each element so we know in which direction to resize\r\n const decoratedResizeElems: ResizableElement[] = Array.from(resizeElems).map( elem => {\r\n const resizableElem = elem as ResizableElement;\r\n resizableElem.resizeStrategy = item.resizeStrategy;\r\n return resizableElem;\r\n });\r\n\r\n // add it to list of all resizers\r\n resizableElements = [...resizableElements, ...decoratedResizeElems];\r\n }\r\n });\r\n\r\n this.resizableElements = [...resizableElements];\r\n this.openElementListenersResize();\r\n }\r\n setTimeout(()=>{\r\n setResizableElements();\r\n });\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * open mousedown, touchstart listeners on all elements allowed for resizing\r\n --------------------------------------------------------------------------*/\r\n openElementListenersResize() {\r\n this.resizableElements.forEach(element => {\r\n element.addEventListener('mousedown', this.boundResizeStart);\r\n element.addEventListener('touchstart', this.boundResizeStart);\r\n });\r\n }\r\n /**--------------------------------------------------------------------------\r\n * open mouseup, touchend and mousemove, touchmove on document\r\n --------------------------------------------------------------------------*/\r\n openDocumentListenersResize() {\r\n document.addEventListener('mouseup', this.boundResizeEnd);\r\n document.addEventListener('touchend', this.boundResizeEnd);\r\n document.addEventListener('mousemove', this.boundResizeInProgress);\r\n document.addEventListener('touchmove', this.boundResizeInProgress); \r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * close mouseup, touchend and mousemove, touchmove on document\r\n --------------------------------------------------------------------------*/\r\n closeDocumentListenersResize() {\r\n document.removeEventListener('mousemove', this.boundResizeInProgress);\r\n document.removeEventListener('touchmove', this.boundResizeInProgress);\r\n document.removeEventListener('mouseup', this.boundResizeEnd);\r\n document.removeEventListener('touchend', this.boundResizeEnd);\r\n }\r\n\r\n/**--------------------------------------------------------------------------\r\n * close mousedown, touchstart listeners on all elements allowed for resizing\r\n --------------------------------------------------------------------------*/\r\n closeElementListenersResize() {\r\n this.resizableElements.forEach(element => {\r\n element.removeEventListener('mousedown', this.boundResizeStart);\r\n element.removeEventListener('touchstart', this.boundResizeStart);\r\n element.removeEventListener('mousemove', this.boundResizeInProgress);\r\n element.removeEventListener('touchmove', this.boundResizeInProgress); \r\n element.removeEventListener('mouseup', this.boundResizeEnd);\r\n element.removeEventListener('touchend', this.boundResizeEnd);\r\n });\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * close all listeners\r\n --------------------------------------------------------------------------*/\r\n closeAllListenersResize() {\r\n this.closeElementListenersResize();\r\n this.closeDocumentListenersResize();\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * setup actual resize strategy\r\n --------------------------------------------------------------------------*/\r\n setupResizeStrategy(event: MouseEvent | TouchEvent) {\r\n if( !event ) {\r\n return;\r\n }\r\n\r\n // find on which element resize started so we know in which direction to resize\r\n let resizeStrategy:string = \"se\";\r\n const resizeSourceElem = event?.target;\r\n\r\n if( resizeSourceElem ) {\r\n const foundElem = this.resizableElements.find( item => item === resizeSourceElem );\r\n if (foundElem?.resizeStrategy) {\r\n resizeStrategy = foundElem?.resizeStrategy;\r\n }\r\n }\r\n\r\n this.actResizeStrategy = resizeStrategy;\r\n }\r\n}\r\n","import { Component, Input, ElementRef, AfterViewChecked, ChangeDetectorRef, OnInit, OnDestroy, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { Subscription } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { ResizableDirective } from '../../directives/resizable.directive'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../../services/resize-observer.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar',\r\n imports: [\r\n ResizableDirective\r\n],\r\n templateUrl: './bimplus-floating-bar.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar.component.less'\r\n})\r\n\r\nexport class BimplusFloatingBarComponent extends BimplusLocalizedWidgetComponent implements OnInit, OnDestroy, AfterViewChecked,AfterViewInit\r\n{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private element = inject(ElementRef);\r\n private cdr = inject(ChangeDetectorRef);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() noBody: boolean = false;\r\n \r\n @Input() isFocused: boolean = false;\r\n\r\n @Input() resizeEnabled: boolean = false;\r\n @Input() autoCollapse: boolean = false;\r\n @Input() focusSelector: string = '';\r\n @Input() isVisible = false; \r\n @Input() id: string = '';\r\n \r\n private subscription: Subscription | null = null; // Initialize to null\r\n private hasViewChecked: boolean = false;\r\n \r\n //@Input() isCollapsed: boolean = false;\r\n isCollapsed: boolean = false;\r\n\r\n get canNotResize(): boolean {\r\n return !(this.resizeEnabled && !this.isCollapsed);\r\n }\r\n\r\n ngOnInit():void{\r\n \r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.id); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n }) \r\n \r\n }\r\n ngOnDestroy(): void {\r\n // Unsubscribe to avoid memory leaks\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n ngAfterViewInit(){\r\n // if the component wants to be registered in layout manager system\r\n // Subscribe to the observable\r\n this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\r\n this.handleParentAppRectSizeChange(value);\r\n });\r\n }\r\n\r\n ngAfterViewChecked() {\r\n if (!this.hasViewChecked && !this.isCollapsed) {\r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n //this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.id,\"\",undefined,0,0,true);\r\n });\r\n }\r\n }\r\n\r\n handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{ \r\n this.layoutManagerService.checkPosition(this.id,'.floating-panel.visible',parentRect,0,0,true); \r\n }\r\n \r\n onResizedEnd(){\r\n this.layoutManagerService.finalizeObjectChanges(this.id);\r\n }\r\n\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.id);\r\n }\r\n}\r\n\r\n","<div\r\n class=\"floating-panel\"\r\n [class.visible]=\"isVisible\"\r\n [class.no-body]=\"noBody\"\r\n [class.is-focused]=\"isFocused\"\r\n [class.collapsed]=\"isCollapsed\" \r\n libResizable\r\n (resizedEnd)=\"onResizedEnd()\"\r\n (dragEnd)=\"onDragEnd()\"\r\n>\r\n <ng-content select=\".floating-bar-header-logo\"></ng-content>\r\n <ng-content select=\".floating-bar-header-content\"></ng-content>\r\n <ng-content select=\".floating-bar-dragger\"></ng-content>\r\n <ng-content select=\".floating-bar-body\"></ng-content>\r\n <div \r\n class=\"resizer-ne floating-panel__resizerNE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-e floating-panel__resizerE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-se floating-panel__resizerSE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-s floating-panel__resizerS\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n</div>\r\n\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n selector: '[libDraggable]',\r\n standalone: true\r\n})\r\nexport class DraggableDirective {\r\n\r\n oldX = 0;\r\n oldY = 0;\r\n isDragging = false;\r\n wasDragging = false;\r\n isMouseDown = false;\r\n\r\n @Output()\r\n dragging = new EventEmitter<[number,number]>();\r\n\r\n @Output()\r\n dragEnd = new EventEmitter<MouseEvent>();\r\n\r\n @Output()\r\n clicked = new EventEmitter<MouseEvent>();\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging && !this.isMouseDown) {\r\n return;\r\n }\r\n\r\n const deltaX = (event.clientX - this.oldX);\r\n const deltaY = (event.clientY - this.oldY);\r\n\r\n if(!this.isDragging){\r\n if(Math.abs(deltaX) > 2 || Math.abs(deltaY) > 2){\r\n this.isDragging = true;\r\n this.wasDragging = true;\r\n }else{\r\n return;\r\n }\r\n }\r\n fireEvent(this, \"dragging\", [deltaX,deltaY]);\r\n\r\n this.oldX = event.clientX;\r\n this.oldY = event.clientY;\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if(this.isDragging || this.isMouseDown){\r\n fireEvent(this, \"dragEnd\", ['$event']);\r\n }\r\n this.isDragging = false;\r\n this.isMouseDown = false; \r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n this.isMouseDown = true;\r\n this.wasDragging = false;\r\n this.oldX = event.clientX;\r\n this.oldY = event.clientY; \r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onMouseClick(event: MouseEvent) {\r\n if(!this.wasDragging){\r\n fireEvent(this, \"clicked\", event);\r\n }\r\n }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DraggableDirective } from '../../directives/draggable.directive';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-dragger',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n ],\r\n templateUrl: './bimplus-floating-bar-dragger.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-dragger.component.less'\r\n})\r\nexport class BimplusFloatingBarDraggerComponent {\r\n private layoutManagerService = inject(LayoutManagerService);\r\n\r\n // Define isCollapsed as a boolean property\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId:string = '';\r\n \r\n // Define icon as a string property with a default value\r\n draggerIcon: string = 'ui-icon-drag';\r\n \r\n \r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__dragger dragger\"\r\n [ngClass] = \"isCollapsed ? 'collapsed' : ''\"\r\n [className]=\"draggerIcon\"\r\n libDraggable \r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n>\r\n</div>\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, input, Input, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { DraggableDirective } from '../../directives/draggable.directive';\r\nimport { LayoutManagerService, LayoutManagerItem } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-header-content',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n TranslateService\r\n ],\r\n templateUrl: './bimplus-floating-bar-header-content.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-header-content.component.less'\r\n})\r\nexport class BimplusFloatingBarHeaderContentComponent extends BimplusLocalizedWidgetComponent {\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n }) \r\n }\r\n\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId:string = '';\r\n @Output() actionClicked = new EventEmitter<string>();\r\n items = input<FloatingBarItem[]>([]);\r\n\r\n findItemById(id: string): FloatingBarItem | undefined {\r\n return this.items().find(x => x.buttonId === id);\r\n }\r\n\r\n onItemClicked(action: string) {\r\n const item = this.findItemById(action);\r\n if (!item || item?.disabled) {\r\n return;\r\n }\r\n this.actionClicked.emit(action);\r\n }\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__header-content dragger\"\r\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n libDraggable\r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n >\r\n <div class=\"menu-content\">\r\n @for (item of items(); track item) {\r\n <div>\r\n <div\r\n [attr.data-test]=\"'floating_bar_item_' + item.buttonId\"\r\n class=\"fp-block-item fp-block-icon-item\"\r\n [ngClass]=\"{\r\n active: item.active\r\n }\"\r\n [className]=\"item.iconClass\"\r\n [title]=\"item.title | translate\"\r\n (click)=\"onItemClicked(item.buttonId)\"\r\n (keypress)=\"onItemClicked(item.buttonId)\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, HostBinding, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DraggableDirective } from '../../directives/draggable.directive'\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-header-logo',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n TranslateService\r\n ],\r\n templateUrl: './bimplus-floating-bar-header-logo.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-header-logo.component.less'\r\n})\r\nexport class BimplusFloatingBarHeaderLogoComponent extends BimplusLocalizedWidgetComponent implements OnInit\r\n{\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() icon: string = \"\";\r\n @HostBinding('class.isCollapsed')\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId: string = '';\r\n\r\n @Input() title: string = \"\";\r\n\r\n ngOnInit(){\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n })\r\n }\r\n\r\n onLogoClicked(){\r\n this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.parentId)\r\n }\r\n \r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__header-logo\"\r\n [ngClass]=\"isCollapsed ? 'collapsed' : ''\"\r\n [className]=\"icon\"\r\n [title]=\"title | translate\"\r\n libDraggable\r\n (clicked)=\"onLogoClicked()\" \r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n></div>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewInit, model, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\nconst DEFAULT_POSITION_LEFT = 355;\r\nconst DEFAULT_POSITION_TOP = 355;\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-hide-objects',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n TranslateModule\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-hide-objects.component.html',\r\n styleUrl: './bimplus-floating-bar-hide-objects.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusFloatingBarHideObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit {\r\n private readonly element = inject(ElementRef);\r\n\r\n \r\n @Output() actionClicked = new EventEmitter<string>();\r\n @Input() noBody: boolean = true; \r\n @Input() isFocused: boolean = true;\r\n\r\n items = model<FloatingBarItem[]>([]);\r\n\r\n protected layoutManagerService: LayoutManagerService;\r\n\r\n componentId = 'hide-menu-fp-id'\r\n icon = 'ui-icon-hide-menu';\r\n title: string = \"\"; // no tooltip info on Logo icon\r\n focusSelectorId: string = 'hide-menu-id';\r\n\r\n constructor(){\r\n const layoutManagerService = inject(LayoutManagerService);\r\n\r\n super();\r\n this.layoutManagerService = layoutManagerService;\r\n }\r\n \r\n ngAfterViewInit() {\r\n // Subscribe to the observable\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP); \r\n } \r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"hide-menu-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"hide-menu\"\r\n [noBody]=\"noBody\"\r\n [isFocused]=\"isFocused\"\r\n [resizeEnabled]=\"false\"\r\n [focusSelector]=\"focusSelectorId\"\r\n [isVisible]=\"true\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\" \r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [icon]=\"icon\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [parentId] = \"componentId\"\r\n class=\"floating-bar-header-content\"\r\n [items]=\"items()\" \r\n (actionClicked)=\"actionClicked.emit($event)\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\" \r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n</lib-bimplus-floating-bar>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewChecked, ChangeDetectorRef, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { LayoutManagerService} from '../../services/layout-manager.service';\r\n\r\nconst DEFAULT_POSITION_LEFT =355;\r\nconst DEFAULT_POSITION_TOP = 320;\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-isolation-objects',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n TranslateModule\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-isolation-objects.component.html',\r\n styleUrl: './bimplus-floating-bar-isolation-objects.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusFloatingBarIsolationObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private element = inject(ElementRef);\r\n private cdr = inject(ChangeDetectorRef);\r\n\r\n constructor(){\r\n super();\r\n }\r\n private hasViewChecked: boolean = false;\r\n\r\n \r\n @Output() actionClicked = new EventEmitter<string>();\r\n\r\n @Input() noBody: boolean = true;\r\n @Input() isFocused: boolean = true;\r\n\r\n // Items for the header content sub component\r\n @Input() items: Array<FloatingBarItem> = [];\r\n\r\n icon = 'ui-icon-isolation-menu';\r\n title: string = \"\"; // no tooltip info on Logo icon\r\n focusSelectorId: string = 'isolation-menu-id';\r\n componentId = 'isolation-menu-fp-id';\r\n \r\n ngAfterViewInit(){\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP,); \r\n }\r\n\r\n ngAfterViewChecked() {\r\n if (!this.hasViewChecked) {\r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true); \r\n });\r\n }\r\n }\r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"isolation-menu-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"isolation-menu\"\r\n [noBody]=\"noBody\"\r\n [isFocused]=\"isFocused\"\r\n [resizeEnabled]=\"false\"\r\n [focusSelector]=\"focusSelectorId\"\r\n [isVisible]=\"true\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [icon]=\"icon\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [parentId] = \"componentId\" \r\n class=\"floating-bar-header-content\"\r\n [items]=\"items\"\r\n (actionClicked)=\"actionClicked.emit($event)\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\"\r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n</lib-bimplus-floating-bar>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-body',\r\n imports: [\r\n CommonModule,\r\n TranslateModule,\r\n ],\r\n templateUrl: './bimplus-floating-bar-body.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-body.component.less'\r\n})\r\nexport class BimplusFloatingBarBodyComponent extends BimplusLocalizedWidgetComponent implements OnInit{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId: string = '';\r\n \r\n ngOnInit(){\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n })\r\n }\r\n}\r\n\r\n\r\n","<div\r\n libDraggable\r\n class=\"floating-panel__body\"\r\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, input, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { ProjectNavigatorModel, ProjectNavigatorLayer } from './project-models.interface';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\n\r\n@Component({\r\n selector: 'lib-project-models',\r\n imports: [\r\n CommonModule,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n TranslateModule,\r\n ],\r\n templateUrl: './project-models.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './project-models.component.less'\r\n})\r\nexport class ProjectModelsComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() modelTreeRootTitle: string = \"_Divisions\";\r\n @Input() modelTreeRootName: string = \"_Divisions\";\r\n\r\n @Input() expandedModelTree: boolean = false;\r\n\r\n models = input<ProjectNavigatorModel[]>([]);\r\n\r\n @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n\r\n @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n\r\n @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n}\r\n","<lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedModelTree\"\r\n >\r\n <lib-expansion-panel-header [title]=\"modelTreeRootTitle\">\r\n <span class=\"project-navigator-root-node\">{{\r\n modelTreeRootName | translate\r\n }}</span>\r\n <lib-expansion-panel-header-actions>\r\n <!-- no action buttons for root -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Show all models also as expansion panels -->\r\n <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\r\n @for(model of models(); track model) {\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"model.isExpanded\"\r\n >\r\n <lib-expansion-panel-header>\r\n <span\r\n class=\"project-navigator-model-node\"\r\n [ngClass]=\"{\r\n visible: model.isVisible\r\n }\"\r\n [title]=\"model.name + ' (Rev: ' + model.currentRevision + ')'\"\r\n (click)=\"clickedModel.emit(model)\"\r\n (keypress)=\"clickedModel.emit(model)\"\r\n >\r\n {{ model.name }}\r\n </span>\r\n\r\n <lib-expansion-panel-header-actions>\r\n <div\r\n [attr.data-test]=\"'toggle_opacity_model_' + model.id\"\r\n class=\"ui-icon-transparency project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n opaque: model.isOpaque,\r\n transparent: !model.isOpaque,\r\n semiopaque: model.isSemiOpaque,\r\n }\"\r\n [title]=\"'_Toggle opacity' | translate\"\r\n (click)=\"toggleOpacityOfModel.emit(model)\"\r\n (keypress)=\"toggleOpacityOfModel.emit(model)\"\r\n ></div>\r\n\r\n <div\r\n [attr.data-test]=\"'toggle_visibility_model_' + model.id\"\r\n class=\"ui-icon-visibility project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: model.isVisible,\r\n invisible: !model.isVisible,\r\n semivisible: model.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityOfModel.emit(model)\"\r\n (keypress)=\"toggleVisibilityOfModel.emit(model)\"\r\n ></div>\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Content of panel -->\r\n @for (layer of model.layers; track layer) {\r\n <div\r\n class=\"project-navigator-layer-node\"\r\n >\r\n <div\r\n class=\"project-navigator-layer-node-name\"\r\n [attr.data-test]=\"'floating_bar_layer' + layer.id\"\r\n [ngClass]=\"{\r\n visible: layer.isVisible\r\n }\"\r\n [title]=\"layer.name | translate\"\r\n (click)=\"clickedLayer.emit(layer)\"\r\n (keypress)=\"clickedLayer.emit(layer)\"\r\n >\r\n {{ layer.name | translate }}\r\n </div>\r\n <div\r\n [attr.data-test]=\"'toggle_opacity_layer_' + layer.id\"\r\n class=\"ui-icon-transparency project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n opaque: layer.isOpaque,\r\n transparent: !layer.isOpaque\r\n }\"\r\n [title]=\"'_Toggle opacity' | translate\"\r\n (click)=\"toggleOpacityOfLayer.emit(layer)\"\r\n (keypress)=\"toggleOpacityOfLayer.emit(layer)\"\r\n ></div>\r\n <div\r\n [attr.data-test]=\"'toggle_visibility_layer_' + layer.id\"\r\n class=\"ui-icon-visibility project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: layer.isVisible,\r\n invisible: !layer.isVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityOfLayer.emit(layer)\"\r\n (keypress)=\"toggleVisibilityOfLayer.emit(layer)\"\r\n ></div>\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n }\r\n</lib-expansion-panel>\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-panel-toolbar',\r\n imports: [CommonModule],\r\n templateUrl: './bimplus-panel-toolbar.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-panel-toolbar.component.less'\r\n})\r\nexport class BimplusPanelToolbarComponent {\r\n @Input() isPanelToolbarVisible: boolean = false;\r\n}\r\n","<div class=\"panel-toolbar\"\r\n [ngClass]=\"!isPanelToolbarVisible ? 'hidden' : ''\"\r\n>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewChecked, AfterViewInit, ChangeDetectorRef, inject, DestroyRef, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { BimplusFloatingBarBodyComponent } from '../bimplus-floating-bar-body/bimplus-floating-bar-body.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { ProjectNavigatorModel, ProjectNavigatorLayer, ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { ProjectModelsComponent } from '../project-models/project-models.component';\r\nimport { BimplusPanelToolbarComponent } from '../bimplus-panel-toolbar/bimplus-panel-toolbar.component';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\nconst DEFAULT_POSITION_LEFT = 355;\r\nconst DEFAULT_POSITION_TOP =20;\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-project-navigator',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n BimplusFloatingBarBodyComponent,\r\n BimplusPanelToolbarComponent,\r\n ProjectModelsComponent,\r\n TranslateModule,\r\n BimplusScrollableContainerComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-project-navigator.component.html',\r\n styleUrl: './bimplus-floating-bar-project-navigator.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusFloatingBarProjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked {\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n private readonly element = inject(ElementRef);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n private hasViewChecked: boolean = false;\r\n \r\n\r\n // General bar handling\r\n @Input() noBody: boolean = false; // Project navigator has a body\r\n @Input() isCollapsed: boolean = false;\r\n @Input() noModelsMessage: string | undefined = undefined;\r\n @Input() isLoading: boolean = false;\r\n @Input() loadingDataMessage: string | undefined = undefined;\r\n \r\n icon = 'ui-icon-project-navigator';\r\n title: string = '_Project_navigator';\r\n componentId = 'project-navigator-fp-id';\r\n // Header content (like IFC export button)\r\n @Input() items: Array<FloatingBarItem> = [];\r\n\r\n @Output() actionClicked = new EventEmitter<string>();\r\n\r\n // Body content\r\n @Input() isPanelToolbarVisible: boolean = false;\r\n @Input() expandedModelTree: boolean = false;\r\n @Input() project: ProjectNavigatorProject = { id: \"\", name: \"\", teamSlug: \"\", models: [] };\r\n @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() logoClicked = new EventEmitter<MouseEvent>(); \r\n destroyRef = inject(DestroyRef)\r\n\r\n ngAfterViewInit(){\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\r\n \r\n this.layoutManagerService.registeredItems$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({next:(items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.componentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n },complete: () => console.log('completed')});\r\n }\r\n // #region General bar handling \r\n\r\n ngAfterViewChecked() {\r\n //if (!this.hasViewChecked && !this.isCollapsed) {\r\n if (!this.hasViewChecked) { \r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true);\r\n });\r\n }\r\n }\r\n // #endregion\r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"project-navigator-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"project-navigator-fp floating-panel\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [noBody]=\"noBody\" \r\n [resizeEnabled]=\"true\"\r\n [isVisible]=\"true\" \r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [icon]=\"icon\"\r\n [title]=\"title\" \r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n class=\"floating-bar-header-content\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [items]=\"items\"\r\n (actionClicked)=\"actionClicked.emit($event)\" \r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\"\r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n\r\n <lib-bimplus-floating-bar-body\r\n class=\"floating-bar-body\"\r\n [parentId] = \"componentId\"\r\n >\r\n <lib-bimplus-panel-toolbar\r\n [isPanelToolbarVisible]=\"isPanelToolbarVisible\"\r\n ></lib-bimplus-panel-toolbar>\r\n\r\n @if(isLoading && loadingDataMessage){\r\n <span class=\"inline-message\" [innerHtml]=\"loadingDataMessage | translate\"></span>\r\n }\r\n @else{ \r\n @if(project.models.length === 0 && noModelsMessage){\r\n <span class=\"inline-message\" [innerHtml]=\"noModelsMessage | translate\"></span>\r\n }@else{\r\n <lib-bimplus-scrollable-container>\r\n <lib-project-models\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [models]=\"project.models\"\r\n [modelTreeRootTitle]=\"project.name + ' - ' + project.teamSlug\"\r\n [expandedModelTree]=\"expandedModelTree\"\r\n (clickedModel)=\"clickedModel.emit($event)\"\r\n (clickedLayer)=\"clickedLayer.emit($event)\"\r\n (toggleOpacityOfModel)=\"toggleOpacityOfModel.emit($event)\"\r\n (toggleOpacityOfLayer)=\"toggleOpacityOfLayer.emit($event)\"\r\n (toggleVisibilityOfModel)=\"toggleVisibilityOfModel.emit($event)\"\r\n (toggleVisibilityOfLayer)=\"toggleVisibilityOfLayer.emit($event)\"\r\n >\r\n </lib-project-models>\r\n </lib-bimplus-scrollable-container>\r\n }\r\n }\r\n </lib-bimplus-floating-bar-body>\r\n</lib-bimplus-floating-bar>\r\n","import { Component, EventEmitter, input, Output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-message',\r\n templateUrl: './bimplus-overlay-message.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-overlay-message.component.less'\r\n})\r\nexport class BimplusOverlayMessageComponent {\r\n title = input<string>(\"\");\r\n message = input<string>(\"\");\r\n\r\n @Output() closeMessage = new EventEmitter<void>();\r\n\r\n closeButton() {\r\n this.closeMessage.emit();\r\n // (document.activeElement as HTMLElement)?.blur(); // Remove focus of active element\r\n }\r\n\r\n closeKeypressed(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.closeMessage.emit();\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"bimplus-overlay-message\">\r\n <div class=\"overlay-dialog-container\">\r\n <div class=\"header\">\r\n\r\n <div class=\"icon\"></div>\r\n\r\n @if (title(); as title) {\r\n <div class=\"title-text\">\r\n {{ title }}\r\n </div>\r\n }\r\n\r\n <button\r\n class=\"close-button\"\r\n (click)=\"closeButton()\"\r\n tabindex=\"0\"\r\n (keydown)=\"closeKeypressed($event)\">\r\n </button>\r\n\r\n </div>\r\n\r\n <div class=\"content\">\r\n @if (message(); as message) {\r\n <div class=\"text\" [innerHTML]=\"message\">\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'pxsuffix',\r\n standalone: true\r\n})\r\nexport class PxsuffixPipe implements PipeTransform {\r\n\r\n transform(input: number): string{ //string type\r\n return input + 'px';\r\n } \r\n\r\n}\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n selector: '[xDraggable]',\r\n standalone: true\r\n})\r\nexport class XDraggableDirective {\r\n\r\n oldX = 0;\r\n isDragging = false;\r\n wasDragging = false;\r\n isMouseDown = false;\r\n\r\n @Output()\r\n dragging = new EventEmitter<number>();\r\n\r\n @Output()\r\n clicked = new EventEmitter<MouseEvent>();\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging && !this.isMouseDown) {\r\n return;\r\n }\r\n\r\n const deltaX = (event.clientX - this.oldX);\r\n\r\n if(!this.isDragging){\r\n if(Math.abs(deltaX) > 2){\r\n this.isDragging = true;\r\n this.wasDragging = true;\r\n }else{\r\n return;\r\n }\r\n }\r\n\r\n fireEvent(this, \"dragging\", deltaX);\r\n\r\n this.oldX = event.clientX;\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n this.isDragging = false;\r\n this.isMouseDown = false;\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n this.isMouseDown = true;\r\n this.wasDragging = false;\r\n this.oldX = event.clientX;\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onMouseClick(event: MouseEvent) {\r\n if(!this.wasDragging){\r\n fireEvent(this, \"clicked\", event);\r\n }\r\n }\r\n\r\n}\r\n","import { Component, Output, EventEmitter, ViewEncapsulation, signal, input, effect, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\r\nimport { XDraggableDirective } from '../../directives/x-draggable.directive'\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\nexport interface SidenavItem {\r\n id: string;\r\n icon?: string;\r\n iconActive?: string;\r\n iconDisabled?: string;\r\n text: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-sidenav',\r\n imports: [CommonModule, PxsuffixPipe, XDraggableDirective, TranslateModule],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-sidenav.component.html',\r\n styleUrl: './bimplus-sidenav.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusSidenavComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n // #region public fields\r\n readonly activeItem = signal<string>('');\r\n readonly drawerWidth = signal<number>(300);\r\n readonly drawerExpanded = signal(true);\r\n\r\n @Output() activeItemChanged = new EventEmitter<string>();\r\n @Output() actionClicked = new EventEmitter<string>();\r\n @Output() footerClicked = new EventEmitter<string>();\r\n\r\n items = input<SidenavItem[]>([]);\r\n // we need to wait for the items before we can activate the first item, this is instead of using a lifecycle methods (ngOnInit) or set\r\n private readonly activateItemEffectRef = effect(() => {\r\n if (this.items().length) {\r\n this._activateItem(this.items()[0].id);\r\n // if there is first item, we need to manually destroy this effect to prevent call it again\r\n this.activateItemEffectRef.destroy();\r\n }\r\n }, { manualCleanup: true })\r\n actionItems = input<SidenavItem[]>([]);\r\n footerItem = input<SidenavItem | null>(null);\r\n\r\n\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n _activateItem(item: string) {\r\n this.activeItem.set(item);\r\n const foundItem = this.items().find(x => x.id == item);\r\n if (!foundItem) {\r\n return;\r\n }\r\n\r\n if (!this.drawerExpanded()) {\r\n this._toggleDrawer();\r\n }\r\n fireEvent(this, \"activeItemChanged\", item);\r\n }\r\n\r\n _clickAction(item: string) {\r\n fireEvent(this, \"actionClicked\", item);\r\n }\r\n\r\n _clickFooter(item: string) {\r\n fireEvent(this, \"footerClicked\", item);\r\n }\r\n\r\n _toggleDrawer() {\r\n this.drawerExpanded.update(value => !value);\r\n }\r\n\r\n _onResizeWidth(event: number): void {\r\n const deltaX = event;\r\n this.drawerWidth.update(value => (value + deltaX));\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"sidenav\">\r\n @for (sideNavItem of items(); track sideNavItem) {\r\n <div class=\"sidenav-row\">\r\n @if (sideNavItem.disabled) {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.iconDisabled + ')'\r\n \"\r\n [title]=\"sideNavItem.text | translate\"\r\n (keypress)=\"_toggleDrawer()\"\r\n ></div>\r\n } @else { @if (activeItem() === sideNavItem.id) {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.iconActive + ')'\r\n \"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n [title]=\"sideNavItem.text | translate\"\r\n ></div>\r\n } @else {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.icon + ')'\r\n \"\r\n (click)=\"_activateItem(sideNavItem.id)\"\r\n (keypress)=\"_activateItem(sideNavItem.id)\"\r\n [title]=\"sideNavItem.text | translate\"\r\n ></div>\r\n } }\r\n </div>\r\n } @if (actionItems().length) {\r\n <div class=\"sidenav-separator\"></div>\r\n @for(actionItem of actionItems(); track actionItem) {\r\n <div class=\"sidenav-row\">\r\n <div\r\n [attr.data-test]=\"'sidenav_action_item_' + actionItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + actionItem.icon + ')'\r\n \"\r\n (click)=\"_clickAction(actionItem.id)\"\r\n (keypress)=\"_clickAction(actionItem.id)\"\r\n [title]=\"actionItem.text | translate\"\r\n ></div>\r\n </div>\r\n } } @if (footerItem(); as footerItem) {\r\n <div class=\"sidenav-row-footer\">\r\n <div\r\n [attr.data-test]=\"'sidenav_footer_item_' + footerItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + footerItem.icon + ')'\r\n \"\r\n (click)=\"_clickFooter(footerItem.id)\"\r\n (keypress)=\"_clickFooter(footerItem.id)\"\r\n ></div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"sidenav-drawer\"\r\n [style.width]=\"drawerWidth() | pxsuffix\"\r\n [ngClass]=\"drawerExpanded() ? '' : 'hidden'\"\r\n>\r\n <slot></slot>\r\n @if (drawerExpanded()) {\r\n <div\r\n xDraggable\r\n class=\"sidenav-resize-border-right\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n ></div>\r\n <div\r\n xDraggable\r\n data-test=\"sidenav-resize-handle\"\r\n class=\"sidenav-resize-handle-left\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n (clicked)=\"_toggleDrawer()\"\r\n ></div>\r\n }\r\n</div>\r\n@if (!drawerExpanded()) {\r\n<div\r\n data-test=\"sidenav-resize-handle\"\r\n class=\"sidenav-resize-handle-left collapsed\"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n></div>\r\n}\r\n","import { ToolHubVisualSettings, ToolHubItemUnits } from './bimplus-tool-hub.interface';\r\n\r\nconst RAD_DEG : number = Math.PI / 180.0;\r\nconst PI2 : number = 2 * Math.PI;\r\n\r\n\r\nexport class SVGGenerator {\r\n\r\n // Constants for drawing arc\r\n /**\r\n * @param {Array.<Number>} center\r\n * @param {Number} R\r\n * @param {Number} angle\r\n * @return {Array.<Number>}\r\n */\r\n static pointOnArc(center: [number,number], R: number, angle: number) : [number, number] {\r\n const radians = (angle - 90) * RAD_DEG;\r\n\r\n return [center[0] + R * Math.cos(radians), center[1] + R * Math.sin(radians)];\r\n }\r\n\r\n /**\r\n * Generates arc path\r\n *\r\n * @param {Array.<Number>} center\r\n * @param {Number} radius\r\n * @param {Number} start\r\n * @param {Number} end\r\n * @param {Number} width\r\n * @param {Number} corner Corner radius\r\n * @param {Number} canvasWidth - Divisor to have svg with range 0 to 1\r\n *\r\n * @return {String|Array.<Number|String>}\r\n */\r\n static arc(center: [number,number], radius: number, start: number, end: number, width: number, corner: number, canvasWidth: number) : string {\r\n\r\n const innerR = radius - width;\r\n const circumference = Math.abs(end - start);\r\n corner = Math.min(width / 2, corner);\r\n\r\n if (360 * (corner / (Math.PI * (radius - width))) > Math.abs(start - end)) {\r\n corner = circumference / 360 * innerR * Math.PI;\r\n }\r\n\r\n // inner and outer radiuses\r\n const innerR2 = innerR + corner;\r\n const outerRadius = radius - corner;\r\n\r\n // butts corner points\r\n const oStart = this.pointOnArc(center, outerRadius, start);\r\n const oEnd = this.pointOnArc(center, outerRadius, end);\r\n\r\n const iStart = this.pointOnArc(center, innerR2, start);\r\n const iEnd = this.pointOnArc(center, innerR2, end);\r\n\r\n const iSection = 360 * (corner / (PI2 * innerR));\r\n const oSection = 360 * (corner / (PI2 * radius));\r\n\r\n // arcs endpoints\r\n const iArcStart = this.pointOnArc(center, innerR, start + iSection);\r\n const iArcEnd = this.pointOnArc(center, innerR, end - iSection);\r\n\r\n const oArcStart = this.pointOnArc(center, radius, start + oSection);\r\n const oArcEnd = this.pointOnArc(center, radius, end - oSection);\r\n\r\n const arcSweep1 = circumference > 180 + 2 * oSection ? 1 : 0;\r\n const arcSweep2 = circumference > 180 + 2 * iSection ? 1 : 0;\r\n\r\n const points : Array<string> = new Array<string>(\r\n // begin path\r\n \"M\", (oStart[0] / canvasWidth).toString(), (oStart[1] / canvasWidth).toString(),\r\n // outer start corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oArcStart[0] / canvasWidth).toString(), (oArcStart[1] / canvasWidth).toString(),\r\n // outer main arc\r\n \"A\", (radius / canvasWidth).toString(), (radius / canvasWidth).toString(), \"0\", (arcSweep1 / canvasWidth).toString(), \"1\", (oArcEnd[0] / canvasWidth).toString(), (oArcEnd[1] / canvasWidth).toString(),\r\n // outer end corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oEnd[0] / canvasWidth).toString(), (oEnd[1] / canvasWidth).toString(),\r\n // end butt\r\n \"L\", (iEnd[0] / canvasWidth).toString(), (iEnd[1] / canvasWidth).toString(),\r\n // inner end corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iArcEnd[0] / canvasWidth).toString(), (iArcEnd[1] / canvasWidth).toString(),\r\n // inner arc\r\n \"A\", (innerR / canvasWidth).toString(), (innerR / canvasWidth).toString(), \"0\", (arcSweep2 / canvasWidth).toString(), \"0\", (iArcStart[0] / canvasWidth).toString(), (iArcStart[1] / canvasWidth).toString(),\r\n // inner start corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iStart[0] / canvasWidth).toString(), (iStart[1] / canvasWidth).toString(), \"Z\" // end path*/\r\n );\r\n\r\n return points.join(' ');\r\n }\r\n\r\n /*\r\n * svg units - when \"objectBoundingBox\" is applied, coordinates are relative,\r\n * use coordinates as ratio (in range 0-1),\r\n * f.e. (1,1) is botom right corner of element\r\n */\r\n static drawMenuItemSvg(svgRadius: number, svgRadiusInner: number, buttonsLength: number, isEMEmbedded: boolean): ToolHubItemUnits {\r\n \r\n const radius = isEMEmbedded ? (svgRadius - 5) * 10 : svgRadius * 10;\r\n const radiusInner = isEMEmbedded ? (svgRadiusInner - 3) * 10 : svgRadiusInner * 10;\r\n const width = radius * 2;\r\n // coordinates of points describing one item on menu\r\n const angle = 360 / ((buttonsLength > 0) ? buttonsLength : 1);\r\n const halfAngleRadians = (angle * Math.PI) / 360;\r\n const leftX = radius - Math.sin(halfAngleRadians) * radius;\r\n const leftY = radius - Math.cos(halfAngleRadians) * radius;\r\n const rightX = radius + Math.sin(halfAngleRadians) * radius;\r\n const rightY = radius - Math.cos(halfAngleRadians) * radius;\r\n \r\n \r\n return {\r\n radius: radius / width,\r\n radiusInner: radiusInner / width,\r\n width: 1,\r\n thick: (radius - radiusInner) / width,\r\n innerEdgeRight: (radius + radiusInner) / width,\r\n leftX: leftX / width,\r\n leftY: leftY / width,\r\n rightX: rightX / width,\r\n rightY: rightY / width\r\n };\r\n }\r\n\r\n \r\n static generateAnnularSector(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\r\n settings.subMenuRadius * multiplier,\r\n settings.subMenuStartAngle,\r\n settings.subMenuEndAngle,\r\n settings.subMenuWidth,\r\n 7,\r\n 425\r\n );\r\n }\r\n\r\n static generateAnnularSectorBorder(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\r\n (settings.subMenuRadius * multiplier) + 1,\r\n settings.subMenuStartAngle - 0.5,\r\n settings.subMenuEndAngle + 0.5,\r\n settings.subMenuWidth + 2,\r\n 7,\r\n 425\r\n );\r\n }\r\n\r\n static generateDeadZoneAnnularSector(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.deadZoneCenter[0] * multiplier, settings.deadZoneCenter[1] * multiplier],\r\n (settings.deadZoneRadius) * multiplier,\r\n settings.deadZoneStartAngle,\r\n settings.deadZoneEndAngle,\r\n settings.deadZoneWidth,\r\n 7,\r\n 700);\r\n }\r\n\r\n static getSVGViewBox(units : ToolHubItemUnits):string{\r\n return `0 0 ${units.width} ${units.width}`;\r\n }\r\n\r\n static getSVGCenterMenuPath(units : ToolHubItemUnits):string{\r\n return `M 0 ${units.radius} A ${units.radius} ${units.radius} 0 0 1 ${units.width} ${units.radius} L ${units.width} ${units.radius} A ${units.radius} ${units.radius} 0 0 1 0 ${units.radius} L ${units.thick} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.innerEdgeRight} ${units.radius} L ${units.innerEdgeRight} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.thick} ${units.radius} Z`;\r\n }\r\n\r\n static getSVGCenterMenuItemPath(units : ToolHubItemUnits):string{\r\n return `M ${units.radius} ${units.radius} L ${units.leftX} ${units.leftY} A ${units.radius} ${units.radius} 0 0 1 ${units.rightX} ${units.rightY} L ${units.rightX} ${units.rightY} L ${units.radius} ${units.radius} Z`;\r\n }\r\n\r\n static getSVGCenterSubMenuItemPath(subMenuUnits : ToolHubItemUnits):string{\r\n return `M ${subMenuUnits.radius} ${subMenuUnits.radius} L ${subMenuUnits.leftX} ${subMenuUnits.leftY} A ${subMenuUnits.radius} ${subMenuUnits.radius} 0 0 1 ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.radius} ${subMenuUnits.radius} Z`;\r\n }\r\n\r\n}\r\n","import { Component, HostBinding, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n selector: 'lib-tool-hub-item',\r\n imports: [CommonModule],\r\n templateUrl: './tool-hub-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubItemComponent {\r\n @Input()\r\n item : ToolHubItem | null = null;\r\n \r\n @HostBinding('class.active')\r\n @Input() \r\n active : boolean = false;\r\n \r\n @HostBinding('class.enabled')\r\n @Input() \r\n isEnabled : boolean = true;\r\n \r\n @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n}\r\n","@if (item) {\n<div class=\"centermenu-button-icon dragger\" [ngClass]=\"{\r\n 'disabled' : !isEnabled,\r\n 'enabled' : isEnabled,\r\n 'active' : active\r\n }\" [className]=\"item.iconClass\">\r\n <span class=\"centermenu-button-text\">{{item.text}}</span>\n </div>\n}","import { Component, HostBinding, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubSubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n selector: 'lib-tool-hub-sub-item',\r\n imports: [CommonModule],\r\n templateUrl: './tool-hub-sub-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubSubItemComponent {\r\n @Input() item : ToolHubSubItem | null = null;\r\n \r\n @HostBinding('class.active')\r\n @Input() \r\n active : boolean = false;\r\n \r\n @HostBinding('class.enabled')\r\n @Input() \r\n isEnabled : boolean = true;\r\n\r\n @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n @HostBinding('class.center-sub-menu-button') centerSubMenuButtonClass: boolean = true;\r\n}\r\n","@if (item) {\n <div\n class=\"center-sub-menu-button-icon\"\n [ngClass]=\"{\r\n disabled: !isEnabled,\r\n enabled: isEnabled,\r\n active: item.type !== 'separator' && active\r\n }\"\r\n [className]=\"item.iconClass\"\n >\n <span class=\"centermenu-button-text\">{{ item.text }}</span>\n </div>\n}\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, booleanAttribute, ElementRef, OnInit, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { SVGGenerator } from './svg-generator';\r\nimport { ToolHubItemComponent } from './tool-hub-item/tool-hub-item.component';\r\nimport { ToolHubSubItemComponent } from './tool-hub-sub-item/tool-hub-sub-item.component';\r\nimport { DraggableDirective } from '../../directives/draggable.directive'\r\nimport { ToolHubItem, ToolHubSubItem, ToolHubVisualSettings, ToolHubItemUnits, ToolHubItemStates } from './bimplus-tool-hub.interface';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../../services/resize-observer.service';\r\n\r\nfunction createDefaultVisualSettings(): ToolHubVisualSettings {\r\n const settings: ToolHubVisualSettings = {\r\n subMenuStartAngle: 40,\r\n subMenuEndAngle: 140,\r\n svgRadiusInner: 5.75,\r\n svgRadius: 10.25,\r\n subMenuCenter: [17.25, 17.5],\r\n subMenuRadius: 15.5,\r\n subMenuWidth: 52,\r\n deadZoneCenter: [17, 18],\r\n deadZoneWidth: 140,\r\n deadZoneRadius: 22,\r\n deadZoneStartAngle: 35,\r\n deadZoneEndAngle: 145\r\n }\r\n return settings;\r\n}\r\n\r\n// Use when implementing embedded mode\r\n// function createEmbeddedSettings() : ToolHubVisualSettings{\r\n// const settings : ToolHubVisualSettings = {\r\n// subMenuStartAngle : 40,\r\n// subMenuEndAngle : 140,\r\n// svgRadiusInner : 4,\r\n// svgRadius : 7.25,\r\n// subMenuCenter : [17.25, 17.3],\r\n// subMenuRadius : 16.2,\r\n// subMenuWidth : 62,\r\n// deadZoneCenter : [16.5, 16],\r\n// deadZoneWidth : 120,\r\n// deadZoneRadius : 18,\r\n// deadZoneStartAngle : 35,\r\n// deadZoneEndAngle : 145\r\n// }\r\n// return settings;\r\n// }\r\n\r\nfunction createDefaultItems(): Array<ToolHubItem> {\r\n const items: Array<ToolHubItem> = [\r\n //--- create task ---------------------------------------------------\r\n {\r\n buttonId: 'cmButCreateTask',\r\n iconClass: 'ui-icon-create-task',\r\n text: '_Create_issue_center_menu_tooltip',\r\n tooltip: '_Create_issue_center_menu_tooltip',\r\n tooltipDisabled: '_Create_issue_center_menu_tooltip',\r\n },\r\n\r\n //--- quantity takeoff ---------------------------------------------------\r\n {\r\n buttonId: 'cmButQuantityTakeOff',\r\n iconClass: 'ui-icon-quantity-take-off',\r\n text: '_Quantity_take_Off_center_menu_tooltip',\r\n tooltip: '_Quantity_take_Off_center_menu_tooltip',\r\n tooltipDisabled: '_Quantity_take_Off_center_menu_tooltip',\r\n },\r\n\r\n //--- markup ---------------------------------------------------\r\n {\r\n buttonId: 'cmButMarkup',\r\n iconClass: 'ui-icon-markup',\r\n text: '_Markups_center_menu_tooltip',\r\n tooltip: '_Markups_center_menu_tooltip',\r\n tooltipDisabled: '_Markups_center_menu_tooltip',\r\n },\r\n\r\n //--- section ---------------------------------------------------\r\n {\r\n buttonId: 'cmButSection',\r\n iconClass: 'ui-icon-section',\r\n text: '_Sectioning_center_menu_tooltip',\r\n tooltip: '_Sectioning_center_menu_tooltip',\r\n tooltipDisabled: '_Sectioning_center_menu_tooltip',\r\n },\r\n\r\n //--- hide ---------------------------------------------------\r\n {\r\n buttonId: 'cmButObjTranspMenu',\r\n iconClass: 'ui-icon-obj-transp',\r\n text: '_Hide_objects_center_menu_tooltip',\r\n tooltip: '_Hide_objects_center_menu_tooltip',\r\n tooltipDisabled: '_Hide_objects_center_menu_tooltip',\r\n },\r\n\r\n //--- isolate ---------------------------------------------------\r\n {\r\n buttonId: 'cmButObjSel',\r\n iconClass: 'ui-icon-obj-select',\r\n text: '_Isolate_objects_center_menu_tooltip',\r\n tooltip: '_Isolate_objects_center_menu_tooltip',\r\n tooltipDisabled: '_Isolate_objects_center_menu_tooltip',\r\n },\r\n\r\n //--- navigation map ---------------------------------------------------\r\n {\r\n buttonId: 'cmButNavigationMap',\r\n iconClass: 'ui-icon-navigation-map',\r\n text: '_Navigation_nap_center_menu_tooltip',\r\n tooltip: '_Navigation_nap_center_menu_tooltip',\r\n tooltipDisabled: '_Navigation_nap_center_menu_tooltip',\r\n },\r\n\r\n //--- fullscreen ----------------------------------------------\r\n {\r\n buttonId: 'cmButFullScreen',\r\n iconClass: 'ui-icon-fullscreen',\r\n text: '_Fullscreen_node_center_menu_tooltip',\r\n tooltip: '_Fullscreen_node_center_menu_tooltip',\r\n tooltipDisabled: '_Fullscreen_node_center_menu_tooltip',\r\n },\r\n\r\n //--- project navigator ---------------------------------------\r\n {\r\n buttonId: 'cmButProjectNavigator',\r\n iconClass: 'ui-icon-project-navigator',\r\n text: '_Project_navigator_center_menu_tooltip',\r\n tooltip: '_Project_navigator_center_menu_tooltip',\r\n tooltipDisabled: '_Project_navigator_center_menu_tooltip',\r\n },\r\n\r\n //--- reset ---------------------------------------------------\r\n {\r\n iconClass: 'ui-icon-obj-reset',\r\n buttonId: 'cmButResetObj',\r\n text: '_Reset_viewport_center_menu_tooltip',\r\n tooltip: '_Reset_viewport_center_menu_tooltip',\r\n tooltipDisabled: '_Reset_viewport_center_menu_tooltip',\r\n },\r\n\r\n //--- view ---------------------------------------------------\r\n {\r\n buttonId: 'cmButResetVp',\r\n iconClass: 'ui-icon-reset-vp',\r\n text: '_Select_view_center_menu_tooltip',\r\n tooltip: '_Select_view_center_menu_tooltip',\r\n tooltipDisabled: '_Select_view_center_menu_tooltip',\r\n subMenuId: 'cmb-view-submenu',\r\n subItems: [\r\n //--- Front View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButFrontView',\r\n type: 'button',\r\n iconClass: 'ui-icon-front-view',\r\n text: '_Front_view_center_menu_tooltip',\r\n tooltip: '_Front_view_center_menu_tooltip',\r\n tooltipDisabled: '_Front_view_center_menu_tooltip',\r\n actionClick: 'centerMenuFrontViewClick',\r\n },\r\n //--- Top View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButTopView',\r\n type: 'button',\r\n iconClass: 'ui-icon-top-view',\r\n text: '_Top_view_center_menu_tooltip',\r\n tooltip: '_Top_view_center_menu_tooltip',\r\n tooltipDisabled: '_Top_view_center_menu_tooltip',\r\n actionClick: 'centerMenuTopViewClick',\r\n },\r\n //--- Side View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButSideView',\r\n type: 'button',\r\n iconClass: 'ui-icon-side-view',\r\n text: '_Side_view_center_menu_tooltip',\r\n tooltip: '_Side_view_center_menu_tooltip',\r\n tooltipDisabled: '_Side_view_center_menu_tooltip',\r\n actionClick: 'centerMenuSideViewClick',\r\n },\r\n //--- Perspective View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButPerspectiveView',\r\n type: 'button',\r\n iconClass: 'ui-icon-perspective-view',\r\n text: '_Perspective_view_center_menu_tooltip',\r\n tooltip: '_Perspective_view_center_menu_tooltip',\r\n tooltipDisabled: '_Perspective_view_center_menu_tooltip',\r\n actionClick: 'centerMenuPerspectiveViewClick',\r\n },\r\n //--- Separator ---------------------------------------------------\r\n {\r\n buttonId: 'toolhubSubmenuSeparatorId1',\r\n type: 'separator',\r\n iconClass: 'center-sub-menu-button-icon toolhub-submenu-separator',\r\n text: '',\r\n tooltip: '',\r\n tooltipDisabled: '',\r\n actionClick: '',\r\n },\r\n //--- Toggle button perspective/orthogonal projection --------------------\r\n {\r\n buttonId: 'cmButToggleProjection',\r\n type: 'button',\r\n iconClass: 'ui-icon-orthographic-camera-projection',\r\n text: '_Orthographic_projection_center_menu_tooltip',\r\n tooltip: '_Orthographic_projection_center_menu_tooltip',\r\n tooltipDisabled: '_Orthographic_projection_center_menu_tooltip',\r\n actionClick: 'centerMenuToggleProjection',\r\n },\r\n ]\r\n }\r\n ]\r\n\r\n // Set all tool hub items states to inactive and disabled. Host App must define states\r\n items.forEach(item => { item.active = false; item.disabled = true })\r\n\r\n return items;\r\n}\r\n\r\nconst DEFAULT_POSITION_LEFT = 350;\r\nconst DEFAULT_POSITION_TOP = 670;\r\n@Component({\r\n selector: 'lib-bimplus-tool-hub',\r\n imports: [\r\n TranslateModule,\r\n CommonModule,\r\n ToolHubItemComponent,\r\n ToolHubSubItemComponent,\r\n DraggableDirective\r\n ],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-tool-hub.component.html',\r\n styleUrl: './bimplus-tool-hub.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusToolHubComponent extends BimplusLocalizedWidgetComponent implements OnInit,AfterViewInit {\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n private element = inject(ElementRef);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.items = createDefaultItems();\r\n this._visualSettings = createDefaultVisualSettings();\r\n this._units = this.calculateCurrentMenuItemUnits();\r\n this._subMenuUnits = this.calculateCurrentSubMenuItemUnits();\r\n this._annularSector = SVGGenerator.generateAnnularSector(this._visualSettings);\r\n this._annularSectorBorder = SVGGenerator.generateAnnularSectorBorder(this._visualSettings);\r\n this._deadZoneAnnularSector = SVGGenerator.generateDeadZoneAnnularSector(this._visualSettings);\r\n\r\n }\r\n\r\n // #region public fields\r\n \r\n get itemStates(): Array<ToolHubItemStates> {\r\n return this._itemStates;\r\n }\r\n @Input() set itemStates(value: Array<ToolHubItemStates>) {\r\n this._itemStates = value;\r\n this.setItemStates(this._itemStates);\r\n }\r\n\r\n setItemStates(itemStates: Array<ToolHubItemStates>) {\r\n for (const itemState of itemStates) {\r\n const item = this._items.find(item => item.buttonId === itemState.buttonId);\r\n if (item) {\r\n if (itemState.active != undefined) {\r\n item.active = itemState.active;\r\n }\r\n if (itemState.disabled !== undefined) {\r\n item.disabled = itemState.disabled;\r\n }\r\n }\r\n }\r\n\r\n this._updateActivationState();\r\n }\r\n\r\n\r\n get items(): Array<ToolHubItem> {\r\n return this._items;\r\n }\r\n @Input() set items(value: Array<ToolHubItem>) {\r\n this._items = value;\r\n\r\n const buttonsLength = (this._items?.length) > 0 ? this._items.length : 1;\r\n const rootStyle = document?.documentElement?.style;\r\n if (rootStyle) {\r\n const menuItems = rootStyle.getPropertyValue(\"--menu-items\");\r\n if (parseInt(menuItems) !== buttonsLength) {\r\n rootStyle.setProperty(\"--menu-items\", buttonsLength.toString());\r\n }\r\n }\r\n\r\n // Transfer disabled states, which can defined by host app\r\n this.setItemStates(this._itemStates);\r\n }\r\n\r\n get activeSubItems(): Array<ToolHubSubItem> | null {\r\n return this._activeSubItems;\r\n }\r\n\r\n get isCollapsed(): boolean {\r\n return this._isCollapsed;\r\n }\r\n @Input({ transform: booleanAttribute })\r\n set isCollapsed(value: boolean) {\r\n this._isCollapsed = value;\r\n }\r\n\r\n get isPerspectiveProjection(): boolean {\r\n return this._isPerspectiveProjection;\r\n }\r\n @Input({ transform: booleanAttribute })\r\n set isPerspectiveProjection(value: boolean) {\r\n this._isPerspectiveProjection = value;\r\n }\r\n\r\n get units(): ToolHubItemUnits {\r\n return this._units;\r\n }\r\n\r\n get subMenuUnits(): ToolHubItemUnits {\r\n return this._subMenuUnits;\r\n }\r\n\r\n get annularSector(): string {\r\n return this._annularSector;\r\n }\r\n\r\n get annularSectorBorder(): string {\r\n return this._annularSectorBorder;\r\n }\r\n\r\n get deadZoneAnnularSector(): string {\r\n return this._deadZoneAnnularSector;\r\n }\r\n\r\n @Input({ transform: booleanAttribute }) isEmbedded: boolean = false;\r\n @Input({ transform: booleanAttribute }) isFocused: boolean = false;\r\n @Input({ transform: booleanAttribute }) isActive: boolean = true;\r\n @Output() itemClicked = new EventEmitter<string>();\r\n @Output() subItemClicked = new EventEmitter<string>();\r\n \r\n // Define event handler for reusing draggable also from resize parent \r\n //@Output() resizedragging = new EventEmitter<[number,number]>();\r\n\r\n private componentId = 'center-menu-fp-id';\r\n private subscription: Subscription | null = null; // Initialize to null\r\n\r\n ngOnInit():void{ \r\n this.layoutManagerService.registerObject(this.element,this.componentId,'#center-menu-fp-id',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\r\n this.layoutManagerService.registeredItems$.subscribe(items => {\r\n const layoutManagerItem = items.find(item => item.id === this.componentId);\r\n this.isCollapsed = Boolean(layoutManagerItem?.isCollapsed); \r\n });\r\n \r\n }\r\n \r\n ngAfterViewInit():void{\r\n // if the component wants to be registered in layout manager system\r\n // Subscribe to the observable\r\n this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\r\n this.handleParentAppRectSizeChange(value);\r\n });\r\n }\r\n \r\n // #endregion public fields\r\n \r\n // #region public methods\r\n public getSVGViewBox(): string {\r\n return SVGGenerator.getSVGViewBox(this._units);\r\n }\r\n\r\n public getSVGCenterMenuPath(): string {\r\n return SVGGenerator.getSVGCenterMenuPath(this._units);\r\n }\r\n\r\n public getSVGCenterMenuItemPath(): string {\r\n return SVGGenerator.getSVGCenterMenuItemPath(this._units);\r\n }\r\n\r\n public getSVGCenterSubMenuItemPath(): string {\r\n return SVGGenerator.getSVGCenterSubMenuItemPath(this._subMenuUnits);\r\n }\r\n\r\n public toggleMenu() {\r\n this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.componentId);\r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,0,0,true); \r\n })\r\n }\r\n\r\n findToolHubItemById(id: string): ToolHubItem | undefined {\r\n return this._items.find(x => x.buttonId === id);\r\n }\r\n\r\n clickToolHubItem(action: string) {\r\n const item = this.findToolHubItemById(action);\r\n if (!item || item?.disabled) {\r\n return;\r\n }\r\n\r\n this.itemClicked.emit(action);\r\n }\r\n\r\n clickToolHubSubItem(action: string) {\r\n if (!this._activeSubItems) {\r\n return;\r\n }\r\n\r\n const item = this._activeSubItems.find(x => x.buttonId === action);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n this.subItemClicked.emit(action);\r\n this.closeActiveSubItemsView();\r\n }\r\n\r\n toggleToolHubItemActive(buttonId: string) {\r\n const item = this.findToolHubItemById(buttonId);\r\n if (!item || item.disabled) {\r\n return;\r\n }\r\n\r\n item.active = !item.active;\r\n\r\n this._updateActivationState();\r\n }\r\n\r\n toggleSubItemsView(buttonId: string) {\r\n const item = this.findToolHubItemById(buttonId);\r\n if (!item || item.disabled || !item.subItems) {\r\n return;\r\n }\r\n\r\n item.active = !item.active;\r\n if (item.active) {\r\n this._activeSubItemsView = item;\r\n this._activeSubItems = item.subItems;\r\n } else {\r\n this._activeSubItemsView = null;\r\n this._activeSubItems = null;\r\n }\r\n }\r\n\r\n toggleCameraProjection(buttonId: string) {\r\n if (!this._activeSubItems) {\r\n return;\r\n }\r\n\r\n const item = this._activeSubItems.find(x => x.buttonId === buttonId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n this.isPerspectiveProjection = !this.isPerspectiveProjection;\r\n\r\n item.iconClass = this.isPerspectiveProjection ? 'ui-icon-orthographic-camera-projection' : 'ui-icon-perspective-camera-projection';\r\n item.text = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n item.tooltip = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n item.tooltipDisabled = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n }\r\n\r\n closeActiveSubItemsView() {\r\n if (this._activeSubItemsView) {\r\n this._activeSubItemsView.active = false;\r\n this._activeSubItemsView = null;\r\n }\r\n this._activeSubItems = null;\r\n }\r\n\r\n setHoveredState(element: string, hovered: boolean) {\r\n const index = this._hoveredElements.indexOf(element);\r\n const storedCountHoverd = this._hoveredElements.length;\r\n\r\n if (index >= 0 && !hovered) {\r\n this._hoveredElements.splice(index, 1);\r\n }\r\n\r\n if (index < 0 && hovered) {\r\n this._hoveredElements.push(element);\r\n }\r\n\r\n if (storedCountHoverd > 0 && this._hoveredElements.length === 0) {\r\n\r\n // If hovered elements count reaches zero, check again a bit delayed. If nothing hovered at that time, close submenu\r\n setInterval(() => {\r\n if (this._hoveredElements.length === 0) {\r\n this.closeActiveSubItemsView();\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n private getSelector():string{\r\n return this.isCollapsed ? '#center-menu-controller':'.center-menu-fp';\r\n }\r\n\r\n dragElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,deltaX1,deltaY1) \r\n }\r\n\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd('center-menu-fp-id');\r\n }\r\n\r\n // #endregion public methods\r\n\r\n // #region private fields\r\n private _isCollapsed: boolean = false;\r\n private _itemStates: Array<ToolHubItemStates> = Array<ToolHubItemStates>();\r\n private _items: Array<ToolHubItem> = Array<ToolHubItem>();\r\n private _activeSubItemsView: ToolHubItem | null = null;\r\n private _activeSubItems: Array<ToolHubSubItem> | null = null;\r\n private _isPerspectiveProjection = true; // flag about perspective or orthographic camera projection\r\n private _visualSettings: ToolHubVisualSettings;\r\n private _units: ToolHubItemUnits;\r\n private _subMenuUnits: ToolHubItemUnits;\r\n private _annularSector: string;\r\n private _annularSectorBorder: string;\r\n private _deadZoneAnnularSector: string;\r\n private _hoveredElements: Array<string> = Array<string>();\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private calculateCurrentMenuItemUnits(): ToolHubItemUnits {\r\n return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, this._items.length, this.isEmbedded);\r\n }\r\n\r\n private calculateCurrentSubMenuItemUnits(): ToolHubItemUnits {\r\n return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, 20, this.isEmbedded);\r\n }\r\n\r\n private handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{\r\n this.layoutManagerService.checkPosition(this.componentId,this.getSelector(),parentRect,0,0,true); \r\n }\r\n\r\n private _oneOrMoreItemsActive(){\r\n for(const item of this.items){\r\n if(item.active === true)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateActivationState(){\r\n if(this._oneOrMoreItemsActive()){\r\n this.isActive = true;\r\n }else{\r\n this.isActive = false;\r\n }\r\n }\r\n // #region private methods\r\n}\r\n","<div class=\"center-menu\">\n <div\n class=\"center-menu-fp\"\n id=\"center-menu-fp-id\"\n [ngClass]=\"activeSubItems ? 'submenu-active' : ''\"\n >\n <div\n libDraggable\n id=\"center-menu-controller\"\n class=\"center-menu-controller dragger\"\n data-test=\"toolhub_controller\"\n [ngClass]=\"{\r\n opened: !isCollapsed,\r\n active: isActive\r\n }\"\r\n [title]=\"\r\n isCollapsed\r\n ? ('_Show_toolhub_tooltip' | translate)\r\n : ('_Minimize_toolhub_tooltip' | translate)\r\n \"\r\n (clicked)=\"toggleMenu()\"\n (dragging)=\"dragElement($event)\"\n (dragEnd) =\"onDragEnd()\"\n ></div>\n <div\n class=\"center-menu-circle-border-inner\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n ></div>\n <div\n class=\"center-menu-circle-border-outer\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('menuCircleBorderOuter', false)\"\n (mouseenter)=\"setHoveredState('menuCircleBorderOuter', true)\"\n ></div>\n <div\n libDraggable\n class=\"center-menu-circle\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('menuCircle', false)\"\n (mouseenter)=\"setHoveredState('menuCircle', true)\"\n (dragging)=\"dragElement($event)\"\n >\n @for (item of items; track item) {\n <lib-tool-hub-item\n libDraggable\n [attr.data-test]=\"'toolhub_item_' + item.buttonId\"\n [title]=\"item.tooltip | translate\"\n [item]=\"item\"\n [active]=\"!!item.active\"\n [isEnabled]=\"!item.disabled\"\n (clicked)=\"clickToolHubItem(item.buttonId)\"\n ></lib-tool-hub-item>\n }\n\n <svg\n class=\"centermenu-button-svg\"\n [attr.viewBox]=\"getSVGViewBox()\"\n fill=\"none\"\n >\n <clipPath id=\"svgCenterMenu\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterMenuPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterMenuItem\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterMenuItemPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterSubMenuItem\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterSubMenuItemPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterMenuSubMenu\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"annularSector\" fill=\"none\" />\n </clipPath>\n <clipPath\n id=\"svgCenterMenuSubMenuBorder\"\n clipPathUnits=\"objectBoundingBox\"\n >\n <path [attr.d]=\"annularSectorBorder\" fill=\"none\" />\n </clipPath>\n <clipPath\n id=\"svgCenterMenuSubMenuDeadZone\"\n clipPathUnits=\"objectBoundingBox\"\n >\n <path [attr.d]=\"deadZoneAnnularSector\" fill=\"none\" />\n </clipPath>\n </svg>\n </div>\n\n @if (activeSubItems) {\n <div\n class=\"center-menu-sub-menu-border\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('submenuBorder', false)\"\n (mouseenter)=\"setHoveredState('submenuBorder', true)\"\n ></div>\n <div\n class=\"center-menu-sub-menu\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('submenu', false)\"\n (mouseenter)=\"setHoveredState('submenu', true)\"\n >\n @for (item of activeSubItems; track item) {\n @if (item.type === 'button') {\n <lib-tool-hub-sub-item\n [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\n [title]=\"item.tooltip | translate\"\n [item]=\"item\"\n (click)=\"clickToolHubSubItem(item.buttonId)\"\n (keypress)=\"clickToolHubSubItem(item.buttonId)\"\n ></lib-tool-hub-sub-item>\n }\n <!-- this item is added as 6th but is moved back in less file to 5th position -->\n @if (item.type === 'separator') {\n <lib-tool-hub-sub-item\n [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\n [item]=\"item\"\n ></lib-tool-hub-sub-item>\n }\n }\n </div>\n <div\n class=\"center-menu-sub-menu-dead-zone\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('deadZone', false)\"\n (mouseenter)=\"setHoveredState('deadZone', true)\"\n ></div>\n }\n </div>\n</div>\n","import { Directive, ElementRef, Output, EventEmitter, HostListener, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libClickOutside]',\r\n standalone: true\r\n})\r\nexport class ClickOutsideDirective {\r\n private elementRef = inject(ElementRef);\r\n\r\n @Output() public clickOutside = new EventEmitter<void>();\r\n\r\n @HostListener('document:click', ['$event'])\r\n public onClick(event: MouseEvent) {\r\n const targetElement = event.target as HTMLElement;\r\n const clickedInside = this.elementRef.nativeElement.contains(targetElement);\r\n if (!clickedInside) {\r\n this.clickOutside.emit();\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, booleanAttribute, ViewEncapsulation, ElementRef, EventEmitter, signal, model, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgStyle} from '@angular/common';\r\nimport { BimplusContextMenuItem, BimplusContextMenuPosition } from './bimplus-context-menu.interface';\r\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-context-menu',\r\n imports: [\r\n NgStyle,\r\n ClickOutsideDirective,\r\n ],\r\n templateUrl: './bimplus-context-menu.component.html',\r\n styleUrl: './bimplus-context-menu.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusContextMenuComponent {\r\n private readonly el = inject(ElementRef);\r\n\r\n @Output() triggerSelected = new EventEmitter();\r\n @Input({ transform: booleanAttribute }) showIcons: boolean = true;\r\n @Input() triggerTitle : string = \"\";\r\n\r\n protected readonly _showDropdown = signal<boolean>(false);\r\n protected _data?: object = undefined;;\r\n protected readonly _position = signal<BimplusContextMenuPosition>({\r\n posX: -2000,\r\n posY: -2000\r\n })\r\n private readonly _element: HTMLElement;\r\n private _interval: number | undefined;\r\n items = model<BimplusContextMenuItem[] | null | undefined>([]);\r\n\r\n constructor() {\r\n this._element = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n get data(): undefined | object {\r\n return this._data;\r\n }\r\n @Input() set data(data: object) {\r\n this._data = data;\r\n }\r\n\r\n protected _clickOutside() {\r\n this._stopTriggerPositionTracking();\r\n this._showDropdown.set(false);\r\n }\r\n\r\n protected _actionClick(item: BimplusContextMenuItem) {\r\n this._showDropdown.set(false);\r\n\r\n if(typeof item.disabled === 'function') {\r\n if(item.disabled?.(this._data)) {\r\n return;\r\n }\r\n item.action?.(this._data);\r\n return;\r\n }\r\n\r\n if(item.disabled) {\r\n return;\r\n }\r\n item.action?.(this._data);\r\n }\r\n\r\n protected _disabled(item: BimplusContextMenuItem): boolean {\r\n if(!item.disabled) {\r\n return false;\r\n }\r\n if(typeof item.disabled === 'function') {\r\n return item.disabled?.(this._data);\r\n }\r\n return item.disabled;\r\n }\r\n\r\n protected _calculateContextMenuPosition() {\r\n const _triggerElament = this._element.querySelector(\".context-menu-trigger\");\r\n if(!_triggerElament) {\r\n return;\r\n }\r\n\r\n const { right: posX, top: posY } = _triggerElament.getBoundingClientRect();\r\n this._position.set({ posX, posY });\r\n }\r\n\r\n protected _stopTriggerPositionTracking(): void {\r\n if(!this._interval){\r\n return;\r\n }\r\n\r\n clearInterval(this._interval);\r\n this._interval = undefined;\r\n }\r\n\r\n protected _startTriggerPositionTracking(): void {\r\n if(this._interval){\r\n return;\r\n }\r\n this._interval = setInterval(() => {\r\n this._calculateContextMenuPosition();\r\n }, 50) as unknown as number;\r\n }\r\n\r\n protected _toggleDropdown(event: Event) {\r\n this._showDropdown.update(value => !value);\r\n this._calculateContextMenuPosition();\r\n this._startTriggerPositionTracking();\r\n fireEvent(this, \"triggerSelected\");\r\n event.stopPropagation();\r\n }\r\n}\r\n","<div class=\"basic-context-menu\" libClickOutside (clickOutside)=\"_clickOutside()\">\r\n <div class=\"context-menu-trigger\" \r\n (click)=\"_toggleDropdown($event)\"\r\n (keypress)=\"_toggleDropdown($event)\"\r\n title=\"{{triggerTitle}}\"\r\n data-test=\"context-menu\"\r\n >\r\n @if (_showDropdown()) {\r\n <ul\r\n class=\"basic-context-menu__list\"\r\n data-test=\"basic-context-menu__list\"\r\n [ngStyle]=\"{\r\n 'top.px': _position().posY\r\n , 'left.px': _position().posX\r\n , 'minWidth.px': 125\r\n , 'backgroundColor': 'white'\r\n }\"\r\n >\r\n @for(item of items(); track item) {\r\n @if (item.id !== 'separator') {\r\n <li \r\n class=\"basic-context-menu__item\"\r\n data-test=\"basic-context-menu__item\"\r\n [class.basic-context-menu__item--disabled]=\"_disabled(item)\"\r\n (click)=\"_actionClick(item)\"\r\n (keypress)=\"_actionClick(item)\"\r\n >\r\n @if (showIcons) {\r\n <div class=\"basic-context-menu__item__icon\" data-test=\"basic-context-menu__item__icon\" [style.background-image]=\"'url(' + item.icon + ')'\">\r\n </div>\r\n }\r\n <div class=\"basic-context-menu__item__label\" data-test=\"basic-context-menu__item__label\" title=\"{{item.tooltip ? item.tooltip : item.title}}\">\r\n {{item.title}}\r\n </div>\r\n </li>\r\n } @else {\r\n <div class=\"basic-context-menu__item__separator\" data-test=\"basic-context-menu__item__separator\"></div>\r\n }\r\n }\r\n </ul>\r\n }\r\n</div>\r\n","import { ElementRef, Component, OnInit, Input, OnChanges, SimpleChange, booleanAttribute, Output, EventEmitter, TemplateRef, input, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';\r\nimport { SelectionModel} from '@angular/cdk/collections';\r\nimport { CdkTreeModule, FlatTreeControl } from '@angular/cdk/tree';\r\nimport { CommonModule } from '@angular/common';\r\nimport { fireEvent } from '../../utils/utils';\r\nimport { TreeNode, FlatNode, FlatTreeContextMenus } from './bimplus-flat-tree.interface';\r\nimport { BimplusContextMenuComponent } from '../bimplus-context-menu/bimplus-context-menu.component';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\ninterface BimplusFlatTreeComponentAttribute {\r\n [key: string]: unknown; // Add index signature allowing string indexing\r\n //Other properties and methods...\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-flat-tree',\r\n imports: [MatTreeModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n CdkTreeModule,\r\n BimplusContextMenuComponent,\r\n CommonModule,\r\n DragDropModule\r\n ],\r\n templateUrl: './bimplus-flat-tree.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-flat-tree.component.less'\r\n})\r\n\r\nexport class BimplusFlatTreeComponent implements OnInit, OnChanges{\r\n private readonly el = inject(ElementRef);\r\n\r\n @Input() treeDataStringified: string | null = null;\r\n treeTitle = input<string | undefined>(undefined);\r\n @Input() paddingIndent : string = \"2.8rem\"\r\n @Input({ transform: booleanAttribute }) multiSelect: boolean = false;\r\n @Input({ transform: booleanAttribute }) oneLevelMultiSelect: boolean = false;\r\n @Input({ transform: booleanAttribute }) showFoldersIcons: boolean = false;\r\n @Input({ transform: booleanAttribute }) showObjectsIcons: boolean = false;\r\n @Input({ transform: booleanAttribute }) enableSelect: boolean = true;\r\n @Input({ transform: booleanAttribute }) enableParentHighlighting: boolean = true;\r\n @Input({ transform: booleanAttribute }) enableDragAndDrop: boolean = false;\r\n @Input() dataTestPrefix : string = \"\";\r\n @Input() contextMenus: FlatTreeContextMenus | null | undefined = null;\r\n @Input({ transform: booleanAttribute }) hasCheckBox1:boolean = false;\r\n @Input({ transform: booleanAttribute }) hasCheckBox2:boolean = false;\r\n\r\n get treeData() : Array<TreeNode>{\r\n return this._dataSource.data;\r\n }\r\n\r\n @Input() set treeData(data: Array<TreeNode>) {\r\n this.treeDataStringified = null;\r\n this._dataSource.data = data;\r\n }\r\n customNodeTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n @Output() selectedNodes = new EventEmitter<FlatNode[]>();\r\n @Output() checked1Nodes = new EventEmitter<FlatNode[]>();\r\n @Output() checked2Nodes = new EventEmitter<FlatNode[]>();\r\n\r\n private _selectionList: SelectionModel<FlatNode> | undefined = undefined;\r\n\r\n\r\n ngOnInit(): void {\r\n const element = this.el.nativeElement;\r\n if (element) {\r\n (element as unknown as BimplusFlatTreeComponentAttribute)['get_node'] = this.get_node.bind(this);\r\n (element as unknown as BimplusFlatTreeComponentAttribute)['select_node'] = this.select_node.bind(this);\r\n }\r\n\r\n this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\r\n if(this.treeDataStringified){\r\n this._setNewData(this.treeDataStringified)\r\n }\r\n }\r\n\r\n public expandTree(){\r\n this._treeControl.expandAll();\r\n }\r\n\r\n private _getNode(id: string, nodes: Array<TreeNode>): TreeNode | null {\r\n for(const node of nodes) {\r\n if(node.id === id) {\r\n return node;\r\n }\r\n if(node.children) {\r\n const _node: TreeNode | null = this._getNode(id, node.children);\r\n if(_node) {\r\n return _node;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public get_node(id: { id: string } | string, getDOMElement: boolean = false): TreeNode | Element | null {\r\n if(typeof id === 'string') {\r\n return this._getNode(id, this._dataSource.data);\r\n }\r\n if(getDOMElement) {\r\n const _element: Element = this.el.nativeElement.querySelector(`[node-id='${id.id}']`);\r\n return _element;\r\n }\r\n return this._getNode(id.id, this._dataSource.data);\r\n }\r\n\r\n public select_node(id: string, skipEvent: boolean = false) {\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return;\r\n }\r\n\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\r\n if(this._selectionList.selected[0].parent !== node.parent) {\r\n this._selectionList.clear();\r\n }\r\n }\r\n\r\n if(this._selectionList.isSelected(node)) {\r\n return;\r\n }\r\n\r\n this._selectionList.select(node);\r\n if(!this.multiSelect && !this.oneLevelMultiSelect && !skipEvent) {\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n return;\r\n }\r\n\r\n if(!this.oneLevelMultiSelect) {\r\n this._toggleDescendantsNodes(node);\r\n }\r\n\r\n if(this.enableParentHighlighting) {\r\n this._updateParentSelections(node);\r\n }\r\n\r\n if(!skipEvent){\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n }\r\n\r\n }\r\n\r\n public reset_selection(){\r\n this._selectionList?.clear();\r\n }\r\n\r\n public expand_node(id : string){\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return;\r\n }\r\n\r\n this._treeControl.expand(node);\r\n }\r\n\r\n public is_expanded(id : string){\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return false;\r\n }\r\n\r\n return this._treeControl.isExpanded(node);\r\n }\r\n\r\n public is_selected(id : string){\r\n if(!this._selectionList)\r\n return;\r\n\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return false;\r\n }\r\n\r\n return this._selectionList?.isSelected(node);\r\n }\r\n\r\n private _setNewData(treeDataStringified: string): void {\r\n const _tree_data = JSON.parse(treeDataStringified);\r\n this._dataSource.data = _tree_data ?? [];\r\n }\r\n\r\n private _changedTreeData(change: SimpleChange) {\r\n this._setNewData(change.currentValue)\r\n }\r\n\r\n ngOnChanges(changes: { [propKey: string]: SimpleChange }): void {\r\n if(changes['multiSelect'] || changes['oneLevelMultiSelect']) {\r\n this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\r\n }\r\n if(changes['treeDataStringified']) {\r\n this._changedTreeData(changes['treeDataStringified'])\r\n }\r\n }\r\n\r\n private _transformer = (node: TreeNode, level: number): FlatNode => {\r\n return {\r\n expandable: node.children !== undefined && node.children.length > 0,\r\n children_count: node.children?.length,\r\n name: node.name,\r\n id: node.id,\r\n level: level,\r\n parent: node.parent,\r\n nodeType: node.nodeType,\r\n isChecked1: true,\r\n isChecked2: true,\r\n isUndetermined1: false,\r\n isUndetermined2: false\r\n };\r\n };\r\n\r\n protected _treeControl = new FlatTreeControl<FlatNode>(\r\n node => node.level,\r\n node => node.expandable,\r\n );\r\n\r\n protected _treeFlattener = new MatTreeFlattener(\r\n this._transformer,\r\n node => node.level,\r\n node => node.expandable,\r\n node => node.children\r\n );\r\n\r\n protected _dataSource = new MatTreeFlatDataSource(this._treeControl, this._treeFlattener);\r\n protected _isExpandable = (_: number, node: FlatNode) => node.expandable;\r\n protected _isCustomNodeType(node: FlatNode): boolean{\r\n return node.nodeType != undefined && node.nodeType != \"\";\r\n }\r\n\r\n protected _hasChildren(node: FlatNode): boolean {\r\n if(!node.expandable) {\r\n return false;\r\n }\r\n if(node.children_count === undefined) {\r\n return false\r\n }\r\n return node.children_count > 0\r\n }\r\n\r\n protected _descendantsAllSelected(node: FlatNode): boolean {\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n\r\n const _selectionList: SelectionModel<FlatNode> = this._selectionList;\r\n\r\n const _descendants = this._treeControl.getDescendants(node);\r\n if(_descendants.length === 0) {\r\n return true;\r\n }\r\n const _descAllSelected = _descendants.length > 0 && _descendants.every((child) => {\r\n return _selectionList.isSelected(child);\r\n });\r\n return _descAllSelected;\r\n }\r\n\r\n protected _descendantsPartiallySelected(node: FlatNode): boolean {\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n const _selectionList: SelectionModel<FlatNode> = this._selectionList;\r\n\r\n const _descendants = this._treeControl.getDescendants(node);\r\n const _result = _descendants.some((child) => {\r\n return _selectionList.isSelected(child)\r\n });\r\n return _result && !this._descendantsAllSelected(node);\r\n }\r\n\r\n private _toggleDescendantsNodes(node: FlatNode) {\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n const _isNodeSelected = this._selectionList.isSelected(node);\r\n if(_isNodeSelected) {\r\n this._selectionList.select(...this._treeControl.getDescendants(node));\r\n }\r\n else {\r\n this._selectionList.deselect(...this._treeControl.getDescendants(node));\r\n }\r\n }\r\n\r\n private _updateParentSelections(node: FlatNode) {\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n let _parentId = node.parent;\r\n let _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId)\r\n while(_parentNode) {\r\n if(this._descendantsAllSelected(_parentNode)) {\r\n this._selectionList.select(_parentNode);\r\n }\r\n else{\r\n this._selectionList.deselect(_parentNode);\r\n }\r\n _parentId = _parentNode.parent;\r\n _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId);\r\n }\r\n }\r\n\r\n protected _toggleNode(event: Event, node: FlatNode) {\r\n if(!node) {\r\n return;\r\n }\r\n\r\n if(!this.enableSelect) {\r\n return;\r\n }\r\n\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n // Check if event is a MouseEvent before accessing ctrlKey\r\n const isMouseEvent = event != null && event instanceof MouseEvent;\r\n if (isMouseEvent && !event?.ctrlKey) {\r\n this._selectionList.clear();\r\n }\r\n\r\n if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\r\n if(this._selectionList.selected[0].parent !== node.parent) {\r\n this._selectionList.clear();\r\n }\r\n }\r\n\r\n this._selectionList.toggle(node);\r\n if(!this.multiSelect && !this.oneLevelMultiSelect) {\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n return;\r\n }\r\n\r\n if(!this.oneLevelMultiSelect) {\r\n this._toggleDescendantsNodes(node);\r\n }\r\n\r\n if(this.enableParentHighlighting) {\r\n this._updateParentSelections(node);\r\n }\r\n\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n }\r\n\r\n protected _isSelected(node: FlatNode): boolean{\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n return this._selectionList?.isSelected(node);\r\n }\r\n \r\n protected _toggleCheckBox1( event:Event,node: FlatNode) { \r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n node.isChecked1 = !node.isChecked1;\r\n if(node.expandable){\r\n this._treeControl.getDescendants(node).forEach(n => {\r\n n.isChecked1 = node.isChecked1;\r\n });\r\n }\r\n node.isUndetermined1 = false;\r\n this.checkUndetermined(node,1);\r\n fireEvent(this, \"checked1Nodes\", [node]);\r\n }\r\n \r\n protected _toggleCheckBox2(event:Event, node: FlatNode) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n node.isChecked2 = !node.isChecked2;\r\n if(node.expandable){\r\n this._treeControl.getDescendants(node).forEach(n => {\r\n n.isChecked2 = node.isChecked2;\r\n });\r\n }\r\n node.isUndetermined2 = false;\r\n this.checkUndetermined(node,2);\r\n fireEvent(this, \"checked2Nodes\", [node]);\r\n }\r\n \r\n //simplified version of checkUndetermined\r\n checkUndetermined(node:FlatNode,checkbox: number){\r\n if(!this.hasCheckBox1 && checkbox === 1){\r\n return;\r\n }\r\n if(!this.hasCheckBox2 && checkbox === 2){\r\n return;\r\n }\r\n if(!node.parent){\r\n return;\r\n }\r\n let myNode = node; \r\n while(myNode && myNode.parent){\r\n const parentNode = this._treeControl.dataNodes.find(n => n.id === myNode.parent); \r\n if(!parentNode){\r\n return;\r\n }\r\n let checked = 0;\r\n let unchecked = 0; \r\n let undetermined = false;\r\n this._treeControl.getDescendants(parentNode).forEach(n => {\r\n if(checkbox === 1 ? n.isChecked1: n.isChecked2){ \r\n checked++;\r\n } else {\r\n unchecked++;\r\n }\r\n if(checkbox === 1 ? n.isUndetermined1: n.isUndetermined2){ \r\n undetermined = true; \r\n }\r\n if(checked > 0 && unchecked > 0){\r\n undetermined = true; \r\n }\r\n });\r\n if(checkbox === 1 ){\r\n parentNode.isUndetermined1 = undetermined;\r\n parentNode.isChecked1 = !unchecked;\r\n } else {\r\n parentNode.isUndetermined2 = undetermined;\r\n parentNode.isChecked2 = !unchecked;\r\n }\r\n myNode = parentNode;\r\n };\r\n }\r\n protected _isUndetermined1(node: FlatNode): boolean{\r\n return node.isUndetermined1;\r\n }\r\n \r\n protected _isUndetermined2(node: FlatNode): boolean{\r\n return node.isUndetermined2;\r\n }\r\n\r\n protected _isChecked1(node: FlatNode): boolean{ \r\n return node.isChecked1;\r\n }\r\n protected _isChecked2(node: FlatNode): boolean{ \r\n return node.isChecked2;\r\n }\r\n}\r\n","<div class=\"tree-container\">\r\n @if (treeTitle(); as treeTitle) {\r\n <div class=\"tree-title\">{{treeTitle}}</div>\r\n }\r\n <cdk-tree [dataSource]=\"_dataSource\" [treeControl]=\"_treeControl\">\r\n <!-- This is the tree node template for leaf nodes -->\r\n <cdk-tree-node\r\n [matTreeNodePaddingIndent]=\"paddingIndent\"\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n (click)=\"_toggleNode($event, node)\"\r\n (keypress)=\"_toggleNode($event, node)\"\r\n class=\"object-node\"\r\n [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [attr.data-test]=\"dataTestPrefix + node.id\"\r\n [title]=\"node.name\"\r\n [attr.node-id]=\"node.id\"\r\n >\r\n <!-- use a disabled button to provide padding for tree leaf -->\r\n <button mat-icon-button disabled>\r\n </button>\r\n @if (customNodeTemplate() && _isCustomNodeType(node)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customNodeTemplate()\"\r\n [ngTemplateOutletContext]=\"{node:node}\">\r\n </ng-container>\r\n }@else{\r\n @if (showObjectsIcons) {\r\n <div class=\"icon object-icon\">\r\n </div>\r\n }\r\n <span\r\n class=\"node-label\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n >\r\n <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\r\n <div>\r\n {{node.name}}\r\n </div>\r\n </span>\r\n }\r\n @if (contextMenus?.objectContextMenuitems?.length) {\r\n <lib-bimplus-context-menu\r\n [items]=\"$safeNavigationMigration(contextMenus?.objectContextMenuitems)\"\r\n [data]=\"node\"\r\n (triggerSelected)=\"_toggleNode($event, node)\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n @if(hasCheckBox1){\r\n <div\r\n class=\"custom-checkbox1\"\r\n [ngClass]=\"{ 'icon-checked': _isChecked1(node), 'icon-unchecked': !_isChecked1(node) }\"\r\n (click)=\"_toggleCheckBox1($event,node)\"\r\n (keypress)=\"_toggleCheckBox1($event,node)\"\r\n ></div>\r\n }\r\n @if(hasCheckBox2){\r\n <div\r\n class=\"custom-checkbox2\"\r\n [ngClass]=\"{ 'icon-checked': _isChecked2(node), 'icon-unchecked': !_isChecked2(node) }\"\r\n (click)=\"_toggleCheckBox2($event,node)\"\r\n (keypress)=\"_toggleCheckBox2($event,node)\"\r\n ></div>\r\n }\r\n </cdk-tree-node>\r\n <!-- This is the tree node template for expandable nodes -->\r\n <cdk-tree-node [matTreeNodePaddingIndent]=\"paddingIndent\"\r\n *matTreeNodeDef=\"let node;when: _isExpandable\"\r\n matTreeNodePadding\r\n (click)=\"_toggleNode($event, node)\"\r\n (keypress)=\"_toggleNode($event, node)\"\r\n class=\"folder-node\"\r\n [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [attr.data-test]=\"dataTestPrefix + node.id\"\r\n [title]=\"node.name\"\r\n [attr.node-id]=\"node.id\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <div\r\n class=\"icon expand-collapse-icon\"\r\n [class.expand-more-icon]=\"_hasChildren(node) && !_treeControl.isExpanded(node)\"\r\n [class.collapse-icon]=\"_hasChildren(node) && _treeControl.isExpanded(node)\"\r\n >\r\n </div>\r\n </button>\r\n @if (customNodeTemplate() && _isCustomNodeType(node)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customNodeTemplate()\"\r\n [ngTemplateOutletContext]=\"{node:node}\">\r\n </ng-container>\r\n }@else{\r\n @if (showFoldersIcons) {\r\n <div class=\"icon folder-icon\">\r\n </div>\r\n }\r\n <span class=\"node-label\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [class.selected-all-descendants-nodes]=\"_descendantsAllSelected(node) && _isSelected(node) && enableParentHighlighting\"\r\n [class.selected-partially-descendants-nodes]=\"_descendantsPartiallySelected(node) && enableParentHighlighting\"\r\n >\r\n <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\r\n <div class=\"node-label\">\r\n {{node.name}}\r\n </div>\r\n </span>\r\n }\r\n @if (contextMenus?.folderContextMenuitems?.length) {\r\n <lib-bimplus-context-menu\r\n [items]=\"$safeNavigationMigration(contextMenus?.folderContextMenuitems)\"\r\n [data]=\"node\"\r\n (triggerSelected)=\"_toggleNode($event, node)\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n\r\n @if(hasCheckBox1){\r\n <div\r\n class=\"custom-checkbox1\"\r\n [ngClass]=\"{\r\n 'icon-undetermined': _isUndetermined1(node),\r\n 'icon-checked': !_isUndetermined1(node) && _isChecked1(node),\r\n 'icon-unchecked': !_isUndetermined1(node) && !_isChecked1(node)\r\n }\"\r\n (click)=\"_toggleCheckBox1($event,node)\"\r\n (keypress)=\"_toggleCheckBox1($event,node)\"\r\n ></div>\r\n }\r\n @if(hasCheckBox2){\r\n <div\r\n class=\"custom-checkbox2\"\r\n [ngClass]=\"{\r\n 'icon-undetermined': _isUndetermined2(node),\r\n 'icon-checked': !_isUndetermined2(node) && _isChecked2(node),\r\n 'icon-unchecked': !_isUndetermined2(node) && !_isChecked2(node)\r\n }\"\r\n (click)=\"_toggleCheckBox2($event,node)\"\r\n (keypress)=\"_toggleCheckBox2($event,node)\"\r\n ></div>\r\n }\r\n </cdk-tree-node>\r\n </cdk-tree>\r\n</div>\r\n","\r\nexport interface FilterType{\r\n id: string,\r\n name: string\r\n}\r\n\r\nexport interface FilterCriterium{\r\n name : string,\r\n value? : string | number | boolean | null | undefined,\r\n namedValue? : string, // display name of value in UI\r\n id? : string,\r\n subString : string,\r\n}\r\n\r\nexport enum FilterCriteriaSelectionMode{\r\n None,\r\n SelectObjectProperties,\r\n SelectAttributes\r\n} \r\n\r\nexport const MaxFilterCriteria = 5;","import { Component, EventEmitter, HostBinding, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FilterCriterium } from '../bimplus-object-navigator.interface';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule} from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-filter-criterium',\r\n imports: [TranslateModule],\r\n templateUrl: './filter-criterium.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './filter-criterium.component.less'\r\n})\r\nexport class FilterCriteriumComponent extends BimplusLocalizedWidgetComponent {\r\n\r\n constructor (){\r\n super();\r\n }\r\n\r\n // #region public fields\r\n @Input()\r\n criterium : FilterCriterium = { name : \"\", subString:\"\"}\r\n\r\n @HostBinding('style.margin-left.em') @Input() indent: number = 0;\r\n\r\n @Output() deleteCriterium = new EventEmitter<void>();\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n clickedDelete(){\r\n this.deleteCriterium.emit();\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"filter-criterium-row\">\r\n <span class=\"filter-criterium-item\">\r\n {{ criterium.name }}\r\n @if(criterium.namedValue) { &nbsp;&#40;{{ criterium.namedValue }}&#41; }\r\n </span>\r\n <div\r\n class=\"filter-criterium-icon-delete\"\r\n (click)=\"clickedDelete()\"\r\n (keypress)=\"clickedDelete()\"\r\n ></div>\r\n</div>\r\n","import { Component, computed, EventEmitter, input, Input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { ObjectStructureNode } from './bimplus-object-structure.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-structure',\r\n imports: [BimplusFlatTreeComponent],\r\n templateUrl: './bimplus-object-structure.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-object-structure.component.less'\r\n})\r\nexport class BimplusObjectStructureComponent{\r\n @Input() hasCheckBox1:boolean = false;\r\n @Input() hasCheckBox2:boolean = false;\r\n \r\n objectStructure = input<ObjectStructureNode>({\r\n id : \"\",\r\n name : \"\",\r\n parent: \"\",\r\n visible: true,\r\n opaque: true\r\n });\r\n\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n \r\n private _convertObjectStructureNodeToTreeNode(node : ObjectStructureNode) : TreeNode{\r\n\r\n const treeNode : TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent \r\n };\r\n\r\n if(node.children){\r\n treeNode.children = [];\r\n for(const child of node.children){\r\n const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n readonly treeData = computed<TreeNode[]>(() => {\r\n const objectStructure = this.objectStructure();\r\n if(!objectStructure){\r\n return [];\r\n }\r\n\r\n const root = this._convertObjectStructureNodeToTreeNode(objectStructure);\r\n if(!root){\r\n return [];\r\n }\r\n\r\n return [root];\r\n })\r\n\r\n\r\n private _findNode(id:string, node : ObjectStructureNode) : ObjectStructureNode | null{\r\n if(node.id == id){\r\n return node;\r\n }\r\n\r\n if(node.children){\r\n for(const child of node.children){\r\n const res = this._findNode(id, child);\r\n if(res){\r\n return res;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n handleSelectedNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const selectedNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(selectedNode){\r\n this.nodeSelected.emit(selectedNode);\r\n }\r\n } \r\n }\r\n \r\n handleVisibleNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const visibleNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(visibleNode){\r\n const outpuData:ObjectStructureNode ={\r\n name:visibleNode.name,\r\n parent: visibleNode.parent, \r\n id: visibleNode.id,\r\n visible: nodes[0].isChecked2,\r\n opaque: nodes[0].isChecked1,\r\n }\r\n this.nodeVisible.emit(outpuData);\r\n }\r\n } \r\n }\r\n \r\n handleOpaqueNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const opaqueNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(opaqueNode){\r\n const outpuData:ObjectStructureNode ={\r\n name:opaqueNode.name,\r\n parent: opaqueNode.parent, \r\n id: opaqueNode.id,\r\n visible: nodes[0].isChecked2,\r\n opaque: nodes[0].isChecked1,\r\n }\r\n this.nodeOpaque.emit(outpuData);\r\n }\r\n } \r\n }\r\n\r\n expandTree(){\r\n this.treeComponent?.expandTree();\r\n }\r\n\r\n @Output() nodeSelected = new EventEmitter<ObjectStructureNode>();\r\n @Output() nodeVisible = new EventEmitter<ObjectStructureNode>();\r\n @Output() nodeOpaque = new EventEmitter<ObjectStructureNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData()\"\r\n enableParentHighlighting=\"false\"\r\n (selectedNodes) = \"handleSelectedNodes($event)\"\r\n (checked2Nodes) = \"handleVisibleNodes($event)\"\r\n (checked1Nodes) = \"handleOpaqueNodes($event)\"\r\n dataTestPrefix=\"object-structure-tree-\"\r\n [hasCheckBox1]=\"hasCheckBox1\"\r\n [hasCheckBox2]=\"hasCheckBox2\"\r\n></lib-bimplus-flat-tree>\r\n","import { Component, computed, EventEmitter, input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { ComplexPropertiesNode } from './bimplus-object-complex-properties.interface';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-complex-properties',\r\n imports: [BimplusFlatTreeComponent],\r\n templateUrl: './bimplus-object-complex-properties.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-object-complex-properties.component.less'\r\n})\r\nexport class BimplusObjectComplexPropertiesComponent {\r\n complexProperties = input<ComplexPropertiesNode>({\r\n id: \"\",\r\n name: \"\",\r\n parent: \"\"\r\n });\r\n\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n readonly treeData = computed<TreeNode[]>(() => {\r\n const complexProperties = this.complexProperties();\r\n if(!complexProperties) {\r\n return [];\r\n }\r\n\r\n const root = this._convertObjectStructureNodeToTreeNode(complexProperties);\r\n if(!root) {\r\n return [];\r\n }\r\n\r\n return [root];\r\n })\r\n\r\n private _convertObjectStructureNodeToTreeNode(node : ComplexPropertiesNode) : TreeNode{\r\n\r\n const treeNode : TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent \r\n };\r\n\r\n if(node.children){\r\n treeNode.children = [];\r\n for(const child of node.children){\r\n const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n\r\n private _findNode(id:string, node : ComplexPropertiesNode) : ComplexPropertiesNode | null{\r\n if(node.id == id){\r\n return node;\r\n }\r\n\r\n if(node.children){\r\n for(const child of node.children){\r\n const res = this._findNode(id, child);\r\n if(res){\r\n return res;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n handleSelectedNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const selectedNode = this._findNode(nodes[0].id, this.complexProperties());\r\n if(selectedNode){\r\n this.nodeSelected.emit(selectedNode);\r\n }\r\n } \r\n }\r\n\r\n expandTree(){\r\n this.treeComponent?.expandTree();\r\n }\r\n\r\n @Output() nodeSelected = new EventEmitter<ComplexPropertiesNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData()\"\r\n enableParentHighlighting=\"false\"\r\n (selectedNodes)=\"handleSelectedNodes($event)\"\r\n dataTestPrefix=\"object-complex-properties-tree-\"\r\n></lib-bimplus-flat-tree>\r\n","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ObjectStructureNode{\r\n id: string;\r\n children? : ObjectStructureNode[];\r\n name: string;\r\n parent: string;\r\n visible: boolean;\r\n opaque: boolean;\r\n}\r\n\r\nexport class ObjectStructureNodeBuilder{\r\n static createFromResponse(response : WebSdk.ObjectTopologyResponse) : ObjectStructureNode{\r\n const node : ObjectStructureNode = {\r\n id : response.id,\r\n name : response.name ? `${response.type}(${response.name})` : response.type,\r\n parent : response.parent,\r\n visible : true,\r\n opaque : true\r\n }\r\n\r\n if(response.children){\r\n node.children = [];\r\n for(const child of response.children){\r\n node.children.push(ObjectStructureNodeBuilder.createFromResponse(child as WebSdk.ObjectTopologyResponse));\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n}","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ComplexPropertiesNode{\r\n id: string;\r\n children? : ComplexPropertiesNode[];\r\n name: string;\r\n parent: string;\r\n}\r\n\r\nexport class ComplexPropertiesNodeBuilder{\r\n static createFromResponse(response : WebSdk.ObjectComplexPropertyTopologyResponse) : ComplexPropertiesNode{\r\n const node : ComplexPropertiesNode = {\r\n id : response.id,\r\n name : response.type ? response.type : response.name,\r\n parent : response.parent\r\n }\r\n\r\n if(response.children){\r\n node.children = [];\r\n for(const child of response.children){\r\n node.children.push(ComplexPropertiesNodeBuilder.createFromResponse(child as WebSdk.ObjectComplexPropertyTopologyResponse));\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'formatValue',\r\n standalone: true\r\n})\r\nexport class FormatValuePipe implements PipeTransform {\r\n transform(value: number | string | boolean | null | undefined): string {\r\n if (value === null || value === undefined) {\r\n return '[null]';\r\n } else if (value === '') {\r\n return '[empty]';\r\n } else if (typeof value === 'boolean') {\r\n return value ? 'TRUE' : 'FALSE';\r\n }\r\n return value.toString(); // Return the value as a string\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport moment from 'moment';\r\n\r\n@Pipe({\r\n name: 'DateTime',\r\n standalone: true,\r\n})\r\nexport class DateTimePipe implements PipeTransform {\r\n transform(value: string, format: string = \"L\"): string {\r\n // This UTC date/time 2024-12-11T23:00:00+00:00\r\n // gets transformed in Germany with timezone shift of +1 by\r\n // moment(value).format(format) ==> 12/12/2024\r\n // and by\r\n // moment.utc(value).format(format) ==> 12/11/2024\r\n //\r\n const date = moment(value).format(format);\r\n return date;\r\n }\r\n}","import { Component, EventEmitter, Input, OnInit, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject, from } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { ExpansionPanelComponent } from '../../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../../expansion-panel-header/expansion-panel-header.component';\r\nimport { FilterCriterium, MaxFilterCriteria } from '../bimplus-object-navigator.interface';\r\nimport { BimplusObjectStructureComponent } from '../../bimplus-object-structure/bimplus-object-structure.component';\r\nimport { BimplusObjectComplexPropertiesComponent } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\r\nimport { ObjectStructureNode, ObjectStructureNodeBuilder } from '../../bimplus-object-structure/bimplus-object-structure.interface';\r\nimport { ComplexPropertiesNode, ComplexPropertiesNodeBuilder } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\r\nimport { CriteriaSelectObjectAttribute, CriteriaSelectObjectAttributeGroup } from './criteria-select-object-properties.interface';\r\nimport { FormatValuePipe } from '../../../pipes/format-value.pipe';\r\nimport { DateTimePipe } from '../../../pipes/datetime.pipe';\r\n\r\n@Component({\r\n selector: 'lib-criteria-select-object-properties',\r\n imports: [ExpansionPanelHeaderComponent, ExpansionPanelComponent, TranslateModule, BimplusObjectStructureComponent, BimplusObjectComplexPropertiesComponent],\r\n providers: [FormatValuePipe, DateTimePipe],\r\n templateUrl: './criteria-select-object-properties.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './criteria-select-object-properties.component.less'\r\n})\r\nexport class CriteriaSelectObjectPropertiesComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n private formatValuePipe = inject(FormatValuePipe);\r\n private datetimePipe = inject(DateTimePipe);\r\n\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this._currentPropertiesObjectId$.subscribe({\r\n next: (id) => {\r\n if (id) {\r\n this._createObjectProperties(id, this.revision)\r\n }\r\n }\r\n });\r\n\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._currentPropertiesObjectId$.next(id);\r\n this._createComplexPropertiestructure(id, this.revision);\r\n }\r\n });\r\n\r\n }\r\n\r\n @Input()\r\n api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._currentObjectId$.next(id);\r\n this._createObjectStructure(id, this.revision);\r\n\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n @Input()\r\n revision: number | undefined = undefined;\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n objectAttributeGroups: CriteriaSelectObjectAttributeGroup[] = [];\r\n\r\n MaxFilterCriteria = MaxFilterCriteria; // For exposure to template\r\n\r\n private _rootObjectId: string = \"\";\r\n\r\n @Input()\r\n set filterCriteria(criteria: FilterCriterium[]) {\r\n this._filterCriteria = criteria;\r\n this._syncAttributeStatesFromCriteria();\r\n }\r\n\r\n @Output() filterCriteriaChange = new EventEmitter<FilterCriterium[]>();\r\n\r\n get filterCriteria() {\r\n return this._filterCriteria;\r\n }\r\n\r\n private _filterCriteria: FilterCriterium[] = [];\r\n\r\n private _objectStructure: ObjectStructureNode | null = null;\r\n\r\n get objectStructure(): ObjectStructureNode | null {\r\n return this._objectStructure\r\n }\r\n\r\n private _complexProperties: ComplexPropertiesNode | null = null;\r\n\r\n get complexProperties(): ComplexPropertiesNode | null {\r\n return this._complexProperties;\r\n }\r\n\r\n toggleAttribute(attrib: CriteriaSelectObjectAttribute) {\r\n attrib.checked = !attrib.checked;\r\n if (attrib.checked === false) {\r\n attrib.valueChecked = false;\r\n }\r\n\r\n this.handleFilterCriteriumAttributeStateChange(attrib);\r\n }\r\n\r\n toggleAttributeValue(attrib: CriteriaSelectObjectAttribute) {\r\n attrib.valueChecked = !attrib.valueChecked;\r\n attrib.checked = attrib.valueChecked;\r\n\r\n this.handleFilterCriteriumAttributeStateChange(attrib);\r\n }\r\n\r\n _defineFilterString(attrib: CriteriaSelectObjectAttribute) {\r\n let substring = `[I][${attrib.id}].Value`;\r\n\r\n if (attrib.valueChecked) {\r\n substring += `[F][0]=${this.formatValuePipe.transform(attrib.value)}`;\r\n }\r\n return substring;\r\n }\r\n\r\n _addFilterCriteria(attrib: CriteriaSelectObjectAttribute) {\r\n // add a new entry\r\n this.filterCriteria.push({\r\n name: attrib.name,\r\n value: attrib.valueChecked ? attrib.value : undefined,\r\n namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n id: attrib.id,\r\n subString: this._defineFilterString(attrib),\r\n });\r\n }\r\n\r\n _updateFilterCriteria(attrib: CriteriaSelectObjectAttribute, index: number) {\r\n // update an existing entry\r\n this.filterCriteria[index] = {\r\n ...this.filterCriteria[index],\r\n name: attrib.name,\r\n value: attrib.valueChecked ? attrib.value : undefined,\r\n namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n subString: this._defineFilterString(attrib),\r\n };\r\n }\r\n\r\n // Helper function for rounding to specified decimals\r\n private roundToDecimal(value: number, decimal: number): number {\r\n const multiplier = Math.pow(10, decimal);\r\n return Math.round(value * multiplier) / multiplier;\r\n }\r\n\r\n titleForAttribute(attribute: CriteriaSelectObjectAttribute): string {\r\n // Translation moved to implementation to not run the translation \r\n // for many values which don't need it\r\n if (attribute.value === null || attribute.value === undefined) {\r\n return this.translateService.instant('_Not_defined');\r\n } else if (attribute.value === '') {\r\n return this.translateService.instant('_Empty_value');\r\n }\r\n return String(attribute.value);\r\n }\r\n\r\n normalizedValue(attribute: CriteriaSelectObjectAttribute, forFilterCriteria: boolean = false): string {\r\n // Translation moved to implementation to not run the translation \r\n // for many values which don't need it\r\n if (attribute.value === null || attribute.value === undefined) {\r\n return forFilterCriteria ? this.translateService.instant(\"_Not_defined\") : \"...\";\r\n }\r\n\r\n if (attribute.value === '') {\r\n return forFilterCriteria ? this.translateService.instant(\"_Empty_value\") : \"''\";\r\n }\r\n\r\n if (attribute?.control === \"Enumeration\" && attribute.enumValues) {\r\n const result: string = String(attribute.enumValues[Number(attribute.value)]);\r\n return result;\r\n }\r\n\r\n // Handle numeric rounding\r\n if (!forFilterCriteria &&\r\n attribute.type === 'double' &&\r\n attribute.decimal &&\r\n typeof (attribute.value) === 'number') {\r\n const roundedValue = this.roundToDecimal(attribute.value, attribute.decimal);\r\n return String(roundedValue);\r\n }\r\n\r\n if (attribute?.control === \"Checkbox\") {\r\n return (attribute.value === 1) ? \"True\" : \"False\";\r\n }\r\n\r\n // Handle datetime transformation\r\n if (attribute?.type === \"datetime\" && typeof (attribute.value) === 'string') {\r\n return this.datetimePipe.transform(attribute.value);\r\n }\r\n\r\n return String(attribute.value);\r\n }\r\n\r\n handleFilterCriteriumAttributeStateChange(attrib: CriteriaSelectObjectAttribute) {\r\n const index = this.filterCriteria.findIndex(x => x.id === attrib.id);\r\n // FILTER CRITERIA ALREADY EXISTS\r\n if (index >= 0) {\r\n if (attrib.checked === false && attrib.valueChecked === false) {\r\n // REMOVE\r\n // filterCriteria no longer used (left / right checkboxes not checked)\r\n this.filterCriteria.splice(index, 1);\r\n } else {\r\n // UPDATE\r\n // filterCriteria still used, but value should be used (right checkbox checked)\r\n this._updateFilterCriteria(attrib, index);\r\n }\r\n this.filterCriteriaChange.emit(this.filterCriteria);\r\n }\r\n // FILTER CRITERIA DOES NOT EXIST and MAX CRITERIA NOT REACHED\r\n else if (this.filterCriteria.length < MaxFilterCriteria) {\r\n // ADD\r\n this._addFilterCriteria(attrib);\r\n this.filterCriteriaChange.emit(this.filterCriteria);\r\n }\r\n }\r\n\r\n handleObjectStructureNodeSelected(node: ObjectStructureNode) {\r\n this._currentObjectId$.next(node.id);\r\n }\r\n\r\n handleComplexPropertyNodeSelected(node: ComplexPropertiesNode) {\r\n this._currentPropertiesObjectId$.next(node.id);\r\n }\r\n\r\n private _createObjectProperties(objectId: string, revision: number | undefined) {\r\n this._loadObjectProperties(objectId, revision)?.subscribe({\r\n\r\n // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\r\n // any for json response\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (propertiesData: any) => {\r\n \r\n this.objectAttributeGroups = this._createAttributeGroupsFromResponse(propertiesData);\r\n this._syncAttributeStatesFromCriteria();\r\n },\r\n error: () => {\r\n this.objectAttributeGroups = [];\r\n }\r\n }\r\n )\r\n\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _createAttributeGroupsFromResponse(propertiesData: any) {\r\n\r\n const groups: Array<CriteriaSelectObjectAttributeGroup> = [];\r\n let localizedAttribGroups = null;\r\n if (propertiesData.localizedAttributeGroups) {\r\n localizedAttribGroups = propertiesData.localizedAttributeGroups;\r\n }\r\n\r\n if (!propertiesData.attributes) {\r\n return groups;\r\n }\r\n\r\n const attribGroups = propertiesData.attributes;\r\n for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\r\n\r\n const newGroup: CriteriaSelectObjectAttributeGroup = {\r\n name: groupName,\r\n expanded: false,\r\n attributes: []\r\n };\r\n\r\n if (localizedAttribGroups?.[groupName]) {\r\n newGroup.name = localizedAttribGroups[groupName];\r\n }\r\n\r\n if (!attribsObject) {\r\n continue;\r\n }\r\n\r\n for (const attrib of Object.values(attribsObject)) {\r\n\r\n const newAttrib: CriteriaSelectObjectAttribute = {\r\n id: attrib.id,\r\n name: attrib.name,\r\n description: attrib.description,\r\n value: attrib.value,\r\n isChangeable: attrib.isChangeable,\r\n type: attrib.type,\r\n checked: false,\r\n valueChecked: false,\r\n group: attrib.group,\r\n }\r\n\r\n // Add attribute information which is not always present\r\n if (attrib.control) {\r\n newAttrib.control = attrib.control;\r\n }\r\n if (attrib.defaultValue) {\r\n newAttrib.defaultValue = attrib.defaultValue;\r\n }\r\n if (attrib.unit) {\r\n newAttrib.unit = attrib.unit;\r\n }\r\n if (attrib.decimal) {\r\n newAttrib.decimal = attrib.decimal;\r\n }\r\n if (attrib.enumdefinition) {\r\n newAttrib.enumValues = attrib.enumdefinition;\r\n }\r\n\r\n newGroup.attributes.push(newAttrib);\r\n }\r\n\r\n groups.push(newGroup);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n private _syncAttributeStatesFromCriteria() {\r\n this.objectAttributeGroups.forEach(group => {\r\n group.attributes.forEach(attrib => {\r\n const criteria = this._filterCriteria.find(x => x.id == attrib.id)\r\n if (criteria) {\r\n attrib.checked = true;\r\n attrib.valueChecked = criteria.value !== undefined;\r\n } else {\r\n attrib.checked = false;\r\n attrib.valueChecked = false;\r\n }\r\n })\r\n })\r\n }\r\n\r\n private _loadObjectProperties(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.get(objectId, revision, \"8\", undefined, false, undefined));\r\n }\r\n\r\n private _loadObjectStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.getTopology(objectId, revision, false, false, undefined));\r\n }\r\n\r\n private _loadObjectComplexPropertiesStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.getComplexPropertiesTopology(objectId, revision));\r\n }\r\n\r\n private _createComplexPropertiestructure(objectId: string, revision: number | undefined) {\r\n this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n const complexProps = ComplexPropertiesNodeBuilder.createFromResponse(structureData);\r\n if (complexProps?.children?.length) {\r\n this._complexProperties = complexProps;\r\n } else {\r\n this._complexProperties = null;\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n private _createObjectStructure(objectId: string, revision: number | undefined) {\r\n this._loadObjectStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n this._objectStructure = ObjectStructureNodeBuilder.createFromResponse(structureData);\r\n }\r\n }\r\n })\r\n }\r\n}\r\n","<!-- Object structure-->\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object structure\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n @if(objectStructure){\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n [hasCheckBox1]=\"false\"\r\n [hasCheckBox2]=\"false\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n >\r\n </lib-bimplus-object-structure>\r\n }\r\n</lib-expansion-panel>\r\n<!-- End Object structure-->\r\n\r\n<!-- Complex properties-->\r\n@if(complexProperties){\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object multiproperties tree\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n >\r\n </lib-bimplus-object-complex-properties>\r\n</lib-expansion-panel>\r\n}\r\n<!-- End Complex properties-->\r\n\r\n<!-- Properties list-->\r\n@if(objectAttributeGroups.length > 0){\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object properties\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n\r\n @for (attribGroup of objectAttributeGroups; track attribGroup) {\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-group-header\">\r\n {{ attribGroup.name }}\r\n </span>\r\n </lib-expansion-panel-header>\r\n <div>\r\n @for (attrib of attribGroup.attributes; track attrib) {\r\n <div class=\"criteria-select-object-properties-attrib-row\">\r\n <div class=\"criteria-select-object-properties-attrib-row-content\">\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\r\n >\r\n <label\r\n class=\"criteria-select-object-properties-attrib-row-cell-label\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"attrib.checked\"\r\n [disabled]=\"\r\n filterCriteria.length === MaxFilterCriteria && !attrib.checked\r\n \"\r\n (click)=\"toggleAttribute(attrib)\"\r\n (keypress)=\"toggleAttribute(attrib)\"\r\n />\r\n <span></span>\r\n </label>\r\n <div class=\"criteria-select-object-properties-attrib-row-cell-text\">\r\n {{ attrib.name }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\r\n >\r\n <label\r\n class=\"criteria-select-object-properties-attrib-row-cell-label\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"attrib.valueChecked\"\r\n [disabled]=\"\r\n filterCriteria.length === MaxFilterCriteria && !attrib.checked\r\n \"\r\n (click)=\"toggleAttributeValue(attrib)\"\r\n (keypress)=\"toggleAttributeValue(attrib)\"\r\n />\r\n <span></span>\r\n </label>\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell-text\"\r\n title=\"{{ titleForAttribute(attrib) }}\"\r\n >\r\n {{ normalizedValue(attrib) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </lib-expansion-panel>\r\n }\r\n</lib-expansion-panel>\r\n}\r\n<!-- End Properties list-->\r\n","import { AfterViewInit, Component, EventEmitter, Input, model, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { BimplusOverlayMessageComponent } from '../../bimplus-overlay-message/bimplus-overlay-message.component';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n\r\ntype TreeNodesLookup = Record<string, TreeNode>;\r\ntype TreeNodeObjectCounts = Record<string, number>;\r\n\r\n@Component({\r\n selector: 'lib-object-filter-result',\r\n imports: [\r\n BimplusFlatTreeComponent,\r\n BimplusOverlayMessageComponent,\r\n ],\r\n templateUrl: './object-filter-result.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './object-filter-result.component.less'\r\n})\r\nexport class ObjectFilterResultComponent implements AfterViewInit {\r\n\r\n // #region public fields\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n @Input()\r\n set filterResult(res: WebSdk.ObjectFilterStructureResponse | null) {\r\n this._filterResult = res;\r\n this._updateTreeData();\r\n }\r\n\r\n @Input()\r\n set selectedObjects(selectedObjects: string[]) {\r\n this._selectedObjects = selectedObjects;\r\n this._syncSelectedObjects();\r\n }\r\n\r\n isFilterResultInvalid = model<boolean>(false);\r\n\r\n // User has clicked on close button of overlay message\r\n // Set the invalid filter back to false to remove overlay message\r\n public setFilterResultValid() {\r\n this.isFilterResultInvalid.set(false);\r\n }\r\n\r\n @Input() filterResultInvalidTitle: string = \"\";\r\n @Input() filterResultInvalidText: string = \"\";\r\n\r\n get treeData() {\r\n return this._treeData;\r\n }\r\n\r\n @Output() nodeSelectionChanged = new EventEmitter<string[]>();\r\n @Output() nodeDoubleClicked = new EventEmitter<string>();\r\n @Output() nodeMouseEntered = new EventEmitter<string>();\r\n @Output() nodeMouseLeft = new EventEmitter<string>();\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n ngAfterViewInit(): void {\r\n if (this._treeData && this._treeData.length > 0) {\r\n this._expandToObjectLevel(this._treeData[0]);\r\n }\r\n }\r\n\r\n handleSelectedNodes(nodes: FlatNode[]) {\r\n this.nodeSelectionChanged.emit(nodes.map(x => x.id));\r\n }\r\n\r\n getNodeObjectCounter(id: string) {\r\n return this._treeNodeObjectCounts[id];\r\n }\r\n\r\n dblClickedObjectNode(node: TreeNode) {\r\n this.nodeDoubleClicked.emit(node.id);\r\n }\r\n\r\n mouseEnterObjectNode(node: TreeNode) {\r\n this.nodeMouseEntered.emit(node.id);\r\n }\r\n\r\n mouseLeaveObjectNode(node: TreeNode) {\r\n this.nodeMouseLeft.emit(node.id);\r\n }\r\n\r\n expandToObjectLevel() {\r\n if (this.treeData.length === 0)\r\n return;\r\n\r\n this._expandToObjectLevel(this._treeData[0]);\r\n }\r\n\r\n clearFilterResult() {\r\n this._filterResult = null;\r\n this._treeData = [];\r\n }\r\n // #endregion public methods\r\n\r\n // #region private fields\r\n private _filterResult: WebSdk.ObjectFilterStructureResponse | null = null;\r\n private _treeData: TreeNode[] = [];\r\n private _treeNodesLookup: TreeNodesLookup = {};\r\n private _treeNodeObjectCounts: TreeNodeObjectCounts = {};\r\n private _selectedObjects: string[] = [];\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private _syncSelectedObjects() {\r\n\r\n const nodes: TreeNode[] = []\r\n\r\n for (const id of this._selectedObjects) {\r\n const treeNode = this._treeNodesLookup[id];\r\n if (treeNode) {\r\n nodes.push(treeNode);\r\n }\r\n }\r\n\r\n this.treeComponent?.reset_selection();\r\n\r\n for (const node of nodes) {\r\n this.treeComponent?.select_node(node.id);\r\n }\r\n\r\n }\r\n\r\n private _updateObjectCounters() {\r\n this._treeNodeObjectCounts = {};\r\n this._countObjects(this.treeData[0]);\r\n }\r\n\r\n private _countObjects(node: TreeNode) {\r\n if (node.nodeType && node.nodeType === \"objectNode\")\r\n return 1;\r\n\r\n let count = 0;\r\n if (!node.children)\r\n return 0;\r\n\r\n for (const child of node.children) {\r\n if (!child)\r\n continue;\r\n\r\n count += this._countObjects(child);\r\n }\r\n\r\n this._treeNodeObjectCounts[node.id] = count;\r\n return count;\r\n }\r\n\r\n private _updateTreeData() {\r\n if (!this._filterResult) {\r\n return;\r\n }\r\n\r\n this._treeNodesLookup = {};\r\n this._treeData = [this._convertFilterResultToTreeNode(this._filterResult.structure, this._treeNodesLookup)];\r\n this._updateObjectCounters();\r\n }\r\n\r\n private _convertFilterResultToTreeNode(node: WebSdk.StructureNode, nodesLookup: TreeNodesLookup | undefined = undefined): TreeNode {\r\n\r\n const treeNode: TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent\r\n };\r\n\r\n if (node.children) {\r\n treeNode.children = [];\r\n for (const child of node.children) {\r\n const childTreeNode = this._convertFilterResultToTreeNode(child, nodesLookup);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n if (!treeNode.parent) {\r\n treeNode.nodeType = \"rootNode\";\r\n } else if (node.type === \"Structure\") {\r\n treeNode.nodeType = \"structureNode\";\r\n } else {\r\n treeNode.nodeType = \"objectNode\"\r\n }\r\n\r\n if (nodesLookup) {\r\n nodesLookup[treeNode.id] = treeNode;\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n private _expandToObjectLevel(node: TreeNode) {\r\n if (node.children) {\r\n for (const child of node.children) {\r\n if (child.nodeType && child.nodeType === \"objectNode\") {\r\n return;\r\n } else {\r\n this._expandToObjectLevel(child);\r\n }\r\n\r\n }\r\n }\r\n\r\n this.treeComponent?.expand_node(node.id);\r\n }\r\n // #endregion private methods\r\n\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData\"\r\n enableParentHighlighting=\"false\"\r\n oneLevelMultiSelect=\"false\"\r\n multiSelect=\"true\"\r\n dataTestPrefix=\"object-filter-result-tree-\"\r\n (selectedNodes)=\"handleSelectedNodes($event)\"\r\n [customNodeTemplate]=\"objFilterResultNode\"\r\n></lib-bimplus-flat-tree>\r\n\r\n@if(isFilterResultInvalid()){\r\n<div class=\"message-overlay\">\r\n <lib-bimplus-overlay-message\r\n [title]=\"filterResultInvalidTitle\"\r\n [message]=\"filterResultInvalidText\"\r\n (close)=\"setFilterResultValid()\"\r\n >\r\n </lib-bimplus-overlay-message>\r\n</div>\r\n}\r\n\r\n<ng-template #objFilterResultNode let-node=\"node\">\r\n @switch (node.nodeType) { @case (\"rootNode\") {\r\n <div class=\"object-navigator-filter-result-root-node noselect\">\r\n {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\r\n </div>\r\n } @case (\"structureNode\") {\r\n <div class=\"noselect\">\r\n {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\r\n </div>\r\n } @case (\"objectNode\") {\r\n <span class=\"noselect\">\r\n <div\r\n class=\"noselect\"\r\n (dblclick)=\"dblClickedObjectNode(node)\"\r\n (mouseenter)=\"mouseEnterObjectNode(node)\"\r\n (mouseleave)=\"mouseLeaveObjectNode(node)\"\r\n >\r\n {{ node.name }}\r\n </div>\r\n </span>\r\n } }\r\n</ng-template>\r\n","import { FilterCriterium } from \"../components/bimplus-object-navigator/bimplus-object-navigator.interface\";\r\n\r\nconst DivsionIDSubstring = 'tabAttribElement.DivisionID';\r\n\r\nexport class FilterString {\r\n\r\n constructor(filterString: string = \"\", maxFilterCriteria: number = 5) {\r\n this._filterString = filterString;\r\n this._maxFilterCriteria = maxFilterCriteria;\r\n }\r\n\r\n get filterString() {\r\n return this._filterString;\r\n }\r\n\r\n private _filterString: string = \"\";\r\n private _maxFilterCriteria: number = 5;\r\n\r\n fromFilterCriteria(criteria: FilterCriterium[]) {\r\n this._filterString = `[I]${DivsionIDSubstring}`;\r\n\r\n for (const criterium of criteria) {\r\n this._filterString += criterium.subString;\r\n }\r\n\r\n return this._filterString;\r\n }\r\n\r\n getReadableValuesFromFilterCriteria(criteria: FilterCriterium[]): Record<string, string> {\r\n const readableValues: Record<string, string> = {};\r\n for (const criterium of criteria) {\r\n if (criterium.id && criterium.name)\r\n readableValues[criterium.id] = criterium.name;\r\n }\r\n\r\n return readableValues;\r\n }\r\n\r\n toFilterCriteria(readableValues: Record<string, string> | undefined = undefined): FilterCriterium[] {\r\n const criteria: FilterCriterium[] = [];\r\n\r\n let firstModelIdCriteriaSkipped = false;\r\n\r\n const parts = this._filterString.split('[I]');\r\n for (const part of parts) {\r\n if (part.length === 0) {\r\n continue;\r\n }\r\n\r\n if (part.includes(DivsionIDSubstring) && !firstModelIdCriteriaSkipped) {\r\n firstModelIdCriteriaSkipped = true;\r\n continue;\r\n }\r\n\r\n criteria.push(this._parseFilterSubstring(part, readableValues));\r\n if (criteria.length === this._maxFilterCriteria) {\r\n break;\r\n }\r\n }\r\n\r\n return criteria;\r\n }\r\n\r\n private _parseFilterSubstring(subString: string, readableValues: Record<string, string> | undefined = undefined): FilterCriterium {\r\n let name = subString;\r\n let id: string | undefined = undefined;\r\n\r\n const indexOpenBrackets = subString.indexOf('[');\r\n const indexCloseBrackets = subString.indexOf(']');\r\n\r\n if (indexOpenBrackets >= 0 && indexCloseBrackets >= 0 && indexCloseBrackets > indexOpenBrackets) {\r\n const readableId = subString.slice(indexOpenBrackets + 1, indexCloseBrackets);\r\n id = readableId;\r\n if (readableId && readableValues) {\r\n const readableString = readableValues[readableId];\r\n if (readableString) {\r\n name = readableString;\r\n }\r\n }\r\n } else if (subString.includes('.')) {\r\n const splitted = subString.split('.');\r\n name = splitted[splitted.length - 1];\r\n }\r\n\r\n return {\r\n name: name,\r\n subString: \"[I]\" + subString,\r\n id: id\r\n }\r\n }\r\n\r\n}\r\n","import * as WebSdk from 'bimplus-websdk';\r\nimport { Observable, concatMap, from, map } from 'rxjs';\r\n\r\nexport class FilterStructureFetcher {\r\n\r\n static fetchObjectFilterStructureFromSelection(projectId: string, filter: WebSdk.ObjectFilter, selectionObject: WebSdk.ExportObject, api: WebSdk.Api): Observable<WebSdk.ObjectFilterStructureResponse> {\r\n const isTemporary = !filter.id;\r\n let filterId = filter.id ? filter.id : \"\";\r\n\r\n let observeable: Observable<WebSdk.ObjectFilterStructureResponse> | null = null;\r\n\r\n if (!isTemporary) {\r\n observeable = from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject))).pipe(\r\n concatMap(selectionObj => {\r\n if (!selectionObj?.id) {\r\n throw new Error('Failed to create selection object');\r\n }\r\n return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined));\r\n })\r\n )\r\n } else {\r\n observeable = from(api.objectFilters.post(JSON.stringify(filter), projectId)).pipe(\r\n concatMap(filterObj => {\r\n if (!filterObj?.id) {\r\n throw new Error('Failed to create temporary filter object');\r\n }\r\n\r\n filterId = filterObj.id;\r\n\r\n return from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject)));\r\n }),\r\n concatMap(selectionObj => {\r\n if (!selectionObj?.id) {\r\n throw new Error('Failed to create selection object');\r\n }\r\n return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined)).pipe(\r\n map((filterResult) => {\r\n api.objectFilters.delete(filterId);\r\n return filterResult;\r\n })\r\n );\r\n })\r\n )\r\n }\r\n return observeable;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject ,from } from 'rxjs';\r\nimport { CommonModule} from '@angular/common';\r\nimport { FilterCriteriaSelectionMode, FilterCriterium, FilterType, MaxFilterCriteria } from './bimplus-object-navigator.interface';\r\nimport { FilterCriteriumComponent } from './filter-criterium/filter-criterium.component';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\n\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { CriteriaSelectObjectPropertiesComponent } from './criteria-select-object-properties/criteria-select-object-properties.component';\r\nimport { ObjectFilterResultComponent } from './object-filter-result/object-filter-result.component';\r\nimport { BimplusContextMenuComponent } from '../bimplus-context-menu/bimplus-context-menu.component'\r\nimport { BimplusContextMenuItem } from '../bimplus-context-menu/bimplus-context-menu.interface';\r\nimport { FilterString } from '../../utils/filterString';\r\nimport { FilterStructureFetcher } from '../../utils/filterStructureFetcher';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-navigator',\r\n imports: [CommonModule,\r\n FormsModule,\r\n NgSelectModule,\r\n FilterCriteriumComponent,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n BimplusSidenavDrawerContentComponent,\r\n TranslateModule,\r\n CriteriaSelectObjectPropertiesComponent,\r\n BimplusContextMenuComponent,\r\n ObjectFilterResultComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n templateUrl: './bimplus-object-navigator.component.html',\r\n styleUrl: './bimplus-object-navigator.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusObjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n\r\n constructor(){\r\n super()\r\n }\r\n\r\n // #region public fields\r\n @ViewChild(ObjectFilterResultComponent) objectFilterResult: ObjectFilterResultComponent | null = null;\r\n\r\n @Input()\r\n hideFilterContextMenu: boolean = false;\r\n\r\n @Input()\r\n filterContextMenu: Array<BimplusContextMenuItem> = [];\r\n\r\n @Input()\r\n set filterTypes(types : Array<FilterType>){\r\n this._filterTypes = types;\r\n if(this._filterTypes.length >0)\r\n this.activeFilterType = this._filterTypes[0];\r\n }\r\n\r\n get filterTypes():Array<FilterType>{\r\n return this._filterTypes;\r\n }\r\n\r\n set activeFilterType(value : FilterType | null){\r\n this.activeFilterTypeSubject$.next(value);\r\n }\r\n\r\n get activeFilterType() : FilterType | null{\r\n return this.activeFilterTypeSubject$.getValue();\r\n }\r\n\r\n activeFilterTypeSubject$ = new BehaviorSubject<FilterType | null> (null);\r\n activeFilterSubject$ = new BehaviorSubject<WebSdk.ObjectFilter | null> (null);\r\n\r\n set activeFilter(filter : WebSdk.ObjectFilter | null){\r\n\r\n // New active filter is selected. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n\r\n if(filter && !filter.id){ // Switching to custom filter will restore the default custom filter\r\n this._setDefaultCustomFilterString(filter);\r\n }\r\n\r\n this.activeFilterSubject$.next(filter);\r\n }\r\n\r\n get activeFilter() : WebSdk.ObjectFilter | null{\r\n return this.activeFilterSubject$.getValue();\r\n }\r\n\r\n @Input()\r\n filters : WebSdk.ObjectFiltersResponse | null = null;\r\n\r\n filterCriteria : FilterCriterium[] = []\r\n filterCriteriaChanged : boolean = false;\r\n maxFilterCriteria: number = MaxFilterCriteria;\r\n\r\n @Input()\r\n api : WebSdk.Api | null = null;\r\n\r\n @Input()\r\n projectId : string = ''\r\n\r\n @HostBinding('class.object-navigator') objNavClassClass: boolean = true;\r\n\r\n filterCriteriaSelectionMode$ = new BehaviorSubject<FilterCriteriaSelectionMode>(FilterCriteriaSelectionMode.None);\r\n\r\n @Output()\r\n filterCriteriaSelectionModeChanged = new EventEmitter<FilterCriteriaSelectionMode>();\r\n\r\n @Input()\r\n selectedObjectId : string | null = null;\r\n\r\n @Input()\r\n selectedRevision : number | undefined = undefined;\r\n\r\n @Input()\r\n selectedObjects : string[] = [];\r\n\r\n @Input()\r\n selectionObject : WebSdk.ExportObject | null = null;\r\n\r\n get filterResult(){\r\n return this._filterResult;\r\n }\r\n\r\n @Output()\r\n filterResultObjectSelectionChanged = new EventEmitter<string[]>();\r\n\r\n @Output()\r\n filterResultObjectDoubleClicked = new EventEmitter<string>();\r\n\r\n @Output()\r\n filterResultObjectMouseEntered = new EventEmitter<string>();\r\n\r\n @Output()\r\n filterResultObjectMouseLeft = new EventEmitter<string>();\r\n\r\n @Output()\r\n pipetteActiveStatus = new EventEmitter<boolean>();\r\n\r\n FilterCriteriaSelectionMode = FilterCriteriaSelectionMode; // Expose enum to template\r\n\r\n public isLoadingResults = false;\r\n\r\n public filterResultInvalidated = false;\r\n // #endregion public fields\r\n\r\n // #region private fields\r\n private _filterResult : WebSdk.ObjectFilterStructureResponse | null = null;\r\n private _filterTypes : Array<FilterType> = [];\r\n // #endregion private fields\r\n\r\n // #region public methods\r\n ngOnInit() {\r\n\r\n this.activeFilterTypeSubject$.subscribe({\r\n next: (v) => {\r\n if(!this.projectId || !this.api || !v){\r\n return;\r\n }\r\n\r\n if (this._filterResult) {\r\n // Filter results are available and visibility of model/layer was changed\r\n // Invalidate filter results => show overlay info dailog\r\n this.filterResultInvalidated = true;\r\n }\r\n\r\n this.activeFilter = null;\r\n\r\n this.loadCurrentLayerFilters(this.projectId, v.id)?.subscribe({\r\n next: (value) => {\r\n this.filters = [this._createDefaultCustomFilter(v.id), ...value];\r\n this.activeFilter = this.filters[0];\r\n this._applyCustomOrStoredFilter();\r\n },\r\n error: err => {throw new Error (err)},\r\n }\r\n )}\r\n });\r\n\r\n this.activeFilterSubject$.subscribe({\r\n next: (v) => {\r\n if(!v)\r\n return;\r\n\r\n this.filterCriteria = this.parseFilterString(v);\r\n this._applyCustomOrStoredFilter();\r\n }\r\n });\r\n\r\n this.filterCriteriaSelectionMode$.subscribe({\r\n next: (v) => {\r\n this.filterCriteriaSelectionModeChanged.emit(v)\r\n }\r\n })\r\n\r\n if( this.filterTypes.length > 0){\r\n this.activeFilterType = this.filterTypes[0];\r\n }\r\n }\r\n\r\n loadCurrentLayerFilters(projectId : string, layerId : string){\r\n if(!this.api){\r\n return;\r\n }\r\n return from(this.api.objectFilters.get(layerId,projectId));\r\n }\r\n\r\n parseFilterString(filter : WebSdk.ObjectFilter){\r\n const filterString = new FilterString(filter.filterString, this.maxFilterCriteria);\r\n return filterString.toFilterCriteria(filter.readableValues);\r\n }\r\n\r\n deleteFilterCriterium(index: number){\r\n this.filterCriteria.splice(index, 1);\r\n this.filterCriteria = [...this.filterCriteria];\r\n // Filter criteria was removed. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n this.activateModifiedCustomFilter();\r\n }\r\n\r\n setFilterCriteriaSelectionMode(mode: FilterCriteriaSelectionMode) {\r\n const isSameMode = this.filterCriteriaSelectionMode$.getValue() === mode;\r\n this.filterCriteriaSelectionMode$.next(isSameMode ? FilterCriteriaSelectionMode.None : mode);\r\n this.handlePipetteActiveStatus(!isSameMode);\r\n }\r\n \r\n applyFilterDisabled() : boolean {\r\n // Apply filter button should be disabled when no filter criteria are selected\r\n // or filter criteria was already applied and no new criteria was selected\r\n return this.filterCriteria.length === 0 || ! this.filterCriteriaChanged;\r\n }\r\n\r\n applyFilter(){\r\n this.handlePipetteActiveStatus(false /* disable pipette cursor */);\r\n this.filterCriteriaSelectionMode$.next(FilterCriteriaSelectionMode.None);\r\n this._filterResult = null;\r\n // Filter results will be updated again, so they are no longer invalid\r\n this.filterResultInvalidated = false;\r\n\r\n // Custom filter is selected\r\n if(this.activeFilter && !this.activeFilter.id){\r\n this.activeFilter.filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\r\n }\r\n\r\n if(this.selectionObject){\r\n this._applySelectionObjectFilter(this.activeFilter);\r\n }\r\n }\r\n\r\n handleFilterResultSelectionChanged(selection : string[]){\r\n this.filterResultObjectSelectionChanged.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectDoubleClicked(selection : string){\r\n this.filterResultObjectDoubleClicked.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectMouseEntered(selection : string){\r\n this.filterResultObjectMouseEntered.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectMouseLeft(selection : string){\r\n this.filterResultObjectMouseLeft.emit(selection);\r\n }\r\n\r\n handlePipetteActiveStatus(status: boolean) {\r\n this.pipetteActiveStatus.emit(status);\r\n }\r\n\r\n filterCriteriaWasChanged(/*filterCriteria: FilterCriterium[]*/) {\r\n // Some new filter criteria was selected. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n }\r\n\r\n activateModifiedCustomFilter(){\r\n // When existing filter is changed, Custom filter will be selected and filter settings need to be cloned. Nothing is done when custom filter is already active\r\n if(this.activeFilter?.id && this.filters){\r\n\r\n // Copy filter string from current criteria settings to custom filter\r\n this.filters[0].filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\r\n this.filters[0].readableValues = new FilterString().getReadableValuesFromFilterCriteria(this.filterCriteria);\r\n\r\n this.activeFilterSubject$.next(this.filters[0]);\r\n }\r\n }\r\n // #endregion public methods\r\n\r\n // #region private methods\r\n private _applySelectionObjectFilter(activeFilter : WebSdk.ObjectFilter | null){\r\n\r\n if(!this.api || !this.selectionObject || !activeFilter){\r\n return;\r\n }\r\n\r\n this.selectionObject.singleUse = true;\r\n this.selectionObject.selection.singleuse = true;\r\n\r\n this.isLoadingResults = true;\r\n\r\n FilterStructureFetcher.fetchObjectFilterStructureFromSelection(this.projectId, activeFilter, this.selectionObject, this.api).subscribe({\r\n next: (filterResult) => {\r\n this._filterResult = filterResult;\r\n this.isLoadingResults = false;\r\n // Fetching new results finished. Apply filter button should be disabled\r\n this.filterCriteriaChanged = false;\r\n }\r\n });\r\n }\r\n\r\n private _setDefaultCustomFilterString(filter: WebSdk.ObjectFilter){\r\n const typeAttribId = \"a0e8ae2c-c869-4ec3-9019-25d3704be707\";\r\n filter.filterString = `[I][${typeAttribId}].Value`;\r\n filter.readableValues = {};\r\n filter.readableValues[typeAttribId] = \"Type\"; // Provide readable criterium name for type\r\n }\r\n\r\n private _createDefaultCustomFilter(disciplineID: string) : WebSdk.ObjectFilter{\r\n\r\n const filter = {\r\n module: \"00000000-0000-0000-0000-000000000000\",\r\n category: \"\",\r\n disciplineID: disciplineID,\r\n name: \"Custom filter\",\r\n filterString: \"\",\r\n isDefault: false,\r\n disableSortByModels: false,\r\n }\r\n\r\n this._setDefaultCustomFilterString(filter);\r\n return filter;\r\n }\r\n\r\n private _applyCustomOrStoredFilter() {\r\n if(this.activeFilter && this.activeFilter.id){\r\n // Stored filter is selected. Results must be applied automatically.\r\n this.applyFilter();\r\n } else {\r\n // Custom filter is selected. Properties of selected object must be shown again.\r\n if (this.selectedObjectId) {\r\n this.setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties);\r\n } else {\r\n this.objectFilterResult?.clearFilterResult();\r\n }\r\n }\r\n }\r\n // #endregion private methods\r\n\r\n}\r\n","<lib-bimplus-sidenav-drawer-content [header]=\"'_Object navigator' | translate\"\r\n [isLoading]=\"isLoadingResults\"\r\n [loadingSpinnerText]=\"'_Loading_Filter_Results' | translate\"\r\n >\r\n <div class=\"object-navigator-content-container\">\r\n @if(filterTypes.length > 0){\r\n <div class=\"description\">\r\n {{\"_Select_an_object_using_Object_Picker\" | translate}}\r\n </div>\r\n <div class=\"object-navigator-filters-type\">\r\n <ng-select data-test=\"object-navigator-filter-types-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilterType\" [clearable]=\"false\" [searchable]=\"false\">\r\n @for (type of filterTypes; track type) {\r\n <ng-option [value]=\"type\">{{type.name}}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n <div class=\"object-navigator-filters-name\">\r\n <ng-select data-test=\"object-navigator-filters-name-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilter\" [clearable]=\"false\" [disabled]=\"!filters\" [searchable]=\"false\">\r\n @for (filter of filters; track filter) {\r\n <ng-option [value]=\"filter\">{{filter.name}}</ng-option>\r\n }\r\n </ng-select>\r\n\r\n @if(!hideFilterContextMenu){\r\n @if (filterContextMenu.length) {\r\n <lib-bimplus-context-menu class=\"object-navigator-filters-name-context-menu\"\r\n [items]=\"filterContextMenu\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n }\r\n\r\n </div>\r\n\r\n <lib-expansion-panel class=\"object-navigator-filter-criteria-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-navigator-filter-criteria-header\">\r\n {{ \"_Assign_Objects_Selection_Mode\" | translate }} &#40;{{ filterCriteria.length }}/{{ maxFilterCriteria }}&#41;\r\n </span>\r\n <lib-expansion-panel-header-actions>\r\n <div class=\"object-navigator-pick-object-button\"\r\n [ngClass]=\"filterCriteriaSelectionMode$.getValue() === FilterCriteriaSelectionMode.SelectObjectProperties? 'active' : ''\"\r\n (click)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\r\n (keypress)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\r\n [title]=\"'_Object_Picker'| translate\"\r\n ></div>\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <div class=\"filter-criteria-container\">\r\n @for (criterium of filterCriteria; track criterium; let i = $index) {\r\n <app-filter-criterium\r\n [criterium] = \"criterium\"\r\n [indent]=\"i*0.8\"\r\n (deleteCriterium)=\"deleteFilterCriterium(i)\"\r\n ></app-filter-criterium>\r\n }\r\n </div>\r\n </lib-expansion-panel>\r\n\r\n @switch(filterCriteriaSelectionMode$.getValue()){\r\n @case(FilterCriteriaSelectionMode.SelectObjectProperties){\r\n @if(!selectedObjectId){\r\n <p id=\"NoObjectSelected\">{{ \"_NoObjectSelected\" | translate}}</p>\r\n }\r\n }\r\n }\r\n\r\n <div class=\"object-navigator-apply-button-row\">\r\n <button class=\"primary-button\"\r\n [class.disabled]=\"applyFilterDisabled()\"\r\n [disabled]=\"applyFilterDisabled()\"\r\n (click)=\"applyFilter()\"\r\n >\r\n {{\"_Apply filter\" | translate}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"object-navigator-separator\"></div>\r\n\r\n @switch(filterCriteriaSelectionMode$.getValue()){\r\n @case(FilterCriteriaSelectionMode.SelectObjectProperties){\r\n @if(selectedObjectId){\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <lib-criteria-select-object-properties\r\n [api]=\"api\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [(filterCriteria)]=\"filterCriteria\"\r\n [rootObjectId]=\"selectedObjectId\"\r\n [revision]=\"selectedRevision\"\r\n (filterCriteriaChange)=\"filterCriteriaWasChanged()\"\r\n >\r\n </lib-criteria-select-object-properties>\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n }\r\n @case(FilterCriteriaSelectionMode.SelectAttributes){\r\n\r\n }\r\n @default{\r\n @if (filterResult) {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <lib-object-filter-result\r\n [filterResult]=\"filterResult\"\r\n [selectedObjects]=\"selectedObjects\"\r\n [isFilterResultInvalid]=\"filterResultInvalidated\"\r\n [filterResultInvalidTitle]=\"'Result_is_Invalid' | translate\"\r\n [filterResultInvalidText]=\"'Selection_in_Project_navigator_has_changed' | translate\"\r\n (nodeSelectionChanged)=\"handleFilterResultSelectionChanged($event)\"\r\n (nodeDoubleClicked)=\"handleFilterResultObjectDoubleClicked($event)\"\r\n (nodeMouseEntered)=\"handleFilterResultObjectMouseEntered($event)\"\r\n (nodeMouseLeft)=\"handleFilterResultObjectMouseLeft($event)\"\r\n ></lib-object-filter-result>\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n }\r\n }\r\n }\r\n @else {\r\n <div data-test=\"object-navigator-no-filter-types-message\" class=\"object-navigator-no-filter-types\"> {{\"_No_visible_models_found\" | translate}} </div>\r\n }\r\n</div>\r\n</lib-bimplus-sidenav-drawer-content>\r\n","import { Component, ViewEncapsulation, Input, EventEmitter, Output, ElementRef, OnChanges, SimpleChanges, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\r\nimport { TooltipMessageData, TooltipMessagePosition } from './bimplus-tooltip-message.interface'\r\n@Component({\r\n selector: 'lib-bimplus-tooltip-message',\r\n imports: [CommonModule, ClickOutsideDirective],\r\n templateUrl: './bimplus-tooltip-message.component.html',\r\n styleUrl: './bimplus-tooltip-message.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusTooltipMessageComponent implements OnChanges {\r\n private el = inject(ElementRef);\r\n\r\n private _element: HTMLElement;\r\n constructor() {\r\n this._element = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n // Getter for _element\r\n public get element(): HTMLElement {\r\n return this._element;\r\n }\r\n\r\n @Input() messagePosition: TooltipMessagePosition = {\r\n posX: 0,\r\n posY: 0,\r\n };\r\n\r\n @Input() messageData: TooltipMessageData = {};\r\n\r\n @Input() messageVisibility: boolean = false;\r\n @Output() messageVisibilityChange = new EventEmitter<boolean>();\r\n\r\n protected _clickOutside() {\r\n this.messageVisibility = false;\r\n this.messageVisibilityChange.emit(this.messageVisibility)\r\n }\r\n\r\n //<<Calculation of the correct position of the tooltip\r\n private _resizeObserver!: ResizeObserver;\r\n protected _messageParentElement!: ElementRef;\r\n\r\n protected _parentWidth: number = 0;\r\n protected _parentHeight: number = 0;\r\n\r\n get messageParent(): ElementRef {\r\n return this._messageParentElement;\r\n }\r\n\r\n @Input() set messageParent(element: ElementRef) {\r\n this._messageParentElement = element;\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n const { width, height } = entry.contentRect;\r\n this._parentWidth = width;\r\n this._parentHeight = height; \r\n }\r\n });\r\n\r\n this._resizeObserver.observe(this._messageParentElement.nativeElement);\r\n }\r\n\r\n tooltipRectangleIsOutOfParentRectangleX(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\r\n return (tooltipRectangle.x + tooltipRectangle.width - parentRectangle.x - parentRectangle.width) > 0;\r\n }\r\n tooltipRectangleIsOutOfParentRectangleY(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\r\n return (tooltipRectangle.y + tooltipRectangle.height - parentRectangle.y - parentRectangle.height) > 0;\r\n }\r\n\r\n correctTooltipPositionX(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\r\n this.messagePosition.posX = this.messagePosition.posX + oldPosX - (_tooltipRectangle.x + _tooltipRectangle.width);\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(flippedY && Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, true);\r\n }, 0);\r\n }\r\n }\r\n\r\n correctTooltipPositionY(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\r\n this.messagePosition.posY = this.messagePosition.posY + oldPosY - (_tooltipRectangle.y + _tooltipRectangle.height);\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(flippedX && Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, true, oldPosY, flippedY);\r\n }, 0);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['messageVisibility']) {\r\n if(!changes['messageVisibility'].currentValue) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _oldPosX = this.messagePosition.posX;\r\n const _oldPosY = this.messagePosition.posY;\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(_oldPosX, true, _oldPosY, false);\r\n }, 0);\r\n } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(_oldPosX, false, _oldPosY, true);\r\n }, 0);\r\n }\r\n }, 0);\r\n }\r\n }\r\n //Calculation of the correct position of the tooltip>>\r\n}\r\n","@if (messageVisibility) {\r\n <div\r\n class=\"tooltip-message\"\r\n libClickOutside\r\n (clickOutside)=\"_clickOutside()\"\r\n [ngStyle]=\"{\r\n 'top.px': messagePosition.posY\r\n , 'left.px': messagePosition.posX\r\n }\"\r\n >\r\n <ng-content select=\".tooltip-message-title-content\"></ng-content>\r\n @if (messageData && messageData.title) {\r\n <div\r\n class=\"tooltip-message-title\"\r\n >\r\n {{messageData.title}}\r\n </div>\r\n }\r\n <ng-content select=\".tooltip-message-messages-content\"></ng-content>\r\n @if (messageData && messageData.messages) {\r\n <div\r\n class=\"tooltip-message-messages\"\r\n >\r\n @for (message of messageData.messages; track message) {\r\n @if (message.separatingLine) {\r\n <div class=\"separating-line\"></div>\r\n }\r\n <div class=\"tooltip-message-message\">\r\n @if (message.label) {\r\n <span\r\n class=\"label\"\r\n [class.failed]=\"message.type==='failed'\"\r\n [class.success]=\"message.type==='success'\"\r\n >\r\n {{message.label}}\r\n </span>\r\n }\r\n @if (message.value) {\r\n <span\r\n class=\"value\"\r\n >\r\n @if (message.label) {\r\n :\r\n }\r\n {{message.value}}\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n <ng-content select=\".tooltip-message-footer-content\"></ng-content>\r\n @if (messageData && messageData.footer) {\r\n <div\r\n class=\"tooltip-message-footer\"\r\n >\r\n {{messageData.footer}}\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nexport enum CursorType {\r\n Pick = 'cursor-pick',\r\n Hide = 'cursor-hide',\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class CursorsService {\r\n\r\n // #region private fields\r\n private _cursorElement: HTMLElement | null = null;\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private getCursorElement(): HTMLElement | null {\r\n if (this._cursorElement) {\r\n return this._cursorElement;\r\n } else {\r\n return this.getMainViewportContainer();\r\n }\r\n }\r\n private getMainViewportContainer() : HTMLElement | null {\r\n const mainViewportContainer = document.getElementById('mainViewportContainer');\r\n if (!mainViewportContainer) {\r\n console.log(\"mainViewportContainer not found\");\r\n }\r\n return mainViewportContainer;\r\n }\r\n\r\n private addCursor(cursorType: CursorType) {\r\n this.getCursorElement()?.classList.add(cursorType);\r\n }\r\n\r\n private removeCursor(cursorType: CursorType) {\r\n this.getCursorElement()?.classList.remove(cursorType);\r\n }\r\n // #endregion\r\n\r\n\r\n // #region public methods\r\n setCursorElement(cursorElement: HTMLElement | null) {\r\n this._cursorElement = cursorElement;\r\n }\r\n\r\n showPickCursor(show: boolean) {\r\n if (show) {\r\n this.addCursor(CursorType.Pick)\r\n } else {\r\n this.removeCursor(CursorType.Pick);\r\n }\r\n }\r\n\r\n showHideCursor(show: boolean) {\r\n if (show) {\r\n this.addCursor(CursorType.Hide)\r\n } else {\r\n this.removeCursor(CursorType.Hide);\r\n }\r\n }\r\n // #endregion\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, Renderer2, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libDraggableComponent]',\r\n standalone: true\r\n})\r\nexport class ComponentDraggableDirective {\r\n private el = inject(ElementRef);\r\n private renderer = inject(Renderer2);\r\n\r\n\r\n private _isDraggingActive = false;\r\n private _isDragging = false;\r\n\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor() {\r\n if (!this._isDraggingActive) return;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n this.renderer.setStyle(this.el.nativeElement, 'user-drag', 'none');\r\n }\r\n\r\n @Input() set libDraggableComponent(condition: boolean) {\r\n const element = this.el.nativeElement;\r\n this._isDraggingActive = condition;\r\n if (condition) {\r\n this.renderer.setStyle(element, 'cursor', 'grab');\r\n this.renderer.setStyle(element, 'user-drag', 'none');\r\n } else {\r\n this.renderer.setStyle(element, 'cursor', 'unset');\r\n this.renderer.setStyle(element, 'user-drag', 'auto');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this._isDraggingActive) return;\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this._isDragging = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (!this._isDraggingActive) return;\r\n if (this._isDragging) {\r\n this._isDragging = false;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n }\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this._isDraggingActive) return;\r\n\r\n if (this._isDragging) {\r\n const newX = this.startX - event.clientX;\r\n const newY = this.startY - event.clientY;\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n\r\n const top = this.el.nativeElement.offsetTop - newY;\r\n const left = this.el.nativeElement.offsetLeft - newX;\r\n\r\n this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\r\n }\r\n }\r\n\r\n\r\n /* touch mode */\r\n @HostListener('touchstart', ['$event']) //corresponding to mousedown\r\n onTouchStart(event: TouchEvent) {\r\n if (!this._isDraggingActive) return;\r\n this.startX = event.targetTouches[0].pageX;\r\n this.startY = event.targetTouches[0].pageY;\r\n this._isDragging = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\r\n }\r\n\r\n @HostListener('document:touchmove', ['$event']) //corresponding to mousemove\r\n onTouchMove(event: TouchEvent) {\r\n if (!this._isDraggingActive) return;\r\n\r\n if (this._isDragging) {\r\n const newX = this.startX - event.targetTouches[0].pageX;\r\n const newY = this.startY - event.targetTouches[0].pageY;\r\n\r\n this.startX = event.targetTouches[0].pageX;\r\n this.startY = event.targetTouches[0].pageY;\r\n\r\n const top = this.el.nativeElement.offsetTop - newY;\r\n const left = this.el.nativeElement.offsetLeft - newX;\r\n\r\n this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\r\n }\r\n }\r\n\r\n @HostListener('document:touchend') //corresponding to mouseup\r\n onTouchEnd() {\r\n if (!this._isDraggingActive) return;\r\n if (this._isDragging) {\r\n this._isDragging = false;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n }\r\n }\r\n\r\n}\r\n","import { AfterContentInit, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { IDialogOptions } from './bimplus-general-dialog-config-settings';\r\nimport { ComponentDraggableDirective } from '../../directives/component-draggable/componentsDraggable.directive';\r\n\r\nimport { DialogService } from './bimplus-general-overlay-dialog.service';\r\n\r\n@Component({\r\n selector: 'app-general-overlay-dialog',\r\n imports: [ComponentDraggableDirective],\r\n templateUrl: './bimplus-general-overlay-dialog.component.html',\r\n styleUrls: ['./bimplus-general-overlay-dialog.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimportalGeneralOverlayDialogComponent implements OnInit, AfterContentInit {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly cdref = inject(ChangeDetectorRef);\r\n\r\n\r\n @ViewChild('dialogRefContainer') genDialogRefContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChild('dialogOverlay') dialogOverlay!: ElementRef<HTMLDivElement>;\r\n\r\n options: IDialogOptions | undefined;\r\n units: string = 'rem';\r\n\r\n ngOnInit(): void {\r\n this.options = this.dialogService.options;\r\n }\r\n\r\n onClose() {\r\n this.dialogService.close();\r\n }\r\n\r\n ngAfterContentInit() {\r\n if (this.options) {\r\n this.cdref.detectChanges();\r\n this.setOptions();\r\n }\r\n }\r\n\r\n setOptions() {\r\n if (this.options) {\r\n this.setDimensions();\r\n this.setPosition();\r\n this.setOverlay();\r\n }\r\n }\r\n\r\n private setDimensions() {\r\n const width = this.options?.width && this.options.width.length > 0 ? this.options.width : 'auto';\r\n const height = this.options?.height && this.options.height.length > 0 ? this.options.height : 'auto';\r\n this.genDialogRefContainer.nativeElement.style.width = width;\r\n this.genDialogRefContainer.nativeElement.style.height = height;\r\n }\r\n\r\n private setPosition() {\r\n if (this.options?.position === 'middle') {\r\n this.setPositionsMiddle();\r\n } else if (this.options?.position === 'unset') {\r\n this.setPositionsUnset();\r\n }\r\n }\r\n\r\n setPositionsUnset() {\r\n if (this.options) {\r\n this.genDialogRefContainer.nativeElement.style.position = 'fixed';\r\n const top = this.options?.positionOptions?.top ?? '0' + this.units;\r\n const bottom = this.options?.positionOptions?.bottom ?? '0' + this.units;\r\n const left = this.options?.positionOptions?.left ?? '0' + this.units;\r\n const right = this.options?.positionOptions?.right ?? '0' + this.units;\r\n\r\n this.genDialogRefContainer.nativeElement.style.position = 'absolute';\r\n this.genDialogRefContainer.nativeElement.style.top = top;\r\n this.genDialogRefContainer.nativeElement.style.left = left;\r\n this.genDialogRefContainer.nativeElement.style.bottom = bottom;\r\n this.genDialogRefContainer.nativeElement.style.right = right;\r\n\r\n this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : false;\r\n this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\r\n }\r\n }\r\n\r\n setPositionsMiddle() {\r\n if (this.options) {\r\n this.genDialogRefContainer.nativeElement.className = this.genDialogRefContainer.nativeElement.className + ' middle';\r\n this.options.draggable = false;\r\n this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : true;\r\n this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\r\n }\r\n }\r\n\r\n private setOverlay() {\r\n if (this.options?.overlayVisibilityEnabled) {\r\n this.dialogOverlay.nativeElement.style.backgroundColor = 'var(--modal-fade-in-background-color)';\r\n }\r\n }\r\n\r\n onKeyPress(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n if (this.options?.overlayClickEnabled) {\r\n this.dialogService.close();\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n","@if (options) {\r\n <div class=\"general-dialog-wrapper\" #generalDialogWrapper>\r\n <section class=\"general-dialog-content\" #dialogRefContainer\r\n [libDraggableComponent]=\"options.draggable ? true : false\">\r\n <ng-content></ng-content>\r\n </section>\r\n <div class=\"general-dialog-overlay\" #dialogOverlay (click)=\"onClose()\" (keypress)=\"onKeyPress($event)\"\r\n [style.display]=\"options.overlayVisibilityEnabled ? 'block' : 'none'\">\r\n </div>\r\n </div>\r\n}\r\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, Injectable, Type, inject } from '@angular/core';\r\nimport { IDialogInputData, IDialogOptions } from './bimplus-general-dialog-config-settings';\r\nimport { Subject } from 'rxjs';\r\nimport { BimportalGeneralOverlayDialogComponent } from './bimplus-general-overlay-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n private readonly appRef = inject(ApplicationRef);\r\n private readonly injector = inject(EnvironmentInjector);\r\n\r\n\r\n generalDialogComponentBody!: ComponentRef<unknown>; //here will be rendered every component we call inside general dialog\r\n generalDialog!: ComponentRef<BimportalGeneralOverlayDialogComponent>; //here will be rendered every component we call inside general dialog\r\n private _isDialogOpen = false;\r\n\r\n inputData: unknown;\r\n private readonly outputData = new Subject<unknown>();\r\n\r\n options: IDialogOptions | undefined;\r\n\r\n open(componentBody: Type<unknown>, data: IDialogInputData) { //todo pass data to second component\r\n if (data?.options) {\r\n this.initializeSettings(data);\r\n this.createComponentsRef(componentBody); //componentBody is component which is added inside to general dialog and rendered\r\n }\r\n }\r\n\r\n initializeSettings(data: IDialogInputData) {\r\n try {\r\n this.inputData = data?.data;\r\n this.options = data.options;\r\n } catch (e) {\r\n console.log('Missing data in open method', e);\r\n }\r\n\r\n }\r\n\r\n createComponentsRef(componentBody: Type<unknown>) {\r\n this.generalDialogComponentBody = createComponent(componentBody, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n this.generalDialog = createComponent(BimportalGeneralOverlayDialogComponent, {\r\n environmentInjector: this.injector,\r\n projectableNodes: [[this.generalDialogComponentBody.location.nativeElement]],\r\n });\r\n\r\n document.body.appendChild(this.generalDialog.location.nativeElement);\r\n\r\n this.appRef.attachView(this.generalDialogComponentBody.hostView); //first render body of general dialog, it can be any component we create\r\n this.appRef.attachView(this.generalDialog.hostView); //then render body of general dialog, which we can add in any component, can have different content\r\n this._isDialogOpen = true;\r\n }\r\n\r\n close(outputData?: unknown) {\r\n if (outputData) {\r\n this.setOutputData(outputData);\r\n } else {\r\n this.resetSettings();\r\n }\r\n this.generalDialogComponentBody.location.nativeElement.remove();\r\n this.generalDialog.location.nativeElement.remove();\r\n this._isDialogOpen = false;\r\n }\r\n\r\n resetSettings() {\r\n this.inputData = null;\r\n this.options = undefined;\r\n }\r\n\r\n isDialogOpened() {\r\n return this._isDialogOpen;\r\n }\r\n\r\n setOutputData(data: unknown): void {\r\n if (this._isDialogOpen) {\r\n this.outputData.next(data);\r\n }\r\n }\r\n\r\n getOutputData(): Subject<unknown> {\r\n return this.outputData;\r\n }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, HostListener, Input, TemplateRef, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\n\r\nexport interface WarningDialogInputData {\r\n title: string;\r\n message: string;\r\n buttonsRef?: TemplateRef<unknown>;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-warning',\r\n imports: [CommonModule, TranslateModule, BimplusButtonsRowComponent],\r\n templateUrl: './bimplus-overlay-dialog-warning.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-warning.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogWarningComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly _data: WarningDialogInputData | undefined;\r\n protected readonly buttonsRef: TemplateRef<unknown> | null = null;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: \"warningDialogAcceptButton\",\r\n title: this.translateService.instant('_Ok'),\r\n tooltip: this.translateService.instant('_Ok'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this._data = this.dialogService.inputData as WarningDialogInputData;\r\n this.buttonsRef = this._data?.buttonsRef ?? null;\r\n this._title = this._data?.title || '';\r\n this._message = this._data?.message || '';\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked(): void {\r\n this.close();\r\n\r\n this.acceptCallback?.();\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\"></div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{ title }}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div\r\n class=\"overlay-dialog-container_content_msg\"\r\n [innerHTML]=\"this.message\"\r\n ></div>\r\n <section class=\"overlay-dialog-container_content_buttons\">\r\n @if(buttonsRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"buttonsRef; context: { close: close.bind(this) }\"\r\n ></ng-container>\r\n } @else {\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked()\"\r\n />\r\n </div>\r\n }\r\n </section>\r\n </div>\r\n</div>\r\n","import { Component, ViewEncapsulation, Input, OnInit, OnDestroy, HostListener, ChangeDetectionStrategy } from '@angular/core';\r\nimport { XDraggableDirective } from '../../directives/x-draggable.directive';\r\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-resizable-panel',\r\n imports: [CommonModule, XDraggableDirective, PxsuffixPipe],\r\n templateUrl: './resizable-panel.component.html',\r\n styleUrl: './resizable-panel.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ResizablePanelComponent implements OnInit, OnDestroy {\r\n @Input() position: 'left' | 'right' = 'right';\r\n @Input() hasDraggableHandle: boolean = false;\r\n @Input() hasDraggableBorder: boolean = false;\r\n @Input() minWidth: number | (() => number) | undefined = 350;\r\n @Input() maxWidth: number | (() => number) | undefined;\r\n @Input() defaultWidth: number = 350;\r\n // Function to determine if resizing is allowed\r\n @Input() canResize: (currentWidth: number, deltaX: number) => boolean = () => true;\r\n\r\n drawerWidth: number = this.defaultWidth;\r\n drawerExpanded: boolean = true;\r\n\r\n ngOnInit() {\r\n this.drawerWidth = this.defaultWidth;\r\n window.addEventListener('resize', this.handleWindowResize);\r\n }\r\n\r\n ngOnDestroy() {\r\n window.removeEventListener('resize', this.handleWindowResize);\r\n }\r\n\r\n applyWidthConstraints() {\r\n const minWidth = typeof this.minWidth === 'function' ? this.minWidth() : this.minWidth;\r\n const maxWidth = typeof this.maxWidth === 'function' ? this.maxWidth() : this.maxWidth;\r\n\r\n if (minWidth && this.drawerWidth < minWidth) {\r\n this.drawerWidth = minWidth;\r\n } else if (maxWidth && this.drawerWidth > maxWidth) {\r\n this.drawerWidth = maxWidth;\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n handleWindowResize = (): void => {\r\n this.applyWidthConstraints();\r\n };\r\n\r\n _toggleDrawer() {\r\n this.drawerExpanded = !this.drawerExpanded;\r\n if (!this.drawerExpanded) {\r\n return;\r\n }\r\n\r\n this.applyWidthConstraints();\r\n }\r\n\r\n _onResizeWidth(event: number): void {\r\n const deltaX = event;\r\n\r\n let newWidth = this.drawerWidth;\r\n if (this.position === 'left') {\r\n newWidth += deltaX;\r\n } else if (this.position === 'right') {\r\n newWidth -= deltaX;\r\n }\r\n\r\n if (this.canResize?.(this.drawerWidth, deltaX) !== false) {\r\n this.drawerWidth = newWidth;\r\n\r\n this.applyWidthConstraints();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"resizable-panel-drawer\"\r\n [style.width] = \"drawerWidth | pxsuffix\"\r\n [ngClass]=\"drawerExpanded ? '' : 'hidden'\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n>\r\n <slot></slot>\r\n @if (drawerExpanded) {\r\n @if (hasDraggableBorder) {\r\n <div\r\n xDraggable\r\n class=\"resizable-panel-resize-border\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n @if (hasDraggableHandle) {\r\n <div\r\n xDraggable\r\n class=\"resizable-panel-resize-handle\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n (clicked)=\"_toggleDrawer()\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n }\r\n</div>\r\n@if (!drawerExpanded) {\r\n @if (hasDraggableHandle) {\r\n <div\r\n class=\"resizable-panel-resize-handle collapsed\"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, HostListener, Input, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-link-tooltip-message',\r\n templateUrl: './bimplus-link-tooltip-message.component.html',\r\n styleUrls: ['./bimplus-link-tooltip-message.component.less'],\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusLinkTooltipMessageComponent implements AfterViewInit {\r\n\r\n @ViewChild('messageLink') messageLink!: ElementRef<HTMLElement>;\r\n\r\n private _enableCopyPressKeys = true;\r\n private _titleHeader = '';\r\n private _link = '';\r\n\r\n @Input()\r\n get link(): string {\r\n return this._link;\r\n }\r\n set link(value: string) {\r\n this._link = value;\r\n }\r\n\r\n @Input()\r\n get titleHeader(): string {\r\n return this._titleHeader;\r\n }\r\n set titleHeader(value: string) {\r\n this._titleHeader = value;\r\n }\r\n\r\n @Input()\r\n get enableCopyPressKeys(): boolean {\r\n return this._enableCopyPressKeys;\r\n }\r\n set enableCopyPressKeys(value: boolean) {\r\n this._enableCopyPressKeys = value;\r\n }\r\n\r\n @Input()\r\n arrowPosition = 'right-arrow';\r\n\r\n @Input()\r\n onClose?: () => void;\r\n\r\n ngAfterViewInit(): void {\r\n this.selectText(this.messageLink.nativeElement);\r\n }\r\n\r\n selectText(node: HTMLElement) {\r\n if (window.getSelection) {\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n range.selectNodeContents(node);\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n } else {\r\n console.log(\"Could not select text in node: Unsupported browser.\");\r\n }\r\n }\r\n\r\n close() {\r\n this.onClose?.();\r\n }\r\n\r\n @HostListener('window:keydown.control.c')\r\n onKeyPress() {\r\n if (this.messageLink && this.enableCopyPressKeys) {\r\n navigator.clipboard.writeText(this.messageLink.nativeElement.innerText).catch((err) => {\r\n console.error(\"Could not copy text in node.\", err);\r\n });\r\n }\r\n }\r\n}","<div class=\"link-content\" #linkContent>\r\n <div\r\n class=\"link-tooltip-message\"\r\n #linkTooltipMessage\r\n >\r\n <div class=\"header\">\r\n <span class=\"title\">{{titleHeader}}</span>\r\n <span\r\n class='tooltip-cross-icon close'\r\n (click)=\"close()\"\r\n (keydown)=\"close()\"\r\n >✕︎</span>\r\n </div>\r\n <div class=\"content\">\r\n <div\r\n class=\"link\"\r\n #messageLink\r\n [innerHTML]=\"link\">\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"arrow\"\r\n [ngClass]=\"arrowPosition\"\r\n ></div>\r\n</div>\r\n<div\r\n class=\"link-tooltip-message-overlay\"\r\n (click)=\"close()\"\r\n (keydown)=\"close()\"\r\n></div>","import { Component, Input, Output, EventEmitter, ViewEncapsulation, SimpleChanges, OnChanges, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CreateLinkData, SelectedObject } from './object-properties-header.interface';\r\n\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { fireEvent } from '../../utils/utils';\r\nimport {\r\n TranslateModule\r\n , TranslateService\r\n} from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusLinkTooltipMessageComponent } from '../bimplus-link-tooltip-message/bimplus-link-tooltip-message.component';\r\n\r\n@Component({\r\n selector: 'lib-object-properties-header',\r\n imports: [\r\n FormsModule,\r\n NgSelectModule,\r\n TranslateModule,\r\n BimplusLinkTooltipMessageComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './object-properties-header.component.html',\r\n styleUrl: './object-properties-header.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesHeaderComponent extends BimplusLocalizedWidgetComponent implements OnChanges {\r\n constructor(){\r\n super();\r\n }\r\n\r\n @Output() selectedObject = new EventEmitter<SelectedObject>();\r\n\r\n @Output() closePropertiesPanel = new EventEmitter();\r\n\r\n @Input() selectedObjects: Array<SelectedObject> = [];\r\n\r\n _activeObject: SelectedObject | null = null;\r\n openLinkMessage: boolean = false;\r\n\r\n @Input()\r\n onOpenLink?: () => void;\r\n\r\n set activeObject(value: SelectedObject | null) {\r\n this._activeObject = value;\r\n fireEvent(this, \"selectedObject\", value);\r\n }\r\n\r\n get activeObject(): SelectedObject | null {\r\n return this._activeObject;\r\n }\r\n\r\n private _linkData: CreateLinkData = {\r\n link: '',\r\n titleHeader: '',\r\n linkMessageVisible: false,\r\n enableCopyPressKeys: false\r\n };\r\n\r\n @Input()\r\n get linkData(): CreateLinkData {\r\n return this._linkData;\r\n }\r\n set linkData(value: CreateLinkData) {\r\n this._linkData = value;\r\n }\r\n\r\n _closePropertiesPanel(event: Event) {\r\n fireEvent(this, \"closePropertiesPanel\", event);\r\n event.stopPropagation();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!changes['selectedObjects']) {\r\n return;\r\n }\r\n const previousValue: SelectedObject[] | null = changes['selectedObjects'].previousValue;\r\n const currentValue: SelectedObject[] | null = changes['selectedObjects'].currentValue;\r\n if(currentValue && currentValue.length > 0) {\r\n this.activeObject = currentValue[currentValue.length - 1];\r\n }\r\n console.log(`Data changed from ${previousValue} to ${currentValue}`);\r\n }\r\n\r\n openLink() {\r\n this.openLinkMessage = true;\r\n this.onOpenLink?.();\r\n }\r\n\r\n closeLink = () => {\r\n this.openLinkMessage = false;\r\n }\r\n}\r\n","<div class=\"object-properties-header\">\r\n <div class=\"object-properties-header-object\">\r\n <div class=\"object-properties-header-object-select\">\r\n <ng-select class=\"object-properties-header-object-select-dropdown\" [(ngModel)]=\"activeObject\" [clearable]=\"false\" [searchable]=\"false\">\r\n @for (object of selectedObjects; track object) {\r\n <ng-option [value]=\"object\">\r\n {{object.type}}\r\n @if(object.name) {\r\n ({{object.name}})\r\n }\r\n </ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div\r\n class=\"object-properties-header-link-icon\"\r\n title=\"{{'_Create link' | translate}}\"\r\n (click)=\"openLink()\"\r\n (keydown)=\"openLink()\"\r\n >\r\n </div>\r\n @if (openLinkMessage) {\r\n <lib-bimplus-link-tooltip-message\r\n [enableCopyPressKeys]=\"linkData.enableCopyPressKeys\"\r\n [titleHeader]=\"linkData.titleHeader\"\r\n [link]=\"linkData.link\"\r\n [onClose]=\"closeLink\"\r\n />\r\n }\r\n <div\r\n class=\"object-properties-header-close-icon\"\r\n (click)=\"_closePropertiesPanel($event)\"\r\n (keydown)=\"_closePropertiesPanel($event)\"\r\n title=\"{{'_Close_properties_panel_title' | translate}}\"\r\n >\r\n </div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'round',\r\n standalone: true\r\n})\r\nexport class RoundPipe implements PipeTransform {\r\n\r\n transform(value: string, decimal: number): string {\r\n const num = parseFloat(value);\r\n const dec = decimal;\r\n\r\n const mult = Math.pow(10, dec);\r\n\r\n return \"\" + Math.round(num * mult) / mult;\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\nimport { RoundPipe } from './round.pipe';\r\nimport moment from 'moment';\r\n// @ts-expect-error TS2882: moment/min/locales ships no type declarations for its side-effect entry point.\r\nimport 'moment/min/locales';\r\n\r\n\r\n@Pipe({\r\n name: 'getAttributeValueAsString',\r\n standalone: true\r\n})\r\nexport class GetAttributeValueAsString implements PipeTransform {\r\n\r\n constructor() {\r\n const locale = window.navigator.language;\r\n moment.locale(locale);\r\n }\r\n\r\n _transformDoubleToString(value: ObjectAttribute): string {\r\n return new RoundPipe().transform(value.value, value.decimal || 2);\r\n }\r\n\r\n _transformDoubleEnumerationToString(value: ObjectAttribute): string {\r\n if(!value.enumdefinition) {\r\n return '';\r\n }\r\n const _retval = value.enumdefinition[Number(value.value)];\r\n if(_retval) {\r\n return `${_retval}`;\r\n }\r\n return '';\r\n }\r\n\r\n _transformDatetimeToString(value: ObjectAttribute): string {\r\n const localeDate: string = moment(value.value).format('L')\r\n if(localeDate) {\r\n return localeDate;\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformGUIDToString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformEnumerationToString(value: ObjectAttribute): string {\r\n if(value.control && /^Enumeration$/i.test(value.control)) {\r\n if(!value.enumdefinition) {\r\n return '';\r\n }\r\n const _retVal = value.enumdefinition[Number(value.value)];\r\n if(_retVal) {\r\n return `${_retVal}`;\r\n }\r\n return '';\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformGUIDEnumerationToString(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformIntToString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformIntEnumerationToString(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformStringEnumeration(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformStringCombobox(value: ObjectAttribute): string {\r\n if(value.control && /^Combobox$/i.test(value.control)) {\r\n return `${value.value}`;\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformBooleanToString(value: ObjectAttribute): string {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return \"True\";\r\n }\r\n return \"False\";\r\n }\r\n\r\n transform(value: ObjectAttribute): string {\r\n const _value = value.value;\r\n if (this.isEmpty(_value)) {\r\n return '';\r\n }\r\n\r\n if (this.isDouble(value)) {\r\n return this._transformDoubleToString(value);\r\n }\r\n\r\n if (this.isDoubleEnumeration(value)) {\r\n return this._transformDoubleEnumerationToString(value);\r\n }\r\n\r\n if (this.isDatetime(value)) {\r\n return this._transformDatetimeToString(value);\r\n }\r\n\r\n if (this.isGUID(value)) {\r\n return this._transformGUIDToString(value);\r\n }\r\n\r\n if (this.isGUIDEnumeration(value)) {\r\n return this._transformGUIDEnumerationToString(value);\r\n }\r\n\r\n if (this.isInt(value)) {\r\n return this._transformIntToString(value);\r\n }\r\n\r\n if (this.isIntEnumeration(value)) {\r\n return this._transformIntEnumerationToString(value);\r\n }\r\n\r\n if (this.isString(value)) {\r\n return this._transformString(value);\r\n }\r\n\r\n if (this.isStringEnumeration(value)) {\r\n return this._transformStringEnumeration(value);\r\n }\r\n\r\n if (this.isStringCombobox(value)) {\r\n return this._transformStringCombobox(value);\r\n }\r\n\r\n if (this.isBooleanCheckbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n if (this.isBooleanTextbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n return value.value;\r\n }\r\n\r\n private isEmpty(value: string | undefined | null): boolean {\r\n return value === undefined || value === null || value === '';\r\n }\r\n\r\n private isDouble(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isDoubleEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isDatetime(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUID(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUIDEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isInt(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isIntEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isString(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isStringEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isStringCombobox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^combobox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanCheckbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type)\r\n && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanTextbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\r\n }\r\n}\r\n","import { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\n\r\nexport function isObjectPropertyValueBlank(attrib: ObjectAttribute): boolean {\r\n return attrib.value === undefined\r\n || attrib.value === null\r\n || attrib.value === ''\r\n || attrib.value === '\\n\\t'\r\n || attrib.value === '\\n'\r\n || attrib.value === '\\t';\r\n}","import { Input, Component, ViewEncapsulation, signal, ChangeDetectionStrategy } from '@angular/core';\r\nimport isURL from 'validator/lib/isURL';\r\n\r\n@Component({\r\n selector: 'lib-object-property-value',\r\n standalone: true,\r\n templateUrl: './object-property-value.component.html',\r\n styleUrls: ['./object-property-value.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ObjectPropertyValueComponent {\r\n protected _tooltip = signal<string>('');\r\n protected _value = signal<string>('');\r\n protected _valueIsUrl = signal<boolean>(false);\r\n protected _decoratedHyperlink = signal<string>('');\r\n\r\n @Input() set value(value: string) {\r\n this._value.set(value);\r\n if(this._isUrl(value)) {\r\n this._valueIsUrl.set(true);\r\n this._decoratedHyperlink.set(this._decorateHyperlink(value));\r\n }\r\n else {\r\n this._valueIsUrl.set(false);\r\n }\r\n }\r\n\r\n @Input() set tooltip(tooltip: string) {\r\n this._tooltip.set(tooltip);\r\n }\r\n\r\n private _isUrl(url: string): boolean {\r\n if (!url) {\r\n return false;\r\n }\r\n const link = url.trim();\r\n if(!/^http(s?):\\/\\//.exec(link) && !/^www\\./.exec(link)) {\r\n return false;\r\n }\r\n\r\n return isURL(link);\r\n }\r\n\r\n private _decorateHyperlink(url: string): string {\r\n if(!this._isUrl(url)) {\r\n return '';\r\n }\r\n let link = url.trim();\r\n\r\n if (link && !/^http(s?):\\/\\//.exec(link)) {\r\n link = 'https://' + link;\r\n }\r\n return link;\r\n }\r\n\r\n constructor() { }\r\n}\r\n","@if(_valueIsUrl()) {\r\n <a class=\"link-detect-automatically\" target=\"_blank\" rel=\"noopener\" href={{_decoratedHyperlink()}} title=\"{{_tooltip()}}\">{{_value()}}</a>\r\n}\r\n@else {\r\n <div class=\"value\" title=\"{{_tooltip()}}\">\r\n {{_value()}}\r\n </div>\r\n}\r\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-text-field',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-text-field.component.html',\r\n styleUrl: './bimplus-input-text-field.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputTextFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputTextFieldComponent implements ControlValueAccessor {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _showClearButton = signal<boolean>(false);\r\n @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\r\n this._showClearButton.set(show_clear_button);\r\n }\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n value: string = '';\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _clearValue(event: Event): void {\r\n this.value = \"\";\r\n this.inputElement.nativeElement.focus();\r\n this.onChange(this.value);\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div\r\n class=\"text-input-wrapper\"\r\n [class.invalid-value]=\"!_validValue()\"\r\n [class.with-clear-button]=\"_showClearButton()\"\r\n>\r\n <input\r\n type=\"text\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (blur)=\"handleBlur()\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n class=\"text-input\"\r\n #inputValueBox\r\n />\r\n @if(_showClearButton()) {\r\n <div\r\n class=\"clear-button\"\r\n (click)=\"_clearValue($event)\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n >\r\n </div>\r\n }\r\n</div>\r\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Output,\n ViewEncapsulation,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-checkbox',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-checkbox.component.html',\r\n styleUrl: './bimplus-input-checkbox.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputCheckboxComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputCheckboxComponent implements ControlValueAccessor {\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n value: boolean = false;\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: boolean) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n // Called when the checkbox value changes\r\n onCheckboxChange(event: Event) {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.value = checked;\r\n this.onChange(checked); // Notify the parent form about the change\r\n this.onTouched(); // Mark the control as touched\r\n }\r\n\r\n writeValue(value: boolean): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n toggleAttributeValue() {\r\n this.value = !this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n}\r\n","<div\r\n class=\"select-checkbox\"\r\n>\r\n <div>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"value\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"toggleAttributeValue()\"\r\n (keypress)=\"toggleAttributeValue()\"\r\n >\r\n <span></span>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-number',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-number.component.html',\r\n styleUrl: './bimplus-input-number.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputNumberComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputNumberComponent implements ControlValueAccessor {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n @Input() minValue: string = '';\r\n @Input() maxValue: string = '';\r\n\r\n value: number = 0;\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: number) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: number): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: number) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = parseInt(input.value);\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div\r\n class=\"text-input-wrapper\"\r\n [class.invalid-value]=\"!_validValue()\"\r\n>\r\n <input\r\n type=\"number\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (blur)=\"handleBlur()\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n class=\"text-input\"\r\n [min]=\"minValue\"\r\n [max]=\"maxValue\"\r\n #inputValueBox\r\n />\r\n</div>\r\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n ViewEncapsulation,\n signal,\n booleanAttribute,\n ViewChild,\n ElementRef,\n OnInit,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n , FormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n\r\ninterface EnumDefinition {\r\n id: string;\r\n name: string;\r\n};\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-combobox',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgSelectModule,\r\n TranslateModule\r\n],\r\n templateUrl: './bimplus-input-combobox.component.html',\r\n styleUrl: './bimplus-input-combobox.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputComboboxComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\n\r\nexport class BimplusInputComboboxComponent implements ControlValueAccessor, OnInit {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n private _type: string = 'enum';\r\n protected _enumdefinition: Array<EnumDefinition> = [];\r\n @Input() set enumdefinition(enum_definition: Record<number | string, string> | undefined | Array<string>) {\r\n if(!enum_definition) {\r\n return;\r\n }\r\n if(Array.isArray(enum_definition)) {\r\n enum_definition.forEach((value, index) => {\r\n this._enumdefinition.push({ id: index.toString(), name: value });\r\n });\r\n this._type = 'array';\r\n return;\r\n }\r\n Object.keys(enum_definition).forEach((key) => {\r\n if(typeof key === 'string') {\r\n this._enumdefinition.push({ id: key, name: enum_definition[key] });\r\n }\r\n if(typeof key === 'number') {\r\n this._enumdefinition.push({ id: key, name: enum_definition[Number(key)] });\r\n }\r\n\r\n });\r\n }\r\n\r\n private _setActiveEnumValue() {\r\n const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.id === this._selectedValue);\r\n if(!sel){\r\n return;\r\n }\r\n this.activeEnum = sel\r\n }\r\n\r\n _setActiveArrayValue() {\r\n const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.name === this._selectedValue);\r\n if(!sel){\r\n return;\r\n }\r\n this.activeEnum = sel\r\n }\r\n\r\n private _selectedValue: string | null = null;\r\n @Input() set selectedValue(value: string | null) {\r\n this._selectedValue = value;\r\n if(this._type === 'enum') {\r\n this._setActiveEnumValue();\r\n return;\r\n }\r\n if(this._type === 'array') {\r\n this._setActiveArrayValue();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.activeEnumSubject$.subscribe({\r\n next: (value) => {\r\n if(this._type === 'enum') {\r\n this.value = value?.id ?? '';\r\n this.onChange(this.value);\r\n }\r\n if(this._type === 'array') {\r\n this.value = value?.name ?? '';\r\n this.onChange(this.value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n set activeEnum(value : EnumDefinition | null){\r\n this.activeEnumSubject$.next(value);\r\n }\r\n\r\n get activeEnum() : EnumDefinition | null {\r\n return this.activeEnumSubject$.getValue();\r\n }\r\n\r\n activeEnumSubject$ = new BehaviorSubject<EnumDefinition | null> (null);\r\n\r\n \r\n value: string = '';\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div class=\"enum-wrapper\" [class.invalid-value]=\"!_validValue()\">\r\n <div class=\"double-enumeration\">\r\n <ng-select\r\n class=\"enum-dropdown\"\r\n [(ngModel)]=\"activeEnum\"\r\n [clearable]=\"false\"\r\n [searchable]=\"_enumdefinition.length >= 10\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n >\r\n @for (val of _enumdefinition; track val) {\r\n <ng-option [value]=\"val\">{{\r\n val.name\r\n }}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n</div>\r\n","import {\n Component,\n OnInit,\n forwardRef,\n Input,\n Output,\n booleanAttribute,\n signal,\n EventEmitter,\n ViewChild,\n ElementRef,\n ViewEncapsulation,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n , FormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\nimport { MatNativeDateModule, DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\r\nimport { MomentDateModule, MAT_MOMENT_DATE_ADAPTER_OPTIONS, MomentDateAdapter} from '@angular/material-moment-adapter';\r\nimport { MatDatepickerModule, MatDatepickerInputEvent } from '@angular/material/datepicker';\r\n\r\nexport const MY_DATE_FORMATS = {\r\n parse: {\r\n dateInput: 'L', \r\n },\r\n display: {\r\n dateInput: 'L', \r\n monthYearLabel: 'MMM YYYY',\r\n dateA11yLabel: 'L',\r\n monthYearA11yLabel: 'MMM YYYY',\r\n }\r\n};\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-date',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n MatDatepickerModule,\r\n MomentDateModule,\r\n MatNativeDateModule\r\n],\r\n templateUrl: './bimplus-input-date.component.html',\r\n styleUrls: ['./bimplus-input-date.component.less'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputDateComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: DateAdapter,\r\n useClass: MomentDateAdapter,\r\n deps: [MAT_DATE_LOCALE, MAT_DATE_FORMATS, MAT_MOMENT_DATE_ADAPTER_OPTIONS]\r\n },\r\n {\r\n provide: MAT_DATE_FORMATS,\r\n useValue: MY_DATE_FORMATS\r\n },\r\n {\r\n provide: MAT_DATE_LOCALE,\r\n useValue: navigator.language\r\n }, // Set the locale here!\r\n {\r\n provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS,\r\n useValue: {\r\n useUtc: false\r\n }\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusInputDateComponent implements ControlValueAccessor, OnInit {\r\n @ViewChild('inputDateBox', { static: false }) inputDateBox!: ElementRef;\r\n \r\n value: string = '';\r\n dateValue: Date | null = new Date();\r\n isDisabled: boolean = false;\r\n\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _showClearButton = signal<boolean>(false);\r\n @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\r\n this._showClearButton.set(show_clear_button);\r\n }\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n @Input() minValue: string = '';\r\n @Input() maxValue: string = '';\r\n\r\n constructor() { }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n this.dateValue = new Date(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n private readonly STYLE_ID = 'datepicker-styles';\r\n private injectGlobalStyles(): void {\r\n // Check if the style tag already exists\r\n if (document.getElementById(this.STYLE_ID)) {\r\n return; // Style already injected, skip\r\n }\r\n\r\n // Create the style tag\r\n const styleElement = document.createElement('style');\r\n styleElement.id = this.STYLE_ID;\r\n\r\n styleElement.textContent = `\r\n mat-datepicker-content mat-calendar.bimplus-datepicker {\r\n background-color: var(--brand-white-color);\r\n border-color: var(--issue-details-view-select-border-color);\r\n border: .1rem solid;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-mdc-button {\r\n font-size: 1.6rem;\r\n font-weight: 700;\r\n }\r\n mat-calendar.bimplus-datepicker .mat-mdc-button:hover {\r\n border-radius: 0;\r\n }\r\n mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-controls {\r\n margin: 0;\r\n }\r\n mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-header {\r\n background-color: rgb(236, 239, 241);\r\n padding: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content {\r\n padding: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header{\r\n height: 2rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr{\r\n height: 2rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr th{\r\n height: 2rem;\r\n padding: 0;\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-today {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td.mat-calendar-body-label {\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td.mat-calendar-body-label {\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n `;\r\n\r\n // Append the style tag to document.head\r\n document.head.appendChild(styleElement);\r\n }\r\n ngOnInit() {\r\n this.injectGlobalStyles();\r\n console.log('BimplusInputDateComponent ngOnInit'); \r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _clearValue(event: Event): void {\r\n this.value = \"\";\r\n this.dateValue = null;\r\n this.onChange(this.value);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _showDatePicker(event: Event): void {\r\n console.log('BimplusInputDateComponent _showDatePicker');\r\n }\r\n \r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n\r\n onDateChanged(event: MatDatepickerInputEvent<Date>) {\r\n const selectedDate = event.value;\r\n\r\n if (selectedDate) {\r\n this.value = selectedDate.toISOString();\r\n this.onChange(this.value);\r\n console.log('Selected Date (UTC):', selectedDate);\r\n }\r\n }\r\n}\r\n","<div class=\"date-input-wrapper\">\r\n <mat-datepicker-toggle matIconPostfix [for]=\"picker\" [disableRipple]=\"true\"></mat-datepicker-toggle>\r\n <input matInput [matDatepicker]=\"picker\" readonly [(ngModel)]=\"dateValue\" #inputDateBox (dateChange)=\"onDateChanged($event)\" (click)=\"picker.open()\">\r\n <mat-datepicker #picker [panelClass]=\"'bimplus-datepicker'\"></mat-datepicker>\r\n <div\r\n class=\"clear-button\"\r\n (click)=\"_clearValue($event)\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n ></div>\r\n</div>","import {\n Component,\n Input,\n ViewEncapsulation,\n signal,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport {\r\n ObjectAttributeGroup\r\n , ObjectAttribute\r\n} from '../object-properties/object-properties.interface';\r\nimport { GetAttributeValueAsString } from '../../pipes/get-attribute-value-as-string.pipe';\r\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\r\nimport { ObjectPropertyValueComponent } from './object-property-value/object-property-value.component';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\nimport { BimplusInputCheckboxComponent } from \"../bimplus-input-checkbox/bimplus-input-checkbox.component\";\r\nimport { BimplusInputNumberComponent } from '../bimplus-input-number/bimplus-input-number.component';\r\nimport { BimplusInputComboboxComponent } from '../bimplus-input-combobox/bimplus-input-combobox.component';\r\nimport { BimplusInputDateComponent } from '../bimplus-input-date/bimplus-input-date.component';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-object-properties-group',\r\n imports: [\r\n GetAttributeValueAsString,\r\n ObjectPropertyValueComponent,\r\n BimplusInputTextFieldComponent,\r\n BimplusInputCheckboxComponent,\r\n BimplusInputNumberComponent,\r\n BimplusInputComboboxComponent,\r\n BimplusInputDateComponent,\r\n ReactiveFormsModule,\r\n CommonModule\r\n ],\r\n templateUrl: './object-properties-group.component.html',\r\n styleUrls: ['./object-properties-group.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesGroupComponent {\r\n protected _editMode = signal<boolean>(false);\r\n\r\n @Input() set editMode(edit_mode: boolean) {\r\n this._editMode.set(edit_mode);\r\n }\r\n\r\n @Input() objectPropertiesForm: FormGroup | undefined;\r\n\r\n protected _existFormControlForAttibute(attribId: string): boolean {\r\n if(!this.objectPropertiesForm) {\r\n return false;\r\n }\r\n\r\n const attrib = this.objectPropertiesForm.get(attribId);\r\n\r\n if(!attrib) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected _isValueValid(attribId: string): boolean {\r\n if(!this.objectPropertiesForm) {\r\n return false;\r\n }\r\n const attrib = this.objectPropertiesForm.get(attribId);\r\n\r\n if(!attrib) {\r\n return false;\r\n }\r\n return attrib?.valid;\r\n }\r\n\r\n protected _canUpdateObject = signal<boolean>(false);\r\n @Input() set canUpdateObject(canUpdateObject: boolean) {\r\n this._canUpdateObject.set(canUpdateObject);\r\n }\r\n\r\n protected _attributesGroup = signal<ObjectAttributeGroup>({\r\n name: '',\r\n attributes: [],\r\n expanded: false,\r\n });\r\n\r\n @Input() set attributesGroup(value: ObjectAttributeGroup | undefined) {\r\n if(!value){\r\n return;\r\n }\r\n this._attributesGroup.set(value);\r\n }\r\n\r\n constructor() { }\r\n\r\n protected isValueBlank(attrib: ObjectAttribute): boolean {\r\n return isObjectPropertyValueBlank(attrib);\r\n }\r\n protected _isBoleanTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isBoleanCheckBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^checkbox$/i.test(attrib.control));\r\n }\r\n protected _isTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isDoubleTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isIntegerTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isGuidTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isDoubleEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isGuidEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isIntegerEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isStringEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isStringCombobox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^combobox$/i.test(attrib.control));\r\n }\r\n protected _isDatetime(attrib: ObjectAttribute): boolean {\r\n return ((typeof attrib.type === 'string' && /^datetime$/i.test(attrib.type)) && !attrib.control);\r\n }\r\n}\r\n","@if(objectPropertiesForm) {\r\n <div class=\"object-property-table\"\r\n [formGroup]=\"objectPropertiesForm\"\r\n [class.edit-mode] = \"_editMode()\"\r\n >\r\n @for (attrib of _attributesGroup().attributes; track attrib) {\r\n <div class=\"row-wrapper\">\r\n <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\r\n <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\r\n <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\r\n @if(_editMode() && _canUpdateObject() && attrib.isChangeable && _existFormControlForAttibute(attrib.id)) {\r\n @if(\r\n _isBoleanTextBox(attrib)\r\n || _isTextBox(attrib)\r\n || _isDoubleTextBox(attrib)\r\n || _isGuidTextBox(attrib)\r\n ) {\r\n <lib-bimplus-input-text-field\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [showClearButton]=true\r\n />\r\n }\r\n @else if(\r\n _isIntegerTextBox(attrib)\r\n ) {\r\n <lib-bimplus-input-number\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n minValue=\"{{attrib.minValue}}\"\r\n maxValue=\"{{attrib.maxValue}}\"\r\n />\r\n }\r\n @else if(\r\n _isBoleanCheckBox(attrib)\r\n ) {\r\n <lib-bimplus-input-checkbox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n />\r\n }\r\n @else if(\r\n _isDoubleEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value | number\"\r\n />\r\n }\r\n @else if(\r\n _isGuidEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isIntegerEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value | number\"\r\n />\r\n }\r\n @else if(\r\n _isStringEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isStringCombobox(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isDatetime(attrib)\r\n ) {\r\n <lib-bimplus-input-date\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n minValue=\"{{attrib.minValue}}\"\r\n maxValue=\"{{attrib.maxValue}}\"\r\n [showClearButton]=true\r\n />\r\n }\r\n }\r\n @else {\r\n <lib-object-property-value\r\n value=\"{{attrib | getAttributeValueAsString}}\"\r\n tooltip=\"{{attrib.tooltip}}\"\r\n />\r\n }\r\n </div>\r\n <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\r\n </div>\r\n }\r\n </div>\r\n}\r\n@else {\r\n <div class=\"object-property-table\"\r\n [class.edit-mode] = \"_editMode()\"\r\n >\r\n @for (attrib of _attributesGroup().attributes; track attrib) {\r\n\r\n @if(!isValueBlank(attrib)) {\r\n <div class=\"row-wrapper\">\r\n <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\r\n <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\r\n <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\r\n <lib-object-property-value\r\n value=\"{{attrib | getAttributeValueAsString}}\"\r\n tooltip=\"{{attrib.tooltip}}\"\r\n />\r\n </div>\r\n <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\nimport { RoundPipe } from './round.pipe';\r\nimport moment from 'moment';\r\n// @ts-expect-error TS2882: moment/min/locales ships no type declarations for its side-effect entry point.\r\nimport 'moment/min/locales';\r\n\r\n\r\n@Pipe({\r\n name: 'getAttributeValue',\r\n standalone: true\r\n})\r\nexport class GetAttributeValue implements PipeTransform {\r\n\r\n constructor() {\r\n const locale = window.navigator.language;\r\n moment.locale(locale);\r\n }\r\n\r\n _transformDouble(value: ObjectAttribute): string {\r\n return new RoundPipe().transform(value.value, value.decimal ?? 2);\r\n }\r\n\r\n _transformDoubleEnumeration(value: ObjectAttribute): string {\r\n return this._transformDouble(value);\r\n }\r\n\r\n _transformDatetime(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformGUID(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformGUIDEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformInt(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformIntEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformString(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformStringEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformStringCombobox(value: ObjectAttribute): string {\r\n if(value.control && /^combobox$/i.test(value.control)) {\r\n return value.value;\r\n }\r\n return '';\r\n }\r\n\r\n _transformBooleanToBoolean(value: ObjectAttribute): boolean {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n _transformBooleanToString(value: ObjectAttribute): string {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return \"True\";\r\n }\r\n return \"False\";\r\n }\r\n\r\n transform(value: ObjectAttribute): string | boolean {\r\n const _value = value.value;\r\n if (this.isEmpty(_value)) {\r\n return '';\r\n }\r\n\r\n if (this.isDouble(value)) {\r\n return this._transformDouble(value);\r\n }\r\n\r\n if (this.isDoubleEnumeration(value)) {\r\n return this._transformDoubleEnumeration(value);\r\n }\r\n\r\n if (this.isDatetime(value)) {\r\n return this._transformDatetime(value);\r\n }\r\n\r\n if (this.isGUID(value)) {\r\n return this._transformGUID(value);\r\n }\r\n\r\n if (this.isGUIDEnumeration(value)) {\r\n return this._transformGUIDEnumeration(value);\r\n }\r\n\r\n if (this.isInt(value)) {\r\n return this._transformInt(value);\r\n }\r\n\r\n if (this.isIntEnumeration(value)) {\r\n return this._transformIntEnumeration(value);\r\n }\r\n\r\n if (this.isString(value)) {\r\n return this._transformString(value);\r\n }\r\n\r\n if (this.isStringEnumeration(value)) {\r\n return this._transformStringEnumeration(value);\r\n }\r\n\r\n if (this.isStringCombobox(value)) {\r\n return this._transformStringCombobox(value);\r\n }\r\n\r\n if (this.isBooleanCheckbox(value)) {\r\n return this._transformBooleanToBoolean(value);\r\n }\r\n\r\n if (this.isBooleanTextbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n return value.value;\r\n }\r\n\r\n private isEmpty(value: string | undefined | null): boolean {\r\n return value === undefined || value === null || value === '';\r\n }\r\n\r\n private isDouble(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isDoubleEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isDatetime(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUID(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUIDEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isInt(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isIntEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isString(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isStringEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isStringCombobox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^combobox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanCheckbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type)\r\n && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanTextbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\r\n }\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function doubleValidator(minValue: string, maxValue: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const value = control.value;\r\n const isValidDouble = /^[-+]?\\d*?\\.?\\d+?([eE][-+]?\\d+?)?$/.test(value); //Regex for a double\r\n\r\n if(!isValidDouble) {\r\n return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if(isNaN(parseFloat(value))) {\r\n return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if (minValue && parseFloat(value) < parseFloat(minValue)) {\r\n return { invalidDouble: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\r\n }\r\n if (maxValue && parseFloat(value) > parseFloat(maxValue)) {\r\n return { invalidDouble: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function integerValidator(minValue: string, maxValue: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValidInteger = /^[+-]?\\d+$/.test(value); //Regex for a integer\r\n\r\n if(!isValidInteger) {\r\n return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if(isNaN(parseInt(value))) {\r\n return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if (minValue && parseInt(value) < parseInt(minValue)) {\r\n return { invalidInteger: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\r\n }\r\n if (maxValue && parseInt(value) > parseInt(maxValue)) {\r\n return { invalidInteger: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function guidValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValidGuid = /^[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$/.test(value); //Regex for a guid\r\n\r\n if(!isValidGuid) {\r\n return { invalidGuid: { value: value, message: `Invalid guid format: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function doubleEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AfterViewInit, Component, effect, ElementRef, Input, OnDestroy, ViewChild, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as Renderer from 'bimplus-renderer';\r\nimport * as THREE from 'three';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {TranslatePipe} from \"@ngx-translate/core\";\r\nimport { PreviewObject } from './object-preview.interface';\r\n\r\n@Component({\r\n selector: 'lib-object-preview',\r\n imports: [\r\n TranslatePipe\r\n ],\r\n templateUrl: './object-preview.component.html',\r\n styleUrls: ['./object-preview.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ObjectPreviewComponent implements AfterViewInit, OnDestroy {\r\n private readonly el = inject(ElementRef);\r\n\r\n private resizeObserver: ResizeObserver | null = null;\r\n viewport: Renderer.Viewport3D | null = null;\r\n isLoading = true;\r\n previousWidth = 0;\r\n previousHeight = 0;\r\n resizeTimeout: number | undefined;\r\n\r\n @ViewChild('rendererviewport') rendererViewportElement!: ElementRef;\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set objectId(id: string) {\r\n this._objectId = id;\r\n this.onObjectIdChanged();\r\n }\r\n\r\n get objectId(): string | undefined {\r\n return this._objectId;\r\n }\r\n\r\n private _objectId: string | undefined = undefined;\r\n\r\n @Input() revision: number | undefined = undefined;\r\n @Input() set visibleNode(value: PreviewObject){\r\n if(this.viewport){\r\n this.viewport.toggleObjectNode({id:value.id, visible:value.visible});\r\n }\r\n }\r\n @Input() set opaqueNode(value: PreviewObject){ \r\n if(this.viewport){\r\n this.viewport.toggleObjectNodeOpacity({id:value.id, opacity:value.opaque});\r\n }\r\n\r\n }\r\n\r\n private contentLoader: Renderer.BimplusContentLoader | null = null;\r\n\r\n private isRendererInitialized: boolean = false;\r\n\r\n constructor() {\r\n effect(()=>{\r\n if (this.visibleNode) {\r\n this.processVisibilityNode(this.visibleNode);\r\n }\r\n });\r\n // React to changes in the `opaqueNode` signal\r\n effect(() => {\r\n if (this.opaqueNode) {\r\n this.processOpacityNode(this.opaqueNode);\r\n }\r\n });\r\n }\r\n \r\n // Method to process the node\r\n processVisibilityNode(node: PreviewObject): void {\r\n console.log('Processing visbility of node in lib-object-preview:', node); \r\n }\r\n processOpacityNode(node: PreviewObject): void {\r\n console.log('Processing opacity of node in lib-object-preview:', node); \r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const container = this.el.nativeElement;\r\n \r\n // Initialize ResizeObserver\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n const width = entry?.contentRect?.width;\r\n\r\n if (width != this.previousWidth) {\r\n this.previousWidth = width;\r\n this.recalculatePreviewSize();\r\n }\r\n }\r\n });\r\n\r\n // Start observing the component's main container\r\n this.resizeObserver.observe(container);\r\n this.initRenderer();\r\n\r\n this.contentLoader = new Renderer.BimplusContentLoader(this.api as WebSdk.Api, this.viewport as Renderer.Viewport3D);\r\n\r\n this.isRendererInitialized = true;\r\n\r\n this.loadObject();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect();\r\n this.viewport?.dispose();\r\n }\r\n\r\n recalculatePreviewSize() {\r\n clearTimeout(this.resizeTimeout);\r\n\r\n this.resizeTimeout = setTimeout(() => {\r\n const width = this.rendererViewportElement?.nativeElement.offsetWidth;\r\n const height = this.rendererViewportElement?.nativeElement.offsetHeight;\r\n\r\n if (width && height) {\r\n this.viewport?.setViewportSize(width, height);\r\n this.viewport?.draw();\r\n } else {\r\n console.error(\"Viewport size is zero\");\r\n }\r\n }, 1) as unknown as number; // Delay execution to avoid rapid resizing and flickering\r\n }\r\n\r\n metricUnits: Renderer.MeasurementUnits = {\r\n weight: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'kg',\r\n },\r\n length: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n width: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n height: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n area: {\r\n multiplicator: 0.000001,\r\n precision: 2,\r\n unit: 'm²',\r\n },\r\n volume: {\r\n multiplicator: 1e-9,\r\n precision: 2,\r\n unit: 'm³',\r\n },\r\n };\r\n\r\n imperialUnits: Renderer.MeasurementUnits = {\r\n length: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n width: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n height: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n };\r\n\r\n viewportSettings: Renderer.ViewportSettings = {\r\n defaultOpacity: 0.5,\r\n disciplineOpacity: 0.1,\r\n pinSizeScaleFactor: 2,\r\n maxWebGLBufferSize: 350e12,\r\n mixedModelMode: true,\r\n useFrameSelection: false,\r\n pinFlyToDistance: 20000,\r\n nearClippingPlane: 0.01,\r\n slideThmbSize: [180, 112],\r\n units: {\r\n mm: this.metricUnits,\r\n inch: {},\r\n },\r\n };\r\n\r\n units = {\r\n Metric: this.metricUnits,\r\n Imperial: this.imperialUnits,\r\n };\r\n\r\n setAmbientOcclusionOptions() {\r\n if (!this.viewport) {\r\n return\r\n }\r\n\r\n const viewportOcclusionData = {\r\n usage: false,\r\n usageForInteraction: false,\r\n useShadows: false,\r\n useShadowsForInteraction: false,\r\n lightRotation: Math.PI * 35.00 / 180.0,\r\n lightElevation: Math.PI * 50.00 / 180.0,\r\n lightColor: new THREE.Color(1.0, 1.0, 1.0),\r\n ambientLightColor: new THREE.Color(0.6, 0.6, 0.6),\r\n };\r\n this.viewport.setAmbientOcclusionOptions(viewportOcclusionData);\r\n }\r\n\r\n setBackgroundOptions() {\r\n if (!this.viewport) {\r\n return\r\n }\r\n\r\n const daySkyBackgroundSetting = {\r\n name: \"day sky\",\r\n ambientLightColor: 0x868686,\r\n backgroundType: Renderer.Background.BackgroundType_LinearGradient,\r\n backgroundParams: {\r\n alpha: 1.0,\r\n colorStops: [\r\n {\r\n offset: 0.0,\r\n color: \"#87CDE9\"\r\n },\r\n {\r\n offset: 0.5104,\r\n color: \"#DDEDFE\"\r\n },\r\n {\r\n offset: 0.9635,\r\n color: \"#D3D3D4\"\r\n }\r\n ]\r\n }\r\n };\r\n this.viewport.setBackground(daySkyBackgroundSetting.backgroundType, daySkyBackgroundSetting.backgroundParams);\r\n }\r\n\r\n setHoverOption(useHoverEffect: boolean = true) {\r\n if (!this.viewport) {\r\n return\r\n }\r\n this.viewport.setUseHoverEffect(useHoverEffect);\r\n }\r\n\r\n initRenderer() {\r\n this.viewport = new Renderer.Viewport3D({\r\n settings: this.viewportSettings,\r\n units: this.units.Metric,\r\n domElementId: \"\",\r\n GPUPick: true,\r\n api: this.api as WebSdk.Api,\r\n name: \"objectPreviewRendererViewport\",\r\n lookupTextureSize: 32,\r\n ssaoSupported: false, // Disable SSAO support for object details window\r\n shadowsSupported: false,\r\n panningScaleFactor: 4.0, //In case of preview window use bigger panning scale factor\r\n commandPolicies: {\r\n CommandSelect: {\r\n noBubble: true, // Don't do a upwards activation\r\n noTraverse: true // Don't do a downwards activation\r\n }\r\n }\r\n });\r\n\r\n this.setBackgroundOptions();\r\n this.setHoverOption();\r\n this.viewport.draw();\r\n\r\n if (this.viewport?.domElement) {\r\n this.viewport.domElement.id = \"objectPreviewRendererViewport\";\r\n const nativeElement = this.el.nativeElement?.shadowRoot || this.el.nativeElement;\r\n nativeElement?.getElementsByClassName?.(\"rendered-preview\")[0]?.appendChild?.(this.viewport.domElement);\r\n } else {\r\n console.error(\"no dom element present for renderer!\");\r\n }\r\n }\r\n\r\n private onObjectIdChanged() {\r\n this.loadObject();\r\n }\r\n\r\n private loadObject() {\r\n if (!this.isRendererInitialized) {\r\n return;\r\n }\r\n\r\n if (!this.contentLoader) {\r\n console.error(\"content loader is not there!\");\r\n return;\r\n }\r\n\r\n console.log('loading object:', this.objectId);\r\n\r\n this.isLoading = true;\r\n\r\n this.viewport?.resetViewport();\r\n\r\n const projectContent = null;\r\n this.contentLoader.loadObject(this.objectId as string, this.revision, projectContent).then(() => {\r\n // Set the viewport to project view - reset camera\r\n this.viewport?.setupProjectView();\r\n this.isLoading = false;\r\n });\r\n }\r\n}\r\n","<div class=\"rendered-preview\" #rendererviewport>\r\n @if (isLoading) {\r\n <div class=\"loading-spinner-icon\" title=\"{{'_LoadingGeometry' | translate}}\">\r\n </div>\r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ObjectPropertiesService {\r\n\r\n _model: BehaviorSubject<WebSdk.ObjectData | null> = new BehaviorSubject<WebSdk.ObjectData | null>(null);\r\n\r\n constructor() { }\r\n\r\n get modelValue(): WebSdk.ObjectData | null {\r\n return this._model.value;\r\n }\r\n\r\n get model$(): BehaviorSubject<WebSdk.ObjectData | null> {\r\n return this._model;\r\n }\r\n\r\n setModel(model: WebSdk.ObjectData): void {\r\n this._model.next(model);\r\n }\r\n\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function guidEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function stringEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function stringComboboxValidator(arrayData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!arrayData) {\r\n return null;\r\n }\r\n if(!Array.isArray(arrayData)) {\r\n return null;\r\n }\r\n \r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = arrayData.includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { Component, ViewEncapsulation, Input, OnInit, signal, WritableSignal, ChangeDetectorRef, EventEmitter, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport {\r\n ObjectStructureNode,\r\n ObjectStructureNodeBuilder,\r\n} from '../bimplus-object-structure/bimplus-object-structure.interface';\r\nimport { PreviewObject } from '../object-preview/object-preview.interface';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport {\r\n from\r\n , BehaviorSubject\r\n} from 'rxjs';\r\nimport { BimplusObjectStructureComponent } from '../bimplus-object-structure/bimplus-object-structure.component';\r\nimport {\r\n ComplexPropertiesNode,\r\n ComplexPropertiesNodeBuilder,\r\n} from '../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\r\nimport { BimplusObjectComplexPropertiesComponent } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\r\nimport {\r\n ObjectAttribute,\r\n ObjectAttributeGroup,\r\n} from './object-properties.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport {\r\n BimplusButtonRowItem,\r\n BimplusButtonClickEvent,\r\n} from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation';\r\nimport { ObjectPropertiesGroupComponent } from '../object-properties-group/object-properties-group.component';\r\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\r\nimport {\r\n FormGroup\r\n , ReactiveFormsModule\r\n , FormBuilder\r\n , FormControl\r\n , Validators\r\n} from '@angular/forms';\r\nimport { GetAttributeValue } from '../../pipes/get-attribute-value.pipe';\r\nimport { doubleValidator } from '../../validators/double.validator';\r\nimport { integerValidator } from '../../validators/integer.validator';\r\nimport { guidValidator } from '../../validators/guid.validator';\r\nimport { doubleEnumValidator } from '../../validators/double-enum.validator';\r\nimport { ObjectPreviewComponent } from \"../object-preview/object-preview.component\";\r\nimport { ObjectPropertiesService } from './object-properties.service';\r\nimport { guidEnumValidator } from '../../validators/guid-enum.validator';\r\nimport { stringEnumValidator } from '../../validators/string-enum.validator';\r\nimport { stringComboboxValidator } from '../../validators/string-combobox.validator';\r\n\r\n@Component({\r\n selector: 'lib-object-properties',\r\n imports: [\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n TranslateModule,\r\n BimplusObjectStructureComponent,\r\n BimplusObjectComplexPropertiesComponent,\r\n BimplusButtonsRowComponent,\r\n BimplusScrollableContainerComponent,\r\n ObjectPropertiesGroupComponent,\r\n ObjectPropertiesGroupComponent,\r\n ObjectPreviewComponent,\r\n ReactiveFormsModule\r\n ],\r\n templateUrl: './object-properties.component.html',\r\n styleUrls: ['./object-properties.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements OnInit\r\n{\r\n private readonly formBuilder = inject(FormBuilder);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly objectPropertiesService = inject(ObjectPropertiesService);\r\n\r\n protected _objectPropertiesForm = new FormGroup({});\r\n\r\n protected _objectPropertiesGroupForm(group_name: string): FormGroup {\r\n const _groupForm: FormGroup = this._objectPropertiesForm;\r\n return _groupForm.controls[group_name] as FormGroup;\r\n }\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n protected _editMode = signal<boolean>(false);\r\n private _objectStructure: ObjectStructureNode | null = null;\r\n\r\n get objectStructure(): ObjectStructureNode | null {\r\n return this._objectStructure;\r\n }\r\n\r\n private _complexProperties: ComplexPropertiesNode | null = null;\r\n\r\n get complexProperties(): ComplexPropertiesNode | null {\r\n return this._complexProperties;\r\n }\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n @Input() revision: number | undefined = undefined;\r\n\r\n protected _canUpdateObject = signal<boolean>(false);\r\n @Input() set canUpdateObject(canUpdateObject: boolean) {\r\n this._canUpdateObject.set(canUpdateObject);\r\n }\r\n\r\n private _rootObjectId : string = \"\";\r\n @Input() set rootObjectId(id: string) {\r\n if(this._rootObjectId === id) {\r\n return;\r\n }\r\n this._cancelEditingProperties();\r\n\r\n this._currentObjectId$.next(id);\r\n this._createObjectStructure(id, this.revision);\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly isSaveButtonDisabled$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n protected readonly visibleNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\r\n protected readonly opaqueNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string> (\"\");\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n configEditProperties: Array<BimplusButtonRowItem> = [];\r\n configEditedProperties: Array<BimplusButtonRowItem> = [];\r\n\r\n @Output() updatedObjectProperties = new EventEmitter<{ [key: string]: unknown }>();\r\n\r\n _editPropertiesButtonsConfiguration() {\r\n this.configEditProperties.push({\r\n id: 'edit-properties',\r\n title: this.translateService.instant('_Edit_properties'),\r\n tooltip: this.translateService.instant('_Edit_properties'),\r\n disabled: !this._canUpdateObject(),\r\n buttonStyle: 'primary',\r\n });\r\n }\r\n\r\n _editedPropertiesButtonsConfiguration() {\r\n this.configEditedProperties.push({\r\n id: 'save-changed-properties',\r\n title: this.translateService.instant('_Save'),\r\n tooltip: this.translateService.instant('_Save'),\r\n disabled: this.isSaveButtonDisabled$,\r\n buttonStyle: 'primary',\r\n });\r\n this.configEditedProperties.push({\r\n id: 'cancel-editing-properties',\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'secondary',\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this._editPropertiesButtonsConfiguration();\r\n this._editedPropertiesButtonsConfiguration();\r\n\r\n this.buttonRowItems = this.configEditProperties;\r\n\r\n this.subscribeProperties(); \r\n }\r\n\r\n subscribeProperties() {\r\n this._currentPropertiesObjectId$.subscribe({\r\n next: (id) => {\r\n if (id) {\r\n this._createObjectProperties(id, this.revision);\r\n }\r\n },\r\n });\r\n\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._currentPropertiesObjectId$.next(id);\r\n this._createComplexPropertiestructure(id, this.revision);\r\n },\r\n });\r\n }\r\n\r\n handleObjectStructureNodeSelected(node: ObjectStructureNode) {\r\n console.log(node);\r\n this._currentObjectId$.next(node.id);\r\n }\r\n\r\n handleObjectStructureNodeVisible(node : ObjectStructureNode){\r\n const objNode: PreviewObject = {\r\n id:node.id,\r\n visible: node.visible,\r\n opaque: node.opaque};\r\n this.visibleNodeSignal.set(objNode); // Update the signal\r\n }\r\n\r\n handleObjectStructureNodeOpaque(node : ObjectStructureNode){\r\n const objNode: PreviewObject = {\r\n id:node.id,\r\n visible: node.visible,\r\n opaque: node.opaque};\r\n this.opaqueNodeSignal.set(objNode); // Update the signal\r\n }\r\n \r\n\r\n handleComplexPropertyNodeSelected(node : ComplexPropertiesNode){\r\n console.log(node);\r\n this._currentPropertiesObjectId$.next(node.id);\r\n }\r\n\r\n private _loadObjectStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.getTopology(objectId, revision, false, false, undefined)\r\n );\r\n }\r\n\r\n private _createObjectStructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n this._objectStructure =\r\n ObjectStructureNodeBuilder.createFromResponse(structureData);\r\n }\r\n },\r\n });\r\n }\r\n\r\n private _loadObjectComplexPropertiesStructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.getComplexPropertiesTopology(objectId, revision)\r\n );\r\n }\r\n\r\n private _createComplexPropertiestructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n const complexProps =\r\n ComplexPropertiesNodeBuilder.createFromResponse(structureData);\r\n if (complexProps?.children?.length) {\r\n this._complexProperties = complexProps;\r\n } else {\r\n this._complexProperties = null;\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n protected objectAttributeGroups = signal<ObjectAttributeGroup[]>([]);\r\n\r\n private _loadObjectProperties(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.get(objectId, revision, '8', undefined, false, undefined)\r\n );\r\n }\r\n\r\n private _createObjectProperties(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectProperties(objectId, revision)?.subscribe({\r\n // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\r\n // any for json response\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (propertiesData: any) => {\r\n this.objectPropertiesService.setModel(propertiesData);\r\n this.objectAttributeGroups.set(this._createAttributeGroupsFromResponse(propertiesData));\r\n },\r\n error: () => {\r\n this.objectAttributeGroups.set([]);\r\n },\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _tooltip(attrib: any): string {\r\n const nameTitle: string = this.translateService.instant('_Name');\r\n const name: string = attrib.name ? attrib.name : '';\r\n const descriptionTitle: string =\r\n this.translateService.instant('description');\r\n const description: string = attrib.description;\r\n const uuidTitle: string = this.translateService.instant('_UUID');\r\n const uuid: string = attrib.id;\r\n if (\r\n description === null ||\r\n description === undefined ||\r\n description === ''\r\n ) {\r\n return `${nameTitle}: ${name}\\n${uuidTitle}: ${uuid}`;\r\n }\r\n return `${nameTitle}: ${name}\\n${descriptionTitle}: ${description}\\n${uuidTitle}: ${uuid}`;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _createAttributeGroupsFromResponse(propertiesData: any) {\r\n const groups: Array<ObjectAttributeGroup> = [];\r\n let localizedAttribGroups = null;\r\n if (propertiesData.localizedAttributeGroups) {\r\n localizedAttribGroups = propertiesData.localizedAttributeGroups;\r\n }\r\n\r\n if (!propertiesData.attributes) {\r\n return groups;\r\n }\r\n\r\n const attribGroups = propertiesData.attributes;\r\n for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\r\n const newGroup: ObjectAttributeGroup = {\r\n name: groupName,\r\n expanded: false,\r\n attributes: [],\r\n };\r\n\r\n if (localizedAttribGroups?.[groupName]) {\r\n newGroup.name = localizedAttribGroups[groupName];\r\n }\r\n\r\n if (!attribsObject) {\r\n continue;\r\n }\r\n\r\n for (const attrib of Object.values(attribsObject)) {\r\n const newAttrib: ObjectAttribute = {\r\n id: attrib.id,\r\n name: attrib.name,\r\n description: attrib.description,\r\n value: attrib.value,\r\n group: attrib.group,\r\n type: attrib.type,\r\n unit: attrib.unit,\r\n decimal: attrib.decimal,\r\n control: attrib.control,\r\n enumdefinition: attrib.enumdefinition,\r\n isChangeable: attrib.isChangeable,\r\n tooltip: this._tooltip(attrib),\r\n minValue: attrib.minValue,\r\n maxValue: attrib.maxValue,\r\n };\r\n\r\n newGroup.attributes.push(newAttrib);\r\n }\r\n groups.push(newGroup);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n _deleteForm() {\r\n this._objectPropertiesForm = new FormGroup({});\r\n }\r\n\r\n private initialFormValues: string = \"\";\r\n _createForm() {\r\n const _getAttributeValue = new GetAttributeValue();\r\n const _form: { [key: string]: FormGroup } = {};\r\n this.objectAttributeGroups().forEach(groupAttributes => {\r\n const _form_group: { [key: string]: FormControl | null } = {};\r\n groupAttributes.attributes.forEach(attribute => {\r\n if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [Validators.pattern(/^(false|true|0|1)$/i)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^checkbox$/i.test(attribute.control))\r\n )\r\n {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleValidator(attribute.minValue, attribute.maxValue)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [integerValidator(attribute.minValue, attribute.maxValue)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [guidValidator()] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [guidEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [stringEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^combobox$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [stringComboboxValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^datetime$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [] : []\r\n );\r\n return;\r\n }\r\n });\r\n _form[groupAttributes.name] = this.formBuilder.group(_form_group);\r\n });\r\n this._objectPropertiesForm = this.formBuilder.group(_form);\r\n\r\n this.initialFormValues = JSON.stringify(this._objectPropertiesForm.value);\r\n this._objectPropertiesForm.valueChanges.subscribe({\r\n next: (value) => {\r\n const changed: boolean = JSON.stringify(value) !== this.initialFormValues;\r\n this.isSaveButtonDisabled$.next(!(this._objectPropertiesForm.valid && changed));\r\n }\r\n });\r\n }\r\n\r\n private _getPropertyName(uuid: string): string {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.name;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _getPropertyType(uuid: string): string {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.type;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _getPropertyControl(uuid: string): string | undefined {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.control;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _convertValueToBoolean(value: string): boolean {\r\n return /^true$/i.test(value) || /^1$/i.test(value);\r\n }\r\n\r\n private _convertValueToDouble(value: string): number {\r\n return parseFloat(value);\r\n }\r\n\r\n private _hasBeenValueChanged(uuid: string, value: string | number | boolean): boolean {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return value !== attr.value;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _getChangedData(formGroup: FormGroup): { [key: string]: unknown } {\r\n const changedData: { [key: string]: unknown } = {};\r\n\r\n Object.keys(formGroup.controls).forEach(key => {\r\n const control = formGroup.get(key);\r\n\r\n if (control instanceof FormControl) {\r\n // If it's a FormControl and it's dirty, capture the changed value\r\n if (control.dirty) {\r\n const propName: string = this._getPropertyName(key);\r\n const propType: string = this._getPropertyType(key);\r\n // const propControl: string = this._getPropertyControl(key);\r\n if(propName === '') {\r\n const _newValue = {\r\n id: key,\r\n value: control.value\r\n };\r\n changedData[key] = _newValue;\r\n } else {\r\n if(/^boolean$/i.test(propType)) {\r\n const _val: boolean = this._convertValueToBoolean(control.value);\r\n if(this._hasBeenValueChanged(key, _val)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n else if(/^double$/i.test(propType)) {\r\n const _val: number = this._convertValueToDouble(control.value);\r\n if(this._hasBeenValueChanged(key, _val)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n else {\r\n const _val: string = control.value;\r\n\r\n if(this._hasBeenValueChanged(key, control.value)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n }\r\n }\r\n } else if (control instanceof FormGroup) {\r\n if(control.dirty) {\r\n // Recursively get changed data from nested FormGroup\r\n const nestedChanges = this._getChangedData(control);\r\n if (Object.keys(nestedChanges).length > 0) {\r\n changedData[key] = nestedChanges;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return changedData;\r\n }\r\n\r\n private _saveObjectProperties() {\r\n const saveData: { [key: string]: unknown } = {};\r\n saveData['id'] = this._currentObjectId$.value;\r\n saveData['unsaved'] = true;\r\n saveData['attributes'] = this._getChangedData(this._objectPropertiesForm);\r\n this.saveObjectProperties(saveData);\r\n }\r\n\r\n private _cancelEditingProperties() {\r\n this._editMode.set(false);\r\n this._deleteForm();\r\n this.buttonRowItems = this.configEditProperties\r\n }\r\n\r\n protected buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'edit-properties') {\r\n this._editMode.set(true);\r\n this._createForm();\r\n console.log('Edit properties clicked');\r\n this.buttonRowItems = this.configEditedProperties;\r\n }\r\n\r\n if ($event.id === 'save-changed-properties') {\r\n this._saveObjectProperties();\r\n this._cancelEditingProperties();\r\n console.log('Save changed properties clicked');\r\n }\r\n\r\n if ($event.id === 'cancel-editing-properties') {\r\n this._cancelEditingProperties();\r\n console.log('Cancel edit properties clicked');\r\n }\r\n }\r\n\r\n hasSetAnyAttribute(objectAttributeGroup: ObjectAttributeGroup) {\r\n return objectAttributeGroup.attributes.some((attrib) => {\r\n return !isObjectPropertyValueBlank(attrib);\r\n });\r\n }\r\n\r\n protected saveObjectProperties(data: { [key: string]: unknown }): void {\r\n const selectedObjectId = this._currentPropertiesObjectId$.value;\r\n if (!data || !selectedObjectId) {\r\n return;\r\n }\r\n\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n from(this.api.objects.put(selectedObjectId, JSON.stringify(data))).subscribe({\r\n next: (response: { [key: string]: unknown }) => {\r\n this._createObjectProperties(selectedObjectId, this.revision);\r\n this._createObjectStructure(selectedObjectId, this.revision);\r\n this.updatedObjectProperties.emit({ id: selectedObjectId, request: data, response });\r\n },\r\n });\r\n }\r\n}\r\n","<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n [hasCheckBox1]=\"true\"\r\n [hasCheckBox2]=\"true\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\"\r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n","import { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport {TranslateModule, TranslateService} from \"@ngx-translate/core\";\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\n\r\nexport interface ConfirmDialogInputData {\r\n title: string;\r\n message: string;\r\n acceptButtonLocalizedString: string;\r\n cancelButtonLocalizedString: string;\r\n acceptCallback: () => void;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-confirm',\r\n imports: [\r\n TranslateModule,\r\n BimplusButtonsRowComponent\r\n ],\r\n templateUrl: './bimplus-overlay-dialog-confirm.component.html',\r\n styleUrl: './bimplus-overlay-dialog-confirm.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusOverlayDialogConfirmComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n acceptButtonLocalizedString: string = '_Accept';\r\n cancelButtonLocalizedString: string = '_Cancel';\r\n acceptCallback: (() => void) | undefined;\r\n protected buttons: BimplusButtonRowItem[] = [];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n const data = this.dialogService.inputData as ConfirmDialogInputData;\r\n\r\n if (data) {\r\n this.title = data.title || '';\r\n this.message = data.message || '';\r\n this.acceptButtonLocalizedString = data.acceptButtonLocalizedString || '_Accept';\r\n this.cancelButtonLocalizedString = data.cancelButtonLocalizedString || '_Cancel';\r\n this.acceptCallback = data.acceptCallback;\r\n }\r\n\r\n this.initializeButtons();\r\n }\r\n\r\n initializeButtons() {\r\n this.buttons = [\r\n {\r\n id: \"accept\",\r\n title: this.translateService.instant(this.acceptButtonLocalizedString),\r\n tooltip: this.translateService.instant(this.acceptButtonLocalizedString),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n },\r\n {\r\n id: \"cancel\",\r\n title: this.translateService.instant(this.cancelButtonLocalizedString),\r\n tooltip: this.translateService.instant(this.cancelButtonLocalizedString),\r\n disabled: false,\r\n buttonStyle: 'secondary'\r\n }\r\n ];\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n (document.activeElement as HTMLElement)?.blur();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.dialogService.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n this.dialogService.close();\r\n\r\n if ($event.id === \"accept\") {\r\n this.acceptCallback?.();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"header\">\r\n <div class=\"icon\"></div>\r\n <div class=\"title-text\">\r\n {{ title }}\r\n </div>\r\n <div\r\n class=\"close-button\"\r\n (click)=\"close()\"\r\n (keydown)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"content\">\r\n <div class=\"text\" [innerHTML]=\"message\"></div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DecoratorsService {\r\n\r\n constructor() { }\r\n \r\n fmt(string: string, ...formats: unknown[]): string {\r\n let index = 0;\r\n\r\n return string.replace(/%@(\\d+)?/g, (match: string, argumentIndex: string) => {\r\n const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;\r\n const _match = formats[argumentIndexN];\r\n\r\n if (_match === null) {\r\n return '(null)';\r\n }\r\n if (_match === undefined) {\r\n return '';\r\n }\r\n return _match.toString();\r\n });\r\n }\r\n/**--------------------------------------------------------------------------\r\n * decorate link\r\n --------------------------------------------------------------------------*/\r\n decorateLink(api:WebSdk.Api,link:WebSdk.AttachmentLink,objectIds:[string]):WebSdk.AttachmentLink{\r\n\r\n const retval:WebSdk.AttachmentLink = {\r\n id: link.id,\r\n name: link.name,\r\n fileName: link.fileName,\r\n size: link.size,\r\n link: link.link,\r\n fileNameShort: '',\r\n extension: '',\r\n objectIds: objectIds,\r\n version: link.version,\r\n sizeMB: \"\"\r\n };\r\n const access_token = api.getAccessToken();\r\n const attVersion = \"attachments/%@/versions/%@/download\";\r\n const url = api.getApiTeamUrl()+attVersion;\r\n const isEmbeddedAllplanMode = false;\r\n retval.size = parseFloat((link.size / 1000).toFixed(2));\r\n retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${ isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;\r\n if (link.fileName.length > 20) {\r\n const fileParts = link.fileName.split('.');\r\n if (fileParts.length > 1) {\r\n retval.fileNameShort = fileParts.slice(0, -1).join('.');\r\n retval.extension = \".\" + fileParts.slice(-1);\r\n } else {\r\n retval.fileNameShort = link.fileName;\r\n }\r\n } else {\r\n retval.fileNameShort = link.fileName;\r\n } \r\n return retval;\r\n } \r\n}\r\n","import { Component, ViewEncapsulation, Input, OnInit, Renderer2, ElementRef, OnDestroy, booleanAttribute, Output, EventEmitter, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { from , BehaviorSubject, switchMap, forkJoin } from 'rxjs';\r\nimport { concatMap } from 'rxjs/operators';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport {\r\n BimplusOverlayDialogConfirmComponent\r\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport * as WebClient from 'bimplus-webclient';\r\nimport {NewAttachInfo} from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\r\nimport {DecoratorsService } from '../../services/decorators.service';\r\nexport const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';\r\n\r\nexport const postAttachmentLinks = (newAttachmentIDs: string[], objectId: string, api: WebSdk.Api) => {\r\n // Create an array of observables for each post request\r\n const postRequests = newAttachmentIDs.map((id) => \r\n from(api.objects.postAttachmentLink(objectId, JSON.stringify({ attachmentId: id}))) \r\n );\r\n\r\n // Use forkJoin to wait for all post requests to complete in parallel\r\n return forkJoin(postRequests)\r\n .pipe(\r\n // After all posts are complete, switch to the next call to get updated links\r\n concatMap(() => from(api.objects.getAttachmentLinks(objectId)))\r\n )\r\n}\r\n\r\n@Component({\r\n selector: 'lib-links-to-documents',\r\n imports: [\r\n TranslateModule,\r\n BimplusScrollableContainerComponent,\r\n BimplusButtonsRowComponent,\r\n ],\r\n templateUrl: './links-to-documents.component.html',\r\n styleUrls: ['./links-to-documents.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent implements OnInit, OnDestroy {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly el = inject(ElementRef);\r\n private readonly decorators = inject(DecoratorsService);\r\n\r\n\r\n constructor() {\r\n super();\r\n\r\n this.shadowRootElement = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n private readonly shadowRootElement: HTMLElement;\r\n private _rootObjectId : string = \"\";\r\n isDestroyed = false;\r\n localWormHole:boolean = true;\r\n //When is true then it means the creation of link is in progress\r\n inProgress:boolean= false;\r\n\r\n @Input({ required: true }) api!: WebSdk.Api | null;\r\n @Input() canCreateAttachmentLink: boolean = true;\r\n /** Input Attribute to specify if should show only list of attachments. */\r\n @Input({ transform: booleanAttribute }) listOnly = false;\r\n /** Input Attribute to specify if should show message when no attachments found. */\r\n @Input({ transform: booleanAttribute }) showEmptyMessage: boolean = true;\r\n /** Input Attribute to tell if show/hide attachemt size information. */\r\n @Input({ transform: booleanAttribute }) hideAttachmentSize = false;\r\n\r\n @Input() inputBaseUrl: string =''; // base url for the embedded modal\r\n \r\n _attachments: WebSdk.AttachmentLink[] = [];\r\n\r\n @Input()\r\n set attachments(value: WebSdk.AttachmentLink[]) {\r\n this._attachments = value;\r\n this.onAttachmentsChange();\r\n }\r\n\r\n get attachments(): WebSdk.AttachmentLink[] {\r\n return this._attachments;\r\n }\r\n\r\n onAttachmentsChange() {\r\n if(this.api && this.rootObjectId){\r\n this._attachments = this.decorateAttachmentLinks(this.api,this._attachments); \r\n }\r\n }\r\n\r\n\r\n @Output() attachmentsChange = new EventEmitter<string[]>();\r\n @Output() attachmentsLinkChange = new EventEmitter<NewAttachInfo[]>();\r\n @Input() canDeleteAttachmentLink:boolean = true;\r\n @Input() project : ProjectNavigatorProject | null = null;\r\n @Input() wormholeSelector : string | undefined= \"localEmbeddedModalId\"; // calling application can provide a place where the iframe for documents selection will be rendered\r\n @Input() env : string = 'dev';\r\n\r\n @Input()\r\n set rootObjectId(id : string|undefined){\r\n if(!id){\r\n return;\r\n }\r\n this._currentObjectId$.next(id);\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId() : string{\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\r\n _attachmentCount : number = 0;\r\n buttonRowItems: Array<BimplusButtonRowItem> = [\r\n {\r\n id: \"add-documents\"\r\n , title: this.translateService.instant('_Add_document')\r\n , tooltip: this.translateService.instant('_Add_document')\r\n , disabled: !this.canCreateAttachmentLink\r\n , buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n ngOnInit() {\r\n if (!this.listOnly) {\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._createAttachmentLinkStructure(id);\r\n }\r\n });\r\n }\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.isDestroyed = true;\r\n }\r\n \r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private decorateAttachmentId(item:any){\r\n const it:NewAttachInfo = {\r\n id: item.id,\r\n name: item.name,\r\n nameShort: item.name,\r\n url:'',\r\n iconClass: '',\r\n iconTitle: '',\r\n type: 'AttachmentLink',\r\n deleteButtonTitle:'' \r\n }; \r\n return it;\r\n }\r\n\r\n private decorateAttachmentLinks(api:WebSdk.Api, links:WebSdk.AttachmentLinksResponse):WebSdk.AttachmentLink[]{\r\n const decoratedLinks = links.map((link) => this.decorators.decorateLink(api,link,[this._currentObjectId$.value]));\r\n decoratedLinks.sort((a,b) => {\r\n if(a.fileName.toLowerCase() < b.fileName.toLowerCase() ) return -1;\r\n if(a.fileName.toLowerCase() > b.fileName.toLowerCase() ) return 1;\r\n return 0;\r\n });\r\n return decoratedLinks;\r\n }\r\n\r\n private _createAttachmentLinkStructure(objectId : string){\r\n\r\n this._loadAttachmentLinkStructure(objectId)?.subscribe({\r\n next :(structureData) => {\r\n if(structureData){\r\n //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);\r\n this._attachmentCount = structureData?.length;\r\n if(this.api){\r\n const retval = this.decorateAttachmentLinks(this.api,structureData);\r\n if(retval){\r\n this._attachments = retval;\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n private _loadAttachmentLinkStructure(objectId : string){\r\n if(!this.api){\r\n return;\r\n }\r\n\r\n if(!objectId) {\r\n return;\r\n }\r\n return from(this.api.objects.getAttachmentLinks(objectId));\r\n }\r\n\r\n documentSelection :string[] | null = null;\r\n isOpened:boolean = false;\r\n embeddedModalContainer:string = 'embedded-modal';\r\n\r\n // show or hide embedded modal\r\n setModalVisibility(opened = true) {\r\n if(!this.wormholeSelector){\r\n return;\r\n }\r\n const element = this.localWormHole ? this.shadowRootElement.querySelector(\"#\" + this.wormholeSelector):\r\n document.getElementById(this.wormholeSelector);\r\n if (!element) {\r\n return;\r\n }\r\n if(this.localWormHole){\r\n if(element.parentElement){\r\n this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\r\n }\r\n } else {\r\n this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\r\n }\r\n\r\n ///containerEl.fadeIn(\"fast\") : containerEl.fadeOut(\"fast\");\r\n this.isOpened = opened;\r\n }\r\n\r\n\r\n closeEmbeddedModalFileSelection() {\r\n this.setModalVisibility(false);\r\n }\r\n\r\n _addLink(api:WebSdk.Api, ids:string[]) {\r\n // filter out already existing attachment links \r\n const newAttachmentIDs = ids.filter( item => !this.attachments.find(n => n.id === item) );\r\n if( !newAttachmentIDs.length ){\r\n return;\r\n }\r\n if(this.inProgress){\r\n console.log('in progress');\r\n return;\r\n }\r\n\r\n if(!this.rootObjectId){\r\n // we don't know to which object we want to attach the documents\r\n // so we will deliver just information about selected documents\r\n const getRequests = newAttachmentIDs.map((id) => \r\n from(api.objects.get(id,0,undefined,undefined,undefined,undefined))\r\n );\r\n \r\n forkJoin(getRequests).subscribe({\r\n next: (results) => {\r\n // Process the array of results\r\n (results as WebSdk.AttachmentLink[])?.forEach((item) => {\r\n if(item?.id && !this.attachments.find(attachment => attachment?.id === item.id)){\r\n this._attachments.push(item);\r\n }\r\n });\r\n const retval:NewAttachInfo[] = this._attachments.map((item) => this.decorateAttachmentId(item)); \r\n this.attachmentsLinkChange.emit(retval);\r\n },\r\n error: (err) => {\r\n console.error('Error occurred during requests:', err);\r\n this._attachments=[];\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // we know to which object we want to attach the documents\r\n this.inProgress = true;\r\n postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)\r\n .subscribe({\r\n next: (updatedAttachments) => {\r\n this._attachments = this.decorateAttachmentLinks(\r\n api,\r\n updatedAttachments\r\n ); // Update attachments in component \r\n this.inProgress = false; \r\n this.attachmentsChange.emit(newAttachmentIDs) \r\n },\r\n error: (err) => {\r\n console.error('Failed to add or reload attachments:', err);\r\n this.inProgress = false;\r\n }\r\n });\r\n }\r\n\r\n\r\n createAttachmentLink(api: WebSdk.Api){\r\n console.log('createAttachmentLink')\r\n this.localWormHole = this.wormholeSelector === \"localEmbeddedModalId\";\r\n const callbackF = (docIDs:string[]):void => {\r\n const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;\r\n const foundDocuments = ids && ids.length > 0;\r\n if(!this.isDestroyed){\r\n this.closeEmbeddedModalFileSelection();\r\n if (foundDocuments) {\r\n this._addLink(api,ids);\r\n }\r\n }\r\n }\r\n\r\n if (typeof callbackF !== \"function\" || !this.project || !this.api) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n const isLocalhost = window.location.href.includes(\"localhost\");\r\n let access_token :string|null |undefined= '';\r\n access_token = this.api?.getAccessToken();\r\n if (!access_token) {\r\n access_token = window.localStorage.getItem('access_token');\r\n if (!access_token /*&& isLocalhost*/) {\r\n return;\r\n }\r\n }\r\n const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');\r\n newClient?.initialize();\r\n // Make embedded windows pointing to the current feature branch with baseUrl setup\r\n const options:{baseUrl?:string} = {};\r\n // In case of localhost ommit explicit setup of baseUrl\r\n if (!isLocalhost) {\r\n // Remove '/viewer/' from the end of pathname\r\n let filteredPathname = window.location.pathname.replace(/\\/viewer\\/$/, '/');\r\n // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...\r\n filteredPathname = filteredPathname.replace(/\\/connexis\\/$/, '/');\r\n options.baseUrl = this.inputBaseUrl ? this.inputBaseUrl: window.location.origin + filteredPathname;\r\n }\r\n\r\n ///const env:string=\"dev\"; ///!!! to-do introduce env variable into components\r\n const clientModule = WebClient.BimFilesSelect;\r\n if(this.wormholeSelector){\r\n const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);\r\n if (!documentSelection) {\r\n return;\r\n }\r\n documentSelection.onAttachmentSelected = callbackF;\r\n\r\n if(this.project){\r\n if(this.localWormHole){\r\n documentSelection.loadShadowRoot(this.shadowRootElement,this.project.teamSlug , this.project.id);\r\n }else{\r\n documentSelection.load(this.project.teamSlug , this.project.id);\r\n }\r\n }\r\n this.setModalVisibility(true);\r\n }\r\n },200);\r\n\r\n }\r\n\r\n _deleteAttachmentLink(api:WebSdk.Api ,id:string,$event:Event){\r\n $event.stopPropagation();\r\n $event.preventDefault();\r\n const objects = api.objects;\r\n const objectId = this._currentObjectId$.value;\r\n from(api.objects.deleteAttachmentLink(this.rootObjectId,id)).pipe(\r\n switchMap(() => from(objects.getAttachmentLinks(objectId)))\r\n ).subscribe({\r\n next: (updatedAttachments) => {\r\n if(this.api){\r\n this._attachments = this.decorateAttachmentLinks(this.api,updatedAttachments); // Update attachments in component\r\n // Process the array of results\r\n const retval:NewAttachInfo[] = this._attachments?.map((item) => this.decorateAttachmentId(item));\r\n this.attachmentsLinkChange.emit(retval);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Failed to delete or reload attachments:', err);\r\n }\r\n });\r\n }\r\n\r\n deleteAttachmentLink(attachment:WebSdk.AttachmentLink,$event:Event){\r\n if(!this.api){\r\n return;\r\n }\r\n if(!attachment) {\r\n return;\r\n }\r\n const api = this.api;\r\n this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true\r\n }, data: {\r\n title: this.translateService.instant('_Delete_attachmentlink'),\r\n message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),\r\n acceptButtonLocalizedString: \"_Delete\",\r\n acceptCallback: () => {\r\n this._deleteAttachmentLink(api,attachment.id,$event);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n buttonClicked($event: BimplusButtonClickEvent){\r\n if(!this.api){\r\n return;\r\n }\r\n const api = this.api;\r\n if($event.id == \"add-documents\"){\r\n this.createAttachmentLink(api);\r\n }\r\n }\r\n}\r\n","<div class=\"links-to-documents\">\r\n @if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n }\r\n @if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n }\r\n @if (!_attachments.length && showEmptyMessage) {\r\n <div \r\n data-test=\"no-attachment-links\"\r\n class=\"bim-attachment-not-found\"\r\n > {{ '_No_attachmentlinks_found' | translate }}\r\n </div>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-object-hyperlinks-item',\r\n imports: [\r\n TranslateModule\r\n ],\r\n templateUrl: './object-hyperlinks-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './object-hyperlinks-item.component.less'\r\n})\r\nexport class ObjectHyperlinksItemComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() hyperlink: WebSdk.Hyperlink | undefined;\r\n @Input() deleteButtonEnabled: boolean = true;\r\n\r\n @Output() deleteButtonClicked = new EventEmitter<void>();\r\n\r\n onDeleteButtonClick(): void {\r\n this.deleteButtonClicked.emit();\r\n }\r\n\r\n onDeleteButtonKeyDown($event: KeyboardEvent) {\r\n if ($event.key === 'Enter' || $event.key === ' ') {\r\n $event.preventDefault();\r\n\r\n this.onDeleteButtonClick();\r\n }\r\n }\r\n}\r\n","<div class=\"hyperlink-item\">\r\n @if (deleteButtonEnabled) {\r\n <div class=\"bim-list-button delete\" title=\"{{ '_Hyperlink delete confirmation title' | translate }}\" (click)=\"onDeleteButtonClick()\"\r\n (keydown)=\"onDeleteButtonKeyDown($event)\">\r\n &#10005;&#xFE0E;\r\n </div>\r\n }\r\n\r\n <a href=\"{{ hyperlink?.url }}\" class='bim-hyperlink-url' target=\"_blank\" title=\"{{ hyperlink?.url }}\">\r\n <div class=\"bim-hyperlink-name\">\r\n {{ hyperlink?.name }}\r\n </div>\r\n </a>\r\n</div>\r\n","import { Component, Input, OnInit, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport {BimplusLocalizedWidgetComponent} from '@bimplus/navigation';\r\nimport {TranslateModule} from \"@ngx-translate/core\";\r\nimport {\r\n BimplusScrollableContainerComponent\r\n} from '@bimplus/navigation';\r\nimport {ObjectHyperlinksItemComponent} from \"../object-hyperlinks-item/object-hyperlinks-item.component\";\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {BehaviorSubject} from \"rxjs\";\r\n\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport {\r\n BimplusOverlayDialogConfirmComponent\r\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\r\nimport {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from \"@angular/forms\";\r\nimport {BimplusInputTextFieldComponent} from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\n\r\n@Component({\r\n selector: 'lib-object-hyperlinks',\r\n imports: [\r\n BimplusButtonsRowComponent,\r\n BimplusScrollableContainerComponent,\r\n ObjectHyperlinksItemComponent,\r\n TranslateModule,\r\n ReactiveFormsModule,\r\n BimplusInputTextFieldComponent\r\n],\r\n templateUrl: './object-hyperlinks.component.html',\r\n styleUrl: './object-hyperlinks.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ObjectHyperlinksComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly formBuilder = inject(FormBuilder);\r\n\r\n hyperlinkForm: FormGroup;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.hyperlinkForm = this.formBuilder.group({\r\n name: ['', []],\r\n url: ['',\r\n [\r\n Validators.required,\r\n Validators.pattern(/^[^<>]*$/), // Do not allow < or >\r\n Validators.pattern(/^(?!\\s*$).+/) // Do not allow all empty string, but allow text after spaces\r\n ]\r\n ]\r\n });\r\n\r\n this.hyperlinkForm.statusChanges.subscribe(status => {\r\n this.buttonRowItems[0].disabled = status !== 'VALID';\r\n });\r\n }\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._currentObjectId$.next(id);\r\n this.loadHyperlinks(id);\r\n\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\r\n private _rootObjectId: string = \"\";\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n\r\n @Input() canCreateHyperlinks: boolean = true;\r\n @Input() canDeleteHyperlinks: boolean = true;\r\n\r\n hyperlinks: Array<WebSdk.Hyperlink> = [];\r\n\r\n ngOnInit() {\r\n this.buttonRowItems.push(\r\n {\r\n id: \"add-hyperlink\"\r\n , title: this.translateService.instant('_Add hyperlink')\r\n , tooltip: this.translateService.instant('_Add hyperlink')\r\n , disabled: true\r\n , buttonStyle: 'primary'\r\n }\r\n );\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"add-hyperlink\") {\r\n if (this.hyperlinkForm.valid) {\r\n this.addHyperlink(this.hyperlinkForm.value['name'], this.hyperlinkForm.value['url'], this._rootObjectId).then(() => {\r\n this.loadHyperlinks(this._rootObjectId);\r\n this.hyperlinkForm.reset();\r\n });\r\n }\r\n }\r\n }\r\n\r\n private loadHyperlinks(objectId: string) {\r\n if (!this.api)\r\n return;\r\n\r\n this.api.objects.getHyperlinks(objectId).then((response: WebSdk.HyperlinksResponse) => {\r\n this.hyperlinks = response;\r\n });\r\n }\r\n\r\n private addHyperlink(name: string, url: string, objectId: string): Promise<WebSdk.Hyperlink> {\r\n if (!this.api)\r\n return Promise.reject(new Error('API not available'));\r\n\r\n let sanitizedUrl: string = url.trim();\r\n\r\n if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\r\n sanitizedUrl = 'https://' + sanitizedUrl;\r\n }\r\n\r\n let sanitizedName = name?.trim() ?? '';\r\n\r\n if (sanitizedName === '') {\r\n sanitizedName = sanitizedUrl;\r\n }\r\n\r\n sanitizedName = sanitizedName?.replace(/^http(s?):\\/\\//, '');\r\n\r\n const data = JSON.stringify({\r\n name: sanitizedName,\r\n url: sanitizedUrl,\r\n objectId: objectId\r\n });\r\n\r\n return this.api.objects.postHyperlink(objectId, data);\r\n }\r\n\r\n onHyperlinkItemDeleteButtonClicked(hyperlink: WebSdk.Hyperlink) {\r\n this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true\r\n }, data: {\r\n title: this.translateService.instant('_Hyperlink delete confirmation title'),\r\n message: this.translateService.instant('_Hyperlink delete confirmation message'),\r\n acceptButtonLocalizedString: \"_Delete\",\r\n acceptCallback: () => {\r\n this.deleteHyperlink(hyperlink.id);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private deleteHyperlink(id: string) {\r\n if (!this.api)\r\n return;\r\n\r\n this.api.hyperlinks.delete(id).then(() => {\r\n this.loadHyperlinks(this._rootObjectId);\r\n });\r\n }\r\n}\r\n","@if (canCreateHyperlinks) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\r\n </div>\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\r\n </form>\r\n}\r\n\r\n<div class=\"list-anchor\">\r\n <div class=\"list\">\r\n <lib-bimplus-scrollable-container>\r\n @if (hyperlinks.length > 0) {\r\n @for (hyperlink of hyperlinks; track hyperlink) {\r\n <div style=\"padding-left: 8px\">\r\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\r\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n </div>\r\n","\r\nimport { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\n\r\nexport interface ErrorDialogInputData {\r\n title: string;\r\n message: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-error',\r\n imports: [TranslateModule, BimplusButtonsRowComponent],\r\n templateUrl: './bimplus-overlay-dialog-error.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-error.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogErrorComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly _data: ErrorDialogInputData | undefined;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: \"errorDialogAcceptButton\",\r\n title: this.translateService.instant('_Ok'),\r\n tooltip: this.translateService.instant('_Ok'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this._data = this.dialogService.inputData as ErrorDialogInputData;\r\n this._title = this._data?.title || '';\r\n this._message = this._data?.message || '';\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked(): void {\r\n this.close();\r\n\r\n this.acceptCallback?.();\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\">\r\n </div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{title}}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div class=\"overlay-dialog-container_content_msg\">\r\n {{this.message}}\r\n </div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked()\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport type BimplusTabComponentModel = {\r\n id: string;\r\n title: string;\r\n img: {\r\n default: string;\r\n active: string;\r\n };\r\n};\r\n\r\nexport const DEFAULT_TAB_SWITCHER_ELEMENTS: BimplusTabComponentModel[] = [\r\n { id: 'object-properties', img: { default: 'ic_models', active: 'ic_models_maincolor' }, title: '_Object properties' },\r\n { id: 'comments', img: { default: 'Comments_18_gray', active: 'Comments_18_maincolor' }, title: '_Comments' },\r\n { id: 'attachments', img: { default: 'Attachment_18_gray', active: 'Attachment_18_maincolor' }, title: '_Attachments' },\r\n { id: 'hyperlinks', img: { default: 'Links_18_gray', active: 'Links_18_maincolor' }, title: 'hyperlinks' },\r\n { id: 'links-to-documents', img: { default: 'Attachmentlink_18_gray', active: 'Attachmentlink_18_maincolor' }, title: '_Links_to_documents' },\r\n];\r\n\r\nexport type BimplusTabsSwitcherConfig = {\r\n defaultTabsSwitcherElements?: BimplusTabComponentModel[];\r\n disabled: Partial<{\r\n all: boolean;\r\n id: string;\r\n }>\r\n};\r\n\r\nexport const BIMPLUS_TABS_SWITCHER_CONFIG = new InjectionToken<BimplusTabsSwitcherConfig>('bimplus-tabs-switcher-config');","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig, DEFAULT_TAB_SWITCHER_ELEMENTS } from '../bimplus-tabs-switcher.interface';\r\n\r\n@Injectable()\r\nexport class BimplusTabsSwitcherService {\n private readonly bimplusTabsSwitcherConfig = inject<Pick<BimplusTabsSwitcherConfig, 'defaultTabsSwitcherElements'>>(BIMPLUS_TABS_SWITCHER_CONFIG, { optional: true });\n\r\n /** Default tab switcher elements. */\r\n private readonly tabSwitcherElements = new BehaviorSubject<\r\n BimplusTabComponentModel[]\r\n >(DEFAULT_TAB_SWITCHER_ELEMENTS);\r\n public readonly tabSwitcherElements$ =\r\n this.tabSwitcherElements.asObservable();\r\n\r\n /** Attribute to indicate active tab. (only for BimplusTabComponent) */\r\n private readonly activeTab = new Subject<string>();\r\n public readonly activeTab$ = this.activeTab.asObservable();\r\n\r\n public setActiveTab(key: string): void {\r\n this.activeTab.next(key);\r\n }\r\n\r\n constructor() {\r\n // if there is new default tabs from configuration token then use them instead of original default tabs\r\n if (this.bimplusTabsSwitcherConfig?.defaultTabsSwitcherElements) {\r\n this.tabSwitcherElements.next(\r\n this.bimplusTabsSwitcherConfig.defaultTabsSwitcherElements\r\n );\r\n }\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { Component, computed, EventEmitter, HostListener, Input, OnInit, Output, signal, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusTabsSwitcherService } from '../../services/bimplus-tabs-switcher.service';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig } from '../../bimplus-tabs-switcher.interface';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nconst DEFAULT_IMAGE_SRC = '../../../../../../';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-tab',\r\n imports: [NgClass, TranslateModule],\r\n templateUrl: './bimplus-tab.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-tab.component.less'\r\n})\r\nexport class BimplusTabComponent implements OnInit {\n private readonly bimplusTabsSwitcherConfig = inject<BimplusTabsSwitcherConfig>(BIMPLUS_TABS_SWITCHER_CONFIG, { optional: true });\n protected readonly bimplusTabsSwitcherService = inject(BimplusTabsSwitcherService);\n\r\n @Input({ required: true }) bimplusTabComponentModel!: BimplusTabComponentModel;\r\n @Input() imageBaseSrc?: string | null = DEFAULT_IMAGE_SRC;\r\n /** Currently active tab. */\r\n @Input() set activeTab(value: string | undefined) {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n this.bimplusTabsSwitcherService.setActiveTab(value);\r\n }\r\n @Output() activeTabChange = new EventEmitter<string>();\r\n\r\n /** Attribute indicating active tab. */\r\n protected readonly activeTabSignal = toSignal(this.bimplusTabsSwitcherService.activeTab$);\r\n /** Indicate that tab is active or not. */\r\n protected readonly isActive = computed(() => this.activeTabSignal() === this.bimplusTabComponentModel.id);\r\n /** Indicate that tab is disabled or not. */\r\n protected readonly isDisabled = signal<boolean>(false);\r\n /** Computed property for image file name based on active/default state. */\r\n protected readonly imgName = computed(() =>\r\n this.isActive() ? this.bimplusTabComponentModel.img.active : this.bimplusTabComponentModel.img.default\r\n )\r\n protected readonly onHoverOver = signal<boolean>(false);\r\n\r\n /** Whether all tabs is disabled based on configuration token. */\r\n private readonly isAllDisabled = this.bimplusTabsSwitcherConfig?.disabled?.all ?? false;\r\n\r\n constructor() {\r\n if (this.isAllDisabled) {\r\n this.isDisabled.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n protected onMouseEnter(): void {\r\n this.onHoverOver.set(true)\r\n }\r\n\r\n @HostListener('mouseleave')\r\n protected onMouseLeave(): void {\r\n this.onHoverOver.set(false)\r\n }\r\n\r\n public ngOnInit(): void {\r\n // wheter specific tab is disabled\r\n if (!this.isAllDisabled && this.bimplusTabsSwitcherConfig?.disabled?.id) {\r\n this.isDisabled.set(this.bimplusTabsSwitcherConfig.disabled?.id === this.bimplusTabComponentModel.id);\r\n }\r\n }\r\n\r\n /**\r\n * Will update active tab to service state.\r\n * @protected\r\n * @returns void\r\n */\r\n protected activate(): void {\r\n if (this.isDisabled()) {\r\n return;\r\n }\r\n\r\n this.bimplusTabsSwitcherService.setActiveTab(this.bimplusTabComponentModel.id);\r\n this.activeTabChange.emit(this.bimplusTabComponentModel.id);\r\n }\r\n}\r\n","<div\r\n class=\"tab-element\"\r\n [title]=\"bimplusTabComponentModel.title | translate\"\r\n [class.disabled]=\"isDisabled()\"\r\n (click)=\"!isDisabled() && activate()\"\r\n (keypress)=\"!isDisabled() && activate()\"\r\n>\r\n <img src=\"{{imageBaseSrc}}assets/images/default/{{imgName()}}.svg\" [alt]=\"imgName()\">\r\n <div\r\n [attr.data-test]=\"'underline-switcher-' + bimplusTabComponentModel.id\"\r\n [ngClass]=\"{\r\n 'underline-switcher': true,\r\n 'highlight': isActive(),\r\n 'hovering': onHoverOver()\r\n }\"\r\n ></div>\r\n</div>\r\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, signal, Signal, Output, EventEmitter, Input, inject } from '@angular/core';\r\nimport { BimplusTabsSwitcherService } from './services/bimplus-tabs-switcher.service';\r\nimport { BimplusTabComponent } from './components/bimplus-tab/bimplus-tab.component';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { BimplusTabComponentModel, DEFAULT_TAB_SWITCHER_ELEMENTS } from './bimplus-tabs-switcher.interface';\r\nimport { APP_BASE_HREF } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-tabs-switcher',\r\n imports: [BimplusTabComponent],\r\n templateUrl: './bimplus-tabs-switcher.component.html',\r\n styleUrls: ['./bimplus-tabs-switcher.component.less'],\r\n providers: [BimplusTabsSwitcherService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusTabsSwitcherComponent {\r\n private readonly bimplusTabsSwitcherService = inject(BimplusTabsSwitcherService, { optional: true, skipSelf: true });\r\n\r\n @Input() activeTab?: string;\r\n @Output() activeTabChange = new EventEmitter<string>();\r\n\r\n /** default tab elements, can be chanaged from outside by BimplusTabsSwitcherService */\r\n protected readonly tabSwitcherElements: Signal<BimplusTabComponentModel[]>;\r\n /** app base href */\r\n protected readonly baseHref = inject(APP_BASE_HREF, { optional: true });\r\n\r\n constructor() {\r\n // will check wheter is used from outside and if not then add default tabs\r\n if (this.bimplusTabsSwitcherService) {\r\n this.tabSwitcherElements = toSignal(this.bimplusTabsSwitcherService.tabSwitcherElements$) as Signal<BimplusTabComponentModel[]>\r\n } else {\r\n this.tabSwitcherElements = signal<BimplusTabComponentModel[]>(DEFAULT_TAB_SWITCHER_ELEMENTS).asReadonly();\r\n }\r\n }\r\n}\r\n","<div class=\"tabswitcher-container\">\r\n @for (tabElement of tabSwitcherElements(); track tabElement.id) {\r\n <lib-bimplus-tab\r\n [attr.data-test]=\"tabElement.id\"\r\n [activeTab]=\"activeTab\"\r\n [imageBaseSrc]=\"baseHref\"\r\n (activeTabChange)=\"activeTabChange.emit($event)\"\r\n [bimplusTabComponentModel]=\"{ id: tabElement.id, title: tabElement.title, img: { active: tabElement.img.active, default: tabElement.img.default }}\"\r\n />\r\n }\r\n <ng-content></ng-content>\r\n</div>","import { DecimalPipe } from '@angular/common';\r\nimport { Pipe, PipeTransform } from '@angular/core';\r\n\r\nconst MB_SIZE = 1000;\r\n\r\nexport const BitConverterSize = {\r\n KB: 'kB',\r\n GB: 'gib',\r\n MB: 'mb'\r\n // more..\r\n} as const;\r\n\r\ntype SizeType = typeof BitConverterSize['GB' | 'KB' | 'MB'];\r\n\r\n@Pipe({\r\n name: 'bitConverter',\r\n standalone: true\r\n})\r\nexport class BitConverterPipe extends DecimalPipe implements PipeTransform {\r\n override transform(value: number | string, digitsInfo?: string, locale?: string): string | null;\r\n override transform(value: null | undefined, digitsInfo?: string, locale?: string): null;\r\n override transform(value: number | string | null | undefined, digitsInfo?: string, locale?: string): string | null;\r\n override transform(value: unknown, sizeToConvert: SizeType = BitConverterSize.KB, digitsInfo: string = '1.2-2', base: number = MB_SIZE): string | null {\r\n if (!this.isNumber(value)) {\r\n throw new Error('[BitConverterPipe]: value is not a number');\r\n }\r\n const size = this.getSizeFromBites(value, sizeToConvert, base);\r\n let decimalValue = super.transform(size, digitsInfo);\r\n decimalValue ??= value.toString();\r\n\r\n return `(${decimalValue} ${sizeToConvert})`;\r\n }\r\n\r\n private getSizeFromBites(value: number, size: SizeType, base: number): number {\r\n switch(size) {\r\n case 'kB':\r\n return value / base;\r\n case 'mb':\r\n return value / (base * base);\r\n case 'gib':\r\n return value / (base * base * base);\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n private isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && !isNaN(value);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\n\r\nexport type BimplusAttachmentsConfig = {\r\n buttons?: BimplusButtonRowItem[];\r\n hideDeleteAttachmentButton?: boolean;\r\n showNoAttachmentsFound?: boolean;\r\n hideAttachmentSize?: boolean;\r\n};\r\nexport const BIMPLUS_ATTACHMENTS_CONFIG =\r\n new InjectionToken<BimplusAttachmentsConfig>('bimplus-attachments-config');\r\n\r\nexport interface IAttachment {\r\n id: string;\r\n fileName: string;\r\n size: number | undefined;\r\n file?: File;\r\n}\r\n\r\nexport class Attachment implements Partial<IAttachment> {\r\n public id: string;\r\n public fileName: string;\r\n public size: number | undefined;\r\n public file?: File;\r\n\r\n constructor(data: Partial<IAttachment>) {\r\n this.id = data.id ?? '';\r\n this.fileName = data.fileName ?? '';\r\n this.size = data.size ?? 0;\r\n }\r\n}\r\n\r\ntype Builder = typeof AttachmentBuilder;\r\n\r\nexport abstract class AttachmentBuilder {\r\n private static attachment = new Attachment({});\r\n\r\n public static create(value: Attachment): Builder {\r\n this.attachment = new Attachment(value);\r\n return this;\r\n }\r\n\r\n public static setId(id: string): Builder {\r\n this.attachment.id = id;\r\n return this;\r\n }\r\n\r\n public static setFileName(name: string): Builder {\r\n this.attachment.fileName = name;\r\n return this;\r\n }\r\n\r\n public static setSize(size: number): Builder {\r\n this.attachment.size = size;\r\n return this;\r\n }\r\n\r\n public static setFile(file: File): Builder {\r\n this.attachment.file = file;\r\n return this;\r\n }\r\n\r\n public static build(): Attachment {\r\n const attachmentToReturn = structuredClone(this.attachment);\r\n this.attachment = new Attachment({});\r\n\r\n return attachmentToReturn;\r\n }\r\n}\r\n","import {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n Output,\n signal,\n TemplateRef,\n ViewChild,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { BitConverterPipe } from '../../../../pipes/bit-converter.pipe';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n} from '../../bimplus-attachments.interface';\r\n\r\nconst BIM_ATTACHMENT_DELETE_BUTTON_WIDTH = 30;\r\nconst BIM_ATTACHMENT_ITEM_PADDING_LEFT = 28;\r\n\r\n@Component({\r\n selector: 'lib-bimplus-attachment-item',\r\n imports: [BitConverterPipe, TranslateModule],\r\n templateUrl: './bimplus-attachment-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-attachment-item.component.less'\r\n})\r\nexport class BimplusAttachmentItemComponent\r\n implements AfterViewInit, OnDestroy\r\n{\r\n @Input() closeIconTemplate?: TemplateRef<unknown>;\r\n @ViewChild('attachmentSizeRef') attachmentSizeRef?: ElementRef<HTMLElement>;\r\n @ViewChild('attachmentNameRef') attachmentNameRef!: ElementRef<HTMLElement>;\r\n @Input({ required: true }) attachment!: Attachment;\r\n @Input() set parentWidth(value: number | undefined) {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n this.parentWidthSignal.set(value);\r\n }\r\n @Output() deleteAttachment = new EventEmitter<Attachment>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n get type(): string {\r\n return `.${this.attachment.fileName.split('.').at(-1)}`;\r\n }\r\n\r\n private intersectionObserver?: IntersectionObserver;\r\n /** Parent element width. */\r\n private readonly parentWidthSignal = signal<number | undefined>(undefined);\r\n /** Attachment size text width. */\r\n private readonly attachmentSizeWidth = signal<number>(0);\r\n /** Wheter name is fully visible or not based on parent width. */\r\n protected readonly nameIsFullyVisible = signal<boolean>(false);\r\n\r\n protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\r\n optional: true,\r\n });\r\n\r\n /** Attribute to indicate if show/hide size of File. */\r\n protected readonly hideSize = !!this.config?.hideAttachmentSize;\r\n\r\n /** Width size of file name line. */\r\n protected readonly nameInfoLineWidth = computed<number>(() => {\r\n const parentWidth = this.parentWidthSignal();\r\n const attachmentSizeWidth = this.attachmentSizeWidth();\r\n const nameIsFullyVisible = this.nameIsFullyVisible();\r\n\r\n if (!parentWidth) {\r\n return 0;\r\n }\r\n\r\n if (nameIsFullyVisible) {\r\n return parentWidth - BIM_ATTACHMENT_DELETE_BUTTON_WIDTH;\r\n }\r\n\r\n return (\r\n parentWidth -\r\n attachmentSizeWidth -\r\n (BIM_ATTACHMENT_DELETE_BUTTON_WIDTH + BIM_ATTACHMENT_ITEM_PADDING_LEFT)\r\n );\r\n });\r\n\r\n public ngAfterViewInit(): void {\r\n if (this.attachmentSizeRef) {\r\n this.attachmentSizeWidth.set(\r\n +this.attachmentSizeRef.nativeElement.clientWidth\r\n );\r\n this.createIntersectionObserver();\r\n this.intersectionObserver!.observe(this.attachmentNameRef.nativeElement);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.intersectionObserver?.unobserve(this.attachmentNameRef.nativeElement);\r\n }\r\n\r\n private createIntersectionObserver(): void {\r\n const options: IntersectionObserverInit = {\r\n root: null,\r\n rootMargin: '0px',\r\n threshold: 1.0,\r\n };\r\n const callback: IntersectionObserverCallback = (entries) =>\r\n entries.forEach(({ intersectionRect, boundingClientRect }) => {\r\n const isWidthFullyVisible = intersectionRect.width === boundingClientRect.width;\r\n this.nameIsFullyVisible.set(isWidthFullyVisible);\r\n });\r\n\r\n this.intersectionObserver = new IntersectionObserver(callback, options);\r\n }\r\n}\r\n","<div class=\"bim-attachment-item\">\r\n <div\r\n data-test=\"bim-attachment\"\r\n (click)=\"getAttachment.emit(attachment)\"\r\n (keypress)=\"$event.preventDefault()\"\r\n title=\"{{ attachment.fileName }}\"\r\n class=\"bim-attachment-name\"\r\n [style.width.px]=\"nameInfoLineWidth()\"\r\n >\r\n <span #attachmentNameRef>{{ attachment.fileName }}</span>\r\n @if (nameIsFullyVisible() && !hideSize) {\r\n <span class=\"bim-attachment-size\">{{ attachment.size | bitConverter:'kB':'1.2-2' }}</span>\r\n }\r\n </div>\r\n @if(!nameIsFullyVisible() && !hideSize) {\r\n <span>{{ type }} </span>\r\n <div #attachmentSizeRef class=\"bim-attachment-size\">\r\n {{ attachment.size | bitConverter:'kB':'1.2-2' }}\r\n </div>\r\n }\r\n @if (!config?.hideDeleteAttachmentButton) {\r\n <span\r\n data-test=\"delete-attachment-btn\"\r\n class=\"bim-attachment-delete-button\"\r\n title=\"{{ '_Delete attachment' | translate }}\"\r\n (click)=\"deleteAttachment.emit(attachment)\"\r\n (keypress)=\"$event.preventDefault()\"\r\n >\r\n <span class=\"icon\">✕︎</span>\r\n </span>\r\n }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n TemplateRef,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusAttachmentItemComponent } from './components/bimplus-attachment-item/bimplus-attachment-item.component';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n} from './bimplus-attachments.interface';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n@Component({\r\n selector: 'lib-bimplus-attachments',\r\n imports: [\r\n TranslateModule,\r\n BimplusButtonsRowComponent,\r\n BimplusAttachmentItemComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n templateUrl: './bimplus-attachments.component.html',\r\n styleUrl: './bimplus-attachments.component.less',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusAttachmentsComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements AfterViewInit, OnDestroy\r\n{\r\n @Input() api : WebSdk.Api | null = null;\r\n /** Attribute for attachments which were saved to server. */\r\n @Input() attachments: Attachment[] = [];\r\n @Input() closeIconTemplate?: TemplateRef<unknown>;\r\n /** Attribute to set if should button display or no. */\r\n @Input({ transform: booleanAttribute }) listOnly = false;\r\n @ViewChild('attachmentListRef') attachmentListRef!: ElementRef<HTMLElement>;\r\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\r\n @Output() deleteAttachment = new EventEmitter<Attachment>();\r\n @Output() addAttachment = new EventEmitter<File>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n private resizeObserver!: ResizeObserver;\r\n /** Configuration token. */\r\n protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\r\n optional: true,\r\n });\r\n /** Attachments buttons. */\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: 'add-attachment',\r\n title: this.translateService.instant('_Add attachment'),\r\n tooltip: this.translateService.instant('_Add attachment'),\r\n disabled: false,\r\n buttonStyle: 'primary',\r\n type: 'file',\r\n },\r\n ];\r\n /** Width size of file name line. */\r\n protected readonly attachmentListWidth = signal<number | undefined>(\r\n undefined\r\n );\r\n\r\n /**\r\n * Will open window to select File.\r\n * @return void\r\n * @public\r\n */\r\n public open(): void {\r\n this.fileInput.nativeElement.click();\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n this.createResizeObserver();\r\n this.resizeObserver.observe(this.attachmentListRef.nativeElement);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.resizeObserver.unobserve(this.attachmentListRef.nativeElement);\r\n }\r\n\r\n protected onFileChanged(files: File[] | Event, inputElement?: HTMLInputElement): void {\r\n let filesArray: File[] = [];\r\n if(files instanceof FileList){\r\n filesArray = Array.from(files);\r\n } else if(files instanceof Event){\r\n const input = files.target as HTMLInputElement;\r\n if (input?.files) { \r\n filesArray = Array.from(input.files); \r\n }\r\n } \r\n for (const file of filesArray) {\r\n if (file instanceof File) {\r\n this.addAttachment.emit(file);\r\n } \r\n } \r\n // reset value to be able select same value again\r\n if (inputElement) {\r\n inputElement.value = ''\r\n }\r\n }\r\n\r\n private createResizeObserver(): void {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const { width }: DOMRectReadOnly = entries[0].contentRect;\r\n this.attachmentListWidth.set(width);\r\n });\r\n }\r\n}\r\n","<div class=\"bim-attachments\">\r\n @if (listOnly) {\r\n <input #fileInput hidden type=\"file\" (change)=\"onFileChanged($event, fileInput)\" multiple>\r\n } @else {\r\n <lib-bimplus-buttons-row [items]=\"config?.buttons ?? buttons\" (fileChanged)=\"onFileChanged($event)\" [isMultiple]=\"true\"/>\r\n }\r\n\r\n @if (listOnly) {\r\n <section #attachmentListRef class=\"bim-attachments-list\">\r\n @if (!attachments.length) {\r\n @if (config?.showNoAttachmentsFound) {\r\n <div\r\n data-test=\"no-attachments\"\r\n class=\"bim-attachments-list-empty\"\r\n >{{ '_No attachments found' | translate }}</div>\r\n }\r\n } @else {\r\n @for (attachment of attachments; track attachment.id) {\r\n <lib-bimplus-attachment-item\r\n [closeIconTemplate]=\"closeIconTemplate\"\r\n [attr.data-test]=\"attachment.id\"\r\n (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n [parentWidth]=\"attachmentListWidth()\"\r\n [attachment]=\"attachment\"\r\n />\r\n }\r\n }\r\n </section>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <section #attachmentListRef class=\"bim-attachments-list\">\r\n @if (!attachments.length) {\r\n @if (config?.showNoAttachmentsFound) {\r\n <div\r\n data-test=\"no-attachments\"\r\n class=\"bim-attachments-list-empty\"\r\n >{{ '_No attachments found' | translate }}</div>\r\n }\r\n } @else {\r\n @for (attachment of attachments; track attachment.id) {\r\n <lib-bimplus-attachment-item\r\n [closeIconTemplate]=\"closeIconTemplate\"\r\n [attr.data-test]=\"attachment.id\"\r\n (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n [parentWidth]=\"attachmentListWidth()\"\r\n [attachment]=\"attachment\"\r\n />\r\n }\r\n }\r\n </section>\r\n </lib-bimplus-scrollable-container>\r\n </div> \r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n Attachment,\r\n AttachmentBuilder,\r\n} from '../bimplus-attachments.interface';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BimplusAttachmentsService {\r\n public getAttachment(value: Attachment | File): Attachment {\r\n let attachment: Attachment;\r\n if (value instanceof File) {\r\n attachment = AttachmentBuilder.setFile(value)\r\n .setFileName(value.name)\r\n .build();\r\n } else {\r\n attachment = AttachmentBuilder.create(value).build();\r\n }\r\n\r\n return attachment;\r\n }\r\n\r\n public download(href: string, fileName: string): void {\r\n const anchor: HTMLAnchorElement = document.createElement('a');\r\n anchor.rel = 'noopener noreferrer';\r\n anchor.target = '_blank';\r\n anchor.href = href;\r\n anchor.download = fileName;\r\n anchor.click();\r\n }\r\n}\r\n","import { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\n\r\nexport interface CommentDialogData {\r\n title: string;\r\n message: string;\r\n acceptCallback: () => void;\r\n}\r\n\r\nconst DELETE_BUTTON_ID = 'delete';\r\nconst CANCEL_BUTTON_ID = 'cancel';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-delete',\r\n templateUrl: './bimplus-overlay-dialog-delete.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-delete.component.less'],\r\n imports: [TranslateModule, BimplusButtonsRowComponent],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogDeleteComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly data: CommentDialogData | undefined;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: DELETE_BUTTON_ID,\r\n title: this.translateService.instant('_Delete'),\r\n tooltip: this.translateService.instant('_Delete'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n },\r\n {\r\n id: CANCEL_BUTTON_ID,\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'secondary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this.data = this.dialogService.inputData as CommentDialogData;\r\n if (this.data) {\r\n this._title = this.data.title || '';\r\n this._message = this.data.message || '';\r\n this.acceptCallback = this.data.acceptCallback;\r\n }\r\n }\r\n\r\n close(): void {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.dialogService.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent): void {\r\n this.dialogService.close();\r\n\r\n if ($event.id === DELETE_BUTTON_ID) {\r\n this.acceptCallback?.();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\"></div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{title}}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div\r\n class=\"overlay-dialog-container_content_msg\"\r\n [innerHTML]=\"message\">\r\n </div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libAutoResizeTextarea]',\r\n standalone: true\r\n})\r\nexport class AutoResizeTextareaDirective {\r\n private el = inject(ElementRef);\r\n\r\n\r\n private _libAutoResizeTextarea = false;\r\n private _autoResizeMinRows = 1;\r\n private _autoResizeMaxRows = 1;\r\n private currentRows = 1;\r\n private offsetHeight = 0;\r\n private readonly input: HTMLTextAreaElement;\r\n private avgLineHeight = 0;\r\n\r\n @Input()\r\n set autoResizeMinRows(value: number) {\r\n this._autoResizeMinRows = value > 0 ? value : 1;\r\n this.currentRows = this.currentRows < value ? value : this.currentRows;\r\n this.input.rows = value;\r\n }\r\n get autoResizeMinRows(): number {\r\n return this._autoResizeMinRows;\r\n }\r\n\r\n @Input()\r\n set autoResizeMaxRows(value: number) {\r\n this._autoResizeMaxRows = value < 1 ? 1 : value;\r\n }\r\n get autoResizeMaxRows(): number {\r\n return this._autoResizeMaxRows;\r\n }\r\n\r\n @Input()\r\n set libAutoResizeTextarea(condition: boolean) {\r\n this._libAutoResizeTextarea = condition;\r\n }\r\n get libAutoResizeTextarea(): boolean {\r\n return this._libAutoResizeTextarea;\r\n }\r\n\r\n constructor() {\r\n this.input = this.el.nativeElement;\r\n }\r\n\r\n @HostListener('input')\r\n onInput(): void {\r\n if (this.libAutoResizeTextarea) {\r\n this.calculateLineHeight();\r\n this.updateRows();\r\n }\r\n }\r\n\r\n private calculateLineHeight(): void {\r\n const style = window.getComputedStyle(this.input, null);\r\n const lineHeight = style.getPropertyValue('line-height');\r\n let newLineHeight = 0;\r\n if (lineHeight === 'normal') {\r\n newLineHeight = (parseFloat(style.getPropertyValue('font-size')) || 16) * 1.14;\r\n } else {\r\n newLineHeight = parseFloat(lineHeight);\r\n }\r\n this.avgLineHeight = Math.trunc(newLineHeight);\r\n }\r\n\r\n private updateRows(): void {\r\n if (this.offsetHeight <= 0) {\r\n this.offsetHeight = this.input.scrollHeight;\r\n }\r\n\r\n this.input.rows = this._autoResizeMinRows;\r\n\r\n const rows = Math.floor(\r\n (this.input.scrollHeight - this.offsetHeight) /\r\n this.avgLineHeight\r\n );\r\n\r\n const rowsCount = this._autoResizeMinRows + rows;\r\n\r\n this.input.rows = rowsCount > this._autoResizeMaxRows\r\n ? this._autoResizeMaxRows\r\n : rowsCount;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { AutoResizeTextareaDirective } from './auto-resize-textarea.directive';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-textarea',\r\n templateUrl: './bimplus-textarea.component.html',\r\n styleUrls: ['./bimplus-textarea.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [ReactiveFormsModule, AutoResizeTextareaDirective, TranslateModule]\r\n})\r\nexport class BimplusTextareaComponent implements OnInit, OnDestroy {\r\n\r\n textareaControl = new FormControl();\r\n\r\n private _textareaSubscription?: Subscription;\r\n\r\n @Output() textAreaValueChange = new EventEmitter<string>();\r\n\r\n private _name = '';\r\n private _placeholder = '';\r\n private _readonly = false;\r\n private _required = false;\r\n private _rows = 1;\r\n private _activeAutoResizeTextarea = false;\r\n private _minRows = 1;\r\n private _maxRows = 1;\r\n private _clearValue = false;\r\n\r\n @Input()\r\n set name(value: string) {\r\n this._name = value;\r\n }\r\n get name(): string {\r\n return this._name;\r\n }\r\n\r\n @Input()\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n }\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n\r\n @Input()\r\n set readonly(value: boolean) {\r\n this._readonly = value;\r\n }\r\n get readonly(): boolean {\r\n return this._readonly;\r\n }\r\n\r\n @Input()\r\n set required(value: boolean) {\r\n this._required = value;\r\n }\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n\r\n @Input()\r\n set minRows(value: number) {\r\n this._minRows = value;\r\n }\r\n get minRows(): number {\r\n return this._minRows;\r\n }\r\n\r\n @Input()\r\n set maxRows(value: number) {\r\n this._maxRows = value;\r\n }\r\n get maxRows(): number {\r\n return this._maxRows;\r\n }\r\n\r\n @Input()\r\n set activeAutoResizeTextarea(value: boolean) {\r\n this._activeAutoResizeTextarea = value;\r\n }\r\n get activeAutoResizeTextarea(): boolean {\r\n return this._activeAutoResizeTextarea;\r\n }\r\n\r\n @Input()\r\n set clearValue(clear: boolean) {\r\n if (clear) {\r\n this.textareaControl.reset();\r\n this._clearValue = false;\r\n } else {\r\n this._clearValue = clear;\r\n }\r\n }\r\n get clearValue(): boolean {\r\n return this._clearValue;\r\n }\r\n\r\n @Input()\r\n set rows(value: number) {\r\n this._rows = value;\r\n }\r\n get rows(): number {\r\n return this._rows;\r\n }\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {\r\n this._textareaSubscription = this.textareaControl.valueChanges.subscribe(value => {\r\n this.textAreaValueChange.emit(value);\r\n });\r\n }\r\n\r\n getTextareaValue() {\r\n return this.textareaControl.value;\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): boolean {\r\n const forbiddenKeys = ['<', '>'];\r\n if (forbiddenKeys.includes(event.key)) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n ngOnDestroy() {\r\n this._textareaSubscription?.unsubscribe();\r\n }\r\n}\r\n","@if(activeAutoResizeTextarea){\r\n <textarea\r\n [formControl]=\"textareaControl\"\r\n [placeholder]=\"placeholder | translate\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n (keydown)=\"onKeydown($event)\"\r\n [libAutoResizeTextarea]=\"activeAutoResizeTextarea\"\r\n [autoResizeMinRows]=\"minRows\"\r\n [autoResizeMaxRows]=\"maxRows\"\r\n ></textarea>\r\n } @else {\r\n <textarea\r\n [formControl]=\"textareaControl\"\r\n [placeholder]=\"placeholder\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n (keydown)=\"onKeydown($event)\"\r\n [rows]=\"rows\"\r\n ></textarea>\r\n }\r\n","import { formatDate } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { TranslatePipe } from \"@ngx-translate/core\";\r\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\r\nimport { Attachment, BIMPLUS_ATTACHMENTS_CONFIG, BimplusAttachmentsConfig } from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { CommentOutputData } from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\r\n\r\nconst config: BimplusAttachmentsConfig = {\r\n hideDeleteAttachmentButton: true,\r\n hideAttachmentSize: true\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-comment',\r\n templateUrl: './bimplus-comment.component.html',\r\n styleUrls: ['./bimplus-comment.component.less'],\r\n imports: [TranslatePipe, BimplusAttachmentsComponent],\r\n providers: [{ provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config }],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusCommentComponent {\r\n\r\n @Output() outputActionCommentEvent = new EventEmitter<CommentOutputData>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n private _message: string | undefined = undefined;\r\n \r\n @Input() api : WebSdk.Api | null = null;\r\n\r\n /** Attachments links to particular comment. */\r\n @Input() attachmentLinkItems:WebSdk.AttachmentLink[] = []\r\n\r\n @Input()\r\n set message(value: string | undefined) {\r\n this._message = value;\r\n }\r\n get message(): string | undefined {\r\n return this._message;\r\n }\r\n\r\n private _date = '';\r\n @Input()\r\n set date(value: string) {\r\n const formattedValue = new Intl.DateTimeFormat(undefined, { timeStyle: \"short\" }).format(new Date(value));\r\n this._date = formattedValue;\r\n }\r\n get date(): string {\r\n return this._date;\r\n }\r\n\r\n private _action = 'close';\r\n @Input()\r\n set action(value: string) {\r\n this._action = value;\r\n }\r\n get action(): string {\r\n return this._action;\r\n }\r\n\r\n private _commentId = '';\r\n @Input()\r\n set commentId(value: string) {\r\n this._commentId = value;\r\n }\r\n get commentId(): string {\r\n return this._commentId;\r\n }\r\n\r\n private _isActUserAuthor = true;\r\n @Input()\r\n set isActUserAuthor(value: boolean) {\r\n this._isActUserAuthor = value;\r\n }\r\n get isActUserAuthor(): boolean {\r\n return this._isActUserAuthor;\r\n }\r\n\r\n private _displayname = '';\r\n @Input()\r\n set displayname(value: string) {\r\n this._displayname = value;\r\n }\r\n get displayname(): string {\r\n return this._displayname;\r\n }\r\n\r\n @Input() hyperlinks: WebSdk.Hyperlink[] | undefined = [];\r\n\r\n /** Attachments related to particular comment. */\r\n @Input() attachments: WebSdk.Attachment[] = [];\r\n\r\n emitAction(data: CommentOutputData): void {\r\n this.outputActionCommentEvent.emit(data);\r\n }\r\n\r\n close(): void {\r\n const data: CommentOutputData = { action: this.action, data: { commentId: this.commentId } };\r\n this.emitAction(data);\r\n }\r\n\r\n onKeyPress(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n formatTime(date: string): string {\r\n const locale = window.navigator.language;\r\n const unformattedDate = new Date(date);\r\n if (locale.includes('en')) {\r\n return formatDate(unformattedDate, 'hh:mm a', locale);\r\n }\r\n return formatDate(unformattedDate, 'hh:mm', locale);\r\n }\r\n}\r\n","@if (message !== undefined) {\r\n <div\r\n class=\"comment-item-container\"\r\n [class]=\"isActUserAuthor ? 'author' : ''\">\r\n @if (!isActUserAuthor) {\r\n <div class=\"comment-header\">\r\n <div class=\"comment-title\">{{isActUserAuthor? '' : displayname}}</div>\r\n </div>\r\n }\r\n @if (isActUserAuthor) {\r\n <div\r\n class=\"comment-close\"\r\n (click)=\"close()\"\r\n (keydown)=\"onKeyPress($event)\"\r\n ></div>\r\n }\r\n @if (message !== undefined){\r\n <div class=\"comment-item-text\">{{message}}</div>\r\n }\r\n\r\n @if (attachments.length) {\r\n <lib-bimplus-attachments\r\n listOnly\r\n [attachments]=\"attachments\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n />\r\n }\r\n\r\n @if (attachmentLinkItems.length) {\r\n @for (attachmentLink of attachmentLinkItems; track attachmentLink) {\r\n <a class=\"item-row\" href=\"{{attachmentLink.link}}\" target=\"_blank\">\r\n <div class=\"attachment-link-icon\" title=\"{{ '_Attachment_link' | translate }}\"></div>\r\n <div class=\"text\" title=\"{{ attachmentLink.name }}\">{{ attachmentLink.name}}</div>\r\n </a>\r\n }\r\n }\r\n\r\n @for (link of hyperlinks; track link) {\r\n <a class=\"item-row\" href=\"{{ link.url }}\" target=\"_blank\">\r\n <div class=\"link-icon\" title=\"{{ '_Hyperlink' | translate }}\"></div>\r\n <div class=\"text\" title=\"{{ link.url }}\">{{ link.name }}</div>\r\n </a>\r\n }\r\n\r\n @if (date && date.length > 0){\r\n <div class=\"comment-item-date\">\r\n {{date}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n","import { inject, Injectable } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {catchError, defaultIfEmpty, first, forkJoin, from, map, Observable, of, switchMap} from 'rxjs';\r\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\r\nimport { Attachment } from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { postAttachmentLinks } from '../links-to-documents/links-to-documents.component';\r\nimport {DecoratorsService } from '../../services/decorators.service';\r\n\r\n@Injectable()\r\nexport class BimplusObjectCommentsListService {\r\n private readonly decorators = inject(DecoratorsService);\r\n\r\n public api!: WebSdk.Api;\r\n\r\n private readonly bimplusAttachmentsService = inject(BimplusAttachmentsService);\r\n\r\n\r\n public deleteComment(commentId: string) {\r\n return from(this.api.comments.delete(commentId));\r\n }\r\n\r\n public downloadAttachment(attachment: Attachment) {\r\n const { id, fileName } = attachment;\r\n if (!this.api) {\r\n return;\r\n }\r\n const api = this.api;\r\n const path = `${api.getApiTeamUrl()}attachments/${id}/download?api-token=${api.getAccessToken()}&openInBrowser=true`;\r\n this.bimplusAttachmentsService.download(path, fileName);\r\n }\r\n\r\n public postComments(\r\n rootObjectId: string,\r\n dataText: string,\r\n hyperlinks: Partial<WebSdk.Hyperlink>[],\r\n attachments: Attachment[],\r\n newAttachmentIDs: string[]\r\n ): Observable<string | null> {\r\n return from(this.api.objects.postComment(rootObjectId, dataText)).pipe(\r\n switchMap(createdComment => {\r\n const { id: createdCommentId } = createdComment;\r\n\r\n // Create form data for attachments\r\n const formData = attachments.map(attachment => {\r\n const attachmentsPayload = new FormData();\r\n attachmentsPayload.append('file', attachment.file!);\r\n attachmentsPayload.append('name', attachment.fileName);\r\n attachmentsPayload.append('size', attachment.file!.size.toString());\r\n attachmentsPayload.append('type', attachment.file!.type);\r\n attachmentsPayload.append('objectId', createdCommentId);\r\n return attachmentsPayload;\r\n });\r\n\r\n // Post attachments if any, otherwise continue\r\n const attachmentCalls = formData.length\r\n ? forkJoin(formData.map(data => from(this.api.objects.postAttachment(createdCommentId, data, undefined, ''))))\r\n : of([]);\r\n\r\n return attachmentCalls.pipe(map(() => createdCommentId));\r\n }),\r\n switchMap(createdCommentId => {\r\n // Post attachment links\r\n return newAttachmentIDs.length\r\n ? postAttachmentLinks(newAttachmentIDs, createdCommentId, this.api).pipe(map(() => createdCommentId))\r\n : of(createdCommentId);\r\n }),\r\n switchMap(createdCommentId => {\r\n // Manage hyperlinks\r\n return hyperlinks.length\r\n ? this.manageHyperLinks(createdCommentId, hyperlinks).pipe(map(() => createdCommentId))\r\n : of(createdCommentId);\r\n }),\r\n defaultIfEmpty(null),\r\n first(),\r\n catchError(error => {\r\n console.error('Error in postComments:', error);\r\n return of(null); // Ensure the stream completes with null in case of an error\r\n })\r\n );\r\n }\r\n private decorateComment(comment: WebSdk.CommentResponse) {\r\n if(comment.attachmentLinks && comment.attachmentLinks.length > 0) {\r\n const decoratedLinks = comment.attachmentLinks.map((link) => this.decorators.decorateLink(this.api!,link, [comment.id])); \r\n comment.attachmentLinks = decoratedLinks; \r\n }\r\n }\r\n\r\n private decorateComments(comments: WebSdk.CommentsResponse) { \r\n comments.forEach((comment) => {\r\n this.decorateComment(comment);\r\n });\r\n return comments;\r\n }\r\n\r\n public loadComments(objectId: string): Observable<WebSdk.CommentsResponse> {\r\n return from(this.api.objects.getComments(objectId)).pipe(\r\n map((response: WebSdk.CommentsResponse | undefined) => {\r\n if (!response) {\r\n throw new Error('Comments response is undefined'); // Handle undefined response\r\n }\r\n // Modify the response here\r\n return this.decorateComments(response!); \r\n })\r\n );\r\n }\r\n\r\n public manageHyperLinks(\r\n createdCommentId: string,\r\n hyperlinks: Partial<WebSdk.Hyperlink>[]\r\n ) {\r\n const hyperlinkPromises: (Promise<void | WebSdk.Hyperlink> | undefined)[] =\r\n [];\r\n\r\n hyperlinks.forEach((h) => {\r\n if (!h) {\r\n return;\r\n }\r\n const hyperlinkData = JSON.stringify({\r\n name: h.name,\r\n objectId: h.objectId,\r\n url: h.url\r\n });\r\n const promise = this.api?.objects\r\n .postHyperlink(createdCommentId, hyperlinkData)\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n hyperlinkPromises.push(promise);\r\n });\r\n\r\n return from(Promise.all(hyperlinkPromises));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { StatusBarData } from './statusBar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BimplusStatusBarService {\r\n\r\n _statusBarData: BehaviorSubject<StatusBarData> = new BehaviorSubject<StatusBarData>({\r\n title: '',\r\n statusBarVisible: false\r\n });\r\n\r\n constructor() { }\r\n\r\n get statusBarVisible(): boolean {\r\n return this._statusBarData.value.statusBarVisible;\r\n }\r\n\r\n get title(): string {\r\n return this._statusBarData.value.title;\r\n }\r\n\r\n get statusBarData(): StatusBarData {\r\n return this._statusBarData.value;\r\n }\r\n\r\n get statusBarDataSubscription(): BehaviorSubject<StatusBarData> {\r\n return this._statusBarData;\r\n }\r\n\r\n setStatusBarData(data: StatusBarData): void {\r\n this._statusBarData.next(data);\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit, signal, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BimplusOverlayDialogDeleteComponent } from '../bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { AsyncPipe, DatePipe } from '@angular/common';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusTextareaComponent } from '../bimplus-textarea/bimplus-textarea.component';\r\nimport { BimplusCommentComponent } from '../bimplus-comment/bimplus-comment.component';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation';\r\nimport { CommentData, CommentOutputData, IDialogConfirmClose } from './bimplus-object-comments-list.interface';\r\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from \"@angular/forms\";\r\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\r\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n BimplusAttachmentsConfig,\r\n} from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { BehaviorSubject, switchMap } from 'rxjs';\r\nimport { BimplusObjectCommentsListService } from './bimplus-object-comments-list.service';\r\nimport { LinksToDocumentsComponent } from '../links-to-documents/links-to-documents.component';\r\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { BimplusStatusBarService } from '../bimplus-status-bar/bimplus-status-bar.service';\r\nimport { NewAttachInfo } from './bimplus-object-comments-list.interface';\r\n\r\n\r\nconst config: BimplusAttachmentsConfig = {\r\n showNoAttachmentsFound: false,\r\n hideAttachmentSize: true,\r\n};\r\n@Component({\r\n selector: 'lib-bimplus-object-comments-list',\r\n templateUrl: './bimplus-object-comments-list.component.html',\r\n styleUrls: ['./bimplus-object-comments-list.component.less'],\r\n imports: [\r\n CommonModule,\r\n BimplusTextareaComponent,\r\n BimplusCommentComponent,\r\n BimplusButtonsRowComponent,\r\n TranslateModule,\r\n BimplusScrollableContainerComponent,\r\n BimplusInputTextFieldComponent,\r\n BimplusAttachmentsComponent,\r\n LinksToDocumentsComponent,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n AsyncPipe\r\n],\r\n providers: [\r\n DatePipe,\r\n BimplusObjectCommentsListService,\r\n BimplusAttachmentsService,\r\n { provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusObjectCommentsListComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements OnInit, OnChanges {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly datePipe = inject(DatePipe);\r\n private readonly formBuilder = inject(FormBuilder);\r\n protected readonly bimplusAttachmentsService = inject(BimplusAttachmentsService);\r\n private readonly bimplusObjectCommentsListService = inject(BimplusObjectCommentsListService);\r\n private statusBarService = inject(BimplusStatusBarService);\r\n\r\n hyperlinkForm: FormGroup;\r\n\r\n @Input({ required: true }) api!: WebSdk.Api | null;\r\n @Input() project: ProjectNavigatorProject | null = null;\r\n @Input() wormholeSelector: string = \"localEmbeddedModalId\";\r\n @Input() env: string = \"prod\";\r\n @Input() attachmentLinkItems: WebSdk.AttachmentLink[] = []\r\n @Input() inputBaseUrl: string = '';\r\n protected readonly commentsList$ = new BehaviorSubject<WebSdk.CommentResponse[]>([]);\r\n protected readonly loading = signal(false);\r\n protected readonly attachmentsState = signal<Attachment[]>([]);\r\n buttonRowItems: BimplusButtonRowItem[] = [];\r\n hyperlinkButtonRowItems: BimplusButtonRowItem[] = [];\r\n textAreaValue: string | null = null;\r\n lastShownDate = '';\r\n placeholder = '';\r\n name = '';\r\n readonly = false;\r\n autoResizeTextarea = true;\r\n minRows = 3;\r\n maxRows = 10;\r\n clearValue = false;\r\n statusBarTitleMessage = this.translateService.instant('_Loading');\r\n\r\n // attachment ids ready to map to concrete comment\r\n newAttachmentIDs: string[] = []\r\n\r\n isAddingHyperlink: boolean = false;\r\n\r\n newCommentAttachments: NewAttachInfo[] = [];\r\n\r\n private _rootObjectId = '';\r\n private _userId = '';\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n @Input()\r\n set userId(id: string) {\r\n this._userId = id;\r\n }\r\n\r\n get userId(): string {\r\n return this._userId;\r\n }\r\n\r\n constructor() {\r\n super();\r\n\r\n this.hyperlinkForm = this.formBuilder.group({\r\n name: ['', []],\r\n url: [\r\n '',\r\n [\r\n Validators.required,\r\n Validators.pattern(/^[^<>]*$/), // Do not allow < or >\r\n Validators.pattern(/^(?!\\s*$).+/), // Do not allow all empty string, but allow text after spaces\r\n ],\r\n ],\r\n });\r\n }\r\n\r\n isCreateButtonDisabled(): boolean {\r\n return !(\r\n this.textAreaValue ||\r\n this.newAttachmentIDs?.length > 0 ||\r\n this.getHyperlinks(this.rootObjectId)?.length > 0 ||\r\n this.attachmentsState()?.length > 0\r\n );\r\n }\r\n\r\n checkCreateButtonState() {\r\n if (!this.buttonRowItems?.[0]) {\r\n return;\r\n }\r\n this.buttonRowItems[0].disabled = this.isCreateButtonDisabled();\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.bimplusObjectCommentsListService.api = this.api!;\r\n this.loadComments();\r\n const submit: BimplusButtonRowItem[] = [\r\n {\r\n id: 'submit',\r\n title: this.translateService.instant('_Add comment'),\r\n tooltip: this.translateService.instant('_Add comment'),\r\n disabled: this.isCreateButtonDisabled(),\r\n buttonStyle: 'primary',\r\n },\r\n ];\r\n this.placeholder = this.translateService.instant(\r\n '_Place comment text here'\r\n );\r\n this.name = this.translateService.instant('comment');\r\n this.buttonRowItems = submit;\r\n\r\n this.hyperlinkButtonRowItems.push(\r\n {\r\n id: 'cancel-hyperlink',\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'primary',\r\n },\r\n {\r\n id: 'add-hyperlink',\r\n title: this.translateService.instant('_Add hyperlink'),\r\n tooltip: this.translateService.instant('_Add hyperlink'),\r\n disabled: true,\r\n buttonStyle: 'primary',\r\n }\r\n );\r\n\r\n this.hyperlinkForm.statusChanges.subscribe((status) => {\r\n this.hyperlinkButtonRowItems[1].disabled = status !== 'VALID';\r\n });\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['rootObjectId'] && !changes['rootObjectId'].firstChange) {\r\n this.lastShownDate = '';\r\n this.loadComments();\r\n }\r\n }\r\n\r\n protected onAttachmentsLinkChange(newAttachments: NewAttachInfo[]): void {\r\n const newDecoratedAttachments: NewAttachInfo[] = newAttachments.map((attachment) => {\r\n attachment.iconClass = 'fa fa-link';\r\n attachment.iconTitle = this.translateService.instant('_Attachment_link');\r\n attachment.deleteButtonTitle = this.translateService.instant('_Delete_attachmentlink');\r\n return attachment;\r\n });\r\n const newCommentAttachments = this.newCommentAttachments.filter((attachment) => attachment?.type === 'Hyperlink');\r\n this.newCommentAttachments = [...newCommentAttachments, ...newDecoratedAttachments];\r\n this.newAttachmentIDs = newAttachments.map((attachment) => attachment.id);\r\n this.checkCreateButtonState();\r\n }\r\n\r\n\r\n protected onAddAttachment(file: File): void {\r\n const attachment = this.bimplusAttachmentsService.getAttachment(file);\r\n this.attachmentsState.update(attachments => ([...attachments, attachment]));\r\n this.checkCreateButtonState();\r\n }\r\n\r\n protected onDeleteAttachment(attachment: Attachment): void {\r\n this.attachmentsState.update(attachments => attachments.filter(a => a !== attachment));\r\n this.checkCreateButtonState();\r\n }\r\n\r\n /** Event on click attachment. */\r\n protected onGetAttachment(attachment: Attachment): void {\r\n this.bimplusObjectCommentsListService.downloadAttachment(attachment);\r\n }\r\n\r\n onTextareaValueChange(value: string) {\r\n this.textAreaValue = value;\r\n this.checkCreateButtonState();\r\n }\r\n\r\n handleActionCommentEvent(event: CommentOutputData) {\r\n if (event.action === 'delete') {\r\n const data = event.data as CommentData;\r\n this.openDialogDeleteComment(data.commentId);\r\n }\r\n }\r\n\r\n actionDialogClose(data: IDialogConfirmClose) {\r\n this.dialogService.close(data);\r\n }\r\n\r\n openDialogDeleteComment(commentId: string) {\r\n this.dialogService.open(BimplusOverlayDialogDeleteComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true,\r\n },\r\n data: {\r\n title: this.translateService.instant(\r\n '_Comment delete confirmation title'\r\n ),\r\n message: this.translateService.instant(\r\n '_Comment delete confirmation message'\r\n ),\r\n acceptCallback: () => {\r\n this.deleteComment(commentId);\r\n },\r\n },\r\n });\r\n }\r\n\r\n isSameDate(date?: string): boolean {\r\n if (!date) {\r\n return false;\r\n }\r\n const shortDate = this.datePipe.transform(date, 'shortDate');\r\n if (!shortDate) {\r\n // Transformation date to shortDate failed\r\n return false;\r\n }\r\n if (this.lastShownDate === shortDate) {\r\n // Date is identical to the last shown date\r\n return true;\r\n }\r\n // Valid date but not identical to last one\r\n this.lastShownDate = shortDate;\r\n return false;\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'submit') {\r\n if (!this.api || !this.rootObjectId) return;\r\n this.loading.set(true);\r\n\r\n const data = {\r\n text: this.textAreaValue,\r\n objectId: this.rootObjectId,\r\n };\r\n const dataText = JSON.stringify(data);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Creating new comment') });\r\n this.bimplusObjectCommentsListService.postComments(this.rootObjectId, dataText, this.getHyperlinks(this.rootObjectId), this.attachmentsState(), this.newAttachmentIDs)\r\n .pipe(switchMap(() => this.bimplusObjectCommentsListService.loadComments(this.rootObjectId)))\r\n .subscribe({\r\n next: (comments) => this.commentsList$.next(comments),\r\n complete: () => {\r\n this.attachmentsState.set([]);\r\n this.newCommentAttachments = [];\r\n this.attachmentLinkItems = [];\r\n this.newAttachmentIDs = [];\r\n this.textAreaValue = null;\r\n this.clearValue = true;\r\n this.buttonRowItems[0].disabled = true;\r\n this.loading.set(false);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\r\n }\r\n });\r\n }\r\n }\r\n\r\n hyperlinkButtonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'add-hyperlink') {\r\n this.addNewCommentHyperlink();\r\n } else if ($event.id === 'cancel-hyperlink') {\r\n this.hyperlinkForm.reset();\r\n this.isAddingHyperlink = false;\r\n }\r\n }\r\n\r\n addNewCommentHyperlink() {\r\n if (!this.hyperlinkForm.valid) {\r\n return;\r\n }\r\n\r\n let sanitizedUrl: string = this.hyperlinkForm.value['url'].trim();\r\n if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\r\n sanitizedUrl = 'https://' + sanitizedUrl;\r\n }\r\n let sanitizedName = this.hyperlinkForm.value['name']?.trim() ?? '';\r\n if (sanitizedName === '') {\r\n sanitizedName = sanitizedUrl;\r\n }\r\n const newItem: NewAttachInfo = {\r\n id: '',\r\n type: 'Hyperlink',\r\n nameShort: sanitizedName,\r\n name: sanitizedName,\r\n url: sanitizedUrl,\r\n iconClass: 'fa fa-link',\r\n iconTitle: this.translateService.instant('_Hyperlink'),\r\n deleteButtonTitle: this.translateService.instant('_Remove hyperlink'),\r\n };\r\n this.newCommentAttachments.push(newItem);\r\n this.hyperlinkForm.reset();\r\n this.isAddingHyperlink = false;\r\n this.checkCreateButtonState();\r\n }\r\n\r\n deleteComment(commentId: string) {\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Deleting the comment') });\r\n this.bimplusObjectCommentsListService.deleteComment(commentId)\r\n .subscribe(() => this.loadComments())\r\n }\r\n\r\n addHyperlinkIconClicked() {\r\n this.isAddingHyperlink = !this.isAddingHyperlink;\r\n }\r\n\r\n addHyperlinkIconKeypress(event: KeyboardEvent) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n this.addHyperlinkIconClicked();\r\n }\r\n }\r\n\r\n removeNewCommentAttachment(link: NewAttachInfo) {\r\n this.newCommentAttachments = this.newCommentAttachments.filter(\r\n (commentLink) => commentLink.id !== link.id\r\n );\r\n if (link?.type !== 'Hyperlink') {\r\n this.attachmentLinkItems = this.attachmentLinkItems.filter(\r\n (attachmentLink) => attachmentLink.id !== link.id\r\n );\r\n this.newAttachmentIDs = this.newAttachmentIDs.filter(id => id !== link.id)\r\n }\r\n this.checkCreateButtonState();\r\n }\r\n\r\n removeNewCommentAttachmentKeypress(\r\n event: KeyboardEvent,\r\n link: NewAttachInfo\r\n ) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n this.removeNewCommentAttachment(link);\r\n }\r\n }\r\n\r\n isActUserAuthor(item: WebSdk.CommentResponse) {\r\n return item.author?.id === this.userId;\r\n }\r\n\r\n displayName(item: WebSdk.CommentResponse): string {\r\n return item.author?.displayname ? item.author?.displayname : '';\r\n }\r\n\r\n formatDate(date: string): string {\r\n const locale = window.navigator.language;\r\n if (locale.includes('en')) {\r\n const unformattedDate = new Date(date);\r\n return unformattedDate.getMonth() + '/' + unformattedDate.getDate() + '/' + unformattedDate.getFullYear();\r\n }\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: \"short\" }).format(new Date(date));\r\n }\r\n\r\n clearTextareaValue() {\r\n return this.clearValue;\r\n }\r\n\r\n\r\n private loadComments() {\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Loading comments list') });\r\n this.loading.set(true);\r\n this.bimplusObjectCommentsListService\r\n .loadComments(this.rootObjectId)\r\n .subscribe({\r\n next: comments => {\r\n this.commentsList$.next(comments)\r\n },\r\n\r\n complete: () => {\r\n this.loading.set(false);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\r\n }\r\n })\r\n }\r\n\r\n private getHyperlinks(objectId: string): Partial<WebSdk.Hyperlink>[] {\r\n return this.newCommentAttachments\r\n .filter(h => h?.type === 'Hyperlink') // Filter objects with type 'Hyperlink'\r\n .map((h) => ({\r\n ...h,\r\n objectId,\r\n }));\r\n }\r\n\r\n onEnterKeyPressedInHyperlinkForm() {\r\n this.addNewCommentHyperlink();\r\n }\r\n}\r\n","@if (!loading()) {\r\n <div class=\"comment-tab-container\">\r\n <div class=\"textarea-container\">\r\n <lib-bimplus-textarea\r\n (textAreaValueChange)=\"onTextareaValueChange($event)\"\r\n [placeholder]=\"placeholder\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [activeAutoResizeTextarea]=\"true\"\r\n [minRows]=\"minRows\"\r\n [maxRows]=\"maxRows\"\r\n [clearValue]=\"clearTextareaValue()\"\r\n ></lib-bimplus-textarea>\r\n </div>\r\n\r\n <lib-bimplus-attachments\r\n #attachments\r\n listOnly\r\n [class]=\"['new-comment-attachments']\"\r\n [attachments]=\"attachmentsState()\"\r\n (addAttachment)=\"onAddAttachment($event)\"\r\n (deleteAttachment)=\"onDeleteAttachment($event)\"\r\n />\r\n\r\n <lib-links-to-documents\r\n #linksToDocuments\r\n listOnly\r\n hideAttachmentSize\r\n showEmptyMessage=\"false\"\r\n [attachments]=\"attachmentLinkItems\"\r\n (attachmentsLinkChange)=\"onAttachmentsLinkChange($event)\"\r\n [api]=\"api\"\r\n [project]=\"project\"\r\n [rootObjectId]=''\r\n [canCreateAttachmentLink]=\"true\"\r\n [canDeleteAttachmentLink]=\"true\"\r\n [wormholeSelector]=\"wormholeSelector\"\r\n [env]=\"env\"\r\n [inputBaseUrl]=\"inputBaseUrl\"\r\n />\r\n\r\n @if (newCommentAttachments.length > 0) {\r\n <div class=\"new-comment-attachment-list\">\r\n @for (item of newCommentAttachments; track item) {\r\n <div\r\n [ngClass]=\"'new-comment-attachment ' + item.type\"\r\n [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\r\n <div\r\n [ngClass]=\"'icon-small ' + item.type\"\r\n [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\r\n </div>\r\n <div class=\"text\">{{ item.name }} </div>\r\n <span class=\"cancel-icon\" title=\"{{ item.deleteButtonTitle}}\" (click)=\"removeNewCommentAttachment(item)\" (keydown)=\"removeNewCommentAttachmentKeypress($event, item)\"></span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (isAddingHyperlink) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"hyperlink-input-form\">\r\n <div class=\"hyperlink-input-row\">\r\n <div class=\"link-icon icon-next-to-text-input\"></div>\r\n <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\r\n </div>\r\n <div class=\"hyperlink-input-row\">\r\n <div class=\"icon-next-to-text-input\"></div>\r\n <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"hyperlinkButtonRowItems\" (buttonClicked)=\"hyperlinkButtonRowButtonClicked($event)\"/>\r\n </form>\r\n }\r\n\r\n <div class=\"comments-tab-attachments-section\">\r\n <div class=\"comments-attachments-list\">\r\n <div class=\"tab-attachments icon attachments-icon hidden\"></div>\r\n <div class=\"attachment-icon icon-small interactive\" [title]=\"'_Add attachment' | translate\" (click)=\"attachments.open()\" (keydown)=\"attachments.open()\"></div>\r\n <div class=\"link-icon icon-small interactive\" [title]=\"'_Add hyperlink' | translate\" (click)=\"addHyperlinkIconClicked()\" (keydown)=\"addHyperlinkIconKeypress($event)\"></div>\r\n <div class=\"attachment-link-icon icon-small interactive\" [title]=\"'_Add_attachment_link' | translate\" (click)=\"linksToDocuments.createAttachmentLink(api!)\" (keydown)=\"linksToDocuments.createAttachmentLink(api!)\"></div>\r\n <div class=\"tab-attachmentlinks icon attachments-icon hidden\"></div>\r\n </div>\r\n <div class=\"add-comment\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"comments-separator\"></div>\r\n\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @if ((commentsList$ | async)?.length === 0) {\r\n <div class=\"no-comments-found\">\r\n {{ '_No comments found' | translate }}\r\n </div>\r\n } @else {\r\n @for (item of commentsList$ | async; track item) {\r\n @if(item.createdAt && !isSameDate(item.createdAt)) {\r\n <div class=\"comment-list-date\">\r\n {{formatDate(item.createdAt)}}\r\n </div>\r\n }\r\n <lib-bimplus-comment\r\n (outputActionCommentEvent)=\"handleActionCommentEvent($event)\"\r\n (getAttachment)=\"onGetAttachment($event)\"\r\n [message]=\"item.text\"\r\n [api]=\"api\"\r\n [date]=\"item.createdAt ? item.createdAt : ''\"\r\n action=\"delete\"\r\n [commentId]=\"item.id\"\r\n [attachments]=\"item.attachments ?? []\"\r\n [attachmentLinkItems]=\"item.attachmentLinks ?? []\"\r\n [hyperlinks]=\"item.hyperlinks\"\r\n [isActUserAuthor]=\"isActUserAuthor(item)\"\r\n [displayname]=\"displayName(item)\">\r\n </lib-bimplus-comment>\r\n }\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n </div>\r\n }\r\n","import { Component, OnInit, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusStatusBarService } from './bimplus-status-bar.service';\r\nimport { StatusBarData } from './statusBar';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-status-bar',\r\n templateUrl: './bimplus-status-bar.component.html',\r\n styleUrls: ['./bimplus-status-bar.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusStatusBarComponent implements OnInit {\r\n private statusBarService = inject(BimplusStatusBarService);\r\n\r\n\r\n private _title = '';\r\n get title(): string {\r\n return this._title;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.statusBarService.statusBarDataSubscription.subscribe((data: StatusBarData) => {\r\n this._title = data.title;\r\n });\r\n }\r\n\r\n closeClick(): void {\r\n this.statusBarService.setStatusBarData({\r\n title: '',\r\n statusBarVisible: false\r\n });\r\n }\r\n\r\n closeKeyDown($event: KeyboardEvent) {\r\n if ($event.key === 'Enter' || $event.key === 'Escape') {\r\n this.closeClick();\r\n }\r\n }\r\n\r\n}\r\n","<div\r\n class=\"statusBar-container\">\r\n <span \r\n class=\"status-bar-text\"\r\n [innerHTML]=\"title\">\r\n </span>\r\n <div\r\n class=\"close-button\"\r\n title=\"Close\"\r\n (click)=\"closeClick()\"\r\n (keydown)=\"closeKeyDown($event)\">\r\n </div>\r\n</div>","import { MissingTranslationHandler, MissingTranslationHandlerParams } from '@ngx-translate/core';\r\n\r\nexport class BimplusMissingTranslationHandler implements MissingTranslationHandler {\r\n handle(params: MissingTranslationHandlerParams) {\r\n console.warn(\"Missing translation string \" + params.key);\r\n return params.key;\r\n }\r\n}\r\n"],"mappings":"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B,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,eAAe,CAAC,OAAO,IAAI;EAC3B,eAAe;EACf,cAAc;EACd,gBAAgB,CAAC,IAAI,EAAE;EACvB,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,kBAAkB;CAEb;AACT;AAqBA,SAAS,qBAAkB;CACzB,MAAM,QAA4B;EAEhC;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,WAAW;GACX,UAAU;GACV,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;GACjB,WAAW;GACX,UAAU;IAER;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MA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"}
1
+ {"version":3,"file":"ngx-bimplus-components.mjs","names":[],"sources":["../../../projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.service.ts","../../../projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.html","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.html","../../../projects/ngx-bimplus-components/src/lib/services/resize-observer.service.ts","../../../projects/ngx-bimplus-components/src/lib/services/local-storage.service.ts","../../../projects/ngx-bimplus-components/src/lib/services/layout-manager.service.ts","../../../projects/ngx-bimplus-components/src/lib/utils/utils.ts","../../../projects/ngx-bimplus-components/src/lib/directives/resizable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.html","../../../projects/ngx-bimplus-components/src/lib/directives/draggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.html","../../../projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/pxsuffix.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/directives/x-draggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/svg-generator.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.html","../../../projects/ngx-bimplus-components/src/lib/directives/click-outside/click-outside.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.interface.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/format-value.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/datetime.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.html","../../../projects/ngx-bimplus-components/src/lib/utils/filterString.ts","../../../projects/ngx-bimplus-components/src/lib/utils/filterStructureFetcher.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.html","../../../projects/ngx-bimplus-components/src/lib/services/cursors.service.ts","../../../projects/ngx-bimplus-components/src/lib/directives/component-draggable/componentsDraggable.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.html","../../../projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/round.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value-as-string.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/utils/objectProperties.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/validators/double.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/integer.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/guid.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/double-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.service.ts","../../../projects/ngx-bimplus-components/src/lib/validators/guid-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/string-enum.validator.ts","../../../projects/ngx-bimplus-components/src/lib/validators/string-combobox.validator.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.html","../../../projects/ngx-bimplus-components/src/lib/services/decorators.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.html","../../../projects/ngx-bimplus-components/src/lib/pipes/bit-converter.pipe.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.interface.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/services/bimplus-attachments.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/auto-resize-textarea.directive.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.service.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.html","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.ts","../../../projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.html","../../../projects/ngx-bimplus-components/src/lib/testing/bimplus-missing-translatetranslation-handler.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxBimplusComponentsService {\r\n\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\n selector: 'lib-ngx-bimplus-components',\n imports: [],\n template: `\r\n <p>\r\n ngx-bimplus-components works!\r\n </p>\r\n `,\n changeDetection: ChangeDetectionStrategy.Eager,\n styles: ``\n})\r\nexport class NgxBimplusComponentsComponent {\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\n\r\nexport class BimplusConnectionDesignerService {\r\n private _activeStep: number = 0;\r\n\r\n activeStepChange$: Subject<number> = new Subject<number>();\r\n\r\n set activeStep(activeStep: number) {\r\n this._activeStep = activeStep;\r\n this.activeStepChange$.next(this._activeStep);\r\n }\r\n\r\n get activeStep(): number {\r\n return this._activeStep;\r\n }\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input, booleanAttribute, computed, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\ntype SpinnerTexts = string[] | null | undefined;\r\ntype SpinnerText = string | null | undefined;\r\n\r\n@Component({\r\n selector: 'lib-loading-spinner',\r\n templateUrl: './loading-spinner.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './loading-spinner.component.less'\r\n})\r\nexport class LoadingSpinnerComponent {\r\n @Input({ transform: booleanAttribute }) spinnerSpinActive: boolean = false;\r\n @Input({ transform: booleanAttribute }) spinnerHoverEnabled: boolean = false;\r\n @Input({ transform: booleanAttribute }) spinnerDisabled: boolean = false;\r\n spinnerText = input<SpinnerText>(undefined);\r\n spinnerTexts = input<SpinnerTexts>(undefined);\r\n\r\n protected readonly isSpinnerTextsArray = computed(() => {\r\n const spinnerTexts = this.spinnerTexts();\r\n return !!(spinnerTexts && typeof spinnerTexts === 'object' && Array.isArray(spinnerTexts) && Boolean(spinnerTexts.length))\r\n });\r\n}\r\n","<div class=\"loading-spinner\">\r\n <div class=\"spinner-conatiner\">\r\n <div\r\n class=\"spinner-icon\"\r\n [class.spinner-spin-active]=\"spinnerSpinActive\"\r\n [class.spinner-disabled]=\"spinnerDisabled\"\r\n [class.hover-enabled]=\"spinnerHoverEnabled && !spinnerDisabled\"\r\n ></div>\r\n @if (spinnerText(); as spinnerText) {\r\n <div class=\"spinner-text\" data-test=\"spinner-text\">\r\n {{ spinnerText }}\r\n </div>\r\n }\r\n @if (isSpinnerTextsArray()) {\r\n <div class=\"spinner-texts\" data-test=\"spinner-texts\">\r\n @for (_spinnerText of spinnerTexts(); track _spinnerText) {\r\n <div class=\"spinner-text\">\r\n {{ _spinnerText }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>","import { Component, input, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-sidenav-drawer-content',\r\n imports: [\r\n LoadingSpinnerComponent\r\n ],\r\n templateUrl: './bimplus-sidenav-drawer-content.component.html',\r\n styleUrl: './bimplus-sidenav-drawer-content.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BimplusSidenavDrawerContentComponent {\r\n header = input<string>('');\r\n isLoading = input<boolean>(false);\r\n @Input() loadingSpinnerText: string = \"\"\r\n}\r\n","<div class=\"sidenav-drawer-content-layout\">\r\n @if (header(); as header) {\r\n <div class=\"sidenav-drawer-header\">\r\n <div class=\"sidenav-drawer-header-title\">\r\n <span>{{ header }}</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"sidenav-drawer-content-offset\">\r\n <ng-content></ng-content>\r\n </div>\r\n @if(isLoading()){\r\n <div class=\"sidenav-drawer-loading-overlay\">\r\n <lib-loading-spinner\r\n [spinnerHoverEnabled]=\"false\"\r\n [spinnerSpinActive]=\"true\"\r\n [spinnerDisabled]=\"false\"\r\n [spinnerText]=\"loadingSpinnerText\"\r\n >\r\n </lib-loading-spinner>\r\n </div>\r\n }\r\n</div>\r\n","import { Observable } from \"rxjs\";\r\n\r\nexport interface BimplusButtonRowItem {\r\n id: string;\r\n iconClass?: string;\r\n icon?: string;\r\n title?: string;\r\n tooltip?: string;\r\n disabled?: boolean | Observable<boolean>;\r\n buttonStyle?: 'primary' | 'secondary';\r\n buttonType?: 'text' | 'icon' | 'combined';\r\n type?: typeof BimplusButtonType['FILE' | 'TEXT'];\r\n}\r\n\r\nexport interface BimplusButtonClickEvent {\r\n id: string;\r\n}\r\n\r\nexport const BimplusButtonType = {\r\n FILE: 'file',\r\n TEXT: 'text'\r\n} as const;","import { Observable, take } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport {\r\n BimplusButtonRowItem,\r\n BimplusButtonClickEvent,\r\n BimplusButtonType,\r\n} from './bimplus-buttons-row.interface';\r\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ViewEncapsulation, EventEmitter, Output, Input, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-buttons-row',\r\n imports: [NgTemplateOutlet, AsyncPipe],\r\n templateUrl: './bimplus-buttons-row.component.html',\r\n styleUrl: './bimplus-buttons-row.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusButtonsRowComponent extends BimplusLocalizedWidgetComponent {\r\n protected readonly BimplusButtonType = BimplusButtonType;\r\n @Input () isMultiple = false;\r\n items = input<BimplusButtonRowItem[]>([]);\r\n canUpdateObject = input<boolean>(false);\r\n\r\n @Output() fileChanged = new EventEmitter<File[]>();\r\n @Output() buttonClicked = new EventEmitter<BimplusButtonClickEvent>();\r\n\r\n protected onChange(event: Event, inputElement: HTMLInputElement) {\r\n const files = (event.target as unknown as { files: File[] }).files; \r\n\r\n if (files) {\r\n this.fileChanged.emit(files);\r\n // reset value to be able select same value again\r\n inputElement.value = '';\r\n }\r\n }\r\n\r\n protected _buttonClicked(item: BimplusButtonRowItem) {\r\n if (item.disabled && this.isObservable(item.disabled)) {\r\n // evaluate observable once\r\n item.disabled.pipe(take(1)).subscribe((disabled) => {\r\n if (!disabled) {\r\n this.buttonClicked.emit({ id: item.id });\r\n }\r\n });\r\n return;\r\n }\r\n if (item.disabled) {\r\n return;\r\n }\r\n this.buttonClicked.emit({ id: item.id });\r\n }\r\n\r\n protected isObservable(value: Observable<boolean> | boolean): value is Observable<boolean> {\r\n return typeof value === 'object' && 'subscribe' in value;\r\n }\r\n}\r\n","<div class=\"button-row\">\r\n @for(item of items(); track item.id; let last=$last; let first=$first;) {\r\n @switch(item.type) {\r\n @case (BimplusButtonType.FILE) {\r\n <ng-container\r\n *ngTemplateOutlet=\"fileButton; context: { $implicit: item, last, first }\"\r\n ></ng-container>\r\n } @default {\r\n <ng-container\r\n *ngTemplateOutlet=\"button; context: { $implicit: item, last, first }\"\r\n ></ng-container>\r\n }\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #fileButton let-item let-last=\"last\" let-first=\"first\">\r\n <input\r\n #fileInput\r\n hidden\r\n type=\"file\"\r\n (change)=\"onChange($event, fileInput)\"\r\n [id]=\"item.id\"\r\n [attr.multiple]=\"isMultiple ? true : null\"\r\n />\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n button;\r\n context: { $implicit: item, last, first, fileInput }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template\r\n #button\r\n let-item\r\n let-last=\"last\"\r\n let-first=\"first\"\r\n let-fileInput=\"fileInput\"\r\n>\r\n <button\r\n data-test=\"button\"\r\n [class.last]=\"last\"\r\n [class.first]=\"first\"\r\n [class.primary-button]=\"\r\n item.buttonStyle === undefined || item.buttonStyle === 'primary'\r\n \"\r\n [class.secondary-button]=\"item.buttonStyle === 'secondary'\"\r\n [class.text-button]=\"\r\n item.buttonType === undefined || item.buttonType === 'text'\r\n \"\r\n [class.icon-button]=\"item.buttonType === 'icon'\"\r\n [class.combined-button]=\"item.buttonType === 'combined'\"\r\n [class.disabled]=\"item.disabled === true\"\r\n (click)=\"fileInput ? fileInput.click() : _buttonClicked(item)\"\r\n title=\"{{ item.tooltip }}\"\r\n [disabled]=\"isObservable(item.disabled) ? !!(item.disabled | async) : !!item.disabled\"\r\n >\r\n {{ item.title }}\r\n </button>\r\n</ng-template>\r\n","\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusConnectionDesignerService } from \"./bimplus-connection-designer.service\"\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport { DesignCode } from './bimplus-connection-designer.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-connection-designer',\r\n imports: [\r\n FormsModule,\r\n NgSelectModule,\r\n TranslateModule,\r\n BimplusSidenavDrawerContentComponent,\r\n BimplusButtonsRowComponent,\r\n BimplusSidenavDrawerContentComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-connection-designer.component.html',\r\n styleUrl: './bimplus-connection-designer.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusConnectionDesignerComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n protected connectionDesignerService = inject(BimplusConnectionDesignerService);\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n config: Array<BimplusButtonRowItem> = [];\r\n constructor() {\r\n super();\r\n\r\n const connectionDesignerService = this.connectionDesignerService;\r\n\r\n connectionDesignerService.activeStepChange$.subscribe((step) => {\r\n if (step === 0) {\r\n this.resetDesignCode();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.config.push({\r\n id: \"next\"\r\n , title: this.translateService.instant('_Next')\r\n , tooltip: this.translateService.instant('_Next')\r\n , disabled: true\r\n , buttonStyle: 'primary'\r\n });\r\n this.buttonRowItems = this.config;\r\n }\r\n\r\n // #region Design codes\r\n\r\n chooseCode: string = \"_Choose_a_design_code\"; // Message for drop down list\r\n\r\n // Design method codes defined in SDS2 (see WebSdk Connexis service for possible values)\r\n @Input() designCodes: Array<DesignCode> = [\r\n { id: \"0\", name: \"EN 1993-1-8 (Eurocode 3)\", code: \"EURO05\", codeNumber: 9 },\r\n { id: \"1\", name: \"AISC 360-22 (16th Ed.): LRFD\", code: \"LRFD16\", codeNumber: 19 },\r\n { id: \"2\", name: \"AISC 360-22 (16th Ed.): ASD\", code: \"ASD16\", codeNumber: 18 },\r\n { id: \"3\", name: \"CSA S16:19 (CISC 12th Ed.)\", code: \"CSA12\", codeNumber: 17 },\r\n ];\r\n @Input() currentDesignCode: DesignCode | null = null;\r\n\r\n @Output() designCodeChanged = new EventEmitter<DesignCode | null>();\r\n\r\n set activeDesignCode(value: DesignCode | null) {\r\n this.currentDesignCode = value;\r\n this.designCodeChanged.emit(this.currentDesignCode);\r\n }\r\n\r\n get activeDesignCode(): DesignCode | null {\r\n return this.currentDesignCode;\r\n }\r\n\r\n private _updateButtonState(buttonId: string, disabled: boolean) {\r\n const _button = this.config.find(btn => btn.id === buttonId);\r\n if (!_button) {\r\n return;\r\n }\r\n _button.disabled = disabled;\r\n }\r\n\r\n private _calculationCanBeStarted: boolean = true;\r\n @Input()\r\n set calculationCanBeStarted(value: boolean) {\r\n this._calculationCanBeStarted = value;\r\n this._updateButtonState(\"next\", !value);\r\n }\r\n get calculationCanBeStarted() {\r\n return this._calculationCanBeStarted;\r\n }\r\n\r\n @Output() startCalculationClicked = new EventEmitter<void>();\r\n\r\n buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"next\") {\r\n this.connectionDesignerService.activeStep = 1;\r\n if (this._calculationCanBeStarted) {\r\n this.startCalculationClicked.emit();\r\n }\r\n }\r\n }\r\n\r\n resetDesignCode() {\r\n this.activeDesignCode = null;\r\n }\r\n // #endregion\r\n}\r\n","<lib-bimplus-sidenav-drawer-content\r\n [header]=\"'_Connection_designer' | translate\"\r\n >\r\n <div class=\"connection-designer-content\">\r\n @if(connectionDesignerService.activeStep === 0) {\r\n <div class=\"cross-button\">\r\n <div class=\"cross\"\r\n (click)=\"resetDesignCode()\"\r\n (keypress)=\"resetDesignCode()\"\r\n >\r\n </div>\r\n </div>\r\n <div class=\"title\">\r\n {{ \"_Select_the_code\" | translate }}\r\n </div>\r\n <div class=\"description\">\r\n {{ \"_Activate_all_objects_to_make_a_connection\" | translate }}\r\n </div>\r\n <div class=\"note\">\r\n {{ \"_Activate_all_objects_note\" | translate }}\r\n </div>\r\n\r\n @if(designCodes.length > 0){\r\n <div class=\"design-codes\">\r\n <ng-select\r\n class=\"design-codes-dropdown\"\r\n [(ngModel)]=\"activeDesignCode\"\r\n [clearable]=\"false\"\r\n [searchable]=\"false\"\r\n [placeholder]=\"chooseCode | translate\"\r\n >\r\n @for (code of designCodes; track code) {\r\n <ng-option [value]=\"code\">{{\r\n code.name\r\n }}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n } @else {\r\n <div class=\"no-design-codes\">\r\n {{ \"_No_design_codes_defined\" | translate }}\r\n </div>\r\n }\r\n\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n ></lib-bimplus-buttons-row>\r\n\r\n } @else {\r\n <ng-content select=\"lib-bimplus-connection-designer-results\"></ng-content>\r\n }\r\n </div>\r\n</lib-bimplus-sidenav-drawer-content>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, model, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel',\r\n imports: [CommonModule],\r\n templateUrl: './expansion-panel.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './expansion-panel.component.less'\r\n})\r\nexport class ExpansionPanelComponent {\r\n // #region public fields\r\n expanded = model<boolean>(true);\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n toggleExpand(){\r\n this.expanded.update(value => !value);\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"expansion-panel\">\r\n <div class=\"expansion-panel-header-row\">\r\n <div \r\n class=\"expansion-panel-expander-icon\" \r\n data-test=\"expansion-panel\"\r\n [ngClass]=\"expanded() ? 'open' : 'closed'\" \r\n (click)=\"toggleExpand()\"\r\n (keypress)=\"toggleExpand()\"\r\n ></div>\r\n <div class=\"expansion-panel-header-content\">\r\n <ng-content select=\"lib-expansion-panel-header\"></ng-content>\r\n </div>\r\n </div>\r\n <div class=\"expansion-panel-content-container\" [ngClass]=\"expanded() ? '' : 'collapsed'\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n\r\n","import { Component, HostBinding, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel-header',\r\n imports: [],\r\n templateUrl: './expansion-panel-header.component.html',\r\n styleUrl: './expansion-panel-header.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ExpansionPanelHeaderComponent {\r\n @HostBinding('class.expansion-panel-header-container') centerMenuButtonClass: boolean = true;\r\n}\r\n"," <div class=\"expansion-panel-header-title\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div>\r\n <ng-content select=\"lib-expansion-panel-header-actions\"></ng-content>\r\n </div>","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-expansion-panel-header-actions',\r\n imports: [],\r\n templateUrl: './expansion-panel-header-actions.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './expansion-panel-header-actions.component.less'\r\n})\r\nexport class ExpansionPanelHeaderActionsComponent {\r\n\r\n}\r\n","<ng-content></ng-content>\r\n","import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-text-message',\r\n templateUrl: './bimplus-text-message.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-text-message.component.less'\r\n})\r\nexport class BimplusTextMessageComponent {\r\n message = input<string | undefined>(undefined);\r\n}\r\n","@if(message(); as message) {\r\n <div class=\"message\">\r\n {{ message }}\r\n </div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit, OnChanges, SimpleChanges, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport { ConnexisResultsRoot, ConnexisResultList, ConnexisResult } from './bimplus-connection-designer-results.interface';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\nimport { BimplusConnectionDesignerService } from \"../bimplus-connection-designer/bimplus-connection-designer.service\";\r\nimport { BimplusTextMessageComponent } from \"../bimplus-text-message/bimplus-text-message.component\";\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\n\r\n@Component({\r\n selector: 'lib-bimplus-connection-designer-results',\r\n imports: [\r\n TranslateModule,\r\n CommonModule,\r\n BimplusButtonsRowComponent,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n BimplusTextMessageComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-connection-designer-results.component.html',\r\n styleUrl: './bimplus-connection-designer-results.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusConnectionDesignerResultsComponent extends BimplusLocalizedWidgetComponent\r\n implements OnInit, OnChanges {\r\n protected connectionDesignerService = inject(BimplusConnectionDesignerService);\r\n\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n\r\n @Input() errorMessage: string = \"\";\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.buttonRowItems = [\r\n {\r\n id: \"done\"\r\n , title: this.translateService.instant('_Done')\r\n , tooltip: this.translateService.instant('_Done')\r\n , disabled: false\r\n , buttonStyle: 'primary'\r\n }\r\n ];\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const changedResults = changes['results']?.currentValue as ConnexisResultsRoot | null;\r\n if (changedResults === null) {\r\n this.connectionDesignerService.activeStep = 0;\r\n }\r\n }\r\n\r\n @Output() doneClicked = new EventEmitter<void>();\r\n\r\n buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"done\") {\r\n this.connectionDesignerService.activeStep = 0;\r\n this.doneClicked.emit();\r\n }\r\n }\r\n\r\n // #region Results\r\n @Input() resultTreeRootTitle: string = \"\"; // Tooltip root node of tree\r\n @Input() resultTreeRootName: string = \"\"; // Visible root node name of tree\r\n @Input() expandedTreeRoot: boolean = false; // Root tree is expanded\r\n @Input() expandedResultTrees: boolean = false; // failed and passed sub-tree expanded\r\n @Input() results: ConnexisResultsRoot | null = null; // Root for all result lists (failed, passed)\r\n @Output() toggleVisibilityResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() toggleVisibilityResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() toggleVisibilityResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() clickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() clickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() clickedResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() doubleClickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\r\n @Output() doubleClickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\r\n @Output() doubleClickedResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() mouseEnteredResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n @Output() mouseLeftResult = new EventEmitter<ConnexisResult>(); // children nodes\r\n\r\n totalResults(): number {\r\n let totalCount = 0;\r\n if (!this.results) return totalCount;\r\n for (const resultList of this.results.resultList) {\r\n totalCount += resultList.results.length;\r\n }\r\n return totalCount\r\n }\r\n private statusMessage(result: ConnexisResult): string {\r\n let message = \"\\n\";\r\n message += result.isValid ? \"PASSED : \" : \"FAILED : \";\r\n message += \"Unity Ratio \" + result.unityRatio;\r\n return message;\r\n }\r\n private infoMessage(result: ConnexisResult): string {\r\n if (!result.message) {\r\n return \"\";\r\n }\r\n\r\n let message = \"\\n\";\r\n message += \"Message: \";\r\n message += result.message;\r\n return message;\r\n }\r\n\r\n getTitle(result: ConnexisResult): string {\r\n return `${result.name}${this.statusMessage(result)}${this.infoMessage(result)}`;\r\n }\r\n // #endregion\r\n}\r\n","<div class=\"connection-designer-content-result\">\r\n <div class=\"title\">\r\n {{ \"_Connection_Designer_results_title\" | translate }}\r\n </div>\r\n <div class=\"description\">\r\n {{ \"_Connection_Designer_results_description\" | translate }}\r\n </div>\r\n\r\n @if(results !== null){\r\n <lib-bimplus-scrollable-container>\r\n <div class=\"scrollable-content-container\">\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedTreeRoot\"\r\n >\r\n <lib-expansion-panel-header\r\n [title]=\"resultTreeRootTitle ? resultTreeRootTitle : results.name + ' (' + totalResults() + ')'\"\r\n (click)=\"clickedResultsRoot.emit(results)\"\r\n (keypress)=\"clickedResultsRoot.emit(results)\"\r\n (dblclick)=\"doubleClickedResultsRoot.emit(results)\"\r\n >\r\n <span class=\"project-navigator-root-node\">\r\n {{ results.name }} ({{ totalResults() }})\r\n </span>\r\n\r\n <lib-expansion-panel-header-actions>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_results'\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: results.isVisible,\r\n invisible: !results.isVisible,\r\n semivisible: results.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResultsRoot.emit(results)\"\r\n ></div> -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Show all result lists as expansion panels -->\r\n <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\r\n @for (resultList of results.resultList; track resultList) {\r\n <div>\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedResultTrees\"\r\n >\r\n <lib-expansion-panel-header>\r\n <span\r\n class=\"project-navigator-model-node\"\r\n [ngClass]=\"{\r\n visible: resultList.isVisible\r\n }\"\r\n [style.color]=\"resultList.colorHexCode\"\r\n [title]=\"resultList.name + ' (' + resultList.results.length + ')'\"\r\n (click)=\"clickedResultList.emit(resultList)\"\r\n (keypress)=\"clickedResultList.emit(resultList)\"\r\n (dblclick)=\"doubleClickedResultList.emit(resultList)\"\r\n >\r\n {{ resultList.name }} ({{ resultList.results.length }})\r\n </span>\r\n <lib-expansion-panel-header-actions>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_resultlist_' + resultList.id\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: resultList.isVisible,\r\n invisible: !resultList.isVisible,\r\n semivisible: resultList.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResultList.emit(resultList)\"\r\n ></div> -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n <!-- Content of panel -->\r\n @for (result of resultList.results; track result) {\r\n <div\r\n class=\"project-navigator-layer-node\"\r\n >\r\n <div\r\n class=\"project-navigator-layer-node-name\"\r\n [class.selected-node]=\"result.isSelected\"\r\n [attr.data-test]=\"'result' + result.id\"\r\n [ngClass]=\"{\r\n visible: result.isVisible\r\n }\"\r\n [title]=\"getTitle(result)\"\r\n (click)=\"clickedResult.emit(result)\"\r\n (keypress)=\"clickedResult.emit(result)\"\r\n (dblclick)=\"doubleClickedResult.emit(result)\"\r\n (mouseenter)=\"mouseEnteredResult.emit(result)\"\r\n (mouseleave)=\"mouseLeftResult.emit(result)\"\r\n >\r\n {{ result.name }}\r\n </div>\r\n <!-- toggle buttons should be removed for now see ALBP-24057 -->\r\n <!-- <div\r\n [attr.data-test]=\"'toggle_visibility_result_' + result.id\"\r\n class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: result.isVisible,\r\n invisible: !result.isVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityResult.emit(result)\"\r\n ></div> -->\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n</div>\r\n</lib-bimplus-scrollable-container>\r\n\r\n} @else {\r\n @if (errorMessage) {\r\n <lib-bimplus-text-message\r\n class=\"error-message\"\r\n [message]=\"errorMessage\"\r\n >\r\n </lib-bimplus-text-message>\r\n }\r\n}\r\n\r\n<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n >\r\n</lib-bimplus-buttons-row>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ResizeObserverService {\r\n\r\n private rectSize$: BehaviorSubject<DOMRect |undefined > = new BehaviorSubject<DOMRect|undefined>(undefined);\r\n private internalRectSize :DOMRect = new DOMRect(1,1,1,1);\r\n // Observable that components can subscribe to\r\n public parentAppRect$: Observable<DOMRect | undefined> = this.rectSize$.asObservable();\r\n\r\n constructor() { }\r\n\r\n public setSize(newValue: DOMRect): void {\r\n this.rectSize$.next(newValue); \r\n this.internalRectSize = newValue; \r\n }\r\n\r\n public getParentAppRect ():DOMRect{\r\n if( this.internalRectSize.width<=1 || this.internalRectSize?.height<=1 ) { // not set up with real data yet\r\n const parentView:HTMLElement|null = document.querySelector('.mainView');\r\n if(!parentView){\r\n return this.internalRectSize;\r\n }\r\n return parentView.getBoundingClientRect();\r\n }\r\n return this.internalRectSize;\r\n } \r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalStorageService {\r\n\r\n private storageSubject = new BehaviorSubject<{ key: string, value: unknown } | null>(null);\r\n\r\n constructor() { }\r\n\r\n // Set a string value in localStorage\r\n setItem(key: string, value: string): void {\r\n try {\r\n localStorage.setItem(key, value);\r\n this.storageSubject.next({ key, value });\r\n } catch (e) {\r\n console.error('Error saving to localStorage', e);\r\n }\r\n }\r\n\r\n // Get a string value from localStorage\r\n getItem(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch (e) {\r\n console.error('Error reading from localStorage', e);\r\n return null;\r\n }\r\n }\r\n\r\n // Remove an item from localStorage\r\n removeItem(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n this.storageSubject.next({ key, value: null });\r\n } catch (e) {\r\n console.error('Error removing from localStorage', e);\r\n }\r\n }\r\n\r\n // Clear all items in localStorage\r\n clear(): void {\r\n try {\r\n localStorage.clear();\r\n this.storageSubject.next(null);\r\n } catch (e) {\r\n console.error('Error clearing localStorage', e);\r\n }\r\n }\r\n\r\n // Set an object in localStorage\r\n setObject(key: string, value: unknown): void {\r\n this.setItem(key, JSON.stringify(value));\r\n }\r\n\r\n // Get an object from localStorage\r\n getObject(key: string): unknown {\r\n const value = this.getItem(key);\r\n return value ? JSON.parse(value) : null;\r\n }\r\n\r\n // Watch for changes in localStorage\r\n watchStorage(): Observable<{ key: string, value: unknown } | null> {\r\n return this.storageSubject.asObservable();\r\n }\r\n}\r\n","import { ElementRef, Injectable, inject } from '@angular/core';\r\nimport { ResizeObserverService } from './resize-observer.service';\r\nimport { LocalStorageService } from './local-storage.service';\r\nimport { BehaviorSubject } from 'rxjs';\r\n//import { ItemsList } from '@ng-select/ng-select/lib/items-list';\r\n//import { NotFoundError } from 'rxjs';\r\n\r\n\r\nexport interface LayoutManagerItem {\r\n element:ElementRef;\r\n id: string;\r\n selector?:string;\r\n isCollapsed:boolean;\r\n rememberPosition?:boolean\r\n left?: number;\r\n top?:number;\r\n width?:number;\r\n height?:number;\r\n}\r\n\r\nexport interface LayoutManagerConfigItem {\r\n id: string;\r\n isCollapsed:boolean; \r\n left?: number;\r\n top?:number; \r\n width?:number;\r\n height?:number;\r\n}\r\n\r\n\r\ninterface LayoutManagerConfig {\r\n [key:string]: LayoutManagerConfigItem\r\n}\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LayoutManagerService {\r\n private resizeObserverService = inject(ResizeObserverService);\r\n private localStorageService = inject(LocalStorageService);\r\n\r\n\r\n registeredItems$: BehaviorSubject<LayoutManagerItem[]> = new BehaviorSubject<LayoutManagerItem[]>([])\r\n private registeredItems:LayoutManagerItem[] = [];\r\n \r\n get RegisteredItems(): LayoutManagerItem[] {\r\n return this.registeredItems;\r\n }\r\n CONFIG:string = 'layoutManagerConfig';\r\n\r\n \r\n/**--------------------------------------------------------------------------\r\n * register object. object must have unique id or elementId\r\n --------------------------------------------------------------------------*/\r\n registerObject(obj:ElementRef, id:string, selector:string | undefined, rememberPosition:boolean,left:number = 100, top:number = 100,width:number = 0, height:number = 0) {\r\n let foundIndex = -1;\r\n if(this.registeredItems.some((item,index) => {\r\n const retval = item.id === id;\r\n if(retval){\r\n foundIndex = index;\r\n }\r\n return retval;\r\n })){\r\n if(foundIndex >= 0){\r\n this.registeredItems.splice(foundIndex,1);\r\n } \r\n }\r\n const newItem: LayoutManagerItem = { \r\n element:obj,\r\n id:id,\r\n selector:selector,\r\n rememberPosition:!!rememberPosition,\r\n left:left,\r\n top:top,\r\n width:width,\r\n height:height,\r\n isCollapsed: false \r\n };\r\n\r\n this.registeredItems.push(newItem);\r\n this.registeredItems$.next(this.registeredItems);\r\n this._initObject(newItem);\r\n }\r\n \r\n _initObject(obj:LayoutManagerItem){\r\n this._adjustObjectByConfig(obj);\r\n this._adjustObjectByWindowSize(obj);\r\n \r\n }\r\n /**--------------------------------------------------------------------------\r\n * get object configuration\r\n * return {left, top, width, heigth}\r\n --------------------------------------------------------------------------*/\r\n _getObjectConfig(obj:LayoutManagerItem):LayoutManagerConfigItem|null {\r\n if(!obj){\r\n return null;\r\n }\r\n const configValue = this.localStorageService.getItem(this.CONFIG);\r\n const config = configValue ? JSON.parse(configValue) : {};\r\n const objId = obj.id ;\r\n let configObj = config[objId];\r\n if(!configObj) {\r\n configObj = {id:objId,left:obj.left,top:obj.top,width:obj.width,height:obj.height}; \r\n }\r\n return configObj;\r\n }\r\n\r\n _adjustObjectByConfig(obj:LayoutManagerItem){\r\n const config:LayoutManagerConfigItem|null = this._getObjectConfig(obj);\r\n if(!config){\r\n return; \r\n }\r\n const parentElement = this._getDomParentElement(obj);\r\n const internalElement = this._getDomInternalElement(obj,'');\r\n if(!parentElement || !internalElement){\r\n return;\r\n }\r\n parentElement.style.left = (config.left) + 'px';\r\n parentElement.style.top = (config.top) + 'px';\r\n if(config.width && config.width > 0){\r\n internalElement.style.width = config.width + 'px';\r\n }\r\n if(config.height && config.height > 0){\r\n internalElement.style.height = config.height + 'px';\r\n }\r\n \r\n this.checkPosition(obj.id,\"\",undefined,0,0,true); \r\n }\r\n\r\n _adjustObjectByWindowSize(obj:LayoutManagerItem){\r\n this.checkPosition(obj.id,\"\",undefined,0,0,true); \r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * returns object registered in the layout manager \r\n --------------------------------------------------------------------------*/\r\n getItem(id: string ):LayoutManagerItem|null { \r\n let foundItem:LayoutManagerItem|null = null;\r\n this.registeredItems.forEach(item =>{\r\n if(item.id === id){\r\n foundItem = item;\r\n }\r\n });\r\n return foundItem;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * set object configuration\r\n --------------------------------------------------------------------------*/\r\n _setObjectConfig(obj:LayoutManagerItem, left:number,top:number,width:number,height:number) {\r\n const objId = obj?.id ;\r\n if (!objId) {\r\n return;\r\n }\r\n let config = this.localStorageService.getObject(this.CONFIG) as LayoutManagerConfig;\r\n //let config = configValue && JSON.parse(configValue) as LayoutManagerConfig;\r\n if (!config) {\r\n config = {};\r\n }\r\n if(obj?.isCollapsed){ // do not overtake collapsed size\r\n if (!config[objId]) { \r\n config[objId] = obj;\r\n }\r\n config[objId].left = left;\r\n config[objId].top = top;\r\n //config[objId].width = width;\r\n //config[objId].height = height ;\r\n this.localStorageService.setObject(this.CONFIG, config);\r\n return;\r\n }\r\n\r\n const newItem :LayoutManagerConfigItem = {\r\n id: objId,\r\n isCollapsed: false,\r\n left: left,\r\n top: top,\r\n width: width,\r\n height: height\r\n };\r\n config[objId] = newItem;\r\n this.localStorageService.setObject(this.CONFIG,config);\r\n }\r\n \r\n getDomParentElement(id:string ):HTMLElement|null {\r\n const item:LayoutManagerItem|null = this.getItem(id);\r\n if(item){\r\n return this._getDomParentElement(item);\r\n }\r\n return null;\r\n }\r\n\r\n _getDomParentElement(item:LayoutManagerItem ):HTMLElement|null {\r\n let element:HTMLElement;\r\n if(item.element?.nativeElement?.shadowRoot){\r\n element = item.element?.nativeElement?.shadowRoot.querySelector(item.selector);\r\n } else {\r\n element = item.element?.nativeElement; \r\n }\r\n if(!element){\r\n console.error('_getDomParentElement: missing element');\r\n return null;\r\n }\r\n return element; \r\n }\r\n\r\n _getDomInternalElement(item:LayoutManagerItem,selector:string | undefined ):HTMLElement|null {\r\n const element:HTMLElement = item.element?.nativeElement?.shadowRoot || item.element?.nativeElement; \r\n if(!element){\r\n console.error('_getDomInternalElement: missing element');\r\n return null;\r\n }\r\n const mySelector =selector && selector?.length > 0 ?selector:item.selector; \r\n const retval: HTMLElement|null= mySelector?element.querySelector(mySelector):element;\r\n if(!retval){\r\n console.error(`_getDomInternalElement: selection of element ${element} failed with selector ${mySelector}`);\r\n }\r\n return retval;\r\n }\r\n\r\n\r\n _getElementRect(item:LayoutManagerItem,selector:string | undefined ,parentRectangle:DOMRect |undefined ):DOMRect | null{\r\n const selectedObj : HTMLElement|null = this._getDomInternalElement(item,selector);\r\n if(!selectedObj){\r\n console.error('_getElementRect: missing selected object');\r\n return null;\r\n }\r\n\r\n const parentRect:DOMRect = parentRectangle || this.resizeObserverService.getParentAppRect();\r\n if( !parentRect || parentRect?.width<=1 || parentRect?.height<=1 ) {\r\n console.log('_getElementRect: missing parent rect');\r\n }\r\n const elementRect:DOMRect|null = selectedObj.getBoundingClientRect();\r\n if(!elementRect){\r\n console.error('_getElementRect: missing bounding rect');\r\n }\r\n return elementRect;\r\n }\r\n\r\n // checks whether element or element with additional selection of subelement is placed within the give rectangle\r\n // if not then calculates the offset to be moved to fit in\r\n checkPosition(id:string,selector:string,parentRectangle:DOMRect|undefined ,deltaX:number,deltaY:number,forceCheck:boolean = false){\r\n if(!id){\r\n return {deltaX:0,deltaY:0};\r\n }\r\n const e1 = this.getItem(id);\r\n if(!e1){\r\n return {deltaX:0,deltaY:0};\r\n }\r\n const parentRect:DOMRect = parentRectangle || this.resizeObserverService.getParentAppRect();\r\n const elementRect:DOMRect | null = this._getElementRect(e1,selector,parentRect);\r\n if(!elementRect){\r\n console.error('checkPosition: missing elementRect');\r\n return {deltaX:0,deltaY:0};\r\n }\r\n \r\n if(!elementRect?.width || !elementRect?.height){\r\n console.error('checkPosition:element rect empty ');\r\n return {deltaX:0,deltaY:0};\r\n } \r\n \r\n let checkAll = true;\r\n if(parentRect?.width < 2 || parentRect?.height < 2){ // empty parent rect , (after init before first usefull info) nothing to check \r\n checkAll = false; \r\n } \r\n if(checkAll){\r\n let checkBoundaries = true;\r\n if(this._isInsideRect(elementRect, parentRect) === false && !forceCheck) {\r\n checkBoundaries = false;\r\n }\r\n \r\n // copy of real element rectangle to perform calculation over before set to the real element\r\n const elementDOMRect = DOMRect.fromRect(elementRect);\r\n\r\n //set the element rectangle by deltas\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n\r\n if(checkBoundaries) {\r\n if(this._isInsideRect(elementDOMRect, parentRect) === false) {\r\n const newElementPos = this.getAlignedPosition(elementDOMRect, parentRect);\r\n deltaX = newElementPos.x - elementRect.x;\r\n deltaY = newElementPos.y - elementRect.y;\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n }\r\n } else {\r\n if (this._isInsideLeftTopRect(parentRect, elementDOMRect) === false) {\r\n const newElementPos = this._getAlignedLeftTopPosition(elementDOMRect, parentRect);\r\n deltaX = newElementPos.x - elementRect.x;\r\n deltaY = newElementPos.y - elementRect.y;\r\n this._translateRectangle(elementDOMRect, deltaX, deltaY);\r\n }\r\n }\r\n }\r\n\r\n const selectedElement = this._getDomParentElement(e1);\r\n if(!selectedElement){\r\n return;\r\n }\r\n const computedStyle = window.getComputedStyle(selectedElement);\r\n const top = parseInt(computedStyle.top, 10);\r\n const left = parseInt(computedStyle.left, 10);\r\n selectedElement.style.top = (top + deltaY) + 'px';\r\n selectedElement.style.left = (left + deltaX) + 'px';\r\n return {deltaX,deltaY};\r\n }\r\n /**--------------------------------------------------------------------------\r\n * find if rectangle 1 is inside rectangle 2\r\n --------------------------------------------------------------------------*/\r\n _isInsideRect(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return false;\r\n }\r\n return r2.left <= r1.left && r2.top <= r1.top && r2.right >= r1.right && r2.bottom >= r1.bottom;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * find if rectangles do not overlap the left and top sides\r\n --------------------------------------------------------------------------*/\r\n _isInsideLeftTopRect(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return false;\r\n }\r\n const r1Inside = r2.left <= r1.left && r2.top <= r1.top;\r\n const r2Inside = r1.left <= r2.left && r1.top <= r2.top;\r\n return r1Inside || r2Inside;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * get position of r1 aligned with the r2 sides\r\n --------------------------------------------------------------------------*/\r\n getAlignedPosition(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return {x:0,y:0};\r\n }\r\n const to = { x: r1.x, y: r1.y };\r\n //align left or right sides. preferably left\r\n if(r1.left < r2.left) {\r\n to.x = r2.x;\r\n } else if(r1.right > r2.right) {\r\n to.x = r2.right - r1.width;\r\n }\r\n //align top or bottom. preferably top\r\n if(r1.top < r2.top) {\r\n to.y = r2.y;\r\n } else if(r1.bottom > r2.bottom) {\r\n to.y = r2.bottom - r1.height;\r\n }\r\n return to;\r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * get position of r1 aligned with the r2 left, top sides\r\n --------------------------------------------------------------------------*/\r\n _getAlignedLeftTopPosition(r1:DOMRect, r2:DOMRect) {\r\n if(!r1 || !r2) {\r\n return {x:0,y:0};\r\n }\r\n\r\n const to = { x: r1.x, y: r1.y };\r\n //align left\r\n if(r1.left < r2.left) {\r\n to.x = r2.x;\r\n }\r\n //align top\r\n if(r1.top < r2.top) {\r\n to.y = r2.y;\r\n }\r\n return to;\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * translate rectangle by x, y\r\n --------------------------------------------------------------------------*/\r\n _translateRectangle(rect:DOMRect, translateX:number, translateY:number) {\r\n if(!rect) {\r\n return;\r\n }\r\n rect.x += translateX;\r\n rect.y += translateY;\r\n return rect;\r\n }\r\n \r\n updateCollapsed(value:boolean, id:string = ''):void{ \r\n const foundItem = this.getItem(id);\r\n if(!foundItem){\r\n return;\r\n }\r\n foundItem.isCollapsed = value;\r\n this.registeredItems$.next(this.registeredItems);\r\n setTimeout(()=>{ \r\n this.checkPosition(foundItem.id,\"\",undefined,0,0,true); \r\n });\r\n } \r\n\r\n\r\n handleDragEnd(id:string){//},left:number,top:number){\r\n this.finalizeObjectChanges(id);\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * finalize object changes (position). object must be registered in the layout manager\r\n * object: object to finalize \r\n --------------------------------------------------------------------------*/\r\n finalizeObjectChanges(id:string):void {\r\n const item:LayoutManagerItem|null = this.getItem(id);\r\n if(!item){\r\n return;\r\n }\r\n const element = this._getDomParentElement(item);\r\n if(!element){\r\n return;\r\n }\r\n const computedStyle = window.getComputedStyle(element); \r\n const top = parseInt(computedStyle.top, 10);\r\n const left = parseInt(computedStyle.left, 10);\r\n \r\n const elementRect = this._getElementRect(item,undefined,undefined);\r\n this._setObjectConfig(item,left,top,\r\n elementRect && elementRect.width > 0 ? elementRect.width:0 ,\r\n elementRect && elementRect.height > 0 ? elementRect.height:0);\r\n }\r\n}\r\n\r\n","// Define the type of the window.BimPlus object\r\nexport interface BimPlusObject {\r\n [key: string]: (dataDetail: { detail: unknown }) => void;\r\n}\r\nexport interface Source {\r\n [key: string]: { emit: (arg0: unknown) => void; };\r\n}\r\n\r\n\r\n/**--------------------------------------------------------------------------\r\n* fire event from component in two ways : \r\n - fire custom event from component in standard recommended way via. this.eventName.emit function\r\n \r\n - call window.BimPlus.eventName function directly on window object (eventName is name\r\n of the event we want to fire e.g. bimplusNavbarClicked so it will be window.BimPlus.bimplusNavbarClicked).\r\n Function must be defined in app. where we are using our components.\r\n This was implemented because MS Edge browser has problems with custom events and in some \r\n situations(e.g. after file download) it stops handling custom events.\r\n Disadvantage is that we can have only one event handler which is shared between the multiple components.\r\n--------------------------------------------------------------------------*/\r\nexport function fireEvent(source: unknown, eventName: string, data: unknown = null){\r\n if ( !eventName ) {\r\n console.error(\"ERROR: Missing event name in fireEvent function in Bimplus components!\");\r\n return;\r\n }\r\n // Check if eventName exists on window.BimPlus and if it's a function\r\n const bimPlus = ('BimPlus' in window) && typeof window.BimPlus === 'object' && (window.BimPlus as BimPlusObject);\r\n if (bimPlus && typeof bimPlus[eventName] === 'function') {\r\n bimPlus[eventName]({detail: data});\r\n }\r\n\r\n const _source = (source as Source);\r\n if (eventName in _source) {\r\n _source[eventName].emit(data);\r\n }\r\n}","import { Directive, ElementRef, Output, EventEmitter, OnInit, OnDestroy, inject } from '@angular/core';\r\nimport { LayoutManagerService } from '../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../services/resize-observer.service';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\ninterface ResizerItem {\r\n 'className' : string ,\r\n 'resizeStrategy' : string \r\n}\r\n\r\nexport interface ResizableElement extends HTMLElement{\r\n resizeStrategy?: string;\r\n}\r\n\r\n@Directive({\r\n selector: '[libResizable]',\r\n standalone: true\r\n})\r\n\r\nexport class ResizableDirective implements OnDestroy, OnInit{\r\n private elementRef = inject(ElementRef);\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n\r\n resizeContactPointX = 0;\r\n resizeContactPointY = 0;\r\n resizableElements:ResizableElement[] = [];\r\n resizeEnabled = true;\r\n resizeStarted = false;\r\n resizeStart : (event: MouseEvent | TouchEvent) => void;\r\n resizeInProgress: (event: MouseEvent | TouchEvent) => void; \r\n boundResizeStart: (event: MouseEvent | TouchEvent) => void;\r\n boundResizeInProgress: (event: MouseEvent | TouchEvent) => void;\r\n boundResizeEnd: (event: MouseEvent | TouchEvent) => void;\r\n \r\n _element:HTMLElement; \r\n actResizeStrategy = \"se\";\r\n \r\n\r\n @Output()\r\n resizedEnd = new EventEmitter<MouseEvent>();\r\n\r\n\r\n // list of resizers, resizers are specified by class name\r\n resizersList:ResizerItem[] = [ \r\n { className : \"resizer-nw\" , resizeStrategy : \"nw\" },\r\n { className : \"resizer-n\" , resizeStrategy: \"n\" },\r\n { className : \"resizer-ne\" , resizeStrategy: \"ne\" },\r\n { className : \"resizer-e\" , resizeStrategy: \"e\" },\r\n { className : \"resizer-se\" , resizeStrategy: \"se\" },\r\n { className : \"resizer-s\" , resizeStrategy: \"s\" },\r\n { className : \"resizer-sw\" , resizeStrategy: \"sw\" },\r\n { className : \"resizer-w\" , resizeStrategy: \"w\" }\r\n ];\r\n \r\n constructor() {\r\n const elementRef = this.elementRef;\r\n const layoutManagerService = this.layoutManagerService;\r\n \r\n \r\n this._element = elementRef.nativeElement;\r\n this.layoutManagerService = layoutManagerService;\r\n \r\n this.resizeStart = (event:MouseEvent|TouchEvent) => {\r\n //get mouse/finger X Y positions\r\n event.stopPropagation();\r\n if(this.resizeStarted){\r\n return;\r\n }\r\n this.resizeStarted = true;\r\n const touchList = (event as TouchEvent).targetTouches? (event as TouchEvent).targetTouches: [];\r\n const clientX = event.type === 'touchstart' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\r\n const clientY = event.type === 'touchstart' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\r\n this.resizeContactPointX = clientX;\r\n this.resizeContactPointY = clientY;\r\n this.openDocumentListenersResize(); \r\n this.setupResizeStrategy(event);\r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * calcuates and sets the new position\r\n --------------------------------------------------------------------------*/\r\n this.resizeInProgress = (event:MouseEvent|TouchEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n //get mouse/finger X Y positions\r\n const touchList = (event as TouchEvent).targetTouches ? (event as TouchEvent).targetTouches: [];\r\n const clientX = event.type === 'touchmove' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\r\n const clientY = event.type === 'touchmove' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\r\n //const clientX = (event as MouseEvent).clientX;\r\n //const clientY = (event as MouseEvent).clientY;\r\n\r\n const moved = this.resizeFromTo(this._element,this.resizeContactPointX, this.resizeContactPointY,clientX,clientY, this.actResizeStrategy);\r\n if(moved) {\r\n this.resizeContactPointX = clientX;\r\n this.resizeContactPointY = clientY;\r\n }\r\n }\r\n this.boundResizeStart = this.resizeStart.bind(this);\r\n this.boundResizeInProgress = this.resizeInProgress.bind(this);\r\n this.boundResizeEnd = this.resizeEnd.bind(this);\r\n this.resizeInProgress.bind(this);\r\n this.setResizers(this._element); \r\n }\r\n ngOnInit(): void {\r\n this.boundResizeStart = this.resizeStart.bind(this);\r\n this.boundResizeInProgress = this.resizeInProgress.bind(this);\r\n this.boundResizeEnd = this.resizeEnd.bind(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeAllListenersResize(); \r\n }\r\n\r\n resizeEnd(){ \r\n //this.closeDocumentListenersResize();\r\n if(!this.resizeStarted){\r\n return;\r\n } \r\n this.resizeStarted = false;\r\n this.closeAllListenersResize(); \r\n this.openElementListenersResize();\r\n fireEvent(this, \"resizedEnd\", ['$event']); \r\n }\r\n \r\n // Unused function at the moment\r\n // _getViewRect() {\r\n // const view = document.getElementById('#containerView'); // we should get here the parent object selector as input parameter\r\n // if(view){\r\n // return view.getBoundingClientRect();\r\n // }\r\n // return new DOMRect(0,0,0,0);\r\n // }\r\n\r\n/**--------------------------------------------------------------------------\r\n * find if rectangle 1 is inside rectangle 2\r\n --------------------------------------------------------------------------*/\r\n isInsideRect(rect1:DOMRect, rect2:DOMRect) {\r\n if(!rect1 || !rect2) {\r\n return false;\r\n }\r\n const rect1Inside:boolean = rect2.left <= rect1.left\r\n && rect2.top <= rect1.top \r\n && rect2.right >= rect1.right \r\n && rect2.bottom >= rect1.bottom;\r\n\r\n return rect1Inside;\r\n }\r\n /**--------------------------------------------------------------------------\r\n * resize rectangle by x, y\r\n --------------------------------------------------------------------------*/\r\n _resizeRectangle(rect:DOMRect, resizeX:number, resizeY:number, resizeStrategy:string) {\r\n if(!rect) {\r\n return;\r\n }\r\n\r\n if(['nw','w', 'sw'].includes(resizeStrategy)) {\r\n rect.x += resizeX;\r\n resizeX = resizeX * -1;\r\n }\r\n\r\n if(['nw','n', 'ne'].includes(resizeStrategy)) {\r\n rect.y += resizeY;\r\n resizeY = resizeY * -1;\r\n }\r\n\r\n if(typeof(resizeX) === 'number' && !['n','s'].includes(resizeStrategy)) {\r\n rect.width += resizeX;\r\n }\r\n\r\n if(typeof(resizeY) === 'number' && !['w','e'].includes(resizeStrategy)) {\r\n rect.height += resizeY;\r\n }\r\n\r\n return rect;\r\n }\r\n\r\n _maxHeightReset(obj:HTMLElement, elementRect:DOMRect) { \r\n this.resizeFromTo(obj, elementRect.right, elementRect.bottom, elementRect.left,elementRect.top, \"se\");\r\n }\r\n\r\n /*--------------------------------------------------------------------\r\n * resize object from {x,y} to {x,y} based on resize strategy\r\n --------------------------------------------------------------------------*/\r\n resizeFromTo (obj:HTMLElement, fromX:number, fromY:number, toX:number,toY:number, resizeStrategy:string){\r\n const posXDelta = toX - fromX;\r\n const posYDelta = toY - fromY;\r\n const element = obj ?? this._element;\r\n const elementRect = element.getBoundingClientRect();\r\n //const viewRect = this._getViewRect();\r\n const viewRect = this.resizeObserverService.getParentAppRect();\r\n \r\n let checkBoundaries = true;\r\n\r\n resizeStrategy = resizeStrategy || \"se\";\r\n\r\n //if the object is outside the view rect because it's bigger, do not check boundaries,\r\n //allow moving outside the view rect\r\n if(this.isInsideRect(elementRect, viewRect) === false) {\r\n checkBoundaries = false; \r\n }\r\n\r\n this._resizeRectangle(elementRect, posXDelta, posYDelta, resizeStrategy);\r\n\r\n if (checkBoundaries && this.isInsideRect(elementRect, viewRect) === false) {\r\n return false;\r\n }\r\n \r\n const computedStyle = window.getComputedStyle(element);\r\n let top = parseInt(computedStyle.top, 10);\r\n let left = parseInt(computedStyle.left, 10);\r\n let width = parseInt(computedStyle.width, 10);\r\n let height = parseInt(computedStyle.height, 10);\r\n \r\n if(['nw','w', 'sw'].includes(resizeStrategy)) {\r\n left = left + posXDelta; \r\n }\r\n\r\n if(['nw','n', 'ne'].includes(resizeStrategy)) {\r\n top = top + posYDelta; \r\n }\r\n\r\n if(!['n','s'].includes(resizeStrategy)) {\r\n width = elementRect.width;\r\n }\r\n \r\n if( viewRect.height < elementRect.height ){\r\n this._maxHeightReset(element, elementRect);\r\n }\r\n else if(!['w','e'].includes(resizeStrategy)) {\r\n height = elementRect.height;\r\n }\r\n\r\n \r\n element.style.top = top + 'px';\r\n element.style.left = left + 'px';\r\n element.style.width = width + 'px';\r\n element.style.height = height + 'px';\r\n\r\n return true;\r\n }\r\n/**--------------------------------------------------------------------------\r\n * resize start at the layout managaer\r\n * open document listeners\r\n --------------------------------------------------------------------------*/\r\n \r\n /**--------------------------------------------------------------------------\r\n * set the elements used for resizing\r\n --------------------------------------------------------------------------*/\r\n setResizers(element:HTMLElement) {\r\n const setResizableElements = () => {\r\n let resizableElements:ResizableElement[] = [];\r\n // get dom elements of all resizers\r\n this.resizersList.forEach( item => {\r\n const resizeElems = element.getElementsByClassName(item.className);\r\n if( resizeElems?.length ) {\r\n // set resize strategy in each element so we know in which direction to resize\r\n const decoratedResizeElems: ResizableElement[] = Array.from(resizeElems).map( elem => {\r\n const resizableElem = elem as ResizableElement;\r\n resizableElem.resizeStrategy = item.resizeStrategy;\r\n return resizableElem;\r\n });\r\n\r\n // add it to list of all resizers\r\n resizableElements = [...resizableElements, ...decoratedResizeElems];\r\n }\r\n });\r\n\r\n this.resizableElements = [...resizableElements];\r\n this.openElementListenersResize();\r\n }\r\n setTimeout(()=>{\r\n setResizableElements();\r\n });\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * open mousedown, touchstart listeners on all elements allowed for resizing\r\n --------------------------------------------------------------------------*/\r\n openElementListenersResize() {\r\n this.resizableElements.forEach(element => {\r\n element.addEventListener('mousedown', this.boundResizeStart);\r\n element.addEventListener('touchstart', this.boundResizeStart);\r\n });\r\n }\r\n /**--------------------------------------------------------------------------\r\n * open mouseup, touchend and mousemove, touchmove on document\r\n --------------------------------------------------------------------------*/\r\n openDocumentListenersResize() {\r\n document.addEventListener('mouseup', this.boundResizeEnd);\r\n document.addEventListener('touchend', this.boundResizeEnd);\r\n document.addEventListener('mousemove', this.boundResizeInProgress);\r\n document.addEventListener('touchmove', this.boundResizeInProgress); \r\n }\r\n \r\n /**--------------------------------------------------------------------------\r\n * close mouseup, touchend and mousemove, touchmove on document\r\n --------------------------------------------------------------------------*/\r\n closeDocumentListenersResize() {\r\n document.removeEventListener('mousemove', this.boundResizeInProgress);\r\n document.removeEventListener('touchmove', this.boundResizeInProgress);\r\n document.removeEventListener('mouseup', this.boundResizeEnd);\r\n document.removeEventListener('touchend', this.boundResizeEnd);\r\n }\r\n\r\n/**--------------------------------------------------------------------------\r\n * close mousedown, touchstart listeners on all elements allowed for resizing\r\n --------------------------------------------------------------------------*/\r\n closeElementListenersResize() {\r\n this.resizableElements.forEach(element => {\r\n element.removeEventListener('mousedown', this.boundResizeStart);\r\n element.removeEventListener('touchstart', this.boundResizeStart);\r\n element.removeEventListener('mousemove', this.boundResizeInProgress);\r\n element.removeEventListener('touchmove', this.boundResizeInProgress); \r\n element.removeEventListener('mouseup', this.boundResizeEnd);\r\n element.removeEventListener('touchend', this.boundResizeEnd);\r\n });\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * close all listeners\r\n --------------------------------------------------------------------------*/\r\n closeAllListenersResize() {\r\n this.closeElementListenersResize();\r\n this.closeDocumentListenersResize();\r\n }\r\n\r\n /**--------------------------------------------------------------------------\r\n * setup actual resize strategy\r\n --------------------------------------------------------------------------*/\r\n setupResizeStrategy(event: MouseEvent | TouchEvent) {\r\n if( !event ) {\r\n return;\r\n }\r\n\r\n // find on which element resize started so we know in which direction to resize\r\n let resizeStrategy:string = \"se\";\r\n const resizeSourceElem = event?.target;\r\n\r\n if( resizeSourceElem ) {\r\n const foundElem = this.resizableElements.find( item => item === resizeSourceElem );\r\n if (foundElem?.resizeStrategy) {\r\n resizeStrategy = foundElem?.resizeStrategy;\r\n }\r\n }\r\n\r\n this.actResizeStrategy = resizeStrategy;\r\n }\r\n}\r\n","import { Component, Input, ElementRef, AfterViewChecked, ChangeDetectorRef, OnInit, OnDestroy, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { Subscription } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { ResizableDirective } from '../../directives/resizable.directive'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../../services/resize-observer.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar',\r\n imports: [\r\n ResizableDirective\r\n],\r\n templateUrl: './bimplus-floating-bar.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar.component.less'\r\n})\r\n\r\nexport class BimplusFloatingBarComponent extends BimplusLocalizedWidgetComponent implements OnInit, OnDestroy, AfterViewChecked,AfterViewInit\r\n{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private element = inject(ElementRef);\r\n private cdr = inject(ChangeDetectorRef);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() noBody: boolean = false;\r\n \r\n @Input() isFocused: boolean = false;\r\n\r\n @Input() resizeEnabled: boolean = false;\r\n @Input() autoCollapse: boolean = false;\r\n @Input() focusSelector: string = '';\r\n @Input() isVisible = false; \r\n @Input() id: string = '';\r\n \r\n private subscription: Subscription | null = null; // Initialize to null\r\n private hasViewChecked: boolean = false;\r\n \r\n //@Input() isCollapsed: boolean = false;\r\n isCollapsed: boolean = false;\r\n\r\n get canNotResize(): boolean {\r\n return !(this.resizeEnabled && !this.isCollapsed);\r\n }\r\n\r\n ngOnInit():void{\r\n \r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.id); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n }) \r\n \r\n }\r\n ngOnDestroy(): void {\r\n // Unsubscribe to avoid memory leaks\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n ngAfterViewInit(){\r\n // if the component wants to be registered in layout manager system\r\n // Subscribe to the observable\r\n this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\r\n this.handleParentAppRectSizeChange(value);\r\n });\r\n }\r\n\r\n ngAfterViewChecked() {\r\n if (!this.hasViewChecked && !this.isCollapsed) {\r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n //this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.id,\"\",undefined,0,0,true);\r\n });\r\n }\r\n }\r\n\r\n handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{ \r\n this.layoutManagerService.checkPosition(this.id,'.floating-panel.visible',parentRect,0,0,true); \r\n }\r\n \r\n onResizedEnd(){\r\n this.layoutManagerService.finalizeObjectChanges(this.id);\r\n }\r\n\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.id);\r\n }\r\n}\r\n\r\n","<div\r\n class=\"floating-panel\"\r\n [class.visible]=\"isVisible\"\r\n [class.no-body]=\"noBody\"\r\n [class.is-focused]=\"isFocused\"\r\n [class.collapsed]=\"isCollapsed\" \r\n libResizable\r\n (resizedEnd)=\"onResizedEnd()\"\r\n (dragEnd)=\"onDragEnd()\"\r\n>\r\n <ng-content select=\".floating-bar-header-logo\"></ng-content>\r\n <ng-content select=\".floating-bar-header-content\"></ng-content>\r\n <ng-content select=\".floating-bar-dragger\"></ng-content>\r\n <ng-content select=\".floating-bar-body\"></ng-content>\r\n <div \r\n class=\"resizer-ne floating-panel__resizerNE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-e floating-panel__resizerE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-se floating-panel__resizerSE\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n<div \r\n class=\"resizer-s floating-panel__resizerS\"\r\n [class.resize-disabled]=\"canNotResize\">\r\n</div>\r\n</div>\r\n\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n selector: '[libDraggable]',\r\n standalone: true\r\n})\r\nexport class DraggableDirective {\r\n\r\n oldX = 0;\r\n oldY = 0;\r\n isDragging = false;\r\n wasDragging = false;\r\n isMouseDown = false;\r\n\r\n @Output()\r\n dragging = new EventEmitter<[number,number]>();\r\n\r\n @Output()\r\n dragEnd = new EventEmitter<MouseEvent>();\r\n\r\n @Output()\r\n clicked = new EventEmitter<MouseEvent>();\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging && !this.isMouseDown) {\r\n return;\r\n }\r\n\r\n const deltaX = (event.clientX - this.oldX);\r\n const deltaY = (event.clientY - this.oldY);\r\n\r\n if(!this.isDragging){\r\n if(Math.abs(deltaX) > 2 || Math.abs(deltaY) > 2){\r\n this.isDragging = true;\r\n this.wasDragging = true;\r\n }else{\r\n return;\r\n }\r\n }\r\n fireEvent(this, \"dragging\", [deltaX,deltaY]);\r\n\r\n this.oldX = event.clientX;\r\n this.oldY = event.clientY;\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if(this.isDragging || this.isMouseDown){\r\n fireEvent(this, \"dragEnd\", ['$event']);\r\n }\r\n this.isDragging = false;\r\n this.isMouseDown = false; \r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n this.isMouseDown = true;\r\n this.wasDragging = false;\r\n this.oldX = event.clientX;\r\n this.oldY = event.clientY; \r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onMouseClick(event: MouseEvent) {\r\n if(!this.wasDragging){\r\n fireEvent(this, \"clicked\", event);\r\n }\r\n }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DraggableDirective } from '../../directives/draggable.directive';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-dragger',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n ],\r\n templateUrl: './bimplus-floating-bar-dragger.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-dragger.component.less'\r\n})\r\nexport class BimplusFloatingBarDraggerComponent {\r\n private layoutManagerService = inject(LayoutManagerService);\r\n\r\n // Define isCollapsed as a boolean property\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId:string = '';\r\n \r\n // Define icon as a string property with a default value\r\n draggerIcon: string = 'ui-icon-drag';\r\n \r\n \r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__dragger dragger\"\r\n [ngClass] = \"isCollapsed ? 'collapsed' : ''\"\r\n [className]=\"draggerIcon\"\r\n libDraggable \r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n>\r\n</div>\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, input, Input, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { DraggableDirective } from '../../directives/draggable.directive';\r\nimport { LayoutManagerService, LayoutManagerItem } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-header-content',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n TranslateService\r\n ],\r\n templateUrl: './bimplus-floating-bar-header-content.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-header-content.component.less'\r\n})\r\nexport class BimplusFloatingBarHeaderContentComponent extends BimplusLocalizedWidgetComponent {\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n }) \r\n }\r\n\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId:string = '';\r\n @Output() actionClicked = new EventEmitter<string>();\r\n items = input<FloatingBarItem[]>([]);\r\n\r\n findItemById(id: string): FloatingBarItem | undefined {\r\n return this.items().find(x => x.buttonId === id);\r\n }\r\n\r\n onItemClicked(action: string) {\r\n const item = this.findItemById(action);\r\n if (!item || item?.disabled) {\r\n return;\r\n }\r\n this.actionClicked.emit(action);\r\n }\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__header-content dragger\"\r\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n libDraggable\r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n >\r\n <div class=\"menu-content\">\r\n @for (item of items(); track item) {\r\n <div>\r\n <div\r\n [attr.data-test]=\"'floating_bar_item_' + item.buttonId\"\r\n class=\"fp-block-item fp-block-icon-item\"\r\n [ngClass]=\"{\r\n active: item.active\r\n }\"\r\n [className]=\"item.iconClass\"\r\n [title]=\"item.title | translate\"\r\n (click)=\"onItemClicked(item.buttonId)\"\r\n (keypress)=\"onItemClicked(item.buttonId)\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, HostBinding, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { DraggableDirective } from '../../directives/draggable.directive'\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-header-logo',\r\n imports: [\r\n CommonModule,\r\n DraggableDirective,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n TranslateService\r\n ],\r\n templateUrl: './bimplus-floating-bar-header-logo.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-header-logo.component.less'\r\n})\r\nexport class BimplusFloatingBarHeaderLogoComponent extends BimplusLocalizedWidgetComponent implements OnInit\r\n{\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() icon: string = \"\";\r\n @HostBinding('class.isCollapsed')\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId: string = '';\r\n\r\n @Input() title: string = \"\";\r\n\r\n ngOnInit(){\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n })\r\n }\r\n\r\n onLogoClicked(){\r\n this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.parentId)\r\n }\r\n \r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd(this.parentId);\r\n }\r\n \r\n dragBaseElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1) \r\n }\r\n}\r\n","<div\r\n class=\"floating-panel__header-logo\"\r\n [ngClass]=\"isCollapsed ? 'collapsed' : ''\"\r\n [className]=\"icon\"\r\n [title]=\"title | translate\"\r\n libDraggable\r\n (clicked)=\"onLogoClicked()\" \r\n (dragEnd)=\"onDragEnd()\"\r\n (dragging)=\"dragBaseElement($event)\"\r\n></div>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewInit, model, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\nconst DEFAULT_POSITION_LEFT = 355;\r\nconst DEFAULT_POSITION_TOP = 355;\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-hide-objects',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n TranslateModule\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-hide-objects.component.html',\r\n styleUrl: './bimplus-floating-bar-hide-objects.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusFloatingBarHideObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit {\r\n private readonly element = inject(ElementRef);\r\n\r\n \r\n @Output() actionClicked = new EventEmitter<string>();\r\n @Input() noBody: boolean = true; \r\n @Input() isFocused: boolean = true;\r\n\r\n items = model<FloatingBarItem[]>([]);\r\n\r\n protected layoutManagerService: LayoutManagerService;\r\n\r\n componentId = 'hide-menu-fp-id'\r\n icon = 'ui-icon-hide-menu';\r\n title: string = \"\"; // no tooltip info on Logo icon\r\n focusSelectorId: string = 'hide-menu-id';\r\n\r\n constructor(){\r\n const layoutManagerService = inject(LayoutManagerService);\r\n\r\n super();\r\n this.layoutManagerService = layoutManagerService;\r\n }\r\n \r\n ngAfterViewInit() {\r\n // Subscribe to the observable\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP); \r\n } \r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"hide-menu-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"hide-menu\"\r\n [noBody]=\"noBody\"\r\n [isFocused]=\"isFocused\"\r\n [resizeEnabled]=\"false\"\r\n [focusSelector]=\"focusSelectorId\"\r\n [isVisible]=\"true\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\" \r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [icon]=\"icon\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [parentId] = \"componentId\"\r\n class=\"floating-bar-header-content\"\r\n [items]=\"items()\" \r\n (actionClicked)=\"actionClicked.emit($event)\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\" \r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n</lib-bimplus-floating-bar>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewChecked, ChangeDetectorRef, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { LayoutManagerService} from '../../services/layout-manager.service';\r\n\r\nconst DEFAULT_POSITION_LEFT =355;\r\nconst DEFAULT_POSITION_TOP = 320;\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-isolation-objects',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n TranslateModule\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-isolation-objects.component.html',\r\n styleUrl: './bimplus-floating-bar-isolation-objects.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusFloatingBarIsolationObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private element = inject(ElementRef);\r\n private cdr = inject(ChangeDetectorRef);\r\n\r\n constructor(){\r\n super();\r\n }\r\n private hasViewChecked: boolean = false;\r\n\r\n \r\n @Output() actionClicked = new EventEmitter<string>();\r\n\r\n @Input() noBody: boolean = true;\r\n @Input() isFocused: boolean = true;\r\n\r\n // Items for the header content sub component\r\n @Input() items: Array<FloatingBarItem> = [];\r\n\r\n icon = 'ui-icon-isolation-menu';\r\n title: string = \"\"; // no tooltip info on Logo icon\r\n focusSelectorId: string = 'isolation-menu-id';\r\n componentId = 'isolation-menu-fp-id';\r\n \r\n ngAfterViewInit(){\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP,); \r\n }\r\n\r\n ngAfterViewChecked() {\r\n if (!this.hasViewChecked) {\r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true); \r\n });\r\n }\r\n }\r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"isolation-menu-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"isolation-menu\"\r\n [noBody]=\"noBody\"\r\n [isFocused]=\"isFocused\"\r\n [resizeEnabled]=\"false\"\r\n [focusSelector]=\"focusSelectorId\"\r\n [isVisible]=\"true\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [icon]=\"icon\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [parentId] = \"componentId\" \r\n class=\"floating-bar-header-content\"\r\n [items]=\"items\"\r\n (actionClicked)=\"actionClicked.emit($event)\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\"\r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n</lib-bimplus-floating-bar>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-body',\r\n imports: [\r\n CommonModule,\r\n TranslateModule,\r\n ],\r\n templateUrl: './bimplus-floating-bar-body.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-floating-bar-body.component.less'\r\n})\r\nexport class BimplusFloatingBarBodyComponent extends BimplusLocalizedWidgetComponent implements OnInit{\r\n private layoutManagerService = inject(LayoutManagerService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() isCollapsed: boolean = false;\r\n @Input() parentId: string = '';\r\n \r\n ngOnInit(){\r\n this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n })\r\n }\r\n}\r\n\r\n\r\n","<div\r\n libDraggable\r\n class=\"floating-panel__body\"\r\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, input, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { ProjectNavigatorModel, ProjectNavigatorLayer } from './project-models.interface';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\n\r\n@Component({\r\n selector: 'lib-project-models',\r\n imports: [\r\n CommonModule,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n TranslateModule,\r\n ],\r\n templateUrl: './project-models.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './project-models.component.less'\r\n})\r\nexport class ProjectModelsComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() modelTreeRootTitle: string = \"_Divisions\";\r\n @Input() modelTreeRootName: string = \"_Divisions\";\r\n\r\n @Input() expandedModelTree: boolean = false;\r\n\r\n models = input<ProjectNavigatorModel[]>([]);\r\n\r\n @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n\r\n @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n\r\n @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n}\r\n","<lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"expandedModelTree\"\r\n >\r\n <lib-expansion-panel-header [title]=\"modelTreeRootTitle\">\r\n <span class=\"project-navigator-root-node\">{{\r\n modelTreeRootName | translate\r\n }}</span>\r\n <lib-expansion-panel-header-actions>\r\n <!-- no action buttons for root -->\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Show all models also as expansion panels -->\r\n <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\r\n @for(model of models(); track model) {\r\n <lib-expansion-panel\r\n class=\"project-navigator-model-panel\"\r\n [expanded]=\"model.isExpanded\"\r\n >\r\n <lib-expansion-panel-header>\r\n <span\r\n class=\"project-navigator-model-node\"\r\n [ngClass]=\"{\r\n visible: model.isVisible\r\n }\"\r\n [title]=\"model.name + ' (Rev: ' + model.currentRevision + ')'\"\r\n (click)=\"clickedModel.emit(model)\"\r\n (keypress)=\"clickedModel.emit(model)\"\r\n >\r\n {{ model.name }}\r\n </span>\r\n\r\n <lib-expansion-panel-header-actions>\r\n <div\r\n [attr.data-test]=\"'toggle_opacity_model_' + model.id\"\r\n class=\"ui-icon-transparency project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n opaque: model.isOpaque,\r\n transparent: !model.isOpaque,\r\n semiopaque: model.isSemiOpaque,\r\n }\"\r\n [title]=\"'_Toggle opacity' | translate\"\r\n (click)=\"toggleOpacityOfModel.emit(model)\"\r\n (keypress)=\"toggleOpacityOfModel.emit(model)\"\r\n ></div>\r\n\r\n <div\r\n [attr.data-test]=\"'toggle_visibility_model_' + model.id\"\r\n class=\"ui-icon-visibility project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: model.isVisible,\r\n invisible: !model.isVisible,\r\n semivisible: model.isSemiVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityOfModel.emit(model)\"\r\n (keypress)=\"toggleVisibilityOfModel.emit(model)\"\r\n ></div>\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <!-- Content of panel -->\r\n @for (layer of model.layers; track layer) {\r\n <div\r\n class=\"project-navigator-layer-node\"\r\n >\r\n <div\r\n class=\"project-navigator-layer-node-name\"\r\n [attr.data-test]=\"'floating_bar_layer' + layer.id\"\r\n [ngClass]=\"{\r\n visible: layer.isVisible\r\n }\"\r\n [title]=\"layer.name | translate\"\r\n (click)=\"clickedLayer.emit(layer)\"\r\n (keypress)=\"clickedLayer.emit(layer)\"\r\n >\r\n {{ layer.name | translate }}\r\n </div>\r\n <div\r\n [attr.data-test]=\"'toggle_opacity_layer_' + layer.id\"\r\n class=\"ui-icon-transparency project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n opaque: layer.isOpaque,\r\n transparent: !layer.isOpaque\r\n }\"\r\n [title]=\"'_Toggle opacity' | translate\"\r\n (click)=\"toggleOpacityOfLayer.emit(layer)\"\r\n (keypress)=\"toggleOpacityOfLayer.emit(layer)\"\r\n ></div>\r\n <div\r\n [attr.data-test]=\"'toggle_visibility_layer_' + layer.id\"\r\n class=\"ui-icon-visibility project-navigator-action-buttons\"\r\n [ngClass]=\"{\r\n visible: layer.isVisible,\r\n invisible: !layer.isVisible\r\n }\"\r\n [title]=\"'_Toggle visibility' | translate\"\r\n (click)=\"toggleVisibilityOfLayer.emit(layer)\"\r\n (keypress)=\"toggleVisibilityOfLayer.emit(layer)\"\r\n ></div>\r\n </div>\r\n }\r\n </lib-expansion-panel>\r\n }\r\n</lib-expansion-panel>\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-panel-toolbar',\r\n imports: [CommonModule],\r\n templateUrl: './bimplus-panel-toolbar.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-panel-toolbar.component.less'\r\n})\r\nexport class BimplusPanelToolbarComponent {\r\n @Input() isPanelToolbarVisible: boolean = false;\r\n}\r\n","<div class=\"panel-toolbar\"\r\n [ngClass]=\"!isPanelToolbarVisible ? 'hidden' : ''\"\r\n>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef, AfterViewChecked, AfterViewInit, ChangeDetectorRef, inject, DestroyRef, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\r\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\r\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\r\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\r\nimport { BimplusFloatingBarBodyComponent } from '../bimplus-floating-bar-body/bimplus-floating-bar-body.component';\r\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\r\nimport { ProjectNavigatorModel, ProjectNavigatorLayer, ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { ProjectModelsComponent } from '../project-models/project-models.component';\r\nimport { BimplusPanelToolbarComponent } from '../bimplus-panel-toolbar/bimplus-panel-toolbar.component';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\nconst DEFAULT_POSITION_LEFT = 355;\r\nconst DEFAULT_POSITION_TOP =20;\r\n@Component({\r\n selector: 'lib-bimplus-floating-bar-project-navigator',\r\n imports: [\r\n BimplusFloatingBarComponent,\r\n BimplusFloatingBarDraggerComponent,\r\n BimplusFloatingBarHeaderContentComponent,\r\n BimplusFloatingBarHeaderLogoComponent,\r\n BimplusFloatingBarBodyComponent,\r\n BimplusPanelToolbarComponent,\r\n ProjectModelsComponent,\r\n TranslateModule,\r\n BimplusScrollableContainerComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-floating-bar-project-navigator.component.html',\r\n styleUrl: './bimplus-floating-bar-project-navigator.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusFloatingBarProjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked {\r\n private readonly layoutManagerService = inject(LayoutManagerService);\r\n private readonly element = inject(ElementRef);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n private hasViewChecked: boolean = false;\r\n \r\n\r\n // General bar handling\r\n @Input() noBody: boolean = false; // Project navigator has a body\r\n @Input() isCollapsed: boolean = false;\r\n @Input() noModelsMessage: string | undefined = undefined;\r\n @Input() isLoading: boolean = false;\r\n @Input() loadingDataMessage: string | undefined = undefined;\r\n \r\n icon = 'ui-icon-project-navigator';\r\n title: string = '_Project_navigator';\r\n componentId = 'project-navigator-fp-id';\r\n // Header content (like IFC export button)\r\n @Input() items: Array<FloatingBarItem> = [];\r\n\r\n @Output() actionClicked = new EventEmitter<string>();\r\n\r\n // Body content\r\n @Input() isPanelToolbarVisible: boolean = false;\r\n @Input() expandedModelTree: boolean = false;\r\n @Input() project: ProjectNavigatorProject = { id: \"\", name: \"\", teamSlug: \"\", models: [] };\r\n @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\r\n @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\r\n @Output() logoClicked = new EventEmitter<MouseEvent>(); \r\n destroyRef = inject(DestroyRef)\r\n\r\n ngAfterViewInit(){\r\n this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\r\n \r\n this.layoutManagerService.registeredItems$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({next:(items: LayoutManagerItem[]) => {\r\n const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.componentId); \r\n this.isCollapsed = !!(layoutManagerItem?.isCollapsed); \r\n },complete: () => console.log('completed')});\r\n }\r\n // #region General bar handling \r\n\r\n ngAfterViewChecked() {\r\n //if (!this.hasViewChecked && !this.isCollapsed) {\r\n if (!this.hasViewChecked) { \r\n this.hasViewChecked = true; // Set the flag to prevent repeated execution\r\n this.cdr.detectChanges(); // Trigger change detection \r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true);\r\n });\r\n }\r\n }\r\n // #endregion\r\n}\r\n","<lib-bimplus-floating-bar\r\n id=\"project-navigator-fp-id\"\r\n [id] = \"componentId\"\r\n class=\"project-navigator-fp floating-panel\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [noBody]=\"noBody\" \r\n [resizeEnabled]=\"true\"\r\n [isVisible]=\"true\" \r\n>\r\n <lib-bimplus-floating-bar-header-logo\r\n class=\"floating-bar-header-logo\"\r\n [parentId] = \"componentId\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [icon]=\"icon\"\r\n [title]=\"title\" \r\n >\r\n </lib-bimplus-floating-bar-header-logo>\r\n\r\n <lib-bimplus-floating-bar-header-content\r\n class=\"floating-bar-header-content\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [items]=\"items\"\r\n (actionClicked)=\"actionClicked.emit($event)\" \r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-header-content>\r\n\r\n <lib-bimplus-floating-bar-dragger\r\n class=\"floating-bar-dragger\"\r\n [parentId] = \"componentId\"\r\n >\r\n </lib-bimplus-floating-bar-dragger>\r\n\r\n <lib-bimplus-floating-bar-body\r\n class=\"floating-bar-body\"\r\n [parentId] = \"componentId\"\r\n >\r\n <lib-bimplus-panel-toolbar\r\n [isPanelToolbarVisible]=\"isPanelToolbarVisible\"\r\n ></lib-bimplus-panel-toolbar>\r\n\r\n @if(isLoading && loadingDataMessage){\r\n <span class=\"inline-message\" [innerHtml]=\"loadingDataMessage | translate\"></span>\r\n }\r\n @else{ \r\n @if(project.models.length === 0 && noModelsMessage){\r\n <span class=\"inline-message\" [innerHtml]=\"noModelsMessage | translate\"></span>\r\n }@else{\r\n <lib-bimplus-scrollable-container>\r\n <lib-project-models\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [models]=\"project.models\"\r\n [modelTreeRootTitle]=\"project.name + ' - ' + project.teamSlug\"\r\n [expandedModelTree]=\"expandedModelTree\"\r\n (clickedModel)=\"clickedModel.emit($event)\"\r\n (clickedLayer)=\"clickedLayer.emit($event)\"\r\n (toggleOpacityOfModel)=\"toggleOpacityOfModel.emit($event)\"\r\n (toggleOpacityOfLayer)=\"toggleOpacityOfLayer.emit($event)\"\r\n (toggleVisibilityOfModel)=\"toggleVisibilityOfModel.emit($event)\"\r\n (toggleVisibilityOfLayer)=\"toggleVisibilityOfLayer.emit($event)\"\r\n >\r\n </lib-project-models>\r\n </lib-bimplus-scrollable-container>\r\n }\r\n }\r\n </lib-bimplus-floating-bar-body>\r\n</lib-bimplus-floating-bar>\r\n","import { Component, EventEmitter, input, Output, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-message',\r\n templateUrl: './bimplus-overlay-message.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-overlay-message.component.less'\r\n})\r\nexport class BimplusOverlayMessageComponent {\r\n title = input<string>(\"\");\r\n message = input<string>(\"\");\r\n\r\n @Output() closeMessage = new EventEmitter<void>();\r\n\r\n closeButton() {\r\n this.closeMessage.emit();\r\n // (document.activeElement as HTMLElement)?.blur(); // Remove focus of active element\r\n }\r\n\r\n closeKeypressed(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.closeMessage.emit();\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"bimplus-overlay-message\">\r\n <div class=\"overlay-dialog-container\">\r\n <div class=\"header\">\r\n\r\n <div class=\"icon\"></div>\r\n\r\n @if (title(); as title) {\r\n <div class=\"title-text\">\r\n {{ title }}\r\n </div>\r\n }\r\n\r\n <button\r\n class=\"close-button\"\r\n (click)=\"closeButton()\"\r\n tabindex=\"0\"\r\n (keydown)=\"closeKeypressed($event)\">\r\n </button>\r\n\r\n </div>\r\n\r\n <div class=\"content\">\r\n @if (message(); as message) {\r\n <div class=\"text\" [innerHTML]=\"message\">\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'pxsuffix',\r\n standalone: true\r\n})\r\nexport class PxsuffixPipe implements PipeTransform {\r\n\r\n transform(input: number): string{ //string type\r\n return input + 'px';\r\n } \r\n\r\n}\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n selector: '[xDraggable]',\r\n standalone: true\r\n})\r\nexport class XDraggableDirective {\r\n\r\n oldX = 0;\r\n isDragging = false;\r\n wasDragging = false;\r\n isMouseDown = false;\r\n\r\n @Output()\r\n dragging = new EventEmitter<number>();\r\n\r\n @Output()\r\n clicked = new EventEmitter<MouseEvent>();\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging && !this.isMouseDown) {\r\n return;\r\n }\r\n\r\n const deltaX = (event.clientX - this.oldX);\r\n\r\n if(!this.isDragging){\r\n if(Math.abs(deltaX) > 2){\r\n this.isDragging = true;\r\n this.wasDragging = true;\r\n }else{\r\n return;\r\n }\r\n }\r\n\r\n fireEvent(this, \"dragging\", deltaX);\r\n\r\n this.oldX = event.clientX;\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n this.isDragging = false;\r\n this.isMouseDown = false;\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n this.isMouseDown = true;\r\n this.wasDragging = false;\r\n this.oldX = event.clientX;\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onMouseClick(event: MouseEvent) {\r\n if(!this.wasDragging){\r\n fireEvent(this, \"clicked\", event);\r\n }\r\n }\r\n\r\n}\r\n","import { Component, Output, EventEmitter, ViewEncapsulation, signal, input, effect, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\r\nimport { XDraggableDirective } from '../../directives/x-draggable.directive'\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\nexport interface SidenavItem {\r\n id: string;\r\n icon?: string;\r\n iconActive?: string;\r\n iconDisabled?: string;\r\n text: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-sidenav',\r\n imports: [CommonModule, PxsuffixPipe, XDraggableDirective, TranslateModule],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-sidenav.component.html',\r\n styleUrl: './bimplus-sidenav.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusSidenavComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n // #region public fields\r\n readonly activeItem = signal<string>('');\r\n readonly drawerWidth = signal<number>(300);\r\n readonly drawerExpanded = signal(true);\r\n\r\n @Output() activeItemChanged = new EventEmitter<string>();\r\n @Output() actionClicked = new EventEmitter<string>();\r\n @Output() footerClicked = new EventEmitter<string>();\r\n\r\n items = input<SidenavItem[]>([]);\r\n // we need to wait for the items before we can activate the first item, this is instead of using a lifecycle methods (ngOnInit) or set\r\n private readonly activateItemEffectRef = effect(() => {\r\n if (this.items().length) {\r\n this._activateItem(this.items()[0].id);\r\n // if there is first item, we need to manually destroy this effect to prevent call it again\r\n this.activateItemEffectRef.destroy();\r\n }\r\n }, { manualCleanup: true })\r\n actionItems = input<SidenavItem[]>([]);\r\n footerItem = input<SidenavItem | null>(null);\r\n\r\n\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n _activateItem(item: string) {\r\n this.activeItem.set(item);\r\n const foundItem = this.items().find(x => x.id == item);\r\n if (!foundItem) {\r\n return;\r\n }\r\n\r\n if (!this.drawerExpanded()) {\r\n this._toggleDrawer();\r\n }\r\n fireEvent(this, \"activeItemChanged\", item);\r\n }\r\n\r\n _clickAction(item: string) {\r\n fireEvent(this, \"actionClicked\", item);\r\n }\r\n\r\n _clickFooter(item: string) {\r\n fireEvent(this, \"footerClicked\", item);\r\n }\r\n\r\n _toggleDrawer() {\r\n this.drawerExpanded.update(value => !value);\r\n }\r\n\r\n _onResizeWidth(event: number): void {\r\n const deltaX = event;\r\n this.drawerWidth.update(value => (value + deltaX));\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"sidenav\">\r\n @for (sideNavItem of items(); track sideNavItem) {\r\n <div class=\"sidenav-row\">\r\n @if (sideNavItem.disabled) {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.iconDisabled + ')'\r\n \"\r\n [title]=\"sideNavItem.text | translate\"\r\n (keypress)=\"_toggleDrawer()\"\r\n ></div>\r\n } @else { @if (activeItem() === sideNavItem.id) {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.iconActive + ')'\r\n \"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n [title]=\"sideNavItem.text | translate\"\r\n ></div>\r\n } @else {\r\n <div\r\n [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + sideNavItem.icon + ')'\r\n \"\r\n (click)=\"_activateItem(sideNavItem.id)\"\r\n (keypress)=\"_activateItem(sideNavItem.id)\"\r\n [title]=\"sideNavItem.text | translate\"\r\n ></div>\r\n } }\r\n </div>\r\n } @if (actionItems().length) {\r\n <div class=\"sidenav-separator\"></div>\r\n @for(actionItem of actionItems(); track actionItem) {\r\n <div class=\"sidenav-row\">\r\n <div\r\n [attr.data-test]=\"'sidenav_action_item_' + actionItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + actionItem.icon + ')'\r\n \"\r\n (click)=\"_clickAction(actionItem.id)\"\r\n (keypress)=\"_clickAction(actionItem.id)\"\r\n [title]=\"actionItem.text | translate\"\r\n ></div>\r\n </div>\r\n } } @if (footerItem(); as footerItem) {\r\n <div class=\"sidenav-row-footer\">\r\n <div\r\n [attr.data-test]=\"'sidenav_footer_item_' + footerItem.id\"\r\n class=\"sidenav-item\"\r\n [style.background]=\"\r\n ' no-repeat center center url(' + footerItem.icon + ')'\r\n \"\r\n (click)=\"_clickFooter(footerItem.id)\"\r\n (keypress)=\"_clickFooter(footerItem.id)\"\r\n ></div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<div\r\n class=\"sidenav-drawer\"\r\n [style.width]=\"drawerWidth() | pxsuffix\"\r\n [ngClass]=\"drawerExpanded() ? '' : 'hidden'\"\r\n>\r\n <slot></slot>\r\n @if (drawerExpanded()) {\r\n <div\r\n xDraggable\r\n class=\"sidenav-resize-border-right\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n ></div>\r\n <div\r\n xDraggable\r\n data-test=\"sidenav-resize-handle\"\r\n class=\"sidenav-resize-handle-left\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n (clicked)=\"_toggleDrawer()\"\r\n ></div>\r\n }\r\n</div>\r\n@if (!drawerExpanded()) {\r\n<div\r\n data-test=\"sidenav-resize-handle\"\r\n class=\"sidenav-resize-handle-left collapsed\"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n></div>\r\n}\r\n","import { ToolHubVisualSettings, ToolHubItemUnits } from './bimplus-tool-hub.interface';\r\n\r\nconst RAD_DEG : number = Math.PI / 180.0;\r\nconst PI2 : number = 2 * Math.PI;\r\n\r\n\r\nexport class SVGGenerator {\r\n\r\n // Constants for drawing arc\r\n /**\r\n * @param {Array.<Number>} center\r\n * @param {Number} R\r\n * @param {Number} angle\r\n * @return {Array.<Number>}\r\n */\r\n static pointOnArc(center: [number,number], R: number, angle: number) : [number, number] {\r\n const radians = (angle - 90) * RAD_DEG;\r\n\r\n return [center[0] + R * Math.cos(radians), center[1] + R * Math.sin(radians)];\r\n }\r\n\r\n /**\r\n * Generates arc path\r\n *\r\n * @param {Array.<Number>} center\r\n * @param {Number} radius\r\n * @param {Number} start\r\n * @param {Number} end\r\n * @param {Number} width\r\n * @param {Number} corner Corner radius\r\n * @param {Number} canvasWidth - Divisor to have svg with range 0 to 1\r\n *\r\n * @return {String|Array.<Number|String>}\r\n */\r\n static arc(center: [number,number], radius: number, start: number, end: number, width: number, corner: number, canvasWidth: number) : string {\r\n\r\n const innerR = radius - width;\r\n const circumference = Math.abs(end - start);\r\n corner = Math.min(width / 2, corner);\r\n\r\n if (360 * (corner / (Math.PI * (radius - width))) > Math.abs(start - end)) {\r\n corner = circumference / 360 * innerR * Math.PI;\r\n }\r\n\r\n // inner and outer radiuses\r\n const innerR2 = innerR + corner;\r\n const outerRadius = radius - corner;\r\n\r\n // butts corner points\r\n const oStart = this.pointOnArc(center, outerRadius, start);\r\n const oEnd = this.pointOnArc(center, outerRadius, end);\r\n\r\n const iStart = this.pointOnArc(center, innerR2, start);\r\n const iEnd = this.pointOnArc(center, innerR2, end);\r\n\r\n const iSection = 360 * (corner / (PI2 * innerR));\r\n const oSection = 360 * (corner / (PI2 * radius));\r\n\r\n // arcs endpoints\r\n const iArcStart = this.pointOnArc(center, innerR, start + iSection);\r\n const iArcEnd = this.pointOnArc(center, innerR, end - iSection);\r\n\r\n const oArcStart = this.pointOnArc(center, radius, start + oSection);\r\n const oArcEnd = this.pointOnArc(center, radius, end - oSection);\r\n\r\n const arcSweep1 = circumference > 180 + 2 * oSection ? 1 : 0;\r\n const arcSweep2 = circumference > 180 + 2 * iSection ? 1 : 0;\r\n\r\n const points : Array<string> = new Array<string>(\r\n // begin path\r\n \"M\", (oStart[0] / canvasWidth).toString(), (oStart[1] / canvasWidth).toString(),\r\n // outer start corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oArcStart[0] / canvasWidth).toString(), (oArcStart[1] / canvasWidth).toString(),\r\n // outer main arc\r\n \"A\", (radius / canvasWidth).toString(), (radius / canvasWidth).toString(), \"0\", (arcSweep1 / canvasWidth).toString(), \"1\", (oArcEnd[0] / canvasWidth).toString(), (oArcEnd[1] / canvasWidth).toString(),\r\n // outer end corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oEnd[0] / canvasWidth).toString(), (oEnd[1] / canvasWidth).toString(),\r\n // end butt\r\n \"L\", (iEnd[0] / canvasWidth).toString(), (iEnd[1] / canvasWidth).toString(),\r\n // inner end corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iArcEnd[0] / canvasWidth).toString(), (iArcEnd[1] / canvasWidth).toString(),\r\n // inner arc\r\n \"A\", (innerR / canvasWidth).toString(), (innerR / canvasWidth).toString(), \"0\", (arcSweep2 / canvasWidth).toString(), \"0\", (iArcStart[0] / canvasWidth).toString(), (iArcStart[1] / canvasWidth).toString(),\r\n // inner start corner\r\n \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iStart[0] / canvasWidth).toString(), (iStart[1] / canvasWidth).toString(), \"Z\" // end path*/\r\n );\r\n\r\n return points.join(' ');\r\n }\r\n\r\n /*\r\n * svg units - when \"objectBoundingBox\" is applied, coordinates are relative,\r\n * use coordinates as ratio (in range 0-1),\r\n * f.e. (1,1) is botom right corner of element\r\n */\r\n static drawMenuItemSvg(svgRadius: number, svgRadiusInner: number, buttonsLength: number, isEMEmbedded: boolean): ToolHubItemUnits {\r\n \r\n const radius = isEMEmbedded ? (svgRadius - 5) * 10 : svgRadius * 10;\r\n const radiusInner = isEMEmbedded ? (svgRadiusInner - 3) * 10 : svgRadiusInner * 10;\r\n const width = radius * 2;\r\n // coordinates of points describing one item on menu\r\n const angle = 360 / ((buttonsLength > 0) ? buttonsLength : 1);\r\n const halfAngleRadians = (angle * Math.PI) / 360;\r\n const leftX = radius - Math.sin(halfAngleRadians) * radius;\r\n const leftY = radius - Math.cos(halfAngleRadians) * radius;\r\n const rightX = radius + Math.sin(halfAngleRadians) * radius;\r\n const rightY = radius - Math.cos(halfAngleRadians) * radius;\r\n \r\n \r\n return {\r\n radius: radius / width,\r\n radiusInner: radiusInner / width,\r\n width: 1,\r\n thick: (radius - radiusInner) / width,\r\n innerEdgeRight: (radius + radiusInner) / width,\r\n leftX: leftX / width,\r\n leftY: leftY / width,\r\n rightX: rightX / width,\r\n rightY: rightY / width\r\n };\r\n }\r\n\r\n \r\n static generateAnnularSector(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\r\n settings.subMenuRadius * multiplier,\r\n settings.subMenuStartAngle,\r\n settings.subMenuEndAngle,\r\n settings.subMenuWidth,\r\n 7,\r\n 425\r\n );\r\n }\r\n\r\n static generateAnnularSectorBorder(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\r\n (settings.subMenuRadius * multiplier) + 1,\r\n settings.subMenuStartAngle - 0.5,\r\n settings.subMenuEndAngle + 0.5,\r\n settings.subMenuWidth + 2,\r\n 7,\r\n 425\r\n );\r\n }\r\n\r\n static generateDeadZoneAnnularSector(settings : ToolHubVisualSettings): string{\r\n const multiplier = 12;\r\n return SVGGenerator.arc(\r\n [settings.deadZoneCenter[0] * multiplier, settings.deadZoneCenter[1] * multiplier],\r\n (settings.deadZoneRadius) * multiplier,\r\n settings.deadZoneStartAngle,\r\n settings.deadZoneEndAngle,\r\n settings.deadZoneWidth,\r\n 7,\r\n 700);\r\n }\r\n\r\n static getSVGViewBox(units : ToolHubItemUnits):string{\r\n return `0 0 ${units.width} ${units.width}`;\r\n }\r\n\r\n static getSVGCenterMenuPath(units : ToolHubItemUnits):string{\r\n return `M 0 ${units.radius} A ${units.radius} ${units.radius} 0 0 1 ${units.width} ${units.radius} L ${units.width} ${units.radius} A ${units.radius} ${units.radius} 0 0 1 0 ${units.radius} L ${units.thick} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.innerEdgeRight} ${units.radius} L ${units.innerEdgeRight} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.thick} ${units.radius} Z`;\r\n }\r\n\r\n static getSVGCenterMenuItemPath(units : ToolHubItemUnits):string{\r\n return `M ${units.radius} ${units.radius} L ${units.leftX} ${units.leftY} A ${units.radius} ${units.radius} 0 0 1 ${units.rightX} ${units.rightY} L ${units.rightX} ${units.rightY} L ${units.radius} ${units.radius} Z`;\r\n }\r\n\r\n static getSVGCenterSubMenuItemPath(subMenuUnits : ToolHubItemUnits):string{\r\n return `M ${subMenuUnits.radius} ${subMenuUnits.radius} L ${subMenuUnits.leftX} ${subMenuUnits.leftY} A ${subMenuUnits.radius} ${subMenuUnits.radius} 0 0 1 ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.radius} ${subMenuUnits.radius} Z`;\r\n }\r\n\r\n}\r\n","import { Component, HostBinding, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n selector: 'lib-tool-hub-item',\r\n imports: [CommonModule],\r\n templateUrl: './tool-hub-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubItemComponent {\r\n @Input()\r\n item : ToolHubItem | null = null;\r\n \r\n @HostBinding('class.active')\r\n @Input() \r\n active : boolean = false;\r\n \r\n @HostBinding('class.enabled')\r\n @Input() \r\n isEnabled : boolean = true;\r\n \r\n @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n}\r\n","@if (item) {\n<div class=\"centermenu-button-icon dragger\" [ngClass]=\"{\r\n 'disabled' : !isEnabled,\r\n 'enabled' : isEnabled,\r\n 'active' : active\r\n }\" [className]=\"item.iconClass\">\r\n <span class=\"centermenu-button-text\">{{item.text}}</span>\n </div>\n}","import { Component, HostBinding, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubSubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n selector: 'lib-tool-hub-sub-item',\r\n imports: [CommonModule],\r\n templateUrl: './tool-hub-sub-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubSubItemComponent {\r\n @Input() item : ToolHubSubItem | null = null;\r\n \r\n @HostBinding('class.active')\r\n @Input() \r\n active : boolean = false;\r\n \r\n @HostBinding('class.enabled')\r\n @Input() \r\n isEnabled : boolean = true;\r\n\r\n @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n @HostBinding('class.center-sub-menu-button') centerSubMenuButtonClass: boolean = true;\r\n}\r\n","@if (item) {\n <div\n class=\"center-sub-menu-button-icon\"\n [ngClass]=\"{\r\n disabled: !isEnabled,\r\n enabled: isEnabled,\r\n active: item.type !== 'separator' && active\r\n }\"\r\n [className]=\"item.iconClass\"\n >\n <span class=\"centermenu-button-text\">{{ item.text }}</span>\n </div>\n}\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, booleanAttribute, ElementRef, OnInit, AfterViewInit, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation'\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { SVGGenerator } from './svg-generator';\r\nimport { ToolHubItemComponent } from './tool-hub-item/tool-hub-item.component';\r\nimport { ToolHubSubItemComponent } from './tool-hub-sub-item/tool-hub-sub-item.component';\r\nimport { DraggableDirective } from '../../directives/draggable.directive'\r\nimport { ToolHubItem, ToolHubSubItem, ToolHubVisualSettings, ToolHubItemUnits, ToolHubItemStates } from './bimplus-tool-hub.interface';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../../services/resize-observer.service';\r\n\r\nfunction createDefaultVisualSettings(): ToolHubVisualSettings {\r\n const settings: ToolHubVisualSettings = {\r\n subMenuStartAngle: 40,\r\n subMenuEndAngle: 140,\r\n svgRadiusInner: 5.75,\r\n svgRadius: 10.25,\r\n subMenuCenter: [17.25, 17.5],\r\n subMenuRadius: 15.5,\r\n subMenuWidth: 52,\r\n deadZoneCenter: [17, 18],\r\n deadZoneWidth: 140,\r\n deadZoneRadius: 22,\r\n deadZoneStartAngle: 35,\r\n deadZoneEndAngle: 145\r\n }\r\n return settings;\r\n}\r\n\r\n// Use when implementing embedded mode\r\n// function createEmbeddedSettings() : ToolHubVisualSettings{\r\n// const settings : ToolHubVisualSettings = {\r\n// subMenuStartAngle : 40,\r\n// subMenuEndAngle : 140,\r\n// svgRadiusInner : 4,\r\n// svgRadius : 7.25,\r\n// subMenuCenter : [17.25, 17.3],\r\n// subMenuRadius : 16.2,\r\n// subMenuWidth : 62,\r\n// deadZoneCenter : [16.5, 16],\r\n// deadZoneWidth : 120,\r\n// deadZoneRadius : 18,\r\n// deadZoneStartAngle : 35,\r\n// deadZoneEndAngle : 145\r\n// }\r\n// return settings;\r\n// }\r\n\r\nfunction createDefaultItems(): Array<ToolHubItem> {\r\n const items: Array<ToolHubItem> = [\r\n //--- create task ---------------------------------------------------\r\n {\r\n buttonId: 'cmButCreateTask',\r\n iconClass: 'ui-icon-create-task',\r\n text: '_Create_issue_center_menu_tooltip',\r\n tooltip: '_Create_issue_center_menu_tooltip',\r\n tooltipDisabled: '_Create_issue_center_menu_tooltip',\r\n },\r\n\r\n //--- quantity takeoff ---------------------------------------------------\r\n {\r\n buttonId: 'cmButQuantityTakeOff',\r\n iconClass: 'ui-icon-quantity-take-off',\r\n text: '_Quantity_take_Off_center_menu_tooltip',\r\n tooltip: '_Quantity_take_Off_center_menu_tooltip',\r\n tooltipDisabled: '_Quantity_take_Off_center_menu_tooltip',\r\n },\r\n\r\n //--- markup ---------------------------------------------------\r\n {\r\n buttonId: 'cmButMarkup',\r\n iconClass: 'ui-icon-markup',\r\n text: '_Markups_center_menu_tooltip',\r\n tooltip: '_Markups_center_menu_tooltip',\r\n tooltipDisabled: '_Markups_center_menu_tooltip',\r\n },\r\n\r\n //--- section ---------------------------------------------------\r\n {\r\n buttonId: 'cmButSection',\r\n iconClass: 'ui-icon-section',\r\n text: '_Sectioning_center_menu_tooltip',\r\n tooltip: '_Sectioning_center_menu_tooltip',\r\n tooltipDisabled: '_Sectioning_center_menu_tooltip',\r\n },\r\n\r\n //--- hide ---------------------------------------------------\r\n {\r\n buttonId: 'cmButObjTranspMenu',\r\n iconClass: 'ui-icon-obj-transp',\r\n text: '_Hide_objects_center_menu_tooltip',\r\n tooltip: '_Hide_objects_center_menu_tooltip',\r\n tooltipDisabled: '_Hide_objects_center_menu_tooltip',\r\n },\r\n\r\n //--- isolate ---------------------------------------------------\r\n {\r\n buttonId: 'cmButObjSel',\r\n iconClass: 'ui-icon-obj-select',\r\n text: '_Isolate_objects_center_menu_tooltip',\r\n tooltip: '_Isolate_objects_center_menu_tooltip',\r\n tooltipDisabled: '_Isolate_objects_center_menu_tooltip',\r\n },\r\n\r\n //--- navigation map ---------------------------------------------------\r\n {\r\n buttonId: 'cmButNavigationMap',\r\n iconClass: 'ui-icon-navigation-map',\r\n text: '_Navigation_nap_center_menu_tooltip',\r\n tooltip: '_Navigation_nap_center_menu_tooltip',\r\n tooltipDisabled: '_Navigation_nap_center_menu_tooltip',\r\n },\r\n\r\n //--- fullscreen ----------------------------------------------\r\n {\r\n buttonId: 'cmButFullScreen',\r\n iconClass: 'ui-icon-fullscreen',\r\n text: '_Fullscreen_node_center_menu_tooltip',\r\n tooltip: '_Fullscreen_node_center_menu_tooltip',\r\n tooltipDisabled: '_Fullscreen_node_center_menu_tooltip',\r\n },\r\n\r\n //--- project navigator ---------------------------------------\r\n {\r\n buttonId: 'cmButProjectNavigator',\r\n iconClass: 'ui-icon-project-navigator',\r\n text: '_Project_navigator_center_menu_tooltip',\r\n tooltip: '_Project_navigator_center_menu_tooltip',\r\n tooltipDisabled: '_Project_navigator_center_menu_tooltip',\r\n },\r\n\r\n //--- reset ---------------------------------------------------\r\n {\r\n iconClass: 'ui-icon-obj-reset',\r\n buttonId: 'cmButResetObj',\r\n text: '_Reset_viewport_center_menu_tooltip',\r\n tooltip: '_Reset_viewport_center_menu_tooltip',\r\n tooltipDisabled: '_Reset_viewport_center_menu_tooltip',\r\n },\r\n\r\n //--- view ---------------------------------------------------\r\n {\r\n buttonId: 'cmButResetVp',\r\n iconClass: 'ui-icon-reset-vp',\r\n text: '_Select_view_center_menu_tooltip',\r\n tooltip: '_Select_view_center_menu_tooltip',\r\n tooltipDisabled: '_Select_view_center_menu_tooltip',\r\n subMenuId: 'cmb-view-submenu',\r\n subItems: [\r\n //--- Front View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButFrontView',\r\n type: 'button',\r\n iconClass: 'ui-icon-front-view',\r\n text: '_Front_view_center_menu_tooltip',\r\n tooltip: '_Front_view_center_menu_tooltip',\r\n tooltipDisabled: '_Front_view_center_menu_tooltip',\r\n actionClick: 'centerMenuFrontViewClick',\r\n },\r\n //--- Top View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButTopView',\r\n type: 'button',\r\n iconClass: 'ui-icon-top-view',\r\n text: '_Top_view_center_menu_tooltip',\r\n tooltip: '_Top_view_center_menu_tooltip',\r\n tooltipDisabled: '_Top_view_center_menu_tooltip',\r\n actionClick: 'centerMenuTopViewClick',\r\n },\r\n //--- Side View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButSideView',\r\n type: 'button',\r\n iconClass: 'ui-icon-side-view',\r\n text: '_Side_view_center_menu_tooltip',\r\n tooltip: '_Side_view_center_menu_tooltip',\r\n tooltipDisabled: '_Side_view_center_menu_tooltip',\r\n actionClick: 'centerMenuSideViewClick',\r\n },\r\n //--- Perspective View ---------------------------------------------------\r\n {\r\n buttonId: 'cmButPerspectiveView',\r\n type: 'button',\r\n iconClass: 'ui-icon-perspective-view',\r\n text: '_Perspective_view_center_menu_tooltip',\r\n tooltip: '_Perspective_view_center_menu_tooltip',\r\n tooltipDisabled: '_Perspective_view_center_menu_tooltip',\r\n actionClick: 'centerMenuPerspectiveViewClick',\r\n },\r\n //--- Separator ---------------------------------------------------\r\n {\r\n buttonId: 'toolhubSubmenuSeparatorId1',\r\n type: 'separator',\r\n iconClass: 'center-sub-menu-button-icon toolhub-submenu-separator',\r\n text: '',\r\n tooltip: '',\r\n tooltipDisabled: '',\r\n actionClick: '',\r\n },\r\n //--- Toggle button perspective/orthogonal projection --------------------\r\n {\r\n buttonId: 'cmButToggleProjection',\r\n type: 'button',\r\n iconClass: 'ui-icon-orthographic-camera-projection',\r\n text: '_Orthographic_projection_center_menu_tooltip',\r\n tooltip: '_Orthographic_projection_center_menu_tooltip',\r\n tooltipDisabled: '_Orthographic_projection_center_menu_tooltip',\r\n actionClick: 'centerMenuToggleProjection',\r\n },\r\n ]\r\n }\r\n ]\r\n\r\n // Set all tool hub items states to inactive and disabled. Host App must define states\r\n items.forEach(item => { item.active = false; item.disabled = true })\r\n\r\n return items;\r\n}\r\n\r\nconst DEFAULT_POSITION_LEFT = 350;\r\nconst DEFAULT_POSITION_TOP = 670;\r\n@Component({\r\n selector: 'lib-bimplus-tool-hub',\r\n imports: [\r\n TranslateModule,\r\n CommonModule,\r\n ToolHubItemComponent,\r\n ToolHubSubItemComponent,\r\n DraggableDirective\r\n ],\r\n providers: [TranslateService],\r\n templateUrl: './bimplus-tool-hub.component.html',\r\n styleUrl: './bimplus-tool-hub.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusToolHubComponent extends BimplusLocalizedWidgetComponent implements OnInit,AfterViewInit {\r\n private layoutManagerService = inject(LayoutManagerService);\r\n private resizeObserverService = inject(ResizeObserverService);\r\n private element = inject(ElementRef);\r\n\r\n constructor() {\r\n super();\r\n\r\n this.items = createDefaultItems();\r\n this._visualSettings = createDefaultVisualSettings();\r\n this._units = this.calculateCurrentMenuItemUnits();\r\n this._subMenuUnits = this.calculateCurrentSubMenuItemUnits();\r\n this._annularSector = SVGGenerator.generateAnnularSector(this._visualSettings);\r\n this._annularSectorBorder = SVGGenerator.generateAnnularSectorBorder(this._visualSettings);\r\n this._deadZoneAnnularSector = SVGGenerator.generateDeadZoneAnnularSector(this._visualSettings);\r\n\r\n }\r\n\r\n // #region public fields\r\n \r\n get itemStates(): Array<ToolHubItemStates> {\r\n return this._itemStates;\r\n }\r\n @Input() set itemStates(value: Array<ToolHubItemStates>) {\r\n this._itemStates = value;\r\n this.setItemStates(this._itemStates);\r\n }\r\n\r\n setItemStates(itemStates: Array<ToolHubItemStates>) {\r\n for (const itemState of itemStates) {\r\n const item = this._items.find(item => item.buttonId === itemState.buttonId);\r\n if (item) {\r\n if (itemState.active != undefined) {\r\n item.active = itemState.active;\r\n }\r\n if (itemState.disabled !== undefined) {\r\n item.disabled = itemState.disabled;\r\n }\r\n }\r\n }\r\n\r\n this._updateActivationState();\r\n }\r\n\r\n\r\n get items(): Array<ToolHubItem> {\r\n return this._items;\r\n }\r\n @Input() set items(value: Array<ToolHubItem>) {\r\n this._items = value;\r\n\r\n const buttonsLength = (this._items?.length) > 0 ? this._items.length : 1;\r\n const rootStyle = document?.documentElement?.style;\r\n if (rootStyle) {\r\n const menuItems = rootStyle.getPropertyValue(\"--menu-items\");\r\n if (parseInt(menuItems) !== buttonsLength) {\r\n rootStyle.setProperty(\"--menu-items\", buttonsLength.toString());\r\n }\r\n }\r\n\r\n // Transfer disabled states, which can defined by host app\r\n this.setItemStates(this._itemStates);\r\n }\r\n\r\n get activeSubItems(): Array<ToolHubSubItem> | null {\r\n return this._activeSubItems;\r\n }\r\n\r\n get isCollapsed(): boolean {\r\n return this._isCollapsed;\r\n }\r\n @Input({ transform: booleanAttribute })\r\n set isCollapsed(value: boolean) {\r\n this._isCollapsed = value;\r\n }\r\n\r\n get isPerspectiveProjection(): boolean {\r\n return this._isPerspectiveProjection;\r\n }\r\n @Input({ transform: booleanAttribute })\r\n set isPerspectiveProjection(value: boolean) {\r\n this._isPerspectiveProjection = value;\r\n }\r\n\r\n get units(): ToolHubItemUnits {\r\n return this._units;\r\n }\r\n\r\n get subMenuUnits(): ToolHubItemUnits {\r\n return this._subMenuUnits;\r\n }\r\n\r\n get annularSector(): string {\r\n return this._annularSector;\r\n }\r\n\r\n get annularSectorBorder(): string {\r\n return this._annularSectorBorder;\r\n }\r\n\r\n get deadZoneAnnularSector(): string {\r\n return this._deadZoneAnnularSector;\r\n }\r\n\r\n @Input({ transform: booleanAttribute }) isEmbedded: boolean = false;\r\n @Input({ transform: booleanAttribute }) isFocused: boolean = false;\r\n @Input({ transform: booleanAttribute }) isActive: boolean = true;\r\n @Output() itemClicked = new EventEmitter<string>();\r\n @Output() subItemClicked = new EventEmitter<string>();\r\n \r\n // Define event handler for reusing draggable also from resize parent \r\n //@Output() resizedragging = new EventEmitter<[number,number]>();\r\n\r\n private componentId = 'center-menu-fp-id';\r\n private subscription: Subscription | null = null; // Initialize to null\r\n\r\n ngOnInit():void{ \r\n this.layoutManagerService.registerObject(this.element,this.componentId,'#center-menu-fp-id',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\r\n this.layoutManagerService.registeredItems$.subscribe(items => {\r\n const layoutManagerItem = items.find(item => item.id === this.componentId);\r\n this.isCollapsed = Boolean(layoutManagerItem?.isCollapsed); \r\n });\r\n \r\n }\r\n \r\n ngAfterViewInit():void{\r\n // if the component wants to be registered in layout manager system\r\n // Subscribe to the observable\r\n this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\r\n this.handleParentAppRectSizeChange(value);\r\n });\r\n }\r\n \r\n // #endregion public fields\r\n \r\n // #region public methods\r\n public getSVGViewBox(): string {\r\n return SVGGenerator.getSVGViewBox(this._units);\r\n }\r\n\r\n public getSVGCenterMenuPath(): string {\r\n return SVGGenerator.getSVGCenterMenuPath(this._units);\r\n }\r\n\r\n public getSVGCenterMenuItemPath(): string {\r\n return SVGGenerator.getSVGCenterMenuItemPath(this._units);\r\n }\r\n\r\n public getSVGCenterSubMenuItemPath(): string {\r\n return SVGGenerator.getSVGCenterSubMenuItemPath(this._subMenuUnits);\r\n }\r\n\r\n public toggleMenu() {\r\n this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.componentId);\r\n setTimeout(()=>{\r\n this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,0,0,true); \r\n })\r\n }\r\n\r\n findToolHubItemById(id: string): ToolHubItem | undefined {\r\n return this._items.find(x => x.buttonId === id);\r\n }\r\n\r\n clickToolHubItem(action: string) {\r\n const item = this.findToolHubItemById(action);\r\n if (!item || item?.disabled) {\r\n return;\r\n }\r\n\r\n this.itemClicked.emit(action);\r\n }\r\n\r\n clickToolHubSubItem(action: string) {\r\n if (!this._activeSubItems) {\r\n return;\r\n }\r\n\r\n const item = this._activeSubItems.find(x => x.buttonId === action);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n this.subItemClicked.emit(action);\r\n this.closeActiveSubItemsView();\r\n }\r\n\r\n toggleToolHubItemActive(buttonId: string) {\r\n const item = this.findToolHubItemById(buttonId);\r\n if (!item || item.disabled) {\r\n return;\r\n }\r\n\r\n item.active = !item.active;\r\n\r\n this._updateActivationState();\r\n }\r\n\r\n toggleSubItemsView(buttonId: string) {\r\n const item = this.findToolHubItemById(buttonId);\r\n if (!item || item.disabled || !item.subItems) {\r\n return;\r\n }\r\n\r\n item.active = !item.active;\r\n if (item.active) {\r\n this._activeSubItemsView = item;\r\n this._activeSubItems = item.subItems;\r\n } else {\r\n this._activeSubItemsView = null;\r\n this._activeSubItems = null;\r\n }\r\n }\r\n\r\n toggleCameraProjection(buttonId: string) {\r\n if (!this._activeSubItems) {\r\n return;\r\n }\r\n\r\n const item = this._activeSubItems.find(x => x.buttonId === buttonId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n this.isPerspectiveProjection = !this.isPerspectiveProjection;\r\n\r\n item.iconClass = this.isPerspectiveProjection ? 'ui-icon-orthographic-camera-projection' : 'ui-icon-perspective-camera-projection';\r\n item.text = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n item.tooltip = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n item.tooltipDisabled = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n }\r\n\r\n closeActiveSubItemsView() {\r\n if (this._activeSubItemsView) {\r\n this._activeSubItemsView.active = false;\r\n this._activeSubItemsView = null;\r\n }\r\n this._activeSubItems = null;\r\n }\r\n\r\n setHoveredState(element: string, hovered: boolean) {\r\n const index = this._hoveredElements.indexOf(element);\r\n const storedCountHoverd = this._hoveredElements.length;\r\n\r\n if (index >= 0 && !hovered) {\r\n this._hoveredElements.splice(index, 1);\r\n }\r\n\r\n if (index < 0 && hovered) {\r\n this._hoveredElements.push(element);\r\n }\r\n\r\n if (storedCountHoverd > 0 && this._hoveredElements.length === 0) {\r\n\r\n // If hovered elements count reaches zero, check again a bit delayed. If nothing hovered at that time, close submenu\r\n setInterval(() => {\r\n if (this._hoveredElements.length === 0) {\r\n this.closeActiveSubItemsView();\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n private getSelector():string{\r\n return this.isCollapsed ? '#center-menu-controller':'.center-menu-fp';\r\n }\r\n\r\n dragElement(event: [number, number]): void {\r\n const deltaX1 = event[0];\r\n const deltaY1 = event[1]; \r\n this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,deltaX1,deltaY1) \r\n }\r\n\r\n onDragEnd(){\r\n this.layoutManagerService.handleDragEnd('center-menu-fp-id');\r\n }\r\n\r\n // #endregion public methods\r\n\r\n // #region private fields\r\n private _isCollapsed: boolean = false;\r\n private _itemStates: Array<ToolHubItemStates> = Array<ToolHubItemStates>();\r\n private _items: Array<ToolHubItem> = Array<ToolHubItem>();\r\n private _activeSubItemsView: ToolHubItem | null = null;\r\n private _activeSubItems: Array<ToolHubSubItem> | null = null;\r\n private _isPerspectiveProjection = true; // flag about perspective or orthographic camera projection\r\n private _visualSettings: ToolHubVisualSettings;\r\n private _units: ToolHubItemUnits;\r\n private _subMenuUnits: ToolHubItemUnits;\r\n private _annularSector: string;\r\n private _annularSectorBorder: string;\r\n private _deadZoneAnnularSector: string;\r\n private _hoveredElements: Array<string> = Array<string>();\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private calculateCurrentMenuItemUnits(): ToolHubItemUnits {\r\n return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, this._items.length, this.isEmbedded);\r\n }\r\n\r\n private calculateCurrentSubMenuItemUnits(): ToolHubItemUnits {\r\n return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, 20, this.isEmbedded);\r\n }\r\n\r\n private handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{\r\n this.layoutManagerService.checkPosition(this.componentId,this.getSelector(),parentRect,0,0,true); \r\n }\r\n\r\n private _oneOrMoreItemsActive(){\r\n for(const item of this.items){\r\n if(item.active === true)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _updateActivationState(){\r\n if(this._oneOrMoreItemsActive()){\r\n this.isActive = true;\r\n }else{\r\n this.isActive = false;\r\n }\r\n }\r\n // #region private methods\r\n}\r\n","<div class=\"center-menu\">\n <div\n class=\"center-menu-fp\"\n id=\"center-menu-fp-id\"\n [ngClass]=\"activeSubItems ? 'submenu-active' : ''\"\n >\n <div\n libDraggable\n id=\"center-menu-controller\"\n class=\"center-menu-controller dragger\"\n data-test=\"toolhub_controller\"\n [ngClass]=\"{\r\n opened: !isCollapsed,\r\n active: isActive\r\n }\"\r\n [title]=\"\r\n isCollapsed\r\n ? ('_Show_toolhub_tooltip' | translate)\r\n : ('_Minimize_toolhub_tooltip' | translate)\r\n \"\r\n (clicked)=\"toggleMenu()\"\n (dragging)=\"dragElement($event)\"\n (dragEnd) =\"onDragEnd()\"\n ></div>\n <div\n class=\"center-menu-circle-border-inner\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n ></div>\n <div\n class=\"center-menu-circle-border-outer\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('menuCircleBorderOuter', false)\"\n (mouseenter)=\"setHoveredState('menuCircleBorderOuter', true)\"\n ></div>\n <div\n libDraggable\n class=\"center-menu-circle\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('menuCircle', false)\"\n (mouseenter)=\"setHoveredState('menuCircle', true)\"\n (dragging)=\"dragElement($event)\"\n >\n @for (item of items; track item) {\n <lib-tool-hub-item\n libDraggable\n [attr.data-test]=\"'toolhub_item_' + item.buttonId\"\n [title]=\"item.tooltip | translate\"\n [item]=\"item\"\n [active]=\"!!item.active\"\n [isEnabled]=\"!item.disabled\"\n (clicked)=\"clickToolHubItem(item.buttonId)\"\n ></lib-tool-hub-item>\n }\n\n <svg\n class=\"centermenu-button-svg\"\n [attr.viewBox]=\"getSVGViewBox()\"\n fill=\"none\"\n >\n <clipPath id=\"svgCenterMenu\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterMenuPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterMenuItem\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterMenuItemPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterSubMenuItem\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"getSVGCenterSubMenuItemPath()\" fill=\"white\" />\n </clipPath>\n <clipPath id=\"svgCenterMenuSubMenu\" clipPathUnits=\"objectBoundingBox\">\n <path [attr.d]=\"annularSector\" fill=\"none\" />\n </clipPath>\n <clipPath\n id=\"svgCenterMenuSubMenuBorder\"\n clipPathUnits=\"objectBoundingBox\"\n >\n <path [attr.d]=\"annularSectorBorder\" fill=\"none\" />\n </clipPath>\n <clipPath\n id=\"svgCenterMenuSubMenuDeadZone\"\n clipPathUnits=\"objectBoundingBox\"\n >\n <path [attr.d]=\"deadZoneAnnularSector\" fill=\"none\" />\n </clipPath>\n </svg>\n </div>\n\n @if (activeSubItems) {\n <div\n class=\"center-menu-sub-menu-border\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('submenuBorder', false)\"\n (mouseenter)=\"setHoveredState('submenuBorder', true)\"\n ></div>\n <div\n class=\"center-menu-sub-menu\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('submenu', false)\"\n (mouseenter)=\"setHoveredState('submenu', true)\"\n >\n @for (item of activeSubItems; track item) {\n @if (item.type === 'button') {\n <lib-tool-hub-sub-item\n [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\n [title]=\"item.tooltip | translate\"\n [item]=\"item\"\n (click)=\"clickToolHubSubItem(item.buttonId)\"\n (keypress)=\"clickToolHubSubItem(item.buttonId)\"\n ></lib-tool-hub-sub-item>\n }\n <!-- this item is added as 6th but is moved back in less file to 5th position -->\n @if (item.type === 'separator') {\n <lib-tool-hub-sub-item\n [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\n [item]=\"item\"\n ></lib-tool-hub-sub-item>\n }\n }\n </div>\n <div\n class=\"center-menu-sub-menu-dead-zone\"\n [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n (mouseleave)=\"setHoveredState('deadZone', false)\"\n (mouseenter)=\"setHoveredState('deadZone', true)\"\n ></div>\n }\n </div>\n</div>\n","import { Directive, ElementRef, Output, EventEmitter, HostListener, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libClickOutside]',\r\n standalone: true\r\n})\r\nexport class ClickOutsideDirective {\r\n private elementRef = inject(ElementRef);\r\n\r\n @Output() public clickOutside = new EventEmitter<void>();\r\n\r\n @HostListener('document:click', ['$event'])\r\n public onClick(event: MouseEvent) {\r\n const targetElement = event.target as HTMLElement;\r\n const clickedInside = this.elementRef.nativeElement.contains(targetElement);\r\n if (!clickedInside) {\r\n this.clickOutside.emit();\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, booleanAttribute, ViewEncapsulation, ElementRef, EventEmitter, signal, model, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgStyle} from '@angular/common';\r\nimport { BimplusContextMenuItem, BimplusContextMenuPosition } from './bimplus-context-menu.interface';\r\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-context-menu',\r\n imports: [\r\n NgStyle,\r\n ClickOutsideDirective,\r\n ],\r\n templateUrl: './bimplus-context-menu.component.html',\r\n styleUrl: './bimplus-context-menu.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusContextMenuComponent {\r\n private readonly el = inject(ElementRef);\r\n\r\n @Output() triggerSelected = new EventEmitter();\r\n @Input({ transform: booleanAttribute }) showIcons: boolean = true;\r\n @Input() triggerTitle : string = \"\";\r\n\r\n protected readonly _showDropdown = signal<boolean>(false);\r\n protected _data?: object = undefined;;\r\n protected readonly _position = signal<BimplusContextMenuPosition>({\r\n posX: -2000,\r\n posY: -2000\r\n })\r\n private readonly _element: HTMLElement;\r\n private _interval: number | undefined;\r\n items = model<BimplusContextMenuItem[] | null | undefined>([]);\r\n\r\n constructor() {\r\n this._element = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n get data(): undefined | object {\r\n return this._data;\r\n }\r\n @Input() set data(data: object) {\r\n this._data = data;\r\n }\r\n\r\n protected _clickOutside() {\r\n this._stopTriggerPositionTracking();\r\n this._showDropdown.set(false);\r\n }\r\n\r\n protected _actionClick(item: BimplusContextMenuItem) {\r\n this._showDropdown.set(false);\r\n\r\n if(typeof item.disabled === 'function') {\r\n if(item.disabled?.(this._data)) {\r\n return;\r\n }\r\n item.action?.(this._data);\r\n return;\r\n }\r\n\r\n if(item.disabled) {\r\n return;\r\n }\r\n item.action?.(this._data);\r\n }\r\n\r\n protected _disabled(item: BimplusContextMenuItem): boolean {\r\n if(!item.disabled) {\r\n return false;\r\n }\r\n if(typeof item.disabled === 'function') {\r\n return item.disabled?.(this._data);\r\n }\r\n return item.disabled;\r\n }\r\n\r\n protected _calculateContextMenuPosition() {\r\n const _triggerElament = this._element.querySelector(\".context-menu-trigger\");\r\n if(!_triggerElament) {\r\n return;\r\n }\r\n\r\n const { right: posX, top: posY } = _triggerElament.getBoundingClientRect();\r\n this._position.set({ posX, posY });\r\n }\r\n\r\n protected _stopTriggerPositionTracking(): void {\r\n if(!this._interval){\r\n return;\r\n }\r\n\r\n clearInterval(this._interval);\r\n this._interval = undefined;\r\n }\r\n\r\n protected _startTriggerPositionTracking(): void {\r\n if(this._interval){\r\n return;\r\n }\r\n this._interval = setInterval(() => {\r\n this._calculateContextMenuPosition();\r\n }, 50) as unknown as number;\r\n }\r\n\r\n protected _toggleDropdown(event: Event) {\r\n this._showDropdown.update(value => !value);\r\n this._calculateContextMenuPosition();\r\n this._startTriggerPositionTracking();\r\n fireEvent(this, \"triggerSelected\");\r\n event.stopPropagation();\r\n }\r\n}\r\n","<div class=\"basic-context-menu\" libClickOutside (clickOutside)=\"_clickOutside()\">\r\n <div class=\"context-menu-trigger\" \r\n (click)=\"_toggleDropdown($event)\"\r\n (keypress)=\"_toggleDropdown($event)\"\r\n title=\"{{triggerTitle}}\"\r\n data-test=\"context-menu\"\r\n >\r\n @if (_showDropdown()) {\r\n <ul\r\n class=\"basic-context-menu__list\"\r\n data-test=\"basic-context-menu__list\"\r\n [ngStyle]=\"{\r\n 'top.px': _position().posY\r\n , 'left.px': _position().posX\r\n , 'minWidth.px': 125\r\n , 'backgroundColor': 'white'\r\n }\"\r\n >\r\n @for(item of items(); track item) {\r\n @if (item.id !== 'separator') {\r\n <li \r\n class=\"basic-context-menu__item\"\r\n data-test=\"basic-context-menu__item\"\r\n [class.basic-context-menu__item--disabled]=\"_disabled(item)\"\r\n (click)=\"_actionClick(item)\"\r\n (keypress)=\"_actionClick(item)\"\r\n >\r\n @if (showIcons) {\r\n <div class=\"basic-context-menu__item__icon\" data-test=\"basic-context-menu__item__icon\" [style.background-image]=\"'url(' + item.icon + ')'\">\r\n </div>\r\n }\r\n <div class=\"basic-context-menu__item__label\" data-test=\"basic-context-menu__item__label\" title=\"{{item.tooltip ? item.tooltip : item.title}}\">\r\n {{item.title}}\r\n </div>\r\n </li>\r\n } @else {\r\n <div class=\"basic-context-menu__item__separator\" data-test=\"basic-context-menu__item__separator\"></div>\r\n }\r\n }\r\n </ul>\r\n }\r\n</div>\r\n","import { ElementRef, Component, OnInit, Input, OnChanges, SimpleChange, booleanAttribute, Output, EventEmitter, TemplateRef, input, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';\r\nimport { SelectionModel} from '@angular/cdk/collections';\r\nimport { CdkTreeModule, FlatTreeControl } from '@angular/cdk/tree';\r\nimport { CommonModule } from '@angular/common';\r\nimport { fireEvent } from '../../utils/utils';\r\nimport { TreeNode, FlatNode, FlatTreeContextMenus } from './bimplus-flat-tree.interface';\r\nimport { BimplusContextMenuComponent } from '../bimplus-context-menu/bimplus-context-menu.component';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\ninterface BimplusFlatTreeComponentAttribute {\r\n [key: string]: unknown; // Add index signature allowing string indexing\r\n //Other properties and methods...\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-flat-tree',\r\n imports: [MatTreeModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n CdkTreeModule,\r\n BimplusContextMenuComponent,\r\n CommonModule,\r\n DragDropModule\r\n ],\r\n templateUrl: './bimplus-flat-tree.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-flat-tree.component.less'\r\n})\r\n\r\nexport class BimplusFlatTreeComponent implements OnInit, OnChanges{\r\n private readonly el = inject(ElementRef);\r\n\r\n @Input() treeDataStringified: string | null = null;\r\n treeTitle = input<string | undefined>(undefined);\r\n @Input() paddingIndent : string = \"2.8rem\"\r\n @Input({ transform: booleanAttribute }) multiSelect: boolean = false;\r\n @Input({ transform: booleanAttribute }) oneLevelMultiSelect: boolean = false;\r\n @Input({ transform: booleanAttribute }) showFoldersIcons: boolean = false;\r\n @Input({ transform: booleanAttribute }) showObjectsIcons: boolean = false;\r\n @Input({ transform: booleanAttribute }) enableSelect: boolean = true;\r\n @Input({ transform: booleanAttribute }) enableParentHighlighting: boolean = true;\r\n @Input({ transform: booleanAttribute }) enableDragAndDrop: boolean = false;\r\n @Input() dataTestPrefix : string = \"\";\r\n @Input() contextMenus: FlatTreeContextMenus | null | undefined = null;\r\n @Input({ transform: booleanAttribute }) hasCheckBox1:boolean = false;\r\n @Input({ transform: booleanAttribute }) hasCheckBox2:boolean = false;\r\n\r\n get treeData() : Array<TreeNode>{\r\n return this._dataSource.data;\r\n }\r\n\r\n @Input() set treeData(data: Array<TreeNode>) {\r\n this.treeDataStringified = null;\r\n this._dataSource.data = data;\r\n }\r\n customNodeTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n @Output() selectedNodes = new EventEmitter<FlatNode[]>();\r\n @Output() checked1Nodes = new EventEmitter<FlatNode[]>();\r\n @Output() checked2Nodes = new EventEmitter<FlatNode[]>();\r\n\r\n private _selectionList: SelectionModel<FlatNode> | undefined = undefined;\r\n\r\n\r\n ngOnInit(): void {\r\n const element = this.el.nativeElement;\r\n if (element) {\r\n (element as unknown as BimplusFlatTreeComponentAttribute)['get_node'] = this.get_node.bind(this);\r\n (element as unknown as BimplusFlatTreeComponentAttribute)['select_node'] = this.select_node.bind(this);\r\n }\r\n\r\n this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\r\n if(this.treeDataStringified){\r\n this._setNewData(this.treeDataStringified)\r\n }\r\n }\r\n\r\n public expandTree(){\r\n this._treeControl.expandAll();\r\n }\r\n\r\n private _getNode(id: string, nodes: Array<TreeNode>): TreeNode | null {\r\n for(const node of nodes) {\r\n if(node.id === id) {\r\n return node;\r\n }\r\n if(node.children) {\r\n const _node: TreeNode | null = this._getNode(id, node.children);\r\n if(_node) {\r\n return _node;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public get_node(id: { id: string } | string, getDOMElement: boolean = false): TreeNode | Element | null {\r\n if(typeof id === 'string') {\r\n return this._getNode(id, this._dataSource.data);\r\n }\r\n if(getDOMElement) {\r\n const _element: Element = this.el.nativeElement.querySelector(`[node-id='${id.id}']`);\r\n return _element;\r\n }\r\n return this._getNode(id.id, this._dataSource.data);\r\n }\r\n\r\n public select_node(id: string, skipEvent: boolean = false) {\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return;\r\n }\r\n\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\r\n if(this._selectionList.selected[0].parent !== node.parent) {\r\n this._selectionList.clear();\r\n }\r\n }\r\n\r\n if(this._selectionList.isSelected(node)) {\r\n return;\r\n }\r\n\r\n this._selectionList.select(node);\r\n if(!this.multiSelect && !this.oneLevelMultiSelect && !skipEvent) {\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n return;\r\n }\r\n\r\n if(!this.oneLevelMultiSelect) {\r\n this._toggleDescendantsNodes(node);\r\n }\r\n\r\n if(this.enableParentHighlighting) {\r\n this._updateParentSelections(node);\r\n }\r\n\r\n if(!skipEvent){\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n }\r\n\r\n }\r\n\r\n public reset_selection(){\r\n this._selectionList?.clear();\r\n }\r\n\r\n public expand_node(id : string){\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return;\r\n }\r\n\r\n this._treeControl.expand(node);\r\n }\r\n\r\n public is_expanded(id : string){\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return false;\r\n }\r\n\r\n return this._treeControl.isExpanded(node);\r\n }\r\n\r\n public is_selected(id : string){\r\n if(!this._selectionList)\r\n return;\r\n\r\n const node = this._treeControl.dataNodes.find(n => n.id === id);\r\n if(!node) {\r\n return false;\r\n }\r\n\r\n return this._selectionList?.isSelected(node);\r\n }\r\n\r\n private _setNewData(treeDataStringified: string): void {\r\n const _tree_data = JSON.parse(treeDataStringified);\r\n this._dataSource.data = _tree_data ?? [];\r\n }\r\n\r\n private _changedTreeData(change: SimpleChange) {\r\n this._setNewData(change.currentValue)\r\n }\r\n\r\n ngOnChanges(changes: { [propKey: string]: SimpleChange }): void {\r\n if(changes['multiSelect'] || changes['oneLevelMultiSelect']) {\r\n this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\r\n }\r\n if(changes['treeDataStringified']) {\r\n this._changedTreeData(changes['treeDataStringified'])\r\n }\r\n }\r\n\r\n private _transformer = (node: TreeNode, level: number): FlatNode => {\r\n return {\r\n expandable: node.children !== undefined && node.children.length > 0,\r\n children_count: node.children?.length,\r\n name: node.name,\r\n id: node.id,\r\n level: level,\r\n parent: node.parent,\r\n nodeType: node.nodeType,\r\n isChecked1: true,\r\n isChecked2: true,\r\n isUndetermined1: false,\r\n isUndetermined2: false\r\n };\r\n };\r\n\r\n protected _treeControl = new FlatTreeControl<FlatNode>(\r\n node => node.level,\r\n node => node.expandable,\r\n );\r\n\r\n protected _treeFlattener = new MatTreeFlattener(\r\n this._transformer,\r\n node => node.level,\r\n node => node.expandable,\r\n node => node.children\r\n );\r\n\r\n protected _dataSource = new MatTreeFlatDataSource(this._treeControl, this._treeFlattener);\r\n protected _isExpandable = (_: number, node: FlatNode) => node.expandable;\r\n protected _isCustomNodeType(node: FlatNode): boolean{\r\n return node.nodeType != undefined && node.nodeType != \"\";\r\n }\r\n\r\n protected _hasChildren(node: FlatNode): boolean {\r\n if(!node.expandable) {\r\n return false;\r\n }\r\n if(node.children_count === undefined) {\r\n return false\r\n }\r\n return node.children_count > 0\r\n }\r\n\r\n protected _descendantsAllSelected(node: FlatNode): boolean {\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n\r\n const _selectionList: SelectionModel<FlatNode> = this._selectionList;\r\n\r\n const _descendants = this._treeControl.getDescendants(node);\r\n if(_descendants.length === 0) {\r\n return true;\r\n }\r\n const _descAllSelected = _descendants.length > 0 && _descendants.every((child) => {\r\n return _selectionList.isSelected(child);\r\n });\r\n return _descAllSelected;\r\n }\r\n\r\n protected _descendantsPartiallySelected(node: FlatNode): boolean {\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n const _selectionList: SelectionModel<FlatNode> = this._selectionList;\r\n\r\n const _descendants = this._treeControl.getDescendants(node);\r\n const _result = _descendants.some((child) => {\r\n return _selectionList.isSelected(child)\r\n });\r\n return _result && !this._descendantsAllSelected(node);\r\n }\r\n\r\n private _toggleDescendantsNodes(node: FlatNode) {\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n const _isNodeSelected = this._selectionList.isSelected(node);\r\n if(_isNodeSelected) {\r\n this._selectionList.select(...this._treeControl.getDescendants(node));\r\n }\r\n else {\r\n this._selectionList.deselect(...this._treeControl.getDescendants(node));\r\n }\r\n }\r\n\r\n private _updateParentSelections(node: FlatNode) {\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n let _parentId = node.parent;\r\n let _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId)\r\n while(_parentNode) {\r\n if(this._descendantsAllSelected(_parentNode)) {\r\n this._selectionList.select(_parentNode);\r\n }\r\n else{\r\n this._selectionList.deselect(_parentNode);\r\n }\r\n _parentId = _parentNode.parent;\r\n _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId);\r\n }\r\n }\r\n\r\n protected _toggleNode(event: Event, node: FlatNode) {\r\n if(!node) {\r\n return;\r\n }\r\n\r\n if(!this.enableSelect) {\r\n return;\r\n }\r\n\r\n if(!this._selectionList) {\r\n return;\r\n }\r\n\r\n // Check if event is a MouseEvent before accessing ctrlKey\r\n const isMouseEvent = event != null && event instanceof MouseEvent;\r\n if (isMouseEvent && !event?.ctrlKey) {\r\n this._selectionList.clear();\r\n }\r\n\r\n if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\r\n if(this._selectionList.selected[0].parent !== node.parent) {\r\n this._selectionList.clear();\r\n }\r\n }\r\n\r\n this._selectionList.toggle(node);\r\n if(!this.multiSelect && !this.oneLevelMultiSelect) {\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n return;\r\n }\r\n\r\n if(!this.oneLevelMultiSelect) {\r\n this._toggleDescendantsNodes(node);\r\n }\r\n\r\n if(this.enableParentHighlighting) {\r\n this._updateParentSelections(node);\r\n }\r\n\r\n fireEvent(this, \"selectedNodes\", this._selectionList.selected );\r\n }\r\n\r\n protected _isSelected(node: FlatNode): boolean{\r\n if(!this._selectionList) {\r\n return false;\r\n }\r\n return this._selectionList?.isSelected(node);\r\n }\r\n \r\n protected _toggleCheckBox1( event:Event,node: FlatNode) { \r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n node.isChecked1 = !node.isChecked1;\r\n if(node.expandable){\r\n this._treeControl.getDescendants(node).forEach(n => {\r\n n.isChecked1 = node.isChecked1;\r\n });\r\n }\r\n node.isUndetermined1 = false;\r\n this.checkUndetermined(node,1);\r\n fireEvent(this, \"checked1Nodes\", [node]);\r\n }\r\n \r\n protected _toggleCheckBox2(event:Event, node: FlatNode) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n node.isChecked2 = !node.isChecked2;\r\n if(node.expandable){\r\n this._treeControl.getDescendants(node).forEach(n => {\r\n n.isChecked2 = node.isChecked2;\r\n });\r\n }\r\n node.isUndetermined2 = false;\r\n this.checkUndetermined(node,2);\r\n fireEvent(this, \"checked2Nodes\", [node]);\r\n }\r\n \r\n //simplified version of checkUndetermined\r\n checkUndetermined(node:FlatNode,checkbox: number){\r\n if(!this.hasCheckBox1 && checkbox === 1){\r\n return;\r\n }\r\n if(!this.hasCheckBox2 && checkbox === 2){\r\n return;\r\n }\r\n if(!node.parent){\r\n return;\r\n }\r\n let myNode = node; \r\n while(myNode && myNode.parent){\r\n const parentNode = this._treeControl.dataNodes.find(n => n.id === myNode.parent); \r\n if(!parentNode){\r\n return;\r\n }\r\n let checked = 0;\r\n let unchecked = 0; \r\n let undetermined = false;\r\n this._treeControl.getDescendants(parentNode).forEach(n => {\r\n if(checkbox === 1 ? n.isChecked1: n.isChecked2){ \r\n checked++;\r\n } else {\r\n unchecked++;\r\n }\r\n if(checkbox === 1 ? n.isUndetermined1: n.isUndetermined2){ \r\n undetermined = true; \r\n }\r\n if(checked > 0 && unchecked > 0){\r\n undetermined = true; \r\n }\r\n });\r\n if(checkbox === 1 ){\r\n parentNode.isUndetermined1 = undetermined;\r\n parentNode.isChecked1 = !unchecked;\r\n } else {\r\n parentNode.isUndetermined2 = undetermined;\r\n parentNode.isChecked2 = !unchecked;\r\n }\r\n myNode = parentNode;\r\n };\r\n }\r\n protected _isUndetermined1(node: FlatNode): boolean{\r\n return node.isUndetermined1;\r\n }\r\n \r\n protected _isUndetermined2(node: FlatNode): boolean{\r\n return node.isUndetermined2;\r\n }\r\n\r\n protected _isChecked1(node: FlatNode): boolean{ \r\n return node.isChecked1;\r\n }\r\n protected _isChecked2(node: FlatNode): boolean{ \r\n return node.isChecked2;\r\n }\r\n}\r\n","<div class=\"tree-container\">\r\n @if (treeTitle(); as treeTitle) {\r\n <div class=\"tree-title\">{{treeTitle}}</div>\r\n }\r\n <cdk-tree [dataSource]=\"_dataSource\" [treeControl]=\"_treeControl\">\r\n <!-- This is the tree node template for leaf nodes -->\r\n <cdk-tree-node\r\n [matTreeNodePaddingIndent]=\"paddingIndent\"\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodePadding\r\n (click)=\"_toggleNode($event, node)\"\r\n (keypress)=\"_toggleNode($event, node)\"\r\n class=\"object-node\"\r\n [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [attr.data-test]=\"dataTestPrefix + node.id\"\r\n [title]=\"node.name\"\r\n [attr.node-id]=\"node.id\"\r\n >\r\n <!-- use a disabled button to provide padding for tree leaf -->\r\n <button mat-icon-button disabled>\r\n </button>\r\n @if (customNodeTemplate() && _isCustomNodeType(node)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customNodeTemplate()\"\r\n [ngTemplateOutletContext]=\"{node:node}\">\r\n </ng-container>\r\n }@else{\r\n @if (showObjectsIcons) {\r\n <div class=\"icon object-icon\">\r\n </div>\r\n }\r\n <span\r\n class=\"node-label\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n >\r\n <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\r\n <div>\r\n {{node.name}}\r\n </div>\r\n </span>\r\n }\r\n @if (contextMenus?.objectContextMenuitems?.length) {\r\n <lib-bimplus-context-menu\r\n [items]=\"$safeNavigationMigration(contextMenus?.objectContextMenuitems)\"\r\n [data]=\"node\"\r\n (triggerSelected)=\"_toggleNode($event, node)\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n @if(hasCheckBox1){\r\n <div\r\n class=\"custom-checkbox1\"\r\n [ngClass]=\"{ 'icon-checked': _isChecked1(node), 'icon-unchecked': !_isChecked1(node) }\"\r\n (click)=\"_toggleCheckBox1($event,node)\"\r\n (keypress)=\"_toggleCheckBox1($event,node)\"\r\n ></div>\r\n }\r\n @if(hasCheckBox2){\r\n <div\r\n class=\"custom-checkbox2\"\r\n [ngClass]=\"{ 'icon-checked': _isChecked2(node), 'icon-unchecked': !_isChecked2(node) }\"\r\n (click)=\"_toggleCheckBox2($event,node)\"\r\n (keypress)=\"_toggleCheckBox2($event,node)\"\r\n ></div>\r\n }\r\n </cdk-tree-node>\r\n <!-- This is the tree node template for expandable nodes -->\r\n <cdk-tree-node [matTreeNodePaddingIndent]=\"paddingIndent\"\r\n *matTreeNodeDef=\"let node;when: _isExpandable\"\r\n matTreeNodePadding\r\n (click)=\"_toggleNode($event, node)\"\r\n (keypress)=\"_toggleNode($event, node)\"\r\n class=\"folder-node\"\r\n [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [attr.data-test]=\"dataTestPrefix + node.id\"\r\n [title]=\"node.name\"\r\n [attr.node-id]=\"node.id\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <div\r\n class=\"icon expand-collapse-icon\"\r\n [class.expand-more-icon]=\"_hasChildren(node) && !_treeControl.isExpanded(node)\"\r\n [class.collapse-icon]=\"_hasChildren(node) && _treeControl.isExpanded(node)\"\r\n >\r\n </div>\r\n </button>\r\n @if (customNodeTemplate() && _isCustomNodeType(node)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"customNodeTemplate()\"\r\n [ngTemplateOutletContext]=\"{node:node}\">\r\n </ng-container>\r\n }@else{\r\n @if (showFoldersIcons) {\r\n <div class=\"icon folder-icon\">\r\n </div>\r\n }\r\n <span class=\"node-label\"\r\n [class.selected-node]=\"_isSelected(node)\"\r\n [class.selected-all-descendants-nodes]=\"_descendantsAllSelected(node) && _isSelected(node) && enableParentHighlighting\"\r\n [class.selected-partially-descendants-nodes]=\"_descendantsPartiallySelected(node) && enableParentHighlighting\"\r\n >\r\n <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\r\n <div class=\"node-label\">\r\n {{node.name}}\r\n </div>\r\n </span>\r\n }\r\n @if (contextMenus?.folderContextMenuitems?.length) {\r\n <lib-bimplus-context-menu\r\n [items]=\"$safeNavigationMigration(contextMenus?.folderContextMenuitems)\"\r\n [data]=\"node\"\r\n (triggerSelected)=\"_toggleNode($event, node)\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n\r\n @if(hasCheckBox1){\r\n <div\r\n class=\"custom-checkbox1\"\r\n [ngClass]=\"{\r\n 'icon-undetermined': _isUndetermined1(node),\r\n 'icon-checked': !_isUndetermined1(node) && _isChecked1(node),\r\n 'icon-unchecked': !_isUndetermined1(node) && !_isChecked1(node)\r\n }\"\r\n (click)=\"_toggleCheckBox1($event,node)\"\r\n (keypress)=\"_toggleCheckBox1($event,node)\"\r\n ></div>\r\n }\r\n @if(hasCheckBox2){\r\n <div\r\n class=\"custom-checkbox2\"\r\n [ngClass]=\"{\r\n 'icon-undetermined': _isUndetermined2(node),\r\n 'icon-checked': !_isUndetermined2(node) && _isChecked2(node),\r\n 'icon-unchecked': !_isUndetermined2(node) && !_isChecked2(node)\r\n }\"\r\n (click)=\"_toggleCheckBox2($event,node)\"\r\n (keypress)=\"_toggleCheckBox2($event,node)\"\r\n ></div>\r\n }\r\n </cdk-tree-node>\r\n </cdk-tree>\r\n</div>\r\n","\r\nexport interface FilterType{\r\n id: string,\r\n name: string\r\n}\r\n\r\nexport interface FilterCriterium{\r\n name : string,\r\n value? : string | number | boolean | null | undefined,\r\n namedValue? : string, // display name of value in UI\r\n id? : string,\r\n subString : string,\r\n}\r\n\r\nexport enum FilterCriteriaSelectionMode{\r\n None,\r\n SelectObjectProperties,\r\n SelectAttributes\r\n} \r\n\r\nexport const MaxFilterCriteria = 5;","import { Component, EventEmitter, HostBinding, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FilterCriterium } from '../bimplus-object-navigator.interface';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule} from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-filter-criterium',\r\n imports: [TranslateModule],\r\n templateUrl: './filter-criterium.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './filter-criterium.component.less'\r\n})\r\nexport class FilterCriteriumComponent extends BimplusLocalizedWidgetComponent {\r\n\r\n constructor (){\r\n super();\r\n }\r\n\r\n // #region public fields\r\n @Input()\r\n criterium : FilterCriterium = { name : \"\", subString:\"\"}\r\n\r\n @HostBinding('style.margin-left.em') @Input() indent: number = 0;\r\n\r\n @Output() deleteCriterium = new EventEmitter<void>();\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n clickedDelete(){\r\n this.deleteCriterium.emit();\r\n }\r\n // #endregion public methods\r\n}\r\n","<div class=\"filter-criterium-row\">\r\n <span class=\"filter-criterium-item\">\r\n {{ criterium.name }}\r\n @if(criterium.namedValue) { &nbsp;&#40;{{ criterium.namedValue }}&#41; }\r\n </span>\r\n <div\r\n class=\"filter-criterium-icon-delete\"\r\n (click)=\"clickedDelete()\"\r\n (keypress)=\"clickedDelete()\"\r\n ></div>\r\n</div>\r\n","import { Component, computed, EventEmitter, input, Input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { ObjectStructureNode } from './bimplus-object-structure.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-structure',\r\n imports: [BimplusFlatTreeComponent],\r\n templateUrl: './bimplus-object-structure.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-object-structure.component.less'\r\n})\r\nexport class BimplusObjectStructureComponent{\r\n @Input() hasCheckBox1:boolean = false;\r\n @Input() hasCheckBox2:boolean = false;\r\n \r\n objectStructure = input<ObjectStructureNode>({\r\n id : \"\",\r\n name : \"\",\r\n parent: \"\",\r\n visible: true,\r\n opaque: true\r\n });\r\n\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n \r\n private _convertObjectStructureNodeToTreeNode(node : ObjectStructureNode) : TreeNode{\r\n\r\n const treeNode : TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent \r\n };\r\n\r\n if(node.children){\r\n treeNode.children = [];\r\n for(const child of node.children){\r\n const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n readonly treeData = computed<TreeNode[]>(() => {\r\n const objectStructure = this.objectStructure();\r\n if(!objectStructure){\r\n return [];\r\n }\r\n\r\n const root = this._convertObjectStructureNodeToTreeNode(objectStructure);\r\n if(!root){\r\n return [];\r\n }\r\n\r\n return [root];\r\n })\r\n\r\n\r\n private _findNode(id:string, node : ObjectStructureNode) : ObjectStructureNode | null{\r\n if(node.id == id){\r\n return node;\r\n }\r\n\r\n if(node.children){\r\n for(const child of node.children){\r\n const res = this._findNode(id, child);\r\n if(res){\r\n return res;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n handleSelectedNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const selectedNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(selectedNode){\r\n this.nodeSelected.emit(selectedNode);\r\n }\r\n } \r\n }\r\n \r\n handleVisibleNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const visibleNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(visibleNode){\r\n const outpuData:ObjectStructureNode ={\r\n name:visibleNode.name,\r\n parent: visibleNode.parent, \r\n id: visibleNode.id,\r\n visible: nodes[0].isChecked2,\r\n opaque: nodes[0].isChecked1,\r\n }\r\n this.nodeVisible.emit(outpuData);\r\n }\r\n } \r\n }\r\n \r\n handleOpaqueNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const opaqueNode = this._findNode(nodes[0].id, this.objectStructure());\r\n if(opaqueNode){\r\n const outpuData:ObjectStructureNode ={\r\n name:opaqueNode.name,\r\n parent: opaqueNode.parent, \r\n id: opaqueNode.id,\r\n visible: nodes[0].isChecked2,\r\n opaque: nodes[0].isChecked1,\r\n }\r\n this.nodeOpaque.emit(outpuData);\r\n }\r\n } \r\n }\r\n\r\n expandTree(){\r\n this.treeComponent?.expandTree();\r\n }\r\n\r\n @Output() nodeSelected = new EventEmitter<ObjectStructureNode>();\r\n @Output() nodeVisible = new EventEmitter<ObjectStructureNode>();\r\n @Output() nodeOpaque = new EventEmitter<ObjectStructureNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData()\"\r\n enableParentHighlighting=\"false\"\r\n (selectedNodes) = \"handleSelectedNodes($event)\"\r\n (checked2Nodes) = \"handleVisibleNodes($event)\"\r\n (checked1Nodes) = \"handleOpaqueNodes($event)\"\r\n dataTestPrefix=\"object-structure-tree-\"\r\n [hasCheckBox1]=\"hasCheckBox1\"\r\n [hasCheckBox2]=\"hasCheckBox2\"\r\n></lib-bimplus-flat-tree>\r\n","import { Component, computed, EventEmitter, input, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { ComplexPropertiesNode } from './bimplus-object-complex-properties.interface';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-complex-properties',\r\n imports: [BimplusFlatTreeComponent],\r\n templateUrl: './bimplus-object-complex-properties.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-object-complex-properties.component.less'\r\n})\r\nexport class BimplusObjectComplexPropertiesComponent {\r\n complexProperties = input<ComplexPropertiesNode>({\r\n id: \"\",\r\n name: \"\",\r\n parent: \"\"\r\n });\r\n\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n readonly treeData = computed<TreeNode[]>(() => {\r\n const complexProperties = this.complexProperties();\r\n if(!complexProperties) {\r\n return [];\r\n }\r\n\r\n const root = this._convertObjectStructureNodeToTreeNode(complexProperties);\r\n if(!root) {\r\n return [];\r\n }\r\n\r\n return [root];\r\n })\r\n\r\n private _convertObjectStructureNodeToTreeNode(node : ComplexPropertiesNode) : TreeNode{\r\n\r\n const treeNode : TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent \r\n };\r\n\r\n if(node.children){\r\n treeNode.children = [];\r\n for(const child of node.children){\r\n const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n\r\n private _findNode(id:string, node : ComplexPropertiesNode) : ComplexPropertiesNode | null{\r\n if(node.id == id){\r\n return node;\r\n }\r\n\r\n if(node.children){\r\n for(const child of node.children){\r\n const res = this._findNode(id, child);\r\n if(res){\r\n return res;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n handleSelectedNodes(nodes : FlatNode[]){\r\n if(nodes.length === 1){\r\n const selectedNode = this._findNode(nodes[0].id, this.complexProperties());\r\n if(selectedNode){\r\n this.nodeSelected.emit(selectedNode);\r\n }\r\n } \r\n }\r\n\r\n expandTree(){\r\n this.treeComponent?.expandTree();\r\n }\r\n\r\n @Output() nodeSelected = new EventEmitter<ComplexPropertiesNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData()\"\r\n enableParentHighlighting=\"false\"\r\n (selectedNodes)=\"handleSelectedNodes($event)\"\r\n dataTestPrefix=\"object-complex-properties-tree-\"\r\n></lib-bimplus-flat-tree>\r\n","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ObjectStructureNode{\r\n id: string;\r\n children? : ObjectStructureNode[];\r\n name: string;\r\n parent: string;\r\n visible: boolean;\r\n opaque: boolean;\r\n}\r\n\r\nexport class ObjectStructureNodeBuilder{\r\n static createFromResponse(response : WebSdk.ObjectTopologyResponse) : ObjectStructureNode{\r\n const node : ObjectStructureNode = {\r\n id : response.id,\r\n name : response.name ? `${response.type}(${response.name})` : response.type,\r\n parent : response.parent,\r\n visible : true,\r\n opaque : true\r\n }\r\n\r\n if(response.children){\r\n node.children = [];\r\n for(const child of response.children){\r\n node.children.push(ObjectStructureNodeBuilder.createFromResponse(child as WebSdk.ObjectTopologyResponse));\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n}","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ComplexPropertiesNode{\r\n id: string;\r\n children? : ComplexPropertiesNode[];\r\n name: string;\r\n parent: string;\r\n}\r\n\r\nexport class ComplexPropertiesNodeBuilder{\r\n static createFromResponse(response : WebSdk.ObjectComplexPropertyTopologyResponse) : ComplexPropertiesNode{\r\n const node : ComplexPropertiesNode = {\r\n id : response.id,\r\n name : response.type ? response.type : response.name,\r\n parent : response.parent\r\n }\r\n\r\n if(response.children){\r\n node.children = [];\r\n for(const child of response.children){\r\n node.children.push(ComplexPropertiesNodeBuilder.createFromResponse(child as WebSdk.ObjectComplexPropertyTopologyResponse));\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'formatValue',\r\n standalone: true\r\n})\r\nexport class FormatValuePipe implements PipeTransform {\r\n transform(value: number | string | boolean | null | undefined): string {\r\n if (value === null || value === undefined) {\r\n return '[null]';\r\n } else if (value === '') {\r\n return '[empty]';\r\n } else if (typeof value === 'boolean') {\r\n return value ? 'TRUE' : 'FALSE';\r\n }\r\n return value.toString(); // Return the value as a string\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport moment from 'moment';\r\n\r\n@Pipe({\r\n name: 'DateTime',\r\n standalone: true,\r\n})\r\nexport class DateTimePipe implements PipeTransform {\r\n transform(value: string, format: string = \"L\"): string {\r\n // This UTC date/time 2024-12-11T23:00:00+00:00\r\n // gets transformed in Germany with timezone shift of +1 by\r\n // moment(value).format(format) ==> 12/12/2024\r\n // and by\r\n // moment.utc(value).format(format) ==> 12/11/2024\r\n //\r\n const date = moment(value).format(format);\r\n return date;\r\n }\r\n}","import { Component, EventEmitter, Input, OnInit, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject, from } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { ExpansionPanelComponent } from '../../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../../expansion-panel-header/expansion-panel-header.component';\r\nimport { FilterCriterium, MaxFilterCriteria } from '../bimplus-object-navigator.interface';\r\nimport { BimplusObjectStructureComponent } from '../../bimplus-object-structure/bimplus-object-structure.component';\r\nimport { BimplusObjectComplexPropertiesComponent } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\r\nimport { ObjectStructureNode, ObjectStructureNodeBuilder } from '../../bimplus-object-structure/bimplus-object-structure.interface';\r\nimport { ComplexPropertiesNode, ComplexPropertiesNodeBuilder } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\r\nimport { CriteriaSelectObjectAttribute, CriteriaSelectObjectAttributeGroup } from './criteria-select-object-properties.interface';\r\nimport { FormatValuePipe } from '../../../pipes/format-value.pipe';\r\nimport { DateTimePipe } from '../../../pipes/datetime.pipe';\r\n\r\n@Component({\r\n selector: 'lib-criteria-select-object-properties',\r\n imports: [ExpansionPanelHeaderComponent, ExpansionPanelComponent, TranslateModule, BimplusObjectStructureComponent, BimplusObjectComplexPropertiesComponent],\r\n providers: [FormatValuePipe, DateTimePipe],\r\n templateUrl: './criteria-select-object-properties.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './criteria-select-object-properties.component.less'\r\n})\r\nexport class CriteriaSelectObjectPropertiesComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n private formatValuePipe = inject(FormatValuePipe);\r\n private datetimePipe = inject(DateTimePipe);\r\n\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this._currentPropertiesObjectId$.subscribe({\r\n next: (id) => {\r\n if (id) {\r\n this._createObjectProperties(id, this.revision)\r\n }\r\n }\r\n });\r\n\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._currentPropertiesObjectId$.next(id);\r\n this._createComplexPropertiestructure(id, this.revision);\r\n }\r\n });\r\n\r\n }\r\n\r\n @Input()\r\n api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._currentObjectId$.next(id);\r\n this._createObjectStructure(id, this.revision);\r\n\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n @Input()\r\n revision: number | undefined = undefined;\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n objectAttributeGroups: CriteriaSelectObjectAttributeGroup[] = [];\r\n\r\n MaxFilterCriteria = MaxFilterCriteria; // For exposure to template\r\n\r\n private _rootObjectId: string = \"\";\r\n\r\n @Input()\r\n set filterCriteria(criteria: FilterCriterium[]) {\r\n this._filterCriteria = criteria;\r\n this._syncAttributeStatesFromCriteria();\r\n }\r\n\r\n @Output() filterCriteriaChange = new EventEmitter<FilterCriterium[]>();\r\n\r\n get filterCriteria() {\r\n return this._filterCriteria;\r\n }\r\n\r\n private _filterCriteria: FilterCriterium[] = [];\r\n\r\n private _objectStructure: ObjectStructureNode | null = null;\r\n\r\n get objectStructure(): ObjectStructureNode | null {\r\n return this._objectStructure\r\n }\r\n\r\n private _complexProperties: ComplexPropertiesNode | null = null;\r\n\r\n get complexProperties(): ComplexPropertiesNode | null {\r\n return this._complexProperties;\r\n }\r\n\r\n toggleAttribute(attrib: CriteriaSelectObjectAttribute) {\r\n attrib.checked = !attrib.checked;\r\n if (attrib.checked === false) {\r\n attrib.valueChecked = false;\r\n }\r\n\r\n this.handleFilterCriteriumAttributeStateChange(attrib);\r\n }\r\n\r\n toggleAttributeValue(attrib: CriteriaSelectObjectAttribute) {\r\n attrib.valueChecked = !attrib.valueChecked;\r\n attrib.checked = attrib.valueChecked;\r\n\r\n this.handleFilterCriteriumAttributeStateChange(attrib);\r\n }\r\n\r\n _defineFilterString(attrib: CriteriaSelectObjectAttribute) {\r\n let substring = `[I][${attrib.id}].Value`;\r\n\r\n if (attrib.valueChecked) {\r\n substring += `[F][0]=${this.formatValuePipe.transform(attrib.value)}`;\r\n }\r\n return substring;\r\n }\r\n\r\n _addFilterCriteria(attrib: CriteriaSelectObjectAttribute) {\r\n // add a new entry\r\n this.filterCriteria.push({\r\n name: attrib.name,\r\n value: attrib.valueChecked ? attrib.value : undefined,\r\n namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n id: attrib.id,\r\n subString: this._defineFilterString(attrib),\r\n });\r\n }\r\n\r\n _updateFilterCriteria(attrib: CriteriaSelectObjectAttribute, index: number) {\r\n // update an existing entry\r\n this.filterCriteria[index] = {\r\n ...this.filterCriteria[index],\r\n name: attrib.name,\r\n value: attrib.valueChecked ? attrib.value : undefined,\r\n namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n subString: this._defineFilterString(attrib),\r\n };\r\n }\r\n\r\n // Helper function for rounding to specified decimals\r\n private roundToDecimal(value: number, decimal: number): number {\r\n const multiplier = Math.pow(10, decimal);\r\n return Math.round(value * multiplier) / multiplier;\r\n }\r\n\r\n titleForAttribute(attribute: CriteriaSelectObjectAttribute): string {\r\n // Translation moved to implementation to not run the translation \r\n // for many values which don't need it\r\n if (attribute.value === null || attribute.value === undefined) {\r\n return this.translateService.instant('_Not_defined');\r\n } else if (attribute.value === '') {\r\n return this.translateService.instant('_Empty_value');\r\n }\r\n return String(attribute.value);\r\n }\r\n\r\n normalizedValue(attribute: CriteriaSelectObjectAttribute, forFilterCriteria: boolean = false): string {\r\n // Translation moved to implementation to not run the translation \r\n // for many values which don't need it\r\n if (attribute.value === null || attribute.value === undefined) {\r\n return forFilterCriteria ? this.translateService.instant(\"_Not_defined\") : \"...\";\r\n }\r\n\r\n if (attribute.value === '') {\r\n return forFilterCriteria ? this.translateService.instant(\"_Empty_value\") : \"''\";\r\n }\r\n\r\n if (attribute?.control === \"Enumeration\" && attribute.enumValues) {\r\n const result: string = String(attribute.enumValues[Number(attribute.value)]);\r\n return result;\r\n }\r\n\r\n // Handle numeric rounding\r\n if (!forFilterCriteria &&\r\n attribute.type === 'double' &&\r\n attribute.decimal &&\r\n typeof (attribute.value) === 'number') {\r\n const roundedValue = this.roundToDecimal(attribute.value, attribute.decimal);\r\n return String(roundedValue);\r\n }\r\n\r\n if (attribute?.control === \"Checkbox\") {\r\n return (attribute.value === 1) ? \"True\" : \"False\";\r\n }\r\n\r\n // Handle datetime transformation\r\n if (attribute?.type === \"datetime\" && typeof (attribute.value) === 'string') {\r\n return this.datetimePipe.transform(attribute.value);\r\n }\r\n\r\n return String(attribute.value);\r\n }\r\n\r\n handleFilterCriteriumAttributeStateChange(attrib: CriteriaSelectObjectAttribute) {\r\n const index = this.filterCriteria.findIndex(x => x.id === attrib.id);\r\n // FILTER CRITERIA ALREADY EXISTS\r\n if (index >= 0) {\r\n if (attrib.checked === false && attrib.valueChecked === false) {\r\n // REMOVE\r\n // filterCriteria no longer used (left / right checkboxes not checked)\r\n this.filterCriteria.splice(index, 1);\r\n } else {\r\n // UPDATE\r\n // filterCriteria still used, but value should be used (right checkbox checked)\r\n this._updateFilterCriteria(attrib, index);\r\n }\r\n this.filterCriteriaChange.emit(this.filterCriteria);\r\n }\r\n // FILTER CRITERIA DOES NOT EXIST and MAX CRITERIA NOT REACHED\r\n else if (this.filterCriteria.length < MaxFilterCriteria) {\r\n // ADD\r\n this._addFilterCriteria(attrib);\r\n this.filterCriteriaChange.emit(this.filterCriteria);\r\n }\r\n }\r\n\r\n handleObjectStructureNodeSelected(node: ObjectStructureNode) {\r\n this._currentObjectId$.next(node.id);\r\n }\r\n\r\n handleComplexPropertyNodeSelected(node: ComplexPropertiesNode) {\r\n this._currentPropertiesObjectId$.next(node.id);\r\n }\r\n\r\n private _createObjectProperties(objectId: string, revision: number | undefined) {\r\n this._loadObjectProperties(objectId, revision)?.subscribe({\r\n\r\n // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\r\n // any for json response\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (propertiesData: any) => {\r\n \r\n this.objectAttributeGroups = this._createAttributeGroupsFromResponse(propertiesData);\r\n this._syncAttributeStatesFromCriteria();\r\n },\r\n error: () => {\r\n this.objectAttributeGroups = [];\r\n }\r\n }\r\n )\r\n\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _createAttributeGroupsFromResponse(propertiesData: any) {\r\n\r\n const groups: Array<CriteriaSelectObjectAttributeGroup> = [];\r\n let localizedAttribGroups = null;\r\n if (propertiesData.localizedAttributeGroups) {\r\n localizedAttribGroups = propertiesData.localizedAttributeGroups;\r\n }\r\n\r\n if (!propertiesData.attributes) {\r\n return groups;\r\n }\r\n\r\n const attribGroups = propertiesData.attributes;\r\n for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\r\n\r\n const newGroup: CriteriaSelectObjectAttributeGroup = {\r\n name: groupName,\r\n expanded: false,\r\n attributes: []\r\n };\r\n\r\n if (localizedAttribGroups?.[groupName]) {\r\n newGroup.name = localizedAttribGroups[groupName];\r\n }\r\n\r\n if (!attribsObject) {\r\n continue;\r\n }\r\n\r\n for (const attrib of Object.values(attribsObject)) {\r\n\r\n const newAttrib: CriteriaSelectObjectAttribute = {\r\n id: attrib.id,\r\n name: attrib.name,\r\n description: attrib.description,\r\n value: attrib.value,\r\n isChangeable: attrib.isChangeable,\r\n type: attrib.type,\r\n checked: false,\r\n valueChecked: false,\r\n group: attrib.group,\r\n }\r\n\r\n // Add attribute information which is not always present\r\n if (attrib.control) {\r\n newAttrib.control = attrib.control;\r\n }\r\n if (attrib.defaultValue) {\r\n newAttrib.defaultValue = attrib.defaultValue;\r\n }\r\n if (attrib.unit) {\r\n newAttrib.unit = attrib.unit;\r\n }\r\n if (attrib.decimal) {\r\n newAttrib.decimal = attrib.decimal;\r\n }\r\n if (attrib.enumdefinition) {\r\n newAttrib.enumValues = attrib.enumdefinition;\r\n }\r\n\r\n newGroup.attributes.push(newAttrib);\r\n }\r\n\r\n groups.push(newGroup);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n private _syncAttributeStatesFromCriteria() {\r\n this.objectAttributeGroups.forEach(group => {\r\n group.attributes.forEach(attrib => {\r\n const criteria = this._filterCriteria.find(x => x.id == attrib.id)\r\n if (criteria) {\r\n attrib.checked = true;\r\n attrib.valueChecked = criteria.value !== undefined;\r\n } else {\r\n attrib.checked = false;\r\n attrib.valueChecked = false;\r\n }\r\n })\r\n })\r\n }\r\n\r\n private _loadObjectProperties(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.get(objectId, revision, \"8\", undefined, false, undefined));\r\n }\r\n\r\n private _loadObjectStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.getTopology(objectId, revision, false, false, undefined));\r\n }\r\n\r\n private _loadObjectComplexPropertiesStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n return from(this.api.objects.getComplexPropertiesTopology(objectId, revision));\r\n }\r\n\r\n private _createComplexPropertiestructure(objectId: string, revision: number | undefined) {\r\n this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n const complexProps = ComplexPropertiesNodeBuilder.createFromResponse(structureData);\r\n if (complexProps?.children?.length) {\r\n this._complexProperties = complexProps;\r\n } else {\r\n this._complexProperties = null;\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n private _createObjectStructure(objectId: string, revision: number | undefined) {\r\n this._loadObjectStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n this._objectStructure = ObjectStructureNodeBuilder.createFromResponse(structureData);\r\n }\r\n }\r\n })\r\n }\r\n}\r\n","<!-- Object structure-->\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object structure\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n @if(objectStructure){\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n [hasCheckBox1]=\"false\"\r\n [hasCheckBox2]=\"false\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n >\r\n </lib-bimplus-object-structure>\r\n }\r\n</lib-expansion-panel>\r\n<!-- End Object structure-->\r\n\r\n<!-- Complex properties-->\r\n@if(complexProperties){\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object multiproperties tree\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n >\r\n </lib-bimplus-object-complex-properties>\r\n</lib-expansion-panel>\r\n}\r\n<!-- End Complex properties-->\r\n\r\n<!-- Properties list-->\r\n@if(objectAttributeGroups.length > 0){\r\n<lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-header\">\r\n {{ \"_Object properties\" | translate }}</span\r\n >\r\n </lib-expansion-panel-header>\r\n\r\n @for (attribGroup of objectAttributeGroups; track attribGroup) {\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"criteria-select-object-properties-group-header\">\r\n {{ attribGroup.name }}\r\n </span>\r\n </lib-expansion-panel-header>\r\n <div>\r\n @for (attrib of attribGroup.attributes; track attrib) {\r\n <div class=\"criteria-select-object-properties-attrib-row\">\r\n <div class=\"criteria-select-object-properties-attrib-row-content\">\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\r\n >\r\n <label\r\n class=\"criteria-select-object-properties-attrib-row-cell-label\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"attrib.checked\"\r\n [disabled]=\"\r\n filterCriteria.length === MaxFilterCriteria && !attrib.checked\r\n \"\r\n (click)=\"toggleAttribute(attrib)\"\r\n (keypress)=\"toggleAttribute(attrib)\"\r\n />\r\n <span></span>\r\n </label>\r\n <div class=\"criteria-select-object-properties-attrib-row-cell-text\">\r\n {{ attrib.name }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\r\n >\r\n <label\r\n class=\"criteria-select-object-properties-attrib-row-cell-label\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"attrib.valueChecked\"\r\n [disabled]=\"\r\n filterCriteria.length === MaxFilterCriteria && !attrib.checked\r\n \"\r\n (click)=\"toggleAttributeValue(attrib)\"\r\n (keypress)=\"toggleAttributeValue(attrib)\"\r\n />\r\n <span></span>\r\n </label>\r\n <div\r\n class=\"criteria-select-object-properties-attrib-row-cell-text\"\r\n title=\"{{ titleForAttribute(attrib) }}\"\r\n >\r\n {{ normalizedValue(attrib) }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </lib-expansion-panel>\r\n }\r\n</lib-expansion-panel>\r\n}\r\n<!-- End Properties list-->\r\n","import { AfterViewInit, Component, EventEmitter, Input, model, Output, ViewChild, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { BimplusOverlayMessageComponent } from '../../bimplus-overlay-message/bimplus-overlay-message.component';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n\r\ntype TreeNodesLookup = Record<string, TreeNode>;\r\ntype TreeNodeObjectCounts = Record<string, number>;\r\n\r\n@Component({\r\n selector: 'lib-object-filter-result',\r\n imports: [\r\n BimplusFlatTreeComponent,\r\n BimplusOverlayMessageComponent,\r\n ],\r\n templateUrl: './object-filter-result.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './object-filter-result.component.less'\r\n})\r\nexport class ObjectFilterResultComponent implements AfterViewInit {\r\n\r\n // #region public fields\r\n @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n @Input()\r\n set filterResult(res: WebSdk.ObjectFilterStructureResponse | null) {\r\n this._filterResult = res;\r\n this._updateTreeData();\r\n }\r\n\r\n @Input()\r\n set selectedObjects(selectedObjects: string[]) {\r\n this._selectedObjects = selectedObjects;\r\n this._syncSelectedObjects();\r\n }\r\n\r\n isFilterResultInvalid = model<boolean>(false);\r\n\r\n // User has clicked on close button of overlay message\r\n // Set the invalid filter back to false to remove overlay message\r\n public setFilterResultValid() {\r\n this.isFilterResultInvalid.set(false);\r\n }\r\n\r\n @Input() filterResultInvalidTitle: string = \"\";\r\n @Input() filterResultInvalidText: string = \"\";\r\n\r\n get treeData() {\r\n return this._treeData;\r\n }\r\n\r\n @Output() nodeSelectionChanged = new EventEmitter<string[]>();\r\n @Output() nodeDoubleClicked = new EventEmitter<string>();\r\n @Output() nodeMouseEntered = new EventEmitter<string>();\r\n @Output() nodeMouseLeft = new EventEmitter<string>();\r\n // #endregion public fields\r\n\r\n // #region public methods\r\n ngAfterViewInit(): void {\r\n if (this._treeData && this._treeData.length > 0) {\r\n this._expandToObjectLevel(this._treeData[0]);\r\n }\r\n }\r\n\r\n handleSelectedNodes(nodes: FlatNode[]) {\r\n this.nodeSelectionChanged.emit(nodes.map(x => x.id));\r\n }\r\n\r\n getNodeObjectCounter(id: string) {\r\n return this._treeNodeObjectCounts[id];\r\n }\r\n\r\n dblClickedObjectNode(node: TreeNode) {\r\n this.nodeDoubleClicked.emit(node.id);\r\n }\r\n\r\n mouseEnterObjectNode(node: TreeNode) {\r\n this.nodeMouseEntered.emit(node.id);\r\n }\r\n\r\n mouseLeaveObjectNode(node: TreeNode) {\r\n this.nodeMouseLeft.emit(node.id);\r\n }\r\n\r\n expandToObjectLevel() {\r\n if (this.treeData.length === 0)\r\n return;\r\n\r\n this._expandToObjectLevel(this._treeData[0]);\r\n }\r\n\r\n clearFilterResult() {\r\n this._filterResult = null;\r\n this._treeData = [];\r\n }\r\n // #endregion public methods\r\n\r\n // #region private fields\r\n private _filterResult: WebSdk.ObjectFilterStructureResponse | null = null;\r\n private _treeData: TreeNode[] = [];\r\n private _treeNodesLookup: TreeNodesLookup = {};\r\n private _treeNodeObjectCounts: TreeNodeObjectCounts = {};\r\n private _selectedObjects: string[] = [];\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private _syncSelectedObjects() {\r\n\r\n const nodes: TreeNode[] = []\r\n\r\n for (const id of this._selectedObjects) {\r\n const treeNode = this._treeNodesLookup[id];\r\n if (treeNode) {\r\n nodes.push(treeNode);\r\n }\r\n }\r\n\r\n this.treeComponent?.reset_selection();\r\n\r\n for (const node of nodes) {\r\n this.treeComponent?.select_node(node.id);\r\n }\r\n\r\n }\r\n\r\n private _updateObjectCounters() {\r\n this._treeNodeObjectCounts = {};\r\n this._countObjects(this.treeData[0]);\r\n }\r\n\r\n private _countObjects(node: TreeNode) {\r\n if (node.nodeType && node.nodeType === \"objectNode\")\r\n return 1;\r\n\r\n let count = 0;\r\n if (!node.children)\r\n return 0;\r\n\r\n for (const child of node.children) {\r\n if (!child)\r\n continue;\r\n\r\n count += this._countObjects(child);\r\n }\r\n\r\n this._treeNodeObjectCounts[node.id] = count;\r\n return count;\r\n }\r\n\r\n private _updateTreeData() {\r\n if (!this._filterResult) {\r\n return;\r\n }\r\n\r\n this._treeNodesLookup = {};\r\n this._treeData = [this._convertFilterResultToTreeNode(this._filterResult.structure, this._treeNodesLookup)];\r\n this._updateObjectCounters();\r\n }\r\n\r\n private _convertFilterResultToTreeNode(node: WebSdk.StructureNode, nodesLookup: TreeNodesLookup | undefined = undefined): TreeNode {\r\n\r\n const treeNode: TreeNode = {\r\n name: node.name,\r\n id: node.id,\r\n parent: node.parent\r\n };\r\n\r\n if (node.children) {\r\n treeNode.children = [];\r\n for (const child of node.children) {\r\n const childTreeNode = this._convertFilterResultToTreeNode(child, nodesLookup);\r\n treeNode.children.push(childTreeNode);\r\n }\r\n }\r\n\r\n if (!treeNode.parent) {\r\n treeNode.nodeType = \"rootNode\";\r\n } else if (node.type === \"Structure\") {\r\n treeNode.nodeType = \"structureNode\";\r\n } else {\r\n treeNode.nodeType = \"objectNode\"\r\n }\r\n\r\n if (nodesLookup) {\r\n nodesLookup[treeNode.id] = treeNode;\r\n }\r\n\r\n return treeNode;\r\n }\r\n\r\n private _expandToObjectLevel(node: TreeNode) {\r\n if (node.children) {\r\n for (const child of node.children) {\r\n if (child.nodeType && child.nodeType === \"objectNode\") {\r\n return;\r\n } else {\r\n this._expandToObjectLevel(child);\r\n }\r\n\r\n }\r\n }\r\n\r\n this.treeComponent?.expand_node(node.id);\r\n }\r\n // #endregion private methods\r\n\r\n}\r\n","<lib-bimplus-flat-tree\r\n paddingIndent=\"1.4rem\"\r\n [treeData]=\"treeData\"\r\n enableParentHighlighting=\"false\"\r\n oneLevelMultiSelect=\"false\"\r\n multiSelect=\"true\"\r\n dataTestPrefix=\"object-filter-result-tree-\"\r\n (selectedNodes)=\"handleSelectedNodes($event)\"\r\n [customNodeTemplate]=\"objFilterResultNode\"\r\n></lib-bimplus-flat-tree>\r\n\r\n@if(isFilterResultInvalid()){\r\n<div class=\"message-overlay\">\r\n <lib-bimplus-overlay-message\r\n [title]=\"filterResultInvalidTitle\"\r\n [message]=\"filterResultInvalidText\"\r\n (close)=\"setFilterResultValid()\"\r\n >\r\n </lib-bimplus-overlay-message>\r\n</div>\r\n}\r\n\r\n<ng-template #objFilterResultNode let-node=\"node\">\r\n @switch (node.nodeType) { @case (\"rootNode\") {\r\n <div class=\"object-navigator-filter-result-root-node noselect\">\r\n {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\r\n </div>\r\n } @case (\"structureNode\") {\r\n <div class=\"noselect\">\r\n {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\r\n </div>\r\n } @case (\"objectNode\") {\r\n <span class=\"noselect\">\r\n <div\r\n class=\"noselect\"\r\n (dblclick)=\"dblClickedObjectNode(node)\"\r\n (mouseenter)=\"mouseEnterObjectNode(node)\"\r\n (mouseleave)=\"mouseLeaveObjectNode(node)\"\r\n >\r\n {{ node.name }}\r\n </div>\r\n </span>\r\n } }\r\n</ng-template>\r\n","import { FilterCriterium } from \"../components/bimplus-object-navigator/bimplus-object-navigator.interface\";\r\n\r\nconst DivsionIDSubstring = 'tabAttribElement.DivisionID';\r\n\r\nexport class FilterString {\r\n\r\n constructor(filterString: string = \"\", maxFilterCriteria: number = 5) {\r\n this._filterString = filterString;\r\n this._maxFilterCriteria = maxFilterCriteria;\r\n }\r\n\r\n get filterString() {\r\n return this._filterString;\r\n }\r\n\r\n private _filterString: string = \"\";\r\n private _maxFilterCriteria: number = 5;\r\n\r\n fromFilterCriteria(criteria: FilterCriterium[]) {\r\n this._filterString = `[I]${DivsionIDSubstring}`;\r\n\r\n for (const criterium of criteria) {\r\n this._filterString += criterium.subString;\r\n }\r\n\r\n return this._filterString;\r\n }\r\n\r\n getReadableValuesFromFilterCriteria(criteria: FilterCriterium[]): Record<string, string> {\r\n const readableValues: Record<string, string> = {};\r\n for (const criterium of criteria) {\r\n if (criterium.id && criterium.name)\r\n readableValues[criterium.id] = criterium.name;\r\n }\r\n\r\n return readableValues;\r\n }\r\n\r\n toFilterCriteria(readableValues: Record<string, string> | undefined = undefined): FilterCriterium[] {\r\n const criteria: FilterCriterium[] = [];\r\n\r\n let firstModelIdCriteriaSkipped = false;\r\n\r\n const parts = this._filterString.split('[I]');\r\n for (const part of parts) {\r\n if (part.length === 0) {\r\n continue;\r\n }\r\n\r\n if (part.includes(DivsionIDSubstring) && !firstModelIdCriteriaSkipped) {\r\n firstModelIdCriteriaSkipped = true;\r\n continue;\r\n }\r\n\r\n criteria.push(this._parseFilterSubstring(part, readableValues));\r\n if (criteria.length === this._maxFilterCriteria) {\r\n break;\r\n }\r\n }\r\n\r\n return criteria;\r\n }\r\n\r\n private _parseFilterSubstring(subString: string, readableValues: Record<string, string> | undefined = undefined): FilterCriterium {\r\n let name = subString;\r\n let id: string | undefined = undefined;\r\n\r\n const indexOpenBrackets = subString.indexOf('[');\r\n const indexCloseBrackets = subString.indexOf(']');\r\n\r\n if (indexOpenBrackets >= 0 && indexCloseBrackets >= 0 && indexCloseBrackets > indexOpenBrackets) {\r\n const readableId = subString.slice(indexOpenBrackets + 1, indexCloseBrackets);\r\n id = readableId;\r\n if (readableId && readableValues) {\r\n const readableString = readableValues[readableId];\r\n if (readableString) {\r\n name = readableString;\r\n }\r\n }\r\n } else if (subString.includes('.')) {\r\n const splitted = subString.split('.');\r\n name = splitted[splitted.length - 1];\r\n }\r\n\r\n return {\r\n name: name,\r\n subString: \"[I]\" + subString,\r\n id: id\r\n }\r\n }\r\n\r\n}\r\n","import * as WebSdk from 'bimplus-websdk';\r\nimport { Observable, concatMap, from, map } from 'rxjs';\r\n\r\nexport class FilterStructureFetcher {\r\n\r\n static fetchObjectFilterStructureFromSelection(projectId: string, filter: WebSdk.ObjectFilter, selectionObject: WebSdk.ExportObject, api: WebSdk.Api): Observable<WebSdk.ObjectFilterStructureResponse> {\r\n const isTemporary = !filter.id;\r\n let filterId = filter.id ? filter.id : \"\";\r\n\r\n let observeable: Observable<WebSdk.ObjectFilterStructureResponse>;\r\n\r\n if (!isTemporary) {\r\n observeable = from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject))).pipe(\r\n concatMap(selectionObj => {\r\n if (!selectionObj?.id) {\r\n throw new Error('Failed to create selection object');\r\n }\r\n return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined));\r\n })\r\n )\r\n } else {\r\n observeable = from(api.objectFilters.post(JSON.stringify(filter), projectId)).pipe(\r\n concatMap(filterObj => {\r\n if (!filterObj?.id) {\r\n throw new Error('Failed to create temporary filter object');\r\n }\r\n\r\n filterId = filterObj.id;\r\n\r\n return from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject)));\r\n }),\r\n concatMap(selectionObj => {\r\n if (!selectionObj?.id) {\r\n throw new Error('Failed to create selection object');\r\n }\r\n return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined)).pipe(\r\n map((filterResult) => {\r\n api.objectFilters.delete(filterId);\r\n return filterResult;\r\n })\r\n );\r\n })\r\n )\r\n }\r\n return observeable;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject ,from } from 'rxjs';\r\nimport { CommonModule} from '@angular/common';\r\nimport { FilterCriteriaSelectionMode, FilterCriterium, FilterType, MaxFilterCriteria } from './bimplus-object-navigator.interface';\r\nimport { FilterCriteriumComponent } from './filter-criterium/filter-criterium.component';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\n\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { CriteriaSelectObjectPropertiesComponent } from './criteria-select-object-properties/criteria-select-object-properties.component';\r\nimport { ObjectFilterResultComponent } from './object-filter-result/object-filter-result.component';\r\nimport { BimplusContextMenuComponent } from '../bimplus-context-menu/bimplus-context-menu.component'\r\nimport { BimplusContextMenuItem } from '../bimplus-context-menu/bimplus-context-menu.interface';\r\nimport { FilterString } from '../../utils/filterString';\r\nimport { FilterStructureFetcher } from '../../utils/filterStructureFetcher';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\n\r\n@Component({\r\n selector: 'lib-bimplus-object-navigator',\r\n imports: [CommonModule,\r\n FormsModule,\r\n NgSelectModule,\r\n FilterCriteriumComponent,\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n ExpansionPanelHeaderActionsComponent,\r\n BimplusSidenavDrawerContentComponent,\r\n TranslateModule,\r\n CriteriaSelectObjectPropertiesComponent,\r\n BimplusContextMenuComponent,\r\n ObjectFilterResultComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n templateUrl: './bimplus-object-navigator.component.html',\r\n styleUrl: './bimplus-object-navigator.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusObjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n\r\n constructor(){\r\n super()\r\n }\r\n\r\n // #region public fields\r\n @ViewChild(ObjectFilterResultComponent) objectFilterResult: ObjectFilterResultComponent | null = null;\r\n\r\n @Input()\r\n hideFilterContextMenu: boolean = false;\r\n\r\n @Input()\r\n filterContextMenu: Array<BimplusContextMenuItem> = [];\r\n\r\n @Input()\r\n set filterTypes(types : Array<FilterType>){\r\n this._filterTypes = types;\r\n if(this._filterTypes.length >0)\r\n this.activeFilterType = this._filterTypes[0];\r\n }\r\n\r\n get filterTypes():Array<FilterType>{\r\n return this._filterTypes;\r\n }\r\n\r\n set activeFilterType(value : FilterType | null){\r\n this.activeFilterTypeSubject$.next(value);\r\n }\r\n\r\n get activeFilterType() : FilterType | null{\r\n return this.activeFilterTypeSubject$.getValue();\r\n }\r\n\r\n activeFilterTypeSubject$ = new BehaviorSubject<FilterType | null> (null);\r\n activeFilterSubject$ = new BehaviorSubject<WebSdk.ObjectFilter | null> (null);\r\n\r\n set activeFilter(filter : WebSdk.ObjectFilter | null){\r\n\r\n // New active filter is selected. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n\r\n if(filter && !filter.id){ // Switching to custom filter will restore the default custom filter\r\n this._setDefaultCustomFilterString(filter);\r\n }\r\n\r\n this.activeFilterSubject$.next(filter);\r\n }\r\n\r\n get activeFilter() : WebSdk.ObjectFilter | null{\r\n return this.activeFilterSubject$.getValue();\r\n }\r\n\r\n @Input()\r\n filters : WebSdk.ObjectFiltersResponse | null = null;\r\n\r\n filterCriteria : FilterCriterium[] = []\r\n filterCriteriaChanged : boolean = false;\r\n maxFilterCriteria: number = MaxFilterCriteria;\r\n\r\n @Input()\r\n api : WebSdk.Api | null = null;\r\n\r\n @Input()\r\n projectId : string = ''\r\n\r\n @HostBinding('class.object-navigator') objNavClassClass: boolean = true;\r\n\r\n filterCriteriaSelectionMode$ = new BehaviorSubject<FilterCriteriaSelectionMode>(FilterCriteriaSelectionMode.None);\r\n\r\n @Output()\r\n filterCriteriaSelectionModeChanged = new EventEmitter<FilterCriteriaSelectionMode>();\r\n\r\n @Input()\r\n selectedObjectId : string | null = null;\r\n\r\n @Input()\r\n selectedRevision : number | undefined = undefined;\r\n\r\n @Input()\r\n selectedObjects : string[] = [];\r\n\r\n @Input()\r\n selectionObject : WebSdk.ExportObject | null = null;\r\n\r\n get filterResult(){\r\n return this._filterResult;\r\n }\r\n\r\n @Output()\r\n filterResultObjectSelectionChanged = new EventEmitter<string[]>();\r\n\r\n @Output()\r\n filterResultObjectDoubleClicked = new EventEmitter<string>();\r\n\r\n @Output()\r\n filterResultObjectMouseEntered = new EventEmitter<string>();\r\n\r\n @Output()\r\n filterResultObjectMouseLeft = new EventEmitter<string>();\r\n\r\n @Output()\r\n pipetteActiveStatus = new EventEmitter<boolean>();\r\n\r\n FilterCriteriaSelectionMode = FilterCriteriaSelectionMode; // Expose enum to template\r\n\r\n public isLoadingResults = false;\r\n\r\n public filterResultInvalidated = false;\r\n // #endregion public fields\r\n\r\n // #region private fields\r\n private _filterResult : WebSdk.ObjectFilterStructureResponse | null = null;\r\n private _filterTypes : Array<FilterType> = [];\r\n // #endregion private fields\r\n\r\n // #region public methods\r\n ngOnInit() {\r\n\r\n this.activeFilterTypeSubject$.subscribe({\r\n next: (v) => {\r\n if(!this.projectId || !this.api || !v){\r\n return;\r\n }\r\n\r\n if (this._filterResult) {\r\n // Filter results are available and visibility of model/layer was changed\r\n // Invalidate filter results => show overlay info dailog\r\n this.filterResultInvalidated = true;\r\n }\r\n\r\n this.activeFilter = null;\r\n\r\n this.loadCurrentLayerFilters(this.projectId, v.id)?.subscribe({\r\n next: (value) => {\r\n this.filters = [this._createDefaultCustomFilter(v.id), ...value];\r\n this.activeFilter = this.filters[0];\r\n this._applyCustomOrStoredFilter();\r\n },\r\n error: err => {throw new Error (err)},\r\n }\r\n )}\r\n });\r\n\r\n this.activeFilterSubject$.subscribe({\r\n next: (v) => {\r\n if(!v)\r\n return;\r\n\r\n this.filterCriteria = this.parseFilterString(v);\r\n this._applyCustomOrStoredFilter();\r\n }\r\n });\r\n\r\n this.filterCriteriaSelectionMode$.subscribe({\r\n next: (v) => {\r\n this.filterCriteriaSelectionModeChanged.emit(v)\r\n }\r\n })\r\n\r\n if( this.filterTypes.length > 0){\r\n this.activeFilterType = this.filterTypes[0];\r\n }\r\n }\r\n\r\n loadCurrentLayerFilters(projectId : string, layerId : string){\r\n if(!this.api){\r\n return;\r\n }\r\n return from(this.api.objectFilters.get(layerId,projectId));\r\n }\r\n\r\n parseFilterString(filter : WebSdk.ObjectFilter){\r\n const filterString = new FilterString(filter.filterString, this.maxFilterCriteria);\r\n return filterString.toFilterCriteria(filter.readableValues);\r\n }\r\n\r\n deleteFilterCriterium(index: number){\r\n this.filterCriteria.splice(index, 1);\r\n this.filterCriteria = [...this.filterCriteria];\r\n // Filter criteria was removed. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n this.activateModifiedCustomFilter();\r\n }\r\n\r\n setFilterCriteriaSelectionMode(mode: FilterCriteriaSelectionMode) {\r\n const isSameMode = this.filterCriteriaSelectionMode$.getValue() === mode;\r\n this.filterCriteriaSelectionMode$.next(isSameMode ? FilterCriteriaSelectionMode.None : mode);\r\n this.handlePipetteActiveStatus(!isSameMode);\r\n }\r\n \r\n applyFilterDisabled() : boolean {\r\n // Apply filter button should be disabled when no filter criteria are selected\r\n // or filter criteria was already applied and no new criteria was selected\r\n return this.filterCriteria.length === 0 || ! this.filterCriteriaChanged;\r\n }\r\n\r\n applyFilter(){\r\n this.handlePipetteActiveStatus(false /* disable pipette cursor */);\r\n this.filterCriteriaSelectionMode$.next(FilterCriteriaSelectionMode.None);\r\n this._filterResult = null;\r\n // Filter results will be updated again, so they are no longer invalid\r\n this.filterResultInvalidated = false;\r\n\r\n // Custom filter is selected\r\n if(this.activeFilter && !this.activeFilter.id){\r\n this.activeFilter.filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\r\n }\r\n\r\n if(this.selectionObject){\r\n this._applySelectionObjectFilter(this.activeFilter);\r\n }\r\n }\r\n\r\n handleFilterResultSelectionChanged(selection : string[]){\r\n this.filterResultObjectSelectionChanged.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectDoubleClicked(selection : string){\r\n this.filterResultObjectDoubleClicked.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectMouseEntered(selection : string){\r\n this.filterResultObjectMouseEntered.emit(selection);\r\n }\r\n\r\n handleFilterResultObjectMouseLeft(selection : string){\r\n this.filterResultObjectMouseLeft.emit(selection);\r\n }\r\n\r\n handlePipetteActiveStatus(status: boolean) {\r\n this.pipetteActiveStatus.emit(status);\r\n }\r\n\r\n filterCriteriaWasChanged(/*filterCriteria: FilterCriterium[]*/) {\r\n // Some new filter criteria was selected. Apply filter button should be enabled\r\n this.filterCriteriaChanged = true;\r\n }\r\n\r\n activateModifiedCustomFilter(){\r\n // When existing filter is changed, Custom filter will be selected and filter settings need to be cloned. Nothing is done when custom filter is already active\r\n if(this.activeFilter?.id && this.filters){\r\n\r\n // Copy filter string from current criteria settings to custom filter\r\n this.filters[0].filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\r\n this.filters[0].readableValues = new FilterString().getReadableValuesFromFilterCriteria(this.filterCriteria);\r\n\r\n this.activeFilterSubject$.next(this.filters[0]);\r\n }\r\n }\r\n // #endregion public methods\r\n\r\n // #region private methods\r\n private _applySelectionObjectFilter(activeFilter : WebSdk.ObjectFilter | null){\r\n\r\n if(!this.api || !this.selectionObject || !activeFilter){\r\n return;\r\n }\r\n\r\n this.selectionObject.singleUse = true;\r\n this.selectionObject.selection.singleuse = true;\r\n\r\n this.isLoadingResults = true;\r\n\r\n FilterStructureFetcher.fetchObjectFilterStructureFromSelection(this.projectId, activeFilter, this.selectionObject, this.api).subscribe({\r\n next: (filterResult) => {\r\n this._filterResult = filterResult;\r\n this.isLoadingResults = false;\r\n // Fetching new results finished. Apply filter button should be disabled\r\n this.filterCriteriaChanged = false;\r\n }\r\n });\r\n }\r\n\r\n private _setDefaultCustomFilterString(filter: WebSdk.ObjectFilter){\r\n const typeAttribId = \"a0e8ae2c-c869-4ec3-9019-25d3704be707\";\r\n filter.filterString = `[I][${typeAttribId}].Value`;\r\n filter.readableValues = {};\r\n filter.readableValues[typeAttribId] = \"Type\"; // Provide readable criterium name for type\r\n }\r\n\r\n private _createDefaultCustomFilter(disciplineID: string) : WebSdk.ObjectFilter{\r\n\r\n const filter = {\r\n module: \"00000000-0000-0000-0000-000000000000\",\r\n category: \"\",\r\n disciplineID: disciplineID,\r\n name: \"Custom filter\",\r\n filterString: \"\",\r\n isDefault: false,\r\n disableSortByModels: false,\r\n }\r\n\r\n this._setDefaultCustomFilterString(filter);\r\n return filter;\r\n }\r\n\r\n private _applyCustomOrStoredFilter() {\r\n if(this.activeFilter && this.activeFilter.id){\r\n // Stored filter is selected. Results must be applied automatically.\r\n this.applyFilter();\r\n } else {\r\n // Custom filter is selected. Properties of selected object must be shown again.\r\n if (this.selectedObjectId) {\r\n this.setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties);\r\n } else {\r\n this.objectFilterResult?.clearFilterResult();\r\n }\r\n }\r\n }\r\n // #endregion private methods\r\n\r\n}\r\n","<lib-bimplus-sidenav-drawer-content [header]=\"'_Object navigator' | translate\"\r\n [isLoading]=\"isLoadingResults\"\r\n [loadingSpinnerText]=\"'_Loading_Filter_Results' | translate\"\r\n >\r\n <div class=\"object-navigator-content-container\">\r\n @if(filterTypes.length > 0){\r\n <div class=\"description\">\r\n {{\"_Select_an_object_using_Object_Picker\" | translate}}\r\n </div>\r\n <div class=\"object-navigator-filters-type\">\r\n <ng-select data-test=\"object-navigator-filter-types-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilterType\" [clearable]=\"false\" [searchable]=\"false\">\r\n @for (type of filterTypes; track type) {\r\n <ng-option [value]=\"type\">{{type.name}}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n <div class=\"object-navigator-filters-name\">\r\n <ng-select data-test=\"object-navigator-filters-name-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilter\" [clearable]=\"false\" [disabled]=\"!filters\" [searchable]=\"false\">\r\n @for (filter of filters; track filter) {\r\n <ng-option [value]=\"filter\">{{filter.name}}</ng-option>\r\n }\r\n </ng-select>\r\n\r\n @if(!hideFilterContextMenu){\r\n @if (filterContextMenu.length) {\r\n <lib-bimplus-context-menu class=\"object-navigator-filters-name-context-menu\"\r\n [items]=\"filterContextMenu\"\r\n >\r\n </lib-bimplus-context-menu>\r\n }\r\n }\r\n\r\n </div>\r\n\r\n <lib-expansion-panel class=\"object-navigator-filter-criteria-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-navigator-filter-criteria-header\">\r\n {{ \"_Assign_Objects_Selection_Mode\" | translate }} &#40;{{ filterCriteria.length }}/{{ maxFilterCriteria }}&#41;\r\n </span>\r\n <lib-expansion-panel-header-actions>\r\n <div class=\"object-navigator-pick-object-button\"\r\n [ngClass]=\"filterCriteriaSelectionMode$.getValue() === FilterCriteriaSelectionMode.SelectObjectProperties? 'active' : ''\"\r\n (click)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\r\n (keypress)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\r\n [title]=\"'_Object_Picker'| translate\"\r\n ></div>\r\n </lib-expansion-panel-header-actions>\r\n </lib-expansion-panel-header>\r\n\r\n <div class=\"filter-criteria-container\">\r\n @for (criterium of filterCriteria; track criterium; let i = $index) {\r\n <app-filter-criterium\r\n [criterium] = \"criterium\"\r\n [indent]=\"i*0.8\"\r\n (deleteCriterium)=\"deleteFilterCriterium(i)\"\r\n ></app-filter-criterium>\r\n }\r\n </div>\r\n </lib-expansion-panel>\r\n\r\n @switch(filterCriteriaSelectionMode$.getValue()){\r\n @case(FilterCriteriaSelectionMode.SelectObjectProperties){\r\n @if(!selectedObjectId){\r\n <p id=\"NoObjectSelected\">{{ \"_NoObjectSelected\" | translate}}</p>\r\n }\r\n }\r\n }\r\n\r\n <div class=\"object-navigator-apply-button-row\">\r\n <button class=\"primary-button\"\r\n [class.disabled]=\"applyFilterDisabled()\"\r\n [disabled]=\"applyFilterDisabled()\"\r\n (click)=\"applyFilter()\"\r\n >\r\n {{\"_Apply filter\" | translate}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"object-navigator-separator\"></div>\r\n\r\n @switch(filterCriteriaSelectionMode$.getValue()){\r\n @case(FilterCriteriaSelectionMode.SelectObjectProperties){\r\n @if(selectedObjectId){\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <lib-criteria-select-object-properties\r\n [api]=\"api\"\r\n [selectedLanguage]=\"selectedLanguage\"\r\n [localizedStrings]=\"localizedStrings\"\r\n [(filterCriteria)]=\"filterCriteria\"\r\n [rootObjectId]=\"selectedObjectId\"\r\n [revision]=\"selectedRevision\"\r\n (filterCriteriaChange)=\"filterCriteriaWasChanged()\"\r\n >\r\n </lib-criteria-select-object-properties>\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n }\r\n @case(FilterCriteriaSelectionMode.SelectAttributes){\r\n\r\n }\r\n @default{\r\n @if (filterResult) {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <lib-object-filter-result\r\n [filterResult]=\"filterResult\"\r\n [selectedObjects]=\"selectedObjects\"\r\n [isFilterResultInvalid]=\"filterResultInvalidated\"\r\n [filterResultInvalidTitle]=\"'Result_is_Invalid' | translate\"\r\n [filterResultInvalidText]=\"'Selection_in_Project_navigator_has_changed' | translate\"\r\n (nodeSelectionChanged)=\"handleFilterResultSelectionChanged($event)\"\r\n (nodeDoubleClicked)=\"handleFilterResultObjectDoubleClicked($event)\"\r\n (nodeMouseEntered)=\"handleFilterResultObjectMouseEntered($event)\"\r\n (nodeMouseLeft)=\"handleFilterResultObjectMouseLeft($event)\"\r\n ></lib-object-filter-result>\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n }\r\n }\r\n }\r\n @else {\r\n <div data-test=\"object-navigator-no-filter-types-message\" class=\"object-navigator-no-filter-types\"> {{\"_No_visible_models_found\" | translate}} </div>\r\n }\r\n</div>\r\n</lib-bimplus-sidenav-drawer-content>\r\n","import { Component, ViewEncapsulation, Input, EventEmitter, Output, ElementRef, OnChanges, SimpleChanges, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\r\nimport { TooltipMessageData, TooltipMessagePosition } from './bimplus-tooltip-message.interface'\r\n@Component({\r\n selector: 'lib-bimplus-tooltip-message',\r\n imports: [CommonModule, ClickOutsideDirective],\r\n templateUrl: './bimplus-tooltip-message.component.html',\r\n styleUrl: './bimplus-tooltip-message.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusTooltipMessageComponent implements OnChanges {\r\n private el = inject(ElementRef);\r\n\r\n private _element: HTMLElement;\r\n constructor() {\r\n this._element = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n // Getter for _element\r\n public get element(): HTMLElement {\r\n return this._element;\r\n }\r\n\r\n @Input() messagePosition: TooltipMessagePosition = {\r\n posX: 0,\r\n posY: 0,\r\n };\r\n\r\n @Input() messageData: TooltipMessageData = {};\r\n\r\n @Input() messageVisibility: boolean = false;\r\n @Output() messageVisibilityChange = new EventEmitter<boolean>();\r\n\r\n protected _clickOutside() {\r\n this.messageVisibility = false;\r\n this.messageVisibilityChange.emit(this.messageVisibility)\r\n }\r\n\r\n //<<Calculation of the correct position of the tooltip\r\n private _resizeObserver!: ResizeObserver;\r\n protected _messageParentElement!: ElementRef;\r\n\r\n protected _parentWidth: number = 0;\r\n protected _parentHeight: number = 0;\r\n\r\n get messageParent(): ElementRef {\r\n return this._messageParentElement;\r\n }\r\n\r\n @Input() set messageParent(element: ElementRef) {\r\n this._messageParentElement = element;\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n const { width, height } = entry.contentRect;\r\n this._parentWidth = width;\r\n this._parentHeight = height; \r\n }\r\n });\r\n\r\n this._resizeObserver.observe(this._messageParentElement.nativeElement);\r\n }\r\n\r\n tooltipRectangleIsOutOfParentRectangleX(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\r\n return (tooltipRectangle.x + tooltipRectangle.width - parentRectangle.x - parentRectangle.width) > 0;\r\n }\r\n tooltipRectangleIsOutOfParentRectangleY(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\r\n return (tooltipRectangle.y + tooltipRectangle.height - parentRectangle.y - parentRectangle.height) > 0;\r\n }\r\n\r\n correctTooltipPositionX(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\r\n this.messagePosition.posX = this.messagePosition.posX + oldPosX - (_tooltipRectangle.x + _tooltipRectangle.width);\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(flippedY && Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, true);\r\n }, 0);\r\n }\r\n }\r\n\r\n correctTooltipPositionY(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\r\n this.messagePosition.posY = this.messagePosition.posY + oldPosY - (_tooltipRectangle.y + _tooltipRectangle.height);\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(flippedX && Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\r\n }, 0); \r\n } else if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(oldPosX, true, oldPosY, flippedY);\r\n }, 0);\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['messageVisibility']) {\r\n if(!changes['messageVisibility'].currentValue) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n if(!this._messageParentElement) {\r\n return;\r\n }\r\n const _oldPosX = this.messagePosition.posX;\r\n const _oldPosY = this.messagePosition.posY;\r\n const _tooltipElement = this._element.querySelector(\".tooltip-message\");\r\n if(!_tooltipElement) {\r\n return;\r\n }\r\n const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\r\n const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\r\n if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\r\n setTimeout(() => {\r\n this.correctTooltipPositionX(_oldPosX, true, _oldPosY, false);\r\n }, 0);\r\n } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\r\n this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\r\n setTimeout(() => {\r\n this.correctTooltipPositionY(_oldPosX, false, _oldPosY, true);\r\n }, 0);\r\n }\r\n }, 0);\r\n }\r\n }\r\n //Calculation of the correct position of the tooltip>>\r\n}\r\n","@if (messageVisibility) {\r\n <div\r\n class=\"tooltip-message\"\r\n libClickOutside\r\n (clickOutside)=\"_clickOutside()\"\r\n [ngStyle]=\"{\r\n 'top.px': messagePosition.posY\r\n , 'left.px': messagePosition.posX\r\n }\"\r\n >\r\n <ng-content select=\".tooltip-message-title-content\"></ng-content>\r\n @if (messageData && messageData.title) {\r\n <div\r\n class=\"tooltip-message-title\"\r\n >\r\n {{messageData.title}}\r\n </div>\r\n }\r\n <ng-content select=\".tooltip-message-messages-content\"></ng-content>\r\n @if (messageData && messageData.messages) {\r\n <div\r\n class=\"tooltip-message-messages\"\r\n >\r\n @for (message of messageData.messages; track message) {\r\n @if (message.separatingLine) {\r\n <div class=\"separating-line\"></div>\r\n }\r\n <div class=\"tooltip-message-message\">\r\n @if (message.label) {\r\n <span\r\n class=\"label\"\r\n [class.failed]=\"message.type==='failed'\"\r\n [class.success]=\"message.type==='success'\"\r\n >\r\n {{message.label}}\r\n </span>\r\n }\r\n @if (message.value) {\r\n <span\r\n class=\"value\"\r\n >\r\n @if (message.label) {\r\n :\r\n }\r\n {{message.value}}\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n <ng-content select=\".tooltip-message-footer-content\"></ng-content>\r\n @if (messageData && messageData.footer) {\r\n <div\r\n class=\"tooltip-message-footer\"\r\n >\r\n {{messageData.footer}}\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nexport enum CursorType {\r\n Pick = 'cursor-pick',\r\n Hide = 'cursor-hide',\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class CursorsService {\r\n\r\n // #region private fields\r\n private _cursorElement: HTMLElement | null = null;\r\n // #endregion private fields\r\n\r\n // #region private methods\r\n private getCursorElement(): HTMLElement | null {\r\n if (this._cursorElement) {\r\n return this._cursorElement;\r\n } else {\r\n return this.getMainViewportContainer();\r\n }\r\n }\r\n private getMainViewportContainer() : HTMLElement | null {\r\n const mainViewportContainer = document.getElementById('mainViewportContainer');\r\n if (!mainViewportContainer) {\r\n console.log(\"mainViewportContainer not found\");\r\n }\r\n return mainViewportContainer;\r\n }\r\n\r\n private addCursor(cursorType: CursorType) {\r\n this.getCursorElement()?.classList.add(cursorType);\r\n }\r\n\r\n private removeCursor(cursorType: CursorType) {\r\n this.getCursorElement()?.classList.remove(cursorType);\r\n }\r\n // #endregion\r\n\r\n\r\n // #region public methods\r\n setCursorElement(cursorElement: HTMLElement | null) {\r\n this._cursorElement = cursorElement;\r\n }\r\n\r\n showPickCursor(show: boolean) {\r\n if (show) {\r\n this.addCursor(CursorType.Pick)\r\n } else {\r\n this.removeCursor(CursorType.Pick);\r\n }\r\n }\r\n\r\n showHideCursor(show: boolean) {\r\n if (show) {\r\n this.addCursor(CursorType.Hide)\r\n } else {\r\n this.removeCursor(CursorType.Hide);\r\n }\r\n }\r\n // #endregion\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, Renderer2, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libDraggableComponent]',\r\n standalone: true\r\n})\r\nexport class ComponentDraggableDirective {\r\n private el = inject(ElementRef);\r\n private renderer = inject(Renderer2);\r\n\r\n\r\n private _isDraggingActive = false;\r\n private _isDragging = false;\r\n\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor() {\r\n if (!this._isDraggingActive) return;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n this.renderer.setStyle(this.el.nativeElement, 'user-drag', 'none');\r\n }\r\n\r\n @Input() set libDraggableComponent(condition: boolean) {\r\n const element = this.el.nativeElement;\r\n this._isDraggingActive = condition;\r\n if (condition) {\r\n this.renderer.setStyle(element, 'cursor', 'grab');\r\n this.renderer.setStyle(element, 'user-drag', 'none');\r\n } else {\r\n this.renderer.setStyle(element, 'cursor', 'unset');\r\n this.renderer.setStyle(element, 'user-drag', 'auto');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this._isDraggingActive) return;\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this._isDragging = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (!this._isDraggingActive) return;\r\n if (this._isDragging) {\r\n this._isDragging = false;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n }\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this._isDraggingActive) return;\r\n\r\n if (this._isDragging) {\r\n const newX = this.startX - event.clientX;\r\n const newY = this.startY - event.clientY;\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n\r\n const top = this.el.nativeElement.offsetTop - newY;\r\n const left = this.el.nativeElement.offsetLeft - newX;\r\n\r\n this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\r\n }\r\n }\r\n\r\n\r\n /* touch mode */\r\n @HostListener('touchstart', ['$event']) //corresponding to mousedown\r\n onTouchStart(event: TouchEvent) {\r\n if (!this._isDraggingActive) return;\r\n this.startX = event.targetTouches[0].pageX;\r\n this.startY = event.targetTouches[0].pageY;\r\n this._isDragging = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\r\n }\r\n\r\n @HostListener('document:touchmove', ['$event']) //corresponding to mousemove\r\n onTouchMove(event: TouchEvent) {\r\n if (!this._isDraggingActive) return;\r\n\r\n if (this._isDragging) {\r\n const newX = this.startX - event.targetTouches[0].pageX;\r\n const newY = this.startY - event.targetTouches[0].pageY;\r\n\r\n this.startX = event.targetTouches[0].pageX;\r\n this.startY = event.targetTouches[0].pageY;\r\n\r\n const top = this.el.nativeElement.offsetTop - newY;\r\n const left = this.el.nativeElement.offsetLeft - newX;\r\n\r\n this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\r\n }\r\n }\r\n\r\n @HostListener('document:touchend') //corresponding to mouseup\r\n onTouchEnd() {\r\n if (!this._isDraggingActive) return;\r\n if (this._isDragging) {\r\n this._isDragging = false;\r\n this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\r\n }\r\n }\r\n\r\n}\r\n","import { AfterContentInit, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { IDialogOptions } from './bimplus-general-dialog-config-settings';\r\nimport { ComponentDraggableDirective } from '../../directives/component-draggable/componentsDraggable.directive';\r\n\r\nimport { DialogService } from './bimplus-general-overlay-dialog.service';\r\n\r\n@Component({\r\n selector: 'app-general-overlay-dialog',\r\n imports: [ComponentDraggableDirective],\r\n templateUrl: './bimplus-general-overlay-dialog.component.html',\r\n styleUrls: ['./bimplus-general-overlay-dialog.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimportalGeneralOverlayDialogComponent implements OnInit, AfterContentInit {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly cdref = inject(ChangeDetectorRef);\r\n\r\n\r\n @ViewChild('dialogRefContainer') genDialogRefContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChild('dialogOverlay') dialogOverlay!: ElementRef<HTMLDivElement>;\r\n\r\n options: IDialogOptions | undefined;\r\n units: string = 'rem';\r\n\r\n ngOnInit(): void {\r\n this.options = this.dialogService.options;\r\n }\r\n\r\n onClose() {\r\n this.dialogService.close();\r\n }\r\n\r\n ngAfterContentInit() {\r\n if (this.options) {\r\n this.cdref.detectChanges();\r\n this.setOptions();\r\n }\r\n }\r\n\r\n setOptions() {\r\n if (this.options) {\r\n this.setDimensions();\r\n this.setPosition();\r\n this.setOverlay();\r\n }\r\n }\r\n\r\n private setDimensions() {\r\n const width = this.options?.width && this.options.width.length > 0 ? this.options.width : 'auto';\r\n const height = this.options?.height && this.options.height.length > 0 ? this.options.height : 'auto';\r\n this.genDialogRefContainer.nativeElement.style.width = width;\r\n this.genDialogRefContainer.nativeElement.style.height = height;\r\n }\r\n\r\n private setPosition() {\r\n if (this.options?.position === 'middle') {\r\n this.setPositionsMiddle();\r\n } else if (this.options?.position === 'unset') {\r\n this.setPositionsUnset();\r\n }\r\n }\r\n\r\n setPositionsUnset() {\r\n if (this.options) {\r\n this.genDialogRefContainer.nativeElement.style.position = 'fixed';\r\n const top = this.options?.positionOptions?.top ?? '0' + this.units;\r\n const bottom = this.options?.positionOptions?.bottom ?? '0' + this.units;\r\n const left = this.options?.positionOptions?.left ?? '0' + this.units;\r\n const right = this.options?.positionOptions?.right ?? '0' + this.units;\r\n\r\n this.genDialogRefContainer.nativeElement.style.position = 'absolute';\r\n this.genDialogRefContainer.nativeElement.style.top = top;\r\n this.genDialogRefContainer.nativeElement.style.left = left;\r\n this.genDialogRefContainer.nativeElement.style.bottom = bottom;\r\n this.genDialogRefContainer.nativeElement.style.right = right;\r\n\r\n this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : false;\r\n this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\r\n }\r\n }\r\n\r\n setPositionsMiddle() {\r\n if (this.options) {\r\n this.genDialogRefContainer.nativeElement.className = this.genDialogRefContainer.nativeElement.className + ' middle';\r\n this.options.draggable = false;\r\n this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : true;\r\n this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\r\n }\r\n }\r\n\r\n private setOverlay() {\r\n if (this.options?.overlayVisibilityEnabled) {\r\n this.dialogOverlay.nativeElement.style.backgroundColor = 'var(--modal-fade-in-background-color)';\r\n }\r\n }\r\n\r\n onKeyPress(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n if (this.options?.overlayClickEnabled) {\r\n this.dialogService.close();\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n","@if (options) {\r\n <div class=\"general-dialog-wrapper\" #generalDialogWrapper>\r\n <section class=\"general-dialog-content\" #dialogRefContainer\r\n [libDraggableComponent]=\"options.draggable ? true : false\">\r\n <ng-content></ng-content>\r\n </section>\r\n <div class=\"general-dialog-overlay\" #dialogOverlay (click)=\"onClose()\" (keypress)=\"onKeyPress($event)\"\r\n [style.display]=\"options.overlayVisibilityEnabled ? 'block' : 'none'\">\r\n </div>\r\n </div>\r\n}\r\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, Injectable, Type, inject } from '@angular/core';\r\nimport { IDialogInputData, IDialogOptions } from './bimplus-general-dialog-config-settings';\r\nimport { Subject } from 'rxjs';\r\nimport { BimportalGeneralOverlayDialogComponent } from './bimplus-general-overlay-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n private readonly appRef = inject(ApplicationRef);\r\n private readonly injector = inject(EnvironmentInjector);\r\n\r\n\r\n generalDialogComponentBody!: ComponentRef<unknown>; //here will be rendered every component we call inside general dialog\r\n generalDialog!: ComponentRef<BimportalGeneralOverlayDialogComponent>; //here will be rendered every component we call inside general dialog\r\n private _isDialogOpen = false;\r\n\r\n inputData: unknown;\r\n private readonly outputData = new Subject<unknown>();\r\n\r\n options: IDialogOptions | undefined;\r\n\r\n open(componentBody: Type<unknown>, data: IDialogInputData) { //todo pass data to second component\r\n if (data?.options) {\r\n this.initializeSettings(data);\r\n this.createComponentsRef(componentBody); //componentBody is component which is added inside to general dialog and rendered\r\n }\r\n }\r\n\r\n initializeSettings(data: IDialogInputData) {\r\n try {\r\n this.inputData = data?.data;\r\n this.options = data.options;\r\n } catch (e) {\r\n console.log('Missing data in open method', e);\r\n }\r\n\r\n }\r\n\r\n createComponentsRef(componentBody: Type<unknown>) {\r\n this.generalDialogComponentBody = createComponent(componentBody, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n this.generalDialog = createComponent(BimportalGeneralOverlayDialogComponent, {\r\n environmentInjector: this.injector,\r\n projectableNodes: [[this.generalDialogComponentBody.location.nativeElement]],\r\n });\r\n\r\n document.body.appendChild(this.generalDialog.location.nativeElement);\r\n\r\n this.appRef.attachView(this.generalDialogComponentBody.hostView); //first render body of general dialog, it can be any component we create\r\n this.appRef.attachView(this.generalDialog.hostView); //then render body of general dialog, which we can add in any component, can have different content\r\n this._isDialogOpen = true;\r\n }\r\n\r\n close(outputData?: unknown) {\r\n if (outputData) {\r\n this.setOutputData(outputData);\r\n } else {\r\n this.resetSettings();\r\n }\r\n this.generalDialogComponentBody.location.nativeElement.remove();\r\n this.generalDialog.location.nativeElement.remove();\r\n this._isDialogOpen = false;\r\n }\r\n\r\n resetSettings() {\r\n this.inputData = null;\r\n this.options = undefined;\r\n }\r\n\r\n isDialogOpened() {\r\n return this._isDialogOpen;\r\n }\r\n\r\n setOutputData(data: unknown): void {\r\n if (this._isDialogOpen) {\r\n this.outputData.next(data);\r\n }\r\n }\r\n\r\n getOutputData(): Subject<unknown> {\r\n return this.outputData;\r\n }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, HostListener, Input, TemplateRef, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\n\r\nexport interface WarningDialogInputData {\r\n title: string;\r\n message: string;\r\n buttonsRef?: TemplateRef<unknown>;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-warning',\r\n imports: [CommonModule, TranslateModule, BimplusButtonsRowComponent],\r\n templateUrl: './bimplus-overlay-dialog-warning.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-warning.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogWarningComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly _data: WarningDialogInputData | undefined;\r\n protected readonly buttonsRef: TemplateRef<unknown> | null = null;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: \"warningDialogAcceptButton\",\r\n title: this.translateService.instant('_Ok'),\r\n tooltip: this.translateService.instant('_Ok'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this._data = this.dialogService.inputData as WarningDialogInputData;\r\n this.buttonsRef = this._data?.buttonsRef ?? null;\r\n this._title = this._data?.title || '';\r\n this._message = this._data?.message || '';\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked(): void {\r\n this.close();\r\n\r\n this.acceptCallback?.();\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\"></div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{ title }}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div\r\n class=\"overlay-dialog-container_content_msg\"\r\n [innerHTML]=\"this.message\"\r\n ></div>\r\n <section class=\"overlay-dialog-container_content_buttons\">\r\n @if(buttonsRef) {\r\n <ng-container\r\n *ngTemplateOutlet=\"buttonsRef; context: { close: close.bind(this) }\"\r\n ></ng-container>\r\n } @else {\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked()\"\r\n />\r\n </div>\r\n }\r\n </section>\r\n </div>\r\n</div>\r\n","import { Component, ViewEncapsulation, Input, OnInit, OnDestroy, HostListener, ChangeDetectionStrategy } from '@angular/core';\r\nimport { XDraggableDirective } from '../../directives/x-draggable.directive';\r\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-resizable-panel',\r\n imports: [CommonModule, XDraggableDirective, PxsuffixPipe],\r\n templateUrl: './resizable-panel.component.html',\r\n styleUrl: './resizable-panel.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ResizablePanelComponent implements OnInit, OnDestroy {\r\n @Input() position: 'left' | 'right' = 'right';\r\n @Input() hasDraggableHandle: boolean = false;\r\n @Input() hasDraggableBorder: boolean = false;\r\n @Input() minWidth: number | (() => number) | undefined = 350;\r\n @Input() maxWidth: number | (() => number) | undefined;\r\n @Input() defaultWidth: number = 350;\r\n // Function to determine if resizing is allowed\r\n @Input() canResize: (currentWidth: number, deltaX: number) => boolean = () => true;\r\n\r\n drawerWidth: number = this.defaultWidth;\r\n drawerExpanded: boolean = true;\r\n\r\n ngOnInit() {\r\n this.drawerWidth = this.defaultWidth;\r\n window.addEventListener('resize', this.handleWindowResize);\r\n }\r\n\r\n ngOnDestroy() {\r\n window.removeEventListener('resize', this.handleWindowResize);\r\n }\r\n\r\n applyWidthConstraints() {\r\n const minWidth = typeof this.minWidth === 'function' ? this.minWidth() : this.minWidth;\r\n const maxWidth = typeof this.maxWidth === 'function' ? this.maxWidth() : this.maxWidth;\r\n\r\n if (minWidth && this.drawerWidth < minWidth) {\r\n this.drawerWidth = minWidth;\r\n } else if (maxWidth && this.drawerWidth > maxWidth) {\r\n this.drawerWidth = maxWidth;\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n handleWindowResize = (): void => {\r\n this.applyWidthConstraints();\r\n };\r\n\r\n _toggleDrawer() {\r\n this.drawerExpanded = !this.drawerExpanded;\r\n if (!this.drawerExpanded) {\r\n return;\r\n }\r\n\r\n this.applyWidthConstraints();\r\n }\r\n\r\n _onResizeWidth(event: number): void {\r\n const deltaX = event;\r\n\r\n let newWidth = this.drawerWidth;\r\n if (this.position === 'left') {\r\n newWidth += deltaX;\r\n } else if (this.position === 'right') {\r\n newWidth -= deltaX;\r\n }\r\n\r\n if (this.canResize?.(this.drawerWidth, deltaX) !== false) {\r\n this.drawerWidth = newWidth;\r\n\r\n this.applyWidthConstraints();\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"resizable-panel-drawer\"\r\n [style.width] = \"drawerWidth | pxsuffix\"\r\n [ngClass]=\"drawerExpanded ? '' : 'hidden'\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n>\r\n <slot></slot>\r\n @if (drawerExpanded) {\r\n @if (hasDraggableBorder) {\r\n <div\r\n xDraggable\r\n class=\"resizable-panel-resize-border\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n @if (hasDraggableHandle) {\r\n <div\r\n xDraggable\r\n class=\"resizable-panel-resize-handle\"\r\n (dragging)=\"_onResizeWidth($event)\"\r\n (clicked)=\"_toggleDrawer()\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n }\r\n</div>\r\n@if (!drawerExpanded) {\r\n @if (hasDraggableHandle) {\r\n <div\r\n class=\"resizable-panel-resize-handle collapsed\"\r\n (click)=\"_toggleDrawer()\"\r\n (keypress)=\"_toggleDrawer()\"\r\n [class.position-right]=\"position === 'right'\"\r\n [class.position-left]=\"position === 'left'\"\r\n >\r\n </div>\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, HostListener, Input, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-link-tooltip-message',\r\n templateUrl: './bimplus-link-tooltip-message.component.html',\r\n styleUrls: ['./bimplus-link-tooltip-message.component.less'],\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusLinkTooltipMessageComponent implements AfterViewInit {\r\n\r\n @ViewChild('messageLink') messageLink!: ElementRef<HTMLElement>;\r\n\r\n private _enableCopyPressKeys = true;\r\n private _titleHeader = '';\r\n private _link = '';\r\n\r\n @Input()\r\n get link(): string {\r\n return this._link;\r\n }\r\n set link(value: string) {\r\n this._link = value;\r\n }\r\n\r\n @Input()\r\n get titleHeader(): string {\r\n return this._titleHeader;\r\n }\r\n set titleHeader(value: string) {\r\n this._titleHeader = value;\r\n }\r\n\r\n @Input()\r\n get enableCopyPressKeys(): boolean {\r\n return this._enableCopyPressKeys;\r\n }\r\n set enableCopyPressKeys(value: boolean) {\r\n this._enableCopyPressKeys = value;\r\n }\r\n\r\n @Input()\r\n arrowPosition = 'right-arrow';\r\n\r\n @Input()\r\n onClose?: () => void;\r\n\r\n ngAfterViewInit(): void {\r\n this.selectText(this.messageLink.nativeElement);\r\n }\r\n\r\n selectText(node: HTMLElement) {\r\n if (window.getSelection) {\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n range.selectNodeContents(node);\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n } else {\r\n console.log(\"Could not select text in node: Unsupported browser.\");\r\n }\r\n }\r\n\r\n close() {\r\n this.onClose?.();\r\n }\r\n\r\n @HostListener('window:keydown.control.c')\r\n onKeyPress() {\r\n if (this.messageLink && this.enableCopyPressKeys) {\r\n navigator.clipboard.writeText(this.messageLink.nativeElement.innerText).catch((err) => {\r\n console.error(\"Could not copy text in node.\", err);\r\n });\r\n }\r\n }\r\n}","<div class=\"link-content\" #linkContent>\r\n <div\r\n class=\"link-tooltip-message\"\r\n #linkTooltipMessage\r\n >\r\n <div class=\"header\">\r\n <span class=\"title\">{{titleHeader}}</span>\r\n <span\r\n class='tooltip-cross-icon close'\r\n (click)=\"close()\"\r\n (keydown)=\"close()\"\r\n >✕︎</span>\r\n </div>\r\n <div class=\"content\">\r\n <div\r\n class=\"link\"\r\n #messageLink\r\n [innerHTML]=\"link\">\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"arrow\"\r\n [ngClass]=\"arrowPosition\"\r\n ></div>\r\n</div>\r\n<div\r\n class=\"link-tooltip-message-overlay\"\r\n (click)=\"close()\"\r\n (keydown)=\"close()\"\r\n></div>","import { Component, Input, Output, EventEmitter, ViewEncapsulation, SimpleChanges, OnChanges, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CreateLinkData, SelectedObject } from './object-properties-header.interface';\r\n\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { fireEvent } from '../../utils/utils';\r\nimport {\r\n TranslateModule\r\n , TranslateService\r\n} from '@ngx-translate/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusLinkTooltipMessageComponent } from '../bimplus-link-tooltip-message/bimplus-link-tooltip-message.component';\r\n\r\n@Component({\r\n selector: 'lib-object-properties-header',\r\n imports: [\r\n FormsModule,\r\n NgSelectModule,\r\n TranslateModule,\r\n BimplusLinkTooltipMessageComponent\r\n],\r\n providers: [TranslateService],\r\n templateUrl: './object-properties-header.component.html',\r\n styleUrl: './object-properties-header.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesHeaderComponent extends BimplusLocalizedWidgetComponent implements OnChanges {\r\n constructor(){\r\n super();\r\n }\r\n\r\n @Output() selectedObject = new EventEmitter<SelectedObject>();\r\n\r\n @Output() closePropertiesPanel = new EventEmitter();\r\n\r\n @Input() selectedObjects: Array<SelectedObject> = [];\r\n\r\n _activeObject: SelectedObject | null = null;\r\n openLinkMessage: boolean = false;\r\n\r\n @Input()\r\n onOpenLink?: () => void;\r\n\r\n set activeObject(value: SelectedObject | null) {\r\n this._activeObject = value;\r\n fireEvent(this, \"selectedObject\", value);\r\n }\r\n\r\n get activeObject(): SelectedObject | null {\r\n return this._activeObject;\r\n }\r\n\r\n private _linkData: CreateLinkData = {\r\n link: '',\r\n titleHeader: '',\r\n linkMessageVisible: false,\r\n enableCopyPressKeys: false\r\n };\r\n\r\n @Input()\r\n get linkData(): CreateLinkData {\r\n return this._linkData;\r\n }\r\n set linkData(value: CreateLinkData) {\r\n this._linkData = value;\r\n }\r\n\r\n _closePropertiesPanel(event: Event) {\r\n fireEvent(this, \"closePropertiesPanel\", event);\r\n event.stopPropagation();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!changes['selectedObjects']) {\r\n return;\r\n }\r\n const previousValue: SelectedObject[] | null = changes['selectedObjects'].previousValue;\r\n const currentValue: SelectedObject[] | null = changes['selectedObjects'].currentValue;\r\n if(currentValue && currentValue.length > 0) {\r\n this.activeObject = currentValue[currentValue.length - 1];\r\n }\r\n console.log(`Data changed from ${previousValue} to ${currentValue}`);\r\n }\r\n\r\n openLink() {\r\n this.openLinkMessage = true;\r\n this.onOpenLink?.();\r\n }\r\n\r\n closeLink = () => {\r\n this.openLinkMessage = false;\r\n }\r\n}\r\n","<div class=\"object-properties-header\">\r\n <div class=\"object-properties-header-object\">\r\n <div class=\"object-properties-header-object-select\">\r\n <ng-select class=\"object-properties-header-object-select-dropdown\" [(ngModel)]=\"activeObject\" [clearable]=\"false\" [searchable]=\"false\">\r\n @for (object of selectedObjects; track object) {\r\n <ng-option [value]=\"object\">\r\n {{object.type}}\r\n @if(object.name) {\r\n ({{object.name}})\r\n }\r\n </ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div\r\n class=\"object-properties-header-link-icon\"\r\n title=\"{{'_Create link' | translate}}\"\r\n (click)=\"openLink()\"\r\n (keydown)=\"openLink()\"\r\n >\r\n </div>\r\n @if (openLinkMessage) {\r\n <lib-bimplus-link-tooltip-message\r\n [enableCopyPressKeys]=\"linkData.enableCopyPressKeys\"\r\n [titleHeader]=\"linkData.titleHeader\"\r\n [link]=\"linkData.link\"\r\n [onClose]=\"closeLink\"\r\n />\r\n }\r\n <div\r\n class=\"object-properties-header-close-icon\"\r\n (click)=\"_closePropertiesPanel($event)\"\r\n (keydown)=\"_closePropertiesPanel($event)\"\r\n title=\"{{'_Close_properties_panel_title' | translate}}\"\r\n >\r\n </div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'round',\r\n standalone: true\r\n})\r\nexport class RoundPipe implements PipeTransform {\r\n\r\n transform(value: string, decimal: number): string {\r\n const num = parseFloat(value);\r\n const dec = decimal;\r\n\r\n const mult = Math.pow(10, dec);\r\n\r\n return \"\" + Math.round(num * mult) / mult;\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\nimport { RoundPipe } from './round.pipe';\r\nimport moment from 'moment';\r\n// @ts-expect-error TS2882: moment/min/locales ships no type declarations for its side-effect entry point.\r\nimport 'moment/min/locales';\r\n\r\n\r\n@Pipe({\r\n name: 'getAttributeValueAsString',\r\n standalone: true\r\n})\r\nexport class GetAttributeValueAsString implements PipeTransform {\r\n\r\n constructor() {\r\n const locale = window.navigator.language;\r\n moment.locale(locale);\r\n }\r\n\r\n _transformDoubleToString(value: ObjectAttribute): string {\r\n return new RoundPipe().transform(value.value, value.decimal || 2);\r\n }\r\n\r\n _transformDoubleEnumerationToString(value: ObjectAttribute): string {\r\n if(!value.enumdefinition) {\r\n return '';\r\n }\r\n const _retval = value.enumdefinition[Number(value.value)];\r\n if(_retval) {\r\n return `${_retval}`;\r\n }\r\n return '';\r\n }\r\n\r\n _transformDatetimeToString(value: ObjectAttribute): string {\r\n const localeDate: string = moment(value.value).format('L')\r\n if(localeDate) {\r\n return localeDate;\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformGUIDToString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformEnumerationToString(value: ObjectAttribute): string {\r\n if(value.control && /^Enumeration$/i.test(value.control)) {\r\n if(!value.enumdefinition) {\r\n return '';\r\n }\r\n const _retVal = value.enumdefinition[Number(value.value)];\r\n if(_retVal) {\r\n return `${_retVal}`;\r\n }\r\n return '';\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformGUIDEnumerationToString(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformIntToString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformIntEnumerationToString(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformString(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformStringEnumeration(value: ObjectAttribute): string {\r\n return this._transformEnumerationToString(value);\r\n }\r\n\r\n _transformStringCombobox(value: ObjectAttribute): string {\r\n if(value.control && /^Combobox$/i.test(value.control)) {\r\n return `${value.value}`;\r\n }\r\n return `${value.value}`;\r\n }\r\n\r\n _transformBooleanToString(value: ObjectAttribute): string {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return \"True\";\r\n }\r\n return \"False\";\r\n }\r\n\r\n transform(value: ObjectAttribute): string {\r\n const _value = value.value;\r\n if (this.isEmpty(_value)) {\r\n return '';\r\n }\r\n\r\n if (this.isDouble(value)) {\r\n return this._transformDoubleToString(value);\r\n }\r\n\r\n if (this.isDoubleEnumeration(value)) {\r\n return this._transformDoubleEnumerationToString(value);\r\n }\r\n\r\n if (this.isDatetime(value)) {\r\n return this._transformDatetimeToString(value);\r\n }\r\n\r\n if (this.isGUID(value)) {\r\n return this._transformGUIDToString(value);\r\n }\r\n\r\n if (this.isGUIDEnumeration(value)) {\r\n return this._transformGUIDEnumerationToString(value);\r\n }\r\n\r\n if (this.isInt(value)) {\r\n return this._transformIntToString(value);\r\n }\r\n\r\n if (this.isIntEnumeration(value)) {\r\n return this._transformIntEnumerationToString(value);\r\n }\r\n\r\n if (this.isString(value)) {\r\n return this._transformString(value);\r\n }\r\n\r\n if (this.isStringEnumeration(value)) {\r\n return this._transformStringEnumeration(value);\r\n }\r\n\r\n if (this.isStringCombobox(value)) {\r\n return this._transformStringCombobox(value);\r\n }\r\n\r\n if (this.isBooleanCheckbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n if (this.isBooleanTextbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n return value.value;\r\n }\r\n\r\n private isEmpty(value: string | undefined | null): boolean {\r\n return value === undefined || value === null || value === '';\r\n }\r\n\r\n private isDouble(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isDoubleEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isDatetime(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUID(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUIDEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isInt(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isIntEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isString(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isStringEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isStringCombobox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^combobox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanCheckbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type)\r\n && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanTextbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\r\n }\r\n}\r\n","import { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\n\r\nexport function isObjectPropertyValueBlank(attrib: ObjectAttribute): boolean {\r\n return attrib.value === undefined\r\n || attrib.value === null\r\n || attrib.value === ''\r\n || attrib.value === '\\n\\t'\r\n || attrib.value === '\\n'\r\n || attrib.value === '\\t';\r\n}","import { Input, Component, ViewEncapsulation, signal, ChangeDetectionStrategy } from '@angular/core';\r\nimport isURL from 'validator/lib/isURL';\r\n\r\n@Component({\r\n selector: 'lib-object-property-value',\r\n standalone: true,\r\n templateUrl: './object-property-value.component.html',\r\n styleUrls: ['./object-property-value.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ObjectPropertyValueComponent {\r\n protected _tooltip = signal<string>('');\r\n protected _value = signal<string>('');\r\n protected _valueIsUrl = signal<boolean>(false);\r\n protected _decoratedHyperlink = signal<string>('');\r\n\r\n @Input() set value(value: string) {\r\n this._value.set(value);\r\n if(this._isUrl(value)) {\r\n this._valueIsUrl.set(true);\r\n this._decoratedHyperlink.set(this._decorateHyperlink(value));\r\n }\r\n else {\r\n this._valueIsUrl.set(false);\r\n }\r\n }\r\n\r\n @Input() set tooltip(tooltip: string) {\r\n this._tooltip.set(tooltip);\r\n }\r\n\r\n private _isUrl(url: string): boolean {\r\n if (!url) {\r\n return false;\r\n }\r\n const link = url.trim();\r\n if(!/^http(s?):\\/\\//.exec(link) && !/^www\\./.exec(link)) {\r\n return false;\r\n }\r\n\r\n return isURL(link);\r\n }\r\n\r\n private _decorateHyperlink(url: string): string {\r\n if(!this._isUrl(url)) {\r\n return '';\r\n }\r\n let link = url.trim();\r\n\r\n if (link && !/^http(s?):\\/\\//.exec(link)) {\r\n link = 'https://' + link;\r\n }\r\n return link;\r\n }\r\n\r\n constructor() { }\r\n}\r\n","@if(_valueIsUrl()) {\r\n <a class=\"link-detect-automatically\" target=\"_blank\" rel=\"noopener\" href={{_decoratedHyperlink()}} title=\"{{_tooltip()}}\">{{_value()}}</a>\r\n}\r\n@else {\r\n <div class=\"value\" title=\"{{_tooltip()}}\">\r\n {{_value()}}\r\n </div>\r\n}\r\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-text-field',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-text-field.component.html',\r\n styleUrl: './bimplus-input-text-field.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputTextFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputTextFieldComponent implements ControlValueAccessor {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _showClearButton = signal<boolean>(false);\r\n @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\r\n this._showClearButton.set(show_clear_button);\r\n }\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n value: string = '';\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _clearValue(event: Event): void {\r\n this.value = \"\";\r\n this.inputElement.nativeElement.focus();\r\n this.onChange(this.value);\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div\r\n class=\"text-input-wrapper\"\r\n [class.invalid-value]=\"!_validValue()\"\r\n [class.with-clear-button]=\"_showClearButton()\"\r\n>\r\n <input\r\n type=\"text\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (blur)=\"handleBlur()\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n class=\"text-input\"\r\n #inputValueBox\r\n />\r\n @if(_showClearButton()) {\r\n <div\r\n class=\"clear-button\"\r\n (click)=\"_clearValue($event)\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n >\r\n </div>\r\n }\r\n</div>\r\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Output,\n ViewEncapsulation,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-checkbox',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-checkbox.component.html',\r\n styleUrl: './bimplus-input-checkbox.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputCheckboxComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputCheckboxComponent implements ControlValueAccessor {\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n value: boolean = false;\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: boolean) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n // Called when the checkbox value changes\r\n onCheckboxChange(event: Event) {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.value = checked;\r\n this.onChange(checked); // Notify the parent form about the change\r\n this.onTouched(); // Mark the control as touched\r\n }\r\n\r\n writeValue(value: boolean): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n toggleAttributeValue() {\r\n this.value = !this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n}\r\n","<div\r\n class=\"select-checkbox\"\r\n>\r\n <div>\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"value\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"toggleAttributeValue()\"\r\n (keypress)=\"toggleAttributeValue()\"\r\n >\r\n <span></span>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-number',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslateModule\r\n ],\r\n templateUrl: './bimplus-input-number.component.html',\r\n styleUrl: './bimplus-input-number.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputNumberComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class BimplusInputNumberComponent implements ControlValueAccessor {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n @Input() minValue: string = '';\r\n @Input() maxValue: string = '';\r\n\r\n value: number = 0;\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: number) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: number): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: number) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = parseInt(input.value);\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div\r\n class=\"text-input-wrapper\"\r\n [class.invalid-value]=\"!_validValue()\"\r\n>\r\n <input\r\n type=\"number\"\r\n [value]=\"value\"\r\n (input)=\"handleInput($event)\"\r\n (blur)=\"handleBlur()\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n class=\"text-input\"\r\n [min]=\"minValue\"\r\n [max]=\"maxValue\"\r\n #inputValueBox\r\n />\r\n</div>\r\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n ViewEncapsulation,\n signal,\n booleanAttribute,\n ViewChild,\n ElementRef,\n OnInit,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n , FormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n\r\ninterface EnumDefinition {\r\n id: string;\r\n name: string;\r\n};\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-combobox',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgSelectModule,\r\n TranslateModule\r\n],\r\n templateUrl: './bimplus-input-combobox.component.html',\r\n styleUrl: './bimplus-input-combobox.component.less',\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputComboboxComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\n\r\nexport class BimplusInputComboboxComponent implements ControlValueAccessor, OnInit {\r\n @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\r\n @Input() placeholder: string = '';\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n private _type: string = 'enum';\r\n protected _enumdefinition: Array<EnumDefinition> = [];\r\n @Input() set enumdefinition(enum_definition: Record<number | string, string> | undefined | Array<string>) {\r\n if(!enum_definition) {\r\n return;\r\n }\r\n if(Array.isArray(enum_definition)) {\r\n enum_definition.forEach((value, index) => {\r\n this._enumdefinition.push({ id: index.toString(), name: value });\r\n });\r\n this._type = 'array';\r\n return;\r\n }\r\n Object.keys(enum_definition).forEach((key) => {\r\n if(typeof key === 'string') {\r\n this._enumdefinition.push({ id: key, name: enum_definition[key] });\r\n }\r\n if(typeof key === 'number') {\r\n this._enumdefinition.push({ id: key, name: enum_definition[Number(key)] });\r\n }\r\n\r\n });\r\n }\r\n\r\n private _setActiveEnumValue() {\r\n const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.id === this._selectedValue);\r\n if(!sel){\r\n return;\r\n }\r\n this.activeEnum = sel\r\n }\r\n\r\n _setActiveArrayValue() {\r\n const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.name === this._selectedValue);\r\n if(!sel){\r\n return;\r\n }\r\n this.activeEnum = sel\r\n }\r\n\r\n private _selectedValue: string | null = null;\r\n @Input() set selectedValue(value: string | null) {\r\n this._selectedValue = value;\r\n if(this._type === 'enum') {\r\n this._setActiveEnumValue();\r\n return;\r\n }\r\n if(this._type === 'array') {\r\n this._setActiveArrayValue();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.activeEnumSubject$.subscribe({\r\n next: (value) => {\r\n if(this._type === 'enum') {\r\n this.value = value?.id ?? '';\r\n this.onChange(this.value);\r\n }\r\n if(this._type === 'array') {\r\n this.value = value?.name ?? '';\r\n this.onChange(this.value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n set activeEnum(value : EnumDefinition | null){\r\n this.activeEnumSubject$.next(value);\r\n }\r\n\r\n get activeEnum() : EnumDefinition | null {\r\n return this.activeEnumSubject$.getValue();\r\n }\r\n\r\n activeEnumSubject$ = new BehaviorSubject<EnumDefinition | null> (null);\r\n\r\n \r\n value: string = '';\r\n isDisabled: boolean = false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input.value;\r\n this.onChange(this.value);\r\n }\r\n\r\n handleBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n}\r\n","<div class=\"enum-wrapper\" [class.invalid-value]=\"!_validValue()\">\r\n <div class=\"double-enumeration\">\r\n <ng-select\r\n class=\"enum-dropdown\"\r\n [(ngModel)]=\"activeEnum\"\r\n [clearable]=\"false\"\r\n [searchable]=\"_enumdefinition.length >= 10\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n >\r\n @for (val of _enumdefinition; track val) {\r\n <ng-option [value]=\"val\">{{\r\n val.name\r\n }}</ng-option>\r\n }\r\n </ng-select>\r\n </div>\r\n</div>\r\n","import {\n Component,\n OnInit,\n forwardRef,\n Input,\n Output,\n booleanAttribute,\n signal,\n EventEmitter,\n ViewChild,\n ElementRef,\n ViewEncapsulation,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { ControlValueAccessor\r\n , NG_VALUE_ACCESSOR\r\n , ReactiveFormsModule\r\n , FormsModule\r\n} from \"@angular/forms\";\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\nimport { MatNativeDateModule, DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\r\nimport { MomentDateModule, MAT_MOMENT_DATE_ADAPTER_OPTIONS, MomentDateAdapter} from '@angular/material-moment-adapter';\r\nimport { MatDatepickerModule, MatDatepickerInputEvent } from '@angular/material/datepicker';\r\n\r\nexport const MY_DATE_FORMATS = {\r\n parse: {\r\n dateInput: 'L', \r\n },\r\n display: {\r\n dateInput: 'L', \r\n monthYearLabel: 'MMM YYYY',\r\n dateA11yLabel: 'L',\r\n monthYearA11yLabel: 'MMM YYYY',\r\n }\r\n};\r\n\r\n@Component({\r\n selector: 'lib-bimplus-input-date',\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n MatDatepickerModule,\r\n MomentDateModule,\r\n MatNativeDateModule\r\n],\r\n templateUrl: './bimplus-input-date.component.html',\r\n styleUrls: ['./bimplus-input-date.component.less'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BimplusInputDateComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: DateAdapter,\r\n useClass: MomentDateAdapter,\r\n deps: [MAT_DATE_LOCALE, MAT_DATE_FORMATS, MAT_MOMENT_DATE_ADAPTER_OPTIONS]\r\n },\r\n {\r\n provide: MAT_DATE_FORMATS,\r\n useValue: MY_DATE_FORMATS\r\n },\r\n {\r\n provide: MAT_DATE_LOCALE,\r\n useValue: navigator.language\r\n }, // Set the locale here!\r\n {\r\n provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS,\r\n useValue: {\r\n useUtc: false\r\n }\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusInputDateComponent implements ControlValueAccessor, OnInit {\r\n @ViewChild('inputDateBox', { static: false }) inputDateBox!: ElementRef;\r\n \r\n value: string = '';\r\n dateValue: Date | null = new Date();\r\n isDisabled: boolean = false;\r\n\r\n @Output() enterKeyPressed = new EventEmitter<void>();\r\n\r\n protected _showClearButton = signal<boolean>(false);\r\n @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\r\n this._showClearButton.set(show_clear_button);\r\n }\r\n\r\n protected _validValue = signal<boolean>(true);\r\n @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\r\n this._validValue.set(valid_value);\r\n }\r\n\r\n @Input() minValue: string = '';\r\n @Input() maxValue: string = '';\r\n\r\n constructor() { }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {\r\n };\r\n onTouched = () => {\r\n };\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n this.dateValue = new Date(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n }\r\n\r\n private readonly STYLE_ID = 'datepicker-styles';\r\n private injectGlobalStyles(): void {\r\n // Check if the style tag already exists\r\n if (document.getElementById(this.STYLE_ID)) {\r\n return; // Style already injected, skip\r\n }\r\n\r\n // Create the style tag\r\n const styleElement = document.createElement('style');\r\n styleElement.id = this.STYLE_ID;\r\n\r\n styleElement.textContent = `\r\n mat-datepicker-content mat-calendar.bimplus-datepicker {\r\n background-color: var(--brand-white-color);\r\n border-color: var(--issue-details-view-select-border-color);\r\n border: .1rem solid;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-mdc-button {\r\n font-size: 1.6rem;\r\n font-weight: 700;\r\n }\r\n mat-calendar.bimplus-datepicker .mat-mdc-button:hover {\r\n border-radius: 0;\r\n }\r\n mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-controls {\r\n margin: 0;\r\n }\r\n mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-header {\r\n background-color: rgb(236, 239, 241);\r\n padding: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content {\r\n padding: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header{\r\n height: 2rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr{\r\n height: 2rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr th{\r\n height: 2rem;\r\n padding: 0;\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-today {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td.mat-calendar-body-label {\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button{\r\n font-size: 1.3rem;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\r\n border-radius: 0;\r\n }\r\n\r\n mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td.mat-calendar-body-label {\r\n font-size: 1.3rem;\r\n font-weight: 700;\r\n }\r\n `;\r\n\r\n // Append the style tag to document.head\r\n document.head.appendChild(styleElement);\r\n }\r\n ngOnInit() {\r\n this.injectGlobalStyles();\r\n console.log('BimplusInputDateComponent ngOnInit'); \r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _clearValue(event: Event): void {\r\n this.value = \"\";\r\n this.dateValue = null;\r\n this.onChange(this.value);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _showDatePicker(event: Event): void {\r\n console.log('BimplusInputDateComponent _showDatePicker');\r\n }\r\n \r\n protected handleKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n this.enterKeyPressed.emit();\r\n }\r\n\r\n onDateChanged(event: MatDatepickerInputEvent<Date>) {\r\n const selectedDate = event.value;\r\n\r\n if (selectedDate) {\r\n this.value = selectedDate.toISOString();\r\n this.onChange(this.value);\r\n console.log('Selected Date (UTC):', selectedDate);\r\n }\r\n }\r\n}\r\n","<div class=\"date-input-wrapper\">\r\n <mat-datepicker-toggle matIconPostfix [for]=\"picker\" [disableRipple]=\"true\"></mat-datepicker-toggle>\r\n <input matInput [matDatepicker]=\"picker\" readonly [(ngModel)]=\"dateValue\" #inputDateBox (dateChange)=\"onDateChanged($event)\" (click)=\"picker.open()\">\r\n <mat-datepicker #picker [panelClass]=\"'bimplus-datepicker'\"></mat-datepicker>\r\n <div\r\n class=\"clear-button\"\r\n (click)=\"_clearValue($event)\"\r\n (keydown)=\"handleKeyDown($event)\"\r\n ></div>\r\n</div>","import {\n Component,\n Input,\n ViewEncapsulation,\n signal,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport {\r\n ObjectAttributeGroup\r\n , ObjectAttribute\r\n} from '../object-properties/object-properties.interface';\r\nimport { GetAttributeValueAsString } from '../../pipes/get-attribute-value-as-string.pipe';\r\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\r\nimport { ObjectPropertyValueComponent } from './object-property-value/object-property-value.component';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\nimport { BimplusInputCheckboxComponent } from \"../bimplus-input-checkbox/bimplus-input-checkbox.component\";\r\nimport { BimplusInputNumberComponent } from '../bimplus-input-number/bimplus-input-number.component';\r\nimport { BimplusInputComboboxComponent } from '../bimplus-input-combobox/bimplus-input-combobox.component';\r\nimport { BimplusInputDateComponent } from '../bimplus-input-date/bimplus-input-date.component';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-object-properties-group',\r\n imports: [\r\n GetAttributeValueAsString,\r\n ObjectPropertyValueComponent,\r\n BimplusInputTextFieldComponent,\r\n BimplusInputCheckboxComponent,\r\n BimplusInputNumberComponent,\r\n BimplusInputComboboxComponent,\r\n BimplusInputDateComponent,\r\n ReactiveFormsModule,\r\n CommonModule\r\n ],\r\n templateUrl: './object-properties-group.component.html',\r\n styleUrls: ['./object-properties-group.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesGroupComponent {\r\n protected _editMode = signal<boolean>(false);\r\n\r\n @Input() set editMode(edit_mode: boolean) {\r\n this._editMode.set(edit_mode);\r\n }\r\n\r\n @Input() objectPropertiesForm: FormGroup | undefined;\r\n\r\n protected _existFormControlForAttibute(attribId: string): boolean {\r\n if(!this.objectPropertiesForm) {\r\n return false;\r\n }\r\n\r\n const attrib = this.objectPropertiesForm.get(attribId);\r\n\r\n if(!attrib) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected _isValueValid(attribId: string): boolean {\r\n if(!this.objectPropertiesForm) {\r\n return false;\r\n }\r\n const attrib = this.objectPropertiesForm.get(attribId);\r\n\r\n if(!attrib) {\r\n return false;\r\n }\r\n return attrib?.valid;\r\n }\r\n\r\n protected _canUpdateObject = signal<boolean>(false);\r\n @Input() set canUpdateObject(canUpdateObject: boolean) {\r\n this._canUpdateObject.set(canUpdateObject);\r\n }\r\n\r\n protected _attributesGroup = signal<ObjectAttributeGroup>({\r\n name: '',\r\n attributes: [],\r\n expanded: false,\r\n });\r\n\r\n @Input() set attributesGroup(value: ObjectAttributeGroup | undefined) {\r\n if(!value){\r\n return;\r\n }\r\n this._attributesGroup.set(value);\r\n }\r\n\r\n constructor() { }\r\n\r\n protected isValueBlank(attrib: ObjectAttribute): boolean {\r\n return isObjectPropertyValueBlank(attrib);\r\n }\r\n protected _isBoleanTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isBoleanCheckBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^checkbox$/i.test(attrib.control));\r\n }\r\n protected _isTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isDoubleTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isIntegerTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isGuidTextBox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type)) && !attrib.control;\r\n }\r\n protected _isDoubleEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isGuidEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isIntegerEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isStringEnumeration(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\r\n }\r\n protected _isStringCombobox(attrib: ObjectAttribute): boolean {\r\n return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\r\n && (typeof attrib.control === 'string' && /^combobox$/i.test(attrib.control));\r\n }\r\n protected _isDatetime(attrib: ObjectAttribute): boolean {\r\n return ((typeof attrib.type === 'string' && /^datetime$/i.test(attrib.type)) && !attrib.control);\r\n }\r\n}\r\n","@if(objectPropertiesForm) {\r\n <div class=\"object-property-table\"\r\n [formGroup]=\"objectPropertiesForm\"\r\n [class.edit-mode] = \"_editMode()\"\r\n >\r\n @for (attrib of _attributesGroup().attributes; track attrib) {\r\n <div class=\"row-wrapper\">\r\n <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\r\n <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\r\n <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\r\n @if(_editMode() && _canUpdateObject() && attrib.isChangeable && _existFormControlForAttibute(attrib.id)) {\r\n @if(\r\n _isBoleanTextBox(attrib)\r\n || _isTextBox(attrib)\r\n || _isDoubleTextBox(attrib)\r\n || _isGuidTextBox(attrib)\r\n ) {\r\n <lib-bimplus-input-text-field\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [showClearButton]=true\r\n />\r\n }\r\n @else if(\r\n _isIntegerTextBox(attrib)\r\n ) {\r\n <lib-bimplus-input-number\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n minValue=\"{{attrib.minValue}}\"\r\n maxValue=\"{{attrib.maxValue}}\"\r\n />\r\n }\r\n @else if(\r\n _isBoleanCheckBox(attrib)\r\n ) {\r\n <lib-bimplus-input-checkbox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n />\r\n }\r\n @else if(\r\n _isDoubleEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value | number\"\r\n />\r\n }\r\n @else if(\r\n _isGuidEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isIntegerEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value | number\"\r\n />\r\n }\r\n @else if(\r\n _isStringEnumeration(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isStringCombobox(attrib)\r\n ) {\r\n <lib-bimplus-input-combobox\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n [enumdefinition]=\"attrib.enumdefinition\"\r\n [selectedValue]=\"attrib.value\"\r\n />\r\n }\r\n @else if(\r\n _isDatetime(attrib)\r\n ) {\r\n <lib-bimplus-input-date\r\n class=\"flex-grow\"\r\n formControlName=\"{{attrib.id}}\"\r\n [validValue]=\"_isValueValid(attrib.id)\"\r\n minValue=\"{{attrib.minValue}}\"\r\n maxValue=\"{{attrib.maxValue}}\"\r\n [showClearButton]=true\r\n />\r\n }\r\n }\r\n @else {\r\n <lib-object-property-value\r\n value=\"{{attrib | getAttributeValueAsString}}\"\r\n tooltip=\"{{attrib.tooltip}}\"\r\n />\r\n }\r\n </div>\r\n <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\r\n </div>\r\n }\r\n </div>\r\n}\r\n@else {\r\n <div class=\"object-property-table\"\r\n [class.edit-mode] = \"_editMode()\"\r\n >\r\n @for (attrib of _attributesGroup().attributes; track attrib) {\r\n\r\n @if(!isValueBlank(attrib)) {\r\n <div class=\"row-wrapper\">\r\n <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\r\n <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\r\n <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\r\n <lib-object-property-value\r\n value=\"{{attrib | getAttributeValueAsString}}\"\r\n tooltip=\"{{attrib.tooltip}}\"\r\n />\r\n </div>\r\n <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\r\nimport { RoundPipe } from './round.pipe';\r\nimport moment from 'moment';\r\n// @ts-expect-error TS2882: moment/min/locales ships no type declarations for its side-effect entry point.\r\nimport 'moment/min/locales';\r\n\r\n\r\n@Pipe({\r\n name: 'getAttributeValue',\r\n standalone: true\r\n})\r\nexport class GetAttributeValue implements PipeTransform {\r\n\r\n constructor() {\r\n const locale = window.navigator.language;\r\n moment.locale(locale);\r\n }\r\n\r\n _transformDouble(value: ObjectAttribute): string {\r\n return new RoundPipe().transform(value.value, value.decimal ?? 2);\r\n }\r\n\r\n _transformDoubleEnumeration(value: ObjectAttribute): string {\r\n return this._transformDouble(value);\r\n }\r\n\r\n _transformDatetime(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformGUID(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformGUIDEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformInt(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformIntEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformString(value: ObjectAttribute): string {\r\n return value.value;\r\n }\r\n\r\n _transformStringEnumeration(value: ObjectAttribute): string {\r\n return `${value.value}`;\r\n }\r\n\r\n _transformStringCombobox(value: ObjectAttribute): string {\r\n if(value.control && /^combobox$/i.test(value.control)) {\r\n return value.value;\r\n }\r\n return '';\r\n }\r\n\r\n _transformBooleanToBoolean(value: ObjectAttribute): boolean {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n _transformBooleanToString(value: ObjectAttribute): string {\r\n if(value.value === '1'\r\n || /^true$/i.test(value.value)) {\r\n return \"True\";\r\n }\r\n return \"False\";\r\n }\r\n\r\n transform(value: ObjectAttribute): string | boolean {\r\n const _value = value.value;\r\n if (this.isEmpty(_value)) {\r\n return '';\r\n }\r\n\r\n if (this.isDouble(value)) {\r\n return this._transformDouble(value);\r\n }\r\n\r\n if (this.isDoubleEnumeration(value)) {\r\n return this._transformDoubleEnumeration(value);\r\n }\r\n\r\n if (this.isDatetime(value)) {\r\n return this._transformDatetime(value);\r\n }\r\n\r\n if (this.isGUID(value)) {\r\n return this._transformGUID(value);\r\n }\r\n\r\n if (this.isGUIDEnumeration(value)) {\r\n return this._transformGUIDEnumeration(value);\r\n }\r\n\r\n if (this.isInt(value)) {\r\n return this._transformInt(value);\r\n }\r\n\r\n if (this.isIntEnumeration(value)) {\r\n return this._transformIntEnumeration(value);\r\n }\r\n\r\n if (this.isString(value)) {\r\n return this._transformString(value);\r\n }\r\n\r\n if (this.isStringEnumeration(value)) {\r\n return this._transformStringEnumeration(value);\r\n }\r\n\r\n if (this.isStringCombobox(value)) {\r\n return this._transformStringCombobox(value);\r\n }\r\n\r\n if (this.isBooleanCheckbox(value)) {\r\n return this._transformBooleanToBoolean(value);\r\n }\r\n\r\n if (this.isBooleanTextbox(value)) {\r\n return this._transformBooleanToString(value);\r\n }\r\n\r\n return value.value;\r\n }\r\n\r\n private isEmpty(value: string | undefined | null): boolean {\r\n return value === undefined || value === null || value === '';\r\n }\r\n\r\n private isDouble(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isDoubleEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^double$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isDatetime(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUID(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isGUIDEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^guid$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isInt(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isIntEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isString(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\r\n }\r\n\r\n private isStringEnumeration(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\r\n }\r\n\r\n private isStringCombobox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^string$/i.test(value.type)\r\n && typeof value.control === 'string' && /^combobox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanCheckbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type)\r\n && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\r\n }\r\n\r\n private isBooleanTextbox(value: ObjectAttribute): boolean {\r\n return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\r\n }\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function doubleValidator(minValue: string, maxValue: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const value = control.value;\r\n const isValidDouble = /^[-+]?\\d*?\\.?\\d+?([eE][-+]?\\d+?)?$/.test(value); //Regex for a double\r\n\r\n if(!isValidDouble) {\r\n return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if(isNaN(parseFloat(value))) {\r\n return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if (minValue && parseFloat(value) < parseFloat(minValue)) {\r\n return { invalidDouble: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\r\n }\r\n if (maxValue && parseFloat(value) > parseFloat(maxValue)) {\r\n return { invalidDouble: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function integerValidator(minValue: string, maxValue: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValidInteger = /^[+-]?\\d+$/.test(value); //Regex for a integer\r\n\r\n if(!isValidInteger) {\r\n return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if(isNaN(parseInt(value))) {\r\n return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\r\n }\r\n\r\n if (minValue && parseInt(value) < parseInt(minValue)) {\r\n return { invalidInteger: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\r\n }\r\n if (maxValue && parseInt(value) > parseInt(maxValue)) {\r\n return { invalidInteger: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function guidValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValidGuid = /^[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$/.test(value); //Regex for a guid\r\n\r\n if(!isValidGuid) {\r\n return { invalidGuid: { value: value, message: `Invalid guid format: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function doubleEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AfterViewInit, Component, effect, ElementRef, Input, OnDestroy, ViewChild, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as Renderer from 'bimplus-renderer';\r\nimport * as THREE from 'three';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {TranslatePipe} from \"@ngx-translate/core\";\r\nimport { PreviewObject } from './object-preview.interface';\r\n\r\n@Component({\r\n selector: 'lib-object-preview',\r\n imports: [\r\n TranslatePipe\r\n ],\r\n templateUrl: './object-preview.component.html',\r\n styleUrls: ['./object-preview.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ObjectPreviewComponent implements AfterViewInit, OnDestroy {\r\n private readonly el = inject(ElementRef);\r\n\r\n private resizeObserver: ResizeObserver | null = null;\r\n viewport: Renderer.Viewport3D | null = null;\r\n isLoading = true;\r\n previousWidth = 0;\r\n previousHeight = 0;\r\n resizeTimeout: number | undefined;\r\n\r\n @ViewChild('rendererviewport') rendererViewportElement!: ElementRef;\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set objectId(id: string) {\r\n this._objectId = id;\r\n this.onObjectIdChanged();\r\n }\r\n\r\n get objectId(): string | undefined {\r\n return this._objectId;\r\n }\r\n\r\n private _objectId: string | undefined = undefined;\r\n\r\n @Input() revision: number | undefined = undefined;\r\n @Input() set visibleNode(value: PreviewObject){\r\n if(this.viewport){\r\n this.viewport.toggleObjectNode({id:value.id, visible:value.visible});\r\n }\r\n }\r\n @Input() set opaqueNode(value: PreviewObject){ \r\n if(this.viewport){\r\n this.viewport.toggleObjectNodeOpacity({id:value.id, opacity:value.opaque});\r\n }\r\n\r\n }\r\n\r\n private contentLoader: Renderer.BimplusContentLoader | null = null;\r\n\r\n private isRendererInitialized: boolean = false;\r\n\r\n constructor() {\r\n effect(()=>{\r\n if (this.visibleNode) {\r\n this.processVisibilityNode(this.visibleNode);\r\n }\r\n });\r\n // React to changes in the `opaqueNode` signal\r\n effect(() => {\r\n if (this.opaqueNode) {\r\n this.processOpacityNode(this.opaqueNode);\r\n }\r\n });\r\n }\r\n \r\n // Method to process the node\r\n processVisibilityNode(node: PreviewObject): void {\r\n console.log('Processing visbility of node in lib-object-preview:', node); \r\n }\r\n processOpacityNode(node: PreviewObject): void {\r\n console.log('Processing opacity of node in lib-object-preview:', node); \r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const container = this.el.nativeElement;\r\n \r\n // Initialize ResizeObserver\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n const width = entry?.contentRect?.width;\r\n\r\n if (width != this.previousWidth) {\r\n this.previousWidth = width;\r\n this.recalculatePreviewSize();\r\n }\r\n }\r\n });\r\n\r\n // Start observing the component's main container\r\n this.resizeObserver.observe(container);\r\n this.initRenderer();\r\n\r\n this.contentLoader = new Renderer.BimplusContentLoader(this.api as WebSdk.Api, this.viewport as Renderer.Viewport3D);\r\n\r\n this.isRendererInitialized = true;\r\n\r\n this.loadObject();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resizeObserver?.disconnect();\r\n this.viewport?.dispose();\r\n }\r\n\r\n recalculatePreviewSize() {\r\n clearTimeout(this.resizeTimeout);\r\n\r\n this.resizeTimeout = setTimeout(() => {\r\n const width = this.rendererViewportElement?.nativeElement.offsetWidth;\r\n const height = this.rendererViewportElement?.nativeElement.offsetHeight;\r\n\r\n if (width && height) {\r\n this.viewport?.setViewportSize(width, height);\r\n this.viewport?.draw();\r\n } else {\r\n console.error(\"Viewport size is zero\");\r\n }\r\n }, 1) as unknown as number; // Delay execution to avoid rapid resizing and flickering\r\n }\r\n\r\n metricUnits: Renderer.MeasurementUnits = {\r\n weight: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'kg',\r\n },\r\n length: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n width: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n height: {\r\n multiplicator: 0.001,\r\n precision: 2,\r\n unit: 'm',\r\n },\r\n area: {\r\n multiplicator: 0.000001,\r\n precision: 2,\r\n unit: 'm²',\r\n },\r\n volume: {\r\n multiplicator: 1e-9,\r\n precision: 2,\r\n unit: 'm³',\r\n },\r\n };\r\n\r\n imperialUnits: Renderer.MeasurementUnits = {\r\n length: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n width: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n height: {\r\n multiplicator: 0.00328083989,\r\n precision: 2,\r\n unit: 'feet',\r\n },\r\n };\r\n\r\n viewportSettings: Renderer.ViewportSettings = {\r\n defaultOpacity: 0.5,\r\n disciplineOpacity: 0.1,\r\n pinSizeScaleFactor: 2,\r\n maxWebGLBufferSize: 350e12,\r\n mixedModelMode: true,\r\n useFrameSelection: false,\r\n pinFlyToDistance: 20000,\r\n nearClippingPlane: 0.01,\r\n slideThmbSize: [180, 112],\r\n units: {\r\n mm: this.metricUnits,\r\n inch: {},\r\n },\r\n };\r\n\r\n units = {\r\n Metric: this.metricUnits,\r\n Imperial: this.imperialUnits,\r\n };\r\n\r\n setAmbientOcclusionOptions() {\r\n if (!this.viewport) {\r\n return\r\n }\r\n\r\n const viewportOcclusionData = {\r\n usage: false,\r\n usageForInteraction: false,\r\n useShadows: false,\r\n useShadowsForInteraction: false,\r\n lightRotation: Math.PI * 35.00 / 180.0,\r\n lightElevation: Math.PI * 50.00 / 180.0,\r\n lightColor: new THREE.Color(1.0, 1.0, 1.0),\r\n ambientLightColor: new THREE.Color(0.6, 0.6, 0.6),\r\n };\r\n this.viewport.setAmbientOcclusionOptions(viewportOcclusionData);\r\n }\r\n\r\n setBackgroundOptions() {\r\n if (!this.viewport) {\r\n return\r\n }\r\n\r\n const daySkyBackgroundSetting = {\r\n name: \"day sky\",\r\n ambientLightColor: 0x868686,\r\n backgroundType: Renderer.Background.BackgroundType_LinearGradient,\r\n backgroundParams: {\r\n alpha: 1.0,\r\n colorStops: [\r\n {\r\n offset: 0.0,\r\n color: \"#87CDE9\"\r\n },\r\n {\r\n offset: 0.5104,\r\n color: \"#DDEDFE\"\r\n },\r\n {\r\n offset: 0.9635,\r\n color: \"#D3D3D4\"\r\n }\r\n ]\r\n }\r\n };\r\n this.viewport.setBackground(daySkyBackgroundSetting.backgroundType, daySkyBackgroundSetting.backgroundParams);\r\n }\r\n\r\n setHoverOption(useHoverEffect: boolean = true) {\r\n if (!this.viewport) {\r\n return\r\n }\r\n this.viewport.setUseHoverEffect(useHoverEffect);\r\n }\r\n\r\n initRenderer() {\r\n this.viewport = new Renderer.Viewport3D({\r\n settings: this.viewportSettings,\r\n units: this.units.Metric,\r\n domElementId: \"\",\r\n GPUPick: true,\r\n api: this.api as WebSdk.Api,\r\n name: \"objectPreviewRendererViewport\",\r\n lookupTextureSize: 32,\r\n ssaoSupported: false, // Disable SSAO support for object details window\r\n shadowsSupported: false,\r\n panningScaleFactor: 4.0, //In case of preview window use bigger panning scale factor\r\n commandPolicies: {\r\n CommandSelect: {\r\n noBubble: true, // Don't do a upwards activation\r\n noTraverse: true // Don't do a downwards activation\r\n }\r\n }\r\n });\r\n\r\n this.setBackgroundOptions();\r\n this.setHoverOption();\r\n this.viewport.draw();\r\n\r\n if (this.viewport?.domElement) {\r\n this.viewport.domElement.id = \"objectPreviewRendererViewport\";\r\n const nativeElement = this.el.nativeElement?.shadowRoot || this.el.nativeElement;\r\n nativeElement?.getElementsByClassName?.(\"rendered-preview\")[0]?.appendChild?.(this.viewport.domElement);\r\n } else {\r\n console.error(\"no dom element present for renderer!\");\r\n }\r\n }\r\n\r\n private onObjectIdChanged() {\r\n this.loadObject();\r\n }\r\n\r\n private loadObject() {\r\n if (!this.isRendererInitialized) {\r\n return;\r\n }\r\n\r\n if (!this.contentLoader) {\r\n console.error(\"content loader is not there!\");\r\n return;\r\n }\r\n\r\n console.log('loading object:', this.objectId);\r\n\r\n this.isLoading = true;\r\n\r\n this.viewport?.resetViewport();\r\n\r\n const projectContent = null;\r\n this.contentLoader.loadObject(this.objectId as string, this.revision, projectContent).then(() => {\r\n // Set the viewport to project view - reset camera\r\n this.viewport?.setupProjectView();\r\n this.isLoading = false;\r\n });\r\n }\r\n}\r\n","<div class=\"rendered-preview\" #rendererviewport>\r\n @if (isLoading) {\r\n <div class=\"loading-spinner-icon\" title=\"{{'_LoadingGeometry' | translate}}\">\r\n </div>\r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ObjectPropertiesService {\r\n\r\n _model: BehaviorSubject<WebSdk.ObjectData | null> = new BehaviorSubject<WebSdk.ObjectData | null>(null);\r\n\r\n constructor() { }\r\n\r\n get modelValue(): WebSdk.ObjectData | null {\r\n return this._model.value;\r\n }\r\n\r\n get model$(): BehaviorSubject<WebSdk.ObjectData | null> {\r\n return this._model;\r\n }\r\n\r\n setModel(model: WebSdk.ObjectData): void {\r\n this._model.next(model);\r\n }\r\n\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function guidEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function stringEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!enumData) {\r\n return null;\r\n }\r\n if(Array.isArray(enumData)) {\r\n return null;\r\n }\r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = Object.keys(enumData).includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport function stringComboboxValidator(arrayData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if(!arrayData) {\r\n return null;\r\n }\r\n if(!Array.isArray(arrayData)) {\r\n return null;\r\n }\r\n \r\n const value = control.value;\r\n if(value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n const isValueFromEnum = arrayData.includes(value);\r\n\r\n if(!isValueFromEnum) {\r\n return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\r\n }\r\n\r\n return null;\r\n };\r\n}","import { Component, ViewEncapsulation, Input, OnInit, signal, WritableSignal, ChangeDetectorRef, EventEmitter, Output, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport {\r\n ObjectStructureNode,\r\n ObjectStructureNodeBuilder,\r\n} from '../bimplus-object-structure/bimplus-object-structure.interface';\r\nimport { PreviewObject } from '../object-preview/object-preview.interface';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport {\r\n from\r\n , BehaviorSubject\r\n} from 'rxjs';\r\nimport { BimplusObjectStructureComponent } from '../bimplus-object-structure/bimplus-object-structure.component';\r\nimport {\r\n ComplexPropertiesNode,\r\n ComplexPropertiesNodeBuilder,\r\n} from '../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\r\nimport { BimplusObjectComplexPropertiesComponent } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\r\nimport {\r\n ObjectAttribute,\r\n ObjectAttributeGroup,\r\n} from './object-properties.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport {\r\n BimplusButtonRowItem,\r\n BimplusButtonClickEvent,\r\n} from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation';\r\nimport { ObjectPropertiesGroupComponent } from '../object-properties-group/object-properties-group.component';\r\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\r\nimport {\r\n FormGroup\r\n , ReactiveFormsModule\r\n , FormBuilder\r\n , FormControl\r\n , Validators\r\n} from '@angular/forms';\r\nimport { GetAttributeValue } from '../../pipes/get-attribute-value.pipe';\r\nimport { doubleValidator } from '../../validators/double.validator';\r\nimport { integerValidator } from '../../validators/integer.validator';\r\nimport { guidValidator } from '../../validators/guid.validator';\r\nimport { doubleEnumValidator } from '../../validators/double-enum.validator';\r\nimport { ObjectPreviewComponent } from \"../object-preview/object-preview.component\";\r\nimport { ObjectPropertiesService } from './object-properties.service';\r\nimport { guidEnumValidator } from '../../validators/guid-enum.validator';\r\nimport { stringEnumValidator } from '../../validators/string-enum.validator';\r\nimport { stringComboboxValidator } from '../../validators/string-combobox.validator';\r\n\r\n@Component({\r\n selector: 'lib-object-properties',\r\n imports: [\r\n ExpansionPanelComponent,\r\n ExpansionPanelHeaderComponent,\r\n TranslateModule,\r\n BimplusObjectStructureComponent,\r\n BimplusObjectComplexPropertiesComponent,\r\n BimplusButtonsRowComponent,\r\n BimplusScrollableContainerComponent,\r\n ObjectPropertiesGroupComponent,\r\n ObjectPropertiesGroupComponent,\r\n ObjectPreviewComponent,\r\n ReactiveFormsModule\r\n ],\r\n templateUrl: './object-properties.component.html',\r\n styleUrls: ['./object-properties.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class ObjectPropertiesComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements OnInit\r\n{\r\n private readonly formBuilder = inject(FormBuilder);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly objectPropertiesService = inject(ObjectPropertiesService);\r\n\r\n protected _objectPropertiesForm = new FormGroup({});\r\n\r\n protected _objectPropertiesGroupForm(group_name: string): FormGroup {\r\n const _groupForm: FormGroup = this._objectPropertiesForm;\r\n return _groupForm.controls[group_name] as FormGroup;\r\n }\r\n\r\n constructor()\r\n {\r\n super();\r\n }\r\n\r\n protected _editMode = signal<boolean>(false);\r\n private _objectStructure: ObjectStructureNode | null = null;\r\n\r\n get objectStructure(): ObjectStructureNode | null {\r\n return this._objectStructure;\r\n }\r\n\r\n private _complexProperties: ComplexPropertiesNode | null = null;\r\n\r\n get complexProperties(): ComplexPropertiesNode | null {\r\n return this._complexProperties;\r\n }\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n @Input() revision: number | undefined = undefined;\r\n\r\n protected _canUpdateObject = signal<boolean>(false);\r\n @Input() set canUpdateObject(canUpdateObject: boolean) {\r\n this._canUpdateObject.set(canUpdateObject);\r\n }\r\n\r\n private _rootObjectId : string = \"\";\r\n @Input() set rootObjectId(id: string) {\r\n if(this._rootObjectId === id) {\r\n return;\r\n }\r\n this._cancelEditingProperties();\r\n\r\n this._currentObjectId$.next(id);\r\n this._createObjectStructure(id, this.revision);\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly isSaveButtonDisabled$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n protected readonly visibleNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\r\n protected readonly opaqueNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string> (\"\");\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n configEditProperties: Array<BimplusButtonRowItem> = [];\r\n configEditedProperties: Array<BimplusButtonRowItem> = [];\r\n\r\n @Output() updatedObjectProperties = new EventEmitter<{ [key: string]: unknown }>();\r\n\r\n _editPropertiesButtonsConfiguration() {\r\n this.configEditProperties.push({\r\n id: 'edit-properties',\r\n title: this.translateService.instant('_Edit_properties'),\r\n tooltip: this.translateService.instant('_Edit_properties'),\r\n disabled: !this._canUpdateObject(),\r\n buttonStyle: 'primary',\r\n });\r\n }\r\n\r\n _editedPropertiesButtonsConfiguration() {\r\n this.configEditedProperties.push({\r\n id: 'save-changed-properties',\r\n title: this.translateService.instant('_Save'),\r\n tooltip: this.translateService.instant('_Save'),\r\n disabled: this.isSaveButtonDisabled$,\r\n buttonStyle: 'primary',\r\n });\r\n this.configEditedProperties.push({\r\n id: 'cancel-editing-properties',\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'secondary',\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this._editPropertiesButtonsConfiguration();\r\n this._editedPropertiesButtonsConfiguration();\r\n\r\n this.buttonRowItems = this.configEditProperties;\r\n\r\n this.subscribeProperties(); \r\n }\r\n\r\n subscribeProperties() {\r\n this._currentPropertiesObjectId$.subscribe({\r\n next: (id) => {\r\n if (id) {\r\n this._createObjectProperties(id, this.revision);\r\n }\r\n },\r\n });\r\n\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._currentPropertiesObjectId$.next(id);\r\n this._createComplexPropertiestructure(id, this.revision);\r\n },\r\n });\r\n }\r\n\r\n handleObjectStructureNodeSelected(node: ObjectStructureNode) {\r\n console.log(node);\r\n this._currentObjectId$.next(node.id);\r\n }\r\n\r\n handleObjectStructureNodeVisible(node : ObjectStructureNode){\r\n const objNode: PreviewObject = {\r\n id:node.id,\r\n visible: node.visible,\r\n opaque: node.opaque};\r\n this.visibleNodeSignal.set(objNode); // Update the signal\r\n }\r\n\r\n handleObjectStructureNodeOpaque(node : ObjectStructureNode){\r\n const objNode: PreviewObject = {\r\n id:node.id,\r\n visible: node.visible,\r\n opaque: node.opaque};\r\n this.opaqueNodeSignal.set(objNode); // Update the signal\r\n }\r\n \r\n\r\n handleComplexPropertyNodeSelected(node : ComplexPropertiesNode){\r\n console.log(node);\r\n this._currentPropertiesObjectId$.next(node.id);\r\n }\r\n\r\n private _loadObjectStructure(objectId: string, revision: number | undefined) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.getTopology(objectId, revision, false, false, undefined)\r\n );\r\n }\r\n\r\n private _createObjectStructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n this._objectStructure =\r\n ObjectStructureNodeBuilder.createFromResponse(structureData);\r\n }\r\n },\r\n });\r\n }\r\n\r\n private _loadObjectComplexPropertiesStructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.getComplexPropertiesTopology(objectId, revision)\r\n );\r\n }\r\n\r\n private _createComplexPropertiestructure(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\r\n next: (structureData) => {\r\n if (structureData) {\r\n const complexProps =\r\n ComplexPropertiesNodeBuilder.createFromResponse(structureData);\r\n if (complexProps?.children?.length) {\r\n this._complexProperties = complexProps;\r\n } else {\r\n this._complexProperties = null;\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n protected objectAttributeGroups = signal<ObjectAttributeGroup[]>([]);\r\n\r\n private _loadObjectProperties(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n if (!objectId) {\r\n return;\r\n }\r\n\r\n return from(\r\n this.api.objects.get(objectId, revision, '8', undefined, false, undefined)\r\n );\r\n }\r\n\r\n private _createObjectProperties(\r\n objectId: string,\r\n revision: number | undefined\r\n ) {\r\n this._loadObjectProperties(objectId, revision)?.subscribe({\r\n // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\r\n // any for json response\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n next: (propertiesData: any) => {\r\n this.objectPropertiesService.setModel(propertiesData);\r\n this.objectAttributeGroups.set(this._createAttributeGroupsFromResponse(propertiesData));\r\n },\r\n error: () => {\r\n this.objectAttributeGroups.set([]);\r\n },\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _tooltip(attrib: any): string {\r\n const nameTitle: string = this.translateService.instant('_Name');\r\n const name: string = attrib.name ? attrib.name : '';\r\n const descriptionTitle: string =\r\n this.translateService.instant('description');\r\n const description: string = attrib.description;\r\n const uuidTitle: string = this.translateService.instant('_UUID');\r\n const uuid: string = attrib.id;\r\n if (\r\n description === null ||\r\n description === undefined ||\r\n description === ''\r\n ) {\r\n return `${nameTitle}: ${name}\\n${uuidTitle}: ${uuid}`;\r\n }\r\n return `${nameTitle}: ${name}\\n${descriptionTitle}: ${description}\\n${uuidTitle}: ${uuid}`;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _createAttributeGroupsFromResponse(propertiesData: any) {\r\n const groups: Array<ObjectAttributeGroup> = [];\r\n let localizedAttribGroups = null;\r\n if (propertiesData.localizedAttributeGroups) {\r\n localizedAttribGroups = propertiesData.localizedAttributeGroups;\r\n }\r\n\r\n if (!propertiesData.attributes) {\r\n return groups;\r\n }\r\n\r\n const attribGroups = propertiesData.attributes;\r\n for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\r\n const newGroup: ObjectAttributeGroup = {\r\n name: groupName,\r\n expanded: false,\r\n attributes: [],\r\n };\r\n\r\n if (localizedAttribGroups?.[groupName]) {\r\n newGroup.name = localizedAttribGroups[groupName];\r\n }\r\n\r\n if (!attribsObject) {\r\n continue;\r\n }\r\n\r\n for (const attrib of Object.values(attribsObject)) {\r\n const newAttrib: ObjectAttribute = {\r\n id: attrib.id,\r\n name: attrib.name,\r\n description: attrib.description,\r\n value: attrib.value,\r\n group: attrib.group,\r\n type: attrib.type,\r\n unit: attrib.unit,\r\n decimal: attrib.decimal,\r\n control: attrib.control,\r\n enumdefinition: attrib.enumdefinition,\r\n isChangeable: attrib.isChangeable,\r\n tooltip: this._tooltip(attrib),\r\n minValue: attrib.minValue,\r\n maxValue: attrib.maxValue,\r\n };\r\n\r\n newGroup.attributes.push(newAttrib);\r\n }\r\n groups.push(newGroup);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n _deleteForm() {\r\n this._objectPropertiesForm = new FormGroup({});\r\n }\r\n\r\n private initialFormValues: string = \"\";\r\n _createForm() {\r\n const _getAttributeValue = new GetAttributeValue();\r\n const _form: { [key: string]: FormGroup } = {};\r\n this.objectAttributeGroups().forEach(groupAttributes => {\r\n const _form_group: { [key: string]: FormControl | null } = {};\r\n groupAttributes.attributes.forEach(attribute => {\r\n if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [Validators.pattern(/^(false|true|0|1)$/i)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^checkbox$/i.test(attribute.control))\r\n )\r\n {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleValidator(attribute.minValue, attribute.maxValue)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [integerValidator(attribute.minValue, attribute.maxValue)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [guidValidator()] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [guidEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [stringEnumValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\r\n && (typeof attribute.control === 'string' && /^combobox$/i.test(attribute.control))\r\n ) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [stringComboboxValidator(attribute.enumdefinition)] : []\r\n );\r\n return;\r\n }\r\n if((typeof attribute.type === 'string' && /^datetime$/i.test(attribute.type)) && !attribute.control) {\r\n _form_group[attribute.id] = this.formBuilder.control(\r\n _getAttributeValue.transform(attribute)\r\n , attribute.isChangeable ? [] : []\r\n );\r\n return;\r\n }\r\n });\r\n _form[groupAttributes.name] = this.formBuilder.group(_form_group);\r\n });\r\n this._objectPropertiesForm = this.formBuilder.group(_form);\r\n\r\n this.initialFormValues = JSON.stringify(this._objectPropertiesForm.value);\r\n this._objectPropertiesForm.valueChanges.subscribe({\r\n next: (value) => {\r\n const changed: boolean = JSON.stringify(value) !== this.initialFormValues;\r\n this.isSaveButtonDisabled$.next(!(this._objectPropertiesForm.valid && changed));\r\n }\r\n });\r\n }\r\n\r\n private _getPropertyName(uuid: string): string {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.name;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _getPropertyType(uuid: string): string {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.type;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _getPropertyControl(uuid: string): string | undefined {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return attr.control;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n private _convertValueToBoolean(value: string): boolean {\r\n return /^true$/i.test(value) || /^1$/i.test(value);\r\n }\r\n\r\n private _convertValueToDouble(value: string): number {\r\n return parseFloat(value);\r\n }\r\n\r\n private _hasBeenValueChanged(uuid: string, value: string | number | boolean): boolean {\r\n const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\r\n for (const attrGroup of attrGroups) {\r\n for (const attr of attrGroup.attributes) {\r\n if (attr.id === uuid) {\r\n return value !== attr.value;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _getChangedData(formGroup: FormGroup): { [key: string]: unknown } {\r\n const changedData: { [key: string]: unknown } = {};\r\n\r\n Object.keys(formGroup.controls).forEach(key => {\r\n const control = formGroup.get(key);\r\n\r\n if (control instanceof FormControl) {\r\n // If it's a FormControl and it's dirty, capture the changed value\r\n if (control.dirty) {\r\n const propName: string = this._getPropertyName(key);\r\n const propType: string = this._getPropertyType(key);\r\n // const propControl: string = this._getPropertyControl(key);\r\n if(propName === '') {\r\n const _newValue = {\r\n id: key,\r\n value: control.value\r\n };\r\n changedData[key] = _newValue;\r\n } else {\r\n if(/^boolean$/i.test(propType)) {\r\n const _val: boolean = this._convertValueToBoolean(control.value);\r\n if(this._hasBeenValueChanged(key, _val)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n else if(/^double$/i.test(propType)) {\r\n const _val: number = this._convertValueToDouble(control.value);\r\n if(this._hasBeenValueChanged(key, _val)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n else {\r\n const _val: string = control.value;\r\n\r\n if(this._hasBeenValueChanged(key, control.value)) {\r\n const _newValue = {\r\n id: key,\r\n value: _val\r\n };\r\n changedData[propName] = _newValue;\r\n }\r\n }\r\n }\r\n }\r\n } else if (control instanceof FormGroup) {\r\n if(control.dirty) {\r\n // Recursively get changed data from nested FormGroup\r\n const nestedChanges = this._getChangedData(control);\r\n if (Object.keys(nestedChanges).length > 0) {\r\n changedData[key] = nestedChanges;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return changedData;\r\n }\r\n\r\n private _saveObjectProperties() {\r\n const saveData: { [key: string]: unknown } = {};\r\n saveData['id'] = this._currentObjectId$.value;\r\n saveData['unsaved'] = true;\r\n saveData['attributes'] = this._getChangedData(this._objectPropertiesForm);\r\n this.saveObjectProperties(saveData);\r\n }\r\n\r\n private _cancelEditingProperties() {\r\n this._editMode.set(false);\r\n this._deleteForm();\r\n this.buttonRowItems = this.configEditProperties\r\n }\r\n\r\n protected buttonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'edit-properties') {\r\n this._editMode.set(true);\r\n this._createForm();\r\n console.log('Edit properties clicked');\r\n this.buttonRowItems = this.configEditedProperties;\r\n }\r\n\r\n if ($event.id === 'save-changed-properties') {\r\n this._saveObjectProperties();\r\n this._cancelEditingProperties();\r\n console.log('Save changed properties clicked');\r\n }\r\n\r\n if ($event.id === 'cancel-editing-properties') {\r\n this._cancelEditingProperties();\r\n console.log('Cancel edit properties clicked');\r\n }\r\n }\r\n\r\n hasSetAnyAttribute(objectAttributeGroup: ObjectAttributeGroup) {\r\n return objectAttributeGroup.attributes.some((attrib) => {\r\n return !isObjectPropertyValueBlank(attrib);\r\n });\r\n }\r\n\r\n protected saveObjectProperties(data: { [key: string]: unknown }): void {\r\n const selectedObjectId = this._currentPropertiesObjectId$.value;\r\n if (!data || !selectedObjectId) {\r\n return;\r\n }\r\n\r\n if (!this.api) {\r\n return;\r\n }\r\n\r\n from(this.api.objects.put(selectedObjectId, JSON.stringify(data))).subscribe({\r\n next: (response: { [key: string]: unknown }) => {\r\n this._createObjectProperties(selectedObjectId, this.revision);\r\n this._createObjectStructure(selectedObjectId, this.revision);\r\n this.updatedObjectProperties.emit({ id: selectedObjectId, request: data, response });\r\n },\r\n });\r\n }\r\n}\r\n","<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n [hasCheckBox1]=\"true\"\r\n [hasCheckBox2]=\"true\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\"\r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n","import { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport {TranslateModule, TranslateService} from \"@ngx-translate/core\";\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\n\r\nexport interface ConfirmDialogInputData {\r\n title: string;\r\n message: string;\r\n acceptButtonLocalizedString: string;\r\n cancelButtonLocalizedString: string;\r\n acceptCallback: () => void;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-confirm',\r\n imports: [\r\n TranslateModule,\r\n BimplusButtonsRowComponent\r\n ],\r\n templateUrl: './bimplus-overlay-dialog-confirm.component.html',\r\n styleUrl: './bimplus-overlay-dialog-confirm.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\n\r\nexport class BimplusOverlayDialogConfirmComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n acceptButtonLocalizedString: string = '_Accept';\r\n cancelButtonLocalizedString: string = '_Cancel';\r\n acceptCallback: (() => void) | undefined;\r\n protected buttons: BimplusButtonRowItem[] = [];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n const data = this.dialogService.inputData as ConfirmDialogInputData;\r\n\r\n if (data) {\r\n this.title = data.title || '';\r\n this.message = data.message || '';\r\n this.acceptButtonLocalizedString = data.acceptButtonLocalizedString || '_Accept';\r\n this.cancelButtonLocalizedString = data.cancelButtonLocalizedString || '_Cancel';\r\n this.acceptCallback = data.acceptCallback;\r\n }\r\n\r\n this.initializeButtons();\r\n }\r\n\r\n initializeButtons() {\r\n this.buttons = [\r\n {\r\n id: \"accept\",\r\n title: this.translateService.instant(this.acceptButtonLocalizedString),\r\n tooltip: this.translateService.instant(this.acceptButtonLocalizedString),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n },\r\n {\r\n id: \"cancel\",\r\n title: this.translateService.instant(this.cancelButtonLocalizedString),\r\n tooltip: this.translateService.instant(this.cancelButtonLocalizedString),\r\n disabled: false,\r\n buttonStyle: 'secondary'\r\n }\r\n ];\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n (document.activeElement as HTMLElement)?.blur();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.dialogService.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n this.dialogService.close();\r\n\r\n if ($event.id === \"accept\") {\r\n this.acceptCallback?.();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"header\">\r\n <div class=\"icon\"></div>\r\n <div class=\"title-text\">\r\n {{ title }}\r\n </div>\r\n <div\r\n class=\"close-button\"\r\n (click)=\"close()\"\r\n (keydown)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"content\">\r\n <div class=\"text\" [innerHTML]=\"message\"></div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DecoratorsService {\r\n\r\n constructor() { }\r\n \r\n fmt(string: string, ...formats: unknown[]): string {\r\n let index = 0;\r\n\r\n return string.replace(/%@(\\d+)?/g, (match: string, argumentIndex: string) => {\r\n const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;\r\n const _match = formats[argumentIndexN];\r\n\r\n if (_match === null) {\r\n return '(null)';\r\n }\r\n if (_match === undefined) {\r\n return '';\r\n }\r\n return _match.toString();\r\n });\r\n }\r\n/**--------------------------------------------------------------------------\r\n * decorate link\r\n --------------------------------------------------------------------------*/\r\n decorateLink(api:WebSdk.Api,link:WebSdk.AttachmentLink,objectIds:[string]):WebSdk.AttachmentLink{\r\n\r\n const retval:WebSdk.AttachmentLink = {\r\n id: link.id,\r\n name: link.name,\r\n fileName: link.fileName,\r\n size: link.size,\r\n link: link.link,\r\n fileNameShort: '',\r\n extension: '',\r\n objectIds: objectIds,\r\n version: link.version,\r\n sizeMB: \"\"\r\n };\r\n const access_token = api.getAccessToken();\r\n const attVersion = \"attachments/%@/versions/%@/download\";\r\n const url = api.getApiTeamUrl()+attVersion;\r\n const isEmbeddedAllplanMode = false;\r\n retval.size = parseFloat((link.size / 1000).toFixed(2));\r\n retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${ isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;\r\n if (link.fileName.length > 20) {\r\n const fileParts = link.fileName.split('.');\r\n if (fileParts.length > 1) {\r\n retval.fileNameShort = fileParts.slice(0, -1).join('.');\r\n retval.extension = \".\" + fileParts.slice(-1);\r\n } else {\r\n retval.fileNameShort = link.fileName;\r\n }\r\n } else {\r\n retval.fileNameShort = link.fileName;\r\n } \r\n return retval;\r\n } \r\n}\r\n","import { Component, ViewEncapsulation, Input, OnInit, Renderer2, ElementRef, OnDestroy, booleanAttribute, Output, EventEmitter, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { from , BehaviorSubject, switchMap, forkJoin } from 'rxjs';\r\nimport { concatMap } from 'rxjs/operators';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport {\r\n BimplusOverlayDialogConfirmComponent\r\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport * as WebClient from 'bimplus-webclient';\r\nimport {NewAttachInfo} from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\r\nimport {DecoratorsService } from '../../services/decorators.service';\r\nexport const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';\r\n\r\nexport const postAttachmentLinks = (newAttachmentIDs: string[], objectId: string, api: WebSdk.Api) => {\r\n // Create an array of observables for each post request\r\n const postRequests = newAttachmentIDs.map((id) => \r\n from(api.objects.postAttachmentLink(objectId, JSON.stringify({ attachmentId: id}))) \r\n );\r\n\r\n // Use forkJoin to wait for all post requests to complete in parallel\r\n return forkJoin(postRequests)\r\n .pipe(\r\n // After all posts are complete, switch to the next call to get updated links\r\n concatMap(() => from(api.objects.getAttachmentLinks(objectId)))\r\n )\r\n}\r\n\r\n@Component({\r\n selector: 'lib-links-to-documents',\r\n imports: [\r\n TranslateModule,\r\n BimplusScrollableContainerComponent,\r\n BimplusButtonsRowComponent,\r\n ],\r\n templateUrl: './links-to-documents.component.html',\r\n styleUrls: ['./links-to-documents.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent implements OnInit, OnDestroy {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly el = inject(ElementRef);\r\n private readonly decorators = inject(DecoratorsService);\r\n\r\n\r\n constructor() {\r\n super();\r\n\r\n this.shadowRootElement = this.el.nativeElement.shadowRoot;\r\n }\r\n\r\n private readonly shadowRootElement: HTMLElement;\r\n private _rootObjectId : string = \"\";\r\n isDestroyed = false;\r\n localWormHole:boolean = true;\r\n //When is true then it means the creation of link is in progress\r\n inProgress:boolean= false;\r\n\r\n @Input({ required: true }) api!: WebSdk.Api | null;\r\n @Input() canCreateAttachmentLink: boolean = true;\r\n /** Input Attribute to specify if should show only list of attachments. */\r\n @Input({ transform: booleanAttribute }) listOnly = false;\r\n /** Input Attribute to specify if should show message when no attachments found. */\r\n @Input({ transform: booleanAttribute }) showEmptyMessage: boolean = true;\r\n /** Input Attribute to tell if show/hide attachemt size information. */\r\n @Input({ transform: booleanAttribute }) hideAttachmentSize = false;\r\n\r\n @Input() inputBaseUrl: string =''; // base url for the embedded modal\r\n \r\n _attachments: WebSdk.AttachmentLink[] = [];\r\n\r\n @Input()\r\n set attachments(value: WebSdk.AttachmentLink[]) {\r\n this._attachments = value;\r\n this.onAttachmentsChange();\r\n }\r\n\r\n get attachments(): WebSdk.AttachmentLink[] {\r\n return this._attachments;\r\n }\r\n\r\n onAttachmentsChange() {\r\n if(this.api && this.rootObjectId){\r\n this._attachments = this.decorateAttachmentLinks(this.api,this._attachments); \r\n }\r\n }\r\n\r\n\r\n @Output() attachmentsChange = new EventEmitter<string[]>();\r\n @Output() attachmentsLinkChange = new EventEmitter<NewAttachInfo[]>();\r\n @Input() canDeleteAttachmentLink:boolean = true;\r\n @Input() project : ProjectNavigatorProject | null = null;\r\n @Input() wormholeSelector : string | undefined= \"localEmbeddedModalId\"; // calling application can provide a place where the iframe for documents selection will be rendered\r\n @Input() env : string = 'dev';\r\n\r\n @Input()\r\n set rootObjectId(id : string|undefined){\r\n if(!id){\r\n return;\r\n }\r\n this._currentObjectId$.next(id);\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId() : string{\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\r\n _attachmentCount : number = 0;\r\n buttonRowItems: Array<BimplusButtonRowItem> = [\r\n {\r\n id: \"add-documents\"\r\n , title: this.translateService.instant('_Add_document')\r\n , tooltip: this.translateService.instant('_Add_document')\r\n , disabled: !this.canCreateAttachmentLink\r\n , buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n ngOnInit() {\r\n if (!this.listOnly) {\r\n this._currentObjectId$.subscribe({\r\n next: (id) => {\r\n this._createAttachmentLinkStructure(id);\r\n }\r\n });\r\n }\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.isDestroyed = true;\r\n }\r\n \r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private decorateAttachmentId(item:any){\r\n const it:NewAttachInfo = {\r\n id: item.id,\r\n name: item.name,\r\n nameShort: item.name,\r\n url:'',\r\n iconClass: '',\r\n iconTitle: '',\r\n type: 'AttachmentLink',\r\n deleteButtonTitle:'' \r\n }; \r\n return it;\r\n }\r\n\r\n private decorateAttachmentLinks(api:WebSdk.Api, links:WebSdk.AttachmentLinksResponse):WebSdk.AttachmentLink[]{\r\n const decoratedLinks = links.map((link) => this.decorators.decorateLink(api,link,[this._currentObjectId$.value]));\r\n decoratedLinks.sort((a,b) => {\r\n if(a.fileName.toLowerCase() < b.fileName.toLowerCase() ) return -1;\r\n if(a.fileName.toLowerCase() > b.fileName.toLowerCase() ) return 1;\r\n return 0;\r\n });\r\n return decoratedLinks;\r\n }\r\n\r\n private _createAttachmentLinkStructure(objectId : string){\r\n\r\n this._loadAttachmentLinkStructure(objectId)?.subscribe({\r\n next :(structureData) => {\r\n if(structureData){\r\n //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);\r\n this._attachmentCount = structureData?.length;\r\n if(this.api){\r\n const retval = this.decorateAttachmentLinks(this.api,structureData);\r\n if(retval){\r\n this._attachments = retval;\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n private _loadAttachmentLinkStructure(objectId : string){\r\n if(!this.api){\r\n return;\r\n }\r\n\r\n if(!objectId) {\r\n return;\r\n }\r\n return from(this.api.objects.getAttachmentLinks(objectId));\r\n }\r\n\r\n documentSelection :string[] | null = null;\r\n isOpened:boolean = false;\r\n embeddedModalContainer:string = 'embedded-modal';\r\n\r\n // show or hide embedded modal\r\n setModalVisibility(opened = true) {\r\n if(!this.wormholeSelector){\r\n return;\r\n }\r\n const element = this.localWormHole ? this.shadowRootElement.querySelector(\"#\" + this.wormholeSelector):\r\n document.getElementById(this.wormholeSelector);\r\n if (!element) {\r\n return;\r\n }\r\n if(this.localWormHole){\r\n if(element.parentElement){\r\n this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\r\n }\r\n } else {\r\n this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\r\n }\r\n\r\n ///containerEl.fadeIn(\"fast\") : containerEl.fadeOut(\"fast\");\r\n this.isOpened = opened;\r\n }\r\n\r\n\r\n closeEmbeddedModalFileSelection() {\r\n this.setModalVisibility(false);\r\n }\r\n\r\n _addLink(api:WebSdk.Api, ids:string[]) {\r\n // filter out already existing attachment links \r\n const newAttachmentIDs = ids.filter( item => !this.attachments.find(n => n.id === item) );\r\n if( !newAttachmentIDs.length ){\r\n return;\r\n }\r\n if(this.inProgress){\r\n console.log('in progress');\r\n return;\r\n }\r\n\r\n if(!this.rootObjectId){\r\n // we don't know to which object we want to attach the documents\r\n // so we will deliver just information about selected documents\r\n const getRequests = newAttachmentIDs.map((id) => \r\n from(api.objects.get(id,0,undefined,undefined,undefined,undefined))\r\n );\r\n \r\n forkJoin(getRequests).subscribe({\r\n next: (results) => {\r\n // Process the array of results\r\n (results as WebSdk.AttachmentLink[])?.forEach((item) => {\r\n if(item?.id && !this.attachments.find(attachment => attachment?.id === item.id)){\r\n this._attachments.push(item);\r\n }\r\n });\r\n const retval:NewAttachInfo[] = this._attachments.map((item) => this.decorateAttachmentId(item)); \r\n this.attachmentsLinkChange.emit(retval);\r\n },\r\n error: (err) => {\r\n console.error('Error occurred during requests:', err);\r\n this._attachments=[];\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // we know to which object we want to attach the documents\r\n this.inProgress = true;\r\n postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)\r\n .subscribe({\r\n next: (updatedAttachments) => {\r\n this._attachments = this.decorateAttachmentLinks(\r\n api,\r\n updatedAttachments\r\n ); // Update attachments in component \r\n this.inProgress = false; \r\n this.attachmentsChange.emit(newAttachmentIDs) \r\n },\r\n error: (err) => {\r\n console.error('Failed to add or reload attachments:', err);\r\n this.inProgress = false;\r\n }\r\n });\r\n }\r\n\r\n\r\n createAttachmentLink(api: WebSdk.Api){\r\n console.log('createAttachmentLink')\r\n this.localWormHole = this.wormholeSelector === \"localEmbeddedModalId\";\r\n const callbackF = (docIDs:string[]):void => {\r\n const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;\r\n const foundDocuments = ids && ids.length > 0;\r\n if(!this.isDestroyed){\r\n this.closeEmbeddedModalFileSelection();\r\n if (foundDocuments) {\r\n this._addLink(api,ids);\r\n }\r\n }\r\n }\r\n\r\n if (typeof callbackF !== \"function\" || !this.project || !this.api) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n const isLocalhost = window.location.href.includes(\"localhost\");\r\n let access_token: string | null | undefined = this.api?.getAccessToken();\r\n if (!access_token) {\r\n access_token = window.localStorage.getItem('access_token');\r\n if (!access_token /*&& isLocalhost*/) {\r\n return;\r\n }\r\n }\r\n const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');\r\n newClient?.initialize();\r\n // Make embedded windows pointing to the current feature branch with baseUrl setup\r\n const options:{baseUrl?:string} = {};\r\n // In case of localhost ommit explicit setup of baseUrl\r\n if (!isLocalhost) {\r\n // Remove '/viewer/' from the end of pathname\r\n let filteredPathname = window.location.pathname.replace(/\\/viewer\\/$/, '/');\r\n // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...\r\n filteredPathname = filteredPathname.replace(/\\/connexis\\/$/, '/');\r\n options.baseUrl = this.inputBaseUrl ? this.inputBaseUrl: window.location.origin + filteredPathname;\r\n }\r\n\r\n ///const env:string=\"dev\"; ///!!! to-do introduce env variable into components\r\n const clientModule = WebClient.BimFilesSelect;\r\n if(this.wormholeSelector){\r\n const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);\r\n if (!documentSelection) {\r\n return;\r\n }\r\n documentSelection.onAttachmentSelected = callbackF;\r\n\r\n if(this.project){\r\n if(this.localWormHole){\r\n documentSelection.loadShadowRoot(this.shadowRootElement,this.project.teamSlug , this.project.id);\r\n }else{\r\n documentSelection.load(this.project.teamSlug , this.project.id);\r\n }\r\n }\r\n this.setModalVisibility(true);\r\n }\r\n },200);\r\n\r\n }\r\n\r\n _deleteAttachmentLink(api:WebSdk.Api ,id:string,$event:Event){\r\n $event.stopPropagation();\r\n $event.preventDefault();\r\n const objects = api.objects;\r\n const objectId = this._currentObjectId$.value;\r\n from(api.objects.deleteAttachmentLink(this.rootObjectId,id)).pipe(\r\n switchMap(() => from(objects.getAttachmentLinks(objectId)))\r\n ).subscribe({\r\n next: (updatedAttachments) => {\r\n if(this.api){\r\n this._attachments = this.decorateAttachmentLinks(this.api,updatedAttachments); // Update attachments in component\r\n // Process the array of results\r\n const retval:NewAttachInfo[] = this._attachments?.map((item) => this.decorateAttachmentId(item));\r\n this.attachmentsLinkChange.emit(retval);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Failed to delete or reload attachments:', err);\r\n }\r\n });\r\n }\r\n\r\n deleteAttachmentLink(attachment:WebSdk.AttachmentLink,$event:Event){\r\n if(!this.api){\r\n return;\r\n }\r\n if(!attachment) {\r\n return;\r\n }\r\n const api = this.api;\r\n this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true\r\n }, data: {\r\n title: this.translateService.instant('_Delete_attachmentlink'),\r\n message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),\r\n acceptButtonLocalizedString: \"_Delete\",\r\n acceptCallback: () => {\r\n this._deleteAttachmentLink(api,attachment.id,$event);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n buttonClicked($event: BimplusButtonClickEvent){\r\n if(!this.api){\r\n return;\r\n }\r\n const api = this.api;\r\n if($event.id == \"add-documents\"){\r\n this.createAttachmentLink(api);\r\n }\r\n }\r\n}\r\n","<div class=\"links-to-documents\">\r\n @if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n }\r\n @if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n }\r\n @if (!_attachments.length && showEmptyMessage) {\r\n <div \r\n data-test=\"no-attachment-links\"\r\n class=\"bim-attachment-not-found\"\r\n > {{ '_No_attachmentlinks_found' | translate }}\r\n </div>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from \"@ngx-translate/core\";\r\n\r\n@Component({\r\n selector: 'lib-object-hyperlinks-item',\r\n imports: [\r\n TranslateModule\r\n ],\r\n templateUrl: './object-hyperlinks-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './object-hyperlinks-item.component.less'\r\n})\r\nexport class ObjectHyperlinksItemComponent extends BimplusLocalizedWidgetComponent {\r\n constructor() {\r\n super();\r\n }\r\n\r\n @Input() hyperlink: WebSdk.Hyperlink | undefined;\r\n @Input() deleteButtonEnabled: boolean = true;\r\n\r\n @Output() deleteButtonClicked = new EventEmitter<void>();\r\n\r\n onDeleteButtonClick(): void {\r\n this.deleteButtonClicked.emit();\r\n }\r\n\r\n onDeleteButtonKeyDown($event: KeyboardEvent) {\r\n if ($event.key === 'Enter' || $event.key === ' ') {\r\n $event.preventDefault();\r\n\r\n this.onDeleteButtonClick();\r\n }\r\n }\r\n}\r\n","<div class=\"hyperlink-item\">\r\n @if (deleteButtonEnabled) {\r\n <div class=\"bim-list-button delete\" title=\"{{ '_Hyperlink delete confirmation title' | translate }}\" (click)=\"onDeleteButtonClick()\"\r\n (keydown)=\"onDeleteButtonKeyDown($event)\">\r\n &#10005;&#xFE0E;\r\n </div>\r\n }\r\n\r\n <a href=\"{{ hyperlink?.url }}\" class='bim-hyperlink-url' target=\"_blank\" title=\"{{ hyperlink?.url }}\">\r\n <div class=\"bim-hyperlink-name\">\r\n {{ hyperlink?.name }}\r\n </div>\r\n </a>\r\n</div>\r\n","import { Component, Input, OnInit, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\r\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\r\nimport {BimplusLocalizedWidgetComponent} from '@bimplus/navigation';\r\nimport {TranslateModule} from \"@ngx-translate/core\";\r\nimport {\r\n BimplusScrollableContainerComponent\r\n} from '@bimplus/navigation';\r\nimport {ObjectHyperlinksItemComponent} from \"../object-hyperlinks-item/object-hyperlinks-item.component\";\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {BehaviorSubject} from \"rxjs\";\r\n\r\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\r\nimport {\r\n BimplusOverlayDialogConfirmComponent\r\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\r\nimport {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from \"@angular/forms\";\r\nimport {BimplusInputTextFieldComponent} from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\n\r\n@Component({\r\n selector: 'lib-object-hyperlinks',\r\n imports: [\r\n BimplusButtonsRowComponent,\r\n BimplusScrollableContainerComponent,\r\n ObjectHyperlinksItemComponent,\r\n TranslateModule,\r\n ReactiveFormsModule,\r\n BimplusInputTextFieldComponent\r\n],\r\n templateUrl: './object-hyperlinks.component.html',\r\n styleUrl: './object-hyperlinks.component.less',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ObjectHyperlinksComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly formBuilder = inject(FormBuilder);\r\n\r\n hyperlinkForm: FormGroup;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.hyperlinkForm = this.formBuilder.group({\r\n name: ['', []],\r\n url: ['',\r\n [\r\n Validators.required,\r\n Validators.pattern(/^[^<>]*$/), // Do not allow < or >\r\n Validators.pattern(/^(?!\\s*$).+/) // Do not allow all empty string, but allow text after spaces\r\n ]\r\n ]\r\n });\r\n\r\n this.hyperlinkForm.statusChanges.subscribe(status => {\r\n this.buttonRowItems[0].disabled = status !== 'VALID';\r\n });\r\n }\r\n\r\n @Input() api: WebSdk.Api | null = null;\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._currentObjectId$.next(id);\r\n this.loadHyperlinks(id);\r\n\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\r\n private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\r\n private _rootObjectId: string = \"\";\r\n\r\n buttonRowItems: Array<BimplusButtonRowItem> = [];\r\n\r\n @Input() canCreateHyperlinks: boolean = true;\r\n @Input() canDeleteHyperlinks: boolean = true;\r\n\r\n hyperlinks: Array<WebSdk.Hyperlink> = [];\r\n\r\n ngOnInit() {\r\n this.buttonRowItems.push(\r\n {\r\n id: \"add-hyperlink\"\r\n , title: this.translateService.instant('_Add hyperlink')\r\n , tooltip: this.translateService.instant('_Add hyperlink')\r\n , disabled: true\r\n , buttonStyle: 'primary'\r\n }\r\n );\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === \"add-hyperlink\") {\r\n if (this.hyperlinkForm.valid) {\r\n this.addHyperlink(this.hyperlinkForm.value['name'], this.hyperlinkForm.value['url'], this._rootObjectId).then(() => {\r\n this.loadHyperlinks(this._rootObjectId);\r\n this.hyperlinkForm.reset();\r\n });\r\n }\r\n }\r\n }\r\n\r\n private loadHyperlinks(objectId: string) {\r\n if (!this.api)\r\n return;\r\n\r\n this.api.objects.getHyperlinks(objectId).then((response: WebSdk.HyperlinksResponse) => {\r\n this.hyperlinks = response;\r\n });\r\n }\r\n\r\n private addHyperlink(name: string, url: string, objectId: string): Promise<WebSdk.Hyperlink> {\r\n if (!this.api)\r\n return Promise.reject(new Error('API not available'));\r\n\r\n let sanitizedUrl: string = url.trim();\r\n\r\n if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\r\n sanitizedUrl = 'https://' + sanitizedUrl;\r\n }\r\n\r\n let sanitizedName = name?.trim() ?? '';\r\n\r\n if (sanitizedName === '') {\r\n sanitizedName = sanitizedUrl;\r\n }\r\n\r\n sanitizedName = sanitizedName?.replace(/^http(s?):\\/\\//, '');\r\n\r\n const data = JSON.stringify({\r\n name: sanitizedName,\r\n url: sanitizedUrl,\r\n objectId: objectId\r\n });\r\n\r\n return this.api.objects.postHyperlink(objectId, data);\r\n }\r\n\r\n onHyperlinkItemDeleteButtonClicked(hyperlink: WebSdk.Hyperlink) {\r\n this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true\r\n }, data: {\r\n title: this.translateService.instant('_Hyperlink delete confirmation title'),\r\n message: this.translateService.instant('_Hyperlink delete confirmation message'),\r\n acceptButtonLocalizedString: \"_Delete\",\r\n acceptCallback: () => {\r\n this.deleteHyperlink(hyperlink.id);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private deleteHyperlink(id: string) {\r\n if (!this.api)\r\n return;\r\n\r\n this.api.hyperlinks.delete(id).then(() => {\r\n this.loadHyperlinks(this._rootObjectId);\r\n });\r\n }\r\n}\r\n","@if (canCreateHyperlinks) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\r\n </div>\r\n <div>\r\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\r\n </form>\r\n}\r\n\r\n<div class=\"list-anchor\">\r\n <div class=\"list\">\r\n <lib-bimplus-scrollable-container>\r\n @if (hyperlinks.length > 0) {\r\n @for (hyperlink of hyperlinks; track hyperlink) {\r\n <div style=\"padding-left: 8px\">\r\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\r\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n </div>\r\n","\r\nimport { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\n\r\nexport interface ErrorDialogInputData {\r\n title: string;\r\n message: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-error',\r\n imports: [TranslateModule, BimplusButtonsRowComponent],\r\n templateUrl: './bimplus-overlay-dialog-error.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-error.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogErrorComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly _data: ErrorDialogInputData | undefined;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: \"errorDialogAcceptButton\",\r\n title: this.translateService.instant('_Ok'),\r\n tooltip: this.translateService.instant('_Ok'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this._data = this.dialogService.inputData as ErrorDialogInputData;\r\n this._title = this._data?.title || '';\r\n this._message = this._data?.message || '';\r\n }\r\n\r\n close() {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked(): void {\r\n this.close();\r\n\r\n this.acceptCallback?.();\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\">\r\n </div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{title}}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div class=\"overlay-dialog-container_content_msg\">\r\n {{this.message}}\r\n </div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked()\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport type BimplusTabComponentModel = {\r\n id: string;\r\n title: string;\r\n img: {\r\n default: string;\r\n active: string;\r\n };\r\n};\r\n\r\nexport const DEFAULT_TAB_SWITCHER_ELEMENTS: BimplusTabComponentModel[] = [\r\n { id: 'object-properties', img: { default: 'ic_models', active: 'ic_models_maincolor' }, title: '_Object properties' },\r\n { id: 'comments', img: { default: 'Comments_18_gray', active: 'Comments_18_maincolor' }, title: '_Comments' },\r\n { id: 'attachments', img: { default: 'Attachment_18_gray', active: 'Attachment_18_maincolor' }, title: '_Attachments' },\r\n { id: 'hyperlinks', img: { default: 'Links_18_gray', active: 'Links_18_maincolor' }, title: 'hyperlinks' },\r\n { id: 'links-to-documents', img: { default: 'Attachmentlink_18_gray', active: 'Attachmentlink_18_maincolor' }, title: '_Links_to_documents' },\r\n];\r\n\r\nexport type BimplusTabsSwitcherConfig = {\r\n defaultTabsSwitcherElements?: BimplusTabComponentModel[];\r\n disabled: Partial<{\r\n all: boolean;\r\n id: string;\r\n }>\r\n};\r\n\r\nexport const BIMPLUS_TABS_SWITCHER_CONFIG = new InjectionToken<BimplusTabsSwitcherConfig>('bimplus-tabs-switcher-config');","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig, DEFAULT_TAB_SWITCHER_ELEMENTS } from '../bimplus-tabs-switcher.interface';\r\n\r\n@Injectable()\r\nexport class BimplusTabsSwitcherService {\n private readonly bimplusTabsSwitcherConfig = inject<Pick<BimplusTabsSwitcherConfig, 'defaultTabsSwitcherElements'>>(BIMPLUS_TABS_SWITCHER_CONFIG, { optional: true });\n\r\n /** Default tab switcher elements. */\r\n private readonly tabSwitcherElements = new BehaviorSubject<\r\n BimplusTabComponentModel[]\r\n >(DEFAULT_TAB_SWITCHER_ELEMENTS);\r\n public readonly tabSwitcherElements$ =\r\n this.tabSwitcherElements.asObservable();\r\n\r\n /** Attribute to indicate active tab. (only for BimplusTabComponent) */\r\n private readonly activeTab = new Subject<string>();\r\n public readonly activeTab$ = this.activeTab.asObservable();\r\n\r\n public setActiveTab(key: string): void {\r\n this.activeTab.next(key);\r\n }\r\n\r\n constructor() {\r\n // if there is new default tabs from configuration token then use them instead of original default tabs\r\n if (this.bimplusTabsSwitcherConfig?.defaultTabsSwitcherElements) {\r\n this.tabSwitcherElements.next(\r\n this.bimplusTabsSwitcherConfig.defaultTabsSwitcherElements\r\n );\r\n }\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { Component, computed, EventEmitter, HostListener, Input, OnInit, Output, signal, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusTabsSwitcherService } from '../../services/bimplus-tabs-switcher.service';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig } from '../../bimplus-tabs-switcher.interface';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nconst DEFAULT_IMAGE_SRC = '../../../../../../';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-tab',\r\n imports: [NgClass, TranslateModule],\r\n templateUrl: './bimplus-tab.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-tab.component.less'\r\n})\r\nexport class BimplusTabComponent implements OnInit {\n private readonly bimplusTabsSwitcherConfig = inject<BimplusTabsSwitcherConfig>(BIMPLUS_TABS_SWITCHER_CONFIG, { optional: true });\n protected readonly bimplusTabsSwitcherService = inject(BimplusTabsSwitcherService);\n\r\n @Input({ required: true }) bimplusTabComponentModel!: BimplusTabComponentModel;\r\n @Input() imageBaseSrc?: string | null = DEFAULT_IMAGE_SRC;\r\n /** Currently active tab. */\r\n @Input() set activeTab(value: string | undefined) {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n this.bimplusTabsSwitcherService.setActiveTab(value);\r\n }\r\n @Output() activeTabChange = new EventEmitter<string>();\r\n\r\n /** Attribute indicating active tab. */\r\n protected readonly activeTabSignal = toSignal(this.bimplusTabsSwitcherService.activeTab$);\r\n /** Indicate that tab is active or not. */\r\n protected readonly isActive = computed(() => this.activeTabSignal() === this.bimplusTabComponentModel.id);\r\n /** Indicate that tab is disabled or not. */\r\n protected readonly isDisabled = signal<boolean>(false);\r\n /** Computed property for image file name based on active/default state. */\r\n protected readonly imgName = computed(() =>\r\n this.isActive() ? this.bimplusTabComponentModel.img.active : this.bimplusTabComponentModel.img.default\r\n )\r\n protected readonly onHoverOver = signal<boolean>(false);\r\n\r\n /** Whether all tabs is disabled based on configuration token. */\r\n private readonly isAllDisabled = this.bimplusTabsSwitcherConfig?.disabled?.all ?? false;\r\n\r\n constructor() {\r\n if (this.isAllDisabled) {\r\n this.isDisabled.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n protected onMouseEnter(): void {\r\n this.onHoverOver.set(true)\r\n }\r\n\r\n @HostListener('mouseleave')\r\n protected onMouseLeave(): void {\r\n this.onHoverOver.set(false)\r\n }\r\n\r\n public ngOnInit(): void {\r\n // wheter specific tab is disabled\r\n if (!this.isAllDisabled && this.bimplusTabsSwitcherConfig?.disabled?.id) {\r\n this.isDisabled.set(this.bimplusTabsSwitcherConfig.disabled?.id === this.bimplusTabComponentModel.id);\r\n }\r\n }\r\n\r\n /**\r\n * Will update active tab to service state.\r\n * @protected\r\n * @returns void\r\n */\r\n protected activate(): void {\r\n if (this.isDisabled()) {\r\n return;\r\n }\r\n\r\n this.bimplusTabsSwitcherService.setActiveTab(this.bimplusTabComponentModel.id);\r\n this.activeTabChange.emit(this.bimplusTabComponentModel.id);\r\n }\r\n}\r\n","<div\r\n class=\"tab-element\"\r\n [title]=\"bimplusTabComponentModel.title | translate\"\r\n [class.disabled]=\"isDisabled()\"\r\n (click)=\"!isDisabled() && activate()\"\r\n (keypress)=\"!isDisabled() && activate()\"\r\n>\r\n <img src=\"{{imageBaseSrc}}assets/images/default/{{imgName()}}.svg\" [alt]=\"imgName()\">\r\n <div\r\n [attr.data-test]=\"'underline-switcher-' + bimplusTabComponentModel.id\"\r\n [ngClass]=\"{\r\n 'underline-switcher': true,\r\n 'highlight': isActive(),\r\n 'hovering': onHoverOver()\r\n }\"\r\n ></div>\r\n</div>\r\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, signal, Signal, Output, EventEmitter, Input, inject } from '@angular/core';\r\nimport { BimplusTabsSwitcherService } from './services/bimplus-tabs-switcher.service';\r\nimport { BimplusTabComponent } from './components/bimplus-tab/bimplus-tab.component';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { BimplusTabComponentModel, DEFAULT_TAB_SWITCHER_ELEMENTS } from './bimplus-tabs-switcher.interface';\r\nimport { APP_BASE_HREF } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-tabs-switcher',\r\n imports: [BimplusTabComponent],\r\n templateUrl: './bimplus-tabs-switcher.component.html',\r\n styleUrls: ['./bimplus-tabs-switcher.component.less'],\r\n providers: [BimplusTabsSwitcherService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusTabsSwitcherComponent {\r\n private readonly bimplusTabsSwitcherService = inject(BimplusTabsSwitcherService, { optional: true, skipSelf: true });\r\n\r\n @Input() activeTab?: string;\r\n @Output() activeTabChange = new EventEmitter<string>();\r\n\r\n /** default tab elements, can be chanaged from outside by BimplusTabsSwitcherService */\r\n protected readonly tabSwitcherElements: Signal<BimplusTabComponentModel[]>;\r\n /** app base href */\r\n protected readonly baseHref = inject(APP_BASE_HREF, { optional: true });\r\n\r\n constructor() {\r\n // will check wheter is used from outside and if not then add default tabs\r\n if (this.bimplusTabsSwitcherService) {\r\n this.tabSwitcherElements = toSignal(this.bimplusTabsSwitcherService.tabSwitcherElements$) as Signal<BimplusTabComponentModel[]>\r\n } else {\r\n this.tabSwitcherElements = signal<BimplusTabComponentModel[]>(DEFAULT_TAB_SWITCHER_ELEMENTS).asReadonly();\r\n }\r\n }\r\n}\r\n","<div class=\"tabswitcher-container\">\r\n @for (tabElement of tabSwitcherElements(); track tabElement.id) {\r\n <lib-bimplus-tab\r\n [attr.data-test]=\"tabElement.id\"\r\n [activeTab]=\"activeTab\"\r\n [imageBaseSrc]=\"baseHref\"\r\n (activeTabChange)=\"activeTabChange.emit($event)\"\r\n [bimplusTabComponentModel]=\"{ id: tabElement.id, title: tabElement.title, img: { active: tabElement.img.active, default: tabElement.img.default }}\"\r\n />\r\n }\r\n <ng-content></ng-content>\r\n</div>","import { DecimalPipe } from '@angular/common';\r\nimport { Pipe, PipeTransform } from '@angular/core';\r\n\r\nconst MB_SIZE = 1000;\r\n\r\nexport const BitConverterSize = {\r\n KB: 'kB',\r\n GB: 'gib',\r\n MB: 'mb'\r\n // more..\r\n} as const;\r\n\r\ntype SizeType = typeof BitConverterSize['GB' | 'KB' | 'MB'];\r\n\r\n@Pipe({\r\n name: 'bitConverter',\r\n standalone: true\r\n})\r\nexport class BitConverterPipe extends DecimalPipe implements PipeTransform {\r\n override transform(value: number | string, digitsInfo?: string, locale?: string): string | null;\r\n override transform(value: null | undefined, digitsInfo?: string, locale?: string): null;\r\n override transform(value: number | string | null | undefined, digitsInfo?: string, locale?: string): string | null;\r\n override transform(value: unknown, sizeToConvert: SizeType = BitConverterSize.KB, digitsInfo: string = '1.2-2', base: number = MB_SIZE): string | null {\r\n if (!this.isNumber(value)) {\r\n throw new Error('[BitConverterPipe]: value is not a number');\r\n }\r\n const size = this.getSizeFromBites(value, sizeToConvert, base);\r\n let decimalValue = super.transform(size, digitsInfo);\r\n decimalValue ??= value.toString();\r\n\r\n return `(${decimalValue} ${sizeToConvert})`;\r\n }\r\n\r\n private getSizeFromBites(value: number, size: SizeType, base: number): number {\r\n switch(size) {\r\n case 'kB':\r\n return value / base;\r\n case 'mb':\r\n return value / (base * base);\r\n case 'gib':\r\n return value / (base * base * base);\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n private isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && !isNaN(value);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\n\r\nexport type BimplusAttachmentsConfig = {\r\n buttons?: BimplusButtonRowItem[];\r\n hideDeleteAttachmentButton?: boolean;\r\n showNoAttachmentsFound?: boolean;\r\n hideAttachmentSize?: boolean;\r\n};\r\nexport const BIMPLUS_ATTACHMENTS_CONFIG =\r\n new InjectionToken<BimplusAttachmentsConfig>('bimplus-attachments-config');\r\n\r\nexport interface IAttachment {\r\n id: string;\r\n fileName: string;\r\n size: number | undefined;\r\n file?: File;\r\n}\r\n\r\nexport class Attachment implements Partial<IAttachment> {\r\n public id: string;\r\n public fileName: string;\r\n public size: number | undefined;\r\n public file?: File;\r\n\r\n constructor(data: Partial<IAttachment>) {\r\n this.id = data.id ?? '';\r\n this.fileName = data.fileName ?? '';\r\n this.size = data.size ?? 0;\r\n }\r\n}\r\n\r\ntype Builder = typeof AttachmentBuilder;\r\n\r\nexport abstract class AttachmentBuilder {\r\n private static attachment = new Attachment({});\r\n\r\n public static create(value: Attachment): Builder {\r\n this.attachment = new Attachment(value);\r\n return this;\r\n }\r\n\r\n public static setId(id: string): Builder {\r\n this.attachment.id = id;\r\n return this;\r\n }\r\n\r\n public static setFileName(name: string): Builder {\r\n this.attachment.fileName = name;\r\n return this;\r\n }\r\n\r\n public static setSize(size: number): Builder {\r\n this.attachment.size = size;\r\n return this;\r\n }\r\n\r\n public static setFile(file: File): Builder {\r\n this.attachment.file = file;\r\n return this;\r\n }\r\n\r\n public static build(): Attachment {\r\n const attachmentToReturn = structuredClone(this.attachment);\r\n this.attachment = new Attachment({});\r\n\r\n return attachmentToReturn;\r\n }\r\n}\r\n","import {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n Output,\n signal,\n TemplateRef,\n ViewChild,\n ChangeDetectionStrategy\n} from '@angular/core';\r\nimport { BitConverterPipe } from '../../../../pipes/bit-converter.pipe';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n} from '../../bimplus-attachments.interface';\r\n\r\nconst BIM_ATTACHMENT_DELETE_BUTTON_WIDTH = 30;\r\nconst BIM_ATTACHMENT_ITEM_PADDING_LEFT = 28;\r\n\r\n@Component({\r\n selector: 'lib-bimplus-attachment-item',\r\n imports: [BitConverterPipe, TranslateModule],\r\n templateUrl: './bimplus-attachment-item.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './bimplus-attachment-item.component.less'\r\n})\r\nexport class BimplusAttachmentItemComponent\r\n implements AfterViewInit, OnDestroy\r\n{\r\n @Input() closeIconTemplate?: TemplateRef<unknown>;\r\n @ViewChild('attachmentSizeRef') attachmentSizeRef?: ElementRef<HTMLElement>;\r\n @ViewChild('attachmentNameRef') attachmentNameRef!: ElementRef<HTMLElement>;\r\n @Input({ required: true }) attachment!: Attachment;\r\n @Input() set parentWidth(value: number | undefined) {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n this.parentWidthSignal.set(value);\r\n }\r\n @Output() deleteAttachment = new EventEmitter<Attachment>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n get type(): string {\r\n return `.${this.attachment.fileName.split('.').at(-1)}`;\r\n }\r\n\r\n private intersectionObserver?: IntersectionObserver;\r\n /** Parent element width. */\r\n private readonly parentWidthSignal = signal<number | undefined>(undefined);\r\n /** Attachment size text width. */\r\n private readonly attachmentSizeWidth = signal<number>(0);\r\n /** Wheter name is fully visible or not based on parent width. */\r\n protected readonly nameIsFullyVisible = signal<boolean>(false);\r\n\r\n protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\r\n optional: true,\r\n });\r\n\r\n /** Attribute to indicate if show/hide size of File. */\r\n protected readonly hideSize = !!this.config?.hideAttachmentSize;\r\n\r\n /** Width size of file name line. */\r\n protected readonly nameInfoLineWidth = computed<number>(() => {\r\n const parentWidth = this.parentWidthSignal();\r\n const attachmentSizeWidth = this.attachmentSizeWidth();\r\n const nameIsFullyVisible = this.nameIsFullyVisible();\r\n\r\n if (!parentWidth) {\r\n return 0;\r\n }\r\n\r\n if (nameIsFullyVisible) {\r\n return parentWidth - BIM_ATTACHMENT_DELETE_BUTTON_WIDTH;\r\n }\r\n\r\n return (\r\n parentWidth -\r\n attachmentSizeWidth -\r\n (BIM_ATTACHMENT_DELETE_BUTTON_WIDTH + BIM_ATTACHMENT_ITEM_PADDING_LEFT)\r\n );\r\n });\r\n\r\n public ngAfterViewInit(): void {\r\n if (this.attachmentSizeRef) {\r\n this.attachmentSizeWidth.set(\r\n +this.attachmentSizeRef.nativeElement.clientWidth\r\n );\r\n this.createIntersectionObserver();\r\n this.intersectionObserver!.observe(this.attachmentNameRef.nativeElement);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.intersectionObserver?.unobserve(this.attachmentNameRef.nativeElement);\r\n }\r\n\r\n private createIntersectionObserver(): void {\r\n const options: IntersectionObserverInit = {\r\n root: null,\r\n rootMargin: '0px',\r\n threshold: 1.0,\r\n };\r\n const callback: IntersectionObserverCallback = (entries) =>\r\n entries.forEach(({ intersectionRect, boundingClientRect }) => {\r\n const isWidthFullyVisible = intersectionRect.width === boundingClientRect.width;\r\n this.nameIsFullyVisible.set(isWidthFullyVisible);\r\n });\r\n\r\n this.intersectionObserver = new IntersectionObserver(callback, options);\r\n }\r\n}\r\n","<div class=\"bim-attachment-item\">\r\n <div\r\n data-test=\"bim-attachment\"\r\n (click)=\"getAttachment.emit(attachment)\"\r\n (keypress)=\"$event.preventDefault()\"\r\n title=\"{{ attachment.fileName }}\"\r\n class=\"bim-attachment-name\"\r\n [style.width.px]=\"nameInfoLineWidth()\"\r\n >\r\n <span #attachmentNameRef>{{ attachment.fileName }}</span>\r\n @if (nameIsFullyVisible() && !hideSize) {\r\n <span class=\"bim-attachment-size\">{{ attachment.size | bitConverter:'kB':'1.2-2' }}</span>\r\n }\r\n </div>\r\n @if(!nameIsFullyVisible() && !hideSize) {\r\n <span>{{ type }} </span>\r\n <div #attachmentSizeRef class=\"bim-attachment-size\">\r\n {{ attachment.size | bitConverter:'kB':'1.2-2' }}\r\n </div>\r\n }\r\n @if (!config?.hideDeleteAttachmentButton) {\r\n <span\r\n data-test=\"delete-attachment-btn\"\r\n class=\"bim-attachment-delete-button\"\r\n title=\"{{ '_Delete attachment' | translate }}\"\r\n (click)=\"deleteAttachment.emit(attachment)\"\r\n (keypress)=\"$event.preventDefault()\"\r\n >\r\n <span class=\"icon\">✕︎</span>\r\n </span>\r\n }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n TemplateRef,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusAttachmentItemComponent } from './components/bimplus-attachment-item/bimplus-attachment-item.component';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation'\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n} from './bimplus-attachments.interface';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n@Component({\r\n selector: 'lib-bimplus-attachments',\r\n imports: [\r\n TranslateModule,\r\n BimplusButtonsRowComponent,\r\n BimplusAttachmentItemComponent,\r\n BimplusScrollableContainerComponent\r\n ],\r\n templateUrl: './bimplus-attachments.component.html',\r\n styleUrl: './bimplus-attachments.component.less',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusAttachmentsComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements AfterViewInit, OnDestroy\r\n{\r\n @Input() api : WebSdk.Api | null = null;\r\n /** Attribute for attachments which were saved to server. */\r\n @Input() attachments: Attachment[] = [];\r\n @Input() closeIconTemplate?: TemplateRef<unknown>;\r\n /** Attribute to set if should button display or no. */\r\n @Input({ transform: booleanAttribute }) listOnly = false;\r\n @ViewChild('attachmentListRef') attachmentListRef!: ElementRef<HTMLElement>;\r\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\r\n @Output() deleteAttachment = new EventEmitter<Attachment>();\r\n @Output() addAttachment = new EventEmitter<File>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n private resizeObserver!: ResizeObserver;\r\n /** Configuration token. */\r\n protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\r\n optional: true,\r\n });\r\n /** Attachments buttons. */\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: 'add-attachment',\r\n title: this.translateService.instant('_Add attachment'),\r\n tooltip: this.translateService.instant('_Add attachment'),\r\n disabled: false,\r\n buttonStyle: 'primary',\r\n type: 'file',\r\n },\r\n ];\r\n /** Width size of file name line. */\r\n protected readonly attachmentListWidth = signal<number | undefined>(\r\n undefined\r\n );\r\n\r\n /**\r\n * Will open window to select File.\r\n * @return void\r\n * @public\r\n */\r\n public open(): void {\r\n this.fileInput.nativeElement.click();\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n this.createResizeObserver();\r\n this.resizeObserver.observe(this.attachmentListRef.nativeElement);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.resizeObserver.unobserve(this.attachmentListRef.nativeElement);\r\n }\r\n\r\n protected onFileChanged(files: File[] | Event, inputElement?: HTMLInputElement): void {\r\n let filesArray: File[] = [];\r\n if(files instanceof FileList){\r\n filesArray = Array.from(files);\r\n } else if(files instanceof Event){\r\n const input = files.target as HTMLInputElement;\r\n if (input?.files) { \r\n filesArray = Array.from(input.files); \r\n }\r\n } \r\n for (const file of filesArray) {\r\n if (file instanceof File) {\r\n this.addAttachment.emit(file);\r\n } \r\n } \r\n // reset value to be able select same value again\r\n if (inputElement) {\r\n inputElement.value = ''\r\n }\r\n }\r\n\r\n private createResizeObserver(): void {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const { width }: DOMRectReadOnly = entries[0].contentRect;\r\n this.attachmentListWidth.set(width);\r\n });\r\n }\r\n}\r\n","<div class=\"bim-attachments\">\r\n @if (listOnly) {\r\n <input #fileInput hidden type=\"file\" (change)=\"onFileChanged($event, fileInput)\" multiple>\r\n } @else {\r\n <lib-bimplus-buttons-row [items]=\"config?.buttons ?? buttons\" (fileChanged)=\"onFileChanged($event)\" [isMultiple]=\"true\"/>\r\n }\r\n\r\n @if (listOnly) {\r\n <section #attachmentListRef class=\"bim-attachments-list\">\r\n @if (!attachments.length) {\r\n @if (config?.showNoAttachmentsFound) {\r\n <div\r\n data-test=\"no-attachments\"\r\n class=\"bim-attachments-list-empty\"\r\n >{{ '_No attachments found' | translate }}</div>\r\n }\r\n } @else {\r\n @for (attachment of attachments; track attachment.id) {\r\n <lib-bimplus-attachment-item\r\n [closeIconTemplate]=\"closeIconTemplate\"\r\n [attr.data-test]=\"attachment.id\"\r\n (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n [parentWidth]=\"attachmentListWidth()\"\r\n [attachment]=\"attachment\"\r\n />\r\n }\r\n }\r\n </section>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n <section #attachmentListRef class=\"bim-attachments-list\">\r\n @if (!attachments.length) {\r\n @if (config?.showNoAttachmentsFound) {\r\n <div\r\n data-test=\"no-attachments\"\r\n class=\"bim-attachments-list-empty\"\r\n >{{ '_No attachments found' | translate }}</div>\r\n }\r\n } @else {\r\n @for (attachment of attachments; track attachment.id) {\r\n <lib-bimplus-attachment-item\r\n [closeIconTemplate]=\"closeIconTemplate\"\r\n [attr.data-test]=\"attachment.id\"\r\n (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n [parentWidth]=\"attachmentListWidth()\"\r\n [attachment]=\"attachment\"\r\n />\r\n }\r\n }\r\n </section>\r\n </lib-bimplus-scrollable-container>\r\n </div> \r\n }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n Attachment,\r\n AttachmentBuilder,\r\n} from '../bimplus-attachments.interface';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BimplusAttachmentsService {\r\n public getAttachment(value: Attachment | File): Attachment {\r\n let attachment: Attachment;\r\n if (value instanceof File) {\r\n attachment = AttachmentBuilder.setFile(value)\r\n .setFileName(value.name)\r\n .build();\r\n } else {\r\n attachment = AttachmentBuilder.create(value).build();\r\n }\r\n\r\n return attachment;\r\n }\r\n\r\n public download(href: string, fileName: string): void {\r\n const anchor: HTMLAnchorElement = document.createElement('a');\r\n anchor.rel = 'noopener noreferrer';\r\n anchor.target = '_blank';\r\n anchor.href = href;\r\n anchor.download = fileName;\r\n anchor.click();\r\n }\r\n}\r\n","import { Component, HostListener, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\n\r\nexport interface CommentDialogData {\r\n title: string;\r\n message: string;\r\n acceptCallback: () => void;\r\n}\r\n\r\nconst DELETE_BUTTON_ID = 'delete';\r\nconst CANCEL_BUTTON_ID = 'cancel';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-overlay-dialog-delete',\r\n templateUrl: './bimplus-overlay-dialog-delete.component.html',\r\n styleUrls: ['./bimplus-overlay-dialog-delete.component.less'],\r\n imports: [TranslateModule, BimplusButtonsRowComponent],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusOverlayDialogDeleteComponent {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n\r\n private _title: string = '';\r\n private _message: string = '';\r\n private readonly data: CommentDialogData | undefined;\r\n acceptCallback: (() => void) | undefined;\r\n protected readonly buttons: BimplusButtonRowItem[] = [\r\n {\r\n id: DELETE_BUTTON_ID,\r\n title: this.translateService.instant('_Delete'),\r\n tooltip: this.translateService.instant('_Delete'),\r\n disabled: false,\r\n buttonStyle: 'primary'\r\n },\r\n {\r\n id: CANCEL_BUTTON_ID,\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'secondary'\r\n }\r\n ];\r\n\r\n @Input()\r\n get title(): string {\r\n return this._title;\r\n }\r\n set title(value: string) {\r\n this._title = value;\r\n }\r\n\r\n @Input()\r\n get message(): string {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._message = value;\r\n }\r\n\r\n constructor() {\r\n this.data = this.dialogService.inputData as CommentDialogData;\r\n if (this.data) {\r\n this._title = this.data.title || '';\r\n this._message = this.data.message || '';\r\n this.acceptCallback = this.data.acceptCallback;\r\n }\r\n }\r\n\r\n close(): void {\r\n this.dialogService.close();\r\n }\r\n\r\n keypressClose(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.dialogService.close();\r\n }\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent): void {\r\n this.dialogService.close();\r\n\r\n if ($event.id === DELETE_BUTTON_ID) {\r\n this.acceptCallback?.();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n}\r\n","<div class=\"overlay-dialog-container\">\r\n <div class=\"overlay-dialog-container_title\">\r\n <div class=\"overlay-dialog-container_title_icon\"></div>\r\n <div class=\"overlay-dialog-container_title_msg\">\r\n {{title}}\r\n </div>\r\n <div\r\n class=\"overlay-dialog-container_title_close\"\r\n (click)=\"close()\"\r\n (keypress)=\"keypressClose($event)\"\r\n ></div>\r\n </div>\r\n <div class=\"overlay-dialog-container_content\">\r\n <div\r\n class=\"overlay-dialog-container_content_msg\"\r\n [innerHTML]=\"message\">\r\n </div>\r\n <div class=\"buttons\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttons\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libAutoResizeTextarea]',\r\n standalone: true\r\n})\r\nexport class AutoResizeTextareaDirective {\r\n private el = inject(ElementRef);\r\n\r\n\r\n private _libAutoResizeTextarea = false;\r\n private _autoResizeMinRows = 1;\r\n private _autoResizeMaxRows = 1;\r\n private currentRows = 1;\r\n private offsetHeight = 0;\r\n private readonly input: HTMLTextAreaElement;\r\n private avgLineHeight = 0;\r\n\r\n @Input()\r\n set autoResizeMinRows(value: number) {\r\n this._autoResizeMinRows = value > 0 ? value : 1;\r\n this.currentRows = this.currentRows < value ? value : this.currentRows;\r\n this.input.rows = value;\r\n }\r\n get autoResizeMinRows(): number {\r\n return this._autoResizeMinRows;\r\n }\r\n\r\n @Input()\r\n set autoResizeMaxRows(value: number) {\r\n this._autoResizeMaxRows = value < 1 ? 1 : value;\r\n }\r\n get autoResizeMaxRows(): number {\r\n return this._autoResizeMaxRows;\r\n }\r\n\r\n @Input()\r\n set libAutoResizeTextarea(condition: boolean) {\r\n this._libAutoResizeTextarea = condition;\r\n }\r\n get libAutoResizeTextarea(): boolean {\r\n return this._libAutoResizeTextarea;\r\n }\r\n\r\n constructor() {\r\n this.input = this.el.nativeElement;\r\n }\r\n\r\n @HostListener('input')\r\n onInput(): void {\r\n if (this.libAutoResizeTextarea) {\r\n this.calculateLineHeight();\r\n this.updateRows();\r\n }\r\n }\r\n\r\n private calculateLineHeight(): void {\r\n const style = window.getComputedStyle(this.input, null);\r\n const lineHeight = style.getPropertyValue('line-height');\r\n let newLineHeight: number;\r\n if (lineHeight === 'normal') {\r\n newLineHeight = (parseFloat(style.getPropertyValue('font-size')) || 16) * 1.14;\r\n } else {\r\n newLineHeight = parseFloat(lineHeight);\r\n }\r\n this.avgLineHeight = Math.trunc(newLineHeight);\r\n }\r\n\r\n private updateRows(): void {\r\n if (this.offsetHeight <= 0) {\r\n this.offsetHeight = this.input.scrollHeight;\r\n }\r\n\r\n this.input.rows = this._autoResizeMinRows;\r\n\r\n const rows = Math.floor(\r\n (this.input.scrollHeight - this.offsetHeight) /\r\n this.avgLineHeight\r\n );\r\n\r\n const rowsCount = this._autoResizeMinRows + rows;\r\n\r\n this.input.rows = rowsCount > this._autoResizeMaxRows\r\n ? this._autoResizeMaxRows\r\n : rowsCount;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { AutoResizeTextareaDirective } from './auto-resize-textarea.directive';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-textarea',\r\n templateUrl: './bimplus-textarea.component.html',\r\n styleUrls: ['./bimplus-textarea.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [ReactiveFormsModule, AutoResizeTextareaDirective, TranslateModule]\r\n})\r\nexport class BimplusTextareaComponent implements OnInit, OnDestroy {\r\n\r\n textareaControl = new FormControl();\r\n\r\n private _textareaSubscription?: Subscription;\r\n\r\n @Output() textAreaValueChange = new EventEmitter<string>();\r\n\r\n private _name = '';\r\n private _placeholder = '';\r\n private _readonly = false;\r\n private _required = false;\r\n private _rows = 1;\r\n private _activeAutoResizeTextarea = false;\r\n private _minRows = 1;\r\n private _maxRows = 1;\r\n private _clearValue = false;\r\n\r\n @Input()\r\n set name(value: string) {\r\n this._name = value;\r\n }\r\n get name(): string {\r\n return this._name;\r\n }\r\n\r\n @Input()\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n }\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n\r\n @Input()\r\n set readonly(value: boolean) {\r\n this._readonly = value;\r\n }\r\n get readonly(): boolean {\r\n return this._readonly;\r\n }\r\n\r\n @Input()\r\n set required(value: boolean) {\r\n this._required = value;\r\n }\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n\r\n @Input()\r\n set minRows(value: number) {\r\n this._minRows = value;\r\n }\r\n get minRows(): number {\r\n return this._minRows;\r\n }\r\n\r\n @Input()\r\n set maxRows(value: number) {\r\n this._maxRows = value;\r\n }\r\n get maxRows(): number {\r\n return this._maxRows;\r\n }\r\n\r\n @Input()\r\n set activeAutoResizeTextarea(value: boolean) {\r\n this._activeAutoResizeTextarea = value;\r\n }\r\n get activeAutoResizeTextarea(): boolean {\r\n return this._activeAutoResizeTextarea;\r\n }\r\n\r\n @Input()\r\n set clearValue(clear: boolean) {\r\n if (clear) {\r\n this.textareaControl.reset();\r\n this._clearValue = false;\r\n } else {\r\n this._clearValue = clear;\r\n }\r\n }\r\n get clearValue(): boolean {\r\n return this._clearValue;\r\n }\r\n\r\n @Input()\r\n set rows(value: number) {\r\n this._rows = value;\r\n }\r\n get rows(): number {\r\n return this._rows;\r\n }\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {\r\n this._textareaSubscription = this.textareaControl.valueChanges.subscribe(value => {\r\n this.textAreaValueChange.emit(value);\r\n });\r\n }\r\n\r\n getTextareaValue() {\r\n return this.textareaControl.value;\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): boolean {\r\n const forbiddenKeys = ['<', '>'];\r\n if (forbiddenKeys.includes(event.key)) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n ngOnDestroy() {\r\n this._textareaSubscription?.unsubscribe();\r\n }\r\n}\r\n","@if(activeAutoResizeTextarea){\r\n <textarea\r\n [formControl]=\"textareaControl\"\r\n [placeholder]=\"placeholder | translate\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n (keydown)=\"onKeydown($event)\"\r\n [libAutoResizeTextarea]=\"activeAutoResizeTextarea\"\r\n [autoResizeMinRows]=\"minRows\"\r\n [autoResizeMaxRows]=\"maxRows\"\r\n ></textarea>\r\n } @else {\r\n <textarea\r\n [formControl]=\"textareaControl\"\r\n [placeholder]=\"placeholder\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n (keydown)=\"onKeydown($event)\"\r\n [rows]=\"rows\"\r\n ></textarea>\r\n }\r\n","import { formatDate } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { TranslatePipe } from \"@ngx-translate/core\";\r\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\r\nimport { Attachment, BIMPLUS_ATTACHMENTS_CONFIG, BimplusAttachmentsConfig } from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { CommentOutputData } from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\r\n\r\nconst config: BimplusAttachmentsConfig = {\r\n hideDeleteAttachmentButton: true,\r\n hideAttachmentSize: true\r\n}\r\n\r\n@Component({\r\n selector: 'lib-bimplus-comment',\r\n templateUrl: './bimplus-comment.component.html',\r\n styleUrls: ['./bimplus-comment.component.less'],\r\n imports: [TranslatePipe, BimplusAttachmentsComponent],\r\n providers: [{ provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config }],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusCommentComponent {\r\n\r\n @Output() outputActionCommentEvent = new EventEmitter<CommentOutputData>();\r\n @Output() getAttachment = new EventEmitter<Attachment>();\r\n\r\n private _message: string | undefined = undefined;\r\n \r\n @Input() api : WebSdk.Api | null = null;\r\n\r\n /** Attachments links to particular comment. */\r\n @Input() attachmentLinkItems:WebSdk.AttachmentLink[] = []\r\n\r\n @Input()\r\n set message(value: string | undefined) {\r\n this._message = value;\r\n }\r\n get message(): string | undefined {\r\n return this._message;\r\n }\r\n\r\n private _date = '';\r\n @Input()\r\n set date(value: string) {\r\n const formattedValue = new Intl.DateTimeFormat(undefined, { timeStyle: \"short\" }).format(new Date(value));\r\n this._date = formattedValue;\r\n }\r\n get date(): string {\r\n return this._date;\r\n }\r\n\r\n private _action = 'close';\r\n @Input()\r\n set action(value: string) {\r\n this._action = value;\r\n }\r\n get action(): string {\r\n return this._action;\r\n }\r\n\r\n private _commentId = '';\r\n @Input()\r\n set commentId(value: string) {\r\n this._commentId = value;\r\n }\r\n get commentId(): string {\r\n return this._commentId;\r\n }\r\n\r\n private _isActUserAuthor = true;\r\n @Input()\r\n set isActUserAuthor(value: boolean) {\r\n this._isActUserAuthor = value;\r\n }\r\n get isActUserAuthor(): boolean {\r\n return this._isActUserAuthor;\r\n }\r\n\r\n private _displayname = '';\r\n @Input()\r\n set displayname(value: string) {\r\n this._displayname = value;\r\n }\r\n get displayname(): string {\r\n return this._displayname;\r\n }\r\n\r\n @Input() hyperlinks: WebSdk.Hyperlink[] | undefined = [];\r\n\r\n /** Attachments related to particular comment. */\r\n @Input() attachments: WebSdk.Attachment[] = [];\r\n\r\n emitAction(data: CommentOutputData): void {\r\n this.outputActionCommentEvent.emit(data);\r\n }\r\n\r\n close(): void {\r\n const data: CommentOutputData = { action: this.action, data: { commentId: this.commentId } };\r\n this.emitAction(data);\r\n }\r\n\r\n onKeyPress(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.close();\r\n }\r\n }\r\n\r\n formatTime(date: string): string {\r\n const locale = window.navigator.language;\r\n const unformattedDate = new Date(date);\r\n if (locale.includes('en')) {\r\n return formatDate(unformattedDate, 'hh:mm a', locale);\r\n }\r\n return formatDate(unformattedDate, 'hh:mm', locale);\r\n }\r\n}\r\n","@if (message !== undefined) {\r\n <div\r\n class=\"comment-item-container\"\r\n [class]=\"isActUserAuthor ? 'author' : ''\">\r\n @if (!isActUserAuthor) {\r\n <div class=\"comment-header\">\r\n <div class=\"comment-title\">{{isActUserAuthor? '' : displayname}}</div>\r\n </div>\r\n }\r\n @if (isActUserAuthor) {\r\n <div\r\n class=\"comment-close\"\r\n (click)=\"close()\"\r\n (keydown)=\"onKeyPress($event)\"\r\n ></div>\r\n }\r\n @if (message !== undefined){\r\n <div class=\"comment-item-text\">{{message}}</div>\r\n }\r\n\r\n @if (attachments.length) {\r\n <lib-bimplus-attachments\r\n listOnly\r\n [attachments]=\"attachments\"\r\n (getAttachment)=\"getAttachment.emit($event)\"\r\n />\r\n }\r\n\r\n @if (attachmentLinkItems.length) {\r\n @for (attachmentLink of attachmentLinkItems; track attachmentLink) {\r\n <a class=\"item-row\" href=\"{{attachmentLink.link}}\" target=\"_blank\">\r\n <div class=\"attachment-link-icon\" title=\"{{ '_Attachment_link' | translate }}\"></div>\r\n <div class=\"text\" title=\"{{ attachmentLink.name }}\">{{ attachmentLink.name}}</div>\r\n </a>\r\n }\r\n }\r\n\r\n @for (link of hyperlinks; track link) {\r\n <a class=\"item-row\" href=\"{{ link.url }}\" target=\"_blank\">\r\n <div class=\"link-icon\" title=\"{{ '_Hyperlink' | translate }}\"></div>\r\n <div class=\"text\" title=\"{{ link.url }}\">{{ link.name }}</div>\r\n </a>\r\n }\r\n\r\n @if (date && date.length > 0){\r\n <div class=\"comment-item-date\">\r\n {{date}}\r\n </div>\r\n }\r\n </div>\r\n }\r\n","import { inject, Injectable } from '@angular/core';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport {catchError, defaultIfEmpty, first, forkJoin, from, map, Observable, of, switchMap} from 'rxjs';\r\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\r\nimport { Attachment } from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { postAttachmentLinks } from '../links-to-documents/links-to-documents.component';\r\nimport {DecoratorsService } from '../../services/decorators.service';\r\n\r\n@Injectable()\r\nexport class BimplusObjectCommentsListService {\r\n private readonly decorators = inject(DecoratorsService);\r\n\r\n public api!: WebSdk.Api;\r\n\r\n private readonly bimplusAttachmentsService = inject(BimplusAttachmentsService);\r\n\r\n\r\n public deleteComment(commentId: string) {\r\n return from(this.api.comments.delete(commentId));\r\n }\r\n\r\n public downloadAttachment(attachment: Attachment) {\r\n const { id, fileName } = attachment;\r\n if (!this.api) {\r\n return;\r\n }\r\n const api = this.api;\r\n const path = `${api.getApiTeamUrl()}attachments/${id}/download?api-token=${api.getAccessToken()}&openInBrowser=true`;\r\n this.bimplusAttachmentsService.download(path, fileName);\r\n }\r\n\r\n public postComments(\r\n rootObjectId: string,\r\n dataText: string,\r\n hyperlinks: Partial<WebSdk.Hyperlink>[],\r\n attachments: Attachment[],\r\n newAttachmentIDs: string[]\r\n ): Observable<string | null> {\r\n return from(this.api.objects.postComment(rootObjectId, dataText)).pipe(\r\n switchMap(createdComment => {\r\n const { id: createdCommentId } = createdComment;\r\n\r\n // Create form data for attachments\r\n const formData = attachments.map(attachment => {\r\n const attachmentsPayload = new FormData();\r\n attachmentsPayload.append('file', attachment.file!);\r\n attachmentsPayload.append('name', attachment.fileName);\r\n attachmentsPayload.append('size', attachment.file!.size.toString());\r\n attachmentsPayload.append('type', attachment.file!.type);\r\n attachmentsPayload.append('objectId', createdCommentId);\r\n return attachmentsPayload;\r\n });\r\n\r\n // Post attachments if any, otherwise continue\r\n const attachmentCalls = formData.length\r\n ? forkJoin(formData.map(data => from(this.api.objects.postAttachment(createdCommentId, data, undefined, ''))))\r\n : of([]);\r\n\r\n return attachmentCalls.pipe(map(() => createdCommentId));\r\n }),\r\n switchMap(createdCommentId => {\r\n // Post attachment links\r\n return newAttachmentIDs.length\r\n ? postAttachmentLinks(newAttachmentIDs, createdCommentId, this.api).pipe(map(() => createdCommentId))\r\n : of(createdCommentId);\r\n }),\r\n switchMap(createdCommentId => {\r\n // Manage hyperlinks\r\n return hyperlinks.length\r\n ? this.manageHyperLinks(createdCommentId, hyperlinks).pipe(map(() => createdCommentId))\r\n : of(createdCommentId);\r\n }),\r\n defaultIfEmpty(null),\r\n first(),\r\n catchError(error => {\r\n console.error('Error in postComments:', error);\r\n return of(null); // Ensure the stream completes with null in case of an error\r\n })\r\n );\r\n }\r\n private decorateComment(comment: WebSdk.CommentResponse) {\r\n if(comment.attachmentLinks && comment.attachmentLinks.length > 0) {\r\n const decoratedLinks = comment.attachmentLinks.map((link) => this.decorators.decorateLink(this.api!,link, [comment.id])); \r\n comment.attachmentLinks = decoratedLinks; \r\n }\r\n }\r\n\r\n private decorateComments(comments: WebSdk.CommentsResponse) { \r\n comments.forEach((comment) => {\r\n this.decorateComment(comment);\r\n });\r\n return comments;\r\n }\r\n\r\n public loadComments(objectId: string): Observable<WebSdk.CommentsResponse> {\r\n return from(this.api.objects.getComments(objectId)).pipe(\r\n map((response: WebSdk.CommentsResponse | undefined) => {\r\n if (!response) {\r\n throw new Error('Comments response is undefined'); // Handle undefined response\r\n }\r\n // Modify the response here\r\n return this.decorateComments(response!); \r\n })\r\n );\r\n }\r\n\r\n public manageHyperLinks(\r\n createdCommentId: string,\r\n hyperlinks: Partial<WebSdk.Hyperlink>[]\r\n ) {\r\n const hyperlinkPromises: (Promise<void | WebSdk.Hyperlink> | undefined)[] =\r\n [];\r\n\r\n hyperlinks.forEach((h) => {\r\n if (!h) {\r\n return;\r\n }\r\n const hyperlinkData = JSON.stringify({\r\n name: h.name,\r\n objectId: h.objectId,\r\n url: h.url\r\n });\r\n const promise = this.api?.objects\r\n .postHyperlink(createdCommentId, hyperlinkData)\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n hyperlinkPromises.push(promise);\r\n });\r\n\r\n return from(Promise.all(hyperlinkPromises));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { StatusBarData } from './statusBar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BimplusStatusBarService {\r\n\r\n _statusBarData: BehaviorSubject<StatusBarData> = new BehaviorSubject<StatusBarData>({\r\n title: '',\r\n statusBarVisible: false\r\n });\r\n\r\n constructor() { }\r\n\r\n get statusBarVisible(): boolean {\r\n return this._statusBarData.value.statusBarVisible;\r\n }\r\n\r\n get title(): string {\r\n return this._statusBarData.value.title;\r\n }\r\n\r\n get statusBarData(): StatusBarData {\r\n return this._statusBarData.value;\r\n }\r\n\r\n get statusBarDataSubscription(): BehaviorSubject<StatusBarData> {\r\n return this._statusBarData;\r\n }\r\n\r\n setStatusBarData(data: StatusBarData): void {\r\n this._statusBarData.next(data);\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit, signal, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BimplusOverlayDialogDeleteComponent } from '../bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { AsyncPipe, DatePipe } from '@angular/common';\r\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\r\nimport { BimplusTextareaComponent } from '../bimplus-textarea/bimplus-textarea.component';\r\nimport { BimplusCommentComponent } from '../bimplus-comment/bimplus-comment.component';\r\nimport * as WebSdk from \"bimplus-websdk\";\r\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\r\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\r\nimport { BimplusLocalizedWidgetComponent } from '@bimplus/navigation';\r\nimport { BimplusScrollableContainerComponent } from '@bimplus/navigation';\r\nimport { CommentData, CommentOutputData, IDialogConfirmClose } from './bimplus-object-comments-list.interface';\r\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from \"@angular/forms\";\r\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\r\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\r\nimport {\r\n Attachment,\r\n BIMPLUS_ATTACHMENTS_CONFIG,\r\n BimplusAttachmentsConfig,\r\n} from '../bimplus-attachments/bimplus-attachments.interface';\r\nimport { BehaviorSubject, switchMap } from 'rxjs';\r\nimport { BimplusObjectCommentsListService } from './bimplus-object-comments-list.service';\r\nimport { LinksToDocumentsComponent } from '../links-to-documents/links-to-documents.component';\r\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\r\nimport { BimplusStatusBarService } from '../bimplus-status-bar/bimplus-status-bar.service';\r\nimport { NewAttachInfo } from './bimplus-object-comments-list.interface';\r\n\r\n\r\nconst config: BimplusAttachmentsConfig = {\r\n showNoAttachmentsFound: false,\r\n hideAttachmentSize: true,\r\n};\r\n@Component({\r\n selector: 'lib-bimplus-object-comments-list',\r\n templateUrl: './bimplus-object-comments-list.component.html',\r\n styleUrls: ['./bimplus-object-comments-list.component.less'],\r\n imports: [\r\n CommonModule,\r\n BimplusTextareaComponent,\r\n BimplusCommentComponent,\r\n BimplusButtonsRowComponent,\r\n TranslateModule,\r\n BimplusScrollableContainerComponent,\r\n BimplusInputTextFieldComponent,\r\n BimplusAttachmentsComponent,\r\n LinksToDocumentsComponent,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n AsyncPipe\r\n],\r\n providers: [\r\n DatePipe,\r\n BimplusObjectCommentsListService,\r\n BimplusAttachmentsService,\r\n { provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusObjectCommentsListComponent\r\n extends BimplusLocalizedWidgetComponent\r\n implements OnInit, OnChanges {\r\n private readonly dialogService = inject(DialogService);\r\n private readonly datePipe = inject(DatePipe);\r\n private readonly formBuilder = inject(FormBuilder);\r\n protected readonly bimplusAttachmentsService = inject(BimplusAttachmentsService);\r\n private readonly bimplusObjectCommentsListService = inject(BimplusObjectCommentsListService);\r\n private statusBarService = inject(BimplusStatusBarService);\r\n\r\n hyperlinkForm: FormGroup;\r\n\r\n @Input({ required: true }) api!: WebSdk.Api | null;\r\n @Input() project: ProjectNavigatorProject | null = null;\r\n @Input() wormholeSelector: string = \"localEmbeddedModalId\";\r\n @Input() env: string = \"prod\";\r\n @Input() attachmentLinkItems: WebSdk.AttachmentLink[] = []\r\n @Input() inputBaseUrl: string = '';\r\n protected readonly commentsList$ = new BehaviorSubject<WebSdk.CommentResponse[]>([]);\r\n protected readonly loading = signal(false);\r\n protected readonly attachmentsState = signal<Attachment[]>([]);\r\n buttonRowItems: BimplusButtonRowItem[] = [];\r\n hyperlinkButtonRowItems: BimplusButtonRowItem[] = [];\r\n textAreaValue: string | null = null;\r\n lastShownDate = '';\r\n placeholder = '';\r\n name = '';\r\n readonly = false;\r\n autoResizeTextarea = true;\r\n minRows = 3;\r\n maxRows = 10;\r\n clearValue = false;\r\n statusBarTitleMessage = this.translateService.instant('_Loading');\r\n\r\n // attachment ids ready to map to concrete comment\r\n newAttachmentIDs: string[] = []\r\n\r\n isAddingHyperlink: boolean = false;\r\n\r\n newCommentAttachments: NewAttachInfo[] = [];\r\n\r\n private _rootObjectId = '';\r\n private _userId = '';\r\n\r\n @Input()\r\n set rootObjectId(id: string) {\r\n this._rootObjectId = id;\r\n }\r\n\r\n get rootObjectId(): string {\r\n return this._rootObjectId;\r\n }\r\n\r\n @Input()\r\n set userId(id: string) {\r\n this._userId = id;\r\n }\r\n\r\n get userId(): string {\r\n return this._userId;\r\n }\r\n\r\n constructor() {\r\n super();\r\n\r\n this.hyperlinkForm = this.formBuilder.group({\r\n name: ['', []],\r\n url: [\r\n '',\r\n [\r\n Validators.required,\r\n Validators.pattern(/^[^<>]*$/), // Do not allow < or >\r\n Validators.pattern(/^(?!\\s*$).+/), // Do not allow all empty string, but allow text after spaces\r\n ],\r\n ],\r\n });\r\n }\r\n\r\n isCreateButtonDisabled(): boolean {\r\n return !(\r\n this.textAreaValue ||\r\n this.newAttachmentIDs?.length > 0 ||\r\n this.getHyperlinks(this.rootObjectId)?.length > 0 ||\r\n this.attachmentsState()?.length > 0\r\n );\r\n }\r\n\r\n checkCreateButtonState() {\r\n if (!this.buttonRowItems?.[0]) {\r\n return;\r\n }\r\n this.buttonRowItems[0].disabled = this.isCreateButtonDisabled();\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.bimplusObjectCommentsListService.api = this.api!;\r\n this.loadComments();\r\n const submit: BimplusButtonRowItem[] = [\r\n {\r\n id: 'submit',\r\n title: this.translateService.instant('_Add comment'),\r\n tooltip: this.translateService.instant('_Add comment'),\r\n disabled: this.isCreateButtonDisabled(),\r\n buttonStyle: 'primary',\r\n },\r\n ];\r\n this.placeholder = this.translateService.instant(\r\n '_Place comment text here'\r\n );\r\n this.name = this.translateService.instant('comment');\r\n this.buttonRowItems = submit;\r\n\r\n this.hyperlinkButtonRowItems.push(\r\n {\r\n id: 'cancel-hyperlink',\r\n title: this.translateService.instant('_Cancel'),\r\n tooltip: this.translateService.instant('_Cancel'),\r\n disabled: false,\r\n buttonStyle: 'primary',\r\n },\r\n {\r\n id: 'add-hyperlink',\r\n title: this.translateService.instant('_Add hyperlink'),\r\n tooltip: this.translateService.instant('_Add hyperlink'),\r\n disabled: true,\r\n buttonStyle: 'primary',\r\n }\r\n );\r\n\r\n this.hyperlinkForm.statusChanges.subscribe((status) => {\r\n this.hyperlinkButtonRowItems[1].disabled = status !== 'VALID';\r\n });\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['rootObjectId'] && !changes['rootObjectId'].firstChange) {\r\n this.lastShownDate = '';\r\n this.loadComments();\r\n }\r\n }\r\n\r\n protected onAttachmentsLinkChange(newAttachments: NewAttachInfo[]): void {\r\n const newDecoratedAttachments: NewAttachInfo[] = newAttachments.map((attachment) => {\r\n attachment.iconClass = 'fa fa-link';\r\n attachment.iconTitle = this.translateService.instant('_Attachment_link');\r\n attachment.deleteButtonTitle = this.translateService.instant('_Delete_attachmentlink');\r\n return attachment;\r\n });\r\n const newCommentAttachments = this.newCommentAttachments.filter((attachment) => attachment?.type === 'Hyperlink');\r\n this.newCommentAttachments = [...newCommentAttachments, ...newDecoratedAttachments];\r\n this.newAttachmentIDs = newAttachments.map((attachment) => attachment.id);\r\n this.checkCreateButtonState();\r\n }\r\n\r\n\r\n protected onAddAttachment(file: File): void {\r\n const attachment = this.bimplusAttachmentsService.getAttachment(file);\r\n this.attachmentsState.update(attachments => ([...attachments, attachment]));\r\n this.checkCreateButtonState();\r\n }\r\n\r\n protected onDeleteAttachment(attachment: Attachment): void {\r\n this.attachmentsState.update(attachments => attachments.filter(a => a !== attachment));\r\n this.checkCreateButtonState();\r\n }\r\n\r\n /** Event on click attachment. */\r\n protected onGetAttachment(attachment: Attachment): void {\r\n this.bimplusObjectCommentsListService.downloadAttachment(attachment);\r\n }\r\n\r\n onTextareaValueChange(value: string) {\r\n this.textAreaValue = value;\r\n this.checkCreateButtonState();\r\n }\r\n\r\n handleActionCommentEvent(event: CommentOutputData) {\r\n if (event.action === 'delete') {\r\n const data = event.data as CommentData;\r\n this.openDialogDeleteComment(data.commentId);\r\n }\r\n }\r\n\r\n actionDialogClose(data: IDialogConfirmClose) {\r\n this.dialogService.close(data);\r\n }\r\n\r\n openDialogDeleteComment(commentId: string) {\r\n this.dialogService.open(BimplusOverlayDialogDeleteComponent, {\r\n options: {\r\n position: 'middle',\r\n positionOptions: {},\r\n overlayClickEnabled: false,\r\n overlayVisibilityEnabled: true,\r\n draggable: true,\r\n },\r\n data: {\r\n title: this.translateService.instant(\r\n '_Comment delete confirmation title'\r\n ),\r\n message: this.translateService.instant(\r\n '_Comment delete confirmation message'\r\n ),\r\n acceptCallback: () => {\r\n this.deleteComment(commentId);\r\n },\r\n },\r\n });\r\n }\r\n\r\n isSameDate(date?: string): boolean {\r\n if (!date) {\r\n return false;\r\n }\r\n const shortDate = this.datePipe.transform(date, 'shortDate');\r\n if (!shortDate) {\r\n // Transformation date to shortDate failed\r\n return false;\r\n }\r\n if (this.lastShownDate === shortDate) {\r\n // Date is identical to the last shown date\r\n return true;\r\n }\r\n // Valid date but not identical to last one\r\n this.lastShownDate = shortDate;\r\n return false;\r\n }\r\n\r\n buttonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'submit') {\r\n if (!this.api || !this.rootObjectId) return;\r\n this.loading.set(true);\r\n\r\n const data = {\r\n text: this.textAreaValue,\r\n objectId: this.rootObjectId,\r\n };\r\n const dataText = JSON.stringify(data);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Creating new comment') });\r\n this.bimplusObjectCommentsListService.postComments(this.rootObjectId, dataText, this.getHyperlinks(this.rootObjectId), this.attachmentsState(), this.newAttachmentIDs)\r\n .pipe(switchMap(() => this.bimplusObjectCommentsListService.loadComments(this.rootObjectId)))\r\n .subscribe({\r\n next: (comments) => this.commentsList$.next(comments),\r\n complete: () => {\r\n this.attachmentsState.set([]);\r\n this.newCommentAttachments = [];\r\n this.attachmentLinkItems = [];\r\n this.newAttachmentIDs = [];\r\n this.textAreaValue = null;\r\n this.clearValue = true;\r\n this.buttonRowItems[0].disabled = true;\r\n this.loading.set(false);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\r\n }\r\n });\r\n }\r\n }\r\n\r\n hyperlinkButtonRowButtonClicked($event: BimplusButtonClickEvent) {\r\n if ($event.id === 'add-hyperlink') {\r\n this.addNewCommentHyperlink();\r\n } else if ($event.id === 'cancel-hyperlink') {\r\n this.hyperlinkForm.reset();\r\n this.isAddingHyperlink = false;\r\n }\r\n }\r\n\r\n addNewCommentHyperlink() {\r\n if (!this.hyperlinkForm.valid) {\r\n return;\r\n }\r\n\r\n let sanitizedUrl: string = this.hyperlinkForm.value['url'].trim();\r\n if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\r\n sanitizedUrl = 'https://' + sanitizedUrl;\r\n }\r\n let sanitizedName = this.hyperlinkForm.value['name']?.trim() ?? '';\r\n if (sanitizedName === '') {\r\n sanitizedName = sanitizedUrl;\r\n }\r\n const newItem: NewAttachInfo = {\r\n id: '',\r\n type: 'Hyperlink',\r\n nameShort: sanitizedName,\r\n name: sanitizedName,\r\n url: sanitizedUrl,\r\n iconClass: 'fa fa-link',\r\n iconTitle: this.translateService.instant('_Hyperlink'),\r\n deleteButtonTitle: this.translateService.instant('_Remove hyperlink'),\r\n };\r\n this.newCommentAttachments.push(newItem);\r\n this.hyperlinkForm.reset();\r\n this.isAddingHyperlink = false;\r\n this.checkCreateButtonState();\r\n }\r\n\r\n deleteComment(commentId: string) {\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Deleting the comment') });\r\n this.bimplusObjectCommentsListService.deleteComment(commentId)\r\n .subscribe(() => this.loadComments())\r\n }\r\n\r\n addHyperlinkIconClicked() {\r\n this.isAddingHyperlink = !this.isAddingHyperlink;\r\n }\r\n\r\n addHyperlinkIconKeypress(event: KeyboardEvent) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n this.addHyperlinkIconClicked();\r\n }\r\n }\r\n\r\n removeNewCommentAttachment(link: NewAttachInfo) {\r\n this.newCommentAttachments = this.newCommentAttachments.filter(\r\n (commentLink) => commentLink.id !== link.id\r\n );\r\n if (link?.type !== 'Hyperlink') {\r\n this.attachmentLinkItems = this.attachmentLinkItems.filter(\r\n (attachmentLink) => attachmentLink.id !== link.id\r\n );\r\n this.newAttachmentIDs = this.newAttachmentIDs.filter(id => id !== link.id)\r\n }\r\n this.checkCreateButtonState();\r\n }\r\n\r\n removeNewCommentAttachmentKeypress(\r\n event: KeyboardEvent,\r\n link: NewAttachInfo\r\n ) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n this.removeNewCommentAttachment(link);\r\n }\r\n }\r\n\r\n isActUserAuthor(item: WebSdk.CommentResponse) {\r\n return item.author?.id === this.userId;\r\n }\r\n\r\n displayName(item: WebSdk.CommentResponse): string {\r\n return item.author?.displayname ? item.author?.displayname : '';\r\n }\r\n\r\n formatDate(date: string): string {\r\n const locale = window.navigator.language;\r\n if (locale.includes('en')) {\r\n const unformattedDate = new Date(date);\r\n return unformattedDate.getMonth() + '/' + unformattedDate.getDate() + '/' + unformattedDate.getFullYear();\r\n }\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: \"short\" }).format(new Date(date));\r\n }\r\n\r\n clearTextareaValue() {\r\n return this.clearValue;\r\n }\r\n\r\n\r\n private loadComments() {\r\n this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Loading comments list') });\r\n this.loading.set(true);\r\n this.bimplusObjectCommentsListService\r\n .loadComments(this.rootObjectId)\r\n .subscribe({\r\n next: comments => {\r\n this.commentsList$.next(comments)\r\n },\r\n\r\n complete: () => {\r\n this.loading.set(false);\r\n this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\r\n }\r\n })\r\n }\r\n\r\n private getHyperlinks(objectId: string): Partial<WebSdk.Hyperlink>[] {\r\n return this.newCommentAttachments\r\n .filter(h => h?.type === 'Hyperlink') // Filter objects with type 'Hyperlink'\r\n .map((h) => ({\r\n ...h,\r\n objectId,\r\n }));\r\n }\r\n\r\n onEnterKeyPressedInHyperlinkForm() {\r\n this.addNewCommentHyperlink();\r\n }\r\n}\r\n","@if (!loading()) {\r\n <div class=\"comment-tab-container\">\r\n <div class=\"textarea-container\">\r\n <lib-bimplus-textarea\r\n (textAreaValueChange)=\"onTextareaValueChange($event)\"\r\n [placeholder]=\"placeholder\"\r\n [name]=\"name\"\r\n [readonly]=\"readonly\"\r\n [activeAutoResizeTextarea]=\"true\"\r\n [minRows]=\"minRows\"\r\n [maxRows]=\"maxRows\"\r\n [clearValue]=\"clearTextareaValue()\"\r\n ></lib-bimplus-textarea>\r\n </div>\r\n\r\n <lib-bimplus-attachments\r\n #attachments\r\n listOnly\r\n [class]=\"['new-comment-attachments']\"\r\n [attachments]=\"attachmentsState()\"\r\n (addAttachment)=\"onAddAttachment($event)\"\r\n (deleteAttachment)=\"onDeleteAttachment($event)\"\r\n />\r\n\r\n <lib-links-to-documents\r\n #linksToDocuments\r\n listOnly\r\n hideAttachmentSize\r\n showEmptyMessage=\"false\"\r\n [attachments]=\"attachmentLinkItems\"\r\n (attachmentsLinkChange)=\"onAttachmentsLinkChange($event)\"\r\n [api]=\"api\"\r\n [project]=\"project\"\r\n [rootObjectId]=''\r\n [canCreateAttachmentLink]=\"true\"\r\n [canDeleteAttachmentLink]=\"true\"\r\n [wormholeSelector]=\"wormholeSelector\"\r\n [env]=\"env\"\r\n [inputBaseUrl]=\"inputBaseUrl\"\r\n />\r\n\r\n @if (newCommentAttachments.length > 0) {\r\n <div class=\"new-comment-attachment-list\">\r\n @for (item of newCommentAttachments; track item) {\r\n <div\r\n [ngClass]=\"'new-comment-attachment ' + item.type\"\r\n [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\r\n <div\r\n [ngClass]=\"'icon-small ' + item.type\"\r\n [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\r\n </div>\r\n <div class=\"text\">{{ item.name }} </div>\r\n <span class=\"cancel-icon\" title=\"{{ item.deleteButtonTitle}}\" (click)=\"removeNewCommentAttachment(item)\" (keydown)=\"removeNewCommentAttachmentKeypress($event, item)\"></span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (isAddingHyperlink) {\r\n <form [formGroup]=\"hyperlinkForm\" class=\"hyperlink-input-form\">\r\n <div class=\"hyperlink-input-row\">\r\n <div class=\"link-icon icon-next-to-text-input\"></div>\r\n <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\r\n </div>\r\n <div class=\"hyperlink-input-row\">\r\n <div class=\"icon-next-to-text-input\"></div>\r\n <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\r\n </div>\r\n\r\n <lib-bimplus-buttons-row [items]=\"hyperlinkButtonRowItems\" (buttonClicked)=\"hyperlinkButtonRowButtonClicked($event)\"/>\r\n </form>\r\n }\r\n\r\n <div class=\"comments-tab-attachments-section\">\r\n <div class=\"comments-attachments-list\">\r\n <div class=\"tab-attachments icon attachments-icon hidden\"></div>\r\n <div class=\"attachment-icon icon-small interactive\" [title]=\"'_Add attachment' | translate\" (click)=\"attachments.open()\" (keydown)=\"attachments.open()\"></div>\r\n <div class=\"link-icon icon-small interactive\" [title]=\"'_Add hyperlink' | translate\" (click)=\"addHyperlinkIconClicked()\" (keydown)=\"addHyperlinkIconKeypress($event)\"></div>\r\n <div class=\"attachment-link-icon icon-small interactive\" [title]=\"'_Add_attachment_link' | translate\" (click)=\"linksToDocuments.createAttachmentLink(api!)\" (keydown)=\"linksToDocuments.createAttachmentLink(api!)\"></div>\r\n <div class=\"tab-attachmentlinks icon attachments-icon hidden\"></div>\r\n </div>\r\n <div class=\"add-comment\">\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonRowButtonClicked($event)\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"comments-separator\"></div>\r\n\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @if ((commentsList$ | async)?.length === 0) {\r\n <div class=\"no-comments-found\">\r\n {{ '_No comments found' | translate }}\r\n </div>\r\n } @else {\r\n @for (item of commentsList$ | async; track item) {\r\n @if(item.createdAt && !isSameDate(item.createdAt)) {\r\n <div class=\"comment-list-date\">\r\n {{formatDate(item.createdAt)}}\r\n </div>\r\n }\r\n <lib-bimplus-comment\r\n (outputActionCommentEvent)=\"handleActionCommentEvent($event)\"\r\n (getAttachment)=\"onGetAttachment($event)\"\r\n [message]=\"item.text\"\r\n [api]=\"api\"\r\n [date]=\"item.createdAt ? item.createdAt : ''\"\r\n action=\"delete\"\r\n [commentId]=\"item.id\"\r\n [attachments]=\"item.attachments ?? []\"\r\n [attachmentLinkItems]=\"item.attachmentLinks ?? []\"\r\n [hyperlinks]=\"item.hyperlinks\"\r\n [isActUserAuthor]=\"isActUserAuthor(item)\"\r\n [displayname]=\"displayName(item)\">\r\n </lib-bimplus-comment>\r\n }\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n </div>\r\n }\r\n","import { Component, OnInit, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BimplusStatusBarService } from './bimplus-status-bar.service';\r\nimport { StatusBarData } from './statusBar';\r\n\r\n@Component({\r\n selector: 'lib-bimplus-status-bar',\r\n templateUrl: './bimplus-status-bar.component.html',\r\n styleUrls: ['./bimplus-status-bar.component.less'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusStatusBarComponent implements OnInit {\r\n private statusBarService = inject(BimplusStatusBarService);\r\n\r\n\r\n private _title = '';\r\n get title(): string {\r\n return this._title;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.statusBarService.statusBarDataSubscription.subscribe((data: StatusBarData) => {\r\n this._title = data.title;\r\n });\r\n }\r\n\r\n closeClick(): void {\r\n this.statusBarService.setStatusBarData({\r\n title: '',\r\n statusBarVisible: false\r\n });\r\n }\r\n\r\n closeKeyDown($event: KeyboardEvent) {\r\n if ($event.key === 'Enter' || $event.key === 'Escape') {\r\n this.closeClick();\r\n }\r\n }\r\n\r\n}\r\n","<div\r\n class=\"statusBar-container\">\r\n <span \r\n class=\"status-bar-text\"\r\n [innerHTML]=\"title\">\r\n </span>\r\n <div\r\n class=\"close-button\"\r\n title=\"Close\"\r\n (click)=\"closeClick()\"\r\n (keydown)=\"closeKeyDown($event)\">\r\n </div>\r\n</div>","import { MissingTranslationHandler, MissingTranslationHandlerParams } from '@ngx-translate/core';\r\n\r\nexport class BimplusMissingTranslationHandler implements MissingTranslationHandler {\r\n handle(params: MissingTranslationHandlerParams) {\r\n console.warn(\"Missing translation string \" + params.key);\r\n return params.key;\r\n }\r\n}\r\n"],"mappings":"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B,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,eAAe,CAAC,OAAO,IAAI;EAC3B,eAAe;EACf,cAAc;EACd,gBAAgB,CAAC,IAAI,EAAE;EACvB,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,kBAAkB;CAEb;AACT;AAqBA,SAAS,qBAAkB;CACzB,MAAM,QAA4B;EAEhC;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,WAAW;GACX,UAAU;GACV,MAAM;GACN,SAAS;GACT,iBAAiB;EAClB;EAGD;GACE,UAAU;GACV,WAAW;GACX,MAAM;GACN,SAAS;GACT,iBAAiB;GACjB,WAAW;GACX,UAAU;IAER;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MAAM;KACN,SAAS;KACT,iBAAiB;KACjB,aAAa;IACd;IAED;KACE,UAAU;KACV,MAAM;KACN,WAAW;KACX,MA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"}