phoenix-ui-components 2.5.0 → 2.6.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.
- package/dist/components/file-explorer/file-explorer.component.d.ts +29 -0
- package/dist/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.d.ts +1 -0
- package/dist/components/phoenix-ui.module.d.ts +20 -14
- package/dist/components/ring-loader/ring-loader.component.d.ts +5 -0
- package/dist/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.d.ts +28 -0
- package/dist/components/ui-menu/event-data-explorer/event-data-explorer.component.d.ts +13 -0
- package/dist/components/ui-menu/index.d.ts +2 -0
- package/dist/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.d.ts +1 -1
- package/dist/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.d.ts +6 -5
- package/dist/components/ui-menu/tree-menu/tree-menu.component.d.ts +2 -12
- package/dist/esm2020/components/embed-menu/embed-menu.component.mjs +3 -3
- package/dist/esm2020/components/embed-menu/experiment-link/experiment-link.component.mjs +3 -3
- package/dist/esm2020/components/file-explorer/file-explorer.component.mjs +49 -0
- package/dist/esm2020/components/loader/loader.component.mjs +3 -3
- package/dist/esm2020/components/nav/nav.component.mjs +3 -3
- package/dist/esm2020/components/phoenix-menu/config/config-slider/config-slider.component.mjs +3 -3
- package/dist/esm2020/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.mjs +10 -6
- package/dist/esm2020/components/phoenix-menu/phoenix-menu.component.mjs +3 -3
- package/dist/esm2020/components/phoenix-ui.module.mjs +35 -12
- package/dist/esm2020/components/ring-loader/ring-loader.component.mjs +11 -0
- package/dist/esm2020/components/ui-menu/animate-camera/animate-camera.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/animate-event/animate-event.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/ar-toggle/ar-toggle.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/auto-rotate/auto-rotate.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/collections-info/collections-info.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/dark-theme/dark-theme.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.mjs +106 -0
- package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer.component.mjs +26 -0
- package/dist/esm2020/components/ui-menu/event-selector/event-selector.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/experiment-info/experiment-info.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/index.mjs +3 -1
- package/dist/esm2020/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/info-panel/info-panel.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.mjs +4 -4
- package/dist/esm2020/components/ui-menu/io-options/io-options.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/main-view-toggle/main-view-toggle.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/menu-toggle/menu-toggle.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/object-clipping/object-clipping.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/object-selection/object-selection.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/overlay/overlay.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/overlay-view/overlay-view.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/performance-toggle/performance-toggle.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.mjs +4 -4
- package/dist/esm2020/components/ui-menu/share-link/share-link.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/ss-mode/ss-mode.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.mjs +4 -4
- package/dist/esm2020/components/ui-menu/tree-menu/tree-menu.component.mjs +4 -4
- package/dist/esm2020/components/ui-menu/ui-menu.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/view-options/view-options.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/vr-toggle/vr-toggle.component.mjs +3 -3
- package/dist/esm2020/components/ui-menu/zoom-controls/zoom-controls.component.mjs +3 -3
- package/dist/esm2020/public_api.mjs +3 -1
- package/dist/esm2020/services/event-display.service.mjs +3 -3
- package/dist/esm2020/services/extras/attribute.pipe.mjs +3 -3
- package/dist/fesm2015/phoenix-ui-components.mjs +334 -135
- package/dist/fesm2015/phoenix-ui-components.mjs.map +1 -1
- package/dist/fesm2020/phoenix-ui-components.mjs +330 -135
- package/dist/fesm2020/phoenix-ui-components.mjs.map +1 -1
- package/dist/public_api.d.ts +2 -0
- package/package.json +12 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phoenix-ui-components.mjs","sources":["../../lib/components/nav/nav.component.ts","../../lib/components/nav/nav.component.html","../../lib/components/phoenix-menu/config/config-slider/config-slider.component.ts","../../lib/components/phoenix-menu/config/config-slider/config-slider.component.html","../../lib/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.ts","../../lib/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.html","../../lib/components/phoenix-menu/phoenix-menu.component.ts","../../lib/components/phoenix-menu/phoenix-menu.component.html","../../lib/services/event-display.service.ts","../../lib/components/ui-menu/menu-toggle/menu-toggle.component.ts","../../lib/components/ui-menu/menu-toggle/menu-toggle.component.html","../../lib/components/ui-menu/animate-camera/animate-camera.component.ts","../../lib/components/ui-menu/animate-camera/animate-camera.component.html","../../lib/components/ui-menu/animate-event/animate-event.component.ts","../../lib/components/ui-menu/animate-event/animate-event.component.html","../../lib/components/ui-menu/auto-rotate/auto-rotate.component.ts","../../lib/components/ui-menu/auto-rotate/auto-rotate.component.html","../../lib/components/ui-menu/overlay/overlay.component.ts","../../lib/components/ui-menu/overlay/overlay.component.html","../../lib/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.ts","../../lib/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.html","../../lib/components/ui-menu/collections-info/collections-info.component.ts","../../lib/components/ui-menu/collections-info/collections-info.component.html","../../lib/components/ui-menu/dark-theme/dark-theme.component.ts","../../lib/components/ui-menu/dark-theme/dark-theme.component.html","../../lib/components/ui-menu/event-selector/event-selector.component.ts","../../lib/components/ui-menu/event-selector/event-selector.component.html","../../lib/components/ui-menu/experiment-info/experiment-info.component.ts","../../lib/components/ui-menu/experiment-info/experiment-info.component.html","../../lib/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.ts","../../lib/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.html","../../lib/components/ui-menu/info-panel/info-panel.component.ts","../../lib/components/ui-menu/info-panel/info-panel.component.html","../../lib/services/extras/event-data-import.ts","../../lib/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.ts","../../lib/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.html","../../lib/components/ui-menu/io-options/io-options.component.ts","../../lib/components/ui-menu/io-options/io-options.component.html","../../lib/components/ui-menu/main-view-toggle/main-view-toggle.component.ts","../../lib/components/ui-menu/main-view-toggle/main-view-toggle.component.html","../../lib/components/ui-menu/object-clipping/object-clipping.component.ts","../../lib/components/ui-menu/object-clipping/object-clipping.component.html","../../lib/services/extras/attribute.pipe.ts","../../lib/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.ts","../../lib/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.html","../../lib/components/ui-menu/object-selection/object-selection.component.ts","../../lib/components/ui-menu/object-selection/object-selection.component.html","../../lib/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.ts","../../lib/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.html","../../lib/components/ui-menu/overlay-view/overlay-view.component.ts","../../lib/components/ui-menu/overlay-view/overlay-view.component.html","../../lib/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.ts","../../lib/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.html","../../lib/components/ui-menu/tree-menu/tree-menu.component.ts","../../lib/components/ui-menu/tree-menu/tree-menu.component.html","../../lib/components/ui-menu/view-options/view-options.component.ts","../../lib/components/ui-menu/view-options/view-options.component.html","../../lib/components/ui-menu/vr-toggle/vr-toggle.component.ts","../../lib/components/ui-menu/vr-toggle/vr-toggle.component.html","../../lib/components/ui-menu/ar-toggle/ar-toggle.component.ts","../../lib/components/ui-menu/ar-toggle/ar-toggle.component.html","../../lib/components/ui-menu/zoom-controls/zoom-controls.component.ts","../../lib/components/ui-menu/zoom-controls/zoom-controls.component.html","../../lib/components/ui-menu/ss-mode/ss-mode.component.ts","../../lib/components/ui-menu/ss-mode/ss-mode.component.html","../../lib/components/ui-menu/performance-toggle/performance-toggle.component.ts","../../lib/components/ui-menu/performance-toggle/performance-toggle.component.html","../../lib/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.ts","../../lib/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.html","../../lib/components/ui-menu/share-link/share-link.component.ts","../../lib/components/ui-menu/share-link/share-link.component.html","../../lib/components/ui-menu/ui-menu.component.ts","../../lib/components/ui-menu/ui-menu.component.html","../../lib/components/loader/loader.component.ts","../../lib/components/loader/loader.component.html","../../lib/components/embed-menu/experiment-link/experiment-link.component.ts","../../lib/components/embed-menu/experiment-link/experiment-link.component.html","../../lib/components/embed-menu/embed-menu.component.ts","../../lib/components/embed-menu/embed-menu.component.html","../../lib/components/phoenix-ui.module.ts","../../lib/phoenix-ui-components.ts"],"sourcesContent":["import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-nav',\n templateUrl: './nav.component.html',\n styleUrls: ['./nav.component.scss'],\n})\nexport class NavComponent implements OnInit {\n constructor() {}\n\n ngOnInit() {}\n}\n","<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'app-config-slider',\n templateUrl: './config-slider.component.html',\n styleUrls: ['./config-slider.component.scss'],\n})\nexport class ConfigSliderComponent {\n @Input() value: number = 0;\n @Input() min: number = 0;\n @Input() max: number = 100;\n @Input() step: number = 1;\n @Input() allowCustomValue: boolean = false;\n @Output() onChange: EventEmitter<number> = new EventEmitter<number>();\n\n onValueChange(value: number) {\n if (value) {\n this.onChange.emit(value);\n }\n }\n}\n","<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { PhoenixMenuNode } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-phoenix-menu-item',\n templateUrl: './phoenix-menu-item.component.html',\n styleUrls: ['./phoenix-menu-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class PhoenixMenuItemComponent {\n @Input() currentNode: PhoenixMenuNode;\n @ViewChild('phoenixMenuItem') phoenixMenuItem: ElementRef<HTMLDivElement>;\n configTop: number;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n calculateConfigTop() {\n if (this.phoenixMenuItem) {\n this.configTop =\n this.phoenixMenuItem.nativeElement.getBoundingClientRect().top;\n this.cdr.detectChanges();\n }\n }\n}\n","<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of currentNode.configs\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n","import { Component, Input } from '@angular/core';\nimport type { PhoenixMenuNode } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-phoenix-menu',\n templateUrl: './phoenix-menu.component.html',\n styleUrls: ['./phoenix-menu.component.scss'],\n})\nexport class PhoenixMenuComponent {\n @Input() rootNode: PhoenixMenuNode;\n}\n","<div id=\"phoenixMenu\">\n <app-phoenix-menu-item [currentNode]=\"rootNode\"></app-phoenix-menu-item>\n</div>\n","import { Injectable } from '@angular/core';\nimport { EventDisplay } from 'phoenix-event-display';\n\n/**\n * Service for all event display related functions.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EventDisplayService extends EventDisplay {\n /**\n * Instantiate the event display by calling the parent constructor.\n */\n constructor() {\n super();\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-menu-toggle',\n templateUrl: './menu-toggle.component.html',\n styleUrls: ['./menu-toggle.component.scss'],\n})\nexport class MenuToggleComponent {\n @Input() icon: string;\n @Input() active: boolean;\n @Input() tooltip: string;\n @Input() disabled: boolean = false;\n}\n","<button\n class=\"menu-toggle\"\n [ngClass]=\"{ disabled: disabled }\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipTouchGestures=\"off\"\n>\n <svg class=\"menu-toggle-icon\" [ngClass]=\"{ 'active-icon': active }\">\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { AnimationPreset, SceneManager } from 'phoenix-event-display';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\nexport const defaultAnimationPresets: {\n [key: string]: AnimationPreset;\n} = {\n 'Preset 1': {\n positions: [\n {\n position: [11976, 7262, 11927],\n duration: 1000,\n },\n {\n position: [-1000, 0, 11927],\n duration: 2000,\n },\n {\n position: [2000, 500, 1000],\n duration: 3500,\n },\n {\n position: [5000, 2000, 1000],\n duration: 3000,\n },\n {\n position: [5000, 2000, 1000],\n duration: 2000,\n },\n {\n position: [11976, 7262, 11927],\n duration: 1000,\n },\n ],\n animateEventAfterInterval: 5000,\n collisionDuration: 6000,\n },\n};\n\n@Component({\n selector: 'app-animate-camera',\n templateUrl: './animate-camera.component.html',\n styleUrls: ['./animate-camera.component.scss'],\n})\nexport class AnimateCameraComponent {\n @Input() animationPresets = defaultAnimationPresets;\n animationPresetsKeys = Object.keys(this.animationPresets);\n isAnimating = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n animatePreset(preset: string) {\n this.setDetectorOpacity(0.2);\n this.eventDisplay.animatePreset(this.animationPresets[preset], () => {\n this.setDetectorOpacity(1);\n });\n }\n\n animateCamera() {\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.eventDisplay.animateThroughEvent([11976, 7262, 11927], 3000, () => {\n this.isAnimating = false;\n });\n }\n }\n\n private setDetectorOpacity(opacity: number) {\n this.eventDisplay\n .getThreeManager()\n .getSceneManager()\n .setGeometryOpacity(SceneManager.GEOMETRIES_ID, opacity);\n }\n}\n","<mat-menu #animationPresets>\n <button\n mat-menu-item\n *ngFor=\"let preset of animationPresetsKeys\"\n (click)=\"animatePreset(preset)\"\n >\n {{ preset }}\n </button>\n <button mat-menu-item (click)=\"animateCamera()\">Animate camera</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"animationPresets\"\n tooltip=\"Preset animations\"\n icon=\"animate-camera\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-animate-event',\n templateUrl: './animate-event.component.html',\n styleUrls: ['./animate-event.component.scss'],\n})\nexport class AnimateEventComponent {\n isAnimating: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n toggleAnimateEvent() {\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.eventDisplay.animateEventWithCollision(10000, () => {\n this.isAnimating = false;\n });\n }\n }\n}\n","<app-menu-toggle\n tooltip=\"Animate event\"\n icon=\"event-folder\"\n [active]=\"isAnimating\"\n (click)=\"toggleAnimateEvent()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-auto-rotate',\n templateUrl: './auto-rotate.component.html',\n styleUrls: ['./auto-rotate.component.scss'],\n})\nexport class AutoRotateComponent {\n autoRotate = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n toggleAutoRotate() {\n this.autoRotate = !this.autoRotate;\n this.eventDisplay.getUIManager().setAutoRotate(this.autoRotate);\n }\n}\n","<app-menu-toggle\n tooltip=\"Auto rotate\"\n icon=\"rotate\"\n [active]=\"autoRotate\"\n (click)=\"toggleAutoRotate()\"\n>\n</app-menu-toggle>\n","import {\n Component,\n Input,\n ViewChild,\n AfterViewInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { ElementRef } from '@angular/core';\nimport { ResizeSensor } from 'css-element-queries';\n\n/**\n * Component for overlay panel.\n */\n@Component({\n selector: 'app-overlay',\n templateUrl: './overlay.component.html',\n styleUrls: ['./overlay.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class OverlayComponent implements AfterViewInit {\n /** Title of the overlay. */\n @Input() overlayTitle: string;\n /** If the overlay is open or not. */\n @Input() active: boolean = false;\n /** Icon of the overlay header. */\n @Input() icon: string;\n /** If the overlay is resizable. */\n @Input() resizable: boolean = false;\n /** If the overlay body is transparent or not. */\n @Input() transparentBody: boolean = false;\n /** If the overlay body is visible or not. */\n showBody: boolean = true;\n\n // ********************************************************************************\n // * Below code is specific to the overlay resize feature. (LOOK INTO CSS RESIZE) *\n // ********************************************************************************\n\n /** Complete overlay card containing both header and body. */\n @ViewChild('overlayCard') overlayCard: ElementRef;\n /** Handle for resizing the overlay. */\n @ViewChild('resizeHandleCorner') resizeHandleCorner: ElementRef;\n /** Minimum resizable width. */\n private MIN_RES_WIDTH: number = 300;\n /** Minimum resizable height */\n private MIN_RES_HEIGHT: number = 100;\n\n /**\n * Move the resizable handle to the bottom right after the component is created.\n */\n ngAfterViewInit() {\n if (this.resizable) {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n resizeHandleElement.style.bottom = '0';\n resizeHandleElement.style.right = '0';\n\n new ResizeSensor(this.overlayCard.nativeElement, () => {\n this.resetHandlePosition();\n });\n\n window.addEventListener('resize', () => {\n this.resetHandlePosition();\n });\n }\n }\n\n /**\n * Resize the overlay card when the resize handle is dragged.\n */\n onResize() {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n const overlayCardElement = this.overlayCard.nativeElement;\n\n const dragRect = resizeHandleElement.getBoundingClientRect();\n const overlayRect = overlayCardElement.getBoundingClientRect();\n\n const width = dragRect.left - overlayRect.left + dragRect.width;\n const height = dragRect.top - overlayRect.top + dragRect.height;\n\n this.setHandleTransform(overlayRect, dragRect);\n\n if (width > this.MIN_RES_WIDTH && height > this.MIN_RES_HEIGHT) {\n overlayCardElement.style.width = width + 'px';\n overlayCardElement.style.height = height + 'px';\n }\n }\n\n /**\n * Reset resize handle position.\n */\n resetHandlePosition() {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n\n this.setHandleTransform(\n this.overlayCard.nativeElement.getBoundingClientRect(),\n resizeHandleElement.getBoundingClientRect()\n );\n\n resizeHandleElement.style.bottom = null;\n resizeHandleElement.style.right = null;\n }\n\n /**\n * Set the position of the resize handle using transform3d.\n * @param overlayRect Bounding client rectangle of the overlay card.\n * @param dragRect Bounding client rectangle of the resize handle.\n */\n private setHandleTransform(overlayRect: any, dragRect: any) {\n const translateX = overlayRect.width - dragRect.width;\n const translateY = overlayRect.height - dragRect.height;\n this.resizeHandleCorner.nativeElement.style.transform = `translate3d(${translateX}px, ${translateY}px, 0)`;\n }\n}\n","<div\n #overlayCard\n class=\"overlay-card card\"\n [hidden]=\"!active\"\n cdkDrag\n cdkDragBoundary=\"body\"\n>\n <div\n class=\"card-header d-flex justify-content-between\"\n [ngClass]=\"{ 'with-body': showBody }\"\n cdkDragHandle\n *ngIf=\"overlayTitle\"\n >\n <div class=\"align-self-center card-icon\" *ngIf=\"icon\">\n <svg>\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n </div>\n <h5 class=\"align-self-center m-0 px-2\">{{ overlayTitle }}</h5>\n <button\n class=\"align-self-center card-icon btn-blank expandCollapse\"\n matTooltip=\"Expand / Collapse\"\n matTooltipPosition=\"right\"\n [ngClass]=\"{ expand: showBody }\"\n (click)=\"showBody = !showBody\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n <div\n class=\"overlay-card-content\"\n *ngIf=\"showBody\"\n [ngClass]=\"{ 'transparent-bg': transparentBody }\"\n >\n <ng-content></ng-content>\n </div>\n <!-- Making the overlay resizable -->\n <span\n #resizeHandleCorner\n class=\"resize-handle corner\"\n *ngIf=\"resizable\"\n [hidden]=\"!showBody\"\n cdkDrag\n (cdkDragMoved)=\"onResize()\"\n ></span>\n</div>\n","import { Component, OnInit, Input, ElementRef } from '@angular/core';\nimport {\n PrettySymbols,\n ActiveVariable,\n SceneManager,\n} from 'phoenix-event-display';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-collections-info-overlay',\n templateUrl: './collections-info-overlay.component.html',\n styleUrls: ['./collections-info-overlay.component.scss'],\n})\nexport class CollectionsInfoOverlayComponent implements OnInit {\n @Input() showObjectsInfo: boolean;\n hideInvisible: boolean;\n collections: string[];\n selectedCollection: string;\n showingCollection: any;\n collectionColumns: string[];\n getPrettySymbol = PrettySymbols.getPrettySymbol;\n activeObject: ActiveVariable<string>;\n\n constructor(\n private elementRef: ElementRef,\n private eventDisplay: EventDisplayService\n ) {}\n\n ngOnInit() {\n this.eventDisplay.listenToDisplayedEventChange(\n (_event) => (this.collections = this.eventDisplay.getCollections())\n );\n this.activeObject = this.eventDisplay.getActiveObjectId();\n this.activeObject.onUpdate((value: string) => {\n if (document.getElementById(value)) {\n document.getElementById(value).scrollIntoView(false);\n }\n });\n }\n\n changeCollection(selectedCollection: string) {\n const eventDataGroup = this.getEventDataGroup();\n this.selectedCollection = selectedCollection;\n\n this.showingCollection = this.eventDisplay\n .getCollection(selectedCollection)\n .map((object: any) => ({\n ...object,\n isCut: !eventDataGroup.getObjectByProperty('uuid', object.uuid)\n ?.visible,\n }));\n\n this.collectionColumns = Object.keys(this.showingCollection[0]).filter(\n (column) => !['uuid', 'hits', 'isCut'].includes(column) // FIXME - this is an ugly hack. But currently hits from tracks make track collections unusable. Better to have exlusion list passed in.\n );\n }\n\n sort(column: string, order: string) {\n if (order === 'asc')\n this.showingCollection.sort((a, b) => (a[column] < b[column] ? -1 : 1));\n else\n this.showingCollection.sort((a, b) => (a[column] > b[column] ? -1 : 1));\n }\n\n lookAtObject(uuid: string) {\n if (uuid) {\n this.activeObject.update(uuid);\n this.eventDisplay.lookAtObject(uuid);\n }\n }\n\n highlightObject(uuid: string) {\n if (uuid) {\n this.activeObject.update(uuid);\n this.eventDisplay.highlightObject(uuid);\n }\n }\n\n toggleInvisible(checked: boolean) {\n this.hideInvisible = checked;\n }\n\n addLabel(index: number, uuid: string) {\n const labelValue = this.elementRef.nativeElement.querySelector(\n `#label${index}`\n ).value;\n if (this.selectedCollection) {\n // Empty labelValue will remove the label object\n this.eventDisplay.addLabelToObject(\n labelValue,\n this.selectedCollection,\n index,\n uuid\n );\n }\n }\n\n private getEventDataGroup() {\n return this.eventDisplay\n .getThreeManager()\n .getSceneManager()\n .getScene()\n .getObjectByName(SceneManager.EVENT_DATA_ID);\n }\n}\n","<!-- Show objects -->\n<app-overlay\n overlayTitle=\"Collections Info\"\n icon=\"info\"\n [resizable]=\"true\"\n [active]=\"showObjectsInfo\"\n>\n <!-- Using ngIf to remove it from DOM since this panel requires heavy computing -->\n <div *ngIf=\"showObjectsInfo\" class=\"collectionsInfo m-2\">\n <div\n class=\"collectionSelector mb-2 d-flex align-items-center\"\n *ngIf=\"collections != null\"\n >\n <div class=\"d-flex align-items-center\">\n <span>Choose a collection: </span>\n <div class=\"eventSelector\">\n <label for=\"event\">Event</label>\n <select\n id=\"collection\"\n name=\"collection\"\n (change)=\"changeCollection($event.target.value)\"\n >\n <option value=\"\" selected disabled hidden>Choose Collection</option>\n <option *ngFor=\"let collection of collections\" [value]=\"collection\">\n {{ collection }}\n </option>\n </select>\n </div>\n <mat-checkbox\n *ngIf=\"showingCollection\"\n (change)=\"toggleInvisible($event.checked)\"\n >\n Hide Invisible Objects\n </mat-checkbox>\n </div>\n </div>\n\n <div class=\"boxBody table-responsive\">\n <table\n id=\"collectionTable\"\n class=\"table table-borderless table-sm\"\n *ngIf=\"showingCollection\"\n >\n <thead>\n <tr>\n <th>No.</th>\n <th>Selection</th>\n <th>Label</th>\n <th *ngFor=\"let column of collectionColumns\">\n <div class=\"head-wrapper\">\n <div>\n {{ getPrettySymbol(column) }}\n </div>\n <div class=\"sort-options\">\n <button\n class=\"icon-wrapper icon-button btn-blank up\"\n (click)=\"sort(column, 'dec')\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n <button\n class=\"icon-wrapper icon-button btn-blank\"\n (click)=\"sort(column, 'asc')\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let object of showingCollection; index as i\"\n [attr.id]=\"object.uuid\"\n [ngClass]=\"{\n 'active-object':\n activeObject && activeObject.value === object.uuid,\n 'is-cut': object.isCut,\n 'd-none': object.isCut && hideInvisible\n }\"\n >\n <td>#{{ i }}</td>\n <td>\n <div\n *ngIf=\"object.uuid\"\n class=\"row justify-content-center icon-wrapper\"\n >\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Move camera to object\"\n (click)=\"lookAtObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/views.svg#views\"></use>\n </svg>\n </button>\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Highlight object\"\n (click)=\"highlightObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/cursor.svg#cursor\"></use>\n </svg>\n </button>\n </div>\n </td>\n <td>\n <div class=\"row m-0 add-label\">\n <div class=\"col-10 p-0\">\n <input\n class=\"form-control form-control-sm\"\n type=\"text\"\n [id]=\"'label' + i\"\n />\n </div>\n <div class=\"col-2 p-0 pl-2 text-center icon-wrapper\">\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Add, update or remove object label\"\n (click)=\"addLabel(i, object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/update.svg#update\"></use>\n </svg>\n </button>\n </div>\n </div>\n </td>\n <td *ngFor=\"let column of collectionColumns\">\n {{ object[column] }}\n </td>\n </tr>\n </tbody>\n </table>\n <p class=\"emptyBox\" *ngIf=\"!collections\">\n Load event data to be able to display information about the collections\n here.\n </p>\n </div>\n </div>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { CollectionsInfoOverlayComponent } from './collections-info-overlay/collections-info-overlay.component';\n\n@Component({\n selector: 'app-collections-info',\n templateUrl: './collections-info.component.html',\n styleUrls: ['./collections-info.component.scss'],\n})\nexport class CollectionsInfoComponent implements OnInit, OnDestroy {\n showObjectsInfo = false;\n overlayWindow: ComponentRef<CollectionsInfoOverlayComponent>;\n\n constructor(private overlay: Overlay) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(CollectionsInfoOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.showObjectsInfo = !this.showObjectsInfo;\n this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;\n }\n}\n","<app-menu-toggle\n tooltip=\"Event data collections info\"\n icon=\"info\"\n [active]=\"showObjectsInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, OnInit } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-dark-theme',\n templateUrl: './dark-theme.component.html',\n styleUrls: ['./dark-theme.component.scss'],\n})\nexport class DarkThemeComponent implements OnInit {\n darkTheme = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.darkTheme = this.eventDisplay.getUIManager().getDarkTheme();\n }\n\n setDarkTheme() {\n this.darkTheme = !this.darkTheme;\n this.eventDisplay.getUIManager().setDarkTheme(this.darkTheme);\n }\n}\n","<app-menu-toggle\n tooltip=\"Dark theme\"\n [active]=\"darkTheme\"\n icon=\"dark\"\n (click)=\"setDarkTheme()\"\n>\n</app-menu-toggle>\n","import { Component, OnInit } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-event-selector',\n templateUrl: './event-selector.component.html',\n styleUrls: ['./event-selector.component.scss'],\n})\nexport class EventSelectorComponent implements OnInit {\n // Array containing the keys of the multiple loaded events\n events: string[];\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit() {\n this.eventDisplay.listenToLoadedEventsChange(\n (events) => (this.events = events)\n );\n }\n\n changeEvent(selected: any) {\n const value = selected.target.value;\n this.eventDisplay.loadEvent(value);\n }\n}\n","<div\n class=\"eventSelector mx-2\"\n *ngIf=\"events != null\"\n matTooltip=\"Event selector\"\n matTooltipPosition=\"above\"\n>\n <select name=\"event\" (change)=\"changeEvent($event)\">\n <option *ngFor=\"let event of events\" [value]=\"event\">\n {{ event }}\n </option>\n </select>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-experiment-info',\n templateUrl: './experiment-info.component.html',\n styleUrls: ['./experiment-info.component.scss'],\n})\nexport class ExperimentInfoComponent implements OnInit {\n experimentInfo: any[];\n @Input() experiment: string;\n @Input() experimentTagline: string;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.eventDisplay.listenToDisplayedEventChange(() => {\n this.experimentInfo = this.eventDisplay.getEventMetadata();\n });\n }\n}\n","<div id=\"experimentInfo\" class=\"experimentInfo\" cdkDrag cdkDragBoundary=\"body\">\n <a\n class=\"experimentLogoWrapper\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n *ngIf=\"experiment\"\n href=\"https://home.cern/science/experiments/{{ experiment }}\"\n >\n <img\n class=\"experimentLogo\"\n src=\"assets/images/{{ experiment }}.svg\"\n alt=\"\"\n />\n </a>\n <div class=\"textInfo\">\n <p *ngIf=\"experimentTagline\">\n <b>{{ experimentTagline }}</b>\n </p>\n <p *ngFor=\"let infoField of experimentInfo\">\n <ng-container *ngIf=\"infoField.label\">\n <b>{{ infoField.label }}: </b>{{ infoField.value }}\n </ng-container>\n <ng-container *ngIf=\"!infoField.label\">\n {{ infoField }}\n </ng-container>\n </p>\n </div>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\nimport packageJson from 'phoenix-event-display/package.json';\n\n/**\n * Component for displaying information from the logger\n */\n@Component({\n selector: 'app-info-panel-overlay',\n templateUrl: './info-panel-overlay.component.html',\n styleUrls: ['./info-panel-overlay.component.scss'],\n})\nexport class InfoPanelOverlayComponent implements OnInit {\n /** @ignore */\n @Input() showInfoPanel: boolean;\n /** List of actions to be displayed in the info panel */\n actionsList = [];\n /** Get Phoenix Version */\n version = packageJson.version;\n\n /**\n * Create the information panel overlay\n * @param infoLogger Service containing operations related to info logs\n */\n constructor(private eventDisplay: EventDisplayService) {}\n\n /**\n * Get the list of logs from the info logger service\n */\n ngOnInit() {\n this.actionsList = this.eventDisplay.getInfoLogger().getInfoLoggerList();\n }\n}\n","<app-overlay\n overlayTitle=\"Info Panel\"\n icon=\"info-panel\"\n [resizable]=\"true\"\n [active]=\"showInfoPanel\"\n>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item\">\n <!-- Show Phoenix Current Version (ON by Default) -->\n Phoenix Version: {{ version }}\n </li>\n <li class=\"list-group-item\" *ngIf=\"actionsList.length === 0\">\n No actions.\n </li>\n <li class=\"list-group-item\" *ngFor=\"let action of actionsList\">\n {{ action }}\n </li>\n </ul>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { InfoPanelOverlayComponent } from './info-panel-overlay/info-panel-overlay.component';\n\n/**\n * Component for toggling info panel overlay\n */\n@Component({\n selector: 'app-info-panel',\n templateUrl: './info-panel.component.html',\n styleUrls: ['./info-panel.component.scss'],\n})\nexport class InfoPanelComponent implements OnInit, OnDestroy {\n /** @ignore */\n showInfoPanel = false;\n /** Information panel overlay window */\n overlayWindow: ComponentRef<InfoPanelOverlayComponent>;\n\n /**\n * Create the info panel toggle\n * @param overlay Info panel overlay containing logger data\n */\n constructor(private overlay: Overlay) {}\n\n /**\n * Create the info panel overlay\n */\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(InfoPanelOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;\n }\n\n /**\n * Destroy the info panel overlay\n */\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n /**\n * Toggle the info panel overlay\n */\n toggleOverlay() {\n this.showInfoPanel = !this.showInfoPanel;\n this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;\n }\n}\n","<app-menu-toggle\n tooltip=\"Info panel\"\n icon=\"info-panel\"\n [active]=\"showInfoPanel\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","export enum EventDataFormat {\n JSON = 'JSON',\n JIVEXML = 'JIVEXML',\n IG = 'IG',\n ZIP = 'ZIP',\n}\n\nexport type EventDataImportOption = EventDataFormat | ImportOption;\n\nexport class ImportOption {\n constructor(\n public format: string,\n public fileType: string,\n public handler: (files: FileList) => void,\n public accept?: string\n ) {}\n}\n","import { OnInit, Component, Input } from '@angular/core';\nimport { CMSLoader, JiveXMLLoader, ScriptLoader } from 'phoenix-event-display';\nimport JSZip from 'jszip';\nimport { EventDisplayService } from '../../../../services/event-display.service';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport {\n EventDataFormat,\n EventDataImportOption,\n ImportOption,\n} from '../../../../services/extras/event-data-import';\n\n@Component({\n selector: 'app-io-options-dialog',\n templateUrl: './io-options-dialog.component.html',\n styleUrls: ['./io-options-dialog.component.scss'],\n})\nexport class IOOptionsDialogComponent implements OnInit {\n @Input()\n eventDataImportOptions: EventDataImportOption[] = [EventDataFormat.JSON];\n\n eventDataOptionsWithHandler: ImportOption[];\n\n private supportedEventDataFormats = [\n new ImportOption(\n EventDataFormat.JSON,\n '.json',\n this.handleJSONEventDataInput.bind(this),\n 'application/json'\n ),\n new ImportOption(\n EventDataFormat.JIVEXML,\n '.xml',\n this.handleJiveXMLDataInput.bind(this),\n 'text/xml'\n ),\n new ImportOption(\n EventDataFormat.ZIP,\n '.zip',\n this.handleZipEventDataInput.bind(this),\n '.zip'\n ),\n new ImportOption(\n EventDataFormat.IG,\n '.ig',\n this.handleIgEventDataInput.bind(this),\n '.ig'\n ),\n ];\n\n constructor(\n private eventDisplay: EventDisplayService,\n public dialogRef: MatDialogRef<IOOptionsDialogComponent>\n ) {}\n\n ngOnInit() {\n this.eventDataOptionsWithHandler = this.supportedEventDataFormats.filter(\n (eventDataFormat) =>\n this.eventDataImportOptions.includes(\n eventDataFormat.format as EventDataFormat\n )\n );\n\n this.eventDataImportOptions.forEach((eventDataImportOption) => {\n if (eventDataImportOption instanceof ImportOption) {\n const importHandler = eventDataImportOption.handler.bind(this);\n eventDataImportOption.handler = (files: FileList) => {\n importHandler(files);\n this.onClose();\n };\n this.eventDataOptionsWithHandler.push(eventDataImportOption);\n }\n });\n }\n\n getSupportedEventDataFormats() {\n return this.eventDataImportOptions\n .map((format) => {\n if (format instanceof ImportOption) {\n return format.format;\n }\n\n return format;\n })\n .filter((format) => format !== 'ZIP')\n .join(', ');\n }\n\n onClose(): void {\n this.dialogRef.close();\n }\n\n handleJSONEventDataInput(files: FileList) {\n const callback = (content: any) => {\n const json = typeof content === 'string' ? JSON.parse(content) : content;\n this.eventDisplay.parsePhoenixEvents(json);\n };\n this.handleFileInput(files[0], 'json', callback);\n }\n\n handleJiveXMLDataInput(files: FileList) {\n const callback = (content: any) => {\n const jiveloader = new JiveXMLLoader();\n jiveloader.process(content);\n const eventData = jiveloader.getEventData();\n this.eventDisplay.buildEventDataFromJSON(eventData);\n };\n this.handleFileInput(files[0], 'xml', callback);\n }\n\n handleOBJInput(files: FileList) {\n const callback = (content: any, name: string) => {\n this.eventDisplay.parseOBJGeometry(content, name);\n };\n this.handleFileInput(files[0], 'obj', callback);\n }\n\n handleSceneInput(files: FileList) {\n const callback = (content: any) => {\n this.eventDisplay.parsePhoenixDisplay(content);\n };\n this.handleFileInput(files[0], 'phnx', callback);\n }\n\n handleGLTFInput(files: FileList) {\n const callback = (content: any, name: string) => {\n this.eventDisplay.parseGLTFGeometry(content, name);\n };\n this.handleFileInput(files[0], 'gltf', callback);\n }\n\n handlePhoenixInput(files: FileList) {\n const callback = (content: any) => {\n this.eventDisplay.parsePhoenixDisplay(content);\n };\n this.handleFileInput(files[0], 'phnx', callback);\n }\n\n handleROOTInput(files: FileList) {\n ScriptLoader.loadJSRootScripts().then((JSROOT: any) => {\n const objectName = prompt('Enter object name in ROOT file');\n JSROOT.openFile(files[0]).then((file: any) => {\n file.readObject(objectName).then((obj: any) => {\n this.eventDisplay.loadJSONGeometry(\n JSROOT.GEO.build(obj, { dflt_colors: true }).toJSON(),\n files[0].name.split('.')[0]\n );\n });\n });\n });\n this.onClose();\n }\n\n handleRootJSONInput(files: FileList) {\n ScriptLoader.loadJSRootScripts().then((JSROOT: any) => {\n const callback = (content: any, name: string) => {\n this.eventDisplay.loadJSONGeometry(\n JSROOT.GEO.build(JSROOT.parse(content), {\n dflt_colors: true,\n }).toJSON(),\n name\n );\n };\n this.handleFileInput(files[0], 'gz', callback);\n });\n }\n\n handleIgEventDataInput(files: FileList) {\n const cmsLoader = new CMSLoader();\n cmsLoader.readIgArchive(files[0], (allEvents: any[]) => {\n const allEventsData = cmsLoader.getAllEventsData(allEvents);\n this.eventDisplay.parsePhoenixEvents(allEventsData);\n this.onClose();\n });\n }\n\n handleZipEventDataInput(files: FileList) {\n if (this.isFileOfExtension(files[0], 'zip')) {\n this.handleZipInput(files[0], (allFilesWithData) => {\n const allEventsObject = {};\n\n // JSON event data\n Object.keys(allFilesWithData)\n .filter((fileName) => fileName.endsWith('.json'))\n .forEach((fileName) => {\n Object.assign(\n allEventsObject,\n JSON.parse(allFilesWithData[fileName])\n );\n });\n\n // JiveXML event data\n const jiveloader = new JiveXMLLoader();\n Object.keys(allFilesWithData)\n .filter((fileName) => fileName.endsWith('.xml'))\n .forEach((fileName) => {\n jiveloader.process(allFilesWithData[fileName]);\n const eventData = jiveloader.getEventData();\n Object.assign(allEventsObject, { [fileName]: eventData });\n });\n\n this.eventDisplay.parsePhoenixEvents(allEventsObject);\n\n this.onClose();\n });\n } else {\n console.error('Error: Invalid file format!');\n this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');\n }\n }\n\n async handleZipInput(\n file: File,\n callback: (allFilesWithData: { [key: string]: string }) => void\n ) {\n const allFilesWithData: { [key: string]: string } = {};\n // Using a try catch block to catch any errors in Promises\n try {\n const zipArchive = new JSZip();\n await zipArchive.loadAsync(file);\n const allFiles = Object.keys(zipArchive.files);\n for (const singleFile of allFiles) {\n const fileData = await zipArchive.file(singleFile).async('string');\n allFilesWithData[singleFile] = fileData;\n }\n callback(allFilesWithData);\n } catch (error) {\n console.error('Error while reading zip', error);\n this.eventDisplay.getInfoLogger().add('Could not read zip file', 'Error');\n }\n }\n\n handleFileInput(\n file: File,\n extension: string,\n callback: (result: string, fileName?: string) => void\n ) {\n const reader = new FileReader();\n if (this.isFileOfExtension(file, extension)) {\n reader.onload = () => {\n callback(reader.result.toString(), file.name.split('.')[0]);\n };\n reader.readAsText(file);\n } else {\n console.error('Error: Invalid file format!');\n this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');\n }\n this.onClose();\n }\n\n private isFileOfExtension(file: File, extension: string) {\n return file.name.split('.').pop() === extension;\n }\n\n saveScene() {\n this.eventDisplay.exportPhoenixDisplay();\n }\n\n exportOBJ() {\n this.eventDisplay.exportToOBJ();\n }\n}\n","<div class=\"dialog\">\n <h1 mat-dialog-title>Import and export options</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <div *ngIf=\"eventDataImportOptions.length > 0\">\n <h5>Import</h5>\n\n <h6 class=\"text-center\">Event data</h6>\n\n <div class=\"row centered\">\n <ng-container\n *ngFor=\"let eventDataImportOption of eventDataOptionsWithHandler\"\n >\n <input\n #eventDataFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n [accept]=\"eventDataImportOption.accept\"\n (change)=\"eventDataImportOption.handler($event.target.files)\"\n />\n <button\n class=\"file-input-button\"\n (click)=\"eventDataFileInput.click()\"\n >\n <img src=\"assets/icons/eventData.svg\" alt=\"Event data icon\" />\n Load {{ eventDataImportOption.fileType }}\n </button>\n </ng-container>\n </div>\n\n <p class=\"text-center\">\n Supported formats: {{ getSupportedEventDataFormats() }}\n </p>\n </div>\n\n <h6 class=\"text-center\">Geometries</h6>\n\n <div class=\"row centered\">\n <input\n #objFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".obj\"\n name=\"image\"\n (change)=\"handleOBJInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"objFileInput.click()\">\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Load .obj\n </button>\n\n <input\n #gltfFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".gltf\"\n name=\"image\"\n (change)=\"handleGLTFInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"gltfFileInput.click()\">\n <img src=\"assets/icons/gltf.svg\" alt=\"\" /> Load .gltf\n </button>\n\n <input\n #rootFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".root\"\n (change)=\"handleROOTInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .root\n </button>\n\n <input\n #rootJSONFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".json.gz\"\n (change)=\"handleRootJSONInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootJSONFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .json.gz\n </button>\n </div>\n\n <p class=\"text-center\">Supported formats: OBJ, GLTF, ROOT, ROOT JSON</p>\n\n <h5>Import / export scene</h5>\n\n <div class=\"row centered\">\n <button\n class=\"file-input-button load-export\"\n id=\"exportScene\"\n (click)=\"saveScene()\"\n >\n <img src=\"assets/icons/save.svg\" alt=\"\" /> Save scene\n </button>\n\n <input\n #loadSceneInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".phnx\"\n name=\"image\"\n (change)=\"handlePhoenixInput($event.target.files)\"\n />\n <button\n class=\"file-input-button load-export\"\n id=\"importScene\"\n (click)=\"loadSceneInput.click()\"\n >\n <img src=\"assets/icons/upload.svg\" alt=\"\" /> Load scene\n </button>\n\n <button\n class=\"file-input-button export-button\"\n id=\"exportOBJ\"\n (click)=\"exportOBJ()\"\n >\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Save OBJ\n </button>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport {\n EventDataFormat,\n EventDataImportOption,\n} from '../../../services/extras/event-data-import';\nimport { IOOptionsDialogComponent } from './io-options-dialog/io-options-dialog.component';\n\n@Component({\n selector: 'app-io-options',\n templateUrl: './io-options.component.html',\n styleUrls: ['./io-options.component.scss'],\n})\nexport class IoOptionsComponent {\n @Input()\n eventDataImportOptions: EventDataImportOption[] =\n Object.values(EventDataFormat);\n\n constructor(private dialog: MatDialog) {}\n\n openIODialog() {\n const dialogRef = this.dialog.open(IOOptionsDialogComponent, {\n panelClass: 'dialog',\n });\n dialogRef.componentInstance.eventDataImportOptions =\n this.eventDataImportOptions;\n }\n}\n","<app-menu-toggle\n tooltip=\"Import and export options\"\n icon=\"import\"\n [active]=\"false\"\n (click)=\"openIODialog()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-main-view-toggle',\n templateUrl: './main-view-toggle.component.html',\n styleUrls: ['./main-view-toggle.component.scss'],\n})\nexport class MainViewToggleComponent {\n orthographicView: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n switchMainView() {\n this.orthographicView = !this.orthographicView;\n this.eventDisplay\n .getUIManager()\n .toggleOrthographicView(this.orthographicView);\n }\n}\n","<app-menu-toggle\n [icon]=\"orthographicView ? 'perspective' : 'orthographic'\"\n [matTooltip]=\"\n 'Switch to ' + (orthographicView ? 'perspective' : 'orthographic') + ' view'\n \"\n (click)=\"switchMainView()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { MatSliderChange } from '@angular/material/slider';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-clipping',\n templateUrl: './object-clipping.component.html',\n styleUrls: ['./object-clipping.component.scss'],\n})\nexport class ObjectClippingComponent {\n clippingEnabled: boolean;\n clippingAngle: number;\n\n constructor(private eventDisplay: EventDisplayService) {\n const stateManager = this.eventDisplay.getStateManager();\n stateManager.clippingEnabled.onUpdate(\n (clippingValue) => (this.clippingEnabled = clippingValue)\n );\n stateManager.clippingAngle.onUpdate(\n (value) => (this.clippingAngle = value)\n );\n }\n\n changeClippingAngle(change: MatSliderChange) {\n const angle = change.value;\n this.eventDisplay.getUIManager().rotateClipping(angle);\n }\n\n toggleClipping(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setClipping(value);\n this.clippingEnabled = value;\n }\n}\n","<mat-menu class=\"mat-menu\" #menu>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n clippingCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #clippingCheckbox\n [checked]=\"clippingEnabled\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleClipping($event)\"\n >Clipping\n </mat-checkbox>\n </button>\n <button class=\"slider-btn\" mat-menu-item (focus)=\"clippingSlider.focus()\">\n <mat-slider\n #clippingSlider\n min=\"0\"\n max=\"180\"\n step=\"1\"\n thumbLabel\n [value]=\"clippingAngle\"\n (click)=\"$event.stopPropagation()\"\n (input)=\"changeClippingAngle($event)\"\n >\n </mat-slider>\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"menu\"\n tooltip=\"Geometry clipping\"\n icon=\"clipping\"\n [active]=\"clippingEnabled\"\n>\n</app-menu-toggle>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pipe for transforming selected object attributes to a better format.\n */\n@Pipe({\n name: 'attributePipe',\n})\nexport class AttributePipe implements PipeTransform {\n /**\n * Transform the attribute to a better presentable format.\n * @param value Value to be transformed.\n * @param args Additional arguments.\n * @returns The transformed value.\n */\n transform(value: any, args?: any): any {\n let transformedValue = '';\n if (Array.isArray(value)) {\n transformedValue += '\\n';\n value.forEach((v) => (transformedValue += v + '\\n'));\n } else {\n transformedValue = value.toString();\n }\n return transformedValue;\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-selection-overlay',\n templateUrl: './object-selection-overlay.component.html',\n styleUrls: ['./object-selection-overlay.component.scss'],\n})\nexport class ObjectSelectionOverlayComponent implements OnInit {\n // Attributes for displaying the information of selected objects\n @Input() hiddenSelectedInfo: boolean;\n selectedObject = { name: 'Object', attributes: [] };\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit() {\n this.eventDisplay.allowSelection(this.selectedObject);\n }\n}\n","<app-overlay\n icon=\"cursor\"\n [overlayTitle]=\"selectedObject.name\"\n [active]=\"!hiddenSelectedInfo\"\n>\n <div\n id=\"selectedObjectPanelBody\"\n class=\"m-1\"\n *ngIf=\"selectedObject.attributes.length > 0\"\n >\n <div\n *ngFor=\"let attribute of selectedObject.attributes\"\n class=\"attributeField\"\n >\n <strong>{{ attribute.attributeName }}</strong>\n : {{ attribute.attributeValue | attributePipe }}\n </div>\n </div>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ObjectSelectionOverlayComponent } from './object-selection-overlay/object-selection-overlay.component';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-selection',\n templateUrl: './object-selection.component.html',\n styleUrls: ['./object-selection.component.scss'],\n})\nexport class ObjectSelectionComponent implements OnInit, OnDestroy {\n // Attributes for displaying the information of selected objects\n hiddenSelectedInfo = true;\n overlayWindow: ComponentRef<ObjectSelectionOverlayComponent>;\n\n constructor(\n private overlay: Overlay,\n private eventDisplay: EventDisplayService\n ) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(ObjectSelectionOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.hiddenSelectedInfo = !this.hiddenSelectedInfo;\n this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;\n this.eventDisplay.enableSelecting(!this.hiddenSelectedInfo);\n }\n}\n","<app-menu-toggle\n tooltip=\"Object selection\"\n icon=\"cursor\"\n [active]=\"!hiddenSelectedInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, ViewChild, AfterViewInit, Input } from '@angular/core';\nimport type { ElementRef } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-overlay-view-window',\n templateUrl: './overlay-view-window.component.html',\n styleUrls: ['./overlay-view-window.component.scss'],\n})\nexport class OverlayViewWindowComponent implements AfterViewInit {\n @Input() showOverlay = true;\n transparentBody = false;\n orthographicView = false;\n overlayViewFixed = false;\n @ViewChild('overlayWindow') overlayWindow: ElementRef<HTMLCanvasElement>;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngAfterViewInit(): void {\n const canvas = this.initializeCanvas(this.overlayWindow.nativeElement);\n this.eventDisplay.setOverlayRenderer(canvas);\n }\n\n initializeCanvas(canvas: HTMLCanvasElement): HTMLCanvasElement {\n const width = window.innerWidth / 2.5;\n const height = window.innerHeight / 2.5;\n canvas.width = width;\n canvas.height = height;\n canvas.style.width = width.toString() + ' px';\n canvas.style.height = height.toString() + ' px';\n return canvas;\n }\n\n switchOverlayView() {\n this.orthographicView = !this.orthographicView;\n this.eventDisplay\n .getUIManager()\n .toggleOrthographicView(this.orthographicView);\n }\n\n fixOverlayView() {\n this.overlayViewFixed = !this.overlayViewFixed;\n this.eventDisplay.fixOverlayView(this.overlayViewFixed);\n }\n\n toggleBgTransparency() {\n this.transparentBody = !this.transparentBody;\n }\n}\n","<app-overlay\n overlayTitle=\"Overlay View\"\n icon=\"overlay\"\n [resizable]=\"true\"\n [transparentBody]=\"transparentBody\"\n [active]=\"showOverlay\"\n>\n <div class=\"overlay-view-wrapper\">\n <canvas #overlayWindow id=\"overlay-canvas\" [hidden]=\"!showOverlay\">\n </canvas>\n <div class=\"overlay-view-controls position-absolute d-flex flex-row\">\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"transparent\"\n matTooltip=\"Toggle background transparency\"\n (click)=\"toggleBgTransparency()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"move-lock\"\n [matTooltip]=\"(overlayViewFixed ? 'Restore' : 'Fix') + ' overlay view'\"\n [active]=\"overlayViewFixed\"\n (click)=\"fixOverlayView()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n [icon]=\"orthographicView ? 'orthographic' : 'perspective'\"\n [matTooltip]=\"\n 'Switch to ' +\n (orthographicView ? 'orthographic' : 'perspective') +\n ' view'\n \"\n (click)=\"switchOverlayView()\"\n >\n </app-menu-toggle>\n </div>\n </div>\n</app-overlay>\n","import { Component, ComponentRef, OnDestroy, OnInit } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { OverlayViewWindowComponent } from './overlay-view-window/overlay-view-window.component';\n\n@Component({\n selector: 'app-overlay-view',\n templateUrl: './overlay-view.component.html',\n styleUrls: ['./overlay-view.component.scss'],\n})\nexport class OverlayViewComponent implements OnInit, OnDestroy {\n overlayWindow: ComponentRef<OverlayViewWindowComponent>;\n showOverlay = false;\n\n constructor(private overlay: Overlay) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(OverlayViewWindowComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showOverlay = this.showOverlay;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.showOverlay = !this.showOverlay;\n this.overlayWindow.instance.showOverlay = this.showOverlay;\n }\n}\n","<app-menu-toggle\n tooltip=\"Overlay view\"\n icon=\"overlay\"\n [active]=\"showOverlay\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, Input, ViewChildren } from '@angular/core';\nimport type { QueryList } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-tree-menu-item',\n templateUrl: './tree-menu-item.component.html',\n styleUrls: ['./tree-menu-item.component.scss'],\n})\nexport class TreeMenuItemComponent {\n @ViewChildren(TreeMenuItemComponent)\n children!: QueryList<TreeMenuItemComponent>;\n @Input() node: { name: string; geometryId: string; children: [] };\n isExpanded = false;\n visible = true;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n public toggleVisibility(visible: boolean) {\n console.log(\"hi! it's \" + this.node.name);\n this.eventDisplay\n .getUIManager()\n .geometryVisibility(this.node.geometryId, visible);\n this.visible = visible;\n this.children.forEach((child) => child.toggleVisibility(visible));\n }\n}\n","<ng-container *ngIf=\"node\">\n <div class=\"header\" [ngClass]=\"{ visible: visible }\">\n <button\n *ngIf=\"node.children\"\n mat-icon-button\n matTreeNodeToggle\n (click)=\"isExpanded = !isExpanded\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ isExpanded ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <div (click)=\"toggleVisibility(!visible)\" class=\"node-name\">\n {{ node.name }}\n </div>\n </div>\n <ul [hidden]=\"!isExpanded\" hid>\n <div class=\"children\">\n <li *ngFor=\"let node of node.children\">\n <app-tree-menu-item [node]=\"node\"></app-tree-menu-item>\n </li>\n </div>\n </ul>\n</ng-container>\n","import { Component, OnInit } from '@angular/core';\nimport { TreeMenuItemComponent } from './tree-menu-item/tree-menu-item.component';\n\n@Component({\n selector: 'app-tree-menu',\n templateUrl: './tree-menu.component.html',\n styleUrls: ['./tree-menu.component.scss'],\n})\nexport class TreeMenuComponent implements OnInit {\n rootNode = {\n name: 'Atlas Detector',\n geometryId: 'AtlasDetector',\n children: [\n {\n name: 'Magnet systems',\n geometryId: 'MagnetSys',\n children: [\n {\n name: 'Toroids',\n geometryId: 'Toroids',\n },\n ],\n },\n {\n name: 'Calorimeters',\n geometryId: 'CaloSys',\n children: [\n {\n name: 'LAr Barrel',\n geometryId: 'LAr Barrel',\n },\n {\n name: 'LAr EC1',\n geometryId: 'LAr EC1',\n },\n {\n name: 'LAr EC2',\n geometryId: 'LAr EC2',\n },\n {\n name: 'Tile Cal',\n geometryId: 'Tile Cal',\n },\n ],\n },\n {\n name: 'Inner detector',\n geometryId: 'InDetSys',\n children: [\n {\n name: 'Pixel',\n geometryId: 'Pixel',\n },\n {\n name: 'SCT',\n geometryId: 'SCT',\n },\n {\n name: 'TRT',\n geometryId: 'TRT',\n },\n ],\n },\n ],\n };\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"tree-wrapper\">\n <div class=\"tree-menu\">\n <app-tree-menu-item [node]=\"rootNode\"></app-tree-menu-item>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { PresetView } from 'phoenix-event-display';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-view-options',\n templateUrl: './view-options.component.html',\n styleUrls: ['./view-options.component.scss'],\n})\nexport class ViewOptionsComponent implements OnInit {\n views: PresetView[];\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.views = this.eventDisplay.getUIManager().getPresetViews();\n }\n\n displayView($event: any, view: PresetView) {\n $event.stopPropagation();\n this.eventDisplay.getUIManager().displayView(view);\n }\n\n setAxis(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setShowAxis(value);\n }\n\n setGrid(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setShowGrid(value);\n }\n}\n","<mat-menu #viewOptions>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showGridCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showGridCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setGrid($event)\"\n >Show Grid\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showAxisCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showAxisCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setAxis($event)\"\n >Show Axis\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n *ngFor=\"let view of views\"\n (click)=\"displayView($event, view)\"\n >\n <svg class=\"view-icon\" *ngIf=\"view.icon\">\n <use attr.href=\"assets/icons/{{ view.icon }}.svg#{{ view.icon }}\"></use>\n </svg>\n {{ view.name }}\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"viewOptions\"\n tooltip=\"View options\"\n icon=\"views\"\n [active]=\"false\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\nimport { VRManager, XRSessionType } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-vr-toggle',\n templateUrl: './vr-toggle.component.html',\n styleUrls: ['./vr-toggle.component.scss'],\n})\nexport class VrToggleComponent {\n vrSupported: boolean = false;\n vrActive: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {\n // NOTE: WebXR needs secure HTTPS context\n // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query\n (navigator as any)?.xr\n ?.isSessionSupported?.(VRManager.SESSION_TYPE)\n .then((supported: boolean) => {\n if (supported) {\n this.vrSupported = true;\n }\n })\n .catch((err: any) => console.warn('Error in VR', err));\n }\n\n toggleVr() {\n // If toggling VR on\n if (!this.vrActive) {\n this.eventDisplay.initXR(XRSessionType.VR, () => {\n this.vrActive = false;\n // Disable renderer XR and remove animation loop\n this.eventDisplay.endXR(XRSessionType.VR);\n });\n this.vrActive = true;\n } else {\n this.eventDisplay.endXR(XRSessionType.VR);\n this.vrActive = false;\n }\n }\n}\n","<app-menu-toggle\n [disabled]=\"!vrSupported\"\n [active]=\"vrActive\"\n icon=\"vr\"\n (click)=\"vrSupported && toggleVr()\"\n [tooltip]=\"\n vrSupported ? (vrActive ? 'Exit VR' : 'Enter VR') : 'VR not supported'\n \"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\nimport { ARManager, XRSessionType } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-ar-toggle',\n templateUrl: './ar-toggle.component.html',\n styleUrls: ['./ar-toggle.component.scss'],\n})\nexport class ArToggleComponent {\n arSupported: boolean = false;\n arActive: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {\n // NOTE: WebXR needs secure HTTPS context\n // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query\n (navigator as any).xr\n ?.isSessionSupported?.(ARManager.SESSION_TYPE)\n .then((supported: boolean) => {\n if (supported) {\n this.arSupported = true;\n }\n })\n .catch((err: any) => console.warn('Error in AR', err));\n }\n\n toggleAr(enableDomOverlay: boolean = true) {\n ARManager.enableDomOverlay = enableDomOverlay;\n\n // If toggling AR on\n if (!this.arActive) {\n this.eventDisplay.initXR(XRSessionType.AR, () => {\n this.arActive = false;\n // Disable renderer XR and remove animation loop\n this.eventDisplay.endXR(XRSessionType.AR);\n });\n this.arActive = true;\n } else {\n this.eventDisplay.endXR(XRSessionType.AR);\n this.arActive = false;\n }\n }\n}\n","<mat-menu #arToggleOptions>\n <ng-container *ngIf=\"arSupported\">\n <button mat-menu-item (click)=\"toggleAr(true)\">AR with overlays</button>\n <button mat-menu-item (click)=\"toggleAr(false)\">AR without overlays</button>\n </ng-container>\n <button *ngIf=\"!arSupported\" mat-menu-item disabled>AR not supported</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"arToggleOptions\"\n (click)=\"arSupported && (arActive ? toggleAr() : null)\"\n [disabled]=\"!arSupported\"\n [active]=\"arActive\"\n icon=\"ar\"\n [tooltip]=\"\n arSupported ? (arActive ? 'Exit AR' : 'Enter AR') : 'AR not supported'\n \"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n/**\n * Component for adding zoom controls for the main and overlay cameras.\n */\n@Component({\n selector: 'app-zoom-controls',\n templateUrl: './zoom-controls.component.html',\n styleUrls: ['./zoom-controls.component.scss'],\n})\nexport class ZoomControlsComponent {\n /** All camera being used by the scene. */\n allCameras: any[];\n /** Factor to zoom by. */\n private zoomFactor: number = 1.1;\n /** Timeout for clearing mouse hold. */\n private zoomTimeout: any;\n /** The speed and time of zoom. */\n private zoomTime: number = 200;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n /**\n * Zoom all the cameras by a specific zoom factor.\n * The factor may either be greater (zoom in) or smaller (zoom out) than 1.\n * @param zoomFactor The factor to zoom by.\n */\n zoomTo(zoomFactor: number) {\n this.zoomTime =\n this.zoomTime > 30 ? Math.floor(this.zoomTime / 1.1) : this.zoomTime;\n\n this.eventDisplay.zoomTo(zoomFactor, this.zoomTime);\n\n this.zoomTimeout = setTimeout(() => {\n this.zoomTo(zoomFactor);\n }, this.zoomTime);\n }\n\n /**\n * Zoom the camera in.\n * @param leftClick Whether the mouse click is left or not.\n */\n zoomIn(leftClick: boolean) {\n if (leftClick) {\n this.zoomTo(1 / this.zoomFactor);\n }\n }\n\n /**\n * Zoom the camera out.\n * @param leftClick Whether the mouse click is left or not.s\n */\n zoomOut(leftClick: boolean) {\n if (leftClick) {\n this.zoomTo(this.zoomFactor);\n }\n }\n\n /**\n * Reset the zoom time which decreases upon hold and clear the zoom timeout.\n */\n clearZoom() {\n this.zoomTime = 200;\n clearTimeout(this.zoomTimeout);\n }\n}\n","<div class=\"d-flex\">\n <app-menu-toggle\n tooltip=\"Zoom out (hold)\"\n icon=\"zoom-out\"\n [active]=\"false\"\n (click)=\"zoomOut(true); clearZoom()\"\n (touchstart)=\"zoomOut(true)\"\n (mousedown)=\"zoomOut($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n tooltip=\"Zoom in (hold)\"\n icon=\"zoom-in\"\n [active]=\"false\"\n (click)=\"zoomIn(true); clearZoom()\"\n (touchstart)=\"zoomIn(true)\"\n (mousedown)=\"zoomIn($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n</div>\n","import { OnInit } from '@angular/core';\nimport { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'app-ss-mode',\n templateUrl: './ss-mode.component.html',\n styleUrls: ['./ss-mode.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class SSModeComponent implements OnInit {\n ssMode: boolean = false;\n\n ngOnInit() {\n document.onfullscreenchange = () => {\n if (!document.fullscreenElement) {\n this.toggleSSMode();\n }\n };\n }\n\n toggleSSMode() {\n this.ssMode = !this.ssMode;\n document.body.classList.toggle('ss-mode');\n if (this.ssMode) {\n // WORKAROUND - Adding the event listener directly somehow calls it on the first click\n setTimeout(() => {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('touchstart', this.onDocumentClick);\n }, 1);\n document.documentElement.requestFullscreen?.();\n } else {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('touchstart', this.onDocumentClick);\n }\n }\n\n private onDocumentClick = () => {\n document.exitFullscreen?.();\n };\n}\n","<app-menu-toggle\n tooltip=\"Screenshot mode\"\n [active]=\"ssMode\"\n icon=\"ss-mode\"\n (click)=\"toggleSSMode()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-performance-toggle',\n templateUrl: './performance-toggle.component.html',\n styleUrls: ['./performance-toggle.component.scss'],\n})\nexport class PerformanceToggleComponent {\n performanceMode: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n togglePerformance() {\n this.performanceMode = !this.performanceMode;\n this.eventDisplay.getThreeManager().setAntialiasing(!this.performanceMode);\n }\n}\n","<app-menu-toggle\n tooltip=\"Performance mode\"\n [active]=\"performanceMode\"\n icon=\"performance\"\n (click)=\"togglePerformance()\"\n>\n</app-menu-toggle>\n","import { AfterViewInit, Component, ElementRef, ViewChild } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { ActiveVariable, phoenixURLOptions } from 'phoenix-event-display';\nimport QRCode from 'qrcode';\n\n@Component({\n selector: 'app-share-link-dialog',\n templateUrl: './share-link-dialog.component.html',\n styleUrls: ['./share-link-dialog.component.scss'],\n})\nexport class ShareLinkDialogComponent implements AfterViewInit {\n baseLink: string;\n shareLink: ActiveVariable<string>;\n embedLink: string;\n urlOptions = Object.assign({}, phoenixURLOptions);\n @ViewChild('qrcodeCanvas') qrcodeCanvas: ElementRef<HTMLCanvasElement>;\n\n constructor(private dialogRef: MatDialogRef<ShareLinkDialogComponent>) {\n const locationHref = window.location.href;\n const lastIndex =\n locationHref.lastIndexOf('?') === -1\n ? locationHref.length\n : locationHref.lastIndexOf('?');\n\n this.baseLink = locationHref.slice(0, lastIndex);\n this.shareLink = new ActiveVariable(this.baseLink);\n this.embedLink = this.getEmbedLink();\n }\n\n ngAfterViewInit() {\n this.updateQRCode(this.shareLink.value);\n this.shareLink.onUpdate(this.updateQRCode.bind(this));\n }\n\n onClose() {\n this.dialogRef.close();\n }\n\n getEmbedLink(urlParametersString: string = '') {\n return `<iframe src=\"${this.baseLink}?embed=true${\n urlParametersString ? '&' : ''\n }${urlParametersString}\"></iframe>`;\n }\n\n setOptionValue(option: string, value: string) {\n this.urlOptions[option] = value;\n this.onOptionsChange();\n }\n\n onOptionsChange() {\n const urlParametersString = Object.getOwnPropertyNames(this.urlOptions)\n .reduce((filteredOptions: string[], option: string) => {\n if (this.urlOptions[option]) {\n filteredOptions.push(\n `${option}=${encodeURI(this.urlOptions[option])}`\n );\n }\n return filteredOptions;\n }, [])\n .join('&');\n\n this.shareLink.update(\n this.baseLink + (urlParametersString ? '?' : '') + urlParametersString\n );\n this.embedLink = this.getEmbedLink(urlParametersString);\n }\n\n copyText(text: string, element: HTMLElement) {\n const inputElement = document.createElement('input');\n document.body.appendChild(inputElement);\n inputElement.value = text;\n inputElement.select();\n document.execCommand('copy');\n document.body.removeChild(inputElement);\n element.focus();\n\n // Set text on copying\n element.innerText = 'COPIED';\n setTimeout(() => {\n element.innerText = 'COPY';\n }, 2000);\n }\n\n updateQRCode(link: string) {\n QRCode.toCanvas(this.qrcodeCanvas.nativeElement, link);\n }\n}\n","<div class=\"dialog\">\n <h1 mat-dialog-title>Create shareable link</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <h5>URL options</h5>\n <div class=\"form-group mt-2\">\n <label for=\"eventDataFile\">Event data file (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"eventDataFile\"\n placeholder=\"assets/files/event_data/atlaseventdump2.json\"\n [value]=\"urlOptions.file\"\n (input)=\"setOptionValue('file', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <label for=\"eventDataType\">Event data type</label>\n <select\n class=\"form-control\"\n id=\"eventDataType\"\n (input)=\"setOptionValue('type', $event.target.value)\"\n >\n <option selected value=\"\">Select</option>\n <option value=\"jivexml\">JiveXML</option>\n <option value=\"json\">JSON</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"configuration\">Configuration (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"configuration\"\n placeholder=\"assets/files/config/phoenix-config.json\"\n [value]=\"urlOptions.config\"\n (input)=\"setOptionValue('config', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <mat-checkbox\n [checked]=\"urlOptions.hideWidgets\"\n (change)=\"setOptionValue('hideWidgets', $event.checked)\"\n >\n Hide all widgets\n </mat-checkbox>\n </div>\n\n <h5>Share</h5>\n <div class=\"share-box my-2\">\n <span>{{ shareLink.value }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(shareLink.value, $event.target)\"\n >\n COPY\n </button>\n </div>\n <h5>Embed</h5>\n <div class=\"share-box my-2\">\n <span>{{ embedLink }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(embedLink, $event.target)\"\n >\n COPY\n </button>\n </div>\n <h5>QR Code</h5>\n <div class=\"qrcode d-flex justify-content-center\">\n <canvas #qrcodeCanvas></canvas>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ShareLinkDialogComponent } from './share-link-dialog/share-link-dialog.component';\n\n@Component({\n selector: 'app-share-link',\n templateUrl: './share-link.component.html',\n styleUrls: ['./share-link.component.scss'],\n})\nexport class ShareLinkComponent {\n constructor(private dialog: MatDialog) {}\n\n openShareLinkDialog() {\n this.dialog.open(ShareLinkDialogComponent);\n }\n}\n","<app-menu-toggle\n tooltip=\"Create shareable link\"\n icon=\"share\"\n [active]=\"false\"\n (click)=\"openShareLinkDialog()\"\n>\n</app-menu-toggle>\n","import { Component, Input } from '@angular/core';\nimport {\n EventDataFormat,\n EventDataImportOption,\n} from '../../services/extras/event-data-import';\nimport { defaultAnimationPresets } from './animate-camera/animate-camera.component';\n\n@Component({\n selector: 'app-ui-menu',\n templateUrl: './ui-menu.component.html',\n styleUrls: ['./ui-menu.component.scss'],\n})\nexport class UiMenuComponent {\n @Input()\n eventDataImportOptions: EventDataImportOption[] =\n Object.values(EventDataFormat);\n @Input()\n animationPresets = defaultAnimationPresets;\n\n hideUIMenu: boolean = false;\n}\n","<div id=\"uiMenu\">\n <button\n id=\"hide-ui-menu\"\n [matTooltip]=\"hideUIMenu ? 'Show toolbar' : 'Hide toolbar'\"\n matTooltipPosition=\"above\"\n (click)=\"hideUIMenu = !hideUIMenu\"\n [ngClass]=\"{ 'ui-menu-hidden': hideUIMenu }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n <div id=\"optionsPanel\" [hidden]=\"hideUIMenu\">\n <!-- Event selector -->\n <app-event-selector></app-event-selector>\n\n <!-- Zoom in and zoom out controls -->\n <app-zoom-controls></app-zoom-controls>\n\n <app-view-options></app-view-options>\n\n <app-auto-rotate></app-auto-rotate>\n\n <!-- Dark theme toggle -->\n <app-dark-theme></app-dark-theme>\n\n <!-- Toggle for clipping geometries -->\n <app-object-clipping></app-object-clipping>\n\n <!-- Main view toggle -->\n <app-main-view-toggle></app-main-view-toggle>\n\n <!-- Toggle for overlay panel -->\n <app-overlay-view></app-overlay-view>\n\n <!-- Toggle for selected object panel -->\n <app-object-selection></app-object-selection>\n\n <!-- Info panel -->\n <app-info-panel></app-info-panel>\n\n <!-- Toggle for animating the event data -->\n <app-animate-event></app-animate-event>\n\n <!-- Toggle for animating camera through event -->\n <app-animate-camera\n [animationPresets]=\"animationPresets\"\n ></app-animate-camera>\n\n <!-- Toggle for collections info -->\n <app-collections-info></app-collections-info>\n\n <!-- Toggle for performance -->\n <app-performance-toggle></app-performance-toggle>\n\n <!-- Toggle for VR -->\n <app-vr-toggle></app-vr-toggle>\n\n <!-- Toggle for AR -->\n <app-ar-toggle></app-ar-toggle>\n\n <!-- Toggle for screenshot mode -->\n <app-ss-mode></app-ss-mode>\n\n <!-- Toggle for loading geometries modal-->\n <app-io-options\n [eventDataImportOptions]=\"eventDataImportOptions\"\n ></app-io-options>\n\n <!-- Toggle for shareable link constructor modal-->\n <app-share-link></app-share-link>\n\n <!-- Extra options -->\n <ng-content></ng-content>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './loader.component.html',\n styleUrls: ['./loader.component.scss'],\n})\nexport class LoaderComponent {\n @Input() loaded = false;\n @Input() progress: number;\n}\n","<div\n class=\"loader-wrapper d-flex position-absolute flex-column justify-content-center align-items-center w-100 h-100 text-center\"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-experiment-link',\n templateUrl: './experiment-link.component.html',\n styleUrls: ['./experiment-link.component.scss'],\n})\nexport class ExperimentLinkComponent implements OnInit {\n private experimentLink: string;\n\n ngOnInit() {\n this.experimentLink = window.location.href.split('?')[0];\n }\n\n goToExperiment() {\n window.open(this.experimentLink, '_blank');\n }\n}\n","<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-embed-menu',\n templateUrl: './embed-menu.component.html',\n styleUrls: ['./embed-menu.component.scss'],\n})\nexport class EmbedMenuComponent {}\n","<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n","import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { NgxSliderModule } from '@angular-slider/ngx-slider';\nimport { NavComponent } from './nav/nav.component';\nimport {\n PhoenixMenuComponent,\n PhoenixMenuItemComponent,\n ConfigSliderComponent,\n} from './phoenix-menu';\nimport {\n UiMenuComponent,\n CollectionsInfoComponent,\n MenuToggleComponent,\n CollectionsInfoOverlayComponent,\n IoOptionsComponent,\n IOOptionsDialogComponent,\n OverlayViewComponent,\n ObjectSelectionComponent,\n ObjectSelectionOverlayComponent,\n EventSelectorComponent,\n ObjectClippingComponent,\n DarkThemeComponent,\n AutoRotateComponent,\n ViewOptionsComponent,\n OverlayViewWindowComponent,\n OverlayComponent,\n ExperimentInfoComponent,\n InfoPanelComponent,\n InfoPanelOverlayComponent,\n MainViewToggleComponent,\n ZoomControlsComponent,\n TreeMenuComponent,\n TreeMenuItemComponent,\n AnimateCameraComponent,\n AnimateEventComponent,\n VrToggleComponent,\n ArToggleComponent,\n SSModeComponent,\n PerformanceToggleComponent,\n ShareLinkComponent,\n ShareLinkDialogComponent,\n} from './ui-menu';\nimport { AttributePipe } from '../services/extras/attribute.pipe';\nimport { LoaderComponent } from './loader/loader.component';\nimport { EmbedMenuComponent } from './embed-menu/embed-menu.component';\nimport { ExperimentLinkComponent } from './embed-menu/experiment-link/experiment-link.component';\n\nconst PHOENIX_COMPONENTS: Type<any>[] = [\n NavComponent,\n UiMenuComponent,\n CollectionsInfoComponent,\n MenuToggleComponent,\n CollectionsInfoOverlayComponent,\n IoOptionsComponent,\n IOOptionsDialogComponent,\n OverlayViewComponent,\n AttributePipe,\n ObjectSelectionComponent,\n ObjectSelectionOverlayComponent,\n EventSelectorComponent,\n ObjectClippingComponent,\n DarkThemeComponent,\n AutoRotateComponent,\n ViewOptionsComponent,\n OverlayViewWindowComponent,\n OverlayComponent,\n ExperimentInfoComponent,\n InfoPanelComponent,\n InfoPanelOverlayComponent,\n MainViewToggleComponent,\n ZoomControlsComponent,\n TreeMenuComponent,\n TreeMenuItemComponent,\n PhoenixMenuComponent,\n PhoenixMenuItemComponent,\n ConfigSliderComponent,\n AnimateCameraComponent,\n AnimateEventComponent,\n VrToggleComponent,\n ArToggleComponent,\n SSModeComponent,\n PerformanceToggleComponent,\n LoaderComponent,\n ShareLinkComponent,\n ShareLinkDialogComponent,\n EmbedMenuComponent,\n ExperimentLinkComponent,\n];\n\n@NgModule({\n declarations: [...PHOENIX_COMPONENTS],\n imports: [\n CommonModule,\n RouterModule,\n DragDropModule,\n MatDialogModule,\n MatButtonModule,\n MatTooltipModule,\n OverlayModule,\n MatMenuModule,\n MatSliderModule,\n MatSlideToggleModule,\n MatCheckboxModule,\n MatIconModule,\n NgxSliderModule,\n ],\n entryComponents: [\n OverlayComponent,\n OverlayViewWindowComponent,\n IOOptionsDialogComponent,\n CollectionsInfoOverlayComponent,\n ObjectSelectionOverlayComponent,\n InfoPanelOverlayComponent,\n ],\n exports: [PHOENIX_COMPONENTS],\n})\nexport class PhoenixUIModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"phoenix-ui-components.mjs","sources":["../../lib/components/nav/nav.component.ts","../../lib/components/nav/nav.component.html","../../lib/components/phoenix-menu/config/config-slider/config-slider.component.ts","../../lib/components/phoenix-menu/config/config-slider/config-slider.component.html","../../lib/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.ts","../../lib/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.html","../../lib/components/phoenix-menu/phoenix-menu.component.ts","../../lib/components/phoenix-menu/phoenix-menu.component.html","../../lib/services/event-display.service.ts","../../lib/components/ui-menu/menu-toggle/menu-toggle.component.ts","../../lib/components/ui-menu/menu-toggle/menu-toggle.component.html","../../lib/components/ui-menu/animate-camera/animate-camera.component.ts","../../lib/components/ui-menu/animate-camera/animate-camera.component.html","../../lib/components/ui-menu/animate-event/animate-event.component.ts","../../lib/components/ui-menu/animate-event/animate-event.component.html","../../lib/components/ui-menu/auto-rotate/auto-rotate.component.ts","../../lib/components/ui-menu/auto-rotate/auto-rotate.component.html","../../lib/components/ui-menu/overlay/overlay.component.ts","../../lib/components/ui-menu/overlay/overlay.component.html","../../lib/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.ts","../../lib/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.html","../../lib/components/ui-menu/collections-info/collections-info.component.ts","../../lib/components/ui-menu/collections-info/collections-info.component.html","../../lib/components/ui-menu/dark-theme/dark-theme.component.ts","../../lib/components/ui-menu/dark-theme/dark-theme.component.html","../../lib/components/ui-menu/event-selector/event-selector.component.ts","../../lib/components/ui-menu/event-selector/event-selector.component.html","../../lib/components/ui-menu/experiment-info/experiment-info.component.ts","../../lib/components/ui-menu/experiment-info/experiment-info.component.html","../../lib/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.ts","../../lib/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.html","../../lib/components/ui-menu/info-panel/info-panel.component.ts","../../lib/components/ui-menu/info-panel/info-panel.component.html","../../lib/services/extras/event-data-import.ts","../../lib/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.ts","../../lib/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.html","../../lib/components/ui-menu/io-options/io-options.component.ts","../../lib/components/ui-menu/io-options/io-options.component.html","../../lib/components/ui-menu/main-view-toggle/main-view-toggle.component.ts","../../lib/components/ui-menu/main-view-toggle/main-view-toggle.component.html","../../lib/components/ui-menu/object-clipping/object-clipping.component.ts","../../lib/components/ui-menu/object-clipping/object-clipping.component.html","../../lib/services/extras/attribute.pipe.ts","../../lib/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.ts","../../lib/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.html","../../lib/components/ui-menu/object-selection/object-selection.component.ts","../../lib/components/ui-menu/object-selection/object-selection.component.html","../../lib/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.ts","../../lib/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.html","../../lib/components/ui-menu/overlay-view/overlay-view.component.ts","../../lib/components/ui-menu/overlay-view/overlay-view.component.html","../../lib/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.ts","../../lib/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.html","../../lib/components/ui-menu/tree-menu/tree-menu.component.ts","../../lib/components/ui-menu/tree-menu/tree-menu.component.html","../../lib/components/ui-menu/view-options/view-options.component.ts","../../lib/components/ui-menu/view-options/view-options.component.html","../../lib/components/ui-menu/vr-toggle/vr-toggle.component.ts","../../lib/components/ui-menu/vr-toggle/vr-toggle.component.html","../../lib/components/ui-menu/ar-toggle/ar-toggle.component.ts","../../lib/components/ui-menu/ar-toggle/ar-toggle.component.html","../../lib/components/ui-menu/zoom-controls/zoom-controls.component.ts","../../lib/components/ui-menu/zoom-controls/zoom-controls.component.html","../../lib/components/ui-menu/ss-mode/ss-mode.component.ts","../../lib/components/ui-menu/ss-mode/ss-mode.component.html","../../lib/components/ui-menu/performance-toggle/performance-toggle.component.ts","../../lib/components/ui-menu/performance-toggle/performance-toggle.component.html","../../lib/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.ts","../../lib/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.html","../../lib/components/ui-menu/share-link/share-link.component.ts","../../lib/components/ui-menu/share-link/share-link.component.html","../../lib/components/ui-menu/ui-menu.component.ts","../../lib/components/ui-menu/ui-menu.component.html","../../lib/components/file-explorer/file-explorer.component.ts","../../lib/components/file-explorer/file-explorer.component.html","../../lib/components/ring-loader/ring-loader.component.ts","../../lib/components/ring-loader/ring-loader.component.html","../../lib/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.ts","../../lib/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.html","../../lib/components/ui-menu/event-data-explorer/event-data-explorer.component.ts","../../lib/components/ui-menu/event-data-explorer/event-data-explorer.component.html","../../lib/components/loader/loader.component.ts","../../lib/components/loader/loader.component.html","../../lib/components/embed-menu/experiment-link/experiment-link.component.ts","../../lib/components/embed-menu/experiment-link/experiment-link.component.html","../../lib/components/embed-menu/embed-menu.component.ts","../../lib/components/embed-menu/embed-menu.component.html","../../lib/components/phoenix-ui.module.ts","../../lib/phoenix-ui-components.ts"],"sourcesContent":["import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-nav',\n templateUrl: './nav.component.html',\n styleUrls: ['./nav.component.scss'],\n})\nexport class NavComponent implements OnInit {\n constructor() {}\n\n ngOnInit() {}\n}\n","<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'app-config-slider',\n templateUrl: './config-slider.component.html',\n styleUrls: ['./config-slider.component.scss'],\n})\nexport class ConfigSliderComponent {\n @Input() value: number = 0;\n @Input() min: number = 0;\n @Input() max: number = 100;\n @Input() step: number = 1;\n @Input() allowCustomValue: boolean = false;\n @Output() onChange: EventEmitter<number> = new EventEmitter<number>();\n\n onValueChange(value: number) {\n if (value) {\n this.onChange.emit(value);\n }\n }\n}\n","<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { PhoenixMenuNode } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-phoenix-menu-item',\n templateUrl: './phoenix-menu-item.component.html',\n styleUrls: ['./phoenix-menu-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class PhoenixMenuItemComponent {\n @Input() currentNode: PhoenixMenuNode;\n @ViewChild('phoenixMenuItem') phoenixMenuItem: ElementRef<HTMLDivElement>;\n configTop: number;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n calculateConfigTop() {\n if (this.phoenixMenuItem) {\n this.configTop =\n this.phoenixMenuItem.nativeElement.getBoundingClientRect().top;\n this.cdr.detectChanges();\n }\n }\n\n // Casting to `any` as a workaround to bypass strict template checks.\n castConfigsToAny(configs: PhoenixMenuNode['configs']) {\n return configs as any[];\n }\n}\n","<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of castConfigsToAny(currentNode.configs)\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n","import { Component, Input } from '@angular/core';\nimport type { PhoenixMenuNode } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-phoenix-menu',\n templateUrl: './phoenix-menu.component.html',\n styleUrls: ['./phoenix-menu.component.scss'],\n})\nexport class PhoenixMenuComponent {\n @Input() rootNode: PhoenixMenuNode;\n}\n","<div id=\"phoenixMenu\">\n <app-phoenix-menu-item [currentNode]=\"rootNode\"></app-phoenix-menu-item>\n</div>\n","import { Injectable } from '@angular/core';\nimport { EventDisplay } from 'phoenix-event-display';\n\n/**\n * Service for all event display related functions.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EventDisplayService extends EventDisplay {\n /**\n * Instantiate the event display by calling the parent constructor.\n */\n constructor() {\n super();\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-menu-toggle',\n templateUrl: './menu-toggle.component.html',\n styleUrls: ['./menu-toggle.component.scss'],\n})\nexport class MenuToggleComponent {\n @Input() icon: string;\n @Input() active: boolean;\n @Input() tooltip: string;\n @Input() disabled: boolean = false;\n}\n","<button\n class=\"menu-toggle\"\n [ngClass]=\"{ disabled: disabled }\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipTouchGestures=\"off\"\n>\n <svg class=\"menu-toggle-icon\" [ngClass]=\"{ 'active-icon': active }\">\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { AnimationPreset, SceneManager } from 'phoenix-event-display';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\nexport const defaultAnimationPresets: {\n [key: string]: AnimationPreset;\n} = {\n 'Preset 1': {\n positions: [\n {\n position: [11976, 7262, 11927],\n duration: 1000,\n },\n {\n position: [-1000, 0, 11927],\n duration: 2000,\n },\n {\n position: [2000, 500, 1000],\n duration: 3500,\n },\n {\n position: [5000, 2000, 1000],\n duration: 3000,\n },\n {\n position: [5000, 2000, 1000],\n duration: 2000,\n },\n {\n position: [11976, 7262, 11927],\n duration: 1000,\n },\n ],\n animateEventAfterInterval: 5000,\n collisionDuration: 6000,\n },\n};\n\n@Component({\n selector: 'app-animate-camera',\n templateUrl: './animate-camera.component.html',\n styleUrls: ['./animate-camera.component.scss'],\n})\nexport class AnimateCameraComponent {\n @Input() animationPresets = defaultAnimationPresets;\n animationPresetsKeys = Object.keys(this.animationPresets);\n isAnimating = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n animatePreset(preset: string) {\n this.setDetectorOpacity(0.2);\n this.eventDisplay.animatePreset(this.animationPresets[preset], () => {\n this.setDetectorOpacity(1);\n });\n }\n\n animateCamera() {\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.eventDisplay.animateThroughEvent([11976, 7262, 11927], 3000, () => {\n this.isAnimating = false;\n });\n }\n }\n\n private setDetectorOpacity(opacity: number) {\n this.eventDisplay\n .getThreeManager()\n .getSceneManager()\n .setGeometryOpacity(SceneManager.GEOMETRIES_ID, opacity);\n }\n}\n","<mat-menu #animationPresets>\n <button\n mat-menu-item\n *ngFor=\"let preset of animationPresetsKeys\"\n (click)=\"animatePreset(preset)\"\n >\n {{ preset }}\n </button>\n <button mat-menu-item (click)=\"animateCamera()\">Animate camera</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"animationPresets\"\n tooltip=\"Preset animations\"\n icon=\"animate-camera\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-animate-event',\n templateUrl: './animate-event.component.html',\n styleUrls: ['./animate-event.component.scss'],\n})\nexport class AnimateEventComponent {\n isAnimating: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n toggleAnimateEvent() {\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.eventDisplay.animateEventWithCollision(10000, () => {\n this.isAnimating = false;\n });\n }\n }\n}\n","<app-menu-toggle\n tooltip=\"Animate event\"\n icon=\"event-folder\"\n [active]=\"isAnimating\"\n (click)=\"toggleAnimateEvent()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-auto-rotate',\n templateUrl: './auto-rotate.component.html',\n styleUrls: ['./auto-rotate.component.scss'],\n})\nexport class AutoRotateComponent {\n autoRotate = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n toggleAutoRotate() {\n this.autoRotate = !this.autoRotate;\n this.eventDisplay.getUIManager().setAutoRotate(this.autoRotate);\n }\n}\n","<app-menu-toggle\n tooltip=\"Auto rotate\"\n icon=\"rotate\"\n [active]=\"autoRotate\"\n (click)=\"toggleAutoRotate()\"\n>\n</app-menu-toggle>\n","import {\n Component,\n Input,\n ViewChild,\n AfterViewInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { ElementRef } from '@angular/core';\nimport { ResizeSensor } from 'css-element-queries';\n\n/**\n * Component for overlay panel.\n */\n@Component({\n selector: 'app-overlay',\n templateUrl: './overlay.component.html',\n styleUrls: ['./overlay.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class OverlayComponent implements AfterViewInit {\n /** Title of the overlay. */\n @Input() overlayTitle: string;\n /** If the overlay is open or not. */\n @Input() active: boolean = false;\n /** Icon of the overlay header. */\n @Input() icon: string;\n /** If the overlay is resizable. */\n @Input() resizable: boolean = false;\n /** If the overlay body is transparent or not. */\n @Input() transparentBody: boolean = false;\n /** If the overlay body is visible or not. */\n showBody: boolean = true;\n\n // ********************************************************************************\n // * Below code is specific to the overlay resize feature. (LOOK INTO CSS RESIZE) *\n // ********************************************************************************\n\n /** Complete overlay card containing both header and body. */\n @ViewChild('overlayCard') overlayCard: ElementRef;\n /** Handle for resizing the overlay. */\n @ViewChild('resizeHandleCorner') resizeHandleCorner: ElementRef;\n /** Minimum resizable width. */\n private MIN_RES_WIDTH: number = 300;\n /** Minimum resizable height */\n private MIN_RES_HEIGHT: number = 100;\n\n /**\n * Move the resizable handle to the bottom right after the component is created.\n */\n ngAfterViewInit() {\n if (this.resizable) {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n resizeHandleElement.style.bottom = '0';\n resizeHandleElement.style.right = '0';\n\n new ResizeSensor(this.overlayCard.nativeElement, () => {\n this.resetHandlePosition();\n });\n\n window.addEventListener('resize', () => {\n this.resetHandlePosition();\n });\n }\n }\n\n /**\n * Resize the overlay card when the resize handle is dragged.\n */\n onResize() {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n const overlayCardElement = this.overlayCard.nativeElement;\n\n const dragRect = resizeHandleElement.getBoundingClientRect();\n const overlayRect = overlayCardElement.getBoundingClientRect();\n\n const width = dragRect.left - overlayRect.left + dragRect.width;\n const height = dragRect.top - overlayRect.top + dragRect.height;\n\n this.setHandleTransform(overlayRect, dragRect);\n\n if (width > this.MIN_RES_WIDTH && height > this.MIN_RES_HEIGHT) {\n overlayCardElement.style.width = width + 'px';\n overlayCardElement.style.height = height + 'px';\n }\n }\n\n /**\n * Reset resize handle position.\n */\n resetHandlePosition() {\n const resizeHandleElement = this.resizeHandleCorner.nativeElement;\n\n this.setHandleTransform(\n this.overlayCard.nativeElement.getBoundingClientRect(),\n resizeHandleElement.getBoundingClientRect()\n );\n\n resizeHandleElement.style.bottom = null;\n resizeHandleElement.style.right = null;\n }\n\n /**\n * Set the position of the resize handle using transform3d.\n * @param overlayRect Bounding client rectangle of the overlay card.\n * @param dragRect Bounding client rectangle of the resize handle.\n */\n private setHandleTransform(overlayRect: any, dragRect: any) {\n const translateX = overlayRect.width - dragRect.width;\n const translateY = overlayRect.height - dragRect.height;\n this.resizeHandleCorner.nativeElement.style.transform = `translate3d(${translateX}px, ${translateY}px, 0)`;\n }\n}\n","<div\n #overlayCard\n class=\"overlay-card card\"\n [hidden]=\"!active\"\n cdkDrag\n cdkDragBoundary=\"body\"\n>\n <div\n class=\"card-header d-flex justify-content-between\"\n [ngClass]=\"{ 'with-body': showBody }\"\n cdkDragHandle\n *ngIf=\"overlayTitle\"\n >\n <div class=\"align-self-center card-icon\" *ngIf=\"icon\">\n <svg>\n <use attr.href=\"assets/icons/{{ icon }}.svg#{{ icon }}\"></use>\n </svg>\n </div>\n <h5 class=\"align-self-center m-0 px-2\">{{ overlayTitle }}</h5>\n <button\n class=\"align-self-center card-icon btn-blank expandCollapse\"\n matTooltip=\"Expand / Collapse\"\n matTooltipPosition=\"right\"\n [ngClass]=\"{ expand: showBody }\"\n (click)=\"showBody = !showBody\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n <div\n class=\"overlay-card-content\"\n *ngIf=\"showBody\"\n [ngClass]=\"{ 'transparent-bg': transparentBody }\"\n >\n <ng-content></ng-content>\n </div>\n <!-- Making the overlay resizable -->\n <span\n #resizeHandleCorner\n class=\"resize-handle corner\"\n *ngIf=\"resizable\"\n [hidden]=\"!showBody\"\n cdkDrag\n (cdkDragMoved)=\"onResize()\"\n ></span>\n</div>\n","import { Component, OnInit, Input, ElementRef } from '@angular/core';\nimport {\n PrettySymbols,\n ActiveVariable,\n SceneManager,\n} from 'phoenix-event-display';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-collections-info-overlay',\n templateUrl: './collections-info-overlay.component.html',\n styleUrls: ['./collections-info-overlay.component.scss'],\n})\nexport class CollectionsInfoOverlayComponent implements OnInit {\n @Input() showObjectsInfo: boolean;\n hideInvisible: boolean;\n collections: string[];\n selectedCollection: string;\n showingCollection: any;\n collectionColumns: string[];\n getPrettySymbol = PrettySymbols.getPrettySymbol;\n activeObject: ActiveVariable<string>;\n\n constructor(\n private elementRef: ElementRef,\n private eventDisplay: EventDisplayService\n ) {}\n\n ngOnInit() {\n this.eventDisplay.listenToDisplayedEventChange(\n (_event) => (this.collections = this.eventDisplay.getCollections())\n );\n this.activeObject = this.eventDisplay.getActiveObjectId();\n this.activeObject.onUpdate((value: string) => {\n if (document.getElementById(value)) {\n document.getElementById(value).scrollIntoView(false);\n }\n });\n }\n\n changeCollection(selectedCollection: string) {\n const eventDataGroup = this.getEventDataGroup();\n this.selectedCollection = selectedCollection;\n\n this.showingCollection = this.eventDisplay\n .getCollection(selectedCollection)\n .map((object: any) => ({\n ...object,\n isCut: !eventDataGroup.getObjectByProperty('uuid', object.uuid)\n ?.visible,\n }));\n\n this.collectionColumns = Object.keys(this.showingCollection[0]).filter(\n (column) => !['uuid', 'hits', 'isCut'].includes(column) // FIXME - this is an ugly hack. But currently hits from tracks make track collections unusable. Better to have exlusion list passed in.\n );\n }\n\n sort(column: string, order: string) {\n if (order === 'asc')\n this.showingCollection.sort((a, b) => (a[column] < b[column] ? -1 : 1));\n else\n this.showingCollection.sort((a, b) => (a[column] > b[column] ? -1 : 1));\n }\n\n lookAtObject(uuid: string) {\n if (uuid) {\n this.activeObject.update(uuid);\n this.eventDisplay.lookAtObject(uuid);\n }\n }\n\n highlightObject(uuid: string) {\n if (uuid) {\n this.activeObject.update(uuid);\n this.eventDisplay.highlightObject(uuid);\n }\n }\n\n toggleInvisible(checked: boolean) {\n this.hideInvisible = checked;\n }\n\n addLabel(index: number, uuid: string) {\n const labelValue = this.elementRef.nativeElement.querySelector(\n `#label${index}`\n ).value;\n if (this.selectedCollection) {\n // Empty labelValue will remove the label object\n this.eventDisplay.addLabelToObject(\n labelValue,\n this.selectedCollection,\n index,\n uuid\n );\n }\n }\n\n private getEventDataGroup() {\n return this.eventDisplay\n .getThreeManager()\n .getSceneManager()\n .getScene()\n .getObjectByName(SceneManager.EVENT_DATA_ID);\n }\n}\n","<!-- Show objects -->\n<app-overlay\n overlayTitle=\"Collections Info\"\n icon=\"info\"\n [resizable]=\"true\"\n [active]=\"showObjectsInfo\"\n>\n <!-- Using ngIf to remove it from DOM since this panel requires heavy computing -->\n <div *ngIf=\"showObjectsInfo\" class=\"collectionsInfo m-2\">\n <div\n class=\"collectionSelector mb-2 d-flex align-items-center\"\n *ngIf=\"collections != null\"\n >\n <div class=\"d-flex align-items-center\">\n <span>Choose a collection: </span>\n <div class=\"eventSelector\">\n <label for=\"event\">Event</label>\n <select\n id=\"collection\"\n name=\"collection\"\n (change)=\"changeCollection($event.target.value)\"\n >\n <option value=\"\" selected disabled hidden>Choose Collection</option>\n <option *ngFor=\"let collection of collections\" [value]=\"collection\">\n {{ collection }}\n </option>\n </select>\n </div>\n <mat-checkbox\n *ngIf=\"showingCollection\"\n (change)=\"toggleInvisible($event.checked)\"\n >\n Hide Invisible Objects\n </mat-checkbox>\n </div>\n </div>\n\n <div class=\"boxBody table-responsive\">\n <table\n id=\"collectionTable\"\n class=\"table table-borderless table-sm\"\n *ngIf=\"showingCollection\"\n >\n <thead>\n <tr>\n <th>No.</th>\n <th>Selection</th>\n <th>Label</th>\n <th *ngFor=\"let column of collectionColumns\">\n <div class=\"head-wrapper\">\n <div>\n {{ getPrettySymbol(column) }}\n </div>\n <div class=\"sort-options\">\n <button\n class=\"icon-wrapper icon-button btn-blank up\"\n (click)=\"sort(column, 'dec')\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n <button\n class=\"icon-wrapper icon-button btn-blank\"\n (click)=\"sort(column, 'asc')\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let object of showingCollection; index as i\"\n [attr.id]=\"object.uuid\"\n [ngClass]=\"{\n 'active-object':\n activeObject && activeObject.value === object.uuid,\n 'is-cut': object.isCut,\n 'd-none': object.isCut && hideInvisible\n }\"\n >\n <td>#{{ i }}</td>\n <td>\n <div\n *ngIf=\"object.uuid\"\n class=\"row justify-content-center icon-wrapper\"\n >\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Move camera to object\"\n (click)=\"lookAtObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/views.svg#views\"></use>\n </svg>\n </button>\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Highlight object\"\n (click)=\"highlightObject(object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/cursor.svg#cursor\"></use>\n </svg>\n </button>\n </div>\n </td>\n <td>\n <div class=\"row m-0 add-label\">\n <div class=\"col-10 p-0\">\n <input\n class=\"form-control form-control-sm\"\n type=\"text\"\n [id]=\"'label' + i\"\n />\n </div>\n <div class=\"col-2 p-0 pl-2 text-center icon-wrapper\">\n <button\n class=\"object-select btn-blank\"\n matTooltip=\"Add, update or remove object label\"\n (click)=\"addLabel(i, object.uuid)\"\n >\n <svg>\n <use href=\"assets/icons/update.svg#update\"></use>\n </svg>\n </button>\n </div>\n </div>\n </td>\n <td *ngFor=\"let column of collectionColumns\">\n {{ object[column] }}\n </td>\n </tr>\n </tbody>\n </table>\n <p class=\"emptyBox\" *ngIf=\"!collections\">\n Load event data to be able to display information about the collections\n here.\n </p>\n </div>\n </div>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { CollectionsInfoOverlayComponent } from './collections-info-overlay/collections-info-overlay.component';\n\n@Component({\n selector: 'app-collections-info',\n templateUrl: './collections-info.component.html',\n styleUrls: ['./collections-info.component.scss'],\n})\nexport class CollectionsInfoComponent implements OnInit, OnDestroy {\n showObjectsInfo = false;\n overlayWindow: ComponentRef<CollectionsInfoOverlayComponent>;\n\n constructor(private overlay: Overlay) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(CollectionsInfoOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.showObjectsInfo = !this.showObjectsInfo;\n this.overlayWindow.instance.showObjectsInfo = this.showObjectsInfo;\n }\n}\n","<app-menu-toggle\n tooltip=\"Event data collections info\"\n icon=\"info\"\n [active]=\"showObjectsInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, OnInit } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-dark-theme',\n templateUrl: './dark-theme.component.html',\n styleUrls: ['./dark-theme.component.scss'],\n})\nexport class DarkThemeComponent implements OnInit {\n darkTheme = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.darkTheme = this.eventDisplay.getUIManager().getDarkTheme();\n }\n\n setDarkTheme() {\n this.darkTheme = !this.darkTheme;\n this.eventDisplay.getUIManager().setDarkTheme(this.darkTheme);\n }\n}\n","<app-menu-toggle\n tooltip=\"Dark theme\"\n [active]=\"darkTheme\"\n icon=\"dark\"\n (click)=\"setDarkTheme()\"\n>\n</app-menu-toggle>\n","import { Component, OnInit } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-event-selector',\n templateUrl: './event-selector.component.html',\n styleUrls: ['./event-selector.component.scss'],\n})\nexport class EventSelectorComponent implements OnInit {\n // Array containing the keys of the multiple loaded events\n events: string[];\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit() {\n this.eventDisplay.listenToLoadedEventsChange(\n (events) => (this.events = events)\n );\n }\n\n changeEvent(selected: any) {\n const value = selected.target.value;\n this.eventDisplay.loadEvent(value);\n }\n}\n","<div\n class=\"eventSelector mx-2\"\n *ngIf=\"events != null\"\n matTooltip=\"Event selector\"\n matTooltipPosition=\"above\"\n>\n <select name=\"event\" (change)=\"changeEvent($event)\">\n <option *ngFor=\"let event of events\" [value]=\"event\">\n {{ event }}\n </option>\n </select>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-experiment-info',\n templateUrl: './experiment-info.component.html',\n styleUrls: ['./experiment-info.component.scss'],\n})\nexport class ExperimentInfoComponent implements OnInit {\n experimentInfo: any[];\n @Input() experiment: string;\n @Input() experimentTagline: string;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.eventDisplay.listenToDisplayedEventChange(() => {\n this.experimentInfo = this.eventDisplay.getEventMetadata();\n });\n }\n}\n","<div id=\"experimentInfo\" class=\"experimentInfo\" cdkDrag cdkDragBoundary=\"body\">\n <a\n class=\"experimentLogoWrapper\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n *ngIf=\"experiment\"\n href=\"https://home.cern/science/experiments/{{ experiment }}\"\n >\n <img\n class=\"experimentLogo\"\n src=\"assets/images/{{ experiment }}.svg\"\n alt=\"\"\n />\n </a>\n <div class=\"textInfo\">\n <p *ngIf=\"experimentTagline\">\n <b>{{ experimentTagline }}</b>\n </p>\n <p *ngFor=\"let infoField of experimentInfo\">\n <ng-container *ngIf=\"infoField.label\">\n <b>{{ infoField.label }}: </b>{{ infoField.value }}\n </ng-container>\n <ng-container *ngIf=\"!infoField.label\">\n {{ infoField }}\n </ng-container>\n </p>\n </div>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\nimport packageJson from 'phoenix-event-display/package.json';\n\n/**\n * Component for displaying information from the logger\n */\n@Component({\n selector: 'app-info-panel-overlay',\n templateUrl: './info-panel-overlay.component.html',\n styleUrls: ['./info-panel-overlay.component.scss'],\n})\nexport class InfoPanelOverlayComponent implements OnInit {\n /** @ignore */\n @Input() showInfoPanel: boolean;\n /** List of actions to be displayed in the info panel */\n actionsList = [];\n /** Get Phoenix Version */\n version = packageJson.version;\n\n /**\n * Create the information panel overlay\n * @param infoLogger Service containing operations related to info logs\n */\n constructor(private eventDisplay: EventDisplayService) {}\n\n /**\n * Get the list of logs from the info logger service\n */\n ngOnInit() {\n this.actionsList = this.eventDisplay.getInfoLogger().getInfoLoggerList();\n }\n}\n","<app-overlay\n overlayTitle=\"Info Panel\"\n icon=\"info-panel\"\n [resizable]=\"true\"\n [active]=\"showInfoPanel\"\n>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item\">\n <!-- Show Phoenix Current Version (ON by Default) -->\n Phoenix Version: {{ version }}\n </li>\n <li class=\"list-group-item\" *ngIf=\"actionsList.length === 0\">\n No actions.\n </li>\n <li class=\"list-group-item\" *ngFor=\"let action of actionsList\">\n {{ action }}\n </li>\n </ul>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { InfoPanelOverlayComponent } from './info-panel-overlay/info-panel-overlay.component';\n\n/**\n * Component for toggling info panel overlay\n */\n@Component({\n selector: 'app-info-panel',\n templateUrl: './info-panel.component.html',\n styleUrls: ['./info-panel.component.scss'],\n})\nexport class InfoPanelComponent implements OnInit, OnDestroy {\n /** @ignore */\n showInfoPanel = false;\n /** Information panel overlay window */\n overlayWindow: ComponentRef<InfoPanelOverlayComponent>;\n\n /**\n * Create the info panel toggle\n * @param overlay Info panel overlay containing logger data\n */\n constructor(private overlay: Overlay) {}\n\n /**\n * Create the info panel overlay\n */\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(InfoPanelOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;\n }\n\n /**\n * Destroy the info panel overlay\n */\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n /**\n * Toggle the info panel overlay\n */\n toggleOverlay() {\n this.showInfoPanel = !this.showInfoPanel;\n this.overlayWindow.instance.showInfoPanel = this.showInfoPanel;\n }\n}\n","<app-menu-toggle\n tooltip=\"Info panel\"\n icon=\"info-panel\"\n [active]=\"showInfoPanel\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","export enum EventDataFormat {\n JSON = 'JSON',\n JIVEXML = 'JIVEXML',\n IG = 'IG',\n ZIP = 'ZIP',\n}\n\nexport type EventDataImportOption = EventDataFormat | ImportOption;\n\nexport class ImportOption {\n constructor(\n public format: string,\n public fileType: string,\n public handler: (files: FileList) => void,\n public accept?: string\n ) {}\n}\n","import { OnInit, Component, Input } from '@angular/core';\nimport { CMSLoader, JiveXMLLoader, ScriptLoader } from 'phoenix-event-display';\nimport JSZip from 'jszip';\nimport { EventDisplayService } from '../../../../services/event-display.service';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport {\n EventDataFormat,\n EventDataImportOption,\n ImportOption,\n} from '../../../../services/extras/event-data-import';\n\n@Component({\n selector: 'app-io-options-dialog',\n templateUrl: './io-options-dialog.component.html',\n styleUrls: ['./io-options-dialog.component.scss'],\n})\nexport class IOOptionsDialogComponent implements OnInit {\n @Input()\n eventDataImportOptions: EventDataImportOption[] = [EventDataFormat.JSON];\n\n eventDataOptionsWithHandler: ImportOption[];\n\n private supportedEventDataFormats = [\n new ImportOption(\n EventDataFormat.JSON,\n '.json',\n this.handleJSONEventDataInput.bind(this),\n 'application/json'\n ),\n new ImportOption(\n EventDataFormat.JIVEXML,\n '.xml',\n this.handleJiveXMLDataInput.bind(this),\n 'text/xml'\n ),\n new ImportOption(\n EventDataFormat.ZIP,\n '.zip',\n this.handleZipEventDataInput.bind(this),\n '.zip'\n ),\n new ImportOption(\n EventDataFormat.IG,\n '.ig',\n this.handleIgEventDataInput.bind(this),\n '.ig'\n ),\n ];\n\n constructor(\n private eventDisplay: EventDisplayService,\n public dialogRef: MatDialogRef<IOOptionsDialogComponent>\n ) {}\n\n ngOnInit() {\n this.eventDataOptionsWithHandler = this.supportedEventDataFormats.filter(\n (eventDataFormat) =>\n this.eventDataImportOptions.includes(\n eventDataFormat.format as EventDataFormat\n )\n );\n\n this.eventDataImportOptions.forEach((eventDataImportOption) => {\n if (eventDataImportOption instanceof ImportOption) {\n const importHandler = eventDataImportOption.handler.bind(this);\n eventDataImportOption.handler = (files: FileList) => {\n importHandler(files);\n this.onClose();\n };\n\n this.eventDataOptionsWithHandler.push(eventDataImportOption);\n }\n });\n }\n\n getSupportedEventDataFormats() {\n return this.eventDataImportOptions\n .map((format) => {\n if (format instanceof ImportOption) {\n return format.format;\n }\n\n return format;\n })\n .filter((format) => format !== 'ZIP')\n .join(', ');\n }\n\n onClose(): void {\n this.dialogRef.close();\n }\n\n handleJSONEventDataInput(files: FileList) {\n const callback = (content: any) => {\n const json = typeof content === 'string' ? JSON.parse(content) : content;\n this.eventDisplay.parsePhoenixEvents(json);\n };\n this.handleFileInput(files[0], 'json', callback);\n }\n\n handleJiveXMLDataInput(files: FileList) {\n const callback = (content: any) => {\n const jiveloader = new JiveXMLLoader();\n jiveloader.process(content);\n const eventData = jiveloader.getEventData();\n this.eventDisplay.buildEventDataFromJSON(eventData);\n };\n this.handleFileInput(files[0], 'xml', callback);\n }\n\n handleOBJInput(files: FileList) {\n const callback = (content: any, name: string) => {\n this.eventDisplay.parseOBJGeometry(content, name);\n };\n this.handleFileInput(files[0], 'obj', callback);\n }\n\n handleSceneInput(files: FileList) {\n const callback = (content: any) => {\n this.eventDisplay.parsePhoenixDisplay(content);\n };\n this.handleFileInput(files[0], 'phnx', callback);\n }\n\n handleGLTFInput(files: FileList) {\n const callback = (content: any, name: string) => {\n this.eventDisplay.parseGLTFGeometry(content, name);\n };\n this.handleFileInput(files[0], 'gltf', callback);\n }\n\n handlePhoenixInput(files: FileList) {\n const callback = (content: any) => {\n this.eventDisplay.parsePhoenixDisplay(content);\n };\n this.handleFileInput(files[0], 'phnx', callback);\n }\n\n handleROOTInput(files: FileList) {\n ScriptLoader.loadJSRootScripts().then((JSROOT: any) => {\n const objectName = prompt('Enter object name in ROOT file');\n JSROOT.openFile(files[0]).then((file: any) => {\n file.readObject(objectName).then((obj: any) => {\n this.eventDisplay.loadJSONGeometry(\n JSROOT.GEO.build(obj, { dflt_colors: true }).toJSON(),\n files[0].name.split('.')[0]\n );\n });\n });\n });\n this.onClose();\n }\n\n handleRootJSONInput(files: FileList) {\n ScriptLoader.loadJSRootScripts().then((JSROOT: any) => {\n const callback = (content: any, name: string) => {\n this.eventDisplay.loadJSONGeometry(\n JSROOT.GEO.build(JSROOT.parse(content), {\n dflt_colors: true,\n }).toJSON(),\n name\n );\n };\n this.handleFileInput(files[0], 'gz', callback);\n });\n }\n\n handleIgEventDataInput(files: FileList) {\n const cmsLoader = new CMSLoader();\n cmsLoader.readIgArchive(files[0], (allEvents: any[]) => {\n const allEventsData = cmsLoader.getAllEventsData(allEvents);\n this.eventDisplay.parsePhoenixEvents(allEventsData);\n this.onClose();\n });\n }\n\n handleZipEventDataInput(files: FileList) {\n if (this.isFileOfExtension(files[0], 'zip')) {\n this.handleZipInput(files[0], (allFilesWithData) => {\n const allEventsObject = {};\n\n // JSON event data\n Object.keys(allFilesWithData)\n .filter((fileName) => fileName.endsWith('.json'))\n .forEach((fileName) => {\n Object.assign(\n allEventsObject,\n JSON.parse(allFilesWithData[fileName])\n );\n });\n\n // JiveXML event data\n const jiveloader = new JiveXMLLoader();\n Object.keys(allFilesWithData)\n .filter((fileName) => fileName.endsWith('.xml'))\n .forEach((fileName) => {\n jiveloader.process(allFilesWithData[fileName]);\n const eventData = jiveloader.getEventData();\n Object.assign(allEventsObject, { [fileName]: eventData });\n });\n\n this.eventDisplay.parsePhoenixEvents(allEventsObject);\n\n this.onClose();\n });\n } else {\n console.error('Error: Invalid file format!');\n this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');\n }\n }\n\n async handleZipInput(\n file: File,\n callback: (allFilesWithData: { [key: string]: string }) => void\n ) {\n const allFilesWithData: { [key: string]: string } = {};\n // Using a try catch block to catch any errors in Promises\n try {\n const zipArchive = new JSZip();\n await zipArchive.loadAsync(file);\n const allFiles = Object.keys(zipArchive.files);\n for (const singleFile of allFiles) {\n const fileData = await zipArchive.file(singleFile).async('string');\n allFilesWithData[singleFile] = fileData;\n }\n callback(allFilesWithData);\n } catch (error) {\n console.error('Error while reading zip', error);\n this.eventDisplay.getInfoLogger().add('Could not read zip file', 'Error');\n }\n }\n\n handleFileInput(\n file: File,\n extension: string,\n callback: (result: string, fileName?: string) => void\n ) {\n const reader = new FileReader();\n if (this.isFileOfExtension(file, extension)) {\n reader.onload = () => {\n callback(reader.result.toString(), file.name.split('.')[0]);\n };\n reader.readAsText(file);\n } else {\n console.error('Error: Invalid file format!');\n this.eventDisplay.getInfoLogger().add('Invalid file format!', 'Error');\n }\n this.onClose();\n }\n\n private isFileOfExtension(file: File, extension: string) {\n return file.name.split('.').pop() === extension;\n }\n\n saveScene() {\n this.eventDisplay.exportPhoenixDisplay();\n }\n\n exportOBJ() {\n this.eventDisplay.exportToOBJ();\n }\n}\n","<div class=\"dialog\">\n <h1 mat-dialog-title>Import and export options</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <div *ngIf=\"eventDataImportOptions.length > 0\">\n <h5>Import</h5>\n\n <h6 class=\"text-center\">Event data</h6>\n\n <div class=\"row centered\">\n <ng-container\n *ngFor=\"let eventDataImportOption of eventDataOptionsWithHandler\"\n >\n <input\n #eventDataFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n [accept]=\"eventDataImportOption.accept\"\n (change)=\"eventDataImportOption.handler($event.target.files)\"\n />\n <button\n class=\"file-input-button\"\n (click)=\"eventDataFileInput.click()\"\n >\n <img src=\"assets/icons/eventData.svg\" alt=\"Event data icon\" />\n Load {{ eventDataImportOption.fileType }}\n </button>\n </ng-container>\n </div>\n\n <p class=\"text-center\">\n Supported formats: {{ getSupportedEventDataFormats() }}\n </p>\n </div>\n\n <h6 class=\"text-center\">Geometries</h6>\n\n <div class=\"row centered\">\n <input\n #objFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".obj\"\n name=\"image\"\n (change)=\"handleOBJInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"objFileInput.click()\">\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Load .obj\n </button>\n\n <input\n #gltfFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".gltf\"\n name=\"image\"\n (change)=\"handleGLTFInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"gltfFileInput.click()\">\n <img src=\"assets/icons/gltf.svg\" alt=\"\" /> Load .gltf\n </button>\n\n <input\n #rootFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".root\"\n (change)=\"handleROOTInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .root\n </button>\n\n <input\n #rootJSONFileInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".json.gz\"\n (change)=\"handleRootJSONInput($event.target.files)\"\n />\n <button class=\"file-input-button\" (click)=\"rootJSONFileInput.click()\">\n <img src=\"assets/icons/file-import.svg\" alt=\"\" /> Load .json.gz\n </button>\n </div>\n\n <p class=\"text-center\">Supported formats: OBJ, GLTF, ROOT, ROOT JSON</p>\n\n <h5>Import / export scene</h5>\n\n <div class=\"row centered\">\n <button\n class=\"file-input-button load-export\"\n id=\"exportScene\"\n (click)=\"saveScene()\"\n >\n <img src=\"assets/icons/save.svg\" alt=\"\" /> Save scene\n </button>\n\n <input\n #loadSceneInput\n type=\"file\"\n tabindex=\"-1\"\n class=\"file-input\"\n accept=\".phnx\"\n name=\"image\"\n (change)=\"handlePhoenixInput($event.target.files)\"\n />\n <button\n class=\"file-input-button load-export\"\n id=\"importScene\"\n (click)=\"loadSceneInput.click()\"\n >\n <img src=\"assets/icons/upload.svg\" alt=\"\" /> Load scene\n </button>\n\n <button\n class=\"file-input-button export-button\"\n id=\"exportOBJ\"\n (click)=\"exportOBJ()\"\n >\n <img src=\"assets/icons/obj.svg\" alt=\"\" /> Save OBJ\n </button>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport {\n EventDataFormat,\n EventDataImportOption,\n} from '../../../services/extras/event-data-import';\nimport { IOOptionsDialogComponent } from './io-options-dialog/io-options-dialog.component';\n\n@Component({\n selector: 'app-io-options',\n templateUrl: './io-options.component.html',\n styleUrls: ['./io-options.component.scss'],\n})\nexport class IoOptionsComponent {\n @Input()\n eventDataImportOptions: EventDataImportOption[] =\n Object.values(EventDataFormat);\n\n constructor(private dialog: MatDialog) {}\n\n openIODialog() {\n const dialogRef = this.dialog.open(IOOptionsDialogComponent, {\n panelClass: 'dialog',\n });\n dialogRef.componentInstance.eventDataImportOptions =\n this.eventDataImportOptions;\n }\n}\n","<app-menu-toggle\n tooltip=\"Import and export options\"\n icon=\"import\"\n [active]=\"false\"\n (click)=\"openIODialog()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-main-view-toggle',\n templateUrl: './main-view-toggle.component.html',\n styleUrls: ['./main-view-toggle.component.scss'],\n})\nexport class MainViewToggleComponent {\n orthographicView: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n switchMainView() {\n this.orthographicView = !this.orthographicView;\n this.eventDisplay\n .getUIManager()\n .toggleOrthographicView(this.orthographicView);\n }\n}\n","<app-menu-toggle\n [icon]=\"orthographicView ? 'perspective' : 'orthographic'\"\n [matTooltip]=\"\n 'Switch to ' + (orthographicView ? 'perspective' : 'orthographic') + ' view'\n \"\n (click)=\"switchMainView()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { MatSliderChange } from '@angular/material/slider';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-clipping',\n templateUrl: './object-clipping.component.html',\n styleUrls: ['./object-clipping.component.scss'],\n})\nexport class ObjectClippingComponent {\n clippingEnabled: boolean;\n clippingAngle: number;\n\n constructor(private eventDisplay: EventDisplayService) {\n const stateManager = this.eventDisplay.getStateManager();\n stateManager.clippingEnabled.onUpdate(\n (clippingValue) => (this.clippingEnabled = clippingValue)\n );\n stateManager.clippingAngle.onUpdate(\n (value) => (this.clippingAngle = value)\n );\n }\n\n changeClippingAngle(change: MatSliderChange) {\n const angle = change.value;\n this.eventDisplay.getUIManager().rotateClipping(angle);\n }\n\n toggleClipping(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setClipping(value);\n this.clippingEnabled = value;\n }\n}\n","<mat-menu class=\"mat-menu\" #menu>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n clippingCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #clippingCheckbox\n [checked]=\"clippingEnabled\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleClipping($event)\"\n >Clipping\n </mat-checkbox>\n </button>\n <button class=\"slider-btn\" mat-menu-item (focus)=\"clippingSlider.focus()\">\n <mat-slider\n #clippingSlider\n min=\"0\"\n max=\"180\"\n step=\"1\"\n thumbLabel\n [value]=\"clippingAngle\"\n (click)=\"$event.stopPropagation()\"\n (input)=\"changeClippingAngle($event)\"\n >\n </mat-slider>\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"menu\"\n tooltip=\"Geometry clipping\"\n icon=\"clipping\"\n [active]=\"clippingEnabled\"\n>\n</app-menu-toggle>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pipe for transforming selected object attributes to a better format.\n */\n@Pipe({\n name: 'attributePipe',\n})\nexport class AttributePipe implements PipeTransform {\n /**\n * Transform the attribute to a better presentable format.\n * @param value Value to be transformed.\n * @param args Additional arguments.\n * @returns The transformed value.\n */\n transform(value: any, args?: any): any {\n let transformedValue = '';\n if (Array.isArray(value)) {\n transformedValue += '\\n';\n value.forEach((v) => (transformedValue += v + '\\n'));\n } else {\n transformedValue = value.toString();\n }\n return transformedValue;\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-selection-overlay',\n templateUrl: './object-selection-overlay.component.html',\n styleUrls: ['./object-selection-overlay.component.scss'],\n})\nexport class ObjectSelectionOverlayComponent implements OnInit {\n // Attributes for displaying the information of selected objects\n @Input() hiddenSelectedInfo: boolean;\n selectedObject = { name: 'Object', attributes: [] };\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit() {\n this.eventDisplay.allowSelection(this.selectedObject);\n }\n}\n","<app-overlay\n icon=\"cursor\"\n [overlayTitle]=\"selectedObject.name\"\n [active]=\"!hiddenSelectedInfo\"\n>\n <div\n id=\"selectedObjectPanelBody\"\n class=\"m-1\"\n *ngIf=\"selectedObject.attributes.length > 0\"\n >\n <div\n *ngFor=\"let attribute of selectedObject.attributes\"\n class=\"attributeField\"\n >\n <strong>{{ attribute.attributeName }}</strong>\n : {{ attribute.attributeValue | attributePipe }}\n </div>\n </div>\n</app-overlay>\n","import { Component, OnInit, ComponentRef, OnDestroy } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ObjectSelectionOverlayComponent } from './object-selection-overlay/object-selection-overlay.component';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-object-selection',\n templateUrl: './object-selection.component.html',\n styleUrls: ['./object-selection.component.scss'],\n})\nexport class ObjectSelectionComponent implements OnInit, OnDestroy {\n // Attributes for displaying the information of selected objects\n hiddenSelectedInfo = true;\n overlayWindow: ComponentRef<ObjectSelectionOverlayComponent>;\n\n constructor(\n private overlay: Overlay,\n private eventDisplay: EventDisplayService\n ) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(ObjectSelectionOverlayComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.hiddenSelectedInfo = !this.hiddenSelectedInfo;\n this.overlayWindow.instance.hiddenSelectedInfo = this.hiddenSelectedInfo;\n this.eventDisplay.enableSelecting(!this.hiddenSelectedInfo);\n }\n}\n","<app-menu-toggle\n tooltip=\"Object selection\"\n icon=\"cursor\"\n [active]=\"!hiddenSelectedInfo\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, ViewChild, AfterViewInit, Input } from '@angular/core';\nimport type { ElementRef } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\n@Component({\n selector: 'app-overlay-view-window',\n templateUrl: './overlay-view-window.component.html',\n styleUrls: ['./overlay-view-window.component.scss'],\n})\nexport class OverlayViewWindowComponent implements AfterViewInit {\n @Input() showOverlay = true;\n transparentBody = false;\n orthographicView = false;\n overlayViewFixed = false;\n @ViewChild('overlayWindow') overlayWindow: ElementRef<HTMLCanvasElement>;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngAfterViewInit(): void {\n const canvas = this.initializeCanvas(this.overlayWindow.nativeElement);\n this.eventDisplay.setOverlayRenderer(canvas);\n }\n\n initializeCanvas(canvas: HTMLCanvasElement): HTMLCanvasElement {\n const width = window.innerWidth / 2.5;\n const height = window.innerHeight / 2.5;\n canvas.width = width;\n canvas.height = height;\n canvas.style.width = width.toString() + ' px';\n canvas.style.height = height.toString() + ' px';\n return canvas;\n }\n\n switchOverlayView() {\n this.orthographicView = !this.orthographicView;\n this.eventDisplay\n .getUIManager()\n .toggleOrthographicView(this.orthographicView);\n }\n\n fixOverlayView() {\n this.overlayViewFixed = !this.overlayViewFixed;\n this.eventDisplay.fixOverlayView(this.overlayViewFixed);\n }\n\n toggleBgTransparency() {\n this.transparentBody = !this.transparentBody;\n }\n}\n","<app-overlay\n overlayTitle=\"Overlay View\"\n icon=\"overlay\"\n [resizable]=\"true\"\n [transparentBody]=\"transparentBody\"\n [active]=\"showOverlay\"\n>\n <div class=\"overlay-view-wrapper\">\n <canvas #overlayWindow id=\"overlay-canvas\" [hidden]=\"!showOverlay\">\n </canvas>\n <div class=\"overlay-view-controls position-absolute d-flex flex-row\">\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"transparent\"\n matTooltip=\"Toggle background transparency\"\n (click)=\"toggleBgTransparency()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n icon=\"move-lock\"\n [matTooltip]=\"(overlayViewFixed ? 'Restore' : 'Fix') + ' overlay view'\"\n [active]=\"overlayViewFixed\"\n (click)=\"fixOverlayView()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n class=\"overlay-view-control\"\n [icon]=\"orthographicView ? 'orthographic' : 'perspective'\"\n [matTooltip]=\"\n 'Switch to ' +\n (orthographicView ? 'orthographic' : 'perspective') +\n ' view'\n \"\n (click)=\"switchOverlayView()\"\n >\n </app-menu-toggle>\n </div>\n </div>\n</app-overlay>\n","import { Component, ComponentRef, OnDestroy, OnInit } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { OverlayViewWindowComponent } from './overlay-view-window/overlay-view-window.component';\n\n@Component({\n selector: 'app-overlay-view',\n templateUrl: './overlay-view.component.html',\n styleUrls: ['./overlay-view.component.scss'],\n})\nexport class OverlayViewComponent implements OnInit, OnDestroy {\n overlayWindow: ComponentRef<OverlayViewWindowComponent>;\n showOverlay = false;\n\n constructor(private overlay: Overlay) {}\n\n ngOnInit() {\n const overlayRef = this.overlay.create();\n const overlayPortal = new ComponentPortal(OverlayViewWindowComponent);\n this.overlayWindow = overlayRef.attach(overlayPortal);\n this.overlayWindow.instance.showOverlay = this.showOverlay;\n }\n\n ngOnDestroy(): void {\n this.overlayWindow.destroy();\n }\n\n toggleOverlay() {\n this.showOverlay = !this.showOverlay;\n this.overlayWindow.instance.showOverlay = this.showOverlay;\n }\n}\n","<app-menu-toggle\n tooltip=\"Overlay view\"\n icon=\"overlay\"\n [active]=\"showOverlay\"\n (click)=\"toggleOverlay()\"\n>\n</app-menu-toggle>\n","import { Component, Input, ViewChildren } from '@angular/core';\nimport type { QueryList } from '@angular/core';\nimport { EventDisplayService } from '../../../../services/event-display.service';\n\nexport type TreeMenuNode = {\n name: string;\n geometryId: string;\n children?: TreeMenuNode[];\n};\n\n@Component({\n selector: 'app-tree-menu-item',\n templateUrl: './tree-menu-item.component.html',\n styleUrls: ['./tree-menu-item.component.scss'],\n})\nexport class TreeMenuItemComponent {\n @ViewChildren(TreeMenuItemComponent)\n children!: QueryList<TreeMenuItemComponent>;\n @Input() node: TreeMenuNode;\n isExpanded = false;\n visible = true;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n public toggleVisibility(visible: boolean) {\n console.log(\"hi! it's \" + this.node.name);\n this.eventDisplay\n .getUIManager()\n .geometryVisibility(this.node.geometryId, visible);\n this.visible = visible;\n this.children.forEach((child) => child.toggleVisibility(visible));\n }\n}\n","<ng-container *ngIf=\"node\">\n <div class=\"header\" [ngClass]=\"{ visible: visible }\">\n <button\n *ngIf=\"node.children\"\n mat-icon-button\n matTreeNodeToggle\n (click)=\"isExpanded = !isExpanded\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ isExpanded ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <div (click)=\"toggleVisibility(!visible)\" class=\"node-name\">\n {{ node.name }}\n </div>\n </div>\n <ul [hidden]=\"!isExpanded\" hid>\n <div class=\"children\">\n <li *ngFor=\"let node of node.children\">\n <app-tree-menu-item [node]=\"node\"></app-tree-menu-item>\n </li>\n </div>\n </ul>\n</ng-container>\n","import { Component, OnInit } from '@angular/core';\nimport { TreeMenuNode } from './tree-menu-item/tree-menu-item.component';\n\n@Component({\n selector: 'app-tree-menu',\n templateUrl: './tree-menu.component.html',\n styleUrls: ['./tree-menu.component.scss'],\n})\nexport class TreeMenuComponent implements OnInit {\n rootNode: TreeMenuNode = {\n name: 'Atlas Detector',\n geometryId: 'AtlasDetector',\n children: [\n {\n name: 'Magnet systems',\n geometryId: 'MagnetSys',\n children: [\n {\n name: 'Toroids',\n geometryId: 'Toroids',\n },\n ],\n },\n {\n name: 'Calorimeters',\n geometryId: 'CaloSys',\n children: [\n {\n name: 'LAr Barrel',\n geometryId: 'LAr Barrel',\n },\n {\n name: 'LAr EC1',\n geometryId: 'LAr EC1',\n },\n {\n name: 'LAr EC2',\n geometryId: 'LAr EC2',\n },\n {\n name: 'Tile Cal',\n geometryId: 'Tile Cal',\n },\n ],\n },\n {\n name: 'Inner detector',\n geometryId: 'InDetSys',\n children: [\n {\n name: 'Pixel',\n geometryId: 'Pixel',\n },\n {\n name: 'SCT',\n geometryId: 'SCT',\n },\n {\n name: 'TRT',\n geometryId: 'TRT',\n },\n ],\n },\n ],\n };\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","<div class=\"tree-wrapper\">\n <div class=\"tree-menu\">\n <app-tree-menu-item [node]=\"rootNode\"></app-tree-menu-item>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { PresetView } from 'phoenix-event-display';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-view-options',\n templateUrl: './view-options.component.html',\n styleUrls: ['./view-options.component.scss'],\n})\nexport class ViewOptionsComponent implements OnInit {\n views: PresetView[];\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n ngOnInit(): void {\n this.views = this.eventDisplay.getUIManager().getPresetViews();\n }\n\n displayView($event: any, view: PresetView) {\n $event.stopPropagation();\n this.eventDisplay.getUIManager().displayView(view);\n }\n\n setAxis(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setShowAxis(value);\n }\n\n setGrid(change: MatCheckboxChange) {\n const value = change.checked;\n this.eventDisplay.getUIManager().setShowGrid(value);\n }\n}\n","<mat-menu #viewOptions>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showGridCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showGridCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setGrid($event)\"\n >Show Grid\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n (click)=\"\n $event.stopPropagation();\n showAxisCheckbox._inputElement.nativeElement.click()\n \"\n >\n <mat-checkbox\n #showAxisCheckbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"setAxis($event)\"\n >Show Axis\n </mat-checkbox>\n </button>\n <button\n mat-menu-item\n *ngFor=\"let view of views\"\n (click)=\"displayView($event, view)\"\n >\n <svg class=\"view-icon\" *ngIf=\"view.icon\">\n <use attr.href=\"assets/icons/{{ view.icon }}.svg#{{ view.icon }}\"></use>\n </svg>\n {{ view.name }}\n </button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"viewOptions\"\n tooltip=\"View options\"\n icon=\"views\"\n [active]=\"false\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\nimport { VRManager, XRSessionType } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-vr-toggle',\n templateUrl: './vr-toggle.component.html',\n styleUrls: ['./vr-toggle.component.scss'],\n})\nexport class VrToggleComponent {\n vrSupported: boolean = false;\n vrActive: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {\n // NOTE: WebXR needs secure HTTPS context\n // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query\n (navigator as any)?.xr\n ?.isSessionSupported?.(VRManager.SESSION_TYPE)\n .then((supported: boolean) => {\n if (supported) {\n this.vrSupported = true;\n }\n })\n .catch((err: any) => console.warn('Error in VR', err));\n }\n\n toggleVr() {\n // If toggling VR on\n if (!this.vrActive) {\n this.eventDisplay.initXR(XRSessionType.VR, () => {\n this.vrActive = false;\n // Disable renderer XR and remove animation loop\n this.eventDisplay.endXR(XRSessionType.VR);\n });\n this.vrActive = true;\n } else {\n this.eventDisplay.endXR(XRSessionType.VR);\n this.vrActive = false;\n }\n }\n}\n","<app-menu-toggle\n [disabled]=\"!vrSupported\"\n [active]=\"vrActive\"\n icon=\"vr\"\n (click)=\"vrSupported && toggleVr()\"\n [tooltip]=\"\n vrSupported ? (vrActive ? 'Exit VR' : 'Enter VR') : 'VR not supported'\n \"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\nimport { ARManager, XRSessionType } from 'phoenix-event-display';\n\n@Component({\n selector: 'app-ar-toggle',\n templateUrl: './ar-toggle.component.html',\n styleUrls: ['./ar-toggle.component.scss'],\n})\nexport class ArToggleComponent {\n arSupported: boolean = false;\n arActive: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {\n // NOTE: WebXR needs secure HTTPS context\n // Query for permissions of XR before using it (not supported by browsers yet). See https://developer.mozilla.org/en-US/docs/Web/API/Permissions/query\n (navigator as any).xr\n ?.isSessionSupported?.(ARManager.SESSION_TYPE)\n .then((supported: boolean) => {\n if (supported) {\n this.arSupported = true;\n }\n })\n .catch((err: any) => console.warn('Error in AR', err));\n }\n\n toggleAr(enableDomOverlay: boolean = true) {\n ARManager.enableDomOverlay = enableDomOverlay;\n\n // If toggling AR on\n if (!this.arActive) {\n this.eventDisplay.initXR(XRSessionType.AR, () => {\n this.arActive = false;\n // Disable renderer XR and remove animation loop\n this.eventDisplay.endXR(XRSessionType.AR);\n });\n this.arActive = true;\n } else {\n this.eventDisplay.endXR(XRSessionType.AR);\n this.arActive = false;\n }\n }\n}\n","<mat-menu #arToggleOptions>\n <ng-container *ngIf=\"arSupported\">\n <button mat-menu-item (click)=\"toggleAr(true)\">AR with overlays</button>\n <button mat-menu-item (click)=\"toggleAr(false)\">AR without overlays</button>\n </ng-container>\n <button *ngIf=\"!arSupported\" mat-menu-item disabled>AR not supported</button>\n</mat-menu>\n\n<app-menu-toggle\n [matMenuTriggerFor]=\"arToggleOptions\"\n (click)=\"arSupported && (arActive ? toggleAr() : null)\"\n [disabled]=\"!arSupported\"\n [active]=\"arActive\"\n icon=\"ar\"\n [tooltip]=\"\n arSupported ? (arActive ? 'Exit AR' : 'Enter AR') : 'AR not supported'\n \"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n/**\n * Component for adding zoom controls for the main and overlay cameras.\n */\n@Component({\n selector: 'app-zoom-controls',\n templateUrl: './zoom-controls.component.html',\n styleUrls: ['./zoom-controls.component.scss'],\n})\nexport class ZoomControlsComponent {\n /** All camera being used by the scene. */\n allCameras: any[];\n /** Factor to zoom by. */\n private zoomFactor: number = 1.1;\n /** Timeout for clearing mouse hold. */\n private zoomTimeout: any;\n /** The speed and time of zoom. */\n private zoomTime: number = 200;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n /**\n * Zoom all the cameras by a specific zoom factor.\n * The factor may either be greater (zoom in) or smaller (zoom out) than 1.\n * @param zoomFactor The factor to zoom by.\n */\n zoomTo(zoomFactor: number) {\n this.zoomTime =\n this.zoomTime > 30 ? Math.floor(this.zoomTime / 1.1) : this.zoomTime;\n\n this.eventDisplay.zoomTo(zoomFactor, this.zoomTime);\n\n this.zoomTimeout = setTimeout(() => {\n this.zoomTo(zoomFactor);\n }, this.zoomTime);\n }\n\n /**\n * Zoom the camera in.\n * @param leftClick Whether the mouse click is left or not.\n */\n zoomIn(leftClick: boolean) {\n if (leftClick) {\n this.zoomTo(1 / this.zoomFactor);\n }\n }\n\n /**\n * Zoom the camera out.\n * @param leftClick Whether the mouse click is left or not.s\n */\n zoomOut(leftClick: boolean) {\n if (leftClick) {\n this.zoomTo(this.zoomFactor);\n }\n }\n\n /**\n * Reset the zoom time which decreases upon hold and clear the zoom timeout.\n */\n clearZoom() {\n this.zoomTime = 200;\n clearTimeout(this.zoomTimeout);\n }\n}\n","<div class=\"d-flex\">\n <app-menu-toggle\n tooltip=\"Zoom out (hold)\"\n icon=\"zoom-out\"\n [active]=\"false\"\n (click)=\"zoomOut(true); clearZoom()\"\n (touchstart)=\"zoomOut(true)\"\n (mousedown)=\"zoomOut($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n <app-menu-toggle\n tooltip=\"Zoom in (hold)\"\n icon=\"zoom-in\"\n [active]=\"false\"\n (click)=\"zoomIn(true); clearZoom()\"\n (touchstart)=\"zoomIn(true)\"\n (mousedown)=\"zoomIn($event.button === 0)\"\n (mouseup)=\"clearZoom()\"\n (mouseleave)=\"clearZoom()\"\n (touchend)=\"clearZoom()\"\n (touchcancel)=\"clearZoom()\"\n (touchmove)=\"clearZoom()\"\n >\n </app-menu-toggle>\n</div>\n","import { OnInit } from '@angular/core';\nimport { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'app-ss-mode',\n templateUrl: './ss-mode.component.html',\n styleUrls: ['./ss-mode.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class SSModeComponent implements OnInit {\n ssMode: boolean = false;\n\n ngOnInit() {\n document.onfullscreenchange = () => {\n if (!document.fullscreenElement) {\n this.toggleSSMode();\n }\n };\n }\n\n toggleSSMode() {\n this.ssMode = !this.ssMode;\n document.body.classList.toggle('ss-mode');\n if (this.ssMode) {\n // WORKAROUND - Adding the event listener directly somehow calls it on the first click\n setTimeout(() => {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('touchstart', this.onDocumentClick);\n }, 1);\n document.documentElement.requestFullscreen?.();\n } else {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('touchstart', this.onDocumentClick);\n }\n }\n\n private onDocumentClick = () => {\n document.exitFullscreen?.();\n };\n}\n","<app-menu-toggle\n tooltip=\"Screenshot mode\"\n [active]=\"ssMode\"\n icon=\"ss-mode\"\n (click)=\"toggleSSMode()\"\n>\n</app-menu-toggle>\n","import { Component } from '@angular/core';\nimport { EventDisplayService } from '../../../services/event-display.service';\n\n@Component({\n selector: 'app-performance-toggle',\n templateUrl: './performance-toggle.component.html',\n styleUrls: ['./performance-toggle.component.scss'],\n})\nexport class PerformanceToggleComponent {\n performanceMode: boolean = false;\n\n constructor(private eventDisplay: EventDisplayService) {}\n\n togglePerformance() {\n this.performanceMode = !this.performanceMode;\n this.eventDisplay.getThreeManager().setAntialiasing(!this.performanceMode);\n }\n}\n","<app-menu-toggle\n tooltip=\"Performance mode\"\n [active]=\"performanceMode\"\n icon=\"performance\"\n (click)=\"togglePerformance()\"\n>\n</app-menu-toggle>\n","import { AfterViewInit, Component, ElementRef, ViewChild } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { ActiveVariable, phoenixURLOptions } from 'phoenix-event-display';\nimport QRCode from 'qrcode';\n\n@Component({\n selector: 'app-share-link-dialog',\n templateUrl: './share-link-dialog.component.html',\n styleUrls: ['./share-link-dialog.component.scss'],\n})\nexport class ShareLinkDialogComponent implements AfterViewInit {\n baseLink: string;\n shareLink: ActiveVariable<string>;\n embedLink: string;\n urlOptions = Object.assign({}, phoenixURLOptions);\n @ViewChild('qrcodeCanvas') qrcodeCanvas: ElementRef<HTMLCanvasElement>;\n\n constructor(private dialogRef: MatDialogRef<ShareLinkDialogComponent>) {\n const locationHref = window.location.href;\n const lastIndex =\n locationHref.lastIndexOf('?') === -1\n ? locationHref.length\n : locationHref.lastIndexOf('?');\n\n this.baseLink = locationHref.slice(0, lastIndex);\n this.shareLink = new ActiveVariable(this.baseLink);\n this.embedLink = this.getEmbedLink();\n }\n\n ngAfterViewInit() {\n this.updateQRCode(this.shareLink.value);\n this.shareLink.onUpdate(this.updateQRCode.bind(this));\n }\n\n onClose() {\n this.dialogRef.close();\n }\n\n getEmbedLink(urlParametersString: string = '') {\n return `<iframe src=\"${this.baseLink}?embed=true${\n urlParametersString ? '&' : ''\n }${urlParametersString}\"></iframe>`;\n }\n\n setOptionValue(option: string, value: string | boolean) {\n this.urlOptions[option] = value;\n this.onOptionsChange();\n }\n\n onOptionsChange() {\n const urlParametersString = Object.getOwnPropertyNames(this.urlOptions)\n .reduce((filteredOptions: string[], option: string) => {\n if (this.urlOptions[option]) {\n filteredOptions.push(\n `${option}=${encodeURI(this.urlOptions[option])}`\n );\n }\n return filteredOptions;\n }, [])\n .join('&');\n\n this.shareLink.update(\n this.baseLink + (urlParametersString ? '?' : '') + urlParametersString\n );\n this.embedLink = this.getEmbedLink(urlParametersString);\n }\n\n copyText(text: string, element: HTMLElement) {\n const inputElement = document.createElement('input');\n document.body.appendChild(inputElement);\n inputElement.value = text;\n inputElement.select();\n document.execCommand('copy');\n document.body.removeChild(inputElement);\n element.focus();\n\n // Set text on copying\n element.innerText = 'COPIED';\n setTimeout(() => {\n element.innerText = 'COPY';\n }, 2000);\n }\n\n updateQRCode(link: string) {\n QRCode.toCanvas(this.qrcodeCanvas.nativeElement, link);\n }\n}\n","<div class=\"dialog\">\n <h1 mat-dialog-title>Create shareable link</h1>\n <div mat-dialog-content class=\"dialog-content\">\n <h5>URL options</h5>\n <div class=\"form-group mt-2\">\n <label for=\"eventDataFile\">Event data file (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"eventDataFile\"\n placeholder=\"assets/files/event_data/atlaseventdump2.json\"\n [value]=\"urlOptions.file\"\n (input)=\"setOptionValue('file', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <label for=\"eventDataType\">Event data type</label>\n <select\n class=\"form-control\"\n id=\"eventDataType\"\n (input)=\"setOptionValue('type', $event.target.value)\"\n >\n <option selected value=\"\">Select</option>\n <option value=\"jivexml\">JiveXML</option>\n <option value=\"json\">JSON</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"configuration\">Configuration (URL or path)</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"configuration\"\n placeholder=\"assets/files/config/phoenix-config.json\"\n [value]=\"urlOptions.config\"\n (input)=\"setOptionValue('config', $event.target.value)\"\n />\n </div>\n <div class=\"form-group\">\n <mat-checkbox\n [checked]=\"urlOptions.hideWidgets\"\n (change)=\"setOptionValue('hideWidgets', $event.checked)\"\n >\n Hide all widgets\n </mat-checkbox>\n </div>\n\n <h5>Share</h5>\n <div class=\"share-box my-2\">\n <span>{{ shareLink.value }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(shareLink.value, $event.target)\"\n >\n COPY\n </button>\n </div>\n <h5>Embed</h5>\n <div class=\"share-box my-2\">\n <span>{{ embedLink }}</span>\n <button\n class=\"share-box-copy\"\n (click)=\"copyText(embedLink, $event.target)\"\n >\n COPY\n </button>\n </div>\n <h5>QR Code</h5>\n <div class=\"qrcode d-flex justify-content-center\">\n <canvas #qrcodeCanvas></canvas>\n </div>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ShareLinkDialogComponent } from './share-link-dialog/share-link-dialog.component';\n\n@Component({\n selector: 'app-share-link',\n templateUrl: './share-link.component.html',\n styleUrls: ['./share-link.component.scss'],\n})\nexport class ShareLinkComponent {\n constructor(private dialog: MatDialog) {}\n\n openShareLinkDialog() {\n this.dialog.open(ShareLinkDialogComponent);\n }\n}\n","<app-menu-toggle\n tooltip=\"Create shareable link\"\n icon=\"share\"\n [active]=\"false\"\n (click)=\"openShareLinkDialog()\"\n>\n</app-menu-toggle>\n","import { Component, Input } from '@angular/core';\nimport {\n EventDataFormat,\n EventDataImportOption,\n} from '../../services/extras/event-data-import';\nimport { defaultAnimationPresets } from './animate-camera/animate-camera.component';\n\n@Component({\n selector: 'app-ui-menu',\n templateUrl: './ui-menu.component.html',\n styleUrls: ['./ui-menu.component.scss'],\n})\nexport class UiMenuComponent {\n @Input()\n eventDataImportOptions: EventDataImportOption[] =\n Object.values(EventDataFormat);\n @Input()\n animationPresets = defaultAnimationPresets;\n\n hideUIMenu: boolean = false;\n}\n","<div id=\"uiMenu\">\n <button\n id=\"hide-ui-menu\"\n [matTooltip]=\"hideUIMenu ? 'Show toolbar' : 'Hide toolbar'\"\n matTooltipPosition=\"above\"\n (click)=\"hideUIMenu = !hideUIMenu\"\n [ngClass]=\"{ 'ui-menu-hidden': hideUIMenu }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n <div id=\"optionsPanel\" [hidden]=\"hideUIMenu\">\n <!-- Event selector -->\n <app-event-selector></app-event-selector>\n\n <!-- Zoom in and zoom out controls -->\n <app-zoom-controls></app-zoom-controls>\n\n <app-view-options></app-view-options>\n\n <app-auto-rotate></app-auto-rotate>\n\n <!-- Dark theme toggle -->\n <app-dark-theme></app-dark-theme>\n\n <!-- Toggle for clipping geometries -->\n <app-object-clipping></app-object-clipping>\n\n <!-- Main view toggle -->\n <app-main-view-toggle></app-main-view-toggle>\n\n <!-- Toggle for overlay panel -->\n <app-overlay-view></app-overlay-view>\n\n <!-- Toggle for selected object panel -->\n <app-object-selection></app-object-selection>\n\n <!-- Info panel -->\n <app-info-panel></app-info-panel>\n\n <!-- Toggle for animating the event data -->\n <app-animate-event></app-animate-event>\n\n <!-- Toggle for animating camera through event -->\n <app-animate-camera\n [animationPresets]=\"animationPresets\"\n ></app-animate-camera>\n\n <!-- Toggle for collections info -->\n <app-collections-info></app-collections-info>\n\n <!-- Toggle for performance -->\n <app-performance-toggle></app-performance-toggle>\n\n <!-- Toggle for VR -->\n <app-vr-toggle></app-vr-toggle>\n\n <!-- Toggle for AR -->\n <app-ar-toggle></app-ar-toggle>\n\n <!-- Toggle for screenshot mode -->\n <app-ss-mode></app-ss-mode>\n\n <!-- Toggle for loading geometries modal-->\n <app-io-options\n [eventDataImportOptions]=\"eventDataImportOptions\"\n ></app-io-options>\n\n <!-- Toggle for shareable link constructor modal-->\n <app-share-link></app-share-link>\n\n <!-- Extra options -->\n <ng-content></ng-content>\n </div>\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { NestedTreeControl } from '@angular/cdk/tree';\nimport { MatTreeNestedDataSource } from '@angular/material/tree';\n\nexport class FileNode {\n name: string;\n url: string;\n children: { [key: string]: FileNode };\n\n constructor(name?: string) {\n this.name = name;\n }\n}\n\n@Component({\n selector: 'app-file-explorer',\n templateUrl: './file-explorer.component.html',\n styleUrls: ['./file-explorer.component.scss'],\n})\nexport class FileExplorerComponent implements OnChanges {\n @Input() rootFileNode: FileNode;\n @Output() onFileSelect: EventEmitter<string> = new EventEmitter<string>();\n\n treeControl = new NestedTreeControl<FileNode>(\n this.getSortedChildren.bind(this)\n );\n dataSource = new MatTreeNestedDataSource<FileNode>();\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.rootFileNode?.currentValue) {\n this.dataSource.data = this.getSortedChildren(\n changes.rootFileNode.currentValue\n );\n }\n }\n\n hasChildren = (_: number, node: FileNode) =>\n !!node.children && Object.keys(node.children).length > 0;\n\n onSelect(url: string) {\n this.onFileSelect.emit(url);\n }\n\n /**\n * Sort the FileNode's children with folders before files.\n * @param node FileNode whose children are to be sorted.\n * @returns An array of sorted FileNodes.\n */\n getSortedChildren(node: FileNode): FileNode[] {\n if (!node.children) {\n return [];\n }\n\n return Object.values(node.children).sort((a, b) =>\n !a.url && b.url ? -1 : 1\n );\n }\n}\n","<cdk-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <cdk-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <button\n mat-button\n mat-stroked-button\n class=\"tree-node-button\"\n (click)=\"onSelect(node.url)\"\n >\n <svg class=\"node-icon\">\n <use href=\"assets/icons/file.svg#file\"></use>\n </svg>\n {{ node.name }}\n </button>\n </cdk-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let node; when: hasChildren\"\n class=\"tree-node\"\n >\n <button\n mat-button\n cdkTreeNodeToggle\n class=\"tree-node-button\"\n [attr.aria-label]=\"'Toggle ' + node.name\"\n >\n <svg\n class=\"node-icon\"\n [class.node-icon-filled]=\"!treeControl.isExpanded(node)\"\n >\n <use href=\"assets/icons/folder.svg#folder\"></use>\n </svg>\n {{ node.name }}\n </button>\n <div [class.file-tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-ring-loader',\n templateUrl: './ring-loader.component.html',\n styleUrls: ['./ring-loader.component.scss'],\n})\nexport class RingLoaderComponent {}\n","<div class=\"ring\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n</div>\n","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { JiveXMLLoader } from 'phoenix-event-display';\nimport { EventDisplayService } from '../../../../services/event-display.service';\nimport { FileNode } from '../../../file-explorer/file-explorer.component';\nimport { EventDataExplorerDialogData } from '../event-data-explorer.component';\n\nconst supportFileTypes = ['json', 'xml'];\n\nexport type FileResponse = {\n name: string;\n url: string;\n};\n\n@Component({\n selector: 'app-event-data-explorer-dialog',\n templateUrl: './event-data-explorer-dialog.component.html',\n styleUrls: ['./event-data-explorer-dialog.component.scss'],\n})\nexport class EventDataExplorerDialogComponent {\n eventDataFileNode: FileNode;\n configFileNode: FileNode;\n loading = true;\n error = false;\n\n constructor(\n private eventDisplay: EventDisplayService,\n private dialogRef: MatDialogRef<EventDataExplorerDialogComponent>,\n @Inject(MAT_DIALOG_DATA) private dialogData: EventDataExplorerDialogData\n ) {\n // Event data\n this.makeRequest(this.dialogData.apiURL, 'json', (res: FileResponse[]) => {\n const filePaths = res.filter((file) =>\n supportFileTypes.includes(file.name.split('.').pop())\n );\n\n this.eventDataFileNode = this.buildFileNode(filePaths);\n });\n\n // Config\n this.makeRequest(\n `${this.dialogData.apiURL}?type=config`,\n 'json',\n (res: FileResponse[]) => {\n const filePaths = res.filter(\n (file) => file.name.split('.').pop() === 'json'\n );\n\n this.configFileNode = this.buildFileNode(filePaths);\n }\n );\n }\n\n loadEvent(file: string) {\n this.makeRequest(file, 'text', (eventData) => {\n switch (file.split('.').pop()) {\n case 'xml':\n this.loadJiveXMLEvent(eventData);\n break;\n case 'json':\n this.loadJSONEvent(eventData);\n break;\n }\n });\n }\n\n private loadJSONEvent(eventData: string) {\n this.eventDisplay.parsePhoenixEvents(JSON.parse(eventData));\n this.onClose();\n }\n\n private loadJiveXMLEvent(eventData: string) {\n const jiveXMLLoader = new JiveXMLLoader();\n jiveXMLLoader.process(eventData);\n const processedEventData = jiveXMLLoader.getEventData();\n this.eventDisplay.buildEventDataFromJSON(processedEventData);\n this.onClose();\n }\n\n loadConfig(file: string) {\n this.makeRequest(\n `${this.dialogData.apiURL}?type=config&f=${file}`,\n 'text',\n (config) => {\n const stateManager = this.eventDisplay.getStateManager();\n stateManager.loadStateFromJSON(JSON.parse(config));\n\n this.onClose();\n }\n );\n }\n\n // Helpers\n\n onClose() {\n this.dialogRef.close();\n }\n\n makeRequest(\n urlPath: string,\n responseType: 'json' | 'text',\n onData: (data: any) => void\n ) {\n this.loading = true;\n fetch(urlPath)\n .then((res) => res[responseType]())\n .then((data) => {\n onData(data);\n this.error = false;\n })\n .catch((error) => {\n console.error(error);\n this.error = true;\n })\n .finally(() => {\n this.loading = false;\n });\n }\n\n private buildFileNode(filePaths: FileResponse[]): FileNode {\n const rootNode = new FileNode();\n let fileNode = rootNode;\n\n for (const filePath of filePaths) {\n filePath.name.split('/').forEach((name) => {\n fileNode.children = fileNode.children ?? {};\n fileNode.children[name] = fileNode.children[name] ?? new FileNode(name);\n fileNode = fileNode.children[name];\n });\n\n fileNode.url = filePath.url;\n fileNode = rootNode;\n }\n\n return rootNode;\n }\n}\n","<div class=\"dialog\">\n <div class=\"d-flex\">\n <h1 mat-dialog-title>Event data from directory</h1>\n <app-ring-loader *ngIf=\"loading\"></app-ring-loader>\n </div>\n <div mat-dialog-content class=\"dialog-content\">\n <div *ngIf=\"error\">Error processing request.</div>\n <mat-tab-group\n *ngIf=\"!error\"\n mat-align-tabs=\"start\"\n animationDuration=\"0ms\"\n disableRipple\n color=\"transparent\"\n >\n <mat-tab label=\"Event data\">\n <div class=\"py-3\">\n <app-file-explorer\n [rootFileNode]=\"eventDataFileNode\"\n (onFileSelect)=\"loadEvent($event)\"\n ></app-file-explorer>\n </div>\n </mat-tab>\n <mat-tab label=\"Config\">\n <div class=\"py-3\">\n <app-file-explorer\n [rootFileNode]=\"configFileNode\"\n (onFileSelect)=\"loadConfig($event)\"\n ></app-file-explorer>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"onClose()\" cdkFocusInitial>Close</button>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { EventDataExplorerDialogComponent } from './event-data-explorer-dialog/event-data-explorer-dialog.component';\n\nexport type EventDataExplorerDialogData = {\n apiURL: string;\n};\n\n@Component({\n selector: 'app-event-data-explorer',\n templateUrl: './event-data-explorer.component.html',\n styleUrls: ['./event-data-explorer.component.scss'],\n})\nexport class EventDataExplorerComponent {\n @Input() apiURL: string;\n\n constructor(private dialog: MatDialog) {}\n\n openEventDataExplorerDialog() {\n this.dialog.open<\n EventDataExplorerDialogComponent,\n EventDataExplorerDialogData\n >(EventDataExplorerDialogComponent, {\n data: {\n apiURL: this.apiURL,\n },\n });\n }\n}\n","<app-menu-toggle\n tooltip=\"Browse events in data directory\"\n icon=\"server\"\n [active]=\"false\"\n (click)=\"openEventDataExplorerDialog()\"\n>\n</app-menu-toggle>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './loader.component.html',\n styleUrls: ['./loader.component.scss'],\n})\nexport class LoaderComponent {\n @Input() loaded = false;\n @Input() progress: number;\n}\n","<div\n class=\"loader-wrapper d-flex position-absolute flex-column justify-content-center align-items-center w-100 h-100 text-center\"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-experiment-link',\n templateUrl: './experiment-link.component.html',\n styleUrls: ['./experiment-link.component.scss'],\n})\nexport class ExperimentLinkComponent implements OnInit {\n private experimentLink: string;\n\n ngOnInit() {\n this.experimentLink = window.location.href.split('?')[0];\n }\n\n goToExperiment() {\n window.open(this.experimentLink, '_blank');\n }\n}\n","<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-embed-menu',\n templateUrl: './embed-menu.component.html',\n styleUrls: ['./embed-menu.component.scss'],\n})\nexport class EmbedMenuComponent {}\n","<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n","import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CdkTreeModule } from '@angular/cdk/tree';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { NgxSliderModule } from '@rp3e11/ngx-slider';\nimport { NavComponent } from './nav/nav.component';\nimport {\n PhoenixMenuComponent,\n PhoenixMenuItemComponent,\n ConfigSliderComponent,\n} from './phoenix-menu';\nimport {\n UiMenuComponent,\n CollectionsInfoComponent,\n MenuToggleComponent,\n CollectionsInfoOverlayComponent,\n IoOptionsComponent,\n IOOptionsDialogComponent,\n OverlayViewComponent,\n ObjectSelectionComponent,\n ObjectSelectionOverlayComponent,\n EventSelectorComponent,\n ObjectClippingComponent,\n DarkThemeComponent,\n AutoRotateComponent,\n ViewOptionsComponent,\n OverlayViewWindowComponent,\n OverlayComponent,\n ExperimentInfoComponent,\n InfoPanelComponent,\n InfoPanelOverlayComponent,\n MainViewToggleComponent,\n ZoomControlsComponent,\n TreeMenuComponent,\n TreeMenuItemComponent,\n AnimateCameraComponent,\n AnimateEventComponent,\n VrToggleComponent,\n ArToggleComponent,\n SSModeComponent,\n PerformanceToggleComponent,\n ShareLinkComponent,\n ShareLinkDialogComponent,\n EventDataExplorerComponent,\n EventDataExplorerDialogComponent,\n} from './ui-menu';\nimport { AttributePipe } from '../services/extras/attribute.pipe';\nimport { LoaderComponent } from './loader/loader.component';\nimport { EmbedMenuComponent } from './embed-menu/embed-menu.component';\nimport { ExperimentLinkComponent } from './embed-menu/experiment-link/experiment-link.component';\nimport { FileExplorerComponent } from './file-explorer/file-explorer.component';\nimport { RingLoaderComponent } from './ring-loader/ring-loader.component';\n\nconst PHOENIX_COMPONENTS: Type<any>[] = [\n NavComponent,\n UiMenuComponent,\n CollectionsInfoComponent,\n MenuToggleComponent,\n CollectionsInfoOverlayComponent,\n IoOptionsComponent,\n IOOptionsDialogComponent,\n OverlayViewComponent,\n AttributePipe,\n ObjectSelectionComponent,\n ObjectSelectionOverlayComponent,\n EventSelectorComponent,\n ObjectClippingComponent,\n DarkThemeComponent,\n AutoRotateComponent,\n ViewOptionsComponent,\n OverlayViewWindowComponent,\n OverlayComponent,\n ExperimentInfoComponent,\n InfoPanelComponent,\n InfoPanelOverlayComponent,\n MainViewToggleComponent,\n ZoomControlsComponent,\n TreeMenuComponent,\n TreeMenuItemComponent,\n PhoenixMenuComponent,\n PhoenixMenuItemComponent,\n ConfigSliderComponent,\n AnimateCameraComponent,\n AnimateEventComponent,\n VrToggleComponent,\n ArToggleComponent,\n SSModeComponent,\n PerformanceToggleComponent,\n LoaderComponent,\n ShareLinkComponent,\n ShareLinkDialogComponent,\n EmbedMenuComponent,\n ExperimentLinkComponent,\n EventDataExplorerComponent,\n EventDataExplorerDialogComponent,\n FileExplorerComponent,\n RingLoaderComponent,\n];\n\n@NgModule({\n declarations: PHOENIX_COMPONENTS,\n imports: [\n CommonModule,\n RouterModule,\n DragDropModule,\n MatDialogModule,\n MatButtonModule,\n MatTooltipModule,\n OverlayModule,\n MatMenuModule,\n MatSliderModule,\n MatSlideToggleModule,\n MatCheckboxModule,\n MatIconModule,\n NgxSliderModule,\n CdkTreeModule,\n MatTabsModule,\n ],\n entryComponents: [\n OverlayComponent,\n OverlayViewWindowComponent,\n IOOptionsDialogComponent,\n CollectionsInfoOverlayComponent,\n ObjectSelectionOverlayComponent,\n InfoPanelOverlayComponent,\n EventDataExplorerDialogComponent,\n ],\n exports: PHOENIX_COMPONENTS,\n})\nexport class PhoenixUIModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|