From f2778131901ee9f7724ef8e1554e2f1f44559bb9 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:41:21 -0800 Subject: [PATCH 01/17] feat(services): add DisplacementDisclaimerService for shared dialog access --- .../displacement-disclaimer.service.ts | 20 ++++++++++++++++++ src/app/services/index.ts | 1 + src/assets/opera-disp-logo.png | Bin 0 -> 53158 bytes 3 files changed, 21 insertions(+) create mode 100644 src/app/services/displacement-disclaimer.service.ts create mode 100644 src/assets/opera-disp-logo.png diff --git a/src/app/services/displacement-disclaimer.service.ts b/src/app/services/displacement-disclaimer.service.ts new file mode 100644 index 000000000..5637611de --- /dev/null +++ b/src/app/services/displacement-disclaimer.service.ts @@ -0,0 +1,20 @@ +import { inject, Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Observable } from 'rxjs'; +import { DispDataDisclaimerComponent } from '@components/results-menu/timeseries-results-menu/timeseries-displacement-disclaimer-dialog.component'; + +@Injectable({ providedIn: 'root' }) +export class DisplacementDisclaimerService { + private dialog = inject(MatDialog); + + open(): Observable { + return this.dialog + .open(DispDataDisclaimerComponent, { + width: '550px', + height: '325px', + maxWidth: '550px', + maxHeight: '500px', + }) + .afterClosed(); + } +} diff --git a/src/app/services/index.ts b/src/app/services/index.ts index f8a99d5da..28be0ca06 100644 --- a/src/app/services/index.ts +++ b/src/app/services/index.ts @@ -43,3 +43,4 @@ export { ExportService } from './export.service'; export { NetcdfService } from './netcdf-service.service'; export { PointHistoryService } from './point-history.service'; export { FrameMapService } from './frame-map.service'; +export { DisplacementDisclaimerService } from './displacement-disclaimer.service'; diff --git a/src/assets/opera-disp-logo.png b/src/assets/opera-disp-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6ea0339b364892b3142fa06b554061a434ac17 GIT binary patch literal 53158 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 FO#p(n(NF*Y literal 0 HcmV?d00001 From 3401a35061c7d6ee1d526aaa894cce9b6e8a92f5 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:43:27 -0800 Subject: [PATCH 02/17] feat(map): add OPERA disclaimer logo to map template --- src/app/components/map/map.component.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/app/components/map/map.component.html b/src/app/components/map/map.component.html index 1c774c48f..7aba476fd 100644 --- a/src/app/components/map/map.component.html +++ b/src/app/components/map/map.component.html @@ -93,6 +93,17 @@ } +@if (breakpoint > breakpoints.MOBILE && searchType === searchTypes.DISPLACEMENT) { + +} + @if (searchType === searchTypes.DATASET) { From 65dac42e98217bfa4c6c8961d5bf7c9dd2d74061 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:46:01 -0800 Subject: [PATCH 03/17] style(map): add OPERA logo positioning and hover effects --- src/app/components/map/map.component.scss | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/app/components/map/map.component.scss b/src/app/components/map/map.component.scss index ed6cb5954..6fac3481e 100644 --- a/src/app/components/map/map.component.scss +++ b/src/app/components/map/map.component.scss @@ -86,6 +86,23 @@ button { right: 10px; } +.opera-logo { + position: fixed; + bottom: 30px; + left: 10px; + width: 110px; + height: auto; + cursor: pointer; + pointer-events: auto; + opacity: 0.85; + transition: opacity 0.2s ease; + z-index: 999; + + &:hover { + opacity: 1; + } +} + .mobile-map-controls { pointer-events: auto; position: fixed; From 747d3b65616b48d23b2384c78d90fca2c847aa29 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:51:35 -0800 Subject: [PATCH 04/17] feat(map): wire up OPERA logo click to open disclaimer dialog --- src/app/components/map/map.component.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app/components/map/map.component.ts b/src/app/components/map/map.component.ts index b30b3d232..f113f20cb 100644 --- a/src/app/components/map/map.component.ts +++ b/src/app/components/map/map.component.ts @@ -31,6 +31,7 @@ import * as sceneStore from '@store/scenes'; import * as models from '@models'; import { CMRProduct, SarviewsEvent } from '@models'; import { + DisplacementDisclaimerService, MapService, PointHistoryService, SarviewsEventsService, @@ -43,6 +44,7 @@ import { StyleLike } from 'ol/style/Style'; import { Feature } from 'ol'; import Geometry from 'ol/geom/Geometry'; import { MatDialog } from '@angular/material/dialog'; +import { MatTooltipModule } from '@angular/material/tooltip'; import WKT from 'ol/format/WKT'; import { getTimeseriesChartStates } from '@store/charts'; import { MatButton, MatFabButton } from '@angular/material/button'; @@ -85,6 +87,7 @@ enum FullscreenControls { AttributionsComponent, AsyncPipe, TranslateModule, + MatTooltipModule, ], }) export class MapComponent implements OnInit, OnDestroy { @@ -96,6 +99,7 @@ export class MapComponent implements OnInit, OnDestroy { private eventMonitoringService = inject(SarviewsEventsService); dialog = inject(MatDialog); private pointHistoryService = inject(PointHistoryService); + private disclaimerService = inject(DisplacementDisclaimerService); @Output() loadUrlState = new EventEmitter(); @ViewChild('overlay', { static: true }) overlayRef: ElementRef; @@ -802,6 +806,10 @@ export class MapComponent implements OnInit, OnDestroy { this.fullscreenControl = FullscreenControls.NONE; } + public onOpenDispDisclaimer(): void { + this.disclaimerService.open(); + } + ngOnDestroy() { this.subs.unsubscribe(); } From 4888f094988c2905c8d20a973249ef17964078c1 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:53:52 -0800 Subject: [PATCH 05/17] refactor(info-bar): remove displacement disclaimer text link --- .../components/header/info-bar/info-bar.component.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/app/components/header/info-bar/info-bar.component.html b/src/app/components/header/info-bar/info-bar.component.html index ffd9f3344..8d0c2b851 100644 --- a/src/app/components/header/info-bar/info-bar.component.html +++ b/src/app/components/header/info-bar/info-bar.component.html @@ -27,14 +27,6 @@ {{ 'PRODUCT_TYPES' | translate }}: {{ eventProductTypes }} } - @if ((searchType$ | async) === searchTypes.DISPLACEMENT) { - - - - } @if (breakpoint > breakpoints.SMALL && !!startDate) { {{ 'START' | translate }}: {{ startDate | shortDate }} From 4e51f989f92ef230075dbd17ba9afdd7d43a064d Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 13:58:20 -0800 Subject: [PATCH 06/17] refactor(info-bar): remove unused disclaimer dialog code Remove the onOpenDispDataDisclaimer method and related imports (MatDialog, DispDataDisclaimerComponent, MatIcon) since the disclaimer functionality has been moved to the OPERA logo in the map component. --- .../header/info-bar/info-bar.component.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/app/components/header/info-bar/info-bar.component.ts b/src/app/components/header/info-bar/info-bar.component.ts index 2e2444c88..450963238 100644 --- a/src/app/components/header/info-bar/info-bar.component.ts +++ b/src/app/components/header/info-bar/info-bar.component.ts @@ -17,9 +17,6 @@ import { CiSearchComponent } from './ci-search/ci-search.component'; import { ShortDatePipe } from '@pipes/short-date.pipe'; import { JoinPipe } from '@pipes/join.pipe'; import { TranslateModule } from '@ngx-translate/core'; -import { DispDataDisclaimerComponent } from '@components/results-menu/timeseries-results-menu/timeseries-displacement-disclaimer-dialog.component'; -import { MatDialog } from '@angular/material/dialog'; -import { MatIcon } from '@angular/material/icon'; // Declare GTM dataLayer array. declare global { @@ -40,14 +37,12 @@ declare global { ShortDatePipe, JoinPipe, TranslateModule, - MatIcon, ], }) export class InfoBarComponent implements OnInit, OnDestroy { private store$ = inject>(Store); private screenSize = inject(services.ScreenSizeService); private hyp3 = inject(services.Hyp3ApiService); - private dialog = inject(MatDialog); public searchType: models.SearchType = models.SearchType.DATASET; public searchTypes = models.SearchType; public searchType$ = this.store$.select(searchStore.getSearchType); @@ -303,15 +298,6 @@ export class InfoBarComponent implements OnInit, OnDestroy { ); } - public onOpenDispDataDisclaimer() { - this.dialog.open(DispDataDisclaimerComponent, { - width: '550px', - height: '325px', - maxWidth: '550px', - maxHeight: '500px', - }); - } - ngOnDestroy() { this.subs.unsubscribe(); } From 6111139995c4fba55d8339c251c07612e932cf90 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 14:04:18 -0800 Subject: [PATCH 07/17] style: fix prettier formatting in map template --- src/app/components/map/map.component.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/components/map/map.component.html b/src/app/components/map/map.component.html index 7aba476fd..3206a785e 100644 --- a/src/app/components/map/map.component.html +++ b/src/app/components/map/map.component.html @@ -93,7 +93,9 @@ } -@if (breakpoint > breakpoints.MOBILE && searchType === searchTypes.DISPLACEMENT) { +@if ( + breakpoint > breakpoints.MOBILE && searchType === searchTypes.DISPLACEMENT +) { Date: Wed, 7 Jan 2026 14:39:41 -0800 Subject: [PATCH 08/17] feat(search-type-selector): add disclaimer link for Displacement search Add subtle italic "Disclaimer" text below the Search Type selector that opens the OPERA data disclaimer dialog. Only visible when Displacement search type is active. --- .../search-type-selector.component.html | 5 +++++ .../search-type-selector.component.scss | 14 ++++++++++++++ .../search-type-selector.component.ts | 11 ++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html index dd1bf0025..5a8d1eb68 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html @@ -24,6 +24,11 @@

+ @if (searchType === searchTypes.DISPLACEMENT) { + + {{ 'DISCLAIMER' | translate }} + + }
diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss index d2f73fd4c..b12505324 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss @@ -242,3 +242,17 @@ transform: translateY(0); } } + +.disclaimer-link { + @include themify($themes) { + color: themed("dark-secondary-text"); + } + + font-size: 14px; + font-style: italic; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +} diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.ts b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.ts index 30c204ea9..d73513a10 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.ts +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.ts @@ -18,7 +18,11 @@ import * as userStore from '@store/user'; import * as models from '@models'; -import { EnvironmentService, ScreenSizeService } from '@services'; +import { + DisplacementDisclaimerService, + EnvironmentService, + ScreenSizeService, +} from '@services'; import { AnalyticsEvent, Breakpoints, derivedDatasets } from '@models'; import { TranslateService, TranslateModule } from '@ngx-translate/core'; import { NgClass, AsyncPipe } from '@angular/common'; @@ -59,6 +63,7 @@ export class SearchTypeSelectorComponent implements OnInit, OnDestroy { translate = inject(TranslateService); private store$ = inject>(Store); private screenSize = inject(ScreenSizeService); + private disclaimerService = inject(DisplacementDisclaimerService); env = inject(EnvironmentService); @ViewChild(MatMenuTrigger) trigger: MatMenuTrigger; @@ -241,6 +246,10 @@ export class SearchTypeSelectorComponent implements OnInit, OnDestroy { event.stopPropagation(); } + public onOpenDisclaimer(): void { + this.disclaimerService.open(); + } + ngOnDestroy() { this.subs.unsubscribe(); } From d120193d66f134104d48a14cd0f93bd365c70675 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 15:27:26 -0800 Subject: [PATCH 09/17] fix(search-type-selector): adjust disclaimer link size and fix click - Reduce font-size from 14px to 12px to match header text - Use grey color to match "Radar Look Direction" styling - Add pointer-events: auto to ensure click handler works --- .../search-type-selector.component.scss | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss index b12505324..3f715b344 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss @@ -244,13 +244,11 @@ } .disclaimer-link { - @include themify($themes) { - color: themed("dark-secondary-text"); - } - - font-size: 14px; + font-size: 12px; font-style: italic; + color: grey; cursor: pointer; + pointer-events: auto; &:hover { text-decoration: underline; From cba3a7ffd6d57018c3bb9a7af52e482919ed5c34 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 15:35:21 -0800 Subject: [PATCH 10/17] fix(search-type-selector): update disclaimer styling and fix click - Add margin-left: 10px - Change text to "*Disclaimer" with initial caps - Add display: inline-block, position: relative, z-index: 10 - Use span instead of anchor tag - Add stopPropagation to prevent event bubbling --- .../search-type-selector.component.html | 9 ++++++--- .../search-type-selector.component.scss | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html index 5a8d1eb68..d83b8f1a9 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html @@ -25,9 +25,12 @@
@if (searchType === searchTypes.DISPLACEMENT) { - - {{ 'DISCLAIMER' | translate }} - + + *Disclaimer + } diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss index 3f715b344..6e44dd013 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss @@ -244,11 +244,15 @@ } .disclaimer-link { + display: inline-block; font-size: 12px; font-style: italic; color: grey; cursor: pointer; pointer-events: auto; + margin-left: 10px; + position: relative; + z-index: 10; &:hover { text-decoration: underline; From e7daff17d522bb4942f89e1d455d2a3c9260bd5e Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 15:37:06 -0800 Subject: [PATCH 11/17] style(search-type-selector): move disclaimer down 2px --- .../search-type-selector/search-type-selector.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss index 6e44dd013..91134370a 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.scss @@ -252,6 +252,7 @@ pointer-events: auto; margin-left: 10px; position: relative; + top: 2px; z-index: 10; &:hover { From d1b7f51e83ea11ac116aa1f7e9da6896255ef987 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 15:45:29 -0800 Subject: [PATCH 12/17] refactor(search-type-selector): use translation key for disclaimer Use 'DISCLAIMER' translation key with asterisk outside the translation. --- .../search-type-selector/search-type-selector.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html index d83b8f1a9..a4f8c9fe7 100644 --- a/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html +++ b/src/app/components/shared/selectors/search-type-selector/search-type-selector.component.html @@ -29,7 +29,7 @@ class="disclaimer-link" (click)="onOpenDisclaimer(); $event.stopPropagation()" > - *Disclaimer + *{{ 'DISCLAIMER' | translate }}
} From cdbe5df236e3c3837a3eed5debaebc8092cc1c84 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 15:56:51 -0800 Subject: [PATCH 13/17] feat(timeseries-results-menu): add disclaimer link to data credits Add "Disclaimer" link between "OPERA" and "License" in the data credits section that triggers the disclaimer modal. --- .../timeseries-results-menu.component.html | 4 ++++ .../timeseries-results-menu.component.ts | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/app/components/results-menu/timeseries-results-menu/timeseries-results-menu.component.html b/src/app/components/results-menu/timeseries-results-menu/timeseries-results-menu.component.html index c81033b4e..65b24fd1f 100644 --- a/src/app/components/results-menu/timeseries-results-menu/timeseries-results-menu.component.html +++ b/src/app/components/results-menu/timeseries-results-menu/timeseries-results-menu.component.html @@ -244,6 +244,10 @@ >{{ 'DATA_COURTESY_OF' | translate }} OPERA | +  {{ 'DISCLAIMER' | translate }} + | (DOCUMENT); private language = inject(AsfLanguageService); @@ -459,6 +461,10 @@ export class TimeseriesResultsMenuComponent implements OnInit, OnDestroy { }); } + public onOpenDisclaimer(): void { + this.disclaimerService.open(); + } + public ngOnDestroy() { this.subs.unsubscribe(); this.pointHistoryService.clearPoints(); From 2d334ded20fb1140b153ad90988bb5db11961dbf Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Wed, 7 Jan 2026 16:55:55 -0800 Subject: [PATCH 14/17] npm run lint -- --fix --- .../processing-options/processing-options.component.html | 4 +++- .../scenes-list-header/scenes-list-header.component.html | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/components/header/processing-queue/processing-options/processing-options.component.html b/src/app/components/header/processing-queue/processing-options/processing-options.component.html index 115178a3d..519bd662f 100644 --- a/src/app/components/header/processing-queue/processing-options/processing-options.component.html +++ b/src/app/components/header/processing-queue/processing-options/processing-options.component.html @@ -4,7 +4,9 @@ @if (selectedJobType.id === jobType.id) { @if (jobType.options.length === 0) {
-

{{ 'NO_PROCESSING_OPTIONS_FOR' | translate }} {{ jobType.name }}

+

+ {{ 'NO_PROCESSING_OPTIONS_FOR' | translate }} {{ jobType.name }} +

} @else {
diff --git a/src/app/components/results-menu/scenes-list-header/scenes-list-header.component.html b/src/app/components/results-menu/scenes-list-header/scenes-list-header.component.html index 8d9deaa82..07cb4584e 100644 --- a/src/app/components/results-menu/scenes-list-header/scenes-list-header.component.html +++ b/src/app/components/results-menu/scenes-list-header/scenes-list-header.component.html @@ -339,7 +339,8 @@
From cff945a5f96b0b44004b5b91ecf0f72ae5699d75 Mon Sep 17 00:00:00 2001 From: Andrew Anderson Date: Thu, 8 Jan 2026 14:29:17 -0800 Subject: [PATCH 15/17] Added icon/link to StoryMaps for Displacement --- .../header-buttons.component.html | 18 ++++++++++++++++++ .../header-buttons.component.scss | 12 ++++++++++++ .../header-buttons.component.ts | 11 +++++++++++ src/assets/StoryMaps.png | Bin 0 -> 18239 bytes src/assets/i18n/en.json | 1 + src/assets/i18n/es.json | 1 + 6 files changed, 43 insertions(+) create mode 100644 src/assets/StoryMaps.png diff --git a/src/app/components/header/header-buttons/header-buttons.component.html b/src/app/components/header/header-buttons/header-buttons.component.html index 3fb203971..e6057bf99 100644 --- a/src/app/components/header/header-buttons/header-buttons.component.html +++ b/src/app/components/header/header-buttons/header-buttons.component.html @@ -73,6 +73,24 @@ } @if (searchType === searchTypes.DISPLACEMENT) { +