raain-app 3.2.1 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raain-app.mjs","sources":["../../src/core/shared/storage.service.ts","../../src/core/shared/raain-map/raain-map.component.ts","../../src/core/shared/raain-map/raain-map.component.html","../../src/core/shared/raain-compare/raain-compare.component.ts","../../src/core/shared/raain-compare/raain-compare.component.html","../../src/core/shared/xytype.ts","../../src/core/shared/raain-configuration/raain-configuration.component.ts","../../src/core/shared/raain-configuration/raain-configuration.component.html","../../src/core/shared/raain-date-focus/raain-date-focus.component.ts","../../src/core/shared/raain-date-focus/raain-date-focus.component.html","../../src/core/shared/raain-date-dynamic/raain-date-dynamic.component.ts","../../src/core/shared/raain-date-dynamic/raain-date-dynamic.component.html","../../src/core/shared/raain-speed/raain-speed.component.ts","../../src/core/shared/raain-speed/raain-speed.component.html","../../src/core/shared/raain-compare-stack/raain-compare-stack.component.ts","../../src/core/shared/raain-compare-stack/raain-compare-stack.component.html","../../src/core/shared/raain-globe/raain-globe.component.ts","../../src/core/shared/raain-globe/raain-globe.component.html","../../src/core/shared/tools/CompareManager.ts","../../src/core/shared/tools/FrameSet.ts","../../src/core/shared/tools/GaugeNodeFilter.ts","../../src/core/shared/tools/RefreshManager.ts","../../src/core/shared/tools/DateRangeTools.ts","../../src/core/shared/fidj-storage.model.ts","../../src/core/shared/profile.service.ts","../../src/core/shared/cumulative-selector/cumulative-selector.component.ts","../../src/core/shared/cumulative-selector/cumulative-selector.component.html","../../src/core/shared/raain-details/raain-details.component.ts","../../src/core/shared/raain-details/raain-details.component.html","../../src/core/shared/cache.service.ts","../../src/core/shared/radar.service.ts","../../src/core/shared/shared.const.ts","../../src/core/shared/shared.pipe.ts","../../src/core/shared/profile-icon.directive.ts","../../src/core/shared/pipes.module.ts","../../src/core/shared/shared.module.ts","../../src/core/shared/raain-app.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {LocalStorage} from 'fidj-angular';\n\n@Injectable()\nexport class Storage extends LocalStorage {\n constructor() {\n super('raain-app.');\n }\n}\n","import {\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {CartesianTools} from 'raain-model';\nimport {LatLngBounds} from 'leaflet';\nimport {\n CartesianMapValue,\n ChartScaleColors,\n ElementsFactory,\n FrameContainer,\n MapElement,\n MapLatLng,\n RaainDivIcon,\n ScaleElement,\n ScaleElementInput,\n TimeframeContainers,\n} from 'raain-ui';\nimport {Storage} from '../storage.service';\n\n@Component({\n selector: 'raain-map',\n templateUrl: './raain-map.component.html',\n styleUrls: ['./raain-map.component.scss'],\n})\nexport class RaainMapComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public coordinates?: MapLatLng;\n @Input()\n public markers?: {\n gauges?: MapLatLng[];\n selectedGauges?: MapLatLng[];\n pixels?: MapLatLng[];\n borders?: MapLatLng[];\n speeds?: MapLatLng[];\n gaugesInCompare?: MapLatLng[];\n pixelsSolution?: MapLatLng[];\n };\n @Input()\n public timeframeContainers?: TimeframeContainers;\n @Input()\n public autoplay = false;\n @Input()\n public showMarkers = true;\n @Input()\n public showSpeedMarkers = true;\n @Input()\n public showVisiblePixelMarkers = false;\n @Input()\n public showNavigation = true;\n @Input()\n public showDateRange = true;\n @Input()\n public cumulativeDurationInMinutes = 60;\n @Input()\n public scaleLabel = 'mm';\n @Input()\n public currentHeight: number;\n\n public showMapSettings = false;\n public currentWidth: number;\n\n @Input()\n public timeframeDates: Date[] = [];\n @Input()\n public defaultDate?: Date;\n\n @Input()\n public sumValues?: CartesianMapValue[];\n @Input()\n public sumFn?: (cartesianMapValues: CartesianMapValue[]) => number;\n public sumResult: string;\n\n @Output()\n public selectedMarker = new EventEmitter<MapLatLng>();\n\n @Output()\n public changedDate = new EventEmitter<Date>();\n\n @Output()\n public changedSum = new EventEmitter<string>();\n\n public alpha: number;\n public mcText;\n public nextDate: Date;\n public possibleNames: string[];\n public possibleDates: Date[];\n public dateToShow: Date;\n public dateToShowAsString: string;\n public timeframeNameToShow: string;\n public pixelsCount: number;\n public cumulativeDateFrom: Date;\n protected currentFrameContainer: FrameContainer;\n protected cartesianTools: CartesianTools;\n @ViewChild('primaryMap')\n protected mapDivRef: ElementRef;\n @ViewChild('canvasScale')\n protected scaleCanvasRef: ElementRef;\n private visiblePixelMarkers: MapLatLng[] = [];\n private mapElement: MapElement;\n private scaleElement: ScaleElement;\n\n private onSizeChanged;\n private created;\n private readonly raainDivIcons: {\n gauges: RaainDivIcon;\n selectedGauges: RaainDivIcon;\n pixels: RaainDivIcon;\n borders: RaainDivIcon;\n speeds: RaainDivIcon;\n gaugesInCompare: RaainDivIcon;\n pixelsSolution: RaainDivIcon;\n };\n\n constructor(\n private readonly ngZone: NgZone,\n private readonly storage: Storage,\n private readonly cdr: ChangeDetectorRef\n ) {\n this.delete();\n\n this.cartesianTools = new CartesianTools();\n this.pixelsCount = 1;\n\n const iconSize: [number, number] = [40, 40]; // size of the icon\n const iconAnchor: [number, number] = [20, 20]; // point of the icon which will correspond to marker's location\n const pixelSize: [number, number] = [41, 41];\n const pixelAnchor: [number, number] = [20, 20];\n const popupAnchor: [number, number] = [0, -20]; // point from which the popup should open relative to the iconAnchor\n\n this.raainDivIcons = {\n gauges: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n }),\n gaugesInCompare: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio-diag.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n selectedGauges: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio-diag-select.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n pixels: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-rain.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n pixelsSolution: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-rain.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize: pixelSize,\n iconAnchor: pixelAnchor,\n popupAnchor,\n }),\n borders: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-shadow.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n speeds: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-speed.svg\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n };\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n public showTimeframe(force = false) {\n if (\n !this.dateToShowAsString ||\n (!force && this.areDatesEqual(this.dateToShowAsString, this.dateToShow))\n ) {\n return;\n }\n\n this.dateToShow = new Date(this.dateToShowAsString);\n this.changedDate.emit(this.dateToShow);\n }\n\n public next() {\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n const index = this.getDateToShowIndex();\n this.dateToShow =\n index + 1 < this.possibleDates.length\n ? this.possibleDates[index + 1]\n : this.possibleDates[0];\n this.dateToShowAsString = this.dateToShow.toISOString();\n\n this.showTimeframe(true);\n if (this.autoplay) {\n window.setTimeout(() => this.next(), 2000);\n }\n }\n\n public previous() {\n this.stop();\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n const index = this.getDateToShowIndex();\n this.dateToShow = index > 0 ? this.possibleDates[index - 1] : this.possibleDates[0];\n this.dateToShowAsString = this.dateToShow.toISOString();\n\n this.showTimeframe(true);\n }\n\n public play() {\n this.autoplay = true;\n this.next();\n }\n\n public stop() {\n this.autoplay = false;\n }\n\n public changeShowMarkers() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n if (this.showMarkers) {\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n } else {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n }\n }\n\n public changeShowSpeedMarkers() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n // Rebuild markers with current visibility settings\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n public changeAlpha() {\n this.storage.set('raain-map-alpha', this.alpha);\n if (!this.mapElement?.mapLeaflet) {\n return;\n }\n\n this.mapElement.alpha = 0.3 + this.alpha * 0.7;\n this.mapElement.mapLeaflet.eachLayer((layer: any) => {\n if (layer._container?.style) {\n layer._container.style.filter = `brightness(${(10 - this.alpha * 10) * 10}%)`; // invert(1) ?\n }\n });\n }\n\n public toggleMapSettings() {\n this.showMapSettings = !this.showMapSettings;\n }\n\n private create() {\n const created = this.created;\n if (created) {\n return;\n }\n this.created = true;\n\n const {allMarkers} = this.buildMarkersConfig();\n\n const factory = new ElementsFactory(this.coordinates, true);\n this.createScale(factory, this.scaleLabel);\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const createdOutside = this.created;\n if (!createdOutside) {\n return;\n }\n\n this.mapElement = factory.createMap(this.mapDivRef.nativeElement, {\n timeframeContainers: this.timeframeContainers,\n markers: allMarkers,\n });\n\n this.changeAlpha();\n\n this.mapElement.mapLeaflet?.on('mousemove', (evt) => this.onMapMouseMove(evt));\n this.mapElement.mapLeaflet?.on('zoom', (evt) => this.onZoom(evt));\n this.mapElement.mapLeaflet?.on('moveend', (evt) => this.onMoveEnd(evt));\n const bounds: LatLngBounds = this.mapElement.mapLeaflet.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n\n this.bindMarkersClickEvents(this.mapElement.markersProduced);\n this.onSizeChanged = () => this.updateLayerDimensions();\n this.updateMapSize();\n this.changeNavigation(this.defaultDate);\n }, 100);\n });\n }\n\n private delete() {\n this.mapElement?.mapLeaflet?.remove();\n this.mapElement = undefined;\n this.mcText = '';\n this.nextDate = undefined;\n this.possibleNames = [];\n this.possibleDates = [];\n this.timeframeNameToShow = undefined;\n this.dateToShow = undefined;\n this.dateToShowAsString = undefined;\n this.cumulativeDateFrom = undefined;\n this.onSizeChanged = () => {};\n this.currentFrameContainer = null;\n\n this.created = false;\n this.alpha = this.storage.get('raain-map-alpha', 0.4);\n }\n\n private change(changes: SimpleChanges) {\n let possibleNewDefaultDate: Date;\n\n if (changes.defaultDate) {\n if (\n this.areDatesEqual(\n changes.defaultDate.currentValue,\n changes.defaultDate.previousValue\n )\n ) {\n return;\n }\n possibleNewDefaultDate = this.defaultDate;\n }\n\n if (changes.markers && this.mapElement?.markersLayer) {\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n if (\n changes.markers &&\n this.markers?.selectedGauges &&\n this.markers?.selectedGauges.length === 1\n ) {\n const selectedGauge = this.markers.selectedGauges[0];\n this.mapElement?.mapLeaflet?.setView(selectedGauge, 10);\n }\n\n if (this.mapElement && changes.timeframeContainers) {\n this.updateTimeframe();\n }\n\n if (this.mapElement?.compositeLayer && changes.sumValues) {\n this.updateSum();\n }\n\n if (this.mapElement?.compositeLayer && changes.showVisiblePixelMarkers) {\n const drawer = this.mapElement.compositeLayer.getFirstDrawer();\n this.updateVisiblePixelMarkers(drawer);\n }\n\n this.changeNavigation(possibleNewDefaultDate);\n }\n\n private updateSum() {\n if (!this.sumValues || !this.sumFn) {\n return;\n }\n\n const drawer = this.mapElement.compositeLayer.getFirstDrawer();\n const sumOfPixels: number = drawer?.getExecOfWindowPoints(this.sumValues, this.sumFn) ?? -1;\n\n if (sumOfPixels >= 0 && this.pixelsCount > 0) {\n const average = Math.round((sumOfPixels / this.pixelsCount) * 100) / 100;\n this.sumResult = `${Math.round(sumOfPixels)}mm (avg of ${average}mm for ${Math.round(this.pixelsCount)} pixels)`;\n } else {\n this.sumResult = 'NA';\n }\n this.changedSum.emit(this.sumResult);\n\n this.updateVisiblePixelMarkers(drawer);\n }\n\n private updateVisiblePixelMarkers(drawer: any) {\n if (!this.showVisiblePixelMarkers || !drawer || !this.sumValues) {\n if (this.visiblePixelMarkers.length > 0) {\n this.visiblePixelMarkers = [];\n this.refreshMarkersLayer();\n }\n return;\n }\n\n // Extract visible pixel positions\n const visiblePixels: MapLatLng[] =\n drawer.getExecOfWindowPoints(this.sumValues, (values: CartesianMapValue[]) =>\n values.map((v) => ({\n lat: (v.lat + v.lat2) / 2,\n lng: (v.lng + v.lng2) / 2,\n value: v.value,\n }))\n ) ?? [];\n\n this.visiblePixelMarkers = visiblePixels;\n this.refreshMarkersLayer();\n }\n\n private refreshMarkersLayer() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n private changeNavigation(defaultDate?: Date) {\n // update possible names\n if (this.timeframeContainers?.containers?.length) {\n this.possibleNames = [];\n this.timeframeContainers.containers.forEach((c) => {\n if (this.possibleNames.indexOf(c.name) < 0) {\n this.possibleNames.push(c.name);\n }\n });\n this.timeframeNameToShow = this.possibleNames.length > 0 ? this.possibleNames[0] : null;\n }\n\n // update possible dates\n this.possibleDates = this.timeframeDates;\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n // update dateToShow\n if (\n defaultDate &&\n this.possibleDates.filter((d) => this.areDatesEqual(d, defaultDate)).length === 1\n ) {\n this.dateToShow = defaultDate;\n }\n if (\n !this.dateToShow &&\n this.possibleDates.length > 0 &&\n this.possibleDates.filter((d) => this.areDatesEqual(d, this.dateToShow)).length !== 1\n ) {\n this.dateToShow = this.possibleDates[0];\n }\n\n let firstInit = false;\n if (!this.dateToShowAsString) {\n firstInit = true;\n }\n this.dateToShowAsString = this.dateToShow.toISOString();\n this.cumulativeDateFrom = new Date(this.dateToShow);\n\n const durationInMs = this.cumulativeDurationInMinutes * 60 * 1000;\n this.cumulativeDateFrom.setTime(this.cumulativeDateFrom.getTime() - durationInMs);\n\n if (firstInit) {\n this.showTimeframe(true);\n }\n }\n\n private getDateToShowIndex(): number {\n let index = 0;\n for (const date of this.possibleDates) {\n if (this.areDateISOEqual(this.dateToShowAsString, date)) {\n break;\n }\n index++;\n }\n return index;\n }\n\n private onZoom(evt: any) {\n const map = evt.target;\n const bounds: LatLngBounds = map.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n this.updateSum();\n }\n\n private onMoveEnd(evt: any) {\n const map = evt.target;\n const bounds: LatLngBounds = map.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n this.updateSum();\n }\n\n private handleAvailablePixels(\n availablePixels: {width: number; height: number; totalPixels: number},\n bounds: any,\n zoom: number\n ) {\n // Update your component properties or perform calculations\n this.currentWidth = availablePixels.width;\n this.currentHeight = availablePixels.height;\n\n // You can also calculate pixel density or other metrics here\n // const pixelDensity = this.calculatePixelDensity(bounds, availablePixels, zoom);\n // console.log('Pixel density:', pixelDensity);\n }\n\n private calculatePixelDensity(\n bounds: any,\n availablePixels: {width: number; height: number},\n zoom: number\n ) {\n // Calculate how many meters per pixel (approximate)\n const earthCircumference = 40075016.686; // meters\n const metersPerPixel =\n (earthCircumference * Math.cos((bounds.getCenter().lat * Math.PI) / 180)) /\n Math.pow(2, zoom + 8);\n\n return {\n metersPerPixel,\n pixelsPerMeter: 1 / metersPerPixel,\n totalVisibleArea: availablePixels.width * availablePixels.height,\n };\n }\n\n private onMapMouseMove(evt: {latlng: {lat: number; lng: number}}): void {\n const lat: string = evt.latlng.lat.toFixed(3);\n const lng: string = evt.latlng.lng.toFixed(3);\n\n let value = NaN;\n let valueLat = NaN,\n valueLng = NaN,\n valueLat2 = NaN,\n valueLng2 = NaN;\n if (this.currentFrameContainer) {\n const valueSelected = (this.currentFrameContainer.values as CartesianMapValue[]).filter(\n (v: CartesianMapValue) => {\n return (\n v.lat <= evt.latlng.lat &&\n evt.latlng.lat < v.lat2 &&\n v.lng <= evt.latlng.lng &&\n evt.latlng.lng < v.lng2\n );\n }\n );\n\n if (valueSelected.length === 1) {\n value = this.roundTo3Decimals(valueSelected[0].value);\n valueLat = this.roundTo3Decimals(valueSelected[0].lat);\n valueLng = this.roundTo3Decimals(valueSelected[0].lng);\n valueLat2 = this.roundTo3Decimals(valueSelected[0].lat2);\n valueLng2 = this.roundTo3Decimals(valueSelected[0].lng2);\n } else {\n // console.warn('valueSelected issue ?', valueSelected);\n }\n }\n\n this.ngZone.run(() => {\n // this.mcText = `Latitude: ${lat} Longitude: ${lng} \n // Value: [${valueLat} ${valueLng} | ${valueLat2} ${valueLng2}] ${value}`;\n this.mcText = `Latitude: ${lat} Longitude: ${lng} Value: ${value}`;\n this.cdr.markForCheck();\n });\n }\n\n private onMapClick(evt: any): void {\n if (!this.markers?.gauges?.length) {\n return;\n }\n\n let selectedGauge: MapLatLng;\n for (const gauge of this.markers.gauges) {\n if (gauge.id === evt?.target?.options?.alt) {\n selectedGauge = gauge;\n break;\n }\n }\n\n if (selectedGauge) {\n this.markers.selectedGauges = [selectedGauge];\n this.selectedMarker.emit(\n new MapLatLng(\n selectedGauge.lat,\n selectedGauge.lng,\n undefined,\n selectedGauge.id,\n selectedGauge.name,\n selectedGauge.value\n )\n );\n } else {\n this.selectedMarker.emit(\n new MapLatLng(evt.latlng?.lat, evt.latlng?.lng, undefined, evt.id, evt.name)\n );\n }\n\n this.change({markers: ['changed']} as any);\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.mapDivRef.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 21;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n\n private updateTimeframe() {\n if (\n this.timeframeContainers?.containers?.length &&\n this.timeframeContainers?.containers[0]?.timeframe?.length\n ) {\n this.mapElement.updateMapTimeframe(this.timeframeContainers);\n this.currentFrameContainer = this.timeframeContainers?.containers[0]?.timeframe[0];\n }\n\n this.changeAlpha();\n }\n\n private createScale(factory: ElementsFactory, label: string) {\n this.deleteScale();\n if (!this.scaleCanvasRef?.nativeElement) {\n return;\n }\n\n const entries = Object.entries(ChartScaleColors);\n entries.sort((a, b) => parseFloat(a[0]) - parseFloat(b[0]));\n const sortedMap = new Map(entries);\n const sortedArray = [...sortedMap.entries()];\n const scaleColors = sortedArray.map((entry) => {\n return {color: entry[1]};\n });\n const scaleLabels = sortedArray.map((entry) => entry[0]);\n this.scaleElement = factory.createScale(\n this.scaleCanvasRef.nativeElement,\n new ScaleElementInput(scaleColors, scaleLabels, label)\n );\n }\n\n private deleteScale() {\n if (this.scaleElement) {\n this.scaleElement?.chart?.destroy();\n }\n }\n\n /**\n * Builds the markers configuration array for the map\n * @returns Array of marker configurations with icons and positions\n */\n private buildMarkersConfig() {\n const allMarkers: {iconsLatLng: MapLatLng[]; raainDivIcon: RaainDivIcon}[] = [\n {iconsLatLng: this.markers?.gauges ?? [], raainDivIcon: this.raainDivIcons.gauges},\n {\n iconsLatLng: this.markers?.selectedGauges ?? [],\n raainDivIcon: this.raainDivIcons.selectedGauges,\n },\n {\n iconsLatLng: this.markers?.gaugesInCompare ?? [],\n raainDivIcon: this.raainDivIcons.gaugesInCompare,\n },\n {iconsLatLng: this.markers?.pixels ?? [], raainDivIcon: this.raainDivIcons.pixels},\n {\n iconsLatLng: this.markers?.pixelsSolution ?? [],\n raainDivIcon: this.raainDivIcons.pixelsSolution,\n },\n // {iconsLatLng: this.markers?.borders, raainDivIcon: this.raainDivIcons.borders},\n ];\n\n if (this.showVisiblePixelMarkers && this.visiblePixelMarkers.length > 0) {\n allMarkers.push({\n iconsLatLng: this.visiblePixelMarkers,\n raainDivIcon: this.raainDivIcons.pixelsSolution,\n });\n }\n\n if (this.showSpeedMarkers) {\n for (const marker of this.markers?.speeds ?? []) {\n // Calculate dynamic size based on speed (marker.value is in m/s)\n // Base size: 20px, scale up with speed (typical range: 1-20 m/s)\n const speedInMetersPerSec = marker.value ?? 5;\n const minSize = 20;\n const maxSize = 60;\n const minSpeed = 1;\n const maxSpeed = 20;\n\n // Linear interpolation: size increases with speed\n const normalizedSpeed = Math.max(minSpeed, Math.min(maxSpeed, speedInMetersPerSec));\n const size =\n minSize +\n ((normalizedSpeed - minSpeed) / (maxSpeed - minSpeed)) * (maxSize - minSize);\n const iconSize = Math.round(size);\n\n allMarkers.push({\n iconsLatLng: [marker],\n raainDivIcon: new RaainDivIcon({\n html: this.raainDivIcons.speeds.options.html,\n width: iconSize,\n height: iconSize,\n iconAnchor: [iconSize / 2, iconSize / 2], // Center the icon\n popupAnchor: this.raainDivIcons.speeds.options.popupAnchor,\n rotationAngle: marker.alt, // Use alt property for azimuth/direction\n className: this.raainDivIcons.speeds.options.className,\n }),\n });\n }\n }\n return {allMarkers};\n }\n\n /**\n * Compare two dates for equality using their timestamps\n * @param date1 First date (Date or string)\n * @param date2 Second date (Date or string)\n * @returns true if dates are equal\n */\n private areDatesEqual(date1: Date | string, date2: Date | string): boolean {\n if (!date1 || !date2) {\n return false;\n }\n const timestamp1 = typeof date1 === 'string' ? new Date(date1).getTime() : date1.getTime();\n const timestamp2 = typeof date2 === 'string' ? new Date(date2).getTime() : date2.getTime();\n return timestamp1 === timestamp2;\n }\n\n /**\n * Compare an ISO date string with a Date object (comparing first 19 characters)\n * @param dateISO ISO date string\n * @param date Date object\n * @returns true if dates match (up to seconds precision)\n */\n private areDateISOEqual(dateISO: string, date: Date): boolean {\n if (!dateISO || !date) {\n return false;\n }\n return dateISO.substring(0, 19) === date.toISOString().substring(0, 19);\n }\n\n /**\n * Bind click event handlers to markers\n * @param markers Array of marker objects to bind events to\n */\n private bindMarkersClickEvents(markers: any[]): void {\n if (!markers) {\n return;\n }\n markers.forEach((m) => m.on('click', (evt) => this.onMapClick(evt)));\n }\n\n /**\n * Round a number to 3 decimal places\n * @param value Number to round\n * @returns Rounded number\n */\n private roundTo3Decimals(value: number): number {\n return Math.round(value * 1000) / 1000;\n }\n\n /**\n * Update layer dimensions and invalidate map size\n */\n private updateLayerDimensions(): void {\n if (!this.mapElement) {\n return;\n }\n this.mapElement.markersLayer?.setCurrentWidth(this.currentWidth);\n this.mapElement.markersLayer?.setCurrentHeight(this.currentHeight);\n this.mapElement.compositeLayer?.setCurrentWidth(this.currentWidth);\n this.mapElement.compositeLayer?.setCurrentHeight(this.currentHeight);\n this.mapElement.mapLeaflet?.invalidateSize({animate: true});\n }\n}\n","<ion-grid>\n\n <ion-row class=\"ion-align-items-center ion-justify-content-center\" id=\"map-nav-row\">\n <ion-icon (click)=\"previous()\" *ngIf=\"showNavigation\" class=\"nav-icon\" color=\"medium\"\n name=\"chevron-back-circle\"></ion-icon>\n\n <ion-label *ngIf=\"showDateRange\" class=\"period-bracket\">[</ion-label>\n\n <ion-label *ngIf=\"showDateRange && timeframeContainers?.containers?.length\" class=\"date-label\">\n {{ cumulativeDateFrom | date:'yyyy-MM-dd HH:mm' }}\n </ion-label>\n\n <ion-label *ngIf=\"showDateRange\"> </ion-label>\n\n <ion-select (ionDismiss)=\"showTimeframe()\" *ngIf=\"timeframeContainers?.containers?.length\"\n [(ngModel)]=\"dateToShowAsString\" interface=\"popover\"\n placeholder=\"Period\" value=\"{{dateToShowAsString}}\">\n <ion-select-option *ngFor=\"let dateToSelect of possibleDates\"\n value=\"{{dateToSelect.toISOString()}}\">\n {{ dateToSelect | date:'yyyy-MM-dd HH:mm' }}\n </ion-select-option>\n </ion-select>\n\n <ion-label *ngIf=\"showDateRange\" class=\"period-bracket\">[</ion-label>\n\n <ion-icon (click)=\"next()\" *ngIf=\"showNavigation\" class=\"nav-icon\" color=\"medium\"\n name=\"chevron-forward-circle\"></ion-icon>\n </ion-row>\n\n <ion-row>\n <ion-col size-lg=\"10\" size-xs=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"map-container\">\n <div #primaryMap id=\"map-div\"></div>\n </div>\n </ion-col>\n <ion-col class=\"ion-hide-xl-down\" size-lg=\"2\">\n <div [style.height.px]=\"currentHeight\" [style.width.px]=\"60\">\n <canvas #canvasScale></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row class=\"ion-align-items-center\">\n <ion-col size-xs=\"3\">\n <ion-button (click)=\"toggleMapSettings()\" color=\"medium\" fill=\"clear\" id=\"map-settings-toggle\">\n <ion-icon name=\"map-outline\" slot=\"start\"></ion-icon>\n <ion-icon [name]=\"showMapSettings ? 'chevron-down' : 'chevron-forward'\" slot=\"end\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-hide-sm-down\" size-sm=\"7\">\n <span [innerHTML]=\"mcText\"></span>\n </ion-col>\n\n </ion-row>\n\n <ion-row *ngIf=\"showMapSettings\" id=\"map-settings\">\n <ion-col size=\"12\">\n <ion-list lines=\"none\">\n <ion-item>\n <ion-label>Opacity</ion-label>\n <ion-range (ionChange)=\"changeAlpha()\" [(ngModel)]=\"alpha\" [max]=\"1\" [min]=\"0.2\" [snaps]=\"true\"\n [step]=\"0.2\" [ticks]=\"true\" class=\"settings-range\" color=\"medium\" slot=\"end\"></ion-range>\n </ion-item>\n <ion-item>\n <ion-label>Gauges</ion-label>\n <ion-toggle (ionChange)=\"changeShowMarkers()\" [(ngModel)]=\"showMarkers\" [checked]=\"showMarkers\"\n color=\"medium\" slot=\"end\"></ion-toggle>\n </ion-item>\n <ion-item>\n <ion-label>Speeds</ion-label>\n <ion-toggle (ionChange)=\"changeShowSpeedMarkers()\" [(ngModel)]=\"showSpeedMarkers\"\n [checked]=\"showSpeedMarkers\" color=\"medium\" slot=\"end\"></ion-toggle>\n </ion-item>\n </ion-list>\n </ion-col>\n </ion-row>\n\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {CompareElement, CompareElementInput, ElementsFactory} from 'raain-ui';\nimport {XYType} from '../xytype';\n\n@Component({\n selector: 'raain-compare',\n templateUrl: './raain-compare.component.html',\n styleUrls: ['./raain-compare.component.scss'],\n})\nexport class RaainCompareComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: Array<XYType>;\n\n @Input()\n public pointMax: XYType;\n\n @Input()\n public remarks: string;\n\n @Input()\n public compareIndex: number;\n\n @Input()\n public currentHeight: number;\n\n @Input()\n public currentWidth: number;\n\n @Output()\n public selectedPoint = new EventEmitter<{point: XYType; compareIndex: number}>();\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private compareElement: CompareElement;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n protected onClick(point: XYType): void {\n this.selectedPoint.emit({point, compareIndex: this.compareIndex});\n }\n\n protected changeData(newData: XYType[], newMaxLine?: XYType[]) {\n let changed = false;\n const dataset = this.compareElement?.chart?.data?.datasets[0];\n if (dataset) {\n dataset.data = newData;\n changed = true;\n }\n\n const line = this.compareElement?.chart?.data?.datasets[1];\n if (line) {\n line.data = newMaxLine;\n changed = true;\n }\n\n if (changed) {\n this.compareElement?.chart?.update();\n }\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n const factory = new ElementsFactory();\n this.compareElement = factory.createCompare(\n this.canvasElement.nativeElement,\n new CompareElementInput(\n this.points.map((p) => {\n return {x: p.x, y: p.y, r: p.r, name: p.name, id: p.id};\n }),\n this.pointMax,\n this.onClick.bind(this)\n )\n );\n }\n\n private delete() {\n if (this.compareElement) {\n this.compareElement?.chart?.destroy();\n }\n this.created = false;\n }\n\n private change(changes: SimpleChanges) {\n if (changes.points) {\n this.changeData(this.points, [{x: 0, y: 0}, this.pointMax]);\n }\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<div id=\"canvas-container\">\n <h1 *ngIf=\"remarks\">{{ remarks }}</h1>\n\n <!-- [style.height.px]=\"currentHeight\" [style.width.px]=\"currentWidth\" [width]=\"currentWidth\" [height]=\"currentHeight\"-->\n <canvas #canvasElement></canvas>\n</div>\n","export class XYType {\n constructor(\n public x: number,\n public y: number,\n public r?: number,\n public name?: string,\n public id?: string\n ) {}\n}\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n ChartScaleColors,\n ConfigurationElement,\n ConfigurationElementInput,\n ElementsFactory,\n Tools,\n} from 'raain-ui';\nimport {XYType} from '../xytype';\n\n@Component({\n selector: 'raain-configuration',\n templateUrl: './raain-configuration.component.html',\n styleUrls: ['./raain-configuration.component.scss'],\n})\nexport class RaainConfigurationComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: XYType[];\n\n @Output()\n public changedPoints = new EventEmitter<XYType[]>();\n\n @Input()\n public currentHeight: number;\n\n @Input()\n public currentWidth: number;\n\n @Input()\n public minPoint: XYType = {x: 0, y: 0};\n\n @Input()\n public maxPoint: XYType = {x: 300, y: 100};\n\n @Input()\n public logStyle = false;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private configurationElement: ConfigurationElement;\n private onDrag;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n this.onDrag = (e: any) => {\n this.changedPoints.emit(this.points);\n };\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n async reset(count = 4) {\n const points = [];\n for (let c = 0; c < count; c++) {\n points.push(new XYType((c + 1) * 10, (c + 1) * 0.1));\n }\n this.points = points;\n await this.delete();\n this.create();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n // this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n let inputs = new ConfigurationElementInput(\n this.points,\n this.minPoint,\n this.maxPoint,\n false,\n [],\n this.onDrag\n );\n if (this.logStyle) {\n const confTransparency = 0.3;\n inputs = new ConfigurationElementInput(\n this.points,\n this.minPoint,\n this.maxPoint,\n true,\n [\n {\n color: Tools.getTransparency(ChartScaleColors['0'], confTransparency),\n yStart: Math.log10(0.1),\n yEnd: Math.log10(0.4),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['0.4'], confTransparency),\n yStart: Math.log10(0.4),\n yEnd: Math.log10(1),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['1'], confTransparency),\n yStart: Math.log10(1),\n yEnd: Math.log10(3),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['3'], confTransparency),\n yStart: Math.log10(3),\n yEnd: Math.log10(10),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['10'], confTransparency),\n yStart: Math.log10(10),\n yEnd: Math.log10(20),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['20'], confTransparency),\n yStart: Math.log10(20),\n yEnd: Math.log10(30),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['30'], confTransparency),\n yStart: Math.log10(30),\n yEnd: Math.log10(50),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['50'], confTransparency),\n yStart: Math.log10(50),\n yEnd: Math.log10(100),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['100'], confTransparency),\n yStart: Math.log10(100),\n yEnd: Math.log10(150),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['150'], confTransparency),\n yStart: Math.log10(150),\n yEnd: Math.log10(200),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['200'], confTransparency),\n yStart: Math.log10(200),\n yEnd: Math.log10(250),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['250'], confTransparency),\n yStart: Math.log10(250),\n yEnd: Math.log10(300),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['300'], confTransparency),\n yStart: Math.log10(300),\n yEnd: Math.log10(500),\n },\n ],\n this.onDrag\n );\n }\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n this.configurationElement = factory.createConfiguration(\n this.canvasElement.nativeElement,\n inputs\n );\n }, 10);\n });\n }\n\n private async delete() {\n this.configurationElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n // console.log('changed', changes);\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-xs=\"10\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n <ion-col size-xs=\"2\">\n <ion-button (click)=\"reset(2)\" color=\"light\" shape=\"round\" size=\"small\">2</ion-button>\n <br>\n <ion-button (click)=\"reset(4)\" color=\"light\" shape=\"round\" size=\"small\">4</ion-button>\n <br>\n <ion-button (click)=\"reset(6)\" color=\"light\" shape=\"round\" size=\"small\">6</ion-button>\n <br>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {DateRange, DateStatusElement, DateStatusElementInput, ElementsFactory} from 'raain-ui';\n\n@Component({\n selector: 'raain-date-focus',\n templateUrl: './raain-date-focus.component.html',\n styleUrls: ['./raain-date-focus.component.scss'],\n})\nexport class RaainDateFocusComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public focusDate: Date;\n @Input()\n public focusRange: DateRange;\n @Input()\n public withoutAll: boolean;\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private dateStatusElement: DateStatusElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.focusDate = new Date();\n this.focusRange = DateRange.CENTURY;\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n focusPrevious() {\n this.dateStatusElement.focusPrevious();\n }\n\n focusReset() {\n this.dateStatusElement.focusReset();\n }\n\n focusNext() {\n this.dateStatusElement.focusNext();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n // this.ngZone.runOutsideAngular(() => {\n // setTimeout(() => {\n const factory = new ElementsFactory();\n try {\n this.dateStatusElement = factory.createDateStatus(\n this.canvasElement.nativeElement,\n new DateStatusElementInput(this.points, this.focusDate, this.focusRange)\n );\n } catch (e) {\n console.warn('Focus creation issue', e);\n }\n // }, 50);\n // });\n }\n\n private async delete() {\n await this.dateStatusElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col class=\"ion-text-right\" offset-sm=\"4\" size-sm=\"1\">\n <ion-button (click)=\"focusPrevious()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" size-sm=\"2\">\n <ion-button (click)=\"focusReset()\" *ngIf=\"!withoutAll\" color=\"medium\" fill=\"clear\">\n all dates\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" size-sm=\"1\">\n <ion-button (click)=\"focusNext()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-forward-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n DateRange,\n DynamicDateStatusElement,\n DynamicDateStatusElementInput,\n ElementsFactory,\n} from 'raain-ui';\n\n@Component({\n selector: 'raain-date-dynamic',\n templateUrl: './raain-date-dynamic.component.html',\n styleUrls: ['./raain-date-dynamic.component.scss'],\n})\nexport class RaainDateDynamicComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public focusDate: Date;\n @Input()\n public focusRange: DateRange;\n @Input()\n public withoutAll: boolean;\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n @Input()\n public fetchData: (\n focusDate: Date,\n focusRange: DateRange\n ) => Promise<{label: string; style: string; values: {date: Date; value: number}[]}[]>;\n\n @Output()\n public changedDate = new EventEmitter<Date>();\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n private dynamicDateStatusElement: DynamicDateStatusElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.focusDate = new Date();\n this.focusRange = DateRange.CENTURY;\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n focusPrevious() {\n this.dynamicDateStatusElement.focusPrevious();\n }\n\n focusReset() {\n this.dynamicDateStatusElement.focusReset();\n }\n\n focusNext() {\n this.dynamicDateStatusElement.focusNext();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n // Map style to a valid Chart.js chart type\n private mapStyleToChartType(style: string): string {\n // List of valid Chart.js chart types\n const validChartTypes = [\n 'line',\n 'bar',\n 'radar',\n 'doughnut',\n 'pie',\n 'polarArea',\n 'bubble',\n 'scatter',\n ];\n\n // If style is a valid chart type, return it, otherwise default to 'line'\n return validChartTypes.includes(style) ? style : 'line';\n }\n\n private async create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n const monthSampleData = await this.fetchData(new Date(), DateRange.MONTH);\n\n const factory = new ElementsFactory();\n try {\n this.dynamicDateStatusElement = factory.createDynamicDateStatus(\n this.canvasElement.nativeElement,\n new DynamicDateStatusElementInput(\n async (focusDate, focusRange) => {\n const data = await this.fetchData(focusDate, focusRange);\n return data.map((item) => ({\n ...item,\n style: this.mapStyleToChartType(item.style),\n }));\n },\n {\n dataLength: monthSampleData.length,\n chartMinValue: -10,\n chartMaxValue: 100,\n onLastClick: (date: Date) => {\n this.changedDate.emit(date);\n },\n }\n )\n );\n } catch (e) {\n console.warn('Dynamic focus creation issue', e);\n }\n }\n\n private async delete() {\n this.dynamicDateStatusElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n await this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid id=\"raain-date-dynamic\">\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col class=\"ion-text-right\" offset-sm=\"4\" size-sm=\"1\">\n <ion-button (click)=\"focusPrevious()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" size-sm=\"2\">\n <ion-button (click)=\"focusReset()\" *ngIf=\"!withoutAll\" color=\"medium\" fill=\"clear\">\n all dates\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" size-sm=\"1\">\n <ion-button (click)=\"focusNext()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-forward-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {ElementsFactory, SpeedMatrixElementInput} from 'raain-ui';\nimport {PositionValue} from 'raain-model';\n\n@Component({\n selector: 'raain-speed',\n templateUrl: './raain-speed.component.html',\n styleUrls: ['./raain-speed.component.scss'],\n})\nexport class RaainSpeedComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public compareSpeedMatrix: PositionValue[];\n\n @Input()\n public compareTrustedIndicator: number;\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n public hide = false;\n @ViewChild('canvasSpeedElement')\n protected canvasSpeedElement: ElementRef;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.delete();\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created || !this.compareSpeedMatrix?.length) {\n return;\n }\n this.created = true;\n\n // this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n factory.createSpeedMatrixIndicator(\n this.canvasSpeedElement.nativeElement,\n new SpeedMatrixElementInput(this.compareSpeedMatrix, this.compareTrustedIndicator)\n );\n }, 10);\n // });\n }\n\n private delete() {\n this.created = false;\n this.hide = false;\n }\n\n private change(changes: SimpleChanges) {\n if (changes.compareSpeedMatrix) {\n if (!this.compareSpeedMatrix?.length) {\n this.hide = true;\n return;\n }\n }\n\n setTimeout(() => {\n this.delete();\n this.create();\n }, 10);\n }\n\n private updateMapSize(): void {\n const mapDivWidth =\n this.canvasSpeedElement.nativeElement.parentNode?.parentNode['clientWidth'];\n\n const currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<div id=\"container\">\n <div id=\"canvas-speed-matrix\">\n <div [hidden]=\"hide\">\n <canvas #canvasSpeedElement id=\"indic1\"></canvas>\n </div>\n <div [hidden]=\"!hide\">\n <span id=\"hiddenSquare\"> </span>\n </div>\n <!-- <span>compareTrustedIndicator {{ compareTrustedIndicator }}</span> -->\n </div>\n</div>\n","import {Component, EventEmitter, Input, NgZone, Output} from '@angular/core';\nimport {XYType} from '../xytype';\nimport {CompareManager} from '../tools';\n\n@Component({\n selector: 'raain-compare-stack',\n templateUrl: './raain-compare-stack.component.html',\n styleUrls: ['./raain-compare-stack.component.scss'],\n})\nexport class RaainCompareStackComponent {\n @Input()\n public compareManager: CompareManager;\n\n @Input()\n public currentHeight: number;\n\n @Output()\n public selectedPoint = new EventEmitter<{point: XYType; compareIndex: number}>();\n\n @Input()\n public cumulative: boolean;\n\n constructor(private ngZone: NgZone) {}\n\n protected onClick(e: {point: XYType; compareIndex: number}): void {\n this.selectedPoint.emit({point: e.point, compareIndex: e.compareIndex});\n }\n\n exportCumulativeToCsv(): void {\n const points = this.compareManager.globalComparePoints;\n if (!points?.length) {\n return;\n }\n\n const dates = this.compareManager.compareDates;\n const dateRange =\n dates?.length > 0\n ? `${this.formatDate(dates[0])} - ${this.formatDate(dates[dates.length - 1])}`\n : '';\n\n const csvRows = ['dateRange,gaugeName,gaugeValue,pixelValue'];\n for (const point of points) {\n csvRows.push(`${dateRange},${point.name},${point.x},${point.y}`);\n }\n\n const csvContent = csvRows.join('\\n');\n this.downloadCsv(\n csvContent,\n `compare-cumulative-${this.formatDateForFilename(new Date())}.csv`\n );\n }\n\n exportGranularToCsv(): void {\n const allPoints = this.compareManager.getAllGranularComparePoints();\n if (!allPoints?.length) {\n return;\n }\n\n const csvRows = ['date,gaugeName,gaugeValue,pixelValue'];\n for (const point of allPoints) {\n const dateStr = this.formatDate(point.date);\n csvRows.push(`${dateStr},${point.gaugeName},${point.gaugeValue},${point.pixelValue}`);\n }\n\n const csvContent = csvRows.join('\\n');\n this.downloadCsv(\n csvContent,\n `compare-granular-${this.formatDateForFilename(new Date())}.csv`\n );\n }\n\n private downloadCsv(content: string, filename: string): void {\n const blob = new Blob([content], {type: 'text/csv;charset=utf-8;'});\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n link.setAttribute('download', filename);\n link.click();\n URL.revokeObjectURL(url);\n }\n\n private formatDate(date: Date): string {\n return date ? date.toISOString().slice(0, 16).replace('T', ' ') : '';\n }\n\n private formatDateForFilename(date: Date): string {\n return date.toISOString().slice(0, 10);\n }\n}\n","<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.globalQualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compareManager.globalQualityIndicator >= 0.5,\n 'quality-medium': compareManager.globalQualityIndicator < 0.5 && compareManager.globalQualityIndicator >= 0,\n 'quality-bad': compareManager.globalQualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compareManager.globalQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <div class=\"ion-text-end\">\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"clear\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n </div>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n <span *ngIf=\"compare.qualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compare.qualityIndicator >= 0.5,\n 'quality-medium': compare.qualityIndicator < 0.5 && compare.qualityIndicator >= 0,\n 'quality-bad': compare.qualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compare.qualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <div class=\"ion-text-end\">\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"clear\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n </div>\n\n <!-- Cumulative summary of all granular comparisons -->\n <ion-col *ngIf=\"compareManager.granularCumulativePoints?.length\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare card-compare-cumulative\">\n <ion-card-header>Cumulative Summary\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.granularCumulativeQualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compareManager.granularCumulativeQualityIndicator >= 0.5,\n 'quality-medium': compareManager.granularCumulativeQualityIndicator < 0.5 && compareManager.granularCumulativeQualityIndicator >= 0,\n 'quality-bad': compareManager.granularCumulativeQualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compareManager.granularCumulativeQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content>\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"-1\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.granularCumulativePointsMax\"\n [points]=\"compareManager.granularCumulativePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n</div>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {EarthMapElement, EarthMapElementInput, ElementsFactory} from 'raain-ui';\n\n@Component({\n selector: 'raain-globe',\n templateUrl: './raain-globe.component.html',\n styleUrls: ['./raain-globe.component.scss'],\n})\nexport class RaainGlobeComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private earthMapElement: EarthMapElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n try {\n this.earthMapElement = factory.createEarthMap(\n this.canvasElement.nativeElement,\n new EarthMapElementInput()\n );\n } catch (e) {\n console.warn('Dynamic focus creation issue', e);\n }\n }, 100);\n });\n }\n\n private async delete() {\n // await this.earthMapElement?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div #canvasElement [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n </div>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {MapLatLng} from 'raain-ui';\nimport {\n GaugeNode,\n IComparePerDate,\n ICompares,\n PositionValue,\n QualityPoint,\n RainComputationQuality,\n RainNode,\n SpeedMatrix,\n SpeedMatrixContainer,\n} from 'raain-model';\nimport {XYType} from '../xytype';\nimport {ProfileService} from '../profile.service';\nimport {FrameSet} from './FrameSet';\n\nexport interface ICompareTarget {\n date: Date;\n rainComputationId?: string;\n rainComputationCumulativeId?: string;\n}\n\nexport interface IUICompare {\n date: Date;\n name: string;\n comparePoints: XYType[];\n comparePointsMax: XYType;\n comparePointsHistory: QualityPoint[];\n remarks: string;\n qualityIndicator: number;\n}\n\nexport class CompareManager {\n public gaugesInMap: MapLatLng[];\n public gaugesInCompare: MapLatLng[];\n public selectedGauges: MapLatLng[];\n public selectedPixels: MapLatLng[];\n public pixelsSolutions: MapLatLng[][];\n public speeds: MapLatLng[];\n\n // from comparesTimeline\n public compareNames: string[];\n public uiCompares: IUICompare[];\n public compareSpeedMatrix: PositionValue[];\n public compareVersion: string;\n public compareTrustedIndicator: number;\n public compareDates: Date[];\n\n public currentQualityDoneDate: Date;\n public currentQualityLaunchedBy: string;\n public currentQualityTimeSpentInMs: number;\n public globalComparePoints: XYType[];\n public globalComparePointsMax: XYType;\n public globalQualityIndicator: number;\n public compareSpeed: {angleInDegrees: number; pixelsPerPeriod: number};\n protected buildCompares: ICompares;\n protected selectedGauge: QualityPoint;\n protected selectedGaugeInPoints: QualityPoint;\n protected selectedGaugeInPointsDetail: string;\n protected rainComputationQualitiesPerDate: any;\n\n constructor(\n protected profileService: ProfileService,\n public onChanges: () => void = () => {}\n ) {\n this.cleanAll();\n }\n\n // Merged cumulative from granular comparisons (computed from buildCompares)\n public get granularCumulativePoints(): XYType[] {\n if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {\n return [];\n }\n return this.buildCompares.compareCumulative.qualityPoints.map(\n (qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId)\n );\n }\n\n public get granularCumulativePointsMax(): XYType {\n if (!this.buildCompares?.compareCumulative) {\n return new XYType(0, 0);\n }\n const maxValue = this.buildCompares.compareCumulative.maxValue * 1.2;\n return new XYType(maxValue, maxValue);\n }\n\n // Default: KGE normalized 0-1 (from raain-model defaults)\n public get granularCumulativeQualityIndicator(): number {\n if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {\n return null;\n }\n return SpeedMatrix.ComputeQualityIndicator(\n this.buildCompares.compareCumulative.qualityPoints\n );\n }\n\n protected _rainNode: RainNode;\n\n public get rainNode(): RainNode {\n return this._rainNode;\n }\n\n public set rainNode(rainNode: RainNode) {\n this._rainNode = rainNode;\n this.cleanAll();\n }\n\n public cleanAll() {\n this.gaugesInMap = [];\n this.gaugesInCompare = [];\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n this.compareDates = [];\n this.speeds = [];\n\n this.buildCompares = {\n comparesPerDate: [],\n compareCumulative: null,\n };\n this.globalComparePoints = [];\n this.globalComparePointsMax = new XYType(0, 0);\n this.globalQualityIndicator = null;\n // granularCumulative* are now getters computed from buildCompares\n this.rainComputationQualitiesPerDate = {};\n\n this.selectedGauge = null;\n this.selectedGaugeInPoints = null;\n this.cleanCompareQuality('no compare yet');\n }\n\n async refreshCompareQuality(frameSet: FrameSet, onlyOne: boolean) {\n const comparePerDate = this.getComparePerDate(frameSet.date);\n\n if (\n !comparePerDate ||\n !comparePerDate.rainComputationQuality?.qualitySpeedMatrixContainer\n ) {\n // this.cleanCompareQuality(\n // 'no current quality ' + Object.keys(this.rainComputationQualitiesPerDate)\n // );\n // this.onChanges();\n return;\n }\n\n if (onlyOne) {\n comparePerDate.compareTimeline = comparePerDate.compareTimeline.filter(\n (c) => c.date.getTime() === frameSet.date.getTime()\n );\n }\n\n const uiCompares: IUICompare[] = comparePerDate.compareTimeline\n .map((c) => {\n // Default: KGE normalized 0-1\n const qualityIndicator = SpeedMatrix.ComputeQualityIndicator(c.qualityPoints);\n return {\n date: c.date,\n name: c.name,\n comparePoints: c.qualityPoints.map(\n (p) =>\n new XYType(\n p.getGaugeValue(),\n p.getRainValue(),\n 2,\n p.gaugeLabel,\n p.gaugeId\n )\n ),\n comparePointsMax: new XYType(c.maxValue * 1.2, c.maxValue * 1.2),\n comparePointsHistory: c.qualityPointsLegacy,\n remarks: c.remarks,\n qualityIndicator,\n };\n })\n .sort((a, b) => a.date?.getTime() - b.date?.getTime());\n\n this.currentQualityDoneDate = comparePerDate.rainComputationQuality.isDoneDate;\n this.currentQualityTimeSpentInMs = comparePerDate.rainComputationQuality.timeSpentInMs;\n this.currentQualityLaunchedBy = comparePerDate.rainComputationQuality.launchedBy;\n this.compareVersion = comparePerDate.rainComputationQuality.getVersion();\n\n this.compareSpeed =\n comparePerDate.rainComputationQuality.qualitySpeedMatrixContainer.getSpeed();\n this.compareNames = uiCompares.map((c) => c.name);\n this.uiCompares = uiCompares;\n\n this.onChanges();\n }\n\n async refreshGlobalCompareQuality(\n targetsOrdered: ICompareTarget[],\n period: {begin: Date; end: Date},\n withCompareDuplicate: boolean,\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ) {\n try {\n await this.fetchRainComputationQualities(\n targetsOrdered,\n provider,\n timeStepInMinutes,\n timeStepMode\n );\n\n await this.buildComparesTimeline(targetsOrdered, period, withCompareDuplicate);\n\n if (!this.buildCompares.compareCumulative) {\n // throw Error('needs cumulative compare');\n return;\n }\n\n const countForAverage = targetsOrdered.length;\n const maxValue = this.buildCompares.compareCumulative.maxValue * 1.2;\n const cumulativePoints = this.buildCompares.compareCumulative.qualityPoints.map(\n (qp) =>\n new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId)\n );\n const cumulativePointsMax = new XYType(maxValue, maxValue);\n // Default: KGE normalized 0-1\n const cumulativeQualityIndicator = SpeedMatrix.ComputeQualityIndicator(\n this.buildCompares.compareCumulative.qualityPoints\n );\n\n // Set for cumulative mode\n this.globalComparePoints = cumulativePoints;\n this.globalComparePointsMax = cumulativePointsMax;\n this.globalQualityIndicator = cumulativeQualityIndicator;\n // granularCumulative* are now getters computed from buildCompares.compareCumulative\n } catch (e) {\n console.warn(e);\n }\n }\n\n async setGaugesInMap() {\n // Get all gauge IDs linked to this rainNode\n const rainNodeGaugeIds = this.rainNode.getLinks(GaugeNode.TYPE).map((l) => l.getId());\n\n // Fetch gauges from API (may be filtered/limited)\n let gaugesToFilter = await this.profileService.getGauges(\n this.rainNode?.id,\n this.rainNode.getCenter()\n );\n gaugesToFilter = gaugesToFilter\n .sort((a, b) => {\n return (\n a.approxDistanceFrom(this.rainNode.getCenter()) -\n b.approxDistanceFrom(this.rainNode.getCenter())\n );\n })\n .filter((v, index) => index < 200);\n\n // Build a map of gauges from API response\n const gaugesFromApi = new Map<\n string,\n {id: string; latitude: number; longitude: number; name: string}\n >();\n for (const gauge of gaugesToFilter) {\n gaugesFromApi.set(gauge.id, gauge);\n }\n\n // Fetch missing gauges individually (those linked but not in API response)\n const missingGaugeIds = rainNodeGaugeIds.filter((id) => !gaugesFromApi.has(id));\n for (const gaugeId of missingGaugeIds) {\n try {\n const gauge = await this.profileService.getGauge(gaugeId);\n if (gauge) {\n gaugesFromApi.set(gauge.id, gauge);\n }\n } catch (e) {\n console.warn(`Failed to fetch gauge ${gaugeId}:`, e);\n }\n }\n\n // Filter to only gauges linked to this rainNode\n const visibleGauges = rainNodeGaugeIds\n .map((id) => gaugesFromApi.get(id))\n .filter((g) => !!g);\n console.log('visibleGauges:', visibleGauges.length, '/', rainNodeGaugeIds.length);\n\n const gaugesLatLng: MapLatLng[] = [];\n for (const gauge of visibleGauges) {\n gaugesLatLng.push(\n new MapLatLng(gauge.latitude, gauge.longitude, undefined, gauge.id, gauge.name)\n );\n }\n this.gaugesInMap = gaugesLatLng;\n }\n\n async setGaugesInCompare() {\n const qualityPoints: QualityPoint[] = [];\n for (const compare of this.uiCompares) {\n for (const qualityPoint of compare.comparePointsHistory) {\n const alreadyAdded = qualityPoints.filter(\n (p) => p?.gaugeId === qualityPoint.gaugeId\n );\n if (alreadyAdded.length === 0) {\n qualityPoints.push(qualityPoint);\n }\n }\n }\n\n this.gaugesInCompare = qualityPoints.map((p) => {\n return new MapLatLng(\n p.gaugeCartesianValue.lat,\n p.gaugeCartesianValue.lng,\n 0,\n p.gaugeId,\n p.gaugeLabel + '>' + p.getGaugeValue(),\n p.getGaugeValue()\n );\n });\n\n this.resetSelectedGauges();\n }\n\n async selectGauge(gaugeId: string, compareIndex: number) {\n if (gaugeId) {\n const xys = this.getCurrentQualityPoints(compareIndex).filter(\n (p) => p.gaugeId === gaugeId\n );\n this.selectedGauge = xys.length === 1 ? xys[0] : null;\n } else {\n this.selectedGauge = null;\n }\n\n if (!this.selectedGauge) {\n this.resetSelectedGauges();\n const gaugesFiltered = this.gaugesInMap.filter((g) => g.id === gaugeId);\n if (gaugesFiltered.length === 1) {\n this.selectedGauges = [gaugesFiltered[0]];\n }\n return;\n }\n\n const selectedGaugeInPoints = this.getCurrentQualityPoints(compareIndex).filter(\n (p) => p.gaugeId === this.selectedGauge.gaugeId\n );\n let pixelsSolutions: MapLatLng[][] = [];\n\n if (selectedGaugeInPoints.length === 1) {\n const remarks = JSON.parse(selectedGaugeInPoints[0].remark).sort(\n (a, b) => a.criteriaAttemptedToBeMinimum - b.criteriaAttemptedToBeMinimum\n );\n console.log(remarks);\n pixelsSolutions = remarks.map((remark) =>\n remark.solutionForGauge.pixels.map(\n (p) =>\n new MapLatLng(\n p.y + 0.005,\n p.x + 0.01,\n 0,\n '' + !remark.notPossible,\n '' + !remark.notPossible,\n 1\n )\n )\n );\n\n const timeDeltaInMinutes = selectedGaugeInPoints[0].getTimeDeltaInMinutes();\n this.selectedGaugeInPointsDetail =\n '' +\n selectedGaugeInPoints[0].gaugeLabel +\n ' > ' +\n Math.round(selectedGaugeInPoints[0].getGaugeValue() * 100) / 100 +\n ' / ' +\n Math.round(selectedGaugeInPoints[0].getRainValue() * 100) / 100 +\n ' dT=' +\n timeDeltaInMinutes;\n\n this.selectedGaugeInPoints = selectedGaugeInPoints[0];\n } else {\n this.selectedGaugeInPoints = null;\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n return;\n }\n\n this.selectedGauges = [\n new MapLatLng(\n this.selectedGaugeInPoints.gaugeCartesianValue.lat,\n this.selectedGaugeInPoints.gaugeCartesianValue.lng,\n undefined,\n this.selectedGaugeInPoints.gaugeId,\n this.selectedGaugeInPoints.gaugeLabel +\n '>' +\n this.selectedGaugeInPoints.gaugeCartesianValue.value,\n this.selectedGaugeInPoints.gaugeCartesianValue.value\n ),\n ];\n\n this.selectGaugeInCompare();\n\n const pixels: MapLatLng[] = [];\n for (const rainCartesianValue of this.selectedGaugeInPoints.rainCartesianValues) {\n pixels.push(\n new MapLatLng(rainCartesianValue.lat + 0.005, rainCartesianValue.lng + 0.01)\n );\n }\n this.selectedPixels = pixels;\n\n this.pixelsSolutions = pixelsSolutions;\n }\n\n // Returns all granular quality points across all dates in the period (excludes cumulative end date)\n getAllGranularComparePoints(): {\n date: Date;\n gaugeName: string;\n gaugeValue: number;\n pixelValue: number;\n }[] {\n const result: {date: Date; gaugeName: string; gaugeValue: number; pixelValue: number}[] =\n [];\n\n if (!this.buildCompares?.comparesPerDate?.length || !this.compareDates?.length) {\n return result;\n }\n\n // Find the last date (cumulative end date) to exclude it\n const lastDateTime = Math.max(...this.compareDates.map((d) => d.getTime()));\n\n for (const comparePerDate of this.buildCompares.comparesPerDate) {\n // Skip the last date which contains cumulative values\n if (comparePerDate.date.getTime() >= lastDateTime) {\n continue;\n }\n if (!comparePerDate.compareTimeline?.length) {\n continue;\n }\n // Get first timeline entry (current step) for each date\n const currentCompare = comparePerDate.compareTimeline[0];\n if (!currentCompare?.qualityPoints?.length) {\n continue;\n }\n for (const qp of currentCompare.qualityPoints) {\n result.push({\n date: comparePerDate.date,\n gaugeName: qp.gaugeLabel,\n gaugeValue: qp.getGaugeValue(),\n pixelValue: qp.getRainValue(),\n });\n }\n }\n\n return result.sort((a, b) => a.date.getTime() - b.date.getTime());\n }\n\n protected async buildComparesTimeline(\n targetsOrdered: ICompareTarget[],\n period: {begin: Date; end: Date},\n withCompareDuplicate: boolean\n ): Promise<ICompares> {\n const compareDates = targetsOrdered.map((t) => t.date);\n\n const qualities: RainComputationQuality[] = compareDates\n .filter((d) => !!d)\n .map((d) => this.getRainComputationQuality(d))\n .filter((rcq) => !!rcq);\n\n this.compareDates = compareDates?.length > 1 ? compareDates : [period.begin, period.end];\n if (this.compareDates[0].getTime() > period.begin.getTime()) {\n this.compareDates.unshift(period.begin);\n }\n\n this.buildCompares = SpeedMatrixContainer.BuildCompares(qualities, !withCompareDuplicate);\n return this.buildCompares;\n }\n\n protected getComparePerDate(date: Date): IComparePerDate {\n const existing = this.buildCompares.comparesPerDate.filter(\n (c) => c.date.getTime() === date.getTime()\n );\n if (existing.length === 1) {\n return existing[0];\n }\n return null;\n }\n\n protected getCurrentQualityPoints(compareIndex: number) {\n if (\n this.uiCompares.length === 0 ||\n compareIndex < 0 ||\n this.compareNames.length < compareIndex\n ) {\n return [];\n }\n\n return this.uiCompares[compareIndex].comparePointsHistory;\n }\n\n protected cleanCompareQuality(details?: string) {\n this.compareVersion = details;\n this.compareNames = [];\n this.uiCompares = [];\n this.compareSpeedMatrix = [];\n this.compareTrustedIndicator = undefined;\n\n this.currentQualityDoneDate = new Date(-1);\n this.currentQualityLaunchedBy = '';\n this.currentQualityTimeSpentInMs = -1;\n }\n\n protected async fetchRainComputationQualities(\n targetsOrdered: ICompareTarget[],\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ) {\n for (const target of targetsOrdered) {\n if (!this.rainComputationQualitiesPerDate[target.date.toISOString()]) {\n try {\n let rainComputationQuality: RainComputationQuality;\n\n if (target.rainComputationCumulativeId) {\n rainComputationQuality =\n await this.profileService.getRainCumulativeCumulativesCompare(\n this.rainNode,\n target.rainComputationCumulativeId,\n provider,\n timeStepInMinutes,\n timeStepMode\n );\n }\n\n if (rainComputationQuality) {\n let isConsistent = true;\n const matrices =\n rainComputationQuality.qualitySpeedMatrixContainer.getMatrices();\n for (const matrix of matrices) {\n if (!matrix.isConsistent()) {\n isConsistent = false;\n }\n }\n\n if (!isConsistent) {\n console.warn(\n `One of rainComputationQuality matrices is not consistent for ${target.date.toISOString()}`\n );\n }\n\n this.rainComputationQualitiesPerDate[target.date.toISOString()] =\n rainComputationQuality;\n }\n } catch (e) {\n console.warn(e);\n }\n }\n }\n }\n\n protected getRainComputationQuality(date: Date): RainComputationQuality {\n return this.rainComputationQualitiesPerDate[date.toISOString()];\n }\n\n protected selectGaugeInCompare() {\n const globalComparePoints = JSON.parse(JSON.stringify(this.globalComparePoints));\n for (const p of globalComparePoints) {\n if (p.id === this.selectedGaugeInPoints?.gaugeId) {\n p.r = 10;\n } else {\n p.r = 2;\n }\n }\n this.globalComparePoints = globalComparePoints;\n\n for (const compare of this.uiCompares) {\n const comparePoints = JSON.parse(JSON.stringify(compare.comparePoints));\n comparePoints.forEach((p) => {\n if (p.id === this.selectedGaugeInPoints?.gaugeId) {\n p.r = 10;\n } else {\n p.r = 3;\n }\n });\n compare.comparePoints = comparePoints;\n }\n }\n\n protected resetSelectedGauges() {\n // console.log('resetSelectedGauges reset');\n this.selectedGauge = null;\n this.selectedGaugeInPoints = null;\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n this.selectGaugeInCompare();\n }\n}\n","export class FrameSet {\n constructor(\n public date: Date,\n public radarMeasureIds: string[] = [],\n public rainComputationId: string = null,\n public rainComputationVersion: string = null,\n public rainComputationQualities: {\n version: string;\n id: string;\n }[] = [],\n public rainComputationCumulativeId: string = null\n ) {}\n}\n","import {GaugeNode, LatLng} from 'raain-model';\n\nexport class GaugeNodeFilter extends GaugeNode {\n public isIn = true;\n public distance = 0;\n\n constructor(json: any) {\n super(json);\n }\n\n approxDistanceFrom(center: LatLng): number {\n this.distance =\n Math.round(\n (Math.pow(this.latitude - center.lat, 2) +\n Math.pow(this.longitude - center.lng, 2)) *\n 100 *\n 100\n ) / 100;\n return this.distance;\n }\n\n add() {\n this.isIn = true;\n }\n\n remove() {\n this.isIn = false;\n }\n}\n","import {FrameSet} from './FrameSet';\nimport {from, mergeMap, Subject, takeUntil, timer} from 'rxjs';\nimport {\n CartesianMeasureValue,\n CartesianTools,\n ICartesianMeasureValue,\n RadarNode,\n RainComputationMap,\n RainNode,\n} from 'raain-model';\nimport {CartesianMapValue, TimeframeContainer, TimeframeContainers} from 'raain-ui';\nimport {RadarService} from '../radar.service';\nimport {ProfileService} from '../profile.service';\nimport {CompareManager, ICompareTarget} from './CompareManager';\nimport {XYType} from '../xytype';\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport class RefreshManager {\n public rainComputationMapVersion: string;\n public rainComputationMapDate: Date;\n public rainComputationMapDoneDate: Date;\n public rainComputationMapLaunchedBy: string;\n public rainComputationMapTimeSpentInMs: number;\n\n public rainComputationMapOriginalMin: number;\n public rainComputationMapOriginalMax: number;\n\n public sumFn: (cartesianMapValues: CartesianMapValue[]) => number;\n public sumValues: CartesianMapValue[];\n\n public provider: string = 'Raain';\n public timeStepInMinutes: number = 10;\n public timeStepMode: 'eq' | 'lte' = 'eq';\n public lastError: string = '';\n public cumulative: boolean = false;\n\n protected closeRefreshTimer: Subject<unknown>;\n protected countsPeriod: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n };\n protected timeframesFromRadars: FrameSet[];\n protected timeframesFromRadarsExtended: FrameSet[];\n protected timelineSelectedFrameSet: FrameSet;\n protected timeframeDates: Date[];\n protected expectedTimelineCount: number = 0;\n protected presentTimelineCount: number = 0;\n protected cartesianTools: CartesianTools;\n protected removeDuplicate: boolean;\n protected dataInternal: boolean;\n protected onRefreshInProgress: (\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n },\n timeframeDates: Date[]\n ) => Promise<void>;\n protected onRefreshDone: (timeframeDates: Date[]) => Promise<void>;\n protected onFetchDone: (timeframeContainers?: TimeframeContainers) => Promise<void>;\n\n constructor(\n protected radarService: RadarService,\n protected profileService: ProfileService,\n protected compareManager: CompareManager\n ) {\n this._period = {begin: new Date(), end: new Date()};\n this.closeRefreshTimer = new Subject<unknown>();\n this.cartesianTools = new CartesianTools();\n this.cleanAll();\n }\n\n protected _rainNode: RainNode;\n\n public get rainNode(): RainNode {\n return this._rainNode;\n }\n\n public set rainNode(rainNode: RainNode) {\n this._rainNode = rainNode;\n this.cleanAll();\n }\n\n protected _period: {begin: Date; end: Date};\n\n get period(): {begin: Date; end: Date} {\n return this._period;\n }\n\n set period(period: {begin: Date; end: Date}) {\n this._period.begin = new Date(period.begin);\n this._period.end = new Date(period.end);\n this.refreshCounts().then((ignored) => {});\n }\n\n public setMethods(\n onRefreshInProgress: (\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n },\n timeframeDates: Date[]\n ) => Promise<void>,\n onRefreshDone: (timeframeDates: Date[]) => Promise<void>,\n onFetchDone: (timeframeContainers?: TimeframeContainers) => Promise<void>\n ) {\n this.onRefreshInProgress = onRefreshInProgress;\n this.onRefreshDone = onRefreshDone;\n this.onFetchDone = onFetchDone;\n }\n\n cleanAll() {\n this.lastError = '';\n this.countsPeriod = {percentImages: [], queueRunning: 0, progress: 0};\n this.timeframesFromRadars = [];\n this.timeframesFromRadarsExtended = [];\n this.timeframeDates = [];\n this.removeDuplicate = true;\n this.closeRefreshTimer?.next(null);\n }\n\n async fetch(\n dateShown: Date,\n withGaugesMeasures: boolean,\n cumulativeHours = 0\n ): Promise<FrameSet> {\n // set the target\n const currents = this.timeframesFromRadarsExtended.filter(\n (t) => t.date.getTime() === dateShown.getTime()\n );\n if (currents.length !== 1) {\n return;\n }\n\n // build current Frameset\n const current: FrameSet = currents[0];\n const target = {\n ...current,\n withGauge: withGaugesMeasures,\n cumulativeHours: cumulativeHours,\n };\n\n const timeframeContainers = await this.refreshMapTimeframeContainers(target);\n\n await this.onFetchDone(timeframeContainers);\n await this.refreshCompareQuality(current);\n\n this.timelineSelectedFrameSet = current;\n }\n\n getTimelineFrameSet(): FrameSet[] {\n return this.timeframesFromRadars;\n }\n\n getExpectedTimelineCount(): number {\n return this.expectedTimelineCount;\n }\n\n getPresentTimelineCount(): number {\n return this.presentTimelineCount;\n }\n\n getTimelineSelectedFrameSet(): FrameSet {\n return this.timelineSelectedFrameSet;\n }\n\n async refresh(launchQualityAfter: boolean, dataInternal: boolean) {\n this.lastError = '';\n\n this.checkPeriod();\n\n this.dataInternal = dataInternal;\n\n const asyncDone = (error?: string) => {\n if (error) {\n console.error('Error in refresh', error);\n }\n this.closeRefreshTimer.next(null);\n this.onRefreshDone(this.timeframeDates).then((_ignored) => {});\n };\n\n const asyncRefresh = async () => {\n this.onRefreshInProgress(await this.refreshCounts(), this.timeframeDates).then(\n (_ignored) => {}\n );\n const done = await this.refreshPeriodInsidePolling();\n if (done) {\n asyncDone();\n }\n };\n\n timer(1000, 10000) // Wait 1s, then every 10s\n .pipe(\n mergeMap(() => from(asyncRefresh())),\n takeUntil(this.closeRefreshTimer)\n )\n .subscribe({\n error: (error) => asyncDone(JSON.stringify(error)),\n });\n }\n\n setRemoveDuplicate(b: boolean) {\n this.removeDuplicate = b;\n }\n\n public async setReportPeriod(date: Date) {\n let values: CartesianMapValue[] = [];\n for (const frameSet of this.timeframesFromRadars) {\n if (frameSet.date.getTime() !== date.getTime()) {\n continue;\n }\n values = values.concat(await this.getValues(frameSet));\n }\n\n this.sumFn = (cartesianMapValues: CartesianMapValue[]) => {\n return cartesianMapValues.reduce((p, v) => p + v.value, 0);\n };\n this.sumValues = values;\n }\n\n protected checkPeriod() {\n if (this.period.begin.getTime() === this.period.end.getTime()) {\n const message = 'need a period';\n this.lastError += message;\n throw new Error(message);\n }\n }\n\n protected async refreshCounts() {\n if (!this.rainNode) {\n return this.countsPeriod;\n }\n\n const counts = await this.profileService.getCounts(this.rainNode.id, {\n range: 'day',\n periodBegin: this._period.begin,\n });\n\n let progress = 0;\n\n // Verify progress only for SimpleZone\n if (this.rainNode.getLinks(RadarNode.TYPE).length <= 1) {\n progress = await this.profileService.getRainProgress(this.rainNode.id);\n }\n\n this.countsPeriod = {\n ...counts,\n progress,\n };\n\n return this.countsPeriod;\n }\n\n protected getRainComputationQualityTarget(frameset: FrameSet): string {\n if (frameset.rainComputationQualities.length <= 0) {\n return undefined;\n }\n return frameset.rainComputationQualities[0].id;\n }\n\n protected async refreshPeriodInsidePolling(): Promise<boolean> {\n try {\n const done = await this.refreshCheckIfDone();\n\n // behind refresh\n await this.refreshTimeframesFromRadars(done);\n await this.refreshGlobalCompareReport(done);\n\n return done;\n } catch (e) {\n console.warn(e);\n this.lastError += e.message;\n }\n return false;\n }\n\n protected async refreshCheckIfDone(): Promise<boolean> {\n await sleep(2000);\n return this.countsPeriod.progress === 0;\n }\n\n protected async refreshTimeframesFromRadars(done: boolean) {\n if (!done || !this.rainNode) {\n return [];\n }\n\n try {\n const beginExtended = new Date(this.period.begin);\n const endExtended = new Date(this.period.end);\n if (!this.cumulative) {\n // Only extend period for granular mode (to get neighboring frames)\n // For cumulative mode, use exact period\n beginExtended.setMinutes(beginExtended.getMinutes() - 7);\n endExtended.setMinutes(endExtended.getMinutes() + 7);\n }\n\n const windowInMinutes = this.cumulative\n ? Math.round((this.period.end.getTime() - this.period.begin.getTime()) / 60000)\n : this.timeStepInMinutes;\n\n this.rainNode = await this.profileService.getRainTimeframe(\n this.rainNode.id,\n beginExtended,\n endExtended,\n this.dataInternal,\n this.provider,\n this.timeStepInMinutes,\n windowInMinutes\n );\n\n this.timeframesFromRadarsExtended = await this.radarService.getTimeline(this.rainNode);\n this.timeframesFromRadars = this.timeframesFromRadarsExtended\n .filter(\n (frameSet) =>\n this.period.begin.getTime() < frameSet.date.getTime() &&\n frameSet.date.getTime() <= this.period.end.getTime()\n )\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n this.timeframeDates = this.timeframesFromRadars.map((frameSet) => frameSet.date);\n\n // Compute all expected dates\n // For cumulative mode: only 1 expected date (the period end)\n // For granular mode: all dates from period.begin to period.end with timeStepInMinutes\n const allExpectedDates: Date[] = [];\n if (this.cumulative) {\n // In cumulative mode, we expect only ONE timeframe (the cumulative)\n allExpectedDates.push(new Date(this.period.end));\n } else {\n // Start from begin + step: cumulative dates represent window ends,\n // so the first expected date is begin + timeStep, not begin itself\n const beginTime = new Date(this.period.begin).getTime();\n const currentDate = new Date(beginTime + this.timeStepInMinutes * 60000);\n while (currentDate.getTime() <= this.period.end.getTime()) {\n allExpectedDates.push(new Date(currentDate));\n currentDate.setMinutes(currentDate.getMinutes() + this.timeStepInMinutes);\n }\n }\n\n this.expectedTimelineCount = allExpectedDates.length;\n\n // Check if all expected dates are present in timeframeDates\n const timeframeDateTimes = new Set(this.timeframeDates.map((d) => d.getTime()));\n const missingDates = allExpectedDates.filter(\n (expectedDate) => !timeframeDateTimes.has(expectedDate.getTime())\n );\n this.presentTimelineCount = allExpectedDates.length - missingDates.length;\n\n if (missingDates.length > 0) {\n const message =\n `Missing ${missingDates.length} timeframe(s) out of ${allExpectedDates.length} expected: ` +\n missingDates.map((d) => d.toISOString()).join(', ');\n console.warn(message);\n this.lastError += message;\n }\n\n return this.timeframesFromRadars;\n } catch (e) {\n console.error('refreshTimeframesFromRadars', e);\n }\n\n return [];\n }\n\n protected async refreshGlobalCompareReport(done: boolean) {\n if (!done) {\n return;\n }\n\n try {\n const targets: ICompareTarget[] = [];\n for (const frameSet of this.timeframesFromRadars) {\n const target = JSON.parse(JSON.stringify(frameSet));\n target.date = new Date(target.date);\n targets.push(target);\n }\n\n await this.compareManager.refreshGlobalCompareQuality(\n targets,\n this.period,\n !this.removeDuplicate,\n this.provider,\n this.timeStepInMinutes,\n this.timeStepMode\n );\n } catch (e) {\n console.error('refreshGlobalCompareReport', e);\n }\n }\n\n protected async refreshMapTimeframeContainers(target: {\n date: Date;\n rainComputationCumulativeId: string;\n withGauge: boolean;\n cumulativeHours: number;\n }) {\n if (!target?.rainComputationCumulativeId) {\n const message = `Pb with refreshMapTimeframeContainers insights ${target?.date.toISOString()}`;\n console.warn(message);\n this.lastError += message;\n return null;\n }\n\n const rainNode = this.rainNode;\n const containers: TimeframeContainer[] = [];\n const newCreatedTimeframeContainers = new TimeframeContainers(containers);\n try {\n let rainNodeCartesianMap: RainComputationMap;\n\n if (target.cumulativeHours && target.rainComputationCumulativeId) {\n // For N-hour cumulative, use the last frame's cumulative (end of period)\n // The cumulative is pre-computed by raain-ground with windowInMinutes=60\n const lastFrame =\n this.timeframesFromRadarsExtended[this.timeframesFromRadarsExtended.length - 1];\n const cumulativeId =\n lastFrame?.rainComputationCumulativeId || target.rainComputationCumulativeId;\n\n // Use direct cartesian-map endpoint - cumulative data fetched from S3\n rainNodeCartesianMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n rainNode.id,\n cumulativeId\n );\n } else {\n rainNodeCartesianMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n rainNode.id,\n target.rainComputationCumulativeId\n );\n }\n\n if (rainNodeCartesianMap) {\n newCreatedTimeframeContainers.addFromRainComputationMap(\n rainNodeCartesianMap,\n false\n );\n\n this.rainComputationMapVersion = rainNodeCartesianMap.version;\n this.rainComputationMapDate = new Date(rainNodeCartesianMap.date);\n this.rainComputationMapDoneDate = rainNodeCartesianMap.isDoneDate;\n this.rainComputationMapLaunchedBy = rainNodeCartesianMap.launchedBy;\n this.rainComputationMapTimeSpentInMs = rainNodeCartesianMap.timeSpentInMs;\n\n this.rainComputationMapOriginalMin = rainNodeCartesianMap.originalDBZMin;\n this.rainComputationMapOriginalMax = rainNodeCartesianMap.originalDBZMax;\n }\n } catch (e) {\n const message = `Pb with cumulatives for id: ${target.rainComputationCumulativeId} ${e.message}`;\n console.warn(message);\n this.lastError += message;\n }\n\n return newCreatedTimeframeContainers;\n }\n\n protected async refreshCompareQuality(frameSet: FrameSet) {\n await this.compareManager.refreshCompareQuality(frameSet, true);\n await this.compareManager.setGaugesInCompare();\n }\n\n protected async getValues(target: FrameSet): Promise<CartesianMapValue[]> {\n if (!target?.rainComputationCumulativeId) {\n const message = `Pb with target insights ${target?.date.toISOString()}`;\n console.warn(message);\n this.lastError += message;\n return [];\n }\n\n let values: CartesianMapValue[] = [];\n const rainComputationMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n this.rainNode.id,\n target.rainComputationCumulativeId\n );\n\n try {\n if (rainComputationMap) {\n rainComputationMap.getMapData().forEach((m) => {\n if (m.values) {\n (m.values as ICartesianMeasureValue[]).forEach((v) => {\n const cartesianMeasureValue = CartesianMeasureValue.From(v);\n values = values.concat(\n CartesianMapValue.From(\n cartesianMeasureValue.getCartesianValues(),\n this.cartesianTools\n )\n );\n });\n }\n });\n }\n } catch (e) {\n const message = `Pb with cumulatives for id: ${target.rainComputationCumulativeId} ${e.message}`;\n console.warn(message);\n this.lastError += message;\n }\n\n return values;\n }\n}\n","import {DateRange} from 'raain-ui';\n\nexport function mapDateRangeToString(range: DateRange): 'hour' | 'day' | 'month' | 'year' {\n switch (range) {\n case DateRange.HOUR:\n return 'hour';\n case DateRange.DAY:\n return 'day';\n case DateRange.MONTH:\n return 'month';\n case DateRange.YEAR:\n return 'year';\n default:\n return 'year';\n }\n}\n","import {FidjService} from 'fidj-angular';\nimport {EventNode, GaugeNode, Link, PeopleNode, RadarNode, RainNode} from 'raain-model';\nimport {Storage} from './storage.service';\n\nexport class FidjStorageNode {\n public radars: RadarNode[] = [];\n public rains: RainNode[] = [];\n public gauges: GaugeNode[] = [];\n public team: PeopleNode;\n public events: EventNode[] = [];\n\n public infos: any = {};\n\n static getEmptyNode() {\n return new FidjStorageNode();\n }\n\n static getDemoNode() {\n const demoNode = new FidjStorageNode();\n const link = new Link('rain', 'https://demo/api/rains/2');\n /*\n demoNode.radars = [\n new RadarNode({\n id: '5efd04569cb1f4161bd69dc7',\n name: 'demo radar A',\n links: [link],\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RadarNode({\n id: 'dr2',\n name: 'demo radar B',\n links: [link],\n latitude: 0.11,\n longitude: -0.753\n }),\n new RadarNode({\n id: 'dr3',\n name: 'demo radar C',\n latitude: 0.13,\n longitude: -0.753,\n links: []\n }),\n new RadarNode({\n id: 'dr4',\n name: 'demo radar D',\n latitude: 0.14,\n longitude: -0.74,\n links: []\n })];\n demoNode.rains = [\n new RainNode({\n id: '5efd04569cb1f4161bd69dc8',\n name: 'Demo rain zone A',\n links: [new Link('radar', 'https://demo/api/radars/5efcfe619cb1f4161bd69dc3')],\n status: 0,\n quality: 75,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz2',\n name: 'Demo rain zone B',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 1,\n quality: 50,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz3',\n name: 'Demo rain zone C',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 2,\n quality: 75,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz4',\n name: 'Demo rain zone D',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 3,\n quality: 95,\n latitude: 48.774569,\n longitude: 2.008407\n })];\n\n demoNode.gauges = [\n new GaugeNode({\n id: 'g1',\n name: 'Gauge A',\n latitude: 48.7748,\n longitude: 2.28407,\n }),\n new GaugeNode({\n id: 'g2',\n name: 'Gauge B',\n latitude: 48.874569,\n longitude: 2.108407,\n })];\n demoNode.events = [{\n id: 'e2',\n title: 'Need support ?',\n status: 0,\n red: false,\n description: 'This area is dedicated to support you and your team. Support is made on Radar or Rain quality, ' +\n 'or any feedback we can have about your production system. Our goal : improving your data.',\n created: new Date(),\n modified: new Date()\n }];\n demoNode.team = {\n id: 'p1',\n email: 'demo@demo.com',\n name: 'demo guy',\n description: 'the demo guy'\n };\n\n */\n return demoNode;\n }\n}\n\nclass FidjStorageResult {\n data: FidjStorageNode;\n}\n\nexport class FidjStorage {\n private isDemoMode: boolean;\n private node: FidjStorageNode = FidjStorageNode.getEmptyNode();\n private fidjMetaResult: FidjStorageResult = {data: new FidjStorageNode()};\n\n constructor(private storage: Storage) {}\n\n public async storeData(fidjService: FidjService, data) {\n this.node = JSON.parse(JSON.stringify(data));\n this.fidjMetaResult.data = this.node;\n\n if (this.isDemoMode) {\n this.storage.set('fidjMetaResult', JSON.stringify(this.fidjMetaResult));\n return;\n }\n\n await fidjService.put(this.fidjMetaResult);\n }\n\n public async getRefreshedNodeCopy(fidjService: FidjService): Promise<FidjStorageNode> {\n if (this.isDemoMode) {\n const fidjMetaResult = this.storage.get('fidjMetaResult');\n if (fidjMetaResult) {\n this.fidjMetaResult = JSON.parse(fidjMetaResult);\n this.node = this.fidjMetaResult.data;\n }\n return JSON.parse(JSON.stringify(this.node));\n }\n\n const firstDemoData = async () => {\n this.node = FidjStorageNode.getDemoNode();\n await this.storeData(fidjService, this.node);\n };\n\n await fidjService.sync(firstDemoData);\n const fidjFindAllResults: any = await fidjService.findAll();\n\n if (fidjFindAllResults && fidjFindAllResults.length > 0) {\n if (fidjFindAllResults[0].data) {\n this.fidjMetaResult = fidjFindAllResults[0];\n this.node = this.fidjMetaResult.data;\n }\n }\n\n return JSON.parse(JSON.stringify(this.node));\n }\n\n setDemoMode(isDemo: boolean) {\n this.isDemoMode = isDemo;\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {BehaviorSubject} from 'rxjs';\nimport {\n BuildQueryString,\n EventNode,\n GaugeMeasure,\n GaugeNode,\n LatLng,\n RaainApiGaugesFindAllMineRequest,\n RaainApiGaugesFindAllMineResponse,\n RaainApiGaugesFindMeasuresRequest,\n RaainApiGaugesFindMeasuresResponse,\n RaainApiGaugesFindOneResponse,\n RaainApiNotificationsAddRequestBody,\n RaainApiNotificationsAddResponse,\n RaainApiNotificationsFindAllMineRequest,\n RaainApiNotificationsFindAllMineResponse,\n RaainApiRadarsFindAllMineRequest,\n RaainApiRadarsFindAllMineResponse,\n RaainApiRadarsFindOneResponse,\n RaainApiRadarsUpdateRequestBody,\n RaainApiRainsCumulativeCartesianMapRequest,\n RaainApiRainsCumulativeCartesianMapResponse,\n RaainApiRainsCumulativeComparesResponse,\n RaainApiRainsCumulativeCumulativeResponse,\n RaainApiRainsCumulativeCumulativesComparesRequest,\n RaainApiRainsCumulativeCumulativesComparesResponse,\n RaainApiRainsCumulativesCreateRequest,\n RaainApiRainsCumulativesCreateResponse,\n RaainApiRainsCumulativesDetailedResponse,\n RaainApiRainsCumulativesListRequest,\n RaainApiRainsCumulativesListResponse,\n RaainApiRainsFindAllMineRequest,\n RaainApiRainsFindAllMineResponse,\n RaainApiRainsFindOneResponse,\n RaainApiRainsFindOneTimeframeCumulativeRequest,\n RaainApiRainsFindOneTimeframeCumulativeResponse,\n RaainApiRainsGetCountsRequest,\n RaainApiRainsGetCountsResponse,\n RaainApiRainsIndicatorsRequest,\n RaainApiRainsIndicatorsResponse,\n RaainApiRainsProgressResponse,\n RaainApiRainsProvidersResponse,\n RaainApiTeamsFindAllMineRequest,\n RaainApiTeamsFindOneResponse,\n RadarNode,\n RainComputationMap,\n RainComputationQuality,\n RainNode,\n SpeedMatrixContainer,\n TeamNode,\n} from 'raain-model';\n\nimport {Storage} from './storage.service';\n\nimport {FidjStorage, FidjStorageNode} from './fidj-storage.model';\nimport {ErrorInterface, FidjService, LoggerLevelEnum} from 'fidj-angular';\nimport {XYType} from './xytype';\nimport {GaugeNodeFilter} from './tools';\nimport {Router} from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProfileService {\n public readyForSync: BehaviorSubject<boolean>;\n public asTeamId: string;\n\n protected email: string;\n protected isDemo: boolean;\n protected roles: Array<string>;\n protected nodeData: FidjStorageNode;\n protected fidjStorage: FidjStorage;\n protected haveTryToReconnect: boolean;\n\n constructor(\n protected storage: Storage,\n protected fidjService: FidjService,\n protected httpClient: HttpClient,\n private router: Router\n ) {\n this.email = this.storage.get('raain-email');\n this.asTeamId = this.storage.get('raain-asTeamId');\n this.readyForSync = new BehaviorSubject<boolean>(false);\n this.roles = [];\n this.fidjStorage = new FidjStorage(storage);\n this.isDemoMode = false;\n }\n\n get isDemoMode() {\n return this.isDemo;\n }\n\n set isDemoMode(mode) {\n this.isDemo = mode ? mode : true;\n this.fidjStorage.setDemoMode(this.isDemo);\n }\n\n get defaultUrlForAPI() {\n return this.storage.get('raain-urlForAPI');\n }\n\n set defaultUrlForAPI(url: string) {\n this.storage.set('raain-urlForAPI', url);\n }\n\n async refreshProfile(): Promise<FidjStorageNode> {\n try {\n this.nodeData = await this.fidjStorage.getRefreshedNodeCopy(this.fidjService);\n this.setRoles(await this.fidjService.getRoles());\n return this.nodeData;\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async isConnected() {\n return this.fidjService.isConnected();\n }\n\n getEmail() {\n return this.email ?? this.storage.get('raain-email', this.email);\n }\n\n setEmail(email: string) {\n this.email = email;\n this.storage.set('raain-email', this.email);\n }\n\n async logout(fidjKey: string, fidjProd: boolean) {\n // this.storage.remove('raain-email');\n\n if (!fidjKey) {\n try {\n await this.fidjService.loginInDemoMode();\n this.readyForSync.next(true);\n } catch (err) {\n console.error('initFidj catch pb: ', err);\n }\n\n return;\n }\n\n await this.fidjService.logout(true);\n\n try {\n await this.fidjService.init(fidjKey, {\n logLevel: LoggerLevelEnum.WARN, // fidjProd ? LoggerLevelEnum.WARN : LoggerLevelEnum.INFO,\n crypto: false,\n prod: fidjProd,\n useDB: false,\n });\n this.readyForSync.next(true);\n } catch (err) {\n console.error('initFidj catch pb: ', err);\n }\n }\n\n async checkError(error: ErrorInterface) {\n if (error.code === 401) {\n console.warn('Pb on auth');\n if (this.router.url.indexOf('login') < 0) {\n try {\n await this.fidjService.logout();\n } catch (ignored) {\n // Ignore logout errors as we're redirecting to logout page anyway\n }\n return this.gotoLout();\n }\n }\n }\n\n async gotoLout() {\n try {\n if (this.router.url.indexOf('login') > -1) {\n return;\n }\n await this.router.navigateByUrl('/logout', {\n skipLocationChange: true,\n replaceUrl: true,\n });\n } catch (e) {\n console.error('gotoLout error: ', e);\n }\n }\n\n async gotoLogin() {\n if (this.router.url.indexOf('login') > -1) {\n return;\n }\n // await this.router.navigateByUrl('/', {skipLocationChange: true});\n await this.router.navigate(['/login']);\n }\n\n isLoggedIn() {\n const loggedIn = this.fidjService.isLoggedIn();\n console.log('isLoggedIn: ', loggedIn);\n return loggedIn;\n }\n\n needsConnectionRefresh() {\n return this.fidjService.needsRefresh();\n }\n\n async connectionRefresh() {\n await this.fidjService.refresh();\n }\n\n async storeAll() {\n return this.fidjStorage.storeData(this.fidjService, this.nodeData);\n }\n\n isAdmin(): boolean {\n return this.roles.indexOf('admin') > -1;\n }\n\n // === Notifications ===\n\n async createNotification(rainId: string, message: string) {\n const data: RaainApiNotificationsAddRequestBody = {\n rain: rainId,\n message,\n };\n\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n RaainApiNotificationsAddRequestBody,\n RaainApiNotificationsAddResponse\n >({\n key: 'notifications',\n verb: 'POST',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n data,\n });\n return new EventNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async getNotifications(rainId: string) {\n try {\n type NotificationsFindParams = Partial<RaainApiNotificationsFindAllMineRequest>;\n const params: NotificationsFindParams = {rain: rainId};\n const queryString = BuildQueryString<NotificationsFindParams>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiNotificationsFindAllMineResponse\n >({\n key: 'notifications',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n });\n\n return resp.data.notifications.map((n) => new EventNode(n));\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async getAllNotifications(): Promise<EventNode[]> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiNotificationsFindAllMineResponse\n >({\n key: 'notifications',\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n });\n\n return resp.data.notifications.map((n) => new EventNode(n));\n } catch (e) {\n await this.checkError(e);\n }\n\n return [];\n }\n\n // === Teams ===\n\n async getTeams(): Promise<Array<TeamNode>> {\n const teams = [];\n const params = {};\n const queryString = BuildQueryString<RaainApiTeamsFindAllMineRequest>(params);\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n {teams: ReturnType<TeamNode['toJSON']>[]}\n >({\n key: 'teams',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/teams',\n });\n for (const team of resp.data.teams) {\n teams.push(new TeamNode(team));\n }\n } catch (e) {\n await this.checkError(e);\n }\n return teams;\n }\n\n async getTeam(teamId: string): Promise<TeamNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiTeamsFindOneResponse>({\n key: 'teams',\n verb: 'GET',\n relativePath: teamId,\n defaultKeyUrl: this.defaultUrlForAPI + '/teams',\n });\n return new TeamNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n // === Radars ===\n\n async getRadars(name?: string): Promise<Array<RadarNode>> {\n const radars = [];\n const params: RaainApiRadarsFindAllMineRequest = {};\n if (name) {\n params.name = name;\n }\n try {\n let page = 1;\n let hasNext = true;\n while (hasNext) {\n params.page = page;\n const queryString = BuildQueryString<RaainApiRadarsFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRadarsFindAllMineResponse\n >({\n key: 'radars',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/radars',\n });\n for (const r of resp.data.radars) {\n radars.push(new RadarNode(r));\n }\n hasNext = resp.data.pagination?.hasNext ?? false;\n page++;\n }\n } catch (e) {\n await this.checkError(e);\n }\n return radars;\n }\n\n async getRadar(id: string): Promise<RadarNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiRadarsFindOneResponse>(\n {\n key: 'radars',\n verb: 'GET',\n relativePath: id,\n defaultKeyUrl: this.defaultUrlForAPI + '/radars',\n }\n );\n return new RadarNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async putRadar(radarNode: RadarNode): Promise<RadarNode> {\n const data: RaainApiRadarsUpdateRequestBody = {\n name: radarNode.name,\n };\n\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n RaainApiRadarsUpdateRequestBody,\n ReturnType<RadarNode['toJSON']>\n >({\n key: 'radars',\n relativePath: radarNode.id,\n verb: 'PUT',\n data,\n defaultKeyUrl: this.defaultUrlForAPI + '/radars/',\n });\n\n return new RadarNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async getLonelyRadars(rains: RainNode[]): Promise<RadarNode[]> {\n try {\n const allRadars = await this.getRadars();\n const lonelyRadars: RadarNode[] = [];\n allRadars.forEach((radar) => {\n let found = false;\n rains.forEach((rain) => {\n const rdId = rain.getLink(RadarNode.TYPE).getId();\n if (rdId === radar.id) {\n found = true;\n }\n });\n if (!found) {\n lonelyRadars.push(radar);\n }\n });\n return lonelyRadars;\n } catch (e) {\n await this.checkError(e);\n }\n return [];\n }\n\n async getRainTimeframe(\n rainId: string,\n begin: Date,\n end: Date,\n forced = false,\n provider = 'Raain',\n timeStepInMinutes = 10,\n windowInMinutes = 0\n ): Promise<RainNode> {\n try {\n const params: RaainApiRainsFindOneTimeframeCumulativeRequest = {\n format: 'timeframeCumulative',\n provider,\n timeStepInMinutes: String(timeStepInMinutes),\n begin: begin?.toISOString(),\n end: end?.toISOString(),\n };\n if (forced) {\n params.forced = 'true';\n }\n params.windowInMinutes = String(windowInMinutes);\n const queryString =\n BuildQueryString<RaainApiRainsFindOneTimeframeCumulativeRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsFindOneTimeframeCumulativeResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n const rainNode = new RainNode(resp.data.timeframeCumulative);\n rainNode.name += '.radar.timeframeCumulative';\n return rainNode;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Rains ===\n\n async getRains(name?: string): Promise<Array<RainNode>> {\n const rains = [];\n const params: RaainApiRainsFindAllMineRequest = {};\n if (name) {\n params.name = name;\n }\n try {\n let page = 1;\n let hasNext = true;\n while (hasNext) {\n params.page = page;\n const queryString = BuildQueryString<RaainApiRainsFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsFindAllMineResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n for (const rain of resp.data.rains) {\n rains.push(new RainNode(rain));\n }\n hasNext = resp.data.pagination?.hasNext ?? false;\n page++;\n }\n } catch (e) {\n await this.checkError(e);\n }\n return rains;\n }\n\n async getRain(id: string): Promise<RainNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiRainsFindOneResponse>({\n key: 'rains',\n relativePath: id,\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n return new RainNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Count\n\n async getCounts(\n rainId: string,\n options: {\n range: 'hour' | 'day' | 'month' | 'year';\n periodBegin: Date;\n }\n ): Promise<{\n percentImages: XYType[];\n percentRainy: XYType[];\n percentQ: XYType[];\n percentComputations: XYType[];\n queueRunning: number;\n }> {\n try {\n const params: RaainApiRainsGetCountsRequest = {\n range: options.range,\n begin: options.periodBegin.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiRainsGetCountsRequest>(params);\n\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsGetCountsResponse\n >({\n key: 'rains',\n relativePath: rainId + '/counts' + (queryString ? '?' + queryString : ''),\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n\n const counts = resp.data.counts.result;\n const percentImages: XYType[] = [],\n percentRainy: XYType[] = [],\n percentQ: XYType[] = [],\n percentComputations: XYType[] = [];\n\n counts.forEach((c) => {\n const label = this.setDateComponents(options.periodBegin, c);\n percentImages.push(new XYType(c.percentImages ?? 0, NaN, NaN, label));\n percentRainy.push(new XYType(c.percentRainy ?? 0, NaN, NaN, label));\n percentQ.push(new XYType(c.percentQ ?? 0, NaN, NaN, label));\n percentComputations.push(new XYType(c.percentComputations ?? 0, NaN, NaN, label));\n });\n\n return {\n percentImages,\n percentRainy,\n percentQ,\n percentComputations,\n queueRunning: resp.data.queueRunning,\n };\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getCountsHour(\n rainId: string,\n options: {periodBegin: Date}\n ): Promise<{\n percentImages: XYType[];\n percentComputations: XYType[];\n rainyCount: XYType[];\n rainySum: XYType[];\n queueRunning: number;\n }> {\n try {\n const params: RaainApiRainsGetCountsRequest = {\n range: 'hour',\n begin: options.periodBegin.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiRainsGetCountsRequest>(params);\n\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsGetCountsResponse\n >({\n key: 'rains',\n relativePath: rainId + '/counts' + (queryString ? '?' + queryString : ''),\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n\n const counts = resp.data.counts.result;\n const percentImages: XYType[] = [],\n percentComputations: XYType[] = [],\n rainySum: XYType[] = [],\n rainyCount: XYType[] = [];\n\n counts.forEach((c) => {\n const label = this.setDateComponents(options.periodBegin, c);\n percentImages.push(new XYType(c.percentImages ?? 0, NaN, NaN, label));\n percentComputations.push(new XYType(c.percentComputations ?? 0, NaN, NaN, label));\n rainyCount.push(new XYType(c.rainyCount ?? 0, NaN, NaN, label));\n rainySum.push(new XYType(c.rainySum ?? 0, NaN, NaN, label));\n });\n\n return {\n percentImages,\n percentComputations,\n rainyCount,\n rainySum,\n queueRunning: resp.data.queueRunning,\n };\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Computing ===\n\n async getRainComputationCumulativeCartesianMapById(\n rainId: string,\n rainComputationCumulativeId: string\n ): Promise<RainComputationMap> {\n const params: RaainApiRainsCumulativeCartesianMapRequest = {format: 'cartesian-map'};\n const queryString = BuildQueryString<RaainApiRainsCumulativeCartesianMapRequest>(params);\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCartesianMapResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainId}/cumulatives/${rainComputationCumulativeId}?${queryString}`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n if (!response.data['cartesian-map']) {\n return null;\n }\n\n const rainComputationMap = new RainComputationMap(response.data['cartesian-map']);\n rainComputationMap.name = rainId + '.rain.cartesian-map';\n return rainComputationMap;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainComputationCumulativeCumulativesMapById(\n rainId: string,\n rainComputationCumulativeId: string,\n cumulativeHours: number\n ): Promise<RainComputationMap> {\n const queryPath = `${rainId}/cumulatives/${rainComputationCumulativeId}/cumulative/${cumulativeHours}`;\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCumulativeResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryPath,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n if (!response.data['cumulative']) {\n return null;\n }\n\n const rainComputationMap = new RainComputationMap(response.data['cumulative']);\n rainComputationMap.name = rainId + '.rain.cumulative-cumulative';\n return rainComputationMap;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainCumulativeCompare(\n rainNode: RainNode,\n rainComputationCumulativeId: string\n ): Promise<RainComputationQuality> {\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeComparesResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainNode.id}/cumulatives/${rainComputationCumulativeId}/compares`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n const qualityJson = response.data.qualities[0];\n const rainComputationQuality = new RainComputationQuality(qualityJson);\n rainComputationQuality.qualitySpeedMatrixContainer =\n SpeedMatrixContainer.CreateFromJson(\n rainComputationQuality.qualitySpeedMatrixContainer\n );\n return rainComputationQuality;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // Fetch per-frequency quality for an on-demand cumulative\n // timeStepInMinutes = gauge frequency filter (e.g. 6 for 6min gauges, 30 for 30min gauges)\n // timeStepMode = 'eq' (exact match) or 'lte' (all frequencies <= timeStepInMinutes)\n // provider = gauge provider filter (e.g. 'Raain')\n async getRainCumulativeCumulativesCompare(\n rainNode: RainNode,\n rainComputationCumulativeId: string,\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ): Promise<RainComputationQuality> {\n const params: RaainApiRainsCumulativeCumulativesComparesRequest = {\n provider,\n timeStepInMinutes,\n timeStepMode,\n };\n\n const queryString =\n BuildQueryString<RaainApiRainsCumulativeCumulativesComparesRequest>(params);\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCumulativesComparesResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainNode.id}/cumulatives/${rainComputationCumulativeId}/compares?${queryString}`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n const allQualities = response.data.qualities;\n if (!allQualities?.length) {\n return null;\n }\n\n const rainComputationQuality = new RainComputationQuality(allQualities[0]);\n rainComputationQuality.qualitySpeedMatrixContainer =\n SpeedMatrixContainer.CreateFromJson(\n rainComputationQuality.qualitySpeedMatrixContainer\n );\n\n // Merge additional qualities (lte mode returns multiple freq groups)\n for (let i = 1; i < allQualities.length; i++) {\n const extra = new RainComputationQuality(allQualities[i]);\n extra.qualitySpeedMatrixContainer = SpeedMatrixContainer.CreateFromJson(\n extra.qualitySpeedMatrixContainer\n );\n rainComputationQuality.merge(extra);\n }\n\n return rainComputationQuality;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainProgress(rainId: string): Promise<number> {\n try {\n const queryPath = '' + rainId + '/progress';\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsProgressResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryPath,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n // return response.data.inProgress;\n return response.data.inQueue;\n } catch (e) {\n await this.checkError(e);\n }\n return 0;\n }\n\n async getIndicators(rainId: string): Promise<RaainApiRainsIndicatorsResponse> {\n try {\n const params: RaainApiRainsIndicatorsRequest = {\n cumulative: 'true',\n };\n const queryString = BuildQueryString<RaainApiRainsIndicatorsRequest>(params);\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsIndicatorsResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/indicators' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return {indicators: []};\n }\n\n // GET /rains/:rainId/cumulatives - List available cumulative periods\n // With detailed=true, returns individual cumulatives instead of aggregated periods\n async getCumulativePeriods(\n rainId: string,\n filters?: {\n windowInMinutes?: number;\n provider?: string;\n isReady?: boolean;\n forced?: boolean;\n detailed?: boolean;\n page?: number;\n limit?: number;\n periodBegin?: string;\n periodEnd?: string;\n }\n ): Promise<RaainApiRainsCumulativesListResponse | RaainApiRainsCumulativesDetailedResponse> {\n try {\n const params: RaainApiRainsCumulativesListRequest = {};\n if (filters?.windowInMinutes !== undefined) {\n params.windowInMinutes = filters.windowInMinutes;\n }\n if (filters?.provider) {\n params.provider = filters.provider;\n }\n if (filters?.isReady !== undefined) {\n params.isReady = filters.isReady;\n }\n if (filters?.forced !== undefined) {\n params.forced = filters.forced;\n }\n if (filters?.detailed) {\n params.detailed = true;\n }\n if (filters?.page !== undefined) {\n params.page = filters.page;\n }\n if (filters?.limit !== undefined) {\n params.limit = filters.limit;\n }\n if (filters?.periodBegin) {\n params.periodBegin = filters.periodBegin;\n }\n if (filters?.periodEnd) {\n params.periodEnd = filters.periodEnd;\n }\n const queryString = BuildQueryString<RaainApiRainsCumulativesListRequest>(params);\n\n if (filters?.detailed) {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativesDetailedResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/cumulatives' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n return response.data;\n }\n\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativesListResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/cumulatives' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return {periods: [], total: 0};\n }\n\n // POST /rains/:rainId/cumulatives - Trigger cumulative computation\n async createCumulativePeriod(\n rainId: string,\n params: {\n periodBegin: Date;\n periodEnd: Date;\n provider: string;\n confName?: string;\n timeStepInMinutes?: number;\n }\n ): Promise<RaainApiRainsCumulativesCreateResponse> {\n try {\n const body: RaainApiRainsCumulativesCreateRequest = {\n periodBegin: params.periodBegin.toISOString(),\n periodEnd: params.periodEnd.toISOString(),\n provider: params.provider,\n confName: params.confName || 'admin',\n timeStepInMinutes: params.timeStepInMinutes || 5,\n };\n\n const response = await this.fidjService.sendOnEndpoint<\n RaainApiRainsCumulativesCreateRequest,\n RaainApiRainsCumulativesCreateResponse\n >({\n key: 'rains',\n verb: 'POST',\n relativePath: rainId + '/cumulatives',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n data: body,\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Gauges ===\n\n async getGauge(gaugeId: string): Promise<GaugeNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiGaugesFindOneResponse>(\n {\n key: 'gauges',\n verb: 'GET',\n relativePath: gaugeId,\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n }\n );\n return new GaugeNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async getGauges(\n rainId: string,\n aroundLatLng: LatLng,\n pageCount = 1\n ): Promise<Array<GaugeNodeFilter>> {\n const baseParams: RaainApiGaugesFindAllMineRequest = {\n aroundLatLng: `${aroundLatLng.lat},${aroundLatLng.lng}`,\n rainId,\n };\n if (this.asTeamId) {\n baseParams.teamId = this.asTeamId;\n }\n\n const gauges = [];\n try {\n for (let count = 1; count <= pageCount; count++) {\n const params: RaainApiGaugesFindAllMineRequest = {...baseParams, page: count};\n const queryString = BuildQueryString<RaainApiGaugesFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiGaugesFindAllMineResponse\n >({\n key: 'gauges',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n });\n\n for (const gauge of resp.data.gauges) {\n gauges.push(new GaugeNodeFilter(gauge));\n }\n }\n } catch (e) {\n await this.checkError(e);\n }\n return gauges;\n }\n\n async getGaugeMeasures(gaugeId: string, begin: Date, end: Date): Promise<GaugeMeasure[]> {\n const params: RaainApiGaugesFindMeasuresRequest = {\n begin: begin.toISOString(),\n end: end.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiGaugesFindMeasuresRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiGaugesFindMeasuresResponse\n >({\n key: 'gauges',\n verb: 'GET',\n relativePath: gaugeId + '/measures' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n });\n\n const gaugeMeasures: GaugeMeasure[] = [];\n for (const gaugeMeasure of resp.data.gaugeMeasures) {\n gaugeMeasures.push(new GaugeMeasure(gaugeMeasure));\n }\n return gaugeMeasures;\n }\n\n async getProviders(\n rainId: string\n ): Promise<{providers: string[]; timeStepInMinutes: number[]}> {\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsProvidersResponse\n >({\n verb: 'GET',\n key: 'rains',\n relativePath: rainId + '/providers',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return {\n providers: response.data.providers || [],\n timeStepInMinutes: response.data.timeStepInMinutes?.length\n ? response.data.timeStepInMinutes\n : [5, 10, 15, 30, 60],\n };\n } catch (e) {\n console.error('getProviders error:', e);\n return {\n providers: [],\n timeStepInMinutes: [5, 10, 15, 30, 60],\n };\n }\n }\n\n protected setRoles(roles: Array<string>): void {\n this.roles = roles;\n }\n\n private setDateComponents(\n date: Date,\n c: {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n }\n ): string {\n const dateToShow = new Date(date);\n\n if (c.year !== undefined) {\n dateToShow.setUTCFullYear(c.year);\n }\n if (c.month !== undefined) {\n dateToShow.setUTCMonth(c.month - 1);\n }\n if (c.day !== undefined) {\n dateToShow.setUTCDate(c.day);\n }\n if (c.hour !== undefined) {\n dateToShow.setUTCHours(c.hour);\n }\n if (c.minute !== undefined) {\n dateToShow.setUTCMinutes(c.minute);\n }\n\n return dateToShow.toISOString();\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport {ProfileService} from '../profile.service';\nimport {\n CumulativePeriod,\n IndividualCumulative,\n RaainApiRainsCumulativesDetailedResponse,\n RaainApiRainsCumulativesListResponse,\n} from 'raain-model';\n\nexport interface CumulativeSelection {\n periodBegin: Date;\n periodEnd: Date;\n windowInMinutes: number;\n cumulativeId?: string;\n cumulativeDate?: Date;\n}\n\n@Component({\n selector: 'cumulative-selector',\n templateUrl: './cumulative-selector.component.html',\n styleUrls: ['./cumulative-selector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CumulativeSelectorComponent implements OnInit {\n @Input() rainId: string;\n @Input() currentPeriodBegin: Date;\n @Input() currentPeriodEnd: Date;\n @Input() provider: string;\n @Input() timeStepInMinutes: number = 5;\n @Input() isAdmin: boolean = false;\n\n @Output() periodSelected = new EventEmitter<CumulativeSelection>();\n @Output() cancelled = new EventEmitter<void>();\n\n availablePeriods: CumulativePeriod[] = [];\n baseCumulatives: CumulativePeriod = null;\n loading = true;\n creating = false;\n creationProgress = '';\n errorMessage = '';\n\n coveragePercent = 0;\n canCreateNew = false;\n currentWindowMinutes = 0;\n\n expandedPeriods: Map<string, IndividualCumulative[]> = new Map();\n loadingExpanded: Set<string> = new Set();\n\n private readonly POLL_TIMEOUT_MS = 900000; // 900 seconds\n private readonly POLL_INTERVAL_MS = 3000;\n\n constructor(\n private profileService: ProfileService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n this.currentWindowMinutes = Math.round(\n (this.currentPeriodEnd.getTime() - this.currentPeriodBegin.getTime()) / 60000\n );\n await this.loadAvailablePeriods();\n }\n\n async loadAvailablePeriods() {\n this.loading = true;\n this.errorMessage = '';\n this.cdr.markForCheck();\n\n try {\n // Fetch all cumulative periods (admin sees all, non-admin sees only customer-launched)\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n forced: this.isAdmin,\n periodBegin: this.currentPeriodBegin.toISOString(),\n periodEnd: this.currentPeriodEnd.toISOString(),\n })) as RaainApiRainsCumulativesListResponse;\n\n // Filter for existing custom cumulatives (window > 0)\n this.availablePeriods = response.periods.filter((p) => p.windowInMinutes > 0);\n\n // Get base cumulatives (window = 0) to check coverage\n this.baseCumulatives = response.periods.find((p) => p.windowInMinutes === 0);\n\n this.calculateCoverage();\n } catch (e) {\n this.errorMessage = 'Failed to load cumulative periods';\n console.error('Error loading cumulative periods:', e);\n }\n\n this.loading = false;\n this.cdr.markForCheck();\n }\n\n calculateCoverage() {\n if (!this.baseCumulatives || !this.baseCumulatives.count) {\n this.coveragePercent = 0;\n this.canCreateNew = false;\n return;\n }\n\n // Calculate expected number of base cumulatives (always 5-min granularity)\n const baseTimeStep = 5;\n const expectedCount = Math.ceil(this.currentWindowMinutes / baseTimeStep);\n\n if (this.baseCumulatives.count >= expectedCount) {\n this.coveragePercent = 100;\n } else {\n this.coveragePercent = Math.round((this.baseCumulatives.count / expectedCount) * 100);\n }\n\n // Allow creation as long as some base data exists\n this.canCreateNew = this.coveragePercent > 0;\n }\n\n selectPeriod(period: CumulativePeriod) {\n this.periodSelected.emit({\n periodBegin: new Date(period.periodBegin),\n periodEnd: new Date(period.periodEnd),\n windowInMinutes: period.windowInMinutes,\n });\n }\n\n async toggleExpand(period: CumulativePeriod) {\n const key = `${period.windowInMinutes}`;\n if (this.expandedPeriods.has(key)) {\n this.expandedPeriods.delete(key);\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingExpanded.add(key);\n this.cdr.markForCheck();\n\n try {\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n windowInMinutes: period.windowInMinutes,\n forced: this.isAdmin,\n detailed: true,\n })) as RaainApiRainsCumulativesDetailedResponse;\n\n this.expandedPeriods.set(key, response.cumulatives || []);\n } catch (e) {\n console.error('Error loading individual cumulatives:', e);\n this.expandedPeriods.set(key, []);\n }\n\n this.loadingExpanded.delete(key);\n this.cdr.markForCheck();\n }\n\n selectIndividualCumulative(item: IndividualCumulative) {\n const endDate = new Date(item.date);\n const beginDate = new Date(endDate.getTime() - item.windowInMinutes * 60000);\n\n this.periodSelected.emit({\n periodBegin: beginDate,\n periodEnd: endDate,\n windowInMinutes: item.windowInMinutes,\n cumulativeId: item.id,\n cumulativeDate: endDate,\n });\n }\n\n isExpanded(period: CumulativePeriod): boolean {\n return this.expandedPeriods.has(`${period.windowInMinutes}`);\n }\n\n isLoadingExpanded(period: CumulativePeriod): boolean {\n return this.loadingExpanded.has(`${period.windowInMinutes}`);\n }\n\n getExpandedItems(period: CumulativePeriod): IndividualCumulative[] {\n return this.expandedPeriods.get(`${period.windowInMinutes}`) || [];\n }\n\n getItemPeriodBegin(item: IndividualCumulative): Date {\n const endDate = new Date(item.date);\n return new Date(endDate.getTime() - item.windowInMinutes * 60000);\n }\n\n async createNewPeriod() {\n if (!this.canCreateNew || this.creating) {\n return;\n }\n\n this.creating = true;\n this.creationProgress = 'Starting cumulative computation...';\n this.errorMessage = '';\n this.cdr.markForCheck();\n\n try {\n // Trigger cumulative creation\n const result = await this.profileService.createCumulativePeriod(this.rainId, {\n periodBegin: this.currentPeriodBegin,\n periodEnd: this.currentPeriodEnd,\n provider: this.provider,\n timeStepInMinutes: this.timeStepInMinutes,\n });\n\n if (!result) {\n throw new Error('Failed to trigger cumulative computation');\n }\n\n this.creationProgress = `Jobs queued. Polling for completion...`;\n this.cdr.markForCheck();\n\n // Poll for completion\n const success = await this.pollForCompletion();\n\n if (success) {\n this.periodSelected.emit({\n periodBegin: this.currentPeriodBegin,\n periodEnd: this.currentPeriodEnd,\n windowInMinutes: this.currentWindowMinutes,\n });\n } else {\n this.errorMessage = 'Timeout waiting for cumulative computation';\n }\n } catch (e) {\n this.errorMessage = `Error: ${e.message || 'Unknown error'}`;\n console.error('Error creating cumulative:', e);\n }\n\n this.creating = false;\n this.cdr.markForCheck();\n }\n\n private async pollForCompletion(): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < this.POLL_TIMEOUT_MS) {\n try {\n const progress = await this.profileService.getRainProgress(this.rainId);\n\n if (progress === 0) {\n // Trigger background fetch from raain-ground via timeframeCumulative\n await this.profileService.getRainTimeframe(\n this.rainId,\n this.currentPeriodBegin,\n this.currentPeriodEnd,\n this.isAdmin,\n this.provider,\n this.timeStepInMinutes,\n this.currentWindowMinutes\n );\n\n // Check if cumulative now exists (admin sees all cumulatives)\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n windowInMinutes: this.currentWindowMinutes,\n forced: this.isAdmin,\n })) as RaainApiRainsCumulativesListResponse;\n\n const found = response.periods.find(\n (p) => p.windowInMinutes === this.currentWindowMinutes\n );\n\n if (found) {\n return true;\n }\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n this.creationProgress = `Computing... (${elapsed}s, queue: ${progress})`;\n this.cdr.markForCheck();\n\n await this.sleep(this.POLL_INTERVAL_MS);\n } catch (e) {\n console.warn('Poll error:', e);\n await this.sleep(this.POLL_INTERVAL_MS);\n }\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n cancel() {\n this.cancelled.emit();\n }\n\n formatPeriod(period: CumulativePeriod): string {\n const begin = new Date(period.periodBegin);\n const end = new Date(period.periodEnd);\n return `${begin.toLocaleString()} → ${end.toLocaleString()}`;\n }\n\n formatWindow(minutes: number): string {\n if (minutes < 60) {\n return `${minutes} min`;\n }\n const hours = minutes / 60;\n return hours === 1 ? '1 hour' : `${hours} hours`;\n }\n}\n","<div class=\"cumulative-selector-overlay\">\n <div class=\"cumulative-selector-modal\">\n <div class=\"modal-header\">\n <h2>Select Cumulative Period</h2>\n <ion-button (click)=\"cancel()\" fill=\"clear\">\n <ion-icon name=\"close\"></ion-icon>\n </ion-button>\n </div>\n\n <div class=\"modal-content\">\n <!-- Loading state -->\n <div *ngIf=\"loading\" class=\"loading-state\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Loading available periods...</p>\n </div>\n\n <!-- Error message -->\n <div *ngIf=\"errorMessage\" class=\"error-message\">\n <ion-icon name=\"warning-outline\"></ion-icon>\n <span>{{ errorMessage }}</span>\n </div>\n\n <!-- Available periods list -->\n <div *ngIf=\"!loading && availablePeriods.length > 0\" class=\"periods-section\">\n <h3>Available Cumulative Periods</h3>\n <ion-list>\n <ng-container *ngFor=\"let period of availablePeriods\">\n <!-- Period header (click to expand) -->\n <ion-item (click)=\"toggleExpand(period)\" [disabled]=\"creating\" button>\n <ion-icon [name]=\"isExpanded(period) ? 'chevron-down' : 'chevron-forward'\"\n slot=\"start\"></ion-icon>\n <ion-label>\n <h2>{{ formatWindow(period.windowInMinutes) }}</h2>\n <p>{{ formatPeriod(period) }}</p>\n <p class=\"count-info\">{{ period.count }} cumulative(s) - click to expand</p>\n </ion-label>\n </ion-item>\n\n <!-- Expanded: individual cumulatives -->\n <div *ngIf=\"isExpanded(period)\" class=\"expanded-items\">\n <ion-spinner *ngIf=\"isLoadingExpanded(period)\" name=\"crescent\"></ion-spinner>\n <ion-list *ngIf=\"!isLoadingExpanded(period)\" class=\"nested-list\">\n <ion-item (click)=\"selectIndividualCumulative(item)\"\n *ngFor=\"let item of getExpandedItems(period)\"\n [disabled]=\"creating\"\n button\n class=\"nested-item\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n <ion-label>\n <h3>{{ getItemPeriodBegin(item) | date:'HH:mm' }}\n - {{ item.date | date:'HH:mm' }}</h3>\n </ion-label>\n <ion-icon name=\"chevron-forward\" slot=\"end\"></ion-icon>\n </ion-item>\n <ion-item *ngIf=\"getExpandedItems(period).length === 0\" class=\"nested-item\">\n <ion-label>\n <p>No individual cumulatives found</p>\n </ion-label>\n </ion-item>\n </ion-list>\n </div>\n </ng-container>\n </ion-list>\n </div>\n\n <!-- No periods available -->\n <div *ngIf=\"!loading && availablePeriods.length === 0\" class=\"no-periods\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>No cumulative periods available yet.</p>\n </div>\n\n <!-- Create new section (admin only) -->\n <div *ngIf=\"!loading && isAdmin\" class=\"create-section\">\n <h3>Create New Cumulative</h3>\n <div class=\"create-info\">\n <p>\n <strong>Period:</strong>\n {{ currentPeriodBegin?.toLocaleString() }} → {{ currentPeriodEnd?.toLocaleString() }}\n </p>\n <p>\n <strong>Window:</strong> {{ formatWindow(currentWindowMinutes) }}\n </p>\n <p *ngIf=\"baseCumulatives\" [class.coverage-error]=\"coveragePercent === 0\"\n [class.coverage-ok]=\"coveragePercent >= 100\"\n [class.coverage-warn]=\"coveragePercent > 0 && coveragePercent < 100\"\n class=\"coverage-info\">\n <ion-icon [name]=\"coveragePercent >= 100 ? 'checkmark-circle' : 'alert-circle'\"></ion-icon>\n Base data coverage: {{ coveragePercent }}%\n </p>\n <p *ngIf=\"!baseCumulatives\" class=\"coverage-error\">\n <ion-icon name=\"alert-circle\"></ion-icon>\n No base cumulatives available\n </p>\n </div>\n\n <!-- Creation progress -->\n <div *ngIf=\"creating\" class=\"creation-progress\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>{{ creationProgress }}</span>\n </div>\n\n <ion-button (click)=\"createNewPeriod()\" [disabled]=\"!canCreateNew || creating\"\n expand=\"block\"\n id=\"createNewCumulative\">\n <ion-icon name=\"add-circle-outline\" slot=\"start\"></ion-icon>\n Create {{ formatWindow(currentWindowMinutes) }} Cumulative\n </ion-button>\n\n <p *ngIf=\"!canCreateNew && !creating\" class=\"create-hint\">\n Create is disabled because no base 5-min cumulatives exist for the selected period.\n </p>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <ion-button (click)=\"cancel()\" [disabled]=\"creating\" fill=\"outline\">\n Cancel\n </ion-button>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {IonToggle} from '@ionic/angular';\nimport {ProfileService} from '../profile.service';\nimport {\n CartesianMeasureValue,\n QualityIndicator,\n RaainApiRainsCumulativesListResponse,\n RainNode,\n TeamNode,\n} from 'raain-model';\nimport {\n DateRange,\n ElementsFactory,\n MapLatLng,\n ModelPerformanceElement,\n ModelPerformanceElementInput,\n TimeframeContainers,\n} from 'raain-ui';\nimport {CompareManager, FrameSet, mapDateRangeToString, RefreshManager} from '../tools';\nimport {XYType} from '../xytype';\nimport {RadarService} from '../radar.service';\nimport {Storage} from '../storage.service';\nimport {CumulativeSelection} from '../cumulative-selector/cumulative-selector.component';\n\nlet TEST_DETECTION = 0;\n\n@Component({\n selector: 'raain-details',\n templateUrl: 'raain-details.component.html',\n styleUrls: ['raain-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaainDetailsComponent implements OnDestroy, OnChanges {\n private static readonly HOUR_MS = 60 * 60000;\n private static readonly DAY_MS = 24 * 60 * 60 * 1000;\n\n @Input()\n public toggleAdmin: boolean;\n @Input()\n public rainNode: RainNode;\n @Input()\n public compareManager: CompareManager;\n @Input()\n public refreshManager: RefreshManager;\n @Input()\n public profileService: ProfileService;\n @Input()\n public radarService: RadarService;\n @Input()\n public scaleLabel = 'mm';\n @Input()\n public showCreateMissingImages = true;\n @Input()\n public showCumulativeCompare = true;\n @Input()\n public showDateRange = true;\n @Input()\n public showCumulativeToggle = true;\n @Input()\n public forceTimeStep: number;\n\n public availableProviders: string[] = [];\n public availableTimeSteps: number[] = [];\n public availableTimeStepOptions: {label: string; value: string}[] = [];\n public selectedProvider: string;\n public selectedTimeStep: number;\n public timeStepMode: 'eq' | 'lte' = 'eq';\n\n public periodBegin: Date;\n public periodEnd: Date;\n\n // public UI variables\n public teamNode: TeamNode;\n public periodBeginAsString: string;\n public periodEndAsString: string;\n public periodDurationAsString: string;\n public dateShown: Date;\n public coordinates: MapLatLng;\n public borders: MapLatLng[];\n public timeframeContainers: TimeframeContainers;\n public currentTimeframeTarget: FrameSet;\n public timeframeDates: Date[];\n public countPoints: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n public countsPeriod: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n };\n\n public gaugeSelectedPoints: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n public toggleHistory: boolean;\n public toggleMap: boolean;\n public toggleCompare: boolean;\n public toggleGaugeMeasures: boolean;\n public toggleRemoveCompareDuplicate: boolean;\n public toggleCumulative: boolean;\n public refreshInProgress: boolean;\n public sumDetails: string;\n public showPixelMarkers: boolean = false;\n public isAdmin: boolean;\n public showFullError: boolean;\n public showQualityModal: boolean;\n public qualityIndicators: QualityIndicator[] = [];\n public qualityIndicatorsLoading: boolean = false;\n public showCumulativeSelector: boolean = false;\n public creatingCumulative: boolean = false;\n public showQualityDetails: boolean = false;\n public modelPerformanceData: Array<{\n name: string;\n date: Date;\n KPEi: number | null;\n KPE1: number | null;\n }> = [];\n private performanceChart: ModelPerformanceElement;\n\n @ViewChild('cumulativeToggle') cumulativeToggleRef: IonToggle;\n @ViewChild('performanceCanvas') performanceCanvasRef: any;\n\n // Cached computed values (to avoid method calls in templates)\n public percentOfComputations: number = 0;\n public presentComputationCount: number = 0;\n public expectedComputationCount: number = 0;\n public percentOfImages: number = 0;\n public truncatedError: string = '';\n public cumulativeDurationInMinutes: number = 10;\n protected readonly DateRange = DateRange;\n\n constructor(\n protected storage: Storage,\n private readonly cdr: ChangeDetectorRef\n ) {}\n\n private static PeriodDisplay(date: Date | string) {\n let d = new Date();\n if (date) {\n d = new Date(date);\n const userTimezoneOffset = d.getTimezoneOffset() * 60000;\n d = new Date(d.getTime() - userTimezoneOffset);\n }\n const exampleFormattedDate = '2017-06-01T08:30';\n return d.toISOString().substring(0, exampleFormattedDate.length);\n }\n\n private static DateUTC(date: string) {\n const hasISOFormat = date.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/);\n let d = new Date(date);\n if (!hasISOFormat) {\n const userTimezoneOffset = d.getTimezoneOffset() * 60000;\n d = new Date(d.getTime() - userTimezoneOffset);\n }\n return d;\n }\n\n private static MapCountToDateValue(c: XYType): {date: Date; value: number} {\n return {\n date: RaainDetailsComponent.DateUTC(c.name),\n value: Math.min(100, c.x),\n };\n }\n\n async openQualityModal() {\n this.showQualityModal = true;\n this.qualityIndicatorsLoading = true;\n this.qualityIndicators = [];\n this.modelPerformanceData = [];\n this.cdr.markForCheck();\n\n if (this.rainNode?.id) {\n const result = await this.profileService.getIndicators(this.rainNode.id);\n this.qualityIndicators = result.indicators;\n this.modelPerformanceData = this.buildModelPerformanceData(result.indicators);\n }\n\n this.qualityIndicatorsLoading = false;\n this.cdr.markForCheck();\n\n if (this.modelPerformanceData.length > 0) {\n setTimeout(() => this.renderPerformanceChart(), 100);\n }\n }\n\n closeQualityModal() {\n this.showQualityModal = false;\n if (this.performanceChart?.chart) {\n this.performanceChart.chart.destroy();\n this.performanceChart = null;\n }\n }\n\n buildModelPerformanceData(\n indicators: QualityIndicator[]\n ): Array<{name: string; date: Date; KPEi: number | null; KPE1: number | null}> {\n // Group by version combo (computingVersion + qualityVersion)\n const grouped = new Map<string, {date: Date; KPEi: number | null; KPE1: number | null}>();\n\n for (const ind of indicators) {\n const key = `C${ind.computingVersion}-Q${ind.qualityVersion}`;\n if (!grouped.has(key)) {\n grouped.set(key, {date: new Date(ind.lastUpdatedAt), KPEi: null, KPE1: null});\n }\n const entry = grouped.get(key);\n\n // Update date to latest\n const indDate = new Date(ind.lastUpdatedAt);\n if (indDate.getTime() > entry.date.getTime()) {\n entry.date = indDate;\n }\n\n if (ind.timeStepInMinutes === 5) {\n entry.KPEi = ind.averageQuality;\n } else if (ind.timeStepInMinutes === 60) {\n entry.KPE1 = ind.averageQuality;\n }\n }\n\n return Array.from(grouped.entries()).map(([name, data]) => ({\n name,\n date: data.date,\n KPEi: data.KPEi,\n KPE1: data.KPE1,\n }));\n }\n\n private renderPerformanceChart() {\n const canvas = this.performanceCanvasRef?.nativeElement;\n if (!canvas) {\n return;\n }\n const factory = new ElementsFactory();\n this.performanceChart = factory.createModelPerformance(\n canvas,\n new ModelPerformanceElementInput(this.modelPerformanceData)\n );\n }\n\n formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return (\n date.toLocaleDateString() +\n ' ' +\n date.toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'})\n );\n }\n\n public async fetchData(focusDate: Date, focusRange: DateRange) {\n const values = [];\n for (let i = 0; i < 10; i++) {\n values.push({date: new Date(2020 + i, 0), value: 10});\n }\n const fakeData = [\n {\n label: '% Rainy',\n style: 'bar',\n values,\n },\n {\n label: '% Images',\n style: 'bar',\n values,\n },\n {\n label: '% Computations',\n style: 'bar',\n values,\n },\n ];\n\n const range = mapDateRangeToString(focusRange);\n let data = fakeData;\n if (!this.rainNode) {\n return data;\n }\n\n if (focusRange === DateRange.CENTURY) {\n // fake\n } else if (focusRange === DateRange.HOUR) {\n const hourCounts = await this.profileService.getCountsHour(this.rainNode.id, {\n periodBegin: focusDate,\n });\n\n data = [\n {\n label: 'Rainy Count',\n style: 'line',\n values: hourCounts.rainyCount.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Images',\n style: 'bar',\n values: hourCounts.percentImages.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Computations',\n style: 'bar',\n values: hourCounts.percentComputations.map(\n RaainDetailsComponent.MapCountToDateValue\n ),\n },\n {\n label: 'Rainy Sum',\n style: 'line',\n values: hourCounts.rainySum.map(RaainDetailsComponent.MapCountToDateValue),\n },\n ];\n } else {\n const counts = await this.profileService.getCounts(this.rainNode.id, {\n range,\n periodBegin: focusDate,\n });\n\n data = [\n {\n label: '% Rainy',\n style: 'bar',\n values: counts.percentRainy.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Images',\n style: 'bar',\n values: counts.percentImages.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Computations',\n style: 'bar',\n values: counts.percentComputations.map(\n RaainDetailsComponent.MapCountToDateValue\n ),\n },\n ];\n }\n\n // console.log(`fetchData DONE ${range}`, data);\n return data;\n }\n\n // Wrapper function that preserves the async nature of fetchData\n public fetchDataWrapper = async (focusDate: Date, focusRange: DateRange) => {\n return await this.fetchData(focusDate, focusRange);\n };\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes).then((ignored) => {});\n }\n\n ngOnDestroy() {\n this.cleanAll();\n }\n\n async onEnableCountHistoryTab(rain: RainNode) {\n if (!this.toggleHistory) {\n this.countPoints = [];\n }\n }\n\n async onPeriodBeginChange(event: any) {\n const newValue = event?.target?.value ?? this.periodBeginAsString;\n this.periodBegin = new Date(newValue);\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.storage.set('raain-periodBegin', this.periodBegin);\n\n await this.onPeriodDurationChange(event);\n }\n\n async onPeriodEndChange(event: any) {\n const newValue = event?.target?.value ?? this.periodEndAsString;\n this.periodEnd = new Date(newValue);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n this.storage.set('raain-periodEnd', this.periodEnd);\n\n this.periodBegin = new Date(\n this.periodEnd.getTime() - this.getDurationInHours() * RaainDetailsComponent.HOUR_MS\n );\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.storage.set('raain-periodBegin', this.periodBegin);\n this.updateRefreshManagerPeriod();\n }\n\n async onPeriodDurationChange(_event: object) {\n const durationInHours = this.getDurationInHours();\n this.periodEnd = new Date(\n this.periodBegin.getTime() + durationInHours * RaainDetailsComponent.HOUR_MS\n );\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n this.storage.set('raain-periodEnd', this.periodEnd);\n this.storage.set('raain-periodDurationInHours', durationInHours);\n this.updateRefreshManagerPeriod();\n this.updateCumulativeDurationInMinutes();\n }\n\n async onDateChangeInCount(dateChanged: Date) {\n const dateString =\n dateChanged.toISOString().substring(0, 11) +\n dateChanged.toLocaleTimeString().substring(0, 5);\n this.periodDurationAsString = '1';\n\n if (this.toggleCumulative) {\n // Cumulative: select periodEnd\n this.periodEndAsString = dateString;\n await this.onPeriodEndChange(null);\n } else {\n // Granular: select periodBegin\n this.periodBeginAsString = dateString;\n await this.onPeriodBeginChange(null);\n }\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n async onDateChangeInMap(dateShown: Date) {\n this.dateShown = dateShown;\n await this.fetchAndUpdateMap();\n await this.refreshManager.setReportPeriod(this.dateShown);\n }\n\n async onSumChangeInMap(sum: string) {\n this.sumDetails = sum;\n }\n\n async onGaugeSelectInMap(mapLatLng: MapLatLng) {\n const gaugesFiltered = this.compareManager.gaugesInMap.filter(\n (g) => g.lat === mapLatLng.lat && g.lng === mapLatLng.lng\n );\n if (gaugesFiltered.length !== 1) {\n return;\n }\n const gaugeSelected = gaugesFiltered[0];\n\n await this.refreshGaugeValues({id: gaugeSelected.id, name: gaugeSelected.name});\n\n await this.compareManager.selectGauge(gaugeSelected.id, 0);\n }\n\n async refreshGaugeValues(gaugeSelected: {id: string; name: string}) {\n const gaugeValueShowBegin = new Date(\n this.periodBegin.getTime() - RaainDetailsComponent.DAY_MS\n );\n const gaugeValueShowEnd = new Date(this.periodEnd.getTime() + RaainDetailsComponent.DAY_MS);\n gaugeValueShowBegin.setHours(0, 0);\n gaugeValueShowEnd.setHours(23, 59);\n\n const gaugeMeasures = await this.profileService.getGaugeMeasures(\n gaugeSelected.id,\n gaugeValueShowBegin,\n gaugeValueShowEnd\n );\n const gaugeValues: {date: Date; value: number}[] = gaugeMeasures.map((gm) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cartesianMeasureValue = new CartesianMeasureValue(gm.values[0] as any);\n return {\n date: gm.date,\n value: cartesianMeasureValue.getCartesianValues()[0].value,\n };\n });\n this.gaugeSelectedPoints = [\n {\n label: gaugeSelected.name,\n style: 'bar',\n values: gaugeValues,\n },\n ];\n this.cdr.markForCheck();\n }\n\n async onGaugeSelectInCompare(e: {point: XYType; compareIndex: number}) {\n await this.refreshGaugeValues({id: e.point.id, name: e.point.name});\n\n await this.compareManager.selectGauge(e.point.id, e.compareIndex);\n }\n\n async onToggleMap($event: Event) {\n // if (this.toggleMap) {\n // await this.refreshMap();\n // }\n }\n\n onTogglePixelMarkers() {\n // Toggle is bound to showPixelMarkers, raain-map handles marker display\n }\n\n async onCumulativeToggleClick($event: Event) {\n console.log('[CumulativeToggle] click event', {\n currentValue: this.toggleCumulative,\n eventType: $event.type,\n target: ($event.target as HTMLElement)?.tagName,\n });\n\n $event.preventDefault();\n $event.stopPropagation();\n\n if (!this.toggleCumulative) {\n console.log('[CumulativeToggle] showing popup, toggle stays OFF');\n // Currently OFF, user wants to enable - show selector popup\n this.showCumulativeSelector = true;\n\n // Force reset the toggle visual state after ion-toggle's internal handler\n setTimeout(() => {\n if (this.cumulativeToggleRef) {\n this.cumulativeToggleRef.checked = false;\n console.log('[CumulativeToggle] force reset toggle to OFF');\n }\n }, 0);\n\n this.cdr.markForCheck();\n } else {\n console.log('[CumulativeToggle] turning OFF');\n // Currently ON, user wants to disable - direct toggle off\n this.toggleCumulative = false;\n this.storage.set('raain-toggleCumulative', false);\n this.dateShown = this.getDateBasedOnCumulativeMode(this.timeframeDates);\n this.updateCumulativeDurationInMinutes();\n if (this.toggleMap) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n this.cdr.markForCheck();\n }\n console.log('[CumulativeToggle] after handler, toggleCumulative =', this.toggleCumulative);\n }\n\n async onCumulativePeriodSelected(selection: CumulativeSelection) {\n this.showCumulativeSelector = false;\n\n // Update period to match selection\n this.periodBegin = selection.periodBegin;\n this.periodEnd = selection.periodEnd;\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n\n // Calculate duration in hours\n const durationMs = this.periodEnd.getTime() - this.periodBegin.getTime();\n const durationHours = durationMs / RaainDetailsComponent.HOUR_MS;\n this.periodDurationAsString = String(durationHours);\n\n // Store cumulative period\n this.storage.set('raain-periodBegin', this.periodBegin);\n this.storage.set('raain-periodEnd', this.periodEnd);\n this.storage.set('raain-periodDurationInHours', durationHours);\n\n // Enable cumulative mode\n this.toggleCumulative = true;\n this.storage.set('raain-toggleCumulative', true);\n\n this.dateShown = this.getDateBasedOnCumulativeMode(this.timeframeDates);\n this.updateCumulativeDurationInMinutes();\n\n // Refresh map\n if (this.toggleMap) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n this.cdr.markForCheck();\n }\n\n onCumulativeSelectorCancelled() {\n console.log('[CumulativeToggle] cancelled, toggleCumulative =', this.toggleCumulative);\n this.showCumulativeSelector = false;\n this.cdr.markForCheck();\n }\n\n updateCumulativeDurationInMinutes() {\n if (this.toggleCumulative) {\n // Cumulative mode: use period duration\n this.cumulativeDurationInMinutes = parseFloat(this.periodDurationAsString) * 60;\n } else {\n // Granular mode: use selectedTimeStep\n this.cumulativeDurationInMinutes = this.selectedTimeStep || 10;\n }\n }\n\n async onProviderChanged($event: Event) {\n this.selectedProvider = ($event as CustomEvent)?.detail?.value;\n this.storage.set('raain-selectedProvider', this.selectedProvider);\n await this.applyRefreshManagerSettings();\n }\n\n async onTimeStepChanged($event: Event) {\n const raw: string = ($event as CustomEvent)?.detail?.value;\n const [mode, stepStr] = raw.split(':');\n this.timeStepMode = mode as 'eq' | 'lte';\n this.selectedTimeStep = parseInt(stepStr, 10);\n this.storage.set('raain-selectedTimeStep', this.selectedTimeStep);\n this.storage.set('raain-timeStepMode', this.timeStepMode);\n this.updateCumulativeDurationInMinutes();\n await this.applyRefreshManagerSettings();\n }\n\n async loadProviders() {\n if (!this.rainNode?.id) {\n return;\n }\n\n try {\n const result = await this.profileService.getProviders(this.rainNode.id);\n this.availableProviders = result.providers.sort();\n this.availableTimeSteps = result.timeStepInMinutes.sort((a, b) => a - b);\n\n // Load saved selections or use defaults\n this.selectedProvider =\n this.storage.get('raain-selectedProvider') ||\n (this.availableProviders.length > 0 ? this.availableProviders[0] : 'Raain');\n this.selectedTimeStep =\n this.storage.get('raain-selectedTimeStep') ||\n (this.availableTimeSteps.length > 0 ? this.availableTimeSteps[0] : 10);\n this.timeStepMode = this.storage.get('raain-timeStepMode') || 'eq';\n } catch (e) {\n // Set fallback values\n this.availableProviders = ['Raain'];\n this.availableTimeSteps = [5, 10, 15, 30, 60];\n this.selectedProvider = 'Raain';\n this.selectedTimeStep = 10;\n this.timeStepMode = 'eq';\n }\n // Override timeStep if forced\n if (this.forceTimeStep) {\n this.selectedTimeStep = this.forceTimeStep;\n }\n\n this.buildTimeStepOptions();\n\n // Set provider and timeStep on refreshManager\n if (this.refreshManager) {\n this.refreshManager.provider = this.selectedProvider;\n this.refreshManager.timeStepInMinutes = this.selectedTimeStep;\n this.refreshManager.timeStepMode = this.timeStepMode;\n }\n this.cdr.markForCheck();\n }\n\n private buildTimeStepOptions() {\n this.availableTimeStepOptions = [];\n for (const step of this.availableTimeSteps) {\n this.availableTimeStepOptions.push({label: `= ${step} min`, value: `eq:${step}`});\n this.availableTimeStepOptions.push({label: `≤ ${step} min`, value: `lte:${step}`});\n }\n }\n\n onChangeDetectionTest(rainNode: RainNode) {\n console.log(TEST_DETECTION++, 'onChangeDetectionTest');\n return '';\n }\n\n updateTruncatedError() {\n const error = this.refreshManager?.lastError || '';\n if (error.length <= 80) {\n this.truncatedError = error;\n return;\n }\n this.truncatedError = error.substring(0, 80) + '...';\n }\n\n updateCachedValues() {\n this.updatePercentOfImages();\n this.updatePercentOfComputations();\n this.updateTruncatedError();\n this.updateCumulativeDurationInMinutes();\n }\n\n async refreshMap() {\n this.gaugeSelectedPoints = [];\n this.dateShown = this.getDateBasedOnCumulativeMode();\n this.borders = [];\n\n this.compareManager.cleanAll();\n await this.compareManager.setGaugesInMap();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n this.cdr.markForCheck();\n }\n\n async triggerCumulativeCreation() {\n if (this.creatingCumulative) {\n return;\n }\n this.creatingCumulative = true;\n this.cdr.markForCheck();\n\n try {\n await this.profileService.createCumulativePeriod(this.rainNode.id, {\n periodBegin: this.periodBegin,\n periodEnd: this.periodEnd,\n provider: this.selectedProvider,\n timeStepInMinutes: this.selectedTimeStep,\n });\n\n const success = await this.pollForCumulativeCompletion();\n\n if (success) {\n await this.refreshMap();\n } else {\n console.error('triggerCumulativeCreation: timeout waiting for computation');\n }\n } catch (e) {\n console.error('triggerCumulativeCreation error:', e);\n }\n\n this.creatingCumulative = false;\n this.cdr.markForCheck();\n }\n\n async setPeriodOfNow() {\n const last30mn = new Date();\n last30mn.setMinutes(last30mn.getMinutes() - 30);\n this.periodBeginAsString =\n last30mn.toISOString().substring(0, 11) + last30mn.toLocaleTimeString().substring(0, 5);\n this.periodDurationAsString = '1';\n await this.onPeriodBeginChange(null);\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n updatePercentOfImages() {\n if (!this.countsPeriod?.percentImages?.length) {\n this.percentOfImages = 0;\n return;\n }\n\n const duringPeriod = this.countsPeriod.percentImages.filter(\n (a) =>\n this.periodBegin.getTime() <= new Date(a.name).getTime() &&\n new Date(a.name).getTime() <= this.periodEnd.getTime()\n );\n const summed = duringPeriod.reduce((a, b) => a + (b.x ?? 0), 0);\n this.percentOfImages = Math.round(summed / duringPeriod.length);\n }\n\n updatePercentOfComputations() {\n const expectedCount = this.refreshManager?.getExpectedTimelineCount();\n if (!expectedCount) {\n this.percentOfComputations = 0;\n this.presentComputationCount = 0;\n this.expectedComputationCount = 0;\n return;\n }\n\n const presentCount = this.refreshManager?.getPresentTimelineCount() || 0;\n this.presentComputationCount = presentCount;\n this.expectedComputationCount = expectedCount;\n this.percentOfComputations = Math.round((presentCount / expectedCount) * 100);\n }\n\n private async pollForCumulativeCompletion(): Promise<boolean> {\n const POLL_TIMEOUT_MS = 900000;\n const POLL_INTERVAL_MS = 3000;\n const startTime = Date.now();\n const windowInMinutes = Math.round(\n (this.periodEnd.getTime() - this.periodBegin.getTime()) / 60000\n );\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n try {\n const progress = await this.profileService.getRainProgress(this.rainNode.id);\n\n if (progress === 0) {\n // Trigger background fetch from raain-ground via timeframeCumulative\n await this.profileService.getRainTimeframe(\n this.rainNode.id,\n this.periodBegin,\n this.periodEnd,\n this.toggleAdmin,\n this.selectedProvider,\n this.selectedTimeStep,\n windowInMinutes\n );\n\n // Verify cumulative actually exists\n const response = (await this.profileService.getCumulativePeriods(\n this.rainNode.id,\n {\n provider: this.selectedProvider,\n windowInMinutes,\n forced: this.toggleAdmin,\n }\n )) as RaainApiRainsCumulativesListResponse;\n\n const found = response.periods.find(\n (p) => p.windowInMinutes === windowInMinutes\n );\n\n if (found) {\n return true;\n }\n }\n\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n } catch (e) {\n console.warn('Poll error:', e);\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n }\n }\n\n return false;\n }\n\n private getDateBasedOnCumulativeMode(fallbackDates?: Date[]): Date {\n if (fallbackDates?.length > 0) {\n const dateExists = fallbackDates.some((d) => d.getTime() === this.dateShown?.getTime());\n if (!dateExists) {\n return this.toggleCumulative\n ? fallbackDates[fallbackDates.length - 1]\n : fallbackDates[0];\n }\n }\n return this.toggleCumulative ? this.periodEnd : this.periodBegin;\n }\n\n private getCumulativeHours(): number {\n return this.toggleCumulative ? parseFloat(this.periodDurationAsString) : 0;\n }\n\n private getDurationInHours(): number {\n return parseFloat(this.periodDurationAsString);\n }\n\n private updateRefreshManagerPeriod() {\n this.refreshManager.cumulative = this.toggleCumulative;\n\n // Align dates to 5-minute boundaries (floor) for consistency with raain-ground\n const alignTo5minFloor = (date: Date): Date => {\n const minutes = date.getMinutes();\n const alignedMinutes = Math.floor(minutes / 5) * 5;\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n alignedMinutes,\n 0,\n 0\n );\n };\n\n this.refreshManager.period = {\n begin: alignTo5minFloor(this.periodBegin),\n end: alignTo5minFloor(this.periodEnd),\n };\n }\n\n private async fetchAndUpdateMap() {\n await this.refreshManager.fetch(\n this.dateShown,\n this.toggleGaugeMeasures,\n this.getCumulativeHours()\n );\n this.currentTimeframeTarget = this.refreshManager.getTimelineSelectedFrameSet();\n this.cdr.markForCheck();\n }\n\n private async applyRefreshManagerSettings() {\n if (!this.refreshManager) {\n return;\n }\n this.refreshManager.provider = this.selectedProvider;\n this.refreshManager.timeStepInMinutes = this.selectedTimeStep;\n this.refreshManager.timeStepMode = this.timeStepMode;\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n private cleanAll() {\n this.borders = [];\n this.isAdmin = false;\n this.timeframeContainers = new TimeframeContainers([]);\n this.currentTimeframeTarget = null;\n this.timeframeDates = [];\n this.countPoints = [];\n this.countsPeriod = {progress: 0, queueRunning: 0, percentImages: []};\n this.gaugeSelectedPoints = [];\n\n this.toggleHistory = false;\n this.toggleMap = true;\n this.toggleCompare = false;\n this.toggleGaugeMeasures = false;\n this.toggleRemoveCompareDuplicate = true;\n this.toggleCumulative = this.showCumulativeToggle\n ? this.storage.get('raain-toggleCumulative')\n : false;\n\n this.periodBegin = new Date(this.storage.get('raain-periodBegin'));\n this.periodEnd = new Date(this.storage.get('raain-periodEnd'));\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n const durationMs = this.periodEnd.getTime() - this.periodBegin.getTime();\n this.periodDurationAsString = '' + durationMs / RaainDetailsComponent.HOUR_MS;\n\n this.dateShown = this.getDateBasedOnCumulativeMode();\n this.refreshInProgress = false;\n this.showFullError = false;\n this.showQualityModal = false;\n this.qualityIndicators = [];\n this.qualityIndicatorsLoading = false;\n\n this.compareManager?.cleanAll();\n this.refreshManager?.cleanAll();\n }\n\n private async init() {\n this.cleanAll();\n this.updateCachedValues();\n await this.initRain();\n this.cdr.markForCheck();\n }\n\n private async initRain() {\n if (!this.rainNode) {\n return;\n }\n\n this.isAdmin = this.profileService.isAdmin();\n\n this.refreshManager.rainNode = this.rainNode;\n this.compareManager.rainNode = this.rainNode;\n\n // Load providers and set on refreshManager\n await this.loadProviders();\n\n this.refreshManager.setMethods(\n this.onRefreshInProgress.bind(this),\n this.onRefreshDone.bind(this),\n this.onFetchDone.bind(this)\n );\n\n const center = this.rainNode.getCenter();\n this.coordinates = new MapLatLng(center.lat, center.lng);\n this.teamNode = await this.profileService.getTeam(\n this.rainNode.getLink(TeamNode.TYPE).getId()\n );\n\n // Load all gauges linked to the rainNode on map\n await this.compareManager.setGaugesInMap();\n\n if (this.periodBegin && this.periodEnd) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n }\n\n private async onRefreshInProgress(\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n },\n timeframeDates: Date[]\n ) {\n this.refreshInProgress = true;\n this.countsPeriod = countPeriods;\n this.timeframeDates = timeframeDates;\n this.updateCachedValues();\n this.cdr.markForCheck();\n }\n\n private async onRefreshDone(timeframeDates: Date[]) {\n this.timeframeDates = timeframeDates;\n this.refreshInProgress = false;\n this.updateCachedValues();\n this.cdr.markForCheck();\n\n if (this.toggleMap && timeframeDates.length > 0) {\n this.dateShown = this.getDateBasedOnCumulativeMode(timeframeDates);\n if (this.dateShown) {\n await this.fetchAndUpdateMap();\n }\n }\n }\n\n private async onFetchDone(timeframeContainers?: TimeframeContainers) {\n if (timeframeContainers) {\n this.timeframeContainers = timeframeContainers;\n }\n this.cdr.markForCheck();\n }\n\n private async change(_changes: SimpleChanges) {\n await this.init();\n }\n}\n","<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n\n <ion-button (click)=\"toggleHistory = !toggleHistory; onEnableCountHistoryTab(rainNode)\"\n fill=\"outline\">\n <ion-icon name=\"calendar-clear-outline\" slot=\"start\"></ion-icon>\n <ion-icon [name]=\"toggleHistory ? 'chevron-down' : 'chevron-forward'\" slot=\"end\"></ion-icon>\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <input (change)=\"onPeriodBeginChange($event)\"\n [disabled]=\"toggleCumulative\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n [disabled]=\"toggleCumulative\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option value=\"8\">8 hours</ion-select-option>\n <ion-select-option value=\"10\">10 hours</ion-select-option>\n <ion-select-option value=\"12\">12 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div class=\"period-start ion-hide-md-down\">\n <input (change)=\"onPeriodEndChange($event)\"\n [disabled]=\"toggleCumulative\"\n [value]=\"periodEndAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div *ngIf=\"showCumulativeToggle\" (click)=\"onCumulativeToggleClick($event)\" class=\"toggle-cumulative\">\n <ion-label [class.text-primary]=\"toggleCumulative\">\n {{ toggleCumulative ? 'Cumulative' : 'Granular' }}\n </ion-label>\n <ion-toggle #cumulativeToggle [checked]=\"toggleCumulative\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection (uncomment to debug)\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n -->\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Map performance -->\n <ion-grid class=\"map-performance\">\n <ion-row id=\"progressAndRefresh\">\n <ion-col class=\"provider-selection\" size=\"12\" size-md=\"6\">\n <ion-button (click)=\"openQualityModal()\" class=\"quality-info-button\" fill=\"clear\">\n {{ refreshManager.rainComputationMapVersion }}\n <ion-icon name=\"help-circle-outline\" slot=\"end\"></ion-icon>\n </ion-button>\n <div *ngIf=\"availableProviders.length > 0 || availableTimeSteps.length > 0\" class=\"selection-row\">\n <ion-select (ionChange)=\"onProviderChanged($event)\"\n [value]=\"selectedProvider\"\n interface=\"popover\"\n label=\"Provider\"\n placeholder=\"Select Provider\">\n <ion-select-option *ngFor=\"let provider of availableProviders\" [value]=\"provider\">\n {{ provider }}\n </ion-select-option>\n </ion-select>\n\n <ion-select (ionChange)=\"onTimeStepChanged($event)\"\n [disabled]=\"forceTimeStep\"\n [value]=\"timeStepMode + ':' + selectedTimeStep\"\n interface=\"popover\"\n label=\"Time Step\"\n placeholder=\"Select Time Step\">\n <ion-select-option *ngFor=\"let opt of availableTimeStepOptions\" [value]=\"opt.value\">\n {{ opt.label }}\n </ion-select-option>\n </ion-select>\n\n <span class=\"computation-count\">\n {{ presentComputationCount }}/{{ expectedComputationCount }}\n <ion-button (click)=\"triggerCumulativeCreation()\"\n *ngIf=\"showCreateMissingImages\"\n [disabled]=\"creatingCumulative\" fill=\"clear\" color=\"medium\"\n id=\"createMissingImages\"\n size=\"small\">\n <ion-icon *ngIf=\"!creatingCumulative\" name=\"refresh-outline\"\n slot=\"icon-only\"></ion-icon>\n <ion-spinner *ngIf=\"creatingCumulative\" name=\"crescent\"\n slot=\"icon-only\"></ion-spinner>\n </ion-button>\n <i *ngIf=\"countsPeriod?.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n </div>\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n </ion-row>\n\n <!-- status update row -->\n <ion-row>\n <!-- Progress col -->\n <ion-progress-bar\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [style.visibility]=\"refreshInProgress ? 'visible' : 'hidden'\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n\n <!-- Error col -->\n <ion-col (click)=\"showFullError = !showFullError\" *ngIf=\"refreshManager.lastError\" class=\"error-row\"\n size=\"12\">\n <div class=\"error-content\">\n <ion-icon class=\"error-icon\" name=\"warning-outline\"></ion-icon>\n <span [class.expanded]=\"showFullError\" class=\"error-text\">\n {{ showFullError ? refreshManager.lastError : truncatedError }}\n </span>\n <ion-icon [name]=\"showFullError ? 'chevron-up' : 'chevron-down'\" class=\"error-caret\"></ion-icon>\n </div>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row *ngIf=\"toggleMap && (percentOfImages || percentOfComputations)\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\" size-md=\"12\">\n <div class=\"map-container\">\n <raain-map #raainMapRef\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [cumulativeDurationInMinutes]=\"cumulativeDurationInMinutes\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [scaleLabel]=\"toggleCumulative ? 'mm' : scaleLabel\"\n [showNavigation]=\"!toggleCumulative\"\n [showDateRange]=\"showDateRange\"\n [showVisiblePixelMarkers]=\"showPixelMarkers\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n <ion-toggle\n (ionChange)=\"onTogglePixelMarkers()\"\n [(ngModel)]=\"showPixelMarkers\"\n style=\"margin-left: 8px; transform: scale(0.7);\">\n </ion-toggle>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col *ngIf=\"!!compareManager.compareVersion && (!toggleCumulative || showCumulativeCompare)\"\n class=\"data-column\" size-lg=\"5\" size-md=\"12\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n <!-- Quality Performance Modal -->\n <div (click)=\"closeQualityModal()\" *ngIf=\"showQualityModal\" class=\"quality-modal-overlay\">\n <div (click)=\"$event.stopPropagation()\" class=\"quality-modal-content\">\n <div class=\"quality-modal-header\">\n <h2>Model Quality Performance</h2>\n <ion-button (click)=\"closeQualityModal()\" fill=\"clear\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </div>\n <div class=\"quality-modal-body\">\n <div *ngIf=\"qualityIndicatorsLoading\" class=\"quality-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>Loading indicators...</span>\n </div>\n <div *ngIf=\"!qualityIndicatorsLoading && qualityIndicators.length === 0\" class=\"quality-empty\">\n No quality indicators available for this year.\n </div>\n\n <!-- Performance Chart -->\n <div *ngIf=\"!qualityIndicatorsLoading && modelPerformanceData.length > 0\" class=\"performance-chart-container\">\n <canvas #performanceCanvas></canvas>\n </div>\n\n <!-- Details Accordion -->\n <div *ngIf=\"!qualityIndicatorsLoading && qualityIndicators.length > 0\" class=\"quality-details-section\">\n <div (click)=\"showQualityDetails = !showQualityDetails\" class=\"quality-details-toggle\">\n <span>Details</span>\n <ion-icon [name]=\"showQualityDetails ? 'chevron-up' : 'chevron-down'\"></ion-icon>\n </div>\n <table *ngIf=\"showQualityDetails\" class=\"quality-table\">\n <thead>\n <tr>\n <th>Model</th>\n <th>Compare</th>\n <th>Gauges</th>\n <th>Period</th>\n <th>Avg Quality</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let indicator of qualityIndicators\">\n <td>{{ indicator.computingVersion }}</td>\n <td>{{ indicator.qualityVersion }}</td>\n <td>{{ indicator.provider }}<br>{{ indicator.timeStepInMinutes }} min</td>\n <td>{{ formatDate(indicator.startDate) }}<br>{{ formatDate(indicator.endDate) }}</td>\n <td>{{ indicator.averageQuality | number:'1.2-2' }}</td>\n <td>{{ formatDate(indicator.lastUpdatedAt) }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Cumulative Selector Modal -->\n <cumulative-selector (cancelled)=\"onCumulativeSelectorCancelled()\"\n (periodSelected)=\"onCumulativePeriodSelected($event)\"\n *ngIf=\"showCumulativeSelector\"\n [currentPeriodBegin]=\"periodBegin\"\n [currentPeriodEnd]=\"periodEnd\"\n [isAdmin]=\"toggleAdmin\"\n [provider]=\"selectedProvider\"\n [rainId]=\"rainNode?.id\"\n [timeStepInMinutes]=\"selectedTimeStep\">\n </cumulative-selector>\n\n</div>\n","import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class Cache {\n private readonly _cache: Record<string, unknown>;\n\n constructor() {\n this._cache = {};\n }\n\n public async getValue<T>(key: string, asyncGetter: () => Promise<T>): Promise<T> {\n if (!Object.prototype.hasOwnProperty.call(this._cache, key)) {\n console.log('cache not done: ', key);\n this.putValue(key, await asyncGetter());\n } else {\n console.log('cache done: ', key);\n }\n return this._cache[key] as T;\n }\n\n public putValue<T>(key: string, value: T): void {\n this._cache[key] = value;\n\n const length = Object.getOwnPropertyNames(this._cache).length;\n if (length > 30) {\n console.warn('Pb on cache size exceed ? do a restart ?', length);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {\n MeasureValuePolarContainer,\n RadarPolarMeasureValue,\n RainNode,\n RainPolarMeasureValue,\n} from 'raain-model';\nimport {PolarMapValue} from 'raain-ui';\nimport {ProfileService} from './profile.service';\nimport {FrameSet} from './tools';\n\n@Injectable()\nexport class RadarService {\n constructor(private profileService: ProfileService) {}\n\n static getGeoValuesFromRainMeasures(\n measureValue: RainPolarMeasureValue,\n rain: RainNode\n ): PolarMapValue[] {\n return this.computeValues(measureValue.getPolars(), rain);\n }\n\n static getGeoValuesFromRadarMeasures(\n measureValue: RadarPolarMeasureValue,\n rain: RainNode\n ): PolarMapValue[] {\n return this.computeValues(measureValue.getPolars(), rain);\n }\n\n private static computeValues(polarMeasureValues: MeasureValuePolarContainer[], rain: RainNode) {\n const values: PolarMapValue[] = [];\n polarMeasureValues.forEach((p) => {\n const azimuth = p.azimuth;\n let distance = 0;\n const polarEdges = p.polarEdges;\n polarEdges.forEach((e) => {\n const pmv = new PolarMapValue(e, azimuth, distance);\n values.push(pmv);\n distance += p.distance;\n });\n });\n\n return values;\n }\n\n async getTimeline(rainNode: RainNode): Promise<FrameSet[]> {\n const timeline: FrameSet[] = [];\n const links = rainNode?.getLinks() ?? [];\n\n for (const link of links) {\n const cumulativeIndex = link.href.indexOf('cumulatives/');\n if (cumulativeIndex >= 0) {\n const start = cumulativeIndex + 'cumulatives/'.length;\n const str1 = link.href.substring(start);\n if (str1) {\n const splitted = str1.split('/');\n const frameDate = new Date(splitted[0]);\n const version = splitted[1];\n const rainComputationCumulativeId = splitted[2];\n const existingTargets = timeline.filter(\n (t) => t.date.getTime() === frameDate.getTime()\n );\n if (existingTargets.length) {\n existingTargets[0].rainComputationCumulativeId =\n rainComputationCumulativeId;\n } else {\n timeline.push(\n new FrameSet(frameDate, [], null, null, [], rainComputationCumulativeId)\n );\n }\n }\n }\n }\n\n return timeline;\n }\n}\n","export const CONSTANTS = {\n _RAIN_STATUS_0_NOT_STARTED: 0,\n _RAIN_STATUS_0_WAIT_FOR_INTERNAL_VALIDATION: 0.3,\n _RAIN_STATUS_1_READY_TO_COMPUTE: 0.6,\n _RAIN_STATUS_1_READY: 1,\n\n _INPUT_VALIDITY_NOT_CHECKED_YET: -1,\n _INPUT_VALIDITY_CHECK_IN_PROGRESS: -0.5,\n _INPUT_VALIDITY_NOT_VALID: 0,\n _INPUT_VALIDITY_NOT_CONFIDENT: 0.5,\n _INPUT_VALIDITY_VALID: 1,\n};\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {EventNode, RainNode} from 'raain-model';\nimport {CONSTANTS} from './shared.const';\n\n@Pipe({name: 'areStopped'})\nexport class AreStopped implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter((rain) => rain.status <= CONSTANTS._RAIN_STATUS_0_NOT_STARTED);\n }\n}\n\n@Pipe({name: 'areInProgress'})\nexport class AreInProgressPipe implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter(\n (rain) =>\n CONSTANTS._RAIN_STATUS_0_NOT_STARTED < rain.status &&\n rain.status < CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE\n );\n }\n}\n\n@Pipe({name: 'areReady'})\nexport class AreReady implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter(\n (rain) =>\n rain.status >= CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE &&\n rain.quality > CONSTANTS._INPUT_VALIDITY_NOT_CONFIDENT\n );\n }\n}\n\n@Pipe({name: 'isReady'})\nexport class IsReady implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status >= CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'isNotReady'})\nexport class IsNotReady implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status < CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'waitForValidation'})\nexport class WaitForValidation implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status === CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'hasGoodQuality'})\nexport class HasGoodQuality implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.quality > CONSTANTS._INPUT_VALIDITY_NOT_CONFIDENT) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'hasNotGoodQuality'})\nexport class HasNotGoodQuality implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.quality < CONSTANTS._INPUT_VALIDITY_VALID) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'progressValue'})\nexport class ProgressValue implements PipeTransform {\n transform(rain: RainNode): number {\n if (rain.status < 0) {\n return 0;\n } else if (rain.status > 1) {\n return 1;\n }\n return rain.status;\n }\n}\n\n@Pipe({name: 'progressBuffer'})\nexport class ProgressBuffer implements PipeTransform {\n transform(rain: RainNode): number {\n if (rain.quality < 0) {\n return 0;\n } else if (rain.quality > 1) {\n return 1;\n }\n return rain.quality;\n }\n}\n\n@Pipe({\n name: 'haveNotBeenRed',\n pure: false,\n})\nexport class HaveNotBeenRed implements PipeTransform {\n transform(events: EventNode[]): EventNode[] {\n return events.filter((event) => !event.red);\n }\n}\n","import {Directive, ElementRef, OnDestroy, OnInit} from '@angular/core';\nimport {ProfileService} from './profile.service';\nimport {Router} from '@angular/router';\n\n// Helper function to pause execution for a specified time in milliseconds\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n@Directive({\n selector: 'ion-toolbar',\n})\nexport class ProfileIconDirective implements OnInit, OnDestroy {\n private refreshTimer: any;\n private profileButton: HTMLElement;\n private isConnected: boolean = true;\n\n constructor(\n private el: ElementRef,\n private profileService: ProfileService,\n private router: Router\n ) {}\n\n ngOnInit() {\n // Check if the user is logged in and if the toolbar is not inside a modal\n if (this.profileService.isLoggedIn() && !this.isInsideModal()) {\n // Get the email from the profile service\n const email = this.profileService.getEmail();\n\n // Create the profile button element\n const profileButtons = document.createElement('ion-buttons');\n profileButtons.setAttribute('slot', 'primary');\n\n // Create the button\n const button = document.createElement('ion-button');\n\n // Store references for later use\n this.profileButton = button;\n\n // Create the icon\n const icon = document.createElement('ion-icon');\n icon.setAttribute('name', 'person-circle-outline');\n icon.setAttribute('slot', 'start');\n\n // Create the label\n const label = document.createElement('ion-label');\n label.textContent = email;\n\n // Assemble the button\n button.appendChild(icon);\n button.appendChild(label);\n\n // Add click event listener to the button\n button.addEventListener('click', () => {\n this.navigateToProfile();\n });\n\n // Assemble the buttons container\n profileButtons.appendChild(button);\n\n // Append the buttons to the toolbar\n this.el.nativeElement.appendChild(profileButtons);\n\n // Start the background refresh timer (check every minute)\n this.startBackgroundRefresh();\n }\n }\n\n ngOnDestroy() {\n // Clear the timer when the directive is destroyed\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n navigateToProfile() {\n this.router.navigateByUrl('/profile');\n }\n\n private startBackgroundRefresh() {\n this.refreshTimer = setInterval(() => {\n this.checkAndRefreshConnection();\n }, 20000);\n }\n\n private checkAndRefreshConnection() {\n this.performConnectionRefresh();\n }\n\n private showSkeletonText() {\n if (this.profileButton) {\n this.profileButton.style.opacity = '0.7';\n this.profileButton.style.transition = 'opacity 0.3s ease';\n }\n }\n\n private hideSkeletonText() {\n if (this.profileButton) {\n this.profileButton.style.opacity = '1';\n }\n }\n\n private async performConnectionRefresh() {\n // Show skeleton text and hide button during loading\n this.showSkeletonText();\n\n // Connection successful\n this.isConnected = await this.profileService.isConnected();\n\n if (this.isConnected) {\n // Call the refresh function\n const needsConnectionRefresh = this.profileService.needsConnectionRefresh();\n const isLoggedIn = this.profileService.isLoggedIn();\n if (needsConnectionRefresh || !isLoggedIn) {\n await this.profileService.connectionRefresh();\n }\n await sleep(1000);\n }\n this.updateButtonState();\n\n // Hide skeleton text and show button when loading is complete\n this.hideSkeletonText();\n }\n\n private updateButtonState() {\n if (this.profileButton) {\n if (this.isConnected) {\n // Enable button\n this.profileButton.removeAttribute('disabled');\n this.profileButton.removeAttribute('title');\n } else {\n // Disable button and add tooltip\n this.profileButton.setAttribute('disabled', 'true');\n this.profileButton.setAttribute('title', 'Profile unavailable - No connection');\n }\n }\n }\n\n // Helper method to check if the toolbar is inside a modal\n private isInsideModal(): boolean {\n let parent = this.el.nativeElement.parentElement;\n\n // Traverse up the DOM tree to find if any parent is an ion-modal\n while (parent) {\n if (parent.tagName && parent.tagName.toLowerCase() === 'ion-modal') {\n return true;\n }\n parent = parent.parentElement;\n }\n\n return false;\n }\n}\n","import {NgModule} from '@angular/core';\nimport {\n AreInProgressPipe,\n AreReady,\n AreStopped,\n HasGoodQuality,\n HasNotGoodQuality,\n HaveNotBeenRed,\n IsNotReady,\n IsReady,\n ProgressBuffer,\n ProgressValue,\n WaitForValidation,\n} from './shared.pipe';\n\n@NgModule({\n declarations: [\n AreStopped,\n AreInProgressPipe,\n AreReady,\n IsReady,\n IsNotReady,\n WaitForValidation,\n HasGoodQuality,\n HasNotGoodQuality,\n ProgressValue,\n ProgressBuffer,\n HaveNotBeenRed,\n ],\n exports: [\n AreStopped,\n AreInProgressPipe,\n AreReady,\n IsReady,\n IsNotReady,\n WaitForValidation,\n HasGoodQuality,\n HasNotGoodQuality,\n ProgressValue,\n ProgressBuffer,\n HaveNotBeenRed,\n ],\n})\nexport class PipesModule {}\n","import {CommonModule, NgOptimizedImage, NgStyle} from '@angular/common';\nimport {NgModule, Optional, SkipSelf} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\n\nimport {ProfileService} from './profile.service';\nimport {Storage} from './storage.service';\nimport {RadarService} from './radar.service';\nimport {Cache} from './cache.service';\nimport {ProfileIconDirective} from './profile-icon.directive';\nimport {IonicModule, IonRange} from '@ionic/angular';\nimport {PipesModule} from './pipes.module';\nimport {RaainMapComponent} from './raain-map/raain-map.component';\nimport {RaainCompareComponent} from './raain-compare/raain-compare.component';\nimport {RaainConfigurationComponent} from './raain-configuration/raain-configuration.component';\nimport {RaainDateFocusComponent} from './raain-date-focus/raain-date-focus.component';\nimport {RaainDateDynamicComponent} from './raain-date-dynamic/raain-date-dynamic.component';\nimport {RaainSpeedComponent} from './raain-speed/raain-speed.component';\nimport {RaainCompareStackComponent} from './raain-compare-stack/raain-compare-stack.component';\nimport {RaainGlobeComponent} from './raain-globe/raain-globe.component';\nimport {RaainDetailsComponent} from './raain-details/raain-details.component';\nimport {CumulativeSelectorComponent} from './cumulative-selector/cumulative-selector.component';\n\n@NgModule({\n declarations: [\n RaainMapComponent,\n RaainCompareComponent,\n RaainCompareStackComponent,\n RaainDateFocusComponent,\n RaainDateDynamicComponent,\n RaainConfigurationComponent,\n RaainSpeedComponent,\n RaainGlobeComponent,\n ProfileIconDirective,\n RaainDetailsComponent,\n CumulativeSelectorComponent,\n ],\n imports: [CommonModule, FormsModule, IonicModule, NgOptimizedImage, PipesModule],\n providers: [Storage, RadarService, ProfileService, Cache, IonRange],\n exports: [\n CommonModule,\n NgStyle,\n PipesModule,\n\n RaainMapComponent,\n RaainCompareComponent,\n RaainCompareStackComponent,\n RaainDateFocusComponent,\n RaainDateDynamicComponent,\n RaainConfigurationComponent,\n RaainSpeedComponent,\n RaainGlobeComponent,\n ProfileIconDirective,\n RaainDetailsComponent,\n CumulativeSelectorComponent,\n ],\n})\nexport class SharedModule {\n constructor(@Optional() @SkipSelf() parentModule?: SharedModule) {\n if (parentModule) {\n // throw new Error(\n console.warn('SharedModule is already loaded. Import it in the AppModule only');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.Storage","i1","i2","i3.RaainCompareComponent","sleep","i3","i4","i1.ProfileService","i5.RaainMapComponent","i6.RaainCompareStackComponent","i7.RaainDateFocusComponent","i8.RaainDateDynamicComponent","i9.CumulativeSelectorComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raain-app.mjs","sources":["../../src/core/shared/storage.service.ts","../../src/core/shared/raain-map/raain-map.component.ts","../../src/core/shared/raain-map/raain-map.component.html","../../src/core/shared/raain-compare/raain-compare.component.ts","../../src/core/shared/raain-compare/raain-compare.component.html","../../src/core/shared/xytype.ts","../../src/core/shared/raain-configuration/raain-configuration.component.ts","../../src/core/shared/raain-configuration/raain-configuration.component.html","../../src/core/shared/raain-date-focus/raain-date-focus.component.ts","../../src/core/shared/raain-date-focus/raain-date-focus.component.html","../../src/core/shared/raain-date-dynamic/raain-date-dynamic.component.ts","../../src/core/shared/raain-date-dynamic/raain-date-dynamic.component.html","../../src/core/shared/raain-speed/raain-speed.component.ts","../../src/core/shared/raain-speed/raain-speed.component.html","../../src/core/shared/raain-compare-stack/raain-compare-stack.component.ts","../../src/core/shared/raain-compare-stack/raain-compare-stack.component.html","../../src/core/shared/raain-globe/raain-globe.component.ts","../../src/core/shared/raain-globe/raain-globe.component.html","../../src/core/shared/tools/CompareManager.ts","../../src/core/shared/tools/FrameSet.ts","../../src/core/shared/tools/GaugeNodeFilter.ts","../../src/core/shared/tools/RefreshManager.ts","../../src/core/shared/tools/DateRangeTools.ts","../../src/core/shared/fidj-storage.model.ts","../../src/core/shared/profile.service.ts","../../src/core/shared/cumulative-selector/cumulative-selector.component.ts","../../src/core/shared/cumulative-selector/cumulative-selector.component.html","../../src/core/shared/raain-details/raain-details.component.ts","../../src/core/shared/raain-details/raain-details.component.html","../../src/core/shared/cache.service.ts","../../src/core/shared/radar.service.ts","../../src/core/shared/shared.const.ts","../../src/core/shared/shared.pipe.ts","../../src/core/shared/profile-icon.directive.ts","../../src/core/shared/pipes.module.ts","../../src/core/shared/shared.module.ts","../../src/core/shared/raain-app.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {LocalStorage} from 'fidj-angular';\n\n@Injectable()\nexport class Storage extends LocalStorage {\n constructor() {\n super('raain-app.');\n }\n}\n","import {\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {CartesianTools} from 'raain-model';\nimport {LatLngBounds} from 'leaflet';\nimport {\n CartesianMapValue,\n ChartScaleColors,\n ElementsFactory,\n FrameContainer,\n MapElement,\n MapLatLng,\n RaainDivIcon,\n ScaleElement,\n ScaleElementInput,\n TimeframeContainers,\n} from 'raain-ui';\nimport {Storage} from '../storage.service';\n\n@Component({\n selector: 'raain-map',\n templateUrl: './raain-map.component.html',\n styleUrls: ['./raain-map.component.scss'],\n})\nexport class RaainMapComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public coordinates?: MapLatLng;\n @Input()\n public markers?: {\n gauges?: MapLatLng[];\n selectedGauges?: MapLatLng[];\n pixels?: MapLatLng[];\n borders?: MapLatLng[];\n speeds?: MapLatLng[];\n gaugesInCompare?: MapLatLng[];\n pixelsSolution?: MapLatLng[];\n };\n @Input()\n public timeframeContainers?: TimeframeContainers;\n @Input()\n public autoplay = false;\n @Input()\n public showMarkers = true;\n @Input()\n public showSpeedMarkers = true;\n @Input()\n public showVisiblePixelMarkers = false;\n @Input()\n public showNavigation = true;\n @Input()\n public showDateRange = true;\n @Input()\n public cumulativeDurationInMinutes = 60;\n @Input()\n public scaleLabel = 'mm';\n @Input()\n public currentHeight: number;\n\n public showMapSettings = false;\n public currentWidth: number;\n\n @Input()\n public timeframeDates: Date[] = [];\n @Input()\n public defaultDate?: Date;\n\n @Input()\n public sumValues?: CartesianMapValue[];\n @Input()\n public sumFn?: (cartesianMapValues: CartesianMapValue[]) => number;\n public sumResult: string;\n\n @Output()\n public selectedMarker = new EventEmitter<MapLatLng>();\n\n @Output()\n public changedDate = new EventEmitter<Date>();\n\n @Output()\n public changedSum = new EventEmitter<string>();\n\n public alpha: number;\n public mcText;\n public nextDate: Date;\n public possibleNames: string[];\n public possibleDates: Date[];\n public dateToShow: Date;\n public dateToShowAsString: string;\n public timeframeNameToShow: string;\n public pixelsCount: number;\n public cumulativeDateFrom: Date;\n protected currentFrameContainer: FrameContainer;\n protected cartesianTools: CartesianTools;\n @ViewChild('primaryMap')\n protected mapDivRef: ElementRef;\n @ViewChild('canvasScale')\n protected scaleCanvasRef: ElementRef;\n private visiblePixelMarkers: MapLatLng[] = [];\n private mapElement: MapElement;\n private scaleElement: ScaleElement;\n\n private onSizeChanged;\n private created;\n private readonly raainDivIcons: {\n gauges: RaainDivIcon;\n selectedGauges: RaainDivIcon;\n pixels: RaainDivIcon;\n borders: RaainDivIcon;\n speeds: RaainDivIcon;\n gaugesInCompare: RaainDivIcon;\n pixelsSolution: RaainDivIcon;\n };\n\n constructor(\n private readonly ngZone: NgZone,\n private readonly storage: Storage,\n private readonly cdr: ChangeDetectorRef\n ) {\n this.delete();\n\n this.cartesianTools = new CartesianTools();\n this.pixelsCount = 1;\n\n const iconSize: [number, number] = [40, 40]; // size of the icon\n const iconAnchor: [number, number] = [20, 20]; // point of the icon which will correspond to marker's location\n const pixelSize: [number, number] = [41, 41];\n const pixelAnchor: [number, number] = [20, 20];\n const popupAnchor: [number, number] = [0, -20]; // point from which the popup should open relative to the iconAnchor\n\n this.raainDivIcons = {\n gauges: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n }),\n gaugesInCompare: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio-diag.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n selectedGauges: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-pluvio-diag-select.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n pixels: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-rain.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n pixelsSolution: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-rain.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize: pixelSize,\n iconAnchor: pixelAnchor,\n popupAnchor,\n }),\n borders: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-shadow.png\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n speeds: new RaainDivIcon({\n html: '<img src=\"./assets/maps/marker-speed.svg\" style=\"width: 100%; height: 100%;\" />',\n iconSize,\n iconAnchor,\n popupAnchor,\n }),\n };\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n public showTimeframe(force = false) {\n if (\n !this.dateToShowAsString ||\n (!force && this.areDatesEqual(this.dateToShowAsString, this.dateToShow))\n ) {\n return;\n }\n\n this.dateToShow = new Date(this.dateToShowAsString);\n this.changedDate.emit(this.dateToShow);\n }\n\n public next() {\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n const index = this.getDateToShowIndex();\n this.dateToShow =\n index + 1 < this.possibleDates.length\n ? this.possibleDates[index + 1]\n : this.possibleDates[0];\n this.dateToShowAsString = this.dateToShow.toISOString();\n\n this.showTimeframe(true);\n if (this.autoplay) {\n window.setTimeout(() => this.next(), 2000);\n }\n }\n\n public previous() {\n this.stop();\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n const index = this.getDateToShowIndex();\n this.dateToShow = index > 0 ? this.possibleDates[index - 1] : this.possibleDates[0];\n this.dateToShowAsString = this.dateToShow.toISOString();\n\n this.showTimeframe(true);\n }\n\n public play() {\n this.autoplay = true;\n this.next();\n }\n\n public stop() {\n this.autoplay = false;\n }\n\n public changeShowMarkers() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n if (this.showMarkers) {\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n } else {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n }\n }\n\n public changeShowSpeedMarkers() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n // Rebuild markers with current visibility settings\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n public changeAlpha() {\n this.storage.set('raain-map-alpha', this.alpha);\n if (!this.mapElement?.mapLeaflet) {\n return;\n }\n\n this.mapElement.alpha = 0.3 + this.alpha * 0.7;\n this.mapElement.mapLeaflet.eachLayer((layer: any) => {\n if (layer._container?.style) {\n layer._container.style.filter = `brightness(${(10 - this.alpha * 10) * 10}%)`; // invert(1) ?\n }\n });\n }\n\n public toggleMapSettings() {\n this.showMapSettings = !this.showMapSettings;\n }\n\n private create() {\n const created = this.created;\n if (created) {\n return;\n }\n this.created = true;\n\n const {allMarkers} = this.buildMarkersConfig();\n\n const factory = new ElementsFactory(this.coordinates, true);\n this.createScale(factory, this.scaleLabel);\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const createdOutside = this.created;\n if (!createdOutside) {\n return;\n }\n\n this.mapElement = factory.createMap(this.mapDivRef.nativeElement, {\n timeframeContainers: this.timeframeContainers,\n markers: allMarkers,\n });\n\n this.changeAlpha();\n\n this.mapElement.mapLeaflet?.on('mousemove', (evt) => this.onMapMouseMove(evt));\n this.mapElement.mapLeaflet?.on('zoom', (evt) => this.onZoom(evt));\n this.mapElement.mapLeaflet?.on('moveend', (evt) => this.onMoveEnd(evt));\n const bounds: LatLngBounds = this.mapElement.mapLeaflet.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n\n this.bindMarkersClickEvents(this.mapElement.markersProduced);\n this.onSizeChanged = () => this.updateLayerDimensions();\n this.updateMapSize();\n this.changeNavigation(this.defaultDate);\n }, 100);\n });\n }\n\n private delete() {\n this.mapElement?.mapLeaflet?.remove();\n this.mapElement = undefined;\n this.mcText = '';\n this.nextDate = undefined;\n this.possibleNames = [];\n this.possibleDates = [];\n this.timeframeNameToShow = undefined;\n this.dateToShow = undefined;\n this.dateToShowAsString = undefined;\n this.cumulativeDateFrom = undefined;\n this.onSizeChanged = () => {};\n this.currentFrameContainer = null;\n\n this.created = false;\n this.alpha = this.storage.get('raain-map-alpha', 0.4);\n }\n\n private change(changes: SimpleChanges) {\n let possibleNewDefaultDate: Date;\n\n if (changes.defaultDate) {\n if (\n this.areDatesEqual(\n changes.defaultDate.currentValue,\n changes.defaultDate.previousValue\n )\n ) {\n return;\n }\n possibleNewDefaultDate = this.defaultDate;\n }\n\n if (changes.markers && this.mapElement?.markersLayer) {\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n if (\n changes.markers &&\n this.markers?.selectedGauges &&\n this.markers?.selectedGauges.length === 1\n ) {\n const selectedGauge = this.markers.selectedGauges[0];\n this.mapElement?.mapLeaflet?.setView(selectedGauge, 10);\n }\n\n if (this.mapElement && changes.timeframeContainers) {\n this.updateTimeframe();\n }\n\n if (this.mapElement?.compositeLayer && changes.sumValues) {\n this.updateSum();\n }\n\n if (this.mapElement?.compositeLayer && changes.showVisiblePixelMarkers) {\n const drawer = this.mapElement.compositeLayer.getFirstDrawer();\n this.updateVisiblePixelMarkers(drawer);\n }\n\n this.changeNavigation(possibleNewDefaultDate);\n }\n\n private updateSum() {\n if (!this.sumValues || !this.sumFn) {\n return;\n }\n\n const drawer = this.mapElement.compositeLayer.getFirstDrawer();\n const sumOfPixels: number = drawer?.getExecOfWindowPoints(this.sumValues, this.sumFn) ?? -1;\n\n if (sumOfPixels >= 0 && this.pixelsCount > 0) {\n const average = Math.round((sumOfPixels / this.pixelsCount) * 100) / 100;\n this.sumResult = `${Math.round(sumOfPixels)}mm (avg of ${average}mm for ${Math.round(this.pixelsCount)} pixels)`;\n } else {\n this.sumResult = 'NA';\n }\n this.changedSum.emit(this.sumResult);\n\n this.updateVisiblePixelMarkers(drawer);\n }\n\n private updateVisiblePixelMarkers(drawer: any) {\n if (!this.showVisiblePixelMarkers || !drawer || !this.sumValues) {\n if (this.visiblePixelMarkers.length > 0) {\n this.visiblePixelMarkers = [];\n this.refreshMarkersLayer();\n }\n return;\n }\n\n // Extract visible pixel positions\n const visiblePixels: MapLatLng[] =\n drawer.getExecOfWindowPoints(this.sumValues, (values: CartesianMapValue[]) =>\n values.map((v) => ({\n lat: (v.lat + v.lat2) / 2,\n lng: (v.lng + v.lng2) / 2,\n value: v.value,\n }))\n ) ?? [];\n\n this.visiblePixelMarkers = visiblePixels;\n this.refreshMarkersLayer();\n }\n\n private refreshMarkersLayer() {\n if (!this.mapElement?.markersLayer || !this.mapElement?.mapLeaflet) {\n return;\n }\n\n const {allMarkers} = this.buildMarkersConfig();\n const markersProduced = this.mapElement.updateMarkers(allMarkers);\n if (markersProduced?.length) {\n this.bindMarkersClickEvents(markersProduced);\n if (this.showMarkers) {\n this.mapElement.markersLayer.removeFromMap(this.mapElement.mapLeaflet);\n this.mapElement.markersLayer.addToMap(this.mapElement.mapLeaflet);\n }\n }\n }\n\n private changeNavigation(defaultDate?: Date) {\n // update possible names\n if (this.timeframeContainers?.containers?.length) {\n this.possibleNames = [];\n this.timeframeContainers.containers.forEach((c) => {\n if (this.possibleNames.indexOf(c.name) < 0) {\n this.possibleNames.push(c.name);\n }\n });\n this.timeframeNameToShow = this.possibleNames.length > 0 ? this.possibleNames[0] : null;\n }\n\n // update possible dates\n this.possibleDates = this.timeframeDates;\n if (!this.possibleDates || this.possibleDates.length === 0) {\n return;\n }\n\n // update dateToShow\n if (\n defaultDate &&\n this.possibleDates.filter((d) => this.areDatesEqual(d, defaultDate)).length === 1\n ) {\n this.dateToShow = defaultDate;\n }\n if (\n !this.dateToShow &&\n this.possibleDates.length > 0 &&\n this.possibleDates.filter((d) => this.areDatesEqual(d, this.dateToShow)).length !== 1\n ) {\n this.dateToShow = this.possibleDates[0];\n }\n\n let firstInit = false;\n if (!this.dateToShowAsString) {\n firstInit = true;\n }\n this.dateToShowAsString = this.dateToShow.toISOString();\n this.cumulativeDateFrom = new Date(this.dateToShow);\n\n const durationInMs = this.cumulativeDurationInMinutes * 60 * 1000;\n this.cumulativeDateFrom.setTime(this.cumulativeDateFrom.getTime() - durationInMs);\n\n if (firstInit) {\n this.showTimeframe(true);\n }\n }\n\n private getDateToShowIndex(): number {\n let index = 0;\n for (const date of this.possibleDates) {\n if (this.areDateISOEqual(this.dateToShowAsString, date)) {\n break;\n }\n index++;\n }\n return index;\n }\n\n private onZoom(evt: any) {\n const map = evt.target;\n const bounds: LatLngBounds = map.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n this.updateSum();\n }\n\n private onMoveEnd(evt: any) {\n const map = evt.target;\n const bounds: LatLngBounds = map.getBounds();\n this.pixelsCount = this.cartesianTools.howManyPixelsInEarthMap(\n bounds._southWest,\n bounds._northEast\n );\n this.updateSum();\n }\n\n private handleAvailablePixels(\n availablePixels: {width: number; height: number; totalPixels: number},\n bounds: any,\n zoom: number\n ) {\n // Update your component properties or perform calculations\n this.currentWidth = availablePixels.width;\n this.currentHeight = availablePixels.height;\n\n // You can also calculate pixel density or other metrics here\n // const pixelDensity = this.calculatePixelDensity(bounds, availablePixels, zoom);\n // console.log('Pixel density:', pixelDensity);\n }\n\n private calculatePixelDensity(\n bounds: any,\n availablePixels: {width: number; height: number},\n zoom: number\n ) {\n // Calculate how many meters per pixel (approximate)\n const earthCircumference = 40075016.686; // meters\n const metersPerPixel =\n (earthCircumference * Math.cos((bounds.getCenter().lat * Math.PI) / 180)) /\n Math.pow(2, zoom + 8);\n\n return {\n metersPerPixel,\n pixelsPerMeter: 1 / metersPerPixel,\n totalVisibleArea: availablePixels.width * availablePixels.height,\n };\n }\n\n private onMapMouseMove(evt: {latlng: {lat: number; lng: number}}): void {\n const lat: string = evt.latlng.lat.toFixed(3);\n const lng: string = evt.latlng.lng.toFixed(3);\n\n let value = NaN;\n let valueLat = NaN,\n valueLng = NaN,\n valueLat2 = NaN,\n valueLng2 = NaN;\n if (this.currentFrameContainer) {\n const valueSelected = (this.currentFrameContainer.values as CartesianMapValue[]).filter(\n (v: CartesianMapValue) => {\n return (\n v.lat <= evt.latlng.lat &&\n evt.latlng.lat < v.lat2 &&\n v.lng <= evt.latlng.lng &&\n evt.latlng.lng < v.lng2\n );\n }\n );\n\n if (valueSelected.length === 1) {\n value = this.roundTo3Decimals(valueSelected[0].value);\n valueLat = this.roundTo3Decimals(valueSelected[0].lat);\n valueLng = this.roundTo3Decimals(valueSelected[0].lng);\n valueLat2 = this.roundTo3Decimals(valueSelected[0].lat2);\n valueLng2 = this.roundTo3Decimals(valueSelected[0].lng2);\n } else {\n // console.warn('valueSelected issue ?', valueSelected);\n }\n }\n\n this.ngZone.run(() => {\n // this.mcText = `Latitude: ${lat} Longitude: ${lng} \n // Value: [${valueLat} ${valueLng} | ${valueLat2} ${valueLng2}] ${value}`;\n this.mcText = `Latitude: ${lat} Longitude: ${lng} Value: ${value}`;\n this.cdr.markForCheck();\n });\n }\n\n private onMapClick(evt: any): void {\n if (!this.markers?.gauges?.length) {\n return;\n }\n\n let selectedGauge: MapLatLng;\n for (const gauge of this.markers.gauges) {\n if (gauge.id === evt?.target?.options?.alt) {\n selectedGauge = gauge;\n break;\n }\n }\n\n if (selectedGauge) {\n this.markers.selectedGauges = [selectedGauge];\n this.selectedMarker.emit(\n new MapLatLng(\n selectedGauge.lat,\n selectedGauge.lng,\n undefined,\n selectedGauge.id,\n selectedGauge.name,\n selectedGauge.value\n )\n );\n } else {\n this.selectedMarker.emit(\n new MapLatLng(evt.latlng?.lat, evt.latlng?.lng, undefined, evt.id, evt.name)\n );\n }\n\n this.change({markers: ['changed']} as any);\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.mapDivRef.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 21;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n\n private updateTimeframe() {\n if (\n this.timeframeContainers?.containers?.length &&\n this.timeframeContainers?.containers[0]?.timeframe?.length\n ) {\n this.mapElement.updateMapTimeframe(this.timeframeContainers);\n this.currentFrameContainer = this.timeframeContainers?.containers[0]?.timeframe[0];\n }\n\n this.changeAlpha();\n }\n\n private createScale(factory: ElementsFactory, label: string) {\n this.deleteScale();\n if (!this.scaleCanvasRef?.nativeElement) {\n return;\n }\n\n const entries = Object.entries(ChartScaleColors);\n entries.sort((a, b) => parseFloat(a[0]) - parseFloat(b[0]));\n const sortedMap = new Map(entries);\n const sortedArray = [...sortedMap.entries()];\n const scaleColors = sortedArray.map((entry) => {\n return {color: entry[1]};\n });\n const scaleLabels = sortedArray.map((entry) => entry[0]);\n this.scaleElement = factory.createScale(\n this.scaleCanvasRef.nativeElement,\n new ScaleElementInput(scaleColors, scaleLabels, label)\n );\n }\n\n private deleteScale() {\n if (this.scaleElement) {\n this.scaleElement?.chart?.destroy();\n }\n }\n\n /**\n * Builds the markers configuration array for the map\n * @returns Array of marker configurations with icons and positions\n */\n private buildMarkersConfig() {\n const allMarkers: {iconsLatLng: MapLatLng[]; raainDivIcon: RaainDivIcon}[] = [\n {iconsLatLng: this.markers?.gauges ?? [], raainDivIcon: this.raainDivIcons.gauges},\n {\n iconsLatLng: this.markers?.selectedGauges ?? [],\n raainDivIcon: this.raainDivIcons.selectedGauges,\n },\n {\n iconsLatLng: this.markers?.gaugesInCompare ?? [],\n raainDivIcon: this.raainDivIcons.gaugesInCompare,\n },\n {iconsLatLng: this.markers?.pixels ?? [], raainDivIcon: this.raainDivIcons.pixels},\n {\n iconsLatLng: this.markers?.pixelsSolution ?? [],\n raainDivIcon: this.raainDivIcons.pixelsSolution,\n },\n // {iconsLatLng: this.markers?.borders, raainDivIcon: this.raainDivIcons.borders},\n ];\n\n if (this.showVisiblePixelMarkers && this.visiblePixelMarkers.length > 0) {\n allMarkers.push({\n iconsLatLng: this.visiblePixelMarkers,\n raainDivIcon: this.raainDivIcons.pixelsSolution,\n });\n }\n\n if (this.showSpeedMarkers) {\n for (const marker of this.markers?.speeds ?? []) {\n // Calculate dynamic size based on speed (marker.value is in m/s)\n // Base size: 20px, scale up with speed (typical range: 1-20 m/s)\n const speedInMetersPerSec = marker.value ?? 5;\n const minSize = 20;\n const maxSize = 60;\n const minSpeed = 1;\n const maxSpeed = 20;\n\n // Linear interpolation: size increases with speed\n const normalizedSpeed = Math.max(minSpeed, Math.min(maxSpeed, speedInMetersPerSec));\n const size =\n minSize +\n ((normalizedSpeed - minSpeed) / (maxSpeed - minSpeed)) * (maxSize - minSize);\n const iconSize = Math.round(size);\n\n allMarkers.push({\n iconsLatLng: [marker],\n raainDivIcon: new RaainDivIcon({\n html: this.raainDivIcons.speeds.options.html,\n width: iconSize,\n height: iconSize,\n iconAnchor: [iconSize / 2, iconSize / 2], // Center the icon\n popupAnchor: this.raainDivIcons.speeds.options.popupAnchor,\n rotationAngle: marker.alt, // Use alt property for azimuth/direction\n className: this.raainDivIcons.speeds.options.className,\n }),\n });\n }\n }\n return {allMarkers};\n }\n\n /**\n * Compare two dates for equality using their timestamps\n * @param date1 First date (Date or string)\n * @param date2 Second date (Date or string)\n * @returns true if dates are equal\n */\n private areDatesEqual(date1: Date | string, date2: Date | string): boolean {\n if (!date1 || !date2) {\n return false;\n }\n const timestamp1 = typeof date1 === 'string' ? new Date(date1).getTime() : date1.getTime();\n const timestamp2 = typeof date2 === 'string' ? new Date(date2).getTime() : date2.getTime();\n return timestamp1 === timestamp2;\n }\n\n /**\n * Compare an ISO date string with a Date object (comparing first 19 characters)\n * @param dateISO ISO date string\n * @param date Date object\n * @returns true if dates match (up to seconds precision)\n */\n private areDateISOEqual(dateISO: string, date: Date): boolean {\n if (!dateISO || !date) {\n return false;\n }\n return dateISO.substring(0, 19) === date.toISOString().substring(0, 19);\n }\n\n /**\n * Bind click event handlers to markers\n * @param markers Array of marker objects to bind events to\n */\n private bindMarkersClickEvents(markers: any[]): void {\n if (!markers) {\n return;\n }\n markers.forEach((m) => m.on('click', (evt) => this.onMapClick(evt)));\n }\n\n /**\n * Round a number to 3 decimal places\n * @param value Number to round\n * @returns Rounded number\n */\n private roundTo3Decimals(value: number): number {\n return Math.round(value * 1000) / 1000;\n }\n\n /**\n * Update layer dimensions and invalidate map size\n */\n private updateLayerDimensions(): void {\n if (!this.mapElement) {\n return;\n }\n this.mapElement.markersLayer?.setCurrentWidth(this.currentWidth);\n this.mapElement.markersLayer?.setCurrentHeight(this.currentHeight);\n this.mapElement.compositeLayer?.setCurrentWidth(this.currentWidth);\n this.mapElement.compositeLayer?.setCurrentHeight(this.currentHeight);\n this.mapElement.mapLeaflet?.invalidateSize({animate: true});\n }\n}\n","<ion-grid>\n\n <ion-row class=\"ion-align-items-center ion-justify-content-center\" id=\"map-nav-row\">\n <ion-icon (click)=\"previous()\" *ngIf=\"showNavigation\" class=\"nav-icon\" color=\"medium\"\n name=\"chevron-back-circle\"></ion-icon>\n\n <ion-label *ngIf=\"showDateRange\" class=\"period-bracket\">[</ion-label>\n\n <ion-label *ngIf=\"showDateRange && timeframeContainers?.containers?.length\" class=\"date-label\">\n {{ cumulativeDateFrom | date:'yyyy-MM-dd HH:mm' }}\n </ion-label>\n\n <ion-label *ngIf=\"showDateRange\"> </ion-label>\n\n <ion-select (ionDismiss)=\"showTimeframe()\" *ngIf=\"timeframeContainers?.containers?.length\"\n [(ngModel)]=\"dateToShowAsString\" interface=\"popover\"\n placeholder=\"Period\" value=\"{{dateToShowAsString}}\">\n <ion-select-option *ngFor=\"let dateToSelect of possibleDates\"\n value=\"{{dateToSelect.toISOString()}}\">\n {{ dateToSelect | date:'yyyy-MM-dd HH:mm' }}\n </ion-select-option>\n </ion-select>\n\n <ion-label *ngIf=\"showDateRange\" class=\"period-bracket\">[</ion-label>\n\n <ion-icon (click)=\"next()\" *ngIf=\"showNavigation\" class=\"nav-icon\" color=\"medium\"\n name=\"chevron-forward-circle\"></ion-icon>\n </ion-row>\n\n <ion-row>\n <ion-col size-lg=\"10\" size-xs=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"map-container\">\n <div #primaryMap id=\"map-div\"></div>\n </div>\n </ion-col>\n <ion-col class=\"ion-hide-xl-down\" size-lg=\"2\">\n <div [style.height.px]=\"currentHeight\" [style.width.px]=\"60\">\n <canvas #canvasScale></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row class=\"ion-align-items-center\">\n <ion-col size-xs=\"3\">\n <ion-button (click)=\"toggleMapSettings()\" color=\"medium\" fill=\"clear\" id=\"map-settings-toggle\">\n <ion-icon name=\"map-outline\" slot=\"start\"></ion-icon>\n <ion-icon [name]=\"showMapSettings ? 'chevron-down' : 'chevron-forward'\" slot=\"end\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-hide-sm-down\" size-sm=\"7\">\n <span [innerHTML]=\"mcText\"></span>\n </ion-col>\n\n </ion-row>\n\n <ion-row *ngIf=\"showMapSettings\" id=\"map-settings\">\n <ion-col size=\"12\">\n <ion-list lines=\"none\">\n <ion-item>\n <ion-label>Opacity</ion-label>\n <ion-range (ionChange)=\"changeAlpha()\" [(ngModel)]=\"alpha\" [max]=\"1\" [min]=\"0.2\" [snaps]=\"true\"\n [step]=\"0.2\" [ticks]=\"true\" class=\"settings-range\" color=\"medium\" slot=\"end\"></ion-range>\n </ion-item>\n <ion-item>\n <ion-label>Gauges</ion-label>\n <ion-toggle (ionChange)=\"changeShowMarkers()\" [(ngModel)]=\"showMarkers\" [checked]=\"showMarkers\"\n color=\"medium\" slot=\"end\"></ion-toggle>\n </ion-item>\n <ion-item>\n <ion-label>Speeds</ion-label>\n <ion-toggle (ionChange)=\"changeShowSpeedMarkers()\" [(ngModel)]=\"showSpeedMarkers\"\n [checked]=\"showSpeedMarkers\" color=\"medium\" slot=\"end\"></ion-toggle>\n </ion-item>\n </ion-list>\n </ion-col>\n </ion-row>\n\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {CompareElement, CompareElementInput, ElementsFactory} from 'raain-ui';\nimport {XYType} from '../xytype';\n\n@Component({\n selector: 'raain-compare',\n templateUrl: './raain-compare.component.html',\n styleUrls: ['./raain-compare.component.scss'],\n})\nexport class RaainCompareComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: Array<XYType>;\n\n @Input()\n public pointMax: XYType;\n\n @Input()\n public remarks: string;\n\n @Input()\n public compareIndex: number;\n\n @Input()\n public currentHeight: number;\n\n @Input()\n public currentWidth: number;\n\n @Output()\n public selectedPoint = new EventEmitter<{point: XYType; compareIndex: number}>();\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private compareElement: CompareElement;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n protected onClick(point: XYType): void {\n this.selectedPoint.emit({point, compareIndex: this.compareIndex});\n }\n\n protected changeData(newData: XYType[], newMaxLine?: XYType[]) {\n let changed = false;\n const dataset = this.compareElement?.chart?.data?.datasets[0];\n if (dataset) {\n dataset.data = newData;\n changed = true;\n }\n\n const line = this.compareElement?.chart?.data?.datasets[1];\n if (line) {\n line.data = newMaxLine;\n changed = true;\n }\n\n if (changed) {\n this.compareElement?.chart?.update();\n }\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n const factory = new ElementsFactory();\n this.compareElement = factory.createCompare(\n this.canvasElement.nativeElement,\n new CompareElementInput(\n this.points.map((p) => {\n return {x: p.x, y: p.y, r: p.r, name: p.name, id: p.id};\n }),\n this.pointMax,\n this.onClick.bind(this)\n )\n );\n }\n\n private delete() {\n if (this.compareElement) {\n this.compareElement?.chart?.destroy();\n }\n this.created = false;\n }\n\n private change(changes: SimpleChanges) {\n if (changes.points) {\n this.changeData(this.points, [{x: 0, y: 0}, this.pointMax]);\n }\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<div id=\"canvas-container\">\n <h1 *ngIf=\"remarks\">{{ remarks }}</h1>\n\n <!-- [style.height.px]=\"currentHeight\" [style.width.px]=\"currentWidth\" [width]=\"currentWidth\" [height]=\"currentHeight\"-->\n <canvas #canvasElement></canvas>\n</div>\n","export class XYType {\n constructor(\n public x: number,\n public y: number,\n public r?: number,\n public name?: string,\n public id?: string\n ) {}\n}\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n ChartScaleColors,\n ConfigurationElement,\n ConfigurationElementInput,\n ElementsFactory,\n Tools,\n} from 'raain-ui';\nimport {XYType} from '../xytype';\n\n@Component({\n selector: 'raain-configuration',\n templateUrl: './raain-configuration.component.html',\n styleUrls: ['./raain-configuration.component.scss'],\n})\nexport class RaainConfigurationComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: XYType[];\n\n @Output()\n public changedPoints = new EventEmitter<XYType[]>();\n\n @Input()\n public currentHeight: number;\n\n @Input()\n public currentWidth: number;\n\n @Input()\n public minPoint: XYType = {x: 0, y: 0};\n\n @Input()\n public maxPoint: XYType = {x: 300, y: 100};\n\n @Input()\n public logStyle = false;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private configurationElement: ConfigurationElement;\n private onDrag;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n this.onDrag = (e: any) => {\n this.changedPoints.emit(this.points);\n };\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n async reset(count = 4) {\n const points = [];\n for (let c = 0; c < count; c++) {\n points.push(new XYType((c + 1) * 10, (c + 1) * 0.1));\n }\n this.points = points;\n await this.delete();\n this.create();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n // this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n let inputs = new ConfigurationElementInput(\n this.points,\n this.minPoint,\n this.maxPoint,\n false,\n [],\n this.onDrag\n );\n if (this.logStyle) {\n const confTransparency = 0.3;\n inputs = new ConfigurationElementInput(\n this.points,\n this.minPoint,\n this.maxPoint,\n true,\n [\n {\n color: Tools.getTransparency(ChartScaleColors['0'], confTransparency),\n yStart: Math.log10(0.1),\n yEnd: Math.log10(0.4),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['0.4'], confTransparency),\n yStart: Math.log10(0.4),\n yEnd: Math.log10(1),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['1'], confTransparency),\n yStart: Math.log10(1),\n yEnd: Math.log10(3),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['3'], confTransparency),\n yStart: Math.log10(3),\n yEnd: Math.log10(10),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['10'], confTransparency),\n yStart: Math.log10(10),\n yEnd: Math.log10(20),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['20'], confTransparency),\n yStart: Math.log10(20),\n yEnd: Math.log10(30),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['30'], confTransparency),\n yStart: Math.log10(30),\n yEnd: Math.log10(50),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['50'], confTransparency),\n yStart: Math.log10(50),\n yEnd: Math.log10(100),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['100'], confTransparency),\n yStart: Math.log10(100),\n yEnd: Math.log10(150),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['150'], confTransparency),\n yStart: Math.log10(150),\n yEnd: Math.log10(200),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['200'], confTransparency),\n yStart: Math.log10(200),\n yEnd: Math.log10(250),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['250'], confTransparency),\n yStart: Math.log10(250),\n yEnd: Math.log10(300),\n },\n {\n color: Tools.getTransparency(ChartScaleColors['300'], confTransparency),\n yStart: Math.log10(300),\n yEnd: Math.log10(500),\n },\n ],\n this.onDrag\n );\n }\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n this.configurationElement = factory.createConfiguration(\n this.canvasElement.nativeElement,\n inputs\n );\n }, 10);\n });\n }\n\n private async delete() {\n this.configurationElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n // console.log('changed', changes);\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-xs=\"10\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n <ion-col size-xs=\"2\">\n <ion-button (click)=\"reset(2)\" color=\"light\" shape=\"round\" size=\"small\">2</ion-button>\n <br>\n <ion-button (click)=\"reset(4)\" color=\"light\" shape=\"round\" size=\"small\">4</ion-button>\n <br>\n <ion-button (click)=\"reset(6)\" color=\"light\" shape=\"round\" size=\"small\">6</ion-button>\n <br>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {DateRange, DateStatusElement, DateStatusElementInput, ElementsFactory} from 'raain-ui';\n\n@Component({\n selector: 'raain-date-focus',\n templateUrl: './raain-date-focus.component.html',\n styleUrls: ['./raain-date-focus.component.scss'],\n})\nexport class RaainDateFocusComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public focusDate: Date;\n @Input()\n public focusRange: DateRange;\n @Input()\n public withoutAll: boolean;\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private dateStatusElement: DateStatusElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.focusDate = new Date();\n this.focusRange = DateRange.CENTURY;\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n focusPrevious() {\n this.dateStatusElement.focusPrevious();\n }\n\n focusReset() {\n this.dateStatusElement.focusReset();\n }\n\n focusNext() {\n this.dateStatusElement.focusNext();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n // this.ngZone.runOutsideAngular(() => {\n // setTimeout(() => {\n const factory = new ElementsFactory();\n try {\n this.dateStatusElement = factory.createDateStatus(\n this.canvasElement.nativeElement,\n new DateStatusElementInput(this.points, this.focusDate, this.focusRange)\n );\n } catch (e) {\n console.warn('Focus creation issue', e);\n }\n // }, 50);\n // });\n }\n\n private async delete() {\n await this.dateStatusElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col class=\"ion-text-right\" offset-sm=\"4\" size-sm=\"1\">\n <ion-button (click)=\"focusPrevious()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" size-sm=\"2\">\n <ion-button (click)=\"focusReset()\" *ngIf=\"!withoutAll\" color=\"medium\" fill=\"clear\">\n all dates\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" size-sm=\"1\">\n <ion-button (click)=\"focusNext()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-forward-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n DateRange,\n DynamicDateStatusElement,\n DynamicDateStatusElementInput,\n ElementsFactory,\n} from 'raain-ui';\n\n@Component({\n selector: 'raain-date-dynamic',\n templateUrl: './raain-date-dynamic.component.html',\n styleUrls: ['./raain-date-dynamic.component.scss'],\n})\nexport class RaainDateDynamicComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public focusDate: Date;\n @Input()\n public focusRange: DateRange;\n @Input()\n public withoutAll: boolean;\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n @Input()\n public fetchData: (\n focusDate: Date,\n focusRange: DateRange\n ) => Promise<{label: string; style: string; values: {date: Date; value: number}[]}[]>;\n\n @Output()\n public changedDate = new EventEmitter<Date>();\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n private dynamicDateStatusElement: DynamicDateStatusElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.focusDate = new Date();\n this.focusRange = DateRange.CENTURY;\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n focusPrevious() {\n this.dynamicDateStatusElement.focusPrevious();\n }\n\n focusReset() {\n this.dynamicDateStatusElement.focusReset();\n }\n\n focusNext() {\n this.dynamicDateStatusElement.focusNext();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n // Map style to a valid Chart.js chart type\n private mapStyleToChartType(style: string): string {\n // List of valid Chart.js chart types\n const validChartTypes = [\n 'line',\n 'bar',\n 'radar',\n 'doughnut',\n 'pie',\n 'polarArea',\n 'bubble',\n 'scatter',\n ];\n\n // If style is a valid chart type, return it, otherwise default to 'line'\n return validChartTypes.includes(style) ? style : 'line';\n }\n\n private async create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n const monthSampleData = await this.fetchData(new Date(), DateRange.MONTH);\n\n const factory = new ElementsFactory();\n try {\n this.dynamicDateStatusElement = factory.createDynamicDateStatus(\n this.canvasElement.nativeElement,\n new DynamicDateStatusElementInput(\n async (focusDate, focusRange) => {\n const data = await this.fetchData(focusDate, focusRange);\n return data.map((item) => ({\n ...item,\n style: this.mapStyleToChartType(item.style),\n }));\n },\n {\n dataLength: monthSampleData.length,\n chartMinValue: -10,\n chartMaxValue: 100,\n onLastClick: (date: Date) => {\n this.changedDate.emit(date);\n },\n }\n )\n );\n } catch (e) {\n console.warn('Dynamic focus creation issue', e);\n }\n }\n\n private async delete() {\n this.dynamicDateStatusElement?.chart?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n await this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid id=\"raain-date-dynamic\">\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n <canvas #canvasElement></canvas>\n </div>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col class=\"ion-text-right\" offset-sm=\"4\" size-sm=\"1\">\n <ion-button (click)=\"focusPrevious()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" size-sm=\"2\">\n <ion-button (click)=\"focusReset()\" *ngIf=\"!withoutAll\" color=\"medium\" fill=\"clear\">\n all dates\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" size-sm=\"1\">\n <ion-button (click)=\"focusNext()\" color=\"medium\" fill=\"clear\">\n <ion-icon name=\"chevron-forward-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {ElementsFactory, SpeedMatrixElementInput} from 'raain-ui';\nimport {PositionValue} from 'raain-model';\n\n@Component({\n selector: 'raain-speed',\n templateUrl: './raain-speed.component.html',\n styleUrls: ['./raain-speed.component.scss'],\n})\nexport class RaainSpeedComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public compareSpeedMatrix: PositionValue[];\n\n @Input()\n public compareTrustedIndicator: number;\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n public hide = false;\n @ViewChild('canvasSpeedElement')\n protected canvasSpeedElement: ElementRef;\n private onSizeChanged;\n private created;\n\n constructor(private ngZone: NgZone) {\n this.delete();\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created || !this.compareSpeedMatrix?.length) {\n return;\n }\n this.created = true;\n\n // this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n factory.createSpeedMatrixIndicator(\n this.canvasSpeedElement.nativeElement,\n new SpeedMatrixElementInput(this.compareSpeedMatrix, this.compareTrustedIndicator)\n );\n }, 10);\n // });\n }\n\n private delete() {\n this.created = false;\n this.hide = false;\n }\n\n private change(changes: SimpleChanges) {\n if (changes.compareSpeedMatrix) {\n if (!this.compareSpeedMatrix?.length) {\n this.hide = true;\n return;\n }\n }\n\n setTimeout(() => {\n this.delete();\n this.create();\n }, 10);\n }\n\n private updateMapSize(): void {\n const mapDivWidth =\n this.canvasSpeedElement.nativeElement.parentNode?.parentNode['clientWidth'];\n\n const currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<div id=\"container\">\n <div id=\"canvas-speed-matrix\">\n <div [hidden]=\"hide\">\n <canvas #canvasSpeedElement id=\"indic1\"></canvas>\n </div>\n <div [hidden]=\"!hide\">\n <span id=\"hiddenSquare\"> </span>\n </div>\n <!-- <span>compareTrustedIndicator {{ compareTrustedIndicator }}</span> -->\n </div>\n</div>\n","import {Component, EventEmitter, Input, NgZone, Output} from '@angular/core';\nimport {XYType} from '../xytype';\nimport {CompareManager} from '../tools';\n\n@Component({\n selector: 'raain-compare-stack',\n templateUrl: './raain-compare-stack.component.html',\n styleUrls: ['./raain-compare-stack.component.scss'],\n})\nexport class RaainCompareStackComponent {\n @Input()\n public compareManager: CompareManager;\n\n @Input()\n public currentHeight: number;\n\n @Output()\n public selectedPoint = new EventEmitter<{point: XYType; compareIndex: number}>();\n\n @Input()\n public cumulative: boolean;\n\n constructor(private ngZone: NgZone) {}\n\n protected onClick(e: {point: XYType; compareIndex: number}): void {\n this.selectedPoint.emit({point: e.point, compareIndex: e.compareIndex});\n }\n\n exportCumulativeToCsv(): void {\n const points = this.compareManager.globalComparePoints;\n if (!points?.length) {\n return;\n }\n\n const dates = this.compareManager.compareDates;\n const dateRange =\n dates?.length > 0\n ? `${this.formatDate(dates[0])} - ${this.formatDate(dates[dates.length - 1])}`\n : '';\n\n const csvRows = ['dateRange,gaugeName,gaugeValue,pixelValue'];\n for (const point of points) {\n csvRows.push(`${dateRange},${point.name},${point.x},${point.y}`);\n }\n\n const csvContent = csvRows.join('\\n');\n this.downloadCsv(\n csvContent,\n `compare-cumulative-${this.formatDateForFilename(new Date())}.csv`\n );\n }\n\n exportGranularToCsv(): void {\n const allPoints = this.compareManager.getAllGranularComparePoints();\n if (!allPoints?.length) {\n return;\n }\n\n const csvRows = ['date,gaugeName,gaugeValue,pixelValue'];\n for (const point of allPoints) {\n const dateStr = this.formatDate(point.date);\n csvRows.push(`${dateStr},${point.gaugeName},${point.gaugeValue},${point.pixelValue}`);\n }\n\n const csvContent = csvRows.join('\\n');\n this.downloadCsv(\n csvContent,\n `compare-granular-${this.formatDateForFilename(new Date())}.csv`\n );\n }\n\n private downloadCsv(content: string, filename: string): void {\n const blob = new Blob([content], {type: 'text/csv;charset=utf-8;'});\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n link.setAttribute('download', filename);\n link.click();\n URL.revokeObjectURL(url);\n }\n\n private formatDate(date: Date): string {\n return date ? date.toISOString().slice(0, 16).replace('T', ' ') : '';\n }\n\n private formatDateForFilename(date: Date): string {\n return date.toISOString().slice(0, 10);\n }\n}\n","<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.globalQualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compareManager.globalQualityIndicator >= 0.5,\n 'quality-medium': compareManager.globalQualityIndicator < 0.5 && compareManager.globalQualityIndicator >= 0,\n 'quality-bad': compareManager.globalQualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compareManager.globalQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <div class=\"ion-text-end\">\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"clear\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n </div>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n <span *ngIf=\"compare.qualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compare.qualityIndicator >= 0.5,\n 'quality-medium': compare.qualityIndicator < 0.5 && compare.qualityIndicator >= 0,\n 'quality-bad': compare.qualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compare.qualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <div class=\"ion-text-end\">\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"clear\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n </div>\n\n <!-- Cumulative summary of all granular comparisons -->\n <ion-col *ngIf=\"compareManager.granularCumulativePoints?.length\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare card-compare-cumulative\">\n <ion-card-header>Cumulative Summary\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.granularCumulativeQualityIndicator !== null\"\n [ngClass]=\"{\n 'quality-good': compareManager.granularCumulativeQualityIndicator >= 0.5,\n 'quality-medium': compareManager.granularCumulativeQualityIndicator < 0.5 && compareManager.granularCumulativeQualityIndicator >= 0,\n 'quality-bad': compareManager.granularCumulativeQualityIndicator < 0\n }\"\n class=\"quality-indicator\">\n Quality: {{ compareManager.granularCumulativeQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content>\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"-1\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.granularCumulativePointsMax\"\n [points]=\"compareManager.granularCumulativePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n</div>\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {EarthMapElement, EarthMapElementInput, ElementsFactory} from 'raain-ui';\n\n@Component({\n selector: 'raain-globe',\n templateUrl: './raain-globe.component.html',\n styleUrls: ['./raain-globe.component.scss'],\n})\nexport class RaainGlobeComponent implements AfterViewChecked, OnDestroy, OnChanges {\n @Input()\n public points: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n\n @Input()\n public currentHeight: number;\n public currentWidth: number;\n\n @ViewChild('canvasElement')\n protected canvasElement: ElementRef;\n\n private earthMapElement: EarthMapElement;\n private onSizeChanged;\n private created: boolean;\n\n constructor(private ngZone: NgZone) {\n this.onSizeChanged = () => {};\n }\n\n public ngAfterViewChecked(): void {\n this.create();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes);\n }\n\n public ngOnDestroy(): void {\n this.delete();\n }\n\n @HostListener('window:resize', ['$event'])\n private onResize(event: any): void {\n this.updateMapSize();\n }\n\n private create() {\n if (this.created) {\n return;\n }\n this.created = true;\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const factory = new ElementsFactory();\n try {\n this.earthMapElement = factory.createEarthMap(\n this.canvasElement.nativeElement,\n new EarthMapElementInput()\n );\n } catch (e) {\n console.warn('Dynamic focus creation issue', e);\n }\n }, 100);\n });\n }\n\n private async delete() {\n // await this.earthMapElement?.destroy();\n this.created = false;\n }\n\n private async change(changes: SimpleChanges) {\n await this.delete();\n this.create();\n }\n\n private updateMapSize(): void {\n const mapDivWidth = this.canvasElement.nativeElement.parentNode?.parentNode['clientWidth'];\n const padding = 20;\n let currentWidth =\n mapDivWidth ||\n window.innerWidth ||\n document.documentElement.clientWidth ||\n document.body.clientWidth;\n const currentHeight =\n this.currentHeight ||\n window.innerHeight ||\n document.documentElement.clientHeight ||\n document.body.clientHeight;\n currentWidth -= padding;\n this.currentWidth = currentWidth;\n this.currentHeight = currentHeight;\n\n this.ngZone.run(() => {\n this.onSizeChanged();\n });\n }\n}\n","<ion-grid>\n <ion-row>\n <ion-col id=\"col-container\" size-sm=\"12\">\n <div #canvasElement [style.height.px]=\"currentHeight\" id=\"canvas-container\">\n </div>\n </ion-col>\n </ion-row>\n</ion-grid>\n","import {MapLatLng} from 'raain-ui';\nimport {\n GaugeNode,\n IComparePerDate,\n ICompares,\n PositionValue,\n QualityPoint,\n RainComputationQuality,\n RainNode,\n SpeedMatrix,\n SpeedMatrixContainer,\n} from 'raain-model';\nimport {XYType} from '../xytype';\nimport {ProfileService} from '../profile.service';\nimport {FrameSet} from './FrameSet';\n\nexport interface ICompareTarget {\n date: Date;\n rainComputationId?: string;\n rainComputationCumulativeId?: string;\n}\n\nexport interface IUICompare {\n date: Date;\n name: string;\n comparePoints: XYType[];\n comparePointsMax: XYType;\n comparePointsHistory: QualityPoint[];\n remarks: string;\n qualityIndicator: number;\n}\n\nexport class CompareManager {\n public gaugesInMap: MapLatLng[];\n public gaugesInCompare: MapLatLng[];\n public selectedGauges: MapLatLng[];\n public selectedPixels: MapLatLng[];\n public pixelsSolutions: MapLatLng[][];\n public speeds: MapLatLng[];\n\n // from comparesTimeline\n public compareNames: string[];\n public uiCompares: IUICompare[];\n public compareSpeedMatrix: PositionValue[];\n public compareVersion: string;\n public compareTrustedIndicator: number;\n public compareDates: Date[];\n\n public currentQualityDoneDate: Date;\n public currentQualityLaunchedBy: string;\n public currentQualityTimeSpentInMs: number;\n public globalComparePoints: XYType[];\n public globalComparePointsMax: XYType;\n public globalQualityIndicator: number;\n public compareSpeed: {angleInDegrees: number; pixelsPerPeriod: number};\n protected buildCompares: ICompares;\n protected selectedGauge: QualityPoint;\n protected selectedGaugeInPoints: QualityPoint;\n protected selectedGaugeInPointsDetail: string;\n protected rainComputationQualitiesPerDate: any;\n\n constructor(\n protected profileService: ProfileService,\n public onChanges: () => void = () => {}\n ) {\n this.cleanAll();\n }\n\n // Merged cumulative from granular comparisons (computed from buildCompares)\n public get granularCumulativePoints(): XYType[] {\n if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {\n return [];\n }\n return this.buildCompares.compareCumulative.qualityPoints.map(\n (qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId)\n );\n }\n\n public get granularCumulativePointsMax(): XYType {\n if (!this.buildCompares?.compareCumulative) {\n return new XYType(0, 0);\n }\n const maxValue = Math.max(this.buildCompares.compareCumulative.maxValue * 1.2, 1);\n return new XYType(maxValue, maxValue);\n }\n\n // Default: KGE normalized 0-1 (from raain-model defaults)\n public get granularCumulativeQualityIndicator(): number {\n if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {\n return null;\n }\n return SpeedMatrix.ComputeQualityIndicator(\n this.buildCompares.compareCumulative.qualityPoints\n );\n }\n\n protected _rainNode: RainNode;\n\n public get rainNode(): RainNode {\n return this._rainNode;\n }\n\n public set rainNode(rainNode: RainNode) {\n this._rainNode = rainNode;\n this.cleanAll();\n }\n\n public cleanAll() {\n this.gaugesInMap = [];\n this.gaugesInCompare = [];\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n this.compareDates = [];\n this.speeds = [];\n\n this.buildCompares = {\n comparesPerDate: [],\n compareCumulative: null,\n };\n this.globalComparePoints = [];\n this.globalComparePointsMax = new XYType(0, 0);\n this.globalQualityIndicator = null;\n // granularCumulative* are now getters computed from buildCompares\n this.rainComputationQualitiesPerDate = {};\n\n this.selectedGauge = null;\n this.selectedGaugeInPoints = null;\n this.cleanCompareQuality('no compare yet');\n }\n\n async refreshCompareQuality(frameSet: FrameSet, onlyOne: boolean) {\n const comparePerDate = this.getComparePerDate(frameSet.date);\n\n if (\n !comparePerDate ||\n !comparePerDate.rainComputationQuality?.qualitySpeedMatrixContainer\n ) {\n // this.cleanCompareQuality(\n // 'no current quality ' + Object.keys(this.rainComputationQualitiesPerDate)\n // );\n // this.onChanges();\n return;\n }\n\n if (onlyOne) {\n comparePerDate.compareTimeline = comparePerDate.compareTimeline.filter(\n (c) => c.date.getTime() === frameSet.date.getTime()\n );\n }\n\n const uiCompares: IUICompare[] = comparePerDate.compareTimeline\n .map((c) => {\n // Default: KGE normalized 0-1\n const qualityIndicator = SpeedMatrix.ComputeQualityIndicator(c.qualityPoints);\n return {\n date: c.date,\n name: c.name,\n comparePoints: c.qualityPoints.map(\n (p) =>\n new XYType(\n p.getGaugeValue(),\n p.getRainValue(),\n 2,\n p.gaugeLabel,\n p.gaugeId\n )\n ),\n comparePointsMax: new XYType(Math.max(c.maxValue * 1.2, 1), Math.max(c.maxValue * 1.2, 1)),\n comparePointsHistory: c.qualityPointsLegacy,\n remarks: c.remarks,\n qualityIndicator,\n };\n })\n .sort((a, b) => a.date?.getTime() - b.date?.getTime());\n\n this.currentQualityDoneDate = comparePerDate.rainComputationQuality.isDoneDate;\n this.currentQualityTimeSpentInMs = comparePerDate.rainComputationQuality.timeSpentInMs;\n this.currentQualityLaunchedBy = comparePerDate.rainComputationQuality.launchedBy;\n this.compareVersion = comparePerDate.rainComputationQuality.getVersion();\n\n this.compareSpeed =\n comparePerDate.rainComputationQuality.qualitySpeedMatrixContainer.getSpeed();\n this.compareNames = uiCompares.map((c) => c.name);\n this.uiCompares = uiCompares;\n\n this.onChanges();\n }\n\n async refreshGlobalCompareQuality(\n targetsOrdered: ICompareTarget[],\n period: {begin: Date; end: Date},\n withCompareDuplicate: boolean,\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ) {\n try {\n await this.fetchRainComputationQualities(\n targetsOrdered,\n provider,\n timeStepInMinutes,\n timeStepMode\n );\n\n await this.buildComparesTimeline(targetsOrdered, period, withCompareDuplicate);\n\n if (!this.buildCompares.compareCumulative) {\n // throw Error('needs cumulative compare');\n return;\n }\n\n const countForAverage = targetsOrdered.length;\n const maxValue = Math.max(this.buildCompares.compareCumulative.maxValue * 1.2, 1);\n const cumulativePoints = this.buildCompares.compareCumulative.qualityPoints.map(\n (qp) =>\n new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId)\n );\n const cumulativePointsMax = new XYType(maxValue, maxValue);\n // Default: KGE normalized 0-1\n const cumulativeQualityIndicator = SpeedMatrix.ComputeQualityIndicator(\n this.buildCompares.compareCumulative.qualityPoints\n );\n\n // Set for cumulative mode\n this.globalComparePoints = cumulativePoints;\n this.globalComparePointsMax = cumulativePointsMax;\n this.globalQualityIndicator = cumulativeQualityIndicator;\n // granularCumulative* are now getters computed from buildCompares.compareCumulative\n } catch (e) {\n console.warn(e);\n }\n }\n\n async setGaugesInMap() {\n // Get all gauge IDs linked to this rainNode\n const rainNodeGaugeIds = this.rainNode.getLinks(GaugeNode.TYPE).map((l) => l.getId());\n\n // Fetch gauges from API (may be filtered/limited)\n let gaugesToFilter = await this.profileService.getGauges(\n this.rainNode?.id,\n this.rainNode.getCenter()\n );\n gaugesToFilter = gaugesToFilter\n .sort((a, b) => {\n return (\n a.approxDistanceFrom(this.rainNode.getCenter()) -\n b.approxDistanceFrom(this.rainNode.getCenter())\n );\n })\n .filter((v, index) => index < 200);\n\n // Build a map of gauges from API response\n const gaugesFromApi = new Map<\n string,\n {id: string; latitude: number; longitude: number; name: string}\n >();\n for (const gauge of gaugesToFilter) {\n gaugesFromApi.set(gauge.id, gauge);\n }\n\n // Fetch missing gauges individually (those linked but not in API response)\n const missingGaugeIds = rainNodeGaugeIds.filter((id) => !gaugesFromApi.has(id));\n for (const gaugeId of missingGaugeIds) {\n try {\n const gauge = await this.profileService.getGauge(gaugeId);\n if (gauge) {\n gaugesFromApi.set(gauge.id, gauge);\n }\n } catch (e) {\n console.warn(`Failed to fetch gauge ${gaugeId}:`, e);\n }\n }\n\n // Filter to only gauges linked to this rainNode\n const visibleGauges = rainNodeGaugeIds\n .map((id) => gaugesFromApi.get(id))\n .filter((g) => !!g);\n console.log('visibleGauges:', visibleGauges.length, '/', rainNodeGaugeIds.length);\n\n const gaugesLatLng: MapLatLng[] = [];\n for (const gauge of visibleGauges) {\n gaugesLatLng.push(\n new MapLatLng(gauge.latitude, gauge.longitude, undefined, gauge.id, gauge.name)\n );\n }\n this.gaugesInMap = gaugesLatLng;\n }\n\n async setGaugesInCompare() {\n const qualityPoints: QualityPoint[] = [];\n for (const compare of this.uiCompares) {\n for (const qualityPoint of compare.comparePointsHistory) {\n const alreadyAdded = qualityPoints.filter(\n (p) => p?.gaugeId === qualityPoint.gaugeId\n );\n if (alreadyAdded.length === 0) {\n qualityPoints.push(qualityPoint);\n }\n }\n }\n\n this.gaugesInCompare = qualityPoints.map((p) => {\n return new MapLatLng(\n p.gaugeCartesianValue.lat,\n p.gaugeCartesianValue.lng,\n 0,\n p.gaugeId,\n p.gaugeLabel + '>' + p.getGaugeValue(),\n p.getGaugeValue()\n );\n });\n\n this.resetSelectedGauges();\n }\n\n async selectGauge(gaugeId: string, compareIndex: number) {\n if (gaugeId) {\n const xys = this.getCurrentQualityPoints(compareIndex).filter(\n (p) => p.gaugeId === gaugeId\n );\n this.selectedGauge = xys.length === 1 ? xys[0] : null;\n } else {\n this.selectedGauge = null;\n }\n\n if (!this.selectedGauge) {\n this.resetSelectedGauges();\n const gaugesFiltered = this.gaugesInMap.filter((g) => g.id === gaugeId);\n if (gaugesFiltered.length === 1) {\n this.selectedGauges = [gaugesFiltered[0]];\n }\n return;\n }\n\n const selectedGaugeInPoints = this.getCurrentQualityPoints(compareIndex).filter(\n (p) => p.gaugeId === this.selectedGauge.gaugeId\n );\n let pixelsSolutions: MapLatLng[][] = [];\n\n if (selectedGaugeInPoints.length === 1) {\n const remarks = JSON.parse(selectedGaugeInPoints[0].remark).sort(\n (a, b) => a.criteriaAttemptedToBeMinimum - b.criteriaAttemptedToBeMinimum\n );\n console.log(remarks);\n pixelsSolutions = remarks.map((remark) =>\n remark.solutionForGauge.pixels.map(\n (p) =>\n new MapLatLng(\n p.y + 0.005,\n p.x + 0.01,\n 0,\n '' + !remark.notPossible,\n '' + !remark.notPossible,\n 1\n )\n )\n );\n\n const timeDeltaInMinutes = selectedGaugeInPoints[0].getTimeDeltaInMinutes();\n this.selectedGaugeInPointsDetail =\n '' +\n selectedGaugeInPoints[0].gaugeLabel +\n ' > ' +\n Math.round(selectedGaugeInPoints[0].getGaugeValue() * 100) / 100 +\n ' / ' +\n Math.round(selectedGaugeInPoints[0].getRainValue() * 100) / 100 +\n ' dT=' +\n timeDeltaInMinutes;\n\n this.selectedGaugeInPoints = selectedGaugeInPoints[0];\n } else {\n this.selectedGaugeInPoints = null;\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n return;\n }\n\n this.selectedGauges = [\n new MapLatLng(\n this.selectedGaugeInPoints.gaugeCartesianValue.lat,\n this.selectedGaugeInPoints.gaugeCartesianValue.lng,\n undefined,\n this.selectedGaugeInPoints.gaugeId,\n this.selectedGaugeInPoints.gaugeLabel +\n '>' +\n this.selectedGaugeInPoints.gaugeCartesianValue.value,\n this.selectedGaugeInPoints.gaugeCartesianValue.value\n ),\n ];\n\n this.selectGaugeInCompare();\n\n const pixels: MapLatLng[] = [];\n for (const rainCartesianValue of this.selectedGaugeInPoints.rainCartesianValues) {\n pixels.push(\n new MapLatLng(rainCartesianValue.lat + 0.005, rainCartesianValue.lng + 0.01)\n );\n }\n this.selectedPixels = pixels;\n\n this.pixelsSolutions = pixelsSolutions;\n }\n\n // Returns all granular quality points across all dates in the period (excludes cumulative end date)\n getAllGranularComparePoints(): {\n date: Date;\n gaugeName: string;\n gaugeValue: number;\n pixelValue: number;\n }[] {\n const result: {date: Date; gaugeName: string; gaugeValue: number; pixelValue: number}[] =\n [];\n\n if (!this.buildCompares?.comparesPerDate?.length || !this.compareDates?.length) {\n return result;\n }\n\n // Find the last date (cumulative end date) to exclude it\n const lastDateTime = Math.max(...this.compareDates.map((d) => d.getTime()));\n\n for (const comparePerDate of this.buildCompares.comparesPerDate) {\n // Skip the last date which contains cumulative values\n if (comparePerDate.date.getTime() >= lastDateTime) {\n continue;\n }\n if (!comparePerDate.compareTimeline?.length) {\n continue;\n }\n // Get first timeline entry (current step) for each date\n const currentCompare = comparePerDate.compareTimeline[0];\n if (!currentCompare?.qualityPoints?.length) {\n continue;\n }\n for (const qp of currentCompare.qualityPoints) {\n result.push({\n date: comparePerDate.date,\n gaugeName: qp.gaugeLabel,\n gaugeValue: qp.getGaugeValue(),\n pixelValue: qp.getRainValue(),\n });\n }\n }\n\n return result.sort((a, b) => a.date.getTime() - b.date.getTime());\n }\n\n protected async buildComparesTimeline(\n targetsOrdered: ICompareTarget[],\n period: {begin: Date; end: Date},\n withCompareDuplicate: boolean\n ): Promise<ICompares> {\n const compareDates = targetsOrdered.map((t) => t.date);\n\n const qualities: RainComputationQuality[] = compareDates\n .filter((d) => !!d)\n .map((d) => this.getRainComputationQuality(d))\n .filter((rcq) => !!rcq);\n\n this.compareDates = compareDates?.length > 1 ? compareDates : [period.begin, period.end];\n if (this.compareDates[0].getTime() > period.begin.getTime()) {\n this.compareDates.unshift(period.begin);\n }\n\n this.buildCompares = SpeedMatrixContainer.BuildCompares(qualities, !withCompareDuplicate);\n return this.buildCompares;\n }\n\n protected getComparePerDate(date: Date): IComparePerDate {\n const existing = this.buildCompares.comparesPerDate.filter(\n (c) => c.date.getTime() === date.getTime()\n );\n if (existing.length === 1) {\n return existing[0];\n }\n return null;\n }\n\n protected getCurrentQualityPoints(compareIndex: number) {\n if (\n this.uiCompares.length === 0 ||\n compareIndex < 0 ||\n this.compareNames.length < compareIndex\n ) {\n return [];\n }\n\n return this.uiCompares[compareIndex].comparePointsHistory;\n }\n\n protected cleanCompareQuality(details?: string) {\n this.compareVersion = details;\n this.compareNames = [];\n this.uiCompares = [];\n this.compareSpeedMatrix = [];\n this.compareTrustedIndicator = undefined;\n\n this.currentQualityDoneDate = new Date(-1);\n this.currentQualityLaunchedBy = '';\n this.currentQualityTimeSpentInMs = -1;\n }\n\n protected async fetchRainComputationQualities(\n targetsOrdered: ICompareTarget[],\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ) {\n for (const target of targetsOrdered) {\n if (!this.rainComputationQualitiesPerDate[target.date.toISOString()]) {\n try {\n let rainComputationQuality: RainComputationQuality;\n\n if (target.rainComputationCumulativeId) {\n rainComputationQuality =\n await this.profileService.getRainCumulativeCumulativesCompare(\n this.rainNode,\n target.rainComputationCumulativeId,\n provider,\n timeStepInMinutes,\n timeStepMode\n );\n }\n\n if (rainComputationQuality) {\n let isConsistent = true;\n const matrices =\n rainComputationQuality.qualitySpeedMatrixContainer.getMatrices();\n for (const matrix of matrices) {\n if (!matrix.isConsistent()) {\n isConsistent = false;\n }\n }\n\n if (!isConsistent) {\n console.warn(\n `One of rainComputationQuality matrices is not consistent for ${target.date.toISOString()}`\n );\n }\n\n this.rainComputationQualitiesPerDate[target.date.toISOString()] =\n rainComputationQuality;\n }\n } catch (e) {\n console.warn(e);\n }\n }\n }\n }\n\n protected getRainComputationQuality(date: Date): RainComputationQuality {\n return this.rainComputationQualitiesPerDate[date.toISOString()];\n }\n\n protected selectGaugeInCompare() {\n const globalComparePoints = JSON.parse(JSON.stringify(this.globalComparePoints));\n for (const p of globalComparePoints) {\n if (p.id === this.selectedGaugeInPoints?.gaugeId) {\n p.r = 10;\n } else {\n p.r = 2;\n }\n }\n this.globalComparePoints = globalComparePoints;\n\n for (const compare of this.uiCompares) {\n const comparePoints = JSON.parse(JSON.stringify(compare.comparePoints));\n comparePoints.forEach((p) => {\n if (p.id === this.selectedGaugeInPoints?.gaugeId) {\n p.r = 10;\n } else {\n p.r = 3;\n }\n });\n compare.comparePoints = comparePoints;\n }\n }\n\n protected resetSelectedGauges() {\n // console.log('resetSelectedGauges reset');\n this.selectedGauge = null;\n this.selectedGaugeInPoints = null;\n this.selectedGauges = [];\n this.selectedPixels = [];\n this.pixelsSolutions = [];\n this.selectGaugeInCompare();\n }\n}\n","export class FrameSet {\n constructor(\n public date: Date,\n public radarMeasureIds: string[] = [],\n public rainComputationId: string = null,\n public rainComputationVersion: string = null,\n public rainComputationQualities: {\n version: string;\n id: string;\n }[] = [],\n public rainComputationCumulativeId: string = null\n ) {}\n}\n","import {GaugeNode, LatLng} from 'raain-model';\n\nexport class GaugeNodeFilter extends GaugeNode {\n public isIn = true;\n public distance = 0;\n\n constructor(json: any) {\n super(json);\n }\n\n approxDistanceFrom(center: LatLng): number {\n this.distance =\n Math.round(\n (Math.pow(this.latitude - center.lat, 2) +\n Math.pow(this.longitude - center.lng, 2)) *\n 100 *\n 100\n ) / 100;\n return this.distance;\n }\n\n add() {\n this.isIn = true;\n }\n\n remove() {\n this.isIn = false;\n }\n}\n","import {FrameSet} from './FrameSet';\nimport {from, mergeMap, Subject, takeUntil, timer} from 'rxjs';\nimport {\n CartesianMeasureValue,\n CartesianTools,\n ICartesianMeasureValue,\n RadarNode,\n RainComputationMap,\n RainNode,\n} from 'raain-model';\nimport {CartesianMapValue, TimeframeContainer, TimeframeContainers} from 'raain-ui';\nimport {RadarService} from '../radar.service';\nimport {ProfileService} from '../profile.service';\nimport {CompareManager, ICompareTarget} from './CompareManager';\nimport {XYType} from '../xytype';\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport class RefreshManager {\n public rainComputationMapVersion: string;\n public rainComputationMapDate: Date;\n public rainComputationMapDoneDate: Date;\n public rainComputationMapLaunchedBy: string;\n public rainComputationMapTimeSpentInMs: number;\n\n public rainComputationMapOriginalMin: number;\n public rainComputationMapOriginalMax: number;\n\n public sumFn: (cartesianMapValues: CartesianMapValue[]) => number;\n public sumValues: CartesianMapValue[];\n\n public provider: string = 'Raain';\n public timeStepInMinutes: number = 10;\n public timeStepMode: 'eq' | 'lte' = 'eq';\n public lastError: string = '';\n public cumulative: boolean = false;\n\n protected closeRefreshTimer: Subject<unknown>;\n protected countsPeriod: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n };\n protected timeframesFromRadars: FrameSet[];\n protected timeframesFromRadarsExtended: FrameSet[];\n protected timelineSelectedFrameSet: FrameSet;\n protected timeframeDates: Date[];\n protected expectedTimelineCount: number = 0;\n protected presentTimelineCount: number = 0;\n protected cartesianTools: CartesianTools;\n protected removeDuplicate: boolean;\n protected dataInternal: boolean;\n protected onRefreshInProgress: (\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n },\n timeframeDates: Date[]\n ) => Promise<void>;\n protected onRefreshDone: (timeframeDates: Date[]) => Promise<void>;\n protected onFetchDone: (timeframeContainers?: TimeframeContainers) => Promise<void>;\n\n constructor(\n protected radarService: RadarService,\n protected profileService: ProfileService,\n protected compareManager: CompareManager\n ) {\n this._period = {begin: new Date(), end: new Date()};\n this.closeRefreshTimer = new Subject<unknown>();\n this.cartesianTools = new CartesianTools();\n this.cleanAll();\n }\n\n protected _rainNode: RainNode;\n\n public get rainNode(): RainNode {\n return this._rainNode;\n }\n\n public set rainNode(rainNode: RainNode) {\n this._rainNode = rainNode;\n this.cleanAll();\n }\n\n protected _period: {begin: Date; end: Date};\n\n get period(): {begin: Date; end: Date} {\n return this._period;\n }\n\n set period(period: {begin: Date; end: Date}) {\n this._period.begin = new Date(period.begin);\n this._period.end = new Date(period.end);\n this.refreshCounts().then((ignored) => {});\n }\n\n public setMethods(\n onRefreshInProgress: (\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n },\n timeframeDates: Date[]\n ) => Promise<void>,\n onRefreshDone: (timeframeDates: Date[]) => Promise<void>,\n onFetchDone: (timeframeContainers?: TimeframeContainers) => Promise<void>\n ) {\n this.onRefreshInProgress = onRefreshInProgress;\n this.onRefreshDone = onRefreshDone;\n this.onFetchDone = onFetchDone;\n }\n\n cleanAll() {\n this.lastError = '';\n this.countsPeriod = {percentImages: [], queueRunning: 0, progress: 0};\n this.timeframesFromRadars = [];\n this.timeframesFromRadarsExtended = [];\n this.timeframeDates = [];\n this.removeDuplicate = true;\n this.closeRefreshTimer?.next(null);\n }\n\n async fetch(\n dateShown: Date,\n withGaugesMeasures: boolean,\n cumulativeHours = 0\n ): Promise<FrameSet> {\n // set the target\n const currents = this.timeframesFromRadarsExtended.filter(\n (t) => t.date.getTime() === dateShown.getTime()\n );\n if (currents.length !== 1) {\n return;\n }\n\n // build current Frameset\n const current: FrameSet = currents[0];\n const target = {\n ...current,\n withGauge: withGaugesMeasures,\n cumulativeHours: cumulativeHours,\n };\n\n const timeframeContainers = await this.refreshMapTimeframeContainers(target);\n\n await this.onFetchDone(timeframeContainers);\n await this.refreshCompareQuality(current);\n\n this.timelineSelectedFrameSet = current;\n }\n\n getTimelineFrameSet(): FrameSet[] {\n return this.timeframesFromRadars;\n }\n\n getExpectedTimelineCount(): number {\n return this.expectedTimelineCount;\n }\n\n getPresentTimelineCount(): number {\n return this.presentTimelineCount;\n }\n\n getTimelineSelectedFrameSet(): FrameSet {\n return this.timelineSelectedFrameSet;\n }\n\n async refresh(launchQualityAfter: boolean, dataInternal: boolean) {\n this.lastError = '';\n\n this.checkPeriod();\n\n this.dataInternal = dataInternal;\n\n const asyncDone = (error?: string) => {\n if (error) {\n console.error('Error in refresh', error);\n }\n this.closeRefreshTimer.next(null);\n this.onRefreshDone(this.timeframeDates).then((_ignored) => {});\n };\n\n const asyncRefresh = async () => {\n this.onRefreshInProgress(await this.refreshCounts(), this.timeframeDates).then(\n (_ignored) => {}\n );\n const done = await this.refreshPeriodInsidePolling();\n if (done) {\n asyncDone();\n }\n };\n\n timer(1000, 10000) // Wait 1s, then every 10s\n .pipe(\n mergeMap(() => from(asyncRefresh())),\n takeUntil(this.closeRefreshTimer)\n )\n .subscribe({\n error: (error) => asyncDone(JSON.stringify(error)),\n });\n }\n\n setRemoveDuplicate(b: boolean) {\n this.removeDuplicate = b;\n }\n\n public async setReportPeriod(date: Date) {\n let values: CartesianMapValue[] = [];\n for (const frameSet of this.timeframesFromRadars) {\n if (frameSet.date.getTime() !== date.getTime()) {\n continue;\n }\n values = values.concat(await this.getValues(frameSet));\n }\n\n this.sumFn = (cartesianMapValues: CartesianMapValue[]) => {\n return cartesianMapValues.reduce((p, v) => p + v.value, 0);\n };\n this.sumValues = values;\n }\n\n protected checkPeriod() {\n if (this.period.begin.getTime() === this.period.end.getTime()) {\n const message = 'need a period';\n this.lastError += message;\n throw new Error(message);\n }\n }\n\n protected async refreshCounts() {\n if (!this.rainNode) {\n return this.countsPeriod;\n }\n\n const counts = await this.profileService.getCounts(this.rainNode.id, {\n range: 'day',\n periodBegin: this._period.begin,\n });\n\n let progress = 0;\n\n // Verify progress only for SimpleZone\n if (this.rainNode.getLinks(RadarNode.TYPE).length <= 1) {\n progress = await this.profileService.getRainProgress(this.rainNode.id);\n }\n\n this.countsPeriod = {\n ...counts,\n progress,\n };\n\n return this.countsPeriod;\n }\n\n protected getRainComputationQualityTarget(frameset: FrameSet): string {\n if (frameset.rainComputationQualities.length <= 0) {\n return undefined;\n }\n return frameset.rainComputationQualities[0].id;\n }\n\n protected async refreshPeriodInsidePolling(): Promise<boolean> {\n try {\n const done = await this.refreshCheckIfDone();\n\n // behind refresh\n await this.refreshTimeframesFromRadars(done);\n await this.refreshGlobalCompareReport(done);\n\n return done;\n } catch (e) {\n console.warn(e);\n this.lastError += e.message;\n }\n return false;\n }\n\n protected async refreshCheckIfDone(): Promise<boolean> {\n await sleep(2000);\n return this.countsPeriod.progress === 0;\n }\n\n protected async refreshTimeframesFromRadars(done: boolean) {\n if (!done || !this.rainNode) {\n return [];\n }\n\n try {\n const beginExtended = new Date(this.period.begin);\n const endExtended = new Date(this.period.end);\n if (!this.cumulative) {\n // Only extend period for granular mode (to get neighboring frames)\n // For cumulative mode, use exact period\n beginExtended.setMinutes(beginExtended.getMinutes() - 7);\n endExtended.setMinutes(endExtended.getMinutes() + 7);\n }\n\n const windowInMinutes = this.cumulative\n ? Math.round((this.period.end.getTime() - this.period.begin.getTime()) / 60000)\n : this.timeStepInMinutes;\n\n this.rainNode = await this.profileService.getRainTimeframe(\n this.rainNode.id,\n beginExtended,\n endExtended,\n this.dataInternal,\n this.provider,\n this.timeStepInMinutes,\n windowInMinutes\n );\n\n this.timeframesFromRadarsExtended = await this.radarService.getTimeline(this.rainNode);\n this.timeframesFromRadars = this.timeframesFromRadarsExtended\n .filter(\n (frameSet) =>\n this.period.begin.getTime() < frameSet.date.getTime() &&\n frameSet.date.getTime() <= this.period.end.getTime()\n )\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n this.timeframeDates = this.timeframesFromRadars.map((frameSet) => frameSet.date);\n\n // Compute all expected dates\n // For cumulative mode: only 1 expected date (the period end)\n // For granular mode: all dates from period.begin to period.end with timeStepInMinutes\n const allExpectedDates: Date[] = [];\n if (this.cumulative) {\n // In cumulative mode, we expect only ONE timeframe (the cumulative)\n allExpectedDates.push(new Date(this.period.end));\n } else {\n // Start from begin + step: cumulative dates represent window ends,\n // so the first expected date is begin + timeStep, not begin itself\n const beginTime = new Date(this.period.begin).getTime();\n const currentDate = new Date(beginTime + this.timeStepInMinutes * 60000);\n while (currentDate.getTime() <= this.period.end.getTime()) {\n allExpectedDates.push(new Date(currentDate));\n currentDate.setMinutes(currentDate.getMinutes() + this.timeStepInMinutes);\n }\n }\n\n this.expectedTimelineCount = allExpectedDates.length;\n\n // Check if all expected dates are present in timeframeDates\n const timeframeDateTimes = new Set(this.timeframeDates.map((d) => d.getTime()));\n const missingDates = allExpectedDates.filter(\n (expectedDate) => !timeframeDateTimes.has(expectedDate.getTime())\n );\n this.presentTimelineCount = allExpectedDates.length - missingDates.length;\n\n if (missingDates.length > 0) {\n const message =\n `Missing ${missingDates.length} timeframe(s) out of ${allExpectedDates.length} expected: ` +\n missingDates.map((d) => d.toISOString()).join(', ');\n console.warn(message);\n this.lastError += message;\n }\n\n return this.timeframesFromRadars;\n } catch (e) {\n console.error('refreshTimeframesFromRadars', e);\n }\n\n return [];\n }\n\n protected async refreshGlobalCompareReport(done: boolean) {\n if (!done) {\n return;\n }\n\n try {\n const targets: ICompareTarget[] = [];\n for (const frameSet of this.timeframesFromRadars) {\n const target = JSON.parse(JSON.stringify(frameSet));\n target.date = new Date(target.date);\n targets.push(target);\n }\n\n await this.compareManager.refreshGlobalCompareQuality(\n targets,\n this.period,\n !this.removeDuplicate,\n this.provider,\n this.timeStepInMinutes,\n this.timeStepMode\n );\n } catch (e) {\n console.error('refreshGlobalCompareReport', e);\n }\n }\n\n protected async refreshMapTimeframeContainers(target: {\n date: Date;\n rainComputationCumulativeId: string;\n withGauge: boolean;\n cumulativeHours: number;\n }) {\n if (!target?.rainComputationCumulativeId) {\n const message = `Pb with refreshMapTimeframeContainers insights ${target?.date.toISOString()}`;\n console.warn(message);\n this.lastError += message;\n return null;\n }\n\n const rainNode = this.rainNode;\n const containers: TimeframeContainer[] = [];\n const newCreatedTimeframeContainers = new TimeframeContainers(containers);\n try {\n let rainNodeCartesianMap: RainComputationMap;\n\n if (target.cumulativeHours && target.rainComputationCumulativeId) {\n // For N-hour cumulative, use the last frame's cumulative (end of period)\n // The cumulative is pre-computed by raain-ground with windowInMinutes=60\n const lastFrame =\n this.timeframesFromRadarsExtended[this.timeframesFromRadarsExtended.length - 1];\n const cumulativeId =\n lastFrame?.rainComputationCumulativeId || target.rainComputationCumulativeId;\n\n // Use direct cartesian-map endpoint - cumulative data fetched from S3\n rainNodeCartesianMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n rainNode.id,\n cumulativeId\n );\n } else {\n rainNodeCartesianMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n rainNode.id,\n target.rainComputationCumulativeId\n );\n }\n\n if (rainNodeCartesianMap) {\n newCreatedTimeframeContainers.addFromRainComputationMap(\n rainNodeCartesianMap,\n false\n );\n\n this.rainComputationMapVersion = rainNodeCartesianMap.version;\n this.rainComputationMapDate = new Date(rainNodeCartesianMap.date);\n this.rainComputationMapDoneDate = rainNodeCartesianMap.isDoneDate;\n this.rainComputationMapLaunchedBy = rainNodeCartesianMap.launchedBy;\n this.rainComputationMapTimeSpentInMs = rainNodeCartesianMap.timeSpentInMs;\n\n this.rainComputationMapOriginalMin = rainNodeCartesianMap.originalDBZMin;\n this.rainComputationMapOriginalMax = rainNodeCartesianMap.originalDBZMax;\n }\n } catch (e) {\n const message = `Pb with cumulatives for id: ${target.rainComputationCumulativeId} ${e.message}`;\n console.warn(message);\n this.lastError += message;\n }\n\n return newCreatedTimeframeContainers;\n }\n\n protected async refreshCompareQuality(frameSet: FrameSet) {\n await this.compareManager.refreshCompareQuality(frameSet, true);\n await this.compareManager.setGaugesInCompare();\n }\n\n protected async getValues(target: FrameSet): Promise<CartesianMapValue[]> {\n if (!target?.rainComputationCumulativeId) {\n const message = `Pb with target insights ${target?.date.toISOString()}`;\n console.warn(message);\n this.lastError += message;\n return [];\n }\n\n let values: CartesianMapValue[] = [];\n const rainComputationMap =\n await this.profileService.getRainComputationCumulativeCartesianMapById(\n this.rainNode.id,\n target.rainComputationCumulativeId\n );\n\n try {\n if (rainComputationMap) {\n rainComputationMap.getMapData().forEach((m) => {\n if (m.values) {\n (m.values as ICartesianMeasureValue[]).forEach((v) => {\n const cartesianMeasureValue = CartesianMeasureValue.From(v);\n values = values.concat(\n CartesianMapValue.From(\n cartesianMeasureValue.getCartesianValues(),\n this.cartesianTools\n )\n );\n });\n }\n });\n }\n } catch (e) {\n const message = `Pb with cumulatives for id: ${target.rainComputationCumulativeId} ${e.message}`;\n console.warn(message);\n this.lastError += message;\n }\n\n return values;\n }\n}\n","import {DateRange} from 'raain-ui';\n\nexport function mapDateRangeToString(range: DateRange): 'hour' | 'day' | 'month' | 'year' {\n switch (range) {\n case DateRange.HOUR:\n return 'hour';\n case DateRange.DAY:\n return 'day';\n case DateRange.MONTH:\n return 'month';\n case DateRange.YEAR:\n return 'year';\n default:\n return 'year';\n }\n}\n","import {FidjService} from 'fidj-angular';\nimport {EventNode, GaugeNode, Link, PeopleNode, RadarNode, RainNode} from 'raain-model';\nimport {Storage} from './storage.service';\n\nexport class FidjStorageNode {\n public radars: RadarNode[] = [];\n public rains: RainNode[] = [];\n public gauges: GaugeNode[] = [];\n public team: PeopleNode;\n public events: EventNode[] = [];\n\n public infos: any = {};\n\n static getEmptyNode() {\n return new FidjStorageNode();\n }\n\n static getDemoNode() {\n const demoNode = new FidjStorageNode();\n const link = new Link('rain', 'https://demo/api/rains/2');\n /*\n demoNode.radars = [\n new RadarNode({\n id: '5efd04569cb1f4161bd69dc7',\n name: 'demo radar A',\n links: [link],\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RadarNode({\n id: 'dr2',\n name: 'demo radar B',\n links: [link],\n latitude: 0.11,\n longitude: -0.753\n }),\n new RadarNode({\n id: 'dr3',\n name: 'demo radar C',\n latitude: 0.13,\n longitude: -0.753,\n links: []\n }),\n new RadarNode({\n id: 'dr4',\n name: 'demo radar D',\n latitude: 0.14,\n longitude: -0.74,\n links: []\n })];\n demoNode.rains = [\n new RainNode({\n id: '5efd04569cb1f4161bd69dc8',\n name: 'Demo rain zone A',\n links: [new Link('radar', 'https://demo/api/radars/5efcfe619cb1f4161bd69dc3')],\n status: 0,\n quality: 75,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz2',\n name: 'Demo rain zone B',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 1,\n quality: 50,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz3',\n name: 'Demo rain zone C',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 2,\n quality: 75,\n latitude: 48.774569,\n longitude: 2.008407\n }),\n new RainNode({\n id: 'dz4',\n name: 'Demo rain zone D',\n radars: [demoNode.radars[0], demoNode.radars[1]],\n status: 3,\n quality: 95,\n latitude: 48.774569,\n longitude: 2.008407\n })];\n\n demoNode.gauges = [\n new GaugeNode({\n id: 'g1',\n name: 'Gauge A',\n latitude: 48.7748,\n longitude: 2.28407,\n }),\n new GaugeNode({\n id: 'g2',\n name: 'Gauge B',\n latitude: 48.874569,\n longitude: 2.108407,\n })];\n demoNode.events = [{\n id: 'e2',\n title: 'Need support ?',\n status: 0,\n red: false,\n description: 'This area is dedicated to support you and your team. Support is made on Radar or Rain quality, ' +\n 'or any feedback we can have about your production system. Our goal : improving your data.',\n created: new Date(),\n modified: new Date()\n }];\n demoNode.team = {\n id: 'p1',\n email: 'demo@demo.com',\n name: 'demo guy',\n description: 'the demo guy'\n };\n\n */\n return demoNode;\n }\n}\n\nclass FidjStorageResult {\n data: FidjStorageNode;\n}\n\nexport class FidjStorage {\n private isDemoMode: boolean;\n private node: FidjStorageNode = FidjStorageNode.getEmptyNode();\n private fidjMetaResult: FidjStorageResult = {data: new FidjStorageNode()};\n\n constructor(private storage: Storage) {}\n\n public async storeData(fidjService: FidjService, data) {\n this.node = JSON.parse(JSON.stringify(data));\n this.fidjMetaResult.data = this.node;\n\n if (this.isDemoMode) {\n this.storage.set('fidjMetaResult', JSON.stringify(this.fidjMetaResult));\n return;\n }\n\n await fidjService.put(this.fidjMetaResult);\n }\n\n public async getRefreshedNodeCopy(fidjService: FidjService): Promise<FidjStorageNode> {\n if (this.isDemoMode) {\n const fidjMetaResult = this.storage.get('fidjMetaResult');\n if (fidjMetaResult) {\n this.fidjMetaResult = JSON.parse(fidjMetaResult);\n this.node = this.fidjMetaResult.data;\n }\n return JSON.parse(JSON.stringify(this.node));\n }\n\n const firstDemoData = async () => {\n this.node = FidjStorageNode.getDemoNode();\n await this.storeData(fidjService, this.node);\n };\n\n await fidjService.sync(firstDemoData);\n const fidjFindAllResults: any = await fidjService.findAll();\n\n if (fidjFindAllResults && fidjFindAllResults.length > 0) {\n if (fidjFindAllResults[0].data) {\n this.fidjMetaResult = fidjFindAllResults[0];\n this.node = this.fidjMetaResult.data;\n }\n }\n\n return JSON.parse(JSON.stringify(this.node));\n }\n\n setDemoMode(isDemo: boolean) {\n this.isDemoMode = isDemo;\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {BehaviorSubject} from 'rxjs';\nimport {\n BuildQueryString,\n EventNode,\n GaugeMeasure,\n GaugeNode,\n LatLng,\n RaainApiGaugesFindAllMineRequest,\n RaainApiGaugesFindAllMineResponse,\n RaainApiGaugesFindMeasuresRequest,\n RaainApiGaugesFindMeasuresResponse,\n RaainApiGaugesFindOneResponse,\n RaainApiNotificationsAddRequestBody,\n RaainApiNotificationsAddResponse,\n RaainApiNotificationsFindAllMineRequest,\n RaainApiNotificationsFindAllMineResponse,\n RaainApiRadarsFindAllMineRequest,\n RaainApiRadarsFindAllMineResponse,\n RaainApiRadarsFindOneResponse,\n RaainApiRadarsUpdateRequestBody,\n RaainApiRainsCumulativeCartesianMapRequest,\n RaainApiRainsCumulativeCartesianMapResponse,\n RaainApiRainsCumulativeComparesResponse,\n RaainApiRainsCumulativeCumulativeResponse,\n RaainApiRainsCumulativeCumulativesComparesRequest,\n RaainApiRainsCumulativeCumulativesComparesResponse,\n RaainApiRainsCumulativesCreateRequest,\n RaainApiRainsCumulativesCreateResponse,\n RaainApiRainsCumulativesDetailedResponse,\n RaainApiRainsCumulativesListRequest,\n RaainApiRainsCumulativesListResponse,\n RaainApiRainsFindAllMineRequest,\n RaainApiRainsFindAllMineResponse,\n RaainApiRainsFindOneResponse,\n RaainApiRainsFindOneTimeframeCumulativeRequest,\n RaainApiRainsFindOneTimeframeCumulativeResponse,\n RaainApiRainsGetCountsRequest,\n RaainApiRainsGetCountsResponse,\n RaainApiRainsIndicatorsRequest,\n RaainApiRainsIndicatorsResponse,\n RaainApiRainsProgressResponse,\n RaainApiRainsProvidersResponse,\n RaainApiTeamsFindAllMineRequest,\n RaainApiTeamsFindOneResponse,\n RadarNode,\n RainComputationMap,\n RainComputationQuality,\n RainNode,\n SpeedMatrixContainer,\n TeamNode,\n} from 'raain-model';\n\nimport {Storage} from './storage.service';\n\nimport {FidjStorage, FidjStorageNode} from './fidj-storage.model';\nimport {ErrorInterface, FidjService, LoggerLevelEnum} from 'fidj-angular';\nimport {XYType} from './xytype';\nimport {GaugeNodeFilter} from './tools';\nimport {Router} from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ProfileService {\n public readyForSync: BehaviorSubject<boolean>;\n public asTeamId: string;\n\n protected email: string;\n protected isDemo: boolean;\n protected roles: Array<string>;\n protected nodeData: FidjStorageNode;\n protected fidjStorage: FidjStorage;\n protected haveTryToReconnect: boolean;\n\n constructor(\n protected storage: Storage,\n protected fidjService: FidjService,\n protected httpClient: HttpClient,\n private router: Router\n ) {\n this.email = this.storage.get('raain-email');\n this.asTeamId = this.storage.get('raain-asTeamId');\n this.readyForSync = new BehaviorSubject<boolean>(false);\n this.roles = [];\n this.fidjStorage = new FidjStorage(storage);\n this.isDemoMode = false;\n }\n\n get isDemoMode() {\n return this.isDemo;\n }\n\n set isDemoMode(mode) {\n this.isDemo = mode ? mode : true;\n this.fidjStorage.setDemoMode(this.isDemo);\n }\n\n get defaultUrlForAPI() {\n return this.storage.get('raain-urlForAPI');\n }\n\n set defaultUrlForAPI(url: string) {\n this.storage.set('raain-urlForAPI', url);\n }\n\n async refreshProfile(): Promise<FidjStorageNode> {\n try {\n this.nodeData = await this.fidjStorage.getRefreshedNodeCopy(this.fidjService);\n this.setRoles(await this.fidjService.getRoles());\n return this.nodeData;\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async isConnected() {\n return this.fidjService.isConnected();\n }\n\n getEmail() {\n return this.email ?? this.storage.get('raain-email', this.email);\n }\n\n setEmail(email: string) {\n this.email = email;\n this.storage.set('raain-email', this.email);\n }\n\n async logout(fidjKey: string, fidjProd: boolean) {\n // this.storage.remove('raain-email');\n\n if (!fidjKey) {\n try {\n await this.fidjService.loginInDemoMode();\n this.readyForSync.next(true);\n } catch (err) {\n console.error('initFidj catch pb: ', err);\n }\n\n return;\n }\n\n await this.fidjService.logout(true);\n\n try {\n await this.fidjService.init(fidjKey, {\n logLevel: LoggerLevelEnum.WARN, // fidjProd ? LoggerLevelEnum.WARN : LoggerLevelEnum.INFO,\n crypto: false,\n prod: fidjProd,\n useDB: false,\n });\n this.readyForSync.next(true);\n } catch (err) {\n console.error('initFidj catch pb: ', err);\n }\n }\n\n async checkError(error: ErrorInterface) {\n if (error.code === 401) {\n console.warn('Pb on auth');\n if (this.router.url.indexOf('login') < 0) {\n try {\n await this.fidjService.logout();\n } catch (ignored) {\n // Ignore logout errors as we're redirecting to logout page anyway\n }\n return this.gotoLout();\n }\n }\n }\n\n async gotoLout() {\n try {\n if (this.router.url.indexOf('login') > -1) {\n return;\n }\n await this.router.navigateByUrl('/logout', {\n skipLocationChange: true,\n replaceUrl: true,\n });\n } catch (e) {\n console.error('gotoLout error: ', e);\n }\n }\n\n async gotoLogin() {\n if (this.router.url.indexOf('login') > -1) {\n return;\n }\n // await this.router.navigateByUrl('/', {skipLocationChange: true});\n await this.router.navigate(['/login']);\n }\n\n isLoggedIn() {\n const loggedIn = this.fidjService.isLoggedIn();\n console.log('isLoggedIn: ', loggedIn);\n return loggedIn;\n }\n\n needsConnectionRefresh() {\n return this.fidjService.needsRefresh();\n }\n\n async connectionRefresh() {\n await this.fidjService.refresh();\n }\n\n async storeAll() {\n return this.fidjStorage.storeData(this.fidjService, this.nodeData);\n }\n\n isAdmin(): boolean {\n return this.roles.indexOf('admin') > -1;\n }\n\n // === Notifications ===\n\n async createNotification(rainId: string, message: string) {\n const data: RaainApiNotificationsAddRequestBody = {\n rain: rainId,\n message,\n };\n\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n RaainApiNotificationsAddRequestBody,\n RaainApiNotificationsAddResponse\n >({\n key: 'notifications',\n verb: 'POST',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n data,\n });\n return new EventNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async getNotifications(rainId: string) {\n try {\n type NotificationsFindParams = Partial<RaainApiNotificationsFindAllMineRequest>;\n const params: NotificationsFindParams = {rain: rainId};\n const queryString = BuildQueryString<NotificationsFindParams>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiNotificationsFindAllMineResponse\n >({\n key: 'notifications',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n });\n\n return resp.data.notifications.map((n) => new EventNode(n));\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async getAllNotifications(): Promise<EventNode[]> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiNotificationsFindAllMineResponse\n >({\n key: 'notifications',\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/notifications',\n });\n\n return resp.data.notifications.map((n) => new EventNode(n));\n } catch (e) {\n await this.checkError(e);\n }\n\n return [];\n }\n\n // === Teams ===\n\n async getTeams(): Promise<Array<TeamNode>> {\n const teams = [];\n const params = {};\n const queryString = BuildQueryString<RaainApiTeamsFindAllMineRequest>(params);\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n {teams: ReturnType<TeamNode['toJSON']>[]}\n >({\n key: 'teams',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/teams',\n });\n for (const team of resp.data.teams) {\n teams.push(new TeamNode(team));\n }\n } catch (e) {\n await this.checkError(e);\n }\n return teams;\n }\n\n async getTeam(teamId: string): Promise<TeamNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiTeamsFindOneResponse>({\n key: 'teams',\n verb: 'GET',\n relativePath: teamId,\n defaultKeyUrl: this.defaultUrlForAPI + '/teams',\n });\n return new TeamNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n // === Radars ===\n\n async getRadars(name?: string): Promise<Array<RadarNode>> {\n const radars = [];\n const params: RaainApiRadarsFindAllMineRequest = {};\n if (name) {\n params.name = name;\n }\n try {\n let page = 1;\n let hasNext = true;\n while (hasNext) {\n params.page = page;\n const queryString = BuildQueryString<RaainApiRadarsFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRadarsFindAllMineResponse\n >({\n key: 'radars',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/radars',\n });\n for (const r of resp.data.radars) {\n radars.push(new RadarNode(r));\n }\n hasNext = resp.data.pagination?.hasNext ?? false;\n page++;\n }\n } catch (e) {\n await this.checkError(e);\n }\n return radars;\n }\n\n async getRadar(id: string): Promise<RadarNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiRadarsFindOneResponse>(\n {\n key: 'radars',\n verb: 'GET',\n relativePath: id,\n defaultKeyUrl: this.defaultUrlForAPI + '/radars',\n }\n );\n return new RadarNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n\n return null;\n }\n\n async putRadar(radarNode: RadarNode): Promise<RadarNode> {\n const data: RaainApiRadarsUpdateRequestBody = {\n name: radarNode.name,\n };\n\n try {\n const resp = await this.fidjService.sendOnEndpoint<\n RaainApiRadarsUpdateRequestBody,\n ReturnType<RadarNode['toJSON']>\n >({\n key: 'radars',\n relativePath: radarNode.id,\n verb: 'PUT',\n data,\n defaultKeyUrl: this.defaultUrlForAPI + '/radars/',\n });\n\n return new RadarNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async getLonelyRadars(rains: RainNode[]): Promise<RadarNode[]> {\n try {\n const allRadars = await this.getRadars();\n const lonelyRadars: RadarNode[] = [];\n allRadars.forEach((radar) => {\n let found = false;\n rains.forEach((rain) => {\n const rdId = rain.getLink(RadarNode.TYPE).getId();\n if (rdId === radar.id) {\n found = true;\n }\n });\n if (!found) {\n lonelyRadars.push(radar);\n }\n });\n return lonelyRadars;\n } catch (e) {\n await this.checkError(e);\n }\n return [];\n }\n\n async getRainTimeframe(\n rainId: string,\n begin: Date,\n end: Date,\n forced = false,\n provider = 'Raain',\n timeStepInMinutes = 10,\n windowInMinutes = 0\n ): Promise<RainNode> {\n try {\n const params: RaainApiRainsFindOneTimeframeCumulativeRequest = {\n format: 'timeframeCumulative',\n provider,\n timeStepInMinutes: String(timeStepInMinutes),\n begin: begin?.toISOString(),\n end: end?.toISOString(),\n };\n if (forced) {\n params.forced = 'true';\n }\n params.windowInMinutes = String(windowInMinutes);\n const queryString =\n BuildQueryString<RaainApiRainsFindOneTimeframeCumulativeRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsFindOneTimeframeCumulativeResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n const rainNode = new RainNode(resp.data.timeframeCumulative);\n rainNode.name += '.radar.timeframeCumulative';\n return rainNode;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Rains ===\n\n async getRains(name?: string): Promise<Array<RainNode>> {\n const rains = [];\n const params: RaainApiRainsFindAllMineRequest = {};\n if (name) {\n params.name = name;\n }\n try {\n let page = 1;\n let hasNext = true;\n while (hasNext) {\n params.page = page;\n const queryString = BuildQueryString<RaainApiRainsFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsFindAllMineResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n for (const rain of resp.data.rains) {\n rains.push(new RainNode(rain));\n }\n hasNext = resp.data.pagination?.hasNext ?? false;\n page++;\n }\n } catch (e) {\n await this.checkError(e);\n }\n return rains;\n }\n\n async getRain(id: string): Promise<RainNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiRainsFindOneResponse>({\n key: 'rains',\n relativePath: id,\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n return new RainNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Count\n\n async getCounts(\n rainId: string,\n options: {\n range: 'hour' | 'day' | 'month' | 'year';\n periodBegin: Date;\n }\n ): Promise<{\n percentImages: XYType[];\n percentRainy: XYType[];\n percentQ: XYType[];\n percentComputations: XYType[];\n queueRunning: number;\n }> {\n try {\n const params: RaainApiRainsGetCountsRequest = {\n range: options.range,\n begin: options.periodBegin.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiRainsGetCountsRequest>(params);\n\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsGetCountsResponse\n >({\n key: 'rains',\n relativePath: rainId + '/counts' + (queryString ? '?' + queryString : ''),\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n\n const counts = resp.data.counts.result;\n const percentImages: XYType[] = [],\n percentRainy: XYType[] = [],\n percentQ: XYType[] = [],\n percentComputations: XYType[] = [];\n\n counts.forEach((c) => {\n const label = this.setDateComponents(options.periodBegin, c);\n percentImages.push(new XYType(c.percentImages ?? 0, NaN, NaN, label));\n percentRainy.push(new XYType(c.percentRainy ?? 0, NaN, NaN, label));\n percentQ.push(new XYType(c.percentQ ?? 0, NaN, NaN, label));\n percentComputations.push(new XYType(c.percentComputations ?? 0, NaN, NaN, label));\n });\n\n return {\n percentImages,\n percentRainy,\n percentQ,\n percentComputations,\n queueRunning: resp.data.queueRunning,\n };\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getCountsHour(\n rainId: string,\n options: {periodBegin: Date}\n ): Promise<{\n percentImages: XYType[];\n percentComputations: XYType[];\n rainyCount: XYType[];\n rainySum: XYType[];\n queueRunning: number;\n }> {\n try {\n const params: RaainApiRainsGetCountsRequest = {\n range: 'hour',\n begin: options.periodBegin.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiRainsGetCountsRequest>(params);\n\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsGetCountsResponse\n >({\n key: 'rains',\n relativePath: rainId + '/counts' + (queryString ? '?' + queryString : ''),\n verb: 'GET',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains/',\n });\n\n const counts = resp.data.counts.result;\n const percentImages: XYType[] = [],\n percentComputations: XYType[] = [],\n rainySum: XYType[] = [],\n rainyCount: XYType[] = [];\n\n counts.forEach((c) => {\n const label = this.setDateComponents(options.periodBegin, c);\n percentImages.push(new XYType(c.percentImages ?? 0, NaN, NaN, label));\n percentComputations.push(new XYType(c.percentComputations ?? 0, NaN, NaN, label));\n rainyCount.push(new XYType(c.rainyCount ?? 0, NaN, NaN, label));\n rainySum.push(new XYType(c.rainySum ?? 0, NaN, NaN, label));\n });\n\n return {\n percentImages,\n percentComputations,\n rainyCount,\n rainySum,\n queueRunning: resp.data.queueRunning,\n };\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Computing ===\n\n async getRainComputationCumulativeCartesianMapById(\n rainId: string,\n rainComputationCumulativeId: string\n ): Promise<RainComputationMap> {\n const params: RaainApiRainsCumulativeCartesianMapRequest = {format: 'cartesian-map'};\n const queryString = BuildQueryString<RaainApiRainsCumulativeCartesianMapRequest>(params);\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCartesianMapResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainId}/cumulatives/${rainComputationCumulativeId}?${queryString}`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n if (!response.data['cartesian-map']) {\n return null;\n }\n\n const rainComputationMap = new RainComputationMap(response.data['cartesian-map']);\n rainComputationMap.name = rainId + '.rain.cartesian-map';\n return rainComputationMap;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainComputationCumulativeCumulativesMapById(\n rainId: string,\n rainComputationCumulativeId: string,\n cumulativeHours: number\n ): Promise<RainComputationMap> {\n const queryPath = `${rainId}/cumulatives/${rainComputationCumulativeId}/cumulative/${cumulativeHours}`;\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCumulativeResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryPath,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n if (!response.data['cumulative']) {\n return null;\n }\n\n const rainComputationMap = new RainComputationMap(response.data['cumulative']);\n rainComputationMap.name = rainId + '.rain.cumulative-cumulative';\n return rainComputationMap;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainCumulativeCompare(\n rainNode: RainNode,\n rainComputationCumulativeId: string\n ): Promise<RainComputationQuality> {\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeComparesResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainNode.id}/cumulatives/${rainComputationCumulativeId}/compares`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n const qualityJson = response.data.qualities[0];\n const rainComputationQuality = new RainComputationQuality(qualityJson);\n rainComputationQuality.qualitySpeedMatrixContainer =\n SpeedMatrixContainer.CreateFromJson(\n rainComputationQuality.qualitySpeedMatrixContainer\n );\n return rainComputationQuality;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // Fetch per-frequency quality for an on-demand cumulative\n // timeStepInMinutes = gauge frequency filter (e.g. 6 for 6min gauges, 30 for 30min gauges)\n // timeStepMode = 'eq' (exact match) or 'lte' (all frequencies <= timeStepInMinutes)\n // provider = gauge provider filter (e.g. 'Raain')\n async getRainCumulativeCumulativesCompare(\n rainNode: RainNode,\n rainComputationCumulativeId: string,\n provider: string = 'Raain',\n timeStepInMinutes: number = 5,\n timeStepMode: 'eq' | 'lte' = 'eq'\n ): Promise<RainComputationQuality> {\n const params: RaainApiRainsCumulativeCumulativesComparesRequest = {\n provider,\n timeStepInMinutes,\n timeStepMode,\n };\n\n const queryString =\n BuildQueryString<RaainApiRainsCumulativeCumulativesComparesRequest>(params);\n\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativeCumulativesComparesResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: `${rainNode.id}/cumulatives/${rainComputationCumulativeId}/compares?${queryString}`,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n const allQualities = response.data.qualities;\n if (!allQualities?.length) {\n return null;\n }\n\n const rainComputationQuality = new RainComputationQuality(allQualities[0]);\n rainComputationQuality.qualitySpeedMatrixContainer =\n SpeedMatrixContainer.CreateFromJson(\n rainComputationQuality.qualitySpeedMatrixContainer\n );\n\n // Merge additional qualities (lte mode returns multiple freq groups)\n for (let i = 1; i < allQualities.length; i++) {\n const extra = new RainComputationQuality(allQualities[i]);\n extra.qualitySpeedMatrixContainer = SpeedMatrixContainer.CreateFromJson(\n extra.qualitySpeedMatrixContainer\n );\n rainComputationQuality.merge(extra);\n }\n\n return rainComputationQuality;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n async getRainProgress(rainId: string): Promise<number> {\n try {\n const queryPath = '' + rainId + '/progress';\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsProgressResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: queryPath,\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n // return response.data.inProgress;\n return response.data.inQueue;\n } catch (e) {\n await this.checkError(e);\n }\n return 0;\n }\n\n async getIndicators(rainId: string): Promise<RaainApiRainsIndicatorsResponse> {\n try {\n const params: RaainApiRainsIndicatorsRequest = {\n cumulative: 'true',\n };\n const queryString = BuildQueryString<RaainApiRainsIndicatorsRequest>(params);\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsIndicatorsResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/indicators' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return {indicators: []};\n }\n\n // GET /rains/:rainId/cumulatives - List available cumulative periods\n // With detailed=true, returns individual cumulatives instead of aggregated periods\n async getCumulativePeriods(\n rainId: string,\n filters?: {\n windowInMinutes?: number;\n provider?: string;\n isReady?: boolean;\n forced?: boolean;\n detailed?: boolean;\n page?: number;\n limit?: number;\n periodBegin?: string;\n periodEnd?: string;\n }\n ): Promise<RaainApiRainsCumulativesListResponse | RaainApiRainsCumulativesDetailedResponse> {\n try {\n const params: RaainApiRainsCumulativesListRequest = {};\n if (filters?.windowInMinutes !== undefined) {\n params.windowInMinutes = filters.windowInMinutes;\n }\n if (filters?.provider) {\n params.provider = filters.provider;\n }\n if (filters?.isReady !== undefined) {\n params.isReady = filters.isReady;\n }\n if (filters?.forced !== undefined) {\n params.forced = filters.forced;\n }\n if (filters?.detailed) {\n params.detailed = true;\n }\n if (filters?.page !== undefined) {\n params.page = filters.page;\n }\n if (filters?.limit !== undefined) {\n params.limit = filters.limit;\n }\n if (filters?.periodBegin) {\n params.periodBegin = filters.periodBegin;\n }\n if (filters?.periodEnd) {\n params.periodEnd = filters.periodEnd;\n }\n const queryString = BuildQueryString<RaainApiRainsCumulativesListRequest>(params);\n\n if (filters?.detailed) {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativesDetailedResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/cumulatives' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n return response.data;\n }\n\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsCumulativesListResponse\n >({\n key: 'rains',\n verb: 'GET',\n relativePath: rainId + '/cumulatives' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return {periods: [], total: 0};\n }\n\n // POST /rains/:rainId/cumulatives - Trigger cumulative computation\n async createCumulativePeriod(\n rainId: string,\n params: {\n periodBegin: Date;\n periodEnd: Date;\n provider: string;\n confName?: string;\n timeStepInMinutes?: number;\n }\n ): Promise<RaainApiRainsCumulativesCreateResponse> {\n try {\n const body: RaainApiRainsCumulativesCreateRequest = {\n periodBegin: params.periodBegin.toISOString(),\n periodEnd: params.periodEnd.toISOString(),\n provider: params.provider,\n confName: params.confName || 'admin',\n timeStepInMinutes: params.timeStepInMinutes || 5,\n };\n\n const response = await this.fidjService.sendOnEndpoint<\n RaainApiRainsCumulativesCreateRequest,\n RaainApiRainsCumulativesCreateResponse\n >({\n key: 'rains',\n verb: 'POST',\n relativePath: rainId + '/cumulatives',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n data: body,\n });\n\n return response.data;\n } catch (e) {\n await this.checkError(e);\n }\n return null;\n }\n\n // === Gauges ===\n\n async getGauge(gaugeId: string): Promise<GaugeNode> {\n try {\n const resp = await this.fidjService.sendOnEndpoint<void, RaainApiGaugesFindOneResponse>(\n {\n key: 'gauges',\n verb: 'GET',\n relativePath: gaugeId,\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n }\n );\n return new GaugeNode(resp.data);\n } catch (e) {\n await this.checkError(e);\n }\n }\n\n async getGauges(\n rainId: string,\n aroundLatLng: LatLng,\n pageCount = 1\n ): Promise<Array<GaugeNodeFilter>> {\n const baseParams: RaainApiGaugesFindAllMineRequest = {\n aroundLatLng: `${aroundLatLng.lat},${aroundLatLng.lng}`,\n rainId,\n };\n if (this.asTeamId) {\n baseParams.teamId = this.asTeamId;\n }\n\n const gauges = [];\n try {\n for (let count = 1; count <= pageCount; count++) {\n const params: RaainApiGaugesFindAllMineRequest = {...baseParams, page: count};\n const queryString = BuildQueryString<RaainApiGaugesFindAllMineRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiGaugesFindAllMineResponse\n >({\n key: 'gauges',\n verb: 'GET',\n relativePath: queryString ? '?' + queryString : '',\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n });\n\n for (const gauge of resp.data.gauges) {\n gauges.push(new GaugeNodeFilter(gauge));\n }\n }\n } catch (e) {\n await this.checkError(e);\n }\n return gauges;\n }\n\n async getGaugeMeasures(gaugeId: string, begin: Date, end: Date): Promise<GaugeMeasure[]> {\n const params: RaainApiGaugesFindMeasuresRequest = {\n begin: begin.toISOString(),\n end: end.toISOString(),\n };\n const queryString = BuildQueryString<RaainApiGaugesFindMeasuresRequest>(params);\n const resp = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiGaugesFindMeasuresResponse\n >({\n key: 'gauges',\n verb: 'GET',\n relativePath: gaugeId + '/measures' + (queryString ? '?' + queryString : ''),\n defaultKeyUrl: this.defaultUrlForAPI + '/gauges',\n });\n\n const gaugeMeasures: GaugeMeasure[] = [];\n for (const gaugeMeasure of resp.data.gaugeMeasures) {\n gaugeMeasures.push(new GaugeMeasure(gaugeMeasure));\n }\n return gaugeMeasures;\n }\n\n async getProviders(\n rainId: string\n ): Promise<{providers: string[]; timeStepInMinutes: number[]}> {\n try {\n const response = await this.fidjService.sendOnEndpoint<\n void,\n RaainApiRainsProvidersResponse\n >({\n verb: 'GET',\n key: 'rains',\n relativePath: rainId + '/providers',\n defaultKeyUrl: this.defaultUrlForAPI + '/rains',\n });\n\n return {\n providers: response.data.providers || [],\n timeStepInMinutes: response.data.timeStepInMinutes?.length\n ? response.data.timeStepInMinutes\n : [5, 10, 15, 30, 60],\n };\n } catch (e) {\n console.error('getProviders error:', e);\n return {\n providers: [],\n timeStepInMinutes: [5, 10, 15, 30, 60],\n };\n }\n }\n\n protected setRoles(roles: Array<string>): void {\n this.roles = roles;\n }\n\n private setDateComponents(\n date: Date,\n c: {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n }\n ): string {\n const dateToShow = new Date(date);\n\n if (c.year !== undefined) {\n dateToShow.setUTCFullYear(c.year);\n }\n if (c.month !== undefined) {\n dateToShow.setUTCMonth(c.month - 1);\n }\n if (c.day !== undefined) {\n dateToShow.setUTCDate(c.day);\n }\n if (c.hour !== undefined) {\n dateToShow.setUTCHours(c.hour);\n }\n if (c.minute !== undefined) {\n dateToShow.setUTCMinutes(c.minute);\n }\n\n return dateToShow.toISOString();\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport {ProfileService} from '../profile.service';\nimport {\n CumulativePeriod,\n IndividualCumulative,\n RaainApiRainsCumulativesDetailedResponse,\n RaainApiRainsCumulativesListResponse,\n} from 'raain-model';\n\nexport interface CumulativeSelection {\n periodBegin: Date;\n periodEnd: Date;\n windowInMinutes: number;\n cumulativeId?: string;\n cumulativeDate?: Date;\n}\n\n@Component({\n selector: 'cumulative-selector',\n templateUrl: './cumulative-selector.component.html',\n styleUrls: ['./cumulative-selector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CumulativeSelectorComponent implements OnInit {\n @Input() rainId: string;\n @Input() currentPeriodBegin: Date;\n @Input() currentPeriodEnd: Date;\n @Input() provider: string;\n @Input() timeStepInMinutes: number = 5;\n @Input() isAdmin: boolean = false;\n\n @Output() periodSelected = new EventEmitter<CumulativeSelection>();\n @Output() cancelled = new EventEmitter<void>();\n\n availablePeriods: CumulativePeriod[] = [];\n baseCumulatives: CumulativePeriod = null;\n loading = true;\n creating = false;\n creationProgress = '';\n errorMessage = '';\n\n coveragePercent = 0;\n canCreateNew = false;\n currentWindowMinutes = 0;\n\n expandedPeriods: Map<string, IndividualCumulative[]> = new Map();\n loadingExpanded: Set<string> = new Set();\n\n private readonly POLL_TIMEOUT_MS = 900000; // 900 seconds\n private readonly POLL_INTERVAL_MS = 3000;\n\n constructor(\n private profileService: ProfileService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n this.currentWindowMinutes = Math.round(\n (this.currentPeriodEnd.getTime() - this.currentPeriodBegin.getTime()) / 60000\n );\n await this.loadAvailablePeriods();\n }\n\n async loadAvailablePeriods() {\n this.loading = true;\n this.errorMessage = '';\n this.cdr.markForCheck();\n\n try {\n // Fetch all cumulative periods (admin sees all, non-admin sees only customer-launched)\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n forced: this.isAdmin,\n periodBegin: this.currentPeriodBegin.toISOString(),\n periodEnd: this.currentPeriodEnd.toISOString(),\n })) as RaainApiRainsCumulativesListResponse;\n\n // Filter for existing custom cumulatives (window > 0)\n this.availablePeriods = response.periods.filter((p) => p.windowInMinutes > 0);\n\n // Get base cumulatives (window = 0) to check coverage\n this.baseCumulatives = response.periods.find((p) => p.windowInMinutes === 0);\n\n this.calculateCoverage();\n } catch (e) {\n this.errorMessage = 'Failed to load cumulative periods';\n console.error('Error loading cumulative periods:', e);\n }\n\n this.loading = false;\n this.cdr.markForCheck();\n }\n\n calculateCoverage() {\n if (!this.baseCumulatives || !this.baseCumulatives.count) {\n this.coveragePercent = 0;\n this.canCreateNew = false;\n return;\n }\n\n // Calculate expected number of base cumulatives (always 5-min granularity)\n const baseTimeStep = 5;\n const expectedCount = Math.ceil(this.currentWindowMinutes / baseTimeStep);\n\n if (this.baseCumulatives.count >= expectedCount) {\n this.coveragePercent = 100;\n } else {\n this.coveragePercent = Math.round((this.baseCumulatives.count / expectedCount) * 100);\n }\n\n // Allow creation as long as some base data exists\n this.canCreateNew = this.coveragePercent > 0;\n }\n\n selectPeriod(period: CumulativePeriod) {\n this.periodSelected.emit({\n periodBegin: new Date(period.periodBegin),\n periodEnd: new Date(period.periodEnd),\n windowInMinutes: period.windowInMinutes,\n });\n }\n\n async toggleExpand(period: CumulativePeriod) {\n const key = `${period.windowInMinutes}`;\n if (this.expandedPeriods.has(key)) {\n this.expandedPeriods.delete(key);\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingExpanded.add(key);\n this.cdr.markForCheck();\n\n try {\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n windowInMinutes: period.windowInMinutes,\n forced: this.isAdmin,\n detailed: true,\n })) as RaainApiRainsCumulativesDetailedResponse;\n\n this.expandedPeriods.set(key, response.cumulatives || []);\n } catch (e) {\n console.error('Error loading individual cumulatives:', e);\n this.expandedPeriods.set(key, []);\n }\n\n this.loadingExpanded.delete(key);\n this.cdr.markForCheck();\n }\n\n selectIndividualCumulative(item: IndividualCumulative) {\n const endDate = new Date(item.date);\n const beginDate = new Date(endDate.getTime() - item.windowInMinutes * 60000);\n\n this.periodSelected.emit({\n periodBegin: beginDate,\n periodEnd: endDate,\n windowInMinutes: item.windowInMinutes,\n cumulativeId: item.id,\n cumulativeDate: endDate,\n });\n }\n\n isExpanded(period: CumulativePeriod): boolean {\n return this.expandedPeriods.has(`${period.windowInMinutes}`);\n }\n\n isLoadingExpanded(period: CumulativePeriod): boolean {\n return this.loadingExpanded.has(`${period.windowInMinutes}`);\n }\n\n getExpandedItems(period: CumulativePeriod): IndividualCumulative[] {\n return this.expandedPeriods.get(`${period.windowInMinutes}`) || [];\n }\n\n getItemPeriodBegin(item: IndividualCumulative): Date {\n const endDate = new Date(item.date);\n return new Date(endDate.getTime() - item.windowInMinutes * 60000);\n }\n\n async createNewPeriod() {\n if (!this.canCreateNew || this.creating) {\n return;\n }\n\n this.creating = true;\n this.creationProgress = 'Starting cumulative computation...';\n this.errorMessage = '';\n this.cdr.markForCheck();\n\n try {\n // Trigger cumulative creation\n const result = await this.profileService.createCumulativePeriod(this.rainId, {\n periodBegin: this.currentPeriodBegin,\n periodEnd: this.currentPeriodEnd,\n provider: this.provider,\n timeStepInMinutes: this.timeStepInMinutes,\n });\n\n if (!result) {\n throw new Error('Failed to trigger cumulative computation');\n }\n\n this.creationProgress = `Jobs queued. Polling for completion...`;\n this.cdr.markForCheck();\n\n // Poll for completion\n const success = await this.pollForCompletion();\n\n if (success) {\n this.periodSelected.emit({\n periodBegin: this.currentPeriodBegin,\n periodEnd: this.currentPeriodEnd,\n windowInMinutes: this.currentWindowMinutes,\n });\n } else {\n this.errorMessage = 'Timeout waiting for cumulative computation';\n }\n } catch (e) {\n this.errorMessage = `Error: ${e.message || 'Unknown error'}`;\n console.error('Error creating cumulative:', e);\n }\n\n this.creating = false;\n this.cdr.markForCheck();\n }\n\n private async pollForCompletion(): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < this.POLL_TIMEOUT_MS) {\n try {\n const progress = await this.profileService.getRainProgress(this.rainId);\n\n if (progress === 0) {\n // Trigger background fetch from raain-ground via timeframeCumulative\n await this.profileService.getRainTimeframe(\n this.rainId,\n this.currentPeriodBegin,\n this.currentPeriodEnd,\n this.isAdmin,\n this.provider,\n this.timeStepInMinutes,\n this.currentWindowMinutes\n );\n\n // Check if cumulative now exists (admin sees all cumulatives)\n const response = (await this.profileService.getCumulativePeriods(this.rainId, {\n provider: this.provider,\n windowInMinutes: this.currentWindowMinutes,\n forced: this.isAdmin,\n })) as RaainApiRainsCumulativesListResponse;\n\n const found = response.periods.find(\n (p) => p.windowInMinutes === this.currentWindowMinutes\n );\n\n if (found) {\n return true;\n }\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n this.creationProgress = `Computing... (${elapsed}s, queue: ${progress})`;\n this.cdr.markForCheck();\n\n await this.sleep(this.POLL_INTERVAL_MS);\n } catch (e) {\n console.warn('Poll error:', e);\n await this.sleep(this.POLL_INTERVAL_MS);\n }\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n cancel() {\n this.cancelled.emit();\n }\n\n formatPeriod(period: CumulativePeriod): string {\n const begin = new Date(period.periodBegin);\n const end = new Date(period.periodEnd);\n return `${begin.toLocaleString()} → ${end.toLocaleString()}`;\n }\n\n formatWindow(minutes: number): string {\n if (minutes < 60) {\n return `${minutes} min`;\n }\n const hours = minutes / 60;\n return hours === 1 ? '1 hour' : `${hours} hours`;\n }\n}\n","<div class=\"cumulative-selector-overlay\">\n <div class=\"cumulative-selector-modal\">\n <div class=\"modal-header\">\n <h2>Select Cumulative Period</h2>\n <ion-button (click)=\"cancel()\" fill=\"clear\">\n <ion-icon name=\"close\"></ion-icon>\n </ion-button>\n </div>\n\n <div class=\"modal-content\">\n <!-- Loading state -->\n <div *ngIf=\"loading\" class=\"loading-state\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Loading available periods...</p>\n </div>\n\n <!-- Error message -->\n <div *ngIf=\"errorMessage\" class=\"error-message\">\n <ion-icon name=\"warning-outline\"></ion-icon>\n <span>{{ errorMessage }}</span>\n </div>\n\n <!-- Available periods list -->\n <div *ngIf=\"!loading && availablePeriods.length > 0\" class=\"periods-section\">\n <h3>Available Cumulative Periods</h3>\n <ion-list>\n <ng-container *ngFor=\"let period of availablePeriods\">\n <!-- Period header (click to expand) -->\n <ion-item (click)=\"toggleExpand(period)\" [disabled]=\"creating\" button>\n <ion-icon [name]=\"isExpanded(period) ? 'chevron-down' : 'chevron-forward'\"\n slot=\"start\"></ion-icon>\n <ion-label>\n <h2>{{ formatWindow(period.windowInMinutes) }}</h2>\n <p>{{ formatPeriod(period) }}</p>\n <p class=\"count-info\">{{ period.count }} cumulative(s) - click to expand</p>\n </ion-label>\n </ion-item>\n\n <!-- Expanded: individual cumulatives -->\n <div *ngIf=\"isExpanded(period)\" class=\"expanded-items\">\n <ion-spinner *ngIf=\"isLoadingExpanded(period)\" name=\"crescent\"></ion-spinner>\n <ion-list *ngIf=\"!isLoadingExpanded(period)\" class=\"nested-list\">\n <ion-item (click)=\"selectIndividualCumulative(item)\"\n *ngFor=\"let item of getExpandedItems(period)\"\n [disabled]=\"creating\"\n button\n class=\"nested-item\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n <ion-label>\n <h3>{{ getItemPeriodBegin(item) | date:'HH:mm' }}\n - {{ item.date | date:'HH:mm' }}</h3>\n </ion-label>\n <ion-icon name=\"chevron-forward\" slot=\"end\"></ion-icon>\n </ion-item>\n <ion-item *ngIf=\"getExpandedItems(period).length === 0\" class=\"nested-item\">\n <ion-label>\n <p>No individual cumulatives found</p>\n </ion-label>\n </ion-item>\n </ion-list>\n </div>\n </ng-container>\n </ion-list>\n </div>\n\n <!-- No periods available -->\n <div *ngIf=\"!loading && availablePeriods.length === 0\" class=\"no-periods\">\n <ion-icon name=\"information-circle-outline\"></ion-icon>\n <p>No cumulative periods available yet.</p>\n </div>\n\n <!-- Create new section (admin only) -->\n <div *ngIf=\"!loading && isAdmin\" class=\"create-section\">\n <h3>Create New Cumulative</h3>\n <div class=\"create-info\">\n <p>\n <strong>Period:</strong>\n {{ currentPeriodBegin?.toLocaleString() }} → {{ currentPeriodEnd?.toLocaleString() }}\n </p>\n <p>\n <strong>Window:</strong> {{ formatWindow(currentWindowMinutes) }}\n </p>\n <p *ngIf=\"baseCumulatives\" [class.coverage-error]=\"coveragePercent === 0\"\n [class.coverage-ok]=\"coveragePercent >= 100\"\n [class.coverage-warn]=\"coveragePercent > 0 && coveragePercent < 100\"\n class=\"coverage-info\">\n <ion-icon [name]=\"coveragePercent >= 100 ? 'checkmark-circle' : 'alert-circle'\"></ion-icon>\n Base data coverage: {{ coveragePercent }}%\n </p>\n <p *ngIf=\"!baseCumulatives\" class=\"coverage-error\">\n <ion-icon name=\"alert-circle\"></ion-icon>\n No base cumulatives available\n </p>\n </div>\n\n <!-- Creation progress -->\n <div *ngIf=\"creating\" class=\"creation-progress\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>{{ creationProgress }}</span>\n </div>\n\n <ion-button (click)=\"createNewPeriod()\" [disabled]=\"!canCreateNew || creating\"\n expand=\"block\"\n id=\"createNewCumulative\">\n <ion-icon name=\"add-circle-outline\" slot=\"start\"></ion-icon>\n Create {{ formatWindow(currentWindowMinutes) }} Cumulative\n </ion-button>\n\n <p *ngIf=\"!canCreateNew && !creating\" class=\"create-hint\">\n Create is disabled because no base 5-min cumulatives exist for the selected period.\n </p>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <ion-button (click)=\"cancel()\" [disabled]=\"creating\" fill=\"outline\">\n Cancel\n </ion-button>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {IonToggle} from '@ionic/angular';\nimport {ProfileService} from '../profile.service';\nimport {\n CartesianMeasureValue,\n QualityIndicator,\n RaainApiRainsCumulativesListResponse,\n RainNode,\n TeamNode,\n} from 'raain-model';\nimport {\n DateRange,\n ElementsFactory,\n MapLatLng,\n ModelPerformanceElement,\n ModelPerformanceElementInput,\n TimeframeContainers,\n} from 'raain-ui';\nimport {CompareManager, FrameSet, mapDateRangeToString, RefreshManager} from '../tools';\nimport {XYType} from '../xytype';\nimport {RadarService} from '../radar.service';\nimport {Storage} from '../storage.service';\nimport {CumulativeSelection} from '../cumulative-selector/cumulative-selector.component';\n\nlet TEST_DETECTION = 0;\n\n@Component({\n selector: 'raain-details',\n templateUrl: 'raain-details.component.html',\n styleUrls: ['raain-details.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaainDetailsComponent implements OnDestroy, OnChanges {\n private static readonly HOUR_MS = 60 * 60000;\n private static readonly DAY_MS = 24 * 60 * 60 * 1000;\n\n @Input()\n public toggleAdmin: boolean;\n @Input()\n public rainNode: RainNode;\n @Input()\n public compareManager: CompareManager;\n @Input()\n public refreshManager: RefreshManager;\n @Input()\n public profileService: ProfileService;\n @Input()\n public radarService: RadarService;\n @Input()\n public scaleLabel = 'mm';\n @Input()\n public showCreateMissingImages = true;\n @Input()\n public showCumulativeCompare = true;\n @Input()\n public showDateRange = true;\n @Input()\n public showCumulativeToggle = true;\n @Input()\n public forceTimeStep: number;\n\n public availableProviders: string[] = [];\n public availableTimeSteps: number[] = [];\n public availableTimeStepOptions: {label: string; value: string}[] = [];\n public selectedProvider: string;\n public selectedTimeStep: number;\n public timeStepMode: 'eq' | 'lte' = 'eq';\n\n public periodBegin: Date;\n public periodEnd: Date;\n\n // public UI variables\n public teamNode: TeamNode;\n public periodBeginAsString: string;\n public periodEndAsString: string;\n public periodDurationAsString: string;\n public dateShown: Date;\n public coordinates: MapLatLng;\n public borders: MapLatLng[];\n public timeframeContainers: TimeframeContainers;\n public currentTimeframeTarget: FrameSet;\n public timeframeDates: Date[];\n public countPoints: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n public countsPeriod: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n };\n\n public gaugeSelectedPoints: {\n label: string;\n style: string;\n values: {date: Date; value: number}[];\n }[];\n public toggleHistory: boolean;\n public toggleMap: boolean;\n public toggleCompare: boolean;\n public toggleGaugeMeasures: boolean;\n public toggleRemoveCompareDuplicate: boolean;\n public toggleCumulative: boolean;\n public refreshInProgress: boolean;\n public sumDetails: string;\n public showPixelMarkers: boolean = false;\n public isAdmin: boolean;\n public showFullError: boolean;\n public showQualityModal: boolean;\n public qualityIndicators: QualityIndicator[] = [];\n public qualityIndicatorsLoading: boolean = false;\n public showCumulativeSelector: boolean = false;\n public creatingCumulative: boolean = false;\n public showQualityDetails: boolean = false;\n public modelPerformanceData: Array<{\n name: string;\n date: Date;\n KPEi: number | null;\n KPE1: number | null;\n }> = [];\n private performanceChart: ModelPerformanceElement;\n\n @ViewChild('cumulativeToggle') cumulativeToggleRef: IonToggle;\n @ViewChild('performanceCanvas') performanceCanvasRef: any;\n\n // Cached computed values (to avoid method calls in templates)\n public percentOfComputations: number = 0;\n public presentComputationCount: number = 0;\n public expectedComputationCount: number = 0;\n public percentOfImages: number = 0;\n public truncatedError: string = '';\n public cumulativeDurationInMinutes: number = 10;\n protected readonly DateRange = DateRange;\n\n constructor(\n protected storage: Storage,\n private readonly cdr: ChangeDetectorRef\n ) {}\n\n private static PeriodDisplay(date: Date | string) {\n let d = new Date();\n if (date) {\n d = new Date(date);\n const userTimezoneOffset = d.getTimezoneOffset() * 60000;\n d = new Date(d.getTime() - userTimezoneOffset);\n }\n const exampleFormattedDate = '2017-06-01T08:30';\n return d.toISOString().substring(0, exampleFormattedDate.length);\n }\n\n private static DateUTC(date: string) {\n const hasISOFormat = date.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/);\n let d = new Date(date);\n if (!hasISOFormat) {\n const userTimezoneOffset = d.getTimezoneOffset() * 60000;\n d = new Date(d.getTime() - userTimezoneOffset);\n }\n return d;\n }\n\n private static MapCountToDateValue(c: XYType): {date: Date; value: number} {\n return {\n date: RaainDetailsComponent.DateUTC(c.name),\n value: Math.min(100, c.x),\n };\n }\n\n async openQualityModal() {\n this.showQualityModal = true;\n this.qualityIndicatorsLoading = true;\n this.qualityIndicators = [];\n this.modelPerformanceData = [];\n this.cdr.markForCheck();\n\n if (this.rainNode?.id) {\n const result = await this.profileService.getIndicators(this.rainNode.id);\n this.qualityIndicators = result.indicators;\n this.modelPerformanceData = this.buildModelPerformanceData(result.indicators);\n }\n\n this.qualityIndicatorsLoading = false;\n this.cdr.markForCheck();\n\n if (this.modelPerformanceData.length > 0) {\n setTimeout(() => this.renderPerformanceChart(), 100);\n }\n }\n\n closeQualityModal() {\n this.showQualityModal = false;\n if (this.performanceChart?.chart) {\n this.performanceChart.chart.destroy();\n this.performanceChart = null;\n }\n }\n\n buildModelPerformanceData(\n indicators: QualityIndicator[]\n ): Array<{name: string; date: Date; KPEi: number | null; KPE1: number | null}> {\n // Group by version combo (computingVersion + qualityVersion)\n const grouped = new Map<string, {date: Date; KPEi: number | null; KPE1: number | null}>();\n\n for (const ind of indicators) {\n const key = `C${ind.computingVersion}-Q${ind.qualityVersion}`;\n if (!grouped.has(key)) {\n grouped.set(key, {date: new Date(ind.lastUpdatedAt), KPEi: null, KPE1: null});\n }\n const entry = grouped.get(key);\n\n // Update date to latest\n const indDate = new Date(ind.lastUpdatedAt);\n if (indDate.getTime() > entry.date.getTime()) {\n entry.date = indDate;\n }\n\n if (ind.timeStepInMinutes === 5) {\n entry.KPEi = ind.averageQuality;\n } else if (ind.timeStepInMinutes === 60) {\n entry.KPE1 = ind.averageQuality;\n }\n }\n\n return Array.from(grouped.entries()).map(([name, data]) => ({\n name,\n date: data.date,\n KPEi: data.KPEi,\n KPE1: data.KPE1,\n }));\n }\n\n private renderPerformanceChart() {\n const canvas = this.performanceCanvasRef?.nativeElement;\n if (!canvas) {\n return;\n }\n const factory = new ElementsFactory();\n this.performanceChart = factory.createModelPerformance(\n canvas,\n new ModelPerformanceElementInput(this.modelPerformanceData)\n );\n }\n\n formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return (\n date.toLocaleDateString() +\n ' ' +\n date.toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'})\n );\n }\n\n public async fetchData(focusDate: Date, focusRange: DateRange) {\n const values = [];\n for (let i = 0; i < 10; i++) {\n values.push({date: new Date(2020 + i, 0), value: 10});\n }\n const fakeData = [\n {\n label: '% Rainy',\n style: 'bar',\n values,\n },\n {\n label: '% Images',\n style: 'bar',\n values,\n },\n {\n label: '% Computations',\n style: 'bar',\n values,\n },\n ];\n\n const range = mapDateRangeToString(focusRange);\n let data = fakeData;\n if (!this.rainNode) {\n return data;\n }\n\n if (focusRange === DateRange.CENTURY) {\n // fake\n } else if (focusRange === DateRange.HOUR) {\n const hourCounts = await this.profileService.getCountsHour(this.rainNode.id, {\n periodBegin: focusDate,\n });\n\n data = [\n {\n label: 'Rainy Count',\n style: 'line',\n values: hourCounts.rainyCount.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Images',\n style: 'bar',\n values: hourCounts.percentImages.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Computations',\n style: 'bar',\n values: hourCounts.percentComputations.map(\n RaainDetailsComponent.MapCountToDateValue\n ),\n },\n {\n label: 'Rainy Sum',\n style: 'line',\n values: hourCounts.rainySum.map(RaainDetailsComponent.MapCountToDateValue),\n },\n ];\n } else {\n const counts = await this.profileService.getCounts(this.rainNode.id, {\n range,\n periodBegin: focusDate,\n });\n\n data = [\n {\n label: '% Rainy',\n style: 'bar',\n values: counts.percentRainy.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Images',\n style: 'bar',\n values: counts.percentImages.map(RaainDetailsComponent.MapCountToDateValue),\n },\n {\n label: '% Computations',\n style: 'bar',\n values: counts.percentComputations.map(\n RaainDetailsComponent.MapCountToDateValue\n ),\n },\n ];\n }\n\n // console.log(`fetchData DONE ${range}`, data);\n return data;\n }\n\n // Wrapper function that preserves the async nature of fetchData\n public fetchDataWrapper = async (focusDate: Date, focusRange: DateRange) => {\n return await this.fetchData(focusDate, focusRange);\n };\n\n public ngOnChanges(changes: SimpleChanges): void {\n this.change(changes).then((ignored) => {});\n }\n\n ngOnDestroy() {\n this.cleanAll();\n }\n\n async onEnableCountHistoryTab(rain: RainNode) {\n if (!this.toggleHistory) {\n this.countPoints = [];\n }\n }\n\n async onPeriodBeginChange(event: any) {\n const newValue = event?.target?.value ?? this.periodBeginAsString;\n this.periodBegin = new Date(newValue);\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.storage.set('raain-periodBegin', this.periodBegin);\n\n await this.onPeriodDurationChange(event);\n }\n\n async onPeriodEndChange(event: any) {\n const newValue = event?.target?.value ?? this.periodEndAsString;\n this.periodEnd = new Date(newValue);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n this.storage.set('raain-periodEnd', this.periodEnd);\n\n this.periodBegin = new Date(\n this.periodEnd.getTime() - this.getDurationInHours() * RaainDetailsComponent.HOUR_MS\n );\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.storage.set('raain-periodBegin', this.periodBegin);\n this.updateRefreshManagerPeriod();\n }\n\n async onPeriodDurationChange(_event: object) {\n const durationInHours = this.getDurationInHours();\n this.periodEnd = new Date(\n this.periodBegin.getTime() + durationInHours * RaainDetailsComponent.HOUR_MS\n );\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n this.storage.set('raain-periodEnd', this.periodEnd);\n this.storage.set('raain-periodDurationInHours', durationInHours);\n this.updateRefreshManagerPeriod();\n this.updateCumulativeDurationInMinutes();\n }\n\n async onDateChangeInCount(dateChanged: Date) {\n const dateString =\n dateChanged.toISOString().substring(0, 11) +\n dateChanged.toLocaleTimeString().substring(0, 5);\n this.periodDurationAsString = '1';\n\n if (this.toggleCumulative) {\n // Cumulative: select periodEnd\n this.periodEndAsString = dateString;\n await this.onPeriodEndChange(null);\n } else {\n // Granular: select periodBegin\n this.periodBeginAsString = dateString;\n await this.onPeriodBeginChange(null);\n }\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n async onDateChangeInMap(dateShown: Date) {\n this.dateShown = dateShown;\n await this.fetchAndUpdateMap();\n await this.refreshManager.setReportPeriod(this.dateShown);\n }\n\n async onSumChangeInMap(sum: string) {\n this.sumDetails = sum;\n }\n\n async onGaugeSelectInMap(mapLatLng: MapLatLng) {\n const gaugesFiltered = this.compareManager.gaugesInMap.filter(\n (g) => g.lat === mapLatLng.lat && g.lng === mapLatLng.lng\n );\n if (gaugesFiltered.length !== 1) {\n return;\n }\n const gaugeSelected = gaugesFiltered[0];\n\n await this.refreshGaugeValues({id: gaugeSelected.id, name: gaugeSelected.name});\n\n await this.compareManager.selectGauge(gaugeSelected.id, 0);\n }\n\n async refreshGaugeValues(gaugeSelected: {id: string; name: string}) {\n const gaugeValueShowBegin = new Date(\n this.periodBegin.getTime() - RaainDetailsComponent.DAY_MS\n );\n const gaugeValueShowEnd = new Date(this.periodEnd.getTime() + RaainDetailsComponent.DAY_MS);\n gaugeValueShowBegin.setHours(0, 0);\n gaugeValueShowEnd.setHours(23, 59);\n\n const gaugeMeasures = await this.profileService.getGaugeMeasures(\n gaugeSelected.id,\n gaugeValueShowBegin,\n gaugeValueShowEnd\n );\n const gaugeValues: {date: Date; value: number}[] = gaugeMeasures.map((gm) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cartesianMeasureValue = new CartesianMeasureValue(gm.values[0] as any);\n return {\n date: gm.date,\n value: cartesianMeasureValue.getCartesianValues()[0].value,\n };\n });\n this.gaugeSelectedPoints = [\n {\n label: gaugeSelected.name,\n style: 'bar',\n values: gaugeValues,\n },\n ];\n this.cdr.markForCheck();\n }\n\n async onGaugeSelectInCompare(e: {point: XYType; compareIndex: number}) {\n await this.refreshGaugeValues({id: e.point.id, name: e.point.name});\n\n await this.compareManager.selectGauge(e.point.id, e.compareIndex);\n }\n\n async onToggleMap($event: Event) {\n // if (this.toggleMap) {\n // await this.refreshMap();\n // }\n }\n\n onTogglePixelMarkers() {\n // Toggle is bound to showPixelMarkers, raain-map handles marker display\n }\n\n async onCumulativeToggleClick($event: Event) {\n console.log('[CumulativeToggle] click event', {\n currentValue: this.toggleCumulative,\n eventType: $event.type,\n target: ($event.target as HTMLElement)?.tagName,\n });\n\n $event.preventDefault();\n $event.stopPropagation();\n\n if (!this.toggleCumulative) {\n console.log('[CumulativeToggle] showing popup, toggle stays OFF');\n // Currently OFF, user wants to enable - show selector popup\n this.showCumulativeSelector = true;\n\n // Force reset the toggle visual state after ion-toggle's internal handler\n setTimeout(() => {\n if (this.cumulativeToggleRef) {\n this.cumulativeToggleRef.checked = false;\n console.log('[CumulativeToggle] force reset toggle to OFF');\n }\n }, 0);\n\n this.cdr.markForCheck();\n } else {\n console.log('[CumulativeToggle] turning OFF');\n // Currently ON, user wants to disable - direct toggle off\n this.toggleCumulative = false;\n this.storage.set('raain-toggleCumulative', false);\n this.dateShown = this.getDateBasedOnCumulativeMode(this.timeframeDates);\n this.updateCumulativeDurationInMinutes();\n if (this.toggleMap) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n this.cdr.markForCheck();\n }\n console.log('[CumulativeToggle] after handler, toggleCumulative =', this.toggleCumulative);\n }\n\n async onCumulativePeriodSelected(selection: CumulativeSelection) {\n this.showCumulativeSelector = false;\n\n // Update period to match selection\n this.periodBegin = selection.periodBegin;\n this.periodEnd = selection.periodEnd;\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n\n // Calculate duration in hours\n const durationMs = this.periodEnd.getTime() - this.periodBegin.getTime();\n const durationHours = durationMs / RaainDetailsComponent.HOUR_MS;\n this.periodDurationAsString = String(durationHours);\n\n // Store cumulative period\n this.storage.set('raain-periodBegin', this.periodBegin);\n this.storage.set('raain-periodEnd', this.periodEnd);\n this.storage.set('raain-periodDurationInHours', durationHours);\n\n // Enable cumulative mode\n this.toggleCumulative = true;\n this.storage.set('raain-toggleCumulative', true);\n\n this.dateShown = this.getDateBasedOnCumulativeMode(this.timeframeDates);\n this.updateCumulativeDurationInMinutes();\n\n // Refresh map\n if (this.toggleMap) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n this.cdr.markForCheck();\n }\n\n onCumulativeSelectorCancelled() {\n console.log('[CumulativeToggle] cancelled, toggleCumulative =', this.toggleCumulative);\n this.showCumulativeSelector = false;\n this.cdr.markForCheck();\n }\n\n updateCumulativeDurationInMinutes() {\n if (this.toggleCumulative) {\n // Cumulative mode: use period duration\n this.cumulativeDurationInMinutes = parseFloat(this.periodDurationAsString) * 60;\n } else {\n // Granular mode: use selectedTimeStep\n this.cumulativeDurationInMinutes = this.selectedTimeStep || 10;\n }\n }\n\n async onProviderChanged($event: Event) {\n this.selectedProvider = ($event as CustomEvent)?.detail?.value;\n this.storage.set('raain-selectedProvider', this.selectedProvider);\n await this.applyRefreshManagerSettings();\n }\n\n async onTimeStepChanged($event: Event) {\n const raw: string = ($event as CustomEvent)?.detail?.value;\n const [mode, stepStr] = raw.split(':');\n this.timeStepMode = mode as 'eq' | 'lte';\n this.selectedTimeStep = parseInt(stepStr, 10);\n this.storage.set('raain-selectedTimeStep', this.selectedTimeStep);\n this.storage.set('raain-timeStepMode', this.timeStepMode);\n this.updateCumulativeDurationInMinutes();\n await this.applyRefreshManagerSettings();\n }\n\n async loadProviders() {\n if (!this.rainNode?.id) {\n return;\n }\n\n try {\n const result = await this.profileService.getProviders(this.rainNode.id);\n this.availableProviders = result.providers.sort();\n this.availableTimeSteps = result.timeStepInMinutes.sort((a, b) => a - b);\n\n // Load saved selections or use defaults\n this.selectedProvider =\n this.storage.get('raain-selectedProvider') ||\n (this.availableProviders.length > 0 ? this.availableProviders[0] : 'Raain');\n this.selectedTimeStep =\n this.storage.get('raain-selectedTimeStep') ||\n (this.availableTimeSteps.length > 0 ? this.availableTimeSteps[0] : 10);\n this.timeStepMode = this.storage.get('raain-timeStepMode') || 'eq';\n } catch (e) {\n // Set fallback values\n this.availableProviders = ['Raain'];\n this.availableTimeSteps = [5, 10, 15, 30, 60];\n this.selectedProvider = 'Raain';\n this.selectedTimeStep = 10;\n this.timeStepMode = 'eq';\n }\n // Override timeStep if forced\n if (this.forceTimeStep) {\n this.selectedTimeStep = this.forceTimeStep;\n }\n\n this.buildTimeStepOptions();\n\n // Set provider and timeStep on refreshManager\n if (this.refreshManager) {\n this.refreshManager.provider = this.selectedProvider;\n this.refreshManager.timeStepInMinutes = this.selectedTimeStep;\n this.refreshManager.timeStepMode = this.timeStepMode;\n }\n this.cdr.markForCheck();\n }\n\n private buildTimeStepOptions() {\n this.availableTimeStepOptions = [];\n for (const step of this.availableTimeSteps) {\n this.availableTimeStepOptions.push({label: `= ${step} min`, value: `eq:${step}`});\n this.availableTimeStepOptions.push({label: `≤ ${step} min`, value: `lte:${step}`});\n }\n }\n\n onChangeDetectionTest(rainNode: RainNode) {\n console.log(TEST_DETECTION++, 'onChangeDetectionTest');\n return '';\n }\n\n updateTruncatedError() {\n const error = this.refreshManager?.lastError || '';\n if (error.length <= 80) {\n this.truncatedError = error;\n return;\n }\n this.truncatedError = error.substring(0, 80) + '...';\n }\n\n updateCachedValues() {\n this.updatePercentOfImages();\n this.updatePercentOfComputations();\n this.updateTruncatedError();\n this.updateCumulativeDurationInMinutes();\n }\n\n async refreshMap() {\n this.gaugeSelectedPoints = [];\n this.dateShown = this.getDateBasedOnCumulativeMode();\n this.borders = [];\n\n this.compareManager.cleanAll();\n await this.compareManager.setGaugesInMap();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n this.cdr.markForCheck();\n }\n\n async triggerCumulativeCreation() {\n if (this.creatingCumulative) {\n return;\n }\n this.creatingCumulative = true;\n this.cdr.markForCheck();\n\n try {\n await this.profileService.createCumulativePeriod(this.rainNode.id, {\n periodBegin: this.periodBegin,\n periodEnd: this.periodEnd,\n provider: this.selectedProvider,\n timeStepInMinutes: this.selectedTimeStep,\n });\n\n const success = await this.pollForCumulativeCompletion();\n\n if (success) {\n await this.refreshMap();\n } else {\n console.error('triggerCumulativeCreation: timeout waiting for computation');\n }\n } catch (e) {\n console.error('triggerCumulativeCreation error:', e);\n }\n\n this.creatingCumulative = false;\n this.cdr.markForCheck();\n }\n\n async setPeriodOfNow() {\n const last30mn = new Date();\n last30mn.setMinutes(last30mn.getMinutes() - 30);\n this.periodBeginAsString =\n last30mn.toISOString().substring(0, 11) + last30mn.toLocaleTimeString().substring(0, 5);\n this.periodDurationAsString = '1';\n await this.onPeriodBeginChange(null);\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n updatePercentOfImages() {\n if (!this.countsPeriod?.percentImages?.length) {\n this.percentOfImages = 0;\n return;\n }\n\n const duringPeriod = this.countsPeriod.percentImages.filter(\n (a) =>\n this.periodBegin.getTime() <= new Date(a.name).getTime() &&\n new Date(a.name).getTime() <= this.periodEnd.getTime()\n );\n const summed = duringPeriod.reduce((a, b) => a + (b.x ?? 0), 0);\n this.percentOfImages = Math.round(summed / duringPeriod.length);\n }\n\n updatePercentOfComputations() {\n const expectedCount = this.refreshManager?.getExpectedTimelineCount();\n if (!expectedCount) {\n this.percentOfComputations = 0;\n this.presentComputationCount = 0;\n this.expectedComputationCount = 0;\n return;\n }\n\n const presentCount = this.refreshManager?.getPresentTimelineCount() || 0;\n this.presentComputationCount = presentCount;\n this.expectedComputationCount = expectedCount;\n this.percentOfComputations = Math.round((presentCount / expectedCount) * 100);\n }\n\n private async pollForCumulativeCompletion(): Promise<boolean> {\n const POLL_TIMEOUT_MS = 900000;\n const POLL_INTERVAL_MS = 3000;\n const startTime = Date.now();\n const windowInMinutes = Math.round(\n (this.periodEnd.getTime() - this.periodBegin.getTime()) / 60000\n );\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n try {\n const progress = await this.profileService.getRainProgress(this.rainNode.id);\n\n if (progress === 0) {\n // Trigger background fetch from raain-ground via timeframeCumulative\n await this.profileService.getRainTimeframe(\n this.rainNode.id,\n this.periodBegin,\n this.periodEnd,\n this.toggleAdmin,\n this.selectedProvider,\n this.selectedTimeStep,\n windowInMinutes\n );\n\n // Verify cumulative actually exists\n const response = (await this.profileService.getCumulativePeriods(\n this.rainNode.id,\n {\n provider: this.selectedProvider,\n windowInMinutes,\n forced: this.toggleAdmin,\n }\n )) as RaainApiRainsCumulativesListResponse;\n\n const found = response.periods.find(\n (p) => p.windowInMinutes === windowInMinutes\n );\n\n if (found) {\n return true;\n }\n }\n\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n } catch (e) {\n console.warn('Poll error:', e);\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n }\n }\n\n return false;\n }\n\n private getDateBasedOnCumulativeMode(fallbackDates?: Date[]): Date {\n if (fallbackDates?.length > 0) {\n const dateExists = fallbackDates.some((d) => d.getTime() === this.dateShown?.getTime());\n if (!dateExists) {\n return this.toggleCumulative\n ? fallbackDates[fallbackDates.length - 1]\n : fallbackDates[0];\n }\n }\n return this.toggleCumulative ? this.periodEnd : this.periodBegin;\n }\n\n private getCumulativeHours(): number {\n return this.toggleCumulative ? parseFloat(this.periodDurationAsString) : 0;\n }\n\n private getDurationInHours(): number {\n return parseFloat(this.periodDurationAsString);\n }\n\n private updateRefreshManagerPeriod() {\n this.refreshManager.cumulative = this.toggleCumulative;\n\n // Align dates to 5-minute boundaries (floor) for consistency with raain-ground\n const alignTo5minFloor = (date: Date): Date => {\n const minutes = date.getMinutes();\n const alignedMinutes = Math.floor(minutes / 5) * 5;\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n alignedMinutes,\n 0,\n 0\n );\n };\n\n this.refreshManager.period = {\n begin: alignTo5minFloor(this.periodBegin),\n end: alignTo5minFloor(this.periodEnd),\n };\n }\n\n private async fetchAndUpdateMap() {\n await this.refreshManager.fetch(\n this.dateShown,\n this.toggleGaugeMeasures,\n this.getCumulativeHours()\n );\n this.currentTimeframeTarget = this.refreshManager.getTimelineSelectedFrameSet();\n this.cdr.markForCheck();\n }\n\n private async applyRefreshManagerSettings() {\n if (!this.refreshManager) {\n return;\n }\n this.refreshManager.provider = this.selectedProvider;\n this.refreshManager.timeStepInMinutes = this.selectedTimeStep;\n this.refreshManager.timeStepMode = this.timeStepMode;\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n\n private cleanAll() {\n this.borders = [];\n this.isAdmin = false;\n this.timeframeContainers = new TimeframeContainers([]);\n this.currentTimeframeTarget = null;\n this.timeframeDates = [];\n this.countPoints = [];\n this.countsPeriod = {progress: 0, queueRunning: 0, percentImages: []};\n this.gaugeSelectedPoints = [];\n\n this.toggleHistory = false;\n this.toggleMap = true;\n this.toggleCompare = false;\n this.toggleGaugeMeasures = false;\n this.toggleRemoveCompareDuplicate = true;\n this.toggleCumulative = this.showCumulativeToggle\n ? this.storage.get('raain-toggleCumulative')\n : false;\n\n this.periodBegin = new Date(this.storage.get('raain-periodBegin'));\n this.periodEnd = new Date(this.storage.get('raain-periodEnd'));\n this.periodBeginAsString = RaainDetailsComponent.PeriodDisplay(this.periodBegin);\n this.periodEndAsString = RaainDetailsComponent.PeriodDisplay(this.periodEnd);\n const durationMs = this.periodEnd.getTime() - this.periodBegin.getTime();\n this.periodDurationAsString = '' + durationMs / RaainDetailsComponent.HOUR_MS;\n\n this.dateShown = this.getDateBasedOnCumulativeMode();\n this.refreshInProgress = false;\n this.showFullError = false;\n this.showQualityModal = false;\n this.qualityIndicators = [];\n this.qualityIndicatorsLoading = false;\n\n this.compareManager?.cleanAll();\n this.refreshManager?.cleanAll();\n }\n\n private async init() {\n this.cleanAll();\n this.updateCachedValues();\n await this.initRain();\n this.cdr.markForCheck();\n }\n\n private async initRain() {\n if (!this.rainNode) {\n return;\n }\n\n this.isAdmin = this.profileService.isAdmin();\n\n this.refreshManager.rainNode = this.rainNode;\n this.compareManager.rainNode = this.rainNode;\n\n // Load providers and set on refreshManager\n await this.loadProviders();\n\n this.refreshManager.setMethods(\n this.onRefreshInProgress.bind(this),\n this.onRefreshDone.bind(this),\n this.onFetchDone.bind(this)\n );\n\n const center = this.rainNode.getCenter();\n this.coordinates = new MapLatLng(center.lat, center.lng);\n this.teamNode = await this.profileService.getTeam(\n this.rainNode.getLink(TeamNode.TYPE).getId()\n );\n\n // Load all gauges linked to the rainNode on map\n await this.compareManager.setGaugesInMap();\n\n if (this.periodBegin && this.periodEnd) {\n this.updateRefreshManagerPeriod();\n await this.refreshManager.refresh(false, this.toggleAdmin);\n }\n }\n\n private async onRefreshInProgress(\n countPeriods: {\n percentImages?: XYType[];\n queueRunning?: number;\n progress?: number;\n },\n timeframeDates: Date[]\n ) {\n this.refreshInProgress = true;\n this.countsPeriod = countPeriods;\n this.timeframeDates = timeframeDates;\n this.updateCachedValues();\n this.cdr.markForCheck();\n }\n\n private async onRefreshDone(timeframeDates: Date[]) {\n this.timeframeDates = timeframeDates;\n this.refreshInProgress = false;\n this.updateCachedValues();\n this.cdr.markForCheck();\n\n if (this.toggleMap && timeframeDates.length > 0) {\n this.dateShown = this.getDateBasedOnCumulativeMode(timeframeDates);\n if (this.dateShown) {\n await this.fetchAndUpdateMap();\n }\n }\n }\n\n private async onFetchDone(timeframeContainers?: TimeframeContainers) {\n if (timeframeContainers) {\n this.timeframeContainers = timeframeContainers;\n }\n this.cdr.markForCheck();\n }\n\n private async change(_changes: SimpleChanges) {\n await this.init();\n }\n}\n","<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n\n <ion-button (click)=\"toggleHistory = !toggleHistory; onEnableCountHistoryTab(rainNode)\"\n fill=\"outline\">\n <ion-icon name=\"calendar-clear-outline\" slot=\"start\"></ion-icon>\n <ion-icon [name]=\"toggleHistory ? 'chevron-down' : 'chevron-forward'\" slot=\"end\"></ion-icon>\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <input (change)=\"onPeriodBeginChange($event)\"\n [disabled]=\"toggleCumulative\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n [disabled]=\"toggleCumulative\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option value=\"8\">8 hours</ion-select-option>\n <ion-select-option value=\"10\">10 hours</ion-select-option>\n <ion-select-option value=\"12\">12 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div class=\"period-start ion-hide-md-down\">\n <input (change)=\"onPeriodEndChange($event)\"\n [disabled]=\"toggleCumulative\"\n [value]=\"periodEndAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div *ngIf=\"showCumulativeToggle\" (click)=\"onCumulativeToggleClick($event)\" class=\"toggle-cumulative\">\n <ion-label [class.text-primary]=\"toggleCumulative\">\n {{ toggleCumulative ? 'Cumulative' : 'Granular' }}\n </ion-label>\n <ion-toggle #cumulativeToggle [checked]=\"toggleCumulative\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection (uncomment to debug)\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n -->\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Map performance -->\n <ion-grid class=\"map-performance\">\n <ion-row id=\"progressAndRefresh\">\n <ion-col class=\"provider-selection\" size=\"12\" size-md=\"6\">\n <ion-button (click)=\"openQualityModal()\" class=\"quality-info-button\" fill=\"clear\">\n {{ refreshManager.rainComputationMapVersion }}\n <ion-icon name=\"help-circle-outline\" slot=\"end\"></ion-icon>\n </ion-button>\n <div *ngIf=\"availableProviders.length > 0 || availableTimeSteps.length > 0\" class=\"selection-row\">\n <ion-select (ionChange)=\"onProviderChanged($event)\"\n [value]=\"selectedProvider\"\n interface=\"popover\"\n label=\"Provider\"\n placeholder=\"Select Provider\">\n <ion-select-option *ngFor=\"let provider of availableProviders\" [value]=\"provider\">\n {{ provider }}\n </ion-select-option>\n </ion-select>\n\n <ion-select (ionChange)=\"onTimeStepChanged($event)\"\n [disabled]=\"forceTimeStep\"\n [value]=\"timeStepMode + ':' + selectedTimeStep\"\n interface=\"popover\"\n label=\"Time Step\"\n placeholder=\"Select Time Step\">\n <ion-select-option *ngFor=\"let opt of availableTimeStepOptions\" [value]=\"opt.value\">\n {{ opt.label }}\n </ion-select-option>\n </ion-select>\n\n <span class=\"computation-count\">\n {{ presentComputationCount }}/{{ expectedComputationCount }}\n <ion-button (click)=\"triggerCumulativeCreation()\"\n *ngIf=\"showCreateMissingImages\"\n [disabled]=\"creatingCumulative\" fill=\"clear\" color=\"medium\"\n id=\"createMissingImages\"\n size=\"small\">\n <ion-icon *ngIf=\"!creatingCumulative\" name=\"refresh-outline\"\n slot=\"icon-only\"></ion-icon>\n <ion-spinner *ngIf=\"creatingCumulative\" name=\"crescent\"\n slot=\"icon-only\"></ion-spinner>\n </ion-button>\n <i *ngIf=\"countsPeriod?.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n </div>\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n </ion-row>\n\n <!-- status update row -->\n <ion-row>\n <!-- Progress col -->\n <ion-progress-bar\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [style.visibility]=\"refreshInProgress ? 'visible' : 'hidden'\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n\n <!-- Error col -->\n <ion-col (click)=\"showFullError = !showFullError\" *ngIf=\"refreshManager.lastError\" class=\"error-row\"\n size=\"12\">\n <div class=\"error-content\">\n <ion-icon class=\"error-icon\" name=\"warning-outline\"></ion-icon>\n <span [class.expanded]=\"showFullError\" class=\"error-text\">\n {{ showFullError ? refreshManager.lastError : truncatedError }}\n </span>\n <ion-icon [name]=\"showFullError ? 'chevron-up' : 'chevron-down'\" class=\"error-caret\"></ion-icon>\n </div>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row *ngIf=\"toggleMap && (percentOfImages || percentOfComputations)\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\" size-md=\"12\">\n <div class=\"map-container\">\n <raain-map #raainMapRef\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [cumulativeDurationInMinutes]=\"cumulativeDurationInMinutes\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [scaleLabel]=\"toggleCumulative ? 'mm' : scaleLabel\"\n [showNavigation]=\"!toggleCumulative\"\n [showDateRange]=\"showDateRange\"\n [showVisiblePixelMarkers]=\"showPixelMarkers\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n <ion-toggle\n (ionChange)=\"onTogglePixelMarkers()\"\n [(ngModel)]=\"showPixelMarkers\"\n style=\"margin-left: 8px; transform: scale(0.7);\">\n </ion-toggle>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col *ngIf=\"!!compareManager.compareVersion && (!toggleCumulative || showCumulativeCompare)\"\n class=\"data-column\" size-lg=\"5\" size-md=\"12\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n <!-- Quality Performance Modal -->\n <div (click)=\"closeQualityModal()\" *ngIf=\"showQualityModal\" class=\"quality-modal-overlay\">\n <div (click)=\"$event.stopPropagation()\" class=\"quality-modal-content\">\n <div class=\"quality-modal-header\">\n <h2>Model Quality Performance</h2>\n <ion-button (click)=\"closeQualityModal()\" fill=\"clear\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </div>\n <div class=\"quality-modal-body\">\n <div *ngIf=\"qualityIndicatorsLoading\" class=\"quality-loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <span>Loading indicators...</span>\n </div>\n <div *ngIf=\"!qualityIndicatorsLoading && qualityIndicators.length === 0\" class=\"quality-empty\">\n No quality indicators available for this year.\n </div>\n\n <!-- Performance Chart -->\n <div *ngIf=\"!qualityIndicatorsLoading && modelPerformanceData.length > 0\" class=\"performance-chart-container\">\n <canvas #performanceCanvas></canvas>\n </div>\n\n <!-- Details Accordion -->\n <div *ngIf=\"!qualityIndicatorsLoading && qualityIndicators.length > 0\" class=\"quality-details-section\">\n <div (click)=\"showQualityDetails = !showQualityDetails\" class=\"quality-details-toggle\">\n <span>Details</span>\n <ion-icon [name]=\"showQualityDetails ? 'chevron-up' : 'chevron-down'\"></ion-icon>\n </div>\n <table *ngIf=\"showQualityDetails\" class=\"quality-table\">\n <thead>\n <tr>\n <th>Model</th>\n <th>Compare</th>\n <th>Gauges</th>\n <th>Period</th>\n <th>Avg Quality</th>\n <th>Updated</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let indicator of qualityIndicators\">\n <td>{{ indicator.computingVersion }}</td>\n <td>{{ indicator.qualityVersion }}</td>\n <td>{{ indicator.provider }}<br>{{ indicator.timeStepInMinutes }} min</td>\n <td>{{ formatDate(indicator.startDate) }}<br>{{ formatDate(indicator.endDate) }}</td>\n <td>{{ indicator.averageQuality | number:'1.2-2' }}</td>\n <td>{{ formatDate(indicator.lastUpdatedAt) }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Cumulative Selector Modal -->\n <cumulative-selector (cancelled)=\"onCumulativeSelectorCancelled()\"\n (periodSelected)=\"onCumulativePeriodSelected($event)\"\n *ngIf=\"showCumulativeSelector\"\n [currentPeriodBegin]=\"periodBegin\"\n [currentPeriodEnd]=\"periodEnd\"\n [isAdmin]=\"toggleAdmin\"\n [provider]=\"selectedProvider\"\n [rainId]=\"rainNode?.id\"\n [timeStepInMinutes]=\"selectedTimeStep\">\n </cumulative-selector>\n\n</div>\n","import {Injectable} from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class Cache {\n private readonly _cache: Record<string, unknown>;\n\n constructor() {\n this._cache = {};\n }\n\n public async getValue<T>(key: string, asyncGetter: () => Promise<T>): Promise<T> {\n if (!Object.prototype.hasOwnProperty.call(this._cache, key)) {\n console.log('cache not done: ', key);\n this.putValue(key, await asyncGetter());\n } else {\n console.log('cache done: ', key);\n }\n return this._cache[key] as T;\n }\n\n public putValue<T>(key: string, value: T): void {\n this._cache[key] = value;\n\n const length = Object.getOwnPropertyNames(this._cache).length;\n if (length > 30) {\n console.warn('Pb on cache size exceed ? do a restart ?', length);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {\n MeasureValuePolarContainer,\n RadarPolarMeasureValue,\n RainNode,\n RainPolarMeasureValue,\n} from 'raain-model';\nimport {PolarMapValue} from 'raain-ui';\nimport {ProfileService} from './profile.service';\nimport {FrameSet} from './tools';\n\n@Injectable()\nexport class RadarService {\n constructor(private profileService: ProfileService) {}\n\n static getGeoValuesFromRainMeasures(\n measureValue: RainPolarMeasureValue,\n rain: RainNode\n ): PolarMapValue[] {\n return this.computeValues(measureValue.getPolars(), rain);\n }\n\n static getGeoValuesFromRadarMeasures(\n measureValue: RadarPolarMeasureValue,\n rain: RainNode\n ): PolarMapValue[] {\n return this.computeValues(measureValue.getPolars(), rain);\n }\n\n private static computeValues(polarMeasureValues: MeasureValuePolarContainer[], rain: RainNode) {\n const values: PolarMapValue[] = [];\n polarMeasureValues.forEach((p) => {\n const azimuth = p.azimuth;\n let distance = 0;\n const polarEdges = p.polarEdges;\n polarEdges.forEach((e) => {\n const pmv = new PolarMapValue(e, azimuth, distance);\n values.push(pmv);\n distance += p.distance;\n });\n });\n\n return values;\n }\n\n async getTimeline(rainNode: RainNode): Promise<FrameSet[]> {\n const timeline: FrameSet[] = [];\n const links = rainNode?.getLinks() ?? [];\n\n for (const link of links) {\n const cumulativeIndex = link.href.indexOf('cumulatives/');\n if (cumulativeIndex >= 0) {\n const start = cumulativeIndex + 'cumulatives/'.length;\n const str1 = link.href.substring(start);\n if (str1) {\n const splitted = str1.split('/');\n const frameDate = new Date(splitted[0]);\n const version = splitted[1];\n const rainComputationCumulativeId = splitted[2];\n const existingTargets = timeline.filter(\n (t) => t.date.getTime() === frameDate.getTime()\n );\n if (existingTargets.length) {\n existingTargets[0].rainComputationCumulativeId =\n rainComputationCumulativeId;\n } else {\n timeline.push(\n new FrameSet(frameDate, [], null, null, [], rainComputationCumulativeId)\n );\n }\n }\n }\n }\n\n return timeline;\n }\n}\n","export const CONSTANTS = {\n _RAIN_STATUS_0_NOT_STARTED: 0,\n _RAIN_STATUS_0_WAIT_FOR_INTERNAL_VALIDATION: 0.3,\n _RAIN_STATUS_1_READY_TO_COMPUTE: 0.6,\n _RAIN_STATUS_1_READY: 1,\n\n _INPUT_VALIDITY_NOT_CHECKED_YET: -1,\n _INPUT_VALIDITY_CHECK_IN_PROGRESS: -0.5,\n _INPUT_VALIDITY_NOT_VALID: 0,\n _INPUT_VALIDITY_NOT_CONFIDENT: 0.5,\n _INPUT_VALIDITY_VALID: 1,\n};\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {EventNode, RainNode} from 'raain-model';\nimport {CONSTANTS} from './shared.const';\n\n@Pipe({name: 'areStopped'})\nexport class AreStopped implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter((rain) => rain.status <= CONSTANTS._RAIN_STATUS_0_NOT_STARTED);\n }\n}\n\n@Pipe({name: 'areInProgress'})\nexport class AreInProgressPipe implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter(\n (rain) =>\n CONSTANTS._RAIN_STATUS_0_NOT_STARTED < rain.status &&\n rain.status < CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE\n );\n }\n}\n\n@Pipe({name: 'areReady'})\nexport class AreReady implements PipeTransform {\n transform(rains: RainNode[]): RainNode[] {\n return rains.filter(\n (rain) =>\n rain.status >= CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE &&\n rain.quality > CONSTANTS._INPUT_VALIDITY_NOT_CONFIDENT\n );\n }\n}\n\n@Pipe({name: 'isReady'})\nexport class IsReady implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status >= CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'isNotReady'})\nexport class IsNotReady implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status < CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'waitForValidation'})\nexport class WaitForValidation implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.status === CONSTANTS._RAIN_STATUS_1_READY_TO_COMPUTE) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'hasGoodQuality'})\nexport class HasGoodQuality implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.quality > CONSTANTS._INPUT_VALIDITY_NOT_CONFIDENT) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'hasNotGoodQuality'})\nexport class HasNotGoodQuality implements PipeTransform {\n transform(rain: RainNode): RainNode {\n if (rain.quality < CONSTANTS._INPUT_VALIDITY_VALID) {\n return rain;\n }\n return null;\n }\n}\n\n@Pipe({name: 'progressValue'})\nexport class ProgressValue implements PipeTransform {\n transform(rain: RainNode): number {\n if (rain.status < 0) {\n return 0;\n } else if (rain.status > 1) {\n return 1;\n }\n return rain.status;\n }\n}\n\n@Pipe({name: 'progressBuffer'})\nexport class ProgressBuffer implements PipeTransform {\n transform(rain: RainNode): number {\n if (rain.quality < 0) {\n return 0;\n } else if (rain.quality > 1) {\n return 1;\n }\n return rain.quality;\n }\n}\n\n@Pipe({\n name: 'haveNotBeenRed',\n pure: false,\n})\nexport class HaveNotBeenRed implements PipeTransform {\n transform(events: EventNode[]): EventNode[] {\n return events.filter((event) => !event.red);\n }\n}\n","import {Directive, ElementRef, OnDestroy, OnInit} from '@angular/core';\nimport {ProfileService} from './profile.service';\nimport {Router} from '@angular/router';\n\n// Helper function to pause execution for a specified time in milliseconds\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n@Directive({\n selector: 'ion-toolbar',\n})\nexport class ProfileIconDirective implements OnInit, OnDestroy {\n private refreshTimer: any;\n private profileButton: HTMLElement;\n private isConnected: boolean = true;\n\n constructor(\n private el: ElementRef,\n private profileService: ProfileService,\n private router: Router\n ) {}\n\n ngOnInit() {\n // Check if the user is logged in and if the toolbar is not inside a modal\n if (this.profileService.isLoggedIn() && !this.isInsideModal()) {\n // Get the email from the profile service\n const email = this.profileService.getEmail();\n\n // Create the profile button element\n const profileButtons = document.createElement('ion-buttons');\n profileButtons.setAttribute('slot', 'primary');\n\n // Create the button\n const button = document.createElement('ion-button');\n\n // Store references for later use\n this.profileButton = button;\n\n // Create the icon\n const icon = document.createElement('ion-icon');\n icon.setAttribute('name', 'person-circle-outline');\n icon.setAttribute('slot', 'start');\n\n // Create the label\n const label = document.createElement('ion-label');\n label.textContent = email;\n\n // Assemble the button\n button.appendChild(icon);\n button.appendChild(label);\n\n // Add click event listener to the button\n button.addEventListener('click', () => {\n this.navigateToProfile();\n });\n\n // Assemble the buttons container\n profileButtons.appendChild(button);\n\n // Append the buttons to the toolbar\n this.el.nativeElement.appendChild(profileButtons);\n\n // Start the background refresh timer (check every minute)\n this.startBackgroundRefresh();\n }\n }\n\n ngOnDestroy() {\n // Clear the timer when the directive is destroyed\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n navigateToProfile() {\n this.router.navigateByUrl('/profile');\n }\n\n private startBackgroundRefresh() {\n this.refreshTimer = setInterval(() => {\n this.checkAndRefreshConnection();\n }, 20000);\n }\n\n private checkAndRefreshConnection() {\n this.performConnectionRefresh();\n }\n\n private showSkeletonText() {\n if (this.profileButton) {\n this.profileButton.style.opacity = '0.7';\n this.profileButton.style.transition = 'opacity 0.3s ease';\n }\n }\n\n private hideSkeletonText() {\n if (this.profileButton) {\n this.profileButton.style.opacity = '1';\n }\n }\n\n private async performConnectionRefresh() {\n // Show skeleton text and hide button during loading\n this.showSkeletonText();\n\n // Connection successful\n this.isConnected = await this.profileService.isConnected();\n\n if (this.isConnected) {\n // Call the refresh function\n const needsConnectionRefresh = this.profileService.needsConnectionRefresh();\n const isLoggedIn = this.profileService.isLoggedIn();\n if (needsConnectionRefresh || !isLoggedIn) {\n await this.profileService.connectionRefresh();\n }\n await sleep(1000);\n }\n this.updateButtonState();\n\n // Hide skeleton text and show button when loading is complete\n this.hideSkeletonText();\n }\n\n private updateButtonState() {\n if (this.profileButton) {\n if (this.isConnected) {\n // Enable button\n this.profileButton.removeAttribute('disabled');\n this.profileButton.removeAttribute('title');\n } else {\n // Disable button and add tooltip\n this.profileButton.setAttribute('disabled', 'true');\n this.profileButton.setAttribute('title', 'Profile unavailable - No connection');\n }\n }\n }\n\n // Helper method to check if the toolbar is inside a modal\n private isInsideModal(): boolean {\n let parent = this.el.nativeElement.parentElement;\n\n // Traverse up the DOM tree to find if any parent is an ion-modal\n while (parent) {\n if (parent.tagName && parent.tagName.toLowerCase() === 'ion-modal') {\n return true;\n }\n parent = parent.parentElement;\n }\n\n return false;\n }\n}\n","import {NgModule} from '@angular/core';\nimport {\n AreInProgressPipe,\n AreReady,\n AreStopped,\n HasGoodQuality,\n HasNotGoodQuality,\n HaveNotBeenRed,\n IsNotReady,\n IsReady,\n ProgressBuffer,\n ProgressValue,\n WaitForValidation,\n} from './shared.pipe';\n\n@NgModule({\n declarations: [\n AreStopped,\n AreInProgressPipe,\n AreReady,\n IsReady,\n IsNotReady,\n WaitForValidation,\n HasGoodQuality,\n HasNotGoodQuality,\n ProgressValue,\n ProgressBuffer,\n HaveNotBeenRed,\n ],\n exports: [\n AreStopped,\n AreInProgressPipe,\n AreReady,\n IsReady,\n IsNotReady,\n WaitForValidation,\n HasGoodQuality,\n HasNotGoodQuality,\n ProgressValue,\n ProgressBuffer,\n HaveNotBeenRed,\n ],\n})\nexport class PipesModule {}\n","import {CommonModule, NgOptimizedImage, NgStyle} from '@angular/common';\nimport {NgModule, Optional, SkipSelf} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\n\nimport {ProfileService} from './profile.service';\nimport {Storage} from './storage.service';\nimport {RadarService} from './radar.service';\nimport {Cache} from './cache.service';\nimport {ProfileIconDirective} from './profile-icon.directive';\nimport {IonicModule, IonRange} from '@ionic/angular';\nimport {PipesModule} from './pipes.module';\nimport {RaainMapComponent} from './raain-map/raain-map.component';\nimport {RaainCompareComponent} from './raain-compare/raain-compare.component';\nimport {RaainConfigurationComponent} from './raain-configuration/raain-configuration.component';\nimport {RaainDateFocusComponent} from './raain-date-focus/raain-date-focus.component';\nimport {RaainDateDynamicComponent} from './raain-date-dynamic/raain-date-dynamic.component';\nimport {RaainSpeedComponent} from './raain-speed/raain-speed.component';\nimport {RaainCompareStackComponent} from './raain-compare-stack/raain-compare-stack.component';\nimport {RaainGlobeComponent} from './raain-globe/raain-globe.component';\nimport {RaainDetailsComponent} from './raain-details/raain-details.component';\nimport {CumulativeSelectorComponent} from './cumulative-selector/cumulative-selector.component';\n\n@NgModule({\n declarations: [\n RaainMapComponent,\n RaainCompareComponent,\n RaainCompareStackComponent,\n RaainDateFocusComponent,\n RaainDateDynamicComponent,\n RaainConfigurationComponent,\n RaainSpeedComponent,\n RaainGlobeComponent,\n ProfileIconDirective,\n RaainDetailsComponent,\n CumulativeSelectorComponent,\n ],\n imports: [CommonModule, FormsModule, IonicModule, NgOptimizedImage, PipesModule],\n providers: [Storage, RadarService, ProfileService, Cache, IonRange],\n exports: [\n CommonModule,\n NgStyle,\n PipesModule,\n\n RaainMapComponent,\n RaainCompareComponent,\n RaainCompareStackComponent,\n RaainDateFocusComponent,\n RaainDateDynamicComponent,\n RaainConfigurationComponent,\n RaainSpeedComponent,\n RaainGlobeComponent,\n ProfileIconDirective,\n RaainDetailsComponent,\n CumulativeSelectorComponent,\n ],\n})\nexport class SharedModule {\n constructor(@Optional() @SkipSelf() parentModule?: SharedModule) {\n if (parentModule) {\n // throw new Error(\n console.warn('SharedModule is already loaded. Import it in the AppModule only');\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.Storage","i1","i2","i3.RaainCompareComponent","sleep","i3","i4","i1.ProfileService","i5.RaainMapComponent","i6.RaainCompareStackComponent","i7.RaainDateFocusComponent","i8.RaainDateDynamicComponent","i9.CumulativeSelectorComponent"],"mappings":"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"}
|