import { customElement, property, state } from "lit/decorators.js"; import { BaseElement } from "../../../hierarchy/BaseElement"; import { AbstractAnalysis, AbstractAreaAnalysis, PointAnalysis } from "@labir/core"; import { css, html, nothing, PropertyValues } from "lit"; import { t } from "i18next"; import { T } from "../../../translations/Languages"; import { consume } from "@lit/context"; import { interactiveAnalysisContext } from "../../../utils/context"; @customElement("file-analysis-overview-row") export class FileAnalysisRow extends BaseElement { @property() public analysis!: AbstractAnalysis; @consume({ context: interactiveAnalysisContext, subscribe: true }) interactiveanalysis: boolean = false; @state() protected value: { min: number | undefined, max: number | undefined, avg: number | undefined } = { min: undefined, max: undefined, avg: undefined }; @state() protected graph: { min: boolean, max: boolean, avg: boolean } = { min: false, max: false, avg: false } @state() protected may: { min: boolean, max: boolean, avg: boolean } = { min: false, max: false, avg: false } @state() protected dimension?: string; @state() protected color?: string; @property({ type: Boolean, reflect: true, attribute: true }) protected selected: boolean = false; @state() protected name?: string; protected updated(_changedProperties: PropertyValues): void { super.updated(_changedProperties); // Whenever the analysis changes, update the table row if (_changedProperties.has("analysis")) { const oldAnalysis = _changedProperties.get("analysis") as AbstractAnalysis; // Remove listeners if (oldAnalysis) { oldAnalysis.onDeselected.delete(this.UUID); oldAnalysis.onSelected.delete(this.UUID); oldAnalysis.onValues.delete(this.UUID); oldAnalysis.onMoveOrResize.delete(this.UUID); oldAnalysis.graph.onGraphActivation.delete(this.UUID); oldAnalysis.onSetInitialColor.delete(this.UUID); oldAnalysis.onSetName.delete(this.UUID); } const newAnalysis = this.analysis; // Update the name this.name = newAnalysis.name; // Update activation this.selected = newAnalysis.selected; // Update the color this.color = newAnalysis.initialColor; const formatDimension = (analysis: AbstractAnalysis) => { if ( analysis instanceof AbstractAreaAnalysis ) { return newAnalysis.width + "x" + newAnalysis.height; } return "1x1"; } // Update dimensions this.dimension = formatDimension( newAnalysis ); // newAnalysis.width + "x" + newAnalysis.height; // Update values this.value = { min: newAnalysis.min, max: newAnalysis.max, avg: newAnalysis.avg } // Update may if (newAnalysis.file.timeline.isSequence) { this.may = newAnalysis instanceof PointAnalysis ? { avg: true, min: false, max: false } : { avg: true, min: true, max: true }; } else { this.may = { avg: false, min: false, max: false }; } // Update graph this.graph = { min: newAnalysis.graph.state.MIN, max: newAnalysis.graph.state.MAX, avg: newAnalysis.graph.state.AVG } // Listen to resize or move newAnalysis.onSerializableChange.set(this.UUID, (analysis) => { this.dimension = formatDimension(analysis);// analysis.width + "x" + analysis.height; }); // Listen to values newAnalysis.onValues.set(this.UUID, (min, max, avg) => { this.value = { min, max, avg }; }); // Listen to graph activation newAnalysis.graph.onGraphActivation.set(this.UUID, (min, max, avg) => { this.graph = { min, max, avg }; }); // Listen to selection newAnalysis.onSelected.set(this.UUID, () => { this.selected = true; }); newAnalysis.onDeselected.set(this.UUID, () => { this.selected = false; }); // Listen to initialColor newAnalysis.onSetInitialColor.set(this.UUID, (value) => { this.color = value; }); // Listen to the name changes newAnalysis.onSetName.set(this.UUID, (value) => { this.name = value; }); } } protected valueOrNothing(value: number | undefined): string { return value === undefined ? "-" : value.toFixed(2) + " °C"; } protected renderCell( value: number | undefined, may: boolean, active: boolean, clickFn: () => void ): unknown { return html`