diff --git a/client/wfnews-war/src/main/angular/src/app/app.module.ts b/client/wfnews-war/src/main/angular/src/app/app.module.ts index 3f9668b70e..a93360f148 100644 --- a/client/wfnews-war/src/main/angular/src/app/app.module.ts +++ b/client/wfnews-war/src/main/angular/src/app/app.module.ts @@ -230,9 +230,9 @@ import { VideoPanelComponent } from './components/public-incident-page/incident- import { AreaRestrictionHeaderComponent } from './components/public-incident-page/incident-info-header/area-restriction-header/area-restriction-header.component'; import { BanHeaderComponent } from './components/public-incident-page/incident-info-header/ban-header/ban-header.component'; import { DangerRatingHeaderComponent } from './components/public-incident-page/incident-info-header/danger-rating-header/danger-rating-header.component'; -import { IncidentHeaderPanel } from './components/public-incident-page/incident-info-header/incident-header-panel.component'; +import { IncidentHeaderPanelComponent } from './components/public-incident-page/incident-info-header/incident-header-panel.component'; import { IncidentInfoPanelMobileComponent } from './components/public-incident-page/incident-info-panel-mobile/incident-info-panel-mobile.component'; -import { IncidentInfoPanel } from './components/public-incident-page/incident-info-panel/incident-info-panel.component'; +import { IncidentInfoPanelComponent } from './components/public-incident-page/incident-info-panel/incident-info-panel.component'; import { IncidentMapsPanelMobileComponent } from './components/public-incident-page/incident-maps-panel-mobile/incident-maps-panel-mobile.component'; import { IncidentMapsPanel } from './components/public-incident-page/incident-maps-panel/incident-maps-panel.component'; import { IncidentOverviewPanelMobileComponent } from './components/public-incident-page/incident-overview-panel-mobile/incident-overview-panel-mobile.component'; @@ -374,8 +374,8 @@ export const DATE_FORMATS = { PanelWildfireStageOfControlContainerDesktop, PublicIncidentPage, IncidentGalleryPanel, - IncidentHeaderPanel, - IncidentInfoPanel, + IncidentHeaderPanelComponent, + IncidentInfoPanelComponent, IncidentMapsPanel, IncidentOverviewPanel, SummaryPanel, diff --git a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/area-restriction-preview/area-restriction-preview.component.ts b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/area-restriction-preview/area-restriction-preview.component.ts index bf610ba1cf..4a91b603c8 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/area-restriction-preview/area-restriction-preview.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/area-restriction-preview/area-restriction-preview.component.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { MapUtilityService } from '@app/components/preview-panels/map-share-service'; import { AGOLService } from '@app/services/AGOL-service'; +import { CapacitorService } from '@app/services/capacitor-service'; import { CommonUtilityService } from '@app/services/common-utility.service'; import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from '@app/utils'; @@ -11,15 +12,17 @@ import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from styleUrls: ['./area-restriction-preview.component.scss'] }) export class AreaRestrictionPreviewComponent { + public data; + formatDate = formatDate; constructor( private router: Router, private agolService: AGOLService, private commonUtilityService: CommonUtilityService, - private mapUtilityService: MapUtilityService - ) {} - formatDate = formatDate; - public data; + private mapUtilityService: MapUtilityService, + private capacitorService: CapacitorService, + ) { } + setContent(data) { this.data = data.properties; } @@ -27,14 +30,14 @@ export class AreaRestrictionPreviewComponent { closePanel() { hidePanel('desktop-preview'); } - - goBack(){ - showPanel('identify-panel-wrapper') + + goBack() { + showPanel('identify-panel-wrapper'); hidePanel('desktop-preview'); } - - enterFullDetail(){ + + enterFullDetail() { const url = this.router.serializeUrl( this.router.createUrlTree([ResourcesRoutes.PUBLIC_EVENT], { queryParams: { @@ -45,34 +48,28 @@ export class AreaRestrictionPreviewComponent { }, }), ); - window.open(url, '_blank'); + this.capacitorService.redirect(url, true); } - zoomIn(level?: number, polygon?: boolean){ + zoomIn(level?: number, polygon?: boolean) { const viewer = getActiveMap().$viewer; - let long; - let lat; - this.data; this.agolService - .getAreaRestrictions( - `NAME='${this.data.NAME}'`, - null, - { - returnGeometry: true, - }, - ) - .toPromise() - .then((response) => { - if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0){ - const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); - if (polygonData?.length) { - this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); - - } - } - }); + .getAreaRestrictions( + `NAME='${this.data.NAME}'`, + null, + { + returnGeometry: true, + }, + ) + .toPromise() + .then((response) => { + if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0) { + const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); + if (polygonData?.length) { + this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); + } + } + }); } - - } diff --git a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/danger-rating-preview/danger-rating-preview.component.ts b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/danger-rating-preview/danger-rating-preview.component.ts index dd17310307..4a83394957 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/danger-rating-preview/danger-rating-preview.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/danger-rating-preview/danger-rating-preview.component.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { MapUtilityService } from '@app/components/preview-panels/map-share-service'; import { AGOLService } from '@app/services/AGOL-service'; +import { CapacitorService } from '@app/services/capacitor-service'; import { CommonUtilityService } from '@app/services/common-utility.service'; import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from '@app/utils'; @@ -12,28 +13,31 @@ import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from }) export class DangerRatingPreviewComponent { + public data; + formatDate = formatDate; + constructor( private router: Router, private agolService: AGOLService, private commonUtilityService: CommonUtilityService, - private mapUtilityService: MapUtilityService - ) {} + private mapUtilityService: MapUtilityService, + private capacitorService: CapacitorService, + ) { } + - public data; - formatDate = formatDate setContent(data) { this.data = data.properties; } - closePanel() { + closePanel() { hidePanel('desktop-preview'); } - goBack(){ - showPanel('identify-panel-wrapper') + goBack() { + showPanel('identify-panel-wrapper'); hidePanel('desktop-preview'); } - enterFullDetail(){ + enterFullDetail() { const url = this.router.serializeUrl( this.router.createUrlTree([ResourcesRoutes.PUBLIC_EVENT], { queryParams: { @@ -44,44 +48,43 @@ export class DangerRatingPreviewComponent { }, }), ); - window.open(url, '_blank'); + this.capacitorService.redirect(url, true); } - zoomIn(level?: number, polygon?: boolean){ + zoomIn(level?: number, polygon?: boolean) { const viewer = getActiveMap().$viewer; - let long; - let lat; - this.data; this.agolService - .getDangerRatings( - `PROT_DR_SYSID ='${this.data.PROT_DR_SYSID}'`, - null, - { - returnGeometry: true, - }, - ) - .toPromise() - .then((response) => { - if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0){ - const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); - if (polygonData?.length) { - this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); + .getDangerRatings( + `PROT_DR_SYSID ='${this.data.PROT_DR_SYSID}'`, + null, + { + returnGeometry: true, + }, + ) + .toPromise() + .then((response) => { + if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0) { + const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); + if (polygonData?.length) { + this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); - } - } - }); + } + } + }); } displayDangerRatingDes(danger) { switch (danger) { case 'Extreme': + // eslint-disable-next-line max-len return 'Extremely high risk of fire starting. Forest fuels are extremely dry and the fire risk is very serious. Fires can start easily, spread rapidly, and challenge fire suppression efforts. Forest activities may be restricted.'; case 'High': return 'Serious risk of fire starting. Forest fuels are very dry and extreme caution must be used.'; case 'Moderate': return 'Moderate risk of fire starting. Forest fuels are dry and caution should be exercised in forested areas.'; case 'Low': + // eslint-disable-next-line max-len return 'Low risk of fire starting. Fires are unlikely to involve deeper fuel layers or larger fuels. Fire is still possible, so be prepared for conditions to change.'; case 'Very Low': return 'Very low risk of fire starting.'; diff --git a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/evacuations-preview/evacuations-preview.component.ts b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/evacuations-preview/evacuations-preview.component.ts index fe2ea99f8f..4ae2f0325e 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/evacuations-preview/evacuations-preview.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/evacuations-preview/evacuations-preview.component.ts @@ -1,8 +1,9 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { AGOLService } from '@app/services/AGOL-service'; +import { CapacitorService } from '@app/services/capacitor-service'; import { CommonUtilityService } from '@app/services/common-utility.service'; -import { ResourcesRoutes, hidePanel, showPanel, convertToDateTimeTimeZone, getActiveMap } from '@app/utils'; +import { ResourcesRoutes, convertToDateTimeTimeZone, hidePanel, showPanel } from '@app/utils'; import { MapUtilityService } from '../map-share-service'; @Component({ @@ -12,15 +13,17 @@ import { MapUtilityService } from '../map-share-service'; }) export class EvacuationsPreviewComponent { + public data; + convertToDateTimeTimeZone = convertToDateTimeTimeZone; + constructor( private router: Router, private agolService: AGOLService, private commonUtilityService: CommonUtilityService, - private mapUtilityService: MapUtilityService - ) {} + private mapUtilityService: MapUtilityService, + private capacitorService: CapacitorService, + ) { } - convertToDateTimeTimeZone = convertToDateTimeTimeZone; - public data; setContent(data) { this.data = data.properties; this.zoomIn(); @@ -29,12 +32,12 @@ export class EvacuationsPreviewComponent { closePanel() { hidePanel('desktop-preview'); } - - goBack(){ - showPanel('identify-panel-wrapper') + + goBack() { + showPanel('identify-panel-wrapper'); hidePanel('desktop-preview'); } - + displayEvacTitle(item) { let prefix = null; if (item?.ORDER_ALERT_STATUS === 'Alert') { @@ -45,8 +48,8 @@ export class EvacuationsPreviewComponent { return prefix + item?.EVENT_NAME; } - enterFullDetail(){ - if(this.data) { + enterFullDetail() { + if (this.data) { const url = this.router.serializeUrl( this.router.createUrlTree([ResourcesRoutes.PUBLIC_EVENT], { queryParams: { @@ -57,24 +60,24 @@ export class EvacuationsPreviewComponent { }, }), ); - window.open(url, '_blank'); + this.capacitorService.redirect(url, true); } } - zoomIn(){ + zoomIn() { this.agolService - .getEvacOrdersByEventNumber(this.data.EVENT_NUMBER, { - returnGeometry: true, - }) - .toPromise() - .then((response) => { - if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0){ - const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); - if (polygonData?.length) { - this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); - } - } - }); + .getEvacOrdersByEventNumber(this.data.EVENT_NUMBER, { + returnGeometry: true, + }) + .toPromise() + .then((response) => { + if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0) { + const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); + if (polygonData?.length) { + this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); + } + } + }); } } diff --git a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/fire-ban-preview/fire-ban-preview.component.ts b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/fire-ban-preview/fire-ban-preview.component.ts index 579f23f05c..4e04195184 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/preview-panels/fire-ban-preview/fire-ban-preview.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/preview-panels/fire-ban-preview/fire-ban-preview.component.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { MapUtilityService } from '@app/components/preview-panels/map-share-service'; import { AGOLService } from '@app/services/AGOL-service'; +import { CapacitorService } from '@app/services/capacitor-service'; import { CommonUtilityService } from '@app/services/common-utility.service'; import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from '@app/utils'; @@ -11,29 +12,32 @@ import { ResourcesRoutes, formatDate, getActiveMap, hidePanel, showPanel } from styleUrls: ['./fire-ban-preview.component.scss'] }) export class FireBanPreviewComponent { - + + public data; + formatDate = formatDate; + constructor( private router: Router, private agolService: AGOLService, private commonUtilityService: CommonUtilityService, - private mapUtilityService: MapUtilityService - ) {} - public data; - formatDate = formatDate; + private mapUtilityService: MapUtilityService, + private capacitorService: CapacitorService, + ) { } + setContent(data) { this.data = data.properties; } - closePanel() { + closePanel() { hidePanel('desktop-preview'); } - - goBack(){ - showPanel('identify-panel-wrapper') + + goBack() { + showPanel('identify-panel-wrapper'); hidePanel('desktop-preview'); } - enterFullDetail(){ + enterFullDetail() { const url = this.router.serializeUrl( this.router.createUrlTree([ResourcesRoutes.PUBLIC_EVENT], { queryParams: { @@ -44,38 +48,35 @@ export class FireBanPreviewComponent { }, }), ); - window.open(url, '_blank'); + this.capacitorService.redirect(url, true); } - zoomIn(level?: number, polygon?: boolean){ + zoomIn(level?: number, polygon?: boolean) { const viewer = getActiveMap().$viewer; - let long; - let lat; - this.data; this.agolService - .getBansAndProhibitionsById( - this.data.PROT_BAP_SYSID, - { - returnGeometry: true, - }, - ) - .toPromise() - .then((response) => { - if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0){ - const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); - if (polygonData?.length) { - this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); + .getBansAndProhibitionsById( + this.data.PROT_BAP_SYSID, + { + returnGeometry: true, + }, + ) + .toPromise() + .then((response) => { + if (response?.features?.length > 0 && response?.features[0].geometry?.rings?.length > 0) { + const polygonData = this.commonUtilityService.extractPolygonData(response.features[0].geometry.rings); + if (polygonData?.length) { + this.mapUtilityService.fixPolygonToMap(polygonData, response.features[0].geometry.rings); - } - } - }); + } + } + }); } replaceCategoryDescription(description: string): string { - if (description.includes("Category 1")) { - return description.replace("Category 1", "Category 1 (Campfires)"); + if (description.includes('Category 1')) { + return description.replace('Category 1', 'Category 1 (Campfires)'); } return description; } - + } diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.component.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.component.ts index d3a6304093..6e5df1ef3b 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.component.ts @@ -43,7 +43,7 @@ import { ContactUsDialogComponent } from '../../admin-incident-form/contact-us-d styleUrls: ['./incident-header-panel.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class IncidentHeaderPanel implements AfterViewInit, OnInit { +export class IncidentHeaderPanelComponent implements AfterViewInit, OnInit { @Input() public incident: any; @Input() public evacOrders: EvacOrderOption[] = []; @Input() public extent: any; diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.stories.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.stories.ts index 06992186d6..391f4cd4fa 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.stories.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-header/incident-header-panel.stories.ts @@ -10,7 +10,7 @@ import { PublishedIncidentService } from '@app/services/published-incident-servi import { WatchlistService } from '@app/services/watchlist-service'; import { AppConfigService } from '@wf1/core-ui'; import { of } from 'rxjs'; -import { IncidentHeaderPanel } from './incident-header-panel.component'; +import { IncidentHeaderPanelComponent } from './incident-header-panel.component'; // Mock services const mockAppConfigService = { @@ -40,12 +40,12 @@ const mockActivatedRoute = { }; // Define the default export configuration using Meta -const meta: Meta = { +const meta: Meta = { title: 'Components/IncidentHeaderPanel', - component: IncidentHeaderPanel, + component: IncidentHeaderPanelComponent, decorators: [ moduleMetadata({ - declarations: [IncidentHeaderPanel], + declarations: [IncidentHeaderPanelComponent], imports: [ CommonModule, RouterModule.forChild([]), @@ -72,7 +72,7 @@ function createIsMobileViewOverride(isMobile: boolean): () => boolean { } // Define the type for Story Object -type Story = StoryObj; +type Story = StoryObj; // Story for the default desktop view export const Default: Story = { diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel-mobile/incident-info-panel-mobile.component.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel-mobile/incident-info-panel-mobile.component.ts index f196229c7a..b187f2a8af 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel-mobile/incident-info-panel-mobile.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel-mobile/incident-info-panel-mobile.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { IncidentInfoPanel } from '../incident-info-panel/incident-info-panel.component'; import { ResourcesRoutes, convertToDateYear } from '@app/utils'; +import { IncidentInfoPanelComponent } from '../incident-info-panel/incident-info-panel.component'; @Component({ selector: 'incident-info-panel-mobile', @@ -8,7 +8,7 @@ import { ResourcesRoutes, convertToDateYear } from '@app/utils'; styleUrls: ['./incident-info-panel-mobile.component.scss'], }) export class IncidentInfoPanelMobileComponent - extends IncidentInfoPanel + extends IncidentInfoPanelComponent implements OnInit { mobileEvacOrders = []; mobileEvacAlerts = []; @@ -22,14 +22,14 @@ export class IncidentInfoPanelMobileComponent if (this.evacOrders) { for (const evac of this.evacOrders) { if (evac.orderAlertStatus === 'Order') { -this.mobileEvacOrders.push(evac); -} else if (evac.orderAlertStatus === 'Alert') { -this.mobileEvacAlerts.push(evac); -} else { -console.error( + this.mobileEvacOrders.push(evac); + } else if (evac.orderAlertStatus === 'Alert') { + this.mobileEvacAlerts.push(evac); + } else { + console.error( 'Could not determine orderAlertStatus for mobile evacuations', ); -} + } } } } @@ -54,10 +54,10 @@ console.error( } else if (evac && this.incident) { let type = null; if (evac.orderAlertStatus === 'Alert') { -type = 'evac-alert'; -} else if (evac.orderAlertStatus === 'Order') { -type = 'evac-order'; -} + type = 'evac-alert'; + } else if (evac.orderAlertStatus === 'Order') { + type = 'evac-order'; + } this.route.navigate([ResourcesRoutes.FULL_DETAILS], { queryParams: { type, @@ -76,7 +76,7 @@ type = 'evac-order'; navigateToAreaRestriction(area) { if (area?.protRsSysID && this.incident) { -this.route.navigate([ResourcesRoutes.FULL_DETAILS], { + this.route.navigate([ResourcesRoutes.FULL_DETAILS], { queryParams: { type: 'area-restriction', id: area.protRsSysID, @@ -88,13 +88,13 @@ this.route.navigate([ResourcesRoutes.FULL_DETAILS], { name: area.name }, }); -} + } } scrollToSection(sectionId) { const section = document.getElementById(sectionId); if (section) { -section.scrollIntoView({ behavior: 'smooth' }); -} + section.scrollIntoView({ behavior: 'smooth' }); + } } } diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.component.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.component.ts index 5203b03129..84112e36fb 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.component.ts @@ -43,7 +43,7 @@ import { styleUrls: ['./incident-info-panel.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class IncidentInfoPanel implements AfterViewInit, OnChanges { +export class IncidentInfoPanelComponent implements AfterViewInit, OnChanges { @Input() public incident: any; @Input() public evacOrders: EvacOrderOption[] = []; @Input() public areaRestrictions: AreaRestrictionsOption[] = []; @@ -86,7 +86,7 @@ export class IncidentInfoPanel implements AfterViewInit, OnChanges { ngOnChanges(changes: SimpleChanges) { if (changes?.evacOrders?.currentValue.length) { - let evacs = changes.evacOrders.currentValue + const evacs = changes.evacOrders.currentValue; for (const evac of evacs) { if (evac.orderAlertStatus === 'Order') { this.desktopEvacOrders.push(evac); @@ -122,7 +122,7 @@ export class IncidentInfoPanel implements AfterViewInit, OnChanges { const canvas = document.getElementById('qr-code'); if (canvas) { - toCanvas(canvas, window.location.href, function (error) { + toCanvas(canvas, window.location.href, (error) => { if (error) { console.error(error); } @@ -227,45 +227,46 @@ export class IncidentInfoPanel implements AfterViewInit, OnChanges { : this.incident.incidentNumberLabelFull, ) .toPromise() - .then((results) => { + .then((attachments) => { // Loop through the attachments, for each one, create a ref, and set href to the bytes this.mediaCollection = []; - if (results?.collection?.length > 0) { - for (const attachment of results.collection) { - for (const attachment of results.collection) { - // do a mime type check here - // Light gallery does not really support direct download on mimetype : image/bmp && image/tiff, which will returns 500 error. - if ( - attachment.mimeType && - [ - 'image/jpg', - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/bmp', - 'image/tiff', - ].includes(attachment.mimeType.toLowerCase()) - ) { - this.mediaCollection.push({ - title: attachment.attachmentTitle, - uploadedDate: new Date( - attachment.createdTimestamp, - ).toLocaleDateString(), - fileName: attachment.attachmentFileName, - type: 'image', - href: `${this.appConfigService.getConfig().rest['wfnews'] - }/publicPublishedIncidentAttachment/${this.incident.incidentNumberLabel - }/attachments/${attachment.attachmentGuid}/bytes`, - thumbnail: `${this.appConfigService.getConfig().rest['wfnews'] - }/publicPublishedIncidentAttachment/${this.incident.incidentNumberLabel - }/attachments/${attachment.attachmentGuid - }/bytes?thumbnail=true`, - loaded: false, - }); - } + if (attachments?.collection?.length > 0) { + for (const attachment of attachments.collection) { + + // do a mime type check here + // Light gallery does not really support direct download on mimetype + // image/bmp && image/tiff, which will returns 500 error. + if ( + attachment.mimeType && + [ + 'image/jpg', + 'image/jpeg', + 'image/png', + 'image/gif', + 'image/bmp', + 'image/tiff', + ].includes(attachment.mimeType.toLowerCase()) + ) { + this.mediaCollection.push({ + title: attachment.attachmentTitle, + uploadedDate: new Date( + attachment.createdTimestamp, + ).toLocaleDateString(), + fileName: attachment.attachmentFileName, + type: 'image', + href: `${this.appConfigService.getConfig().rest['wfnews'] + }/publicPublishedIncidentAttachment/${this.incident.incidentNumberLabel + }/attachments/${attachment.attachmentGuid}/bytes`, + thumbnail: `${this.appConfigService.getConfig().rest['wfnews'] + }/publicPublishedIncidentAttachment/${this.incident.incidentNumberLabel + }/attachments/${attachment.attachmentGuid + }/bytes?thumbnail=true`, + loaded: false, + }); } + // do a mime type check here - if (attachment.primary) { + if (attachment.primary && !this.primaryMedia) { this.primaryMedia = { title: attachment.attachmentTitle, uploadedDate: new Date( @@ -281,7 +282,6 @@ export class IncidentInfoPanel implements AfterViewInit, OnChanges { }/attachments/${attachment.attachmentGuid }/bytes?thumbnail=true`, }; - break; } } } diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.stories.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.stories.ts index b9f5a13f28..cd4c77385c 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.stories.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-info-panel/incident-info-panel.stories.ts @@ -1,75 +1,76 @@ -import { Meta, StoryObj } from '@storybook/angular'; -import { moduleMetadata } from '@storybook/angular'; import { CommonModule } from '@angular/common'; -import { IncidentInfoPanel } from './incident-info-panel.component'; -import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import { IncidentInfoPanelComponent } from './incident-info-panel.component'; // Mock data for the story const mockIncident = { - "cacheExpiresMillis": null, - "publishedIncidentDetailGuid": "a1cb0b30-982d-43f2-9168-57432a46a1c7", - "incidentGuid": "FA58EFD1154B2322E0531D09228E354E", - "incidentNumberLabel": "V65068", - "newsCreatedTimestamp": 1686956242000, - "stageOfControlCode": "HOLDING", - "generalIncidentCauseCatId": 3, - "newsPublicationStatusCode": "PUBLISHED", - "discoveryDate": 1682630442000, - "declaredOutDate": null, - "fireCentreCode": "50", - "fireCentreName": "Coastal Fire Centre", - "fireOfNoteInd": true, - "wasFireOfNoteInd": true, - "incidentName": "NOTIFICATION SHARON", - "incidentLocation": "Near Juan De Fuca Park", - "traditionalTerritoryDetail": null, - "incidentSizeEstimatedHa": 43.222, - "incidentSizeMappedHa": 43.222, - "incidentSizeDetail": "Fire size is based on most current information available. 232", - "incidentCauseDetail": "Wildfire investigations often take time and can be very complex. Investigations may be carried out by one or more agencies, including the BC Wildfire Service, the Compliance and Enforcement Branch, the RCMP, or other law enforcement agencies, and may be cross jurisdictional.", - "wildfireCrewResourcesInd": true, - "wildfireAviationResourceInd": true, - "heavyEquipmentResourcesInd": true, - "incidentMgmtCrewRsrcInd": false, - "structureProtectionRsrcInd": false, - "crewResourceCount": null, - "aviationResourceCount": null, - "heavyEquipmentResourceCount": null, - "incidentManagementResourceCount": null, - "structureProtectionResourceCount": null, - "publishedTimestamp": 1715793217399, - "lastUpdatedTimestamp": 1715793217397, - "createDate": 1682630478374, - "updateDate": 1715793217402, - "latitude": "48.529335", - "longitude": "-124.448432", - "fireYear": 2023, - "responseTypeCode": null, - "responseTypeDetail": null, - "fireZoneUnitIdentifier": 54, - "incidentOverview": "

Wildfire Information

A BC Wildfire Service Incident Management Team (IMT) continues to ensure a coordinated response for the Donnie Creek Complex, which is located approximately 158 km north of Fort St. John and 136 km southeast of Fort Nelson. The Donnie Creek Complex consists of three wildfires: Donnie Creek (G80280), Klua Lakes (G90273), and Muskwa River (G90292).

Fire Behaviour & Weather: 

Overnight Wednesday, skies will partially clear.  Recoveries remain excellent with relative humidity approaching 90% or higher. Strong inversions will set up overnight Wednesday, helping to temporarily slow fire behaviour while smoke builds within the boundary layer. The pattern remains fairly unchanged through Thursday. The biggest change will be increased cloud cover potentially resulting in cooler temperatures. Small disturbances embedded in the northerly flow will support afternoon showers and thunderstorms with a chance of measurable rainfall. Crews will be watching for stronger, gustier northerly winds developing midday Thursday. There may be patches of fog Friday morning.

Today is another drying day on the fire. Crews expect fire behaviour similar to yesterday’s albeit it potentially earlier in the day. There is a potential for precipitation later in the day, but it is not widespread. The warming and drying trend is expected to continue.

The fire danger rating for the North Peace is generally high-to-extreme. In current conditions, fuels will spread easily, burn vigorously, and challenge fire suppression efforts. Drought conditions persist in much of the Prince George Fire Centre.

 

Conditions:

The Donnie Creek wildfire is now mapped at 553,947 hectares in size and remains Out of Control. 

Because of the remote work location and hazards common to this vast boreal forest area, ensuring the safety and well-being of responders, industry and the public remain paramount.

Crews continue to work along the Alaska Highway and any impacts to this important transportation corridor will be reported on DriveBC. For the latest information, please check the Drive BC website

Complex Objectives: 

There is very little change to crew objectives. Crews continue with their assignments joined yesterday by twenty firefighters from Alaska. Today an additional twenty American firefighters will arrive and be assigned as needed. 

Crews continue to mop up and demobilize equipment along the perimeter of the main body of the fire from the 202 Road near Trutch southward and along the finger to the north. Crews are dealing with a few spots that have been identified. The fire continues to be monitored on the northwest flank near Drymeat Lake with aerial support. 

On the south flank crews continue to work from the Beatton Creek heading east putting in machine guards and following with hose lay.  Crews working north of Camp 192 reported good progress throughout most of the day but had to pull back from one area due to increased fire behaviour. Crews will tie into an old burn scar and look for an opportunity to conduct a planned ignition. Fuel mitigation is complete at the CN Bridge. Firefighters are also working at 27.5 km on Tommy Lakes Road putting in hose lay and assessing danger trees assessing and falling as necessary. 

Equipment is being used to remove trees (daylighting) along the Tommy Lakes Road from the 28-kilometre mark to 34.5 km.

On the southeast flank crews noted an increase in fire behaviour yesterday from 10:30 continuing throughout the day. Crews today are working near Two Creeks Road. The fire along the Beatton River remained on the northwest side. Growth was experienced in two areas along the railway. Crews are looking at a secondary plan to mitigate any further growth. 

Advanced forward planning is ongoing to identify and address potential future impacts to structures, infrastructure and industry assets based on growth projections for the three fires that make up the Donnie Creek Complex. Forward planning work guides future operational priorities and actions.

Area Restriction:

On June 8 an Area Restriction was put into place in the region surrounding the complex. This allows the BC Wildfire Service to control access into the area and help to keep members of the public out of this active firefighting area for their own safety and the safety of responders. For details click the link https://www2.gov.bc.ca/assets/gov/public-safety-and-emergency-services/wildfire-status/fire-bans-and-restrictions/prince-george-maps/23_g80280_map_arearestriction_public_85x11p_june08.jpg

During the time when the Area Restriction is in place, the BC Wildfire Service will control access in and out of the area for the safety of the public and responders working the fire. To gain access to a location within the Area Restriction, a compelling reason must be given, and safe access and egress must be possible. A BCWS Liaison Officer is in place to consider access requests and can be contacted at: 778-362-4794 or by email at BCWS.DonnieCreekComplex.Liaison@gov.bc.ca.

Evacuation Alerts:

The Peace River Regional District has lifted its evacuation order and issued evacuation alerts related to the Donnie Creek Wildfire. For up-to-date information regarding the alert, please visit their website here

The Northern Rockies Regional Municipality has lifted its Evacuation Alert for the area. For up-to-date information regarding the alert please visit their website here.

", - "incidentSizeType": "Mapped", - "contactOrgUnitIdentifer": 50, - "contactPhoneNumber": "250-951-4209", - "contactEmailAddress": "BCWS.COFCInformationOfficer@gov.bc.ca", - "resourceDetail": "Here is the response", - "wildfireCrewResourcesDetail": "There are currently 5 Initial Attack and 6 Unit Crews responding to this wildfire.", - "wildfireAviationResourceDetail": "There are currently 6 helicopters and 6 airtankers responding to this wildfire.", - "heavyEquipmentResourcesDetail": "There are currently 8 pieces of heavy equipment responding to this wildfire.", - "incidentMgmtCrewRsrcDetail": null, - "structureProtectionRsrcDetail": null, - "publishedUserTypeCode": null, - "publishedUserGuid": null, - "publishedUserUserId": null, - "publishedUserName": null, - "publishedIncidentRevisionCount": 48, - "createUser": "SCL\\WFNEWS_SYNC", - "updateUser": "SCL\\WFNEWS_SYNC", - "selfLink": "http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident", - "quotedETag": "\"7f54005e-f4de-23af-d7bd-2bbed28a808d\"", - "unquotedETag": "7f54005e-f4de-23af-d7bd-2bbed28a808d", - "_type": null + cacheExpiresMillis: null, + publishedIncidentDetailGuid: 'a1cb0b30-982d-43f2-9168-57432a46a1c7', + incidentGuid: 'FA58EFD1154B2322E0531D09228E354E', + incidentNumberLabel: 'V65068', + newsCreatedTimestamp: 1686956242000, + stageOfControlCode: 'HOLDING', + generalIncidentCauseCatId: 3, + newsPublicationStatusCode: 'PUBLISHED', + discoveryDate: 1682630442000, + declaredOutDate: null, + fireCentreCode: '50', + fireCentreName: 'Coastal Fire Centre', + fireOfNoteInd: true, + wasFireOfNoteInd: true, + incidentName: 'NOTIFICATION SHARON', + incidentLocation: 'Near Juan De Fuca Park', + traditionalTerritoryDetail: null, + incidentSizeEstimatedHa: 43.222, + incidentSizeMappedHa: 43.222, + incidentSizeDetail: 'Fire size is based on most current information available. 232', + // eslint-disable-next-line max-len + incidentCauseDetail: 'Wildfire investigations often take time and can be very complex. Investigations may be carried out by one or more agencies, including the BC Wildfire Service, the Compliance and Enforcement Branch, the RCMP, or other law enforcement agencies, and may be cross jurisdictional.', + wildfireCrewResourcesInd: true, + wildfireAviationResourceInd: true, + heavyEquipmentResourcesInd: true, + incidentMgmtCrewRsrcInd: false, + structureProtectionRsrcInd: false, + crewResourceCount: null, + aviationResourceCount: null, + heavyEquipmentResourceCount: null, + incidentManagementResourceCount: null, + structureProtectionResourceCount: null, + publishedTimestamp: 1715793217399, + lastUpdatedTimestamp: 1715793217397, + createDate: 1682630478374, + updateDate: 1715793217402, + latitude: '48.529335', + longitude: '-124.448432', + fireYear: 2023, + responseTypeCode: null, + responseTypeDetail: null, + fireZoneUnitIdentifier: 54, + // eslint-disable-next-line max-len + incidentOverview: '

Wildfire Information

A BC Wildfire Service Incident Management Team (IMT) continues to ensure a coordinated response for the Donnie Creek Complex, which is located approximately 158 km north of Fort St. John and 136 km southeast of Fort Nelson. The Donnie Creek Complex consists of three wildfires: Donnie Creek (G80280), Klua Lakes (G90273), and Muskwa River (G90292).

Fire Behaviour & Weather: 

Overnight Wednesday, skies will partially clear.  Recoveries remain excellent with relative humidity approaching 90% or higher. Strong inversions will set up overnight Wednesday, helping to temporarily slow fire behaviour while smoke builds within the boundary layer. The pattern remains fairly unchanged through Thursday. The biggest change will be increased cloud cover potentially resulting in cooler temperatures. Small disturbances embedded in the northerly flow will support afternoon showers and thunderstorms with a chance of measurable rainfall. Crews will be watching for stronger, gustier northerly winds developing midday Thursday. There may be patches of fog Friday morning.

Today is another drying day on the fire. Crews expect fire behaviour similar to yesterday’s albeit it potentially earlier in the day. There is a potential for precipitation later in the day, but it is not widespread. The warming and drying trend is expected to continue.

The fire danger rating for the North Peace is generally high-to-extreme. In current conditions, fuels will spread easily, burn vigorously, and challenge fire suppression efforts. Drought conditions persist in much of the Prince George Fire Centre.

 

Conditions:

The Donnie Creek wildfire is now mapped at 553,947 hectares in size and remains Out of Control. 

Because of the remote work location and hazards common to this vast boreal forest area, ensuring the safety and well-being of responders, industry and the public remain paramount.

Crews continue to work along the Alaska Highway and any impacts to this important transportation corridor will be reported on DriveBC. For the latest information, please check the Drive BC website

Complex Objectives: 

There is very little change to crew objectives. Crews continue with their assignments joined yesterday by twenty firefighters from Alaska. Today an additional twenty American firefighters will arrive and be assigned as needed. 

Crews continue to mop up and demobilize equipment along the perimeter of the main body of the fire from the 202 Road near Trutch southward and along the finger to the north. Crews are dealing with a few spots that have been identified. The fire continues to be monitored on the northwest flank near Drymeat Lake with aerial support. 

On the south flank crews continue to work from the Beatton Creek heading east putting in machine guards and following with hose lay.  Crews working north of Camp 192 reported good progress throughout most of the day but had to pull back from one area due to increased fire behaviour. Crews will tie into an old burn scar and look for an opportunity to conduct a planned ignition. Fuel mitigation is complete at the CN Bridge. Firefighters are also working at 27.5 km on Tommy Lakes Road putting in hose lay and assessing danger trees assessing and falling as necessary. 

Equipment is being used to remove trees (daylighting) along the Tommy Lakes Road from the 28-kilometre mark to 34.5 km.

On the southeast flank crews noted an increase in fire behaviour yesterday from 10:30 continuing throughout the day. Crews today are working near Two Creeks Road. The fire along the Beatton River remained on the northwest side. Growth was experienced in two areas along the railway. Crews are looking at a secondary plan to mitigate any further growth. 

Advanced forward planning is ongoing to identify and address potential future impacts to structures, infrastructure and industry assets based on growth projections for the three fires that make up the Donnie Creek Complex. Forward planning work guides future operational priorities and actions.

Area Restriction:

On June 8 an Area Restriction was put into place in the region surrounding the complex. This allows the BC Wildfire Service to control access into the area and help to keep members of the public out of this active firefighting area for their own safety and the safety of responders. For details click the link https://www2.gov.bc.ca/assets/gov/public-safety-and-emergency-services/wildfire-status/fire-bans-and-restrictions/prince-george-maps/23_g80280_map_arearestriction_public_85x11p_june08.jpg

During the time when the Area Restriction is in place, the BC Wildfire Service will control access in and out of the area for the safety of the public and responders working the fire. To gain access to a location within the Area Restriction, a compelling reason must be given, and safe access and egress must be possible. A BCWS Liaison Officer is in place to consider access requests and can be contacted at: 778-362-4794 or by email at BCWS.DonnieCreekComplex.Liaison@gov.bc.ca.

Evacuation Alerts:

The Peace River Regional District has lifted its evacuation order and issued evacuation alerts related to the Donnie Creek Wildfire. For up-to-date information regarding the alert, please visit their website here

The Northern Rockies Regional Municipality has lifted its Evacuation Alert for the area. For up-to-date information regarding the alert please visit their website here.

', + incidentSizeType: 'Mapped', + contactOrgUnitIdentifer: 50, + contactPhoneNumber: '250-951-4209', + contactEmailAddress: 'BCWS.COFCInformationOfficer@gov.bc.ca', + resourceDetail: 'Here is the response', + wildfireCrewResourcesDetail: 'There are currently 5 Initial Attack and 6 Unit Crews responding to this wildfire.', + wildfireAviationResourceDetail: 'There are currently 6 helicopters and 6 airtankers responding to this wildfire.', + heavyEquipmentResourcesDetail: 'There are currently 8 pieces of heavy equipment responding to this wildfire.', + incidentMgmtCrewRsrcDetail: null, + structureProtectionRsrcDetail: null, + publishedUserTypeCode: null, + publishedUserGuid: null, + publishedUserUserId: null, + publishedUserName: null, + publishedIncidentRevisionCount: 48, + createUser: 'SCL\\WFNEWS_SYNC', + updateUser: 'SCL\\WFNEWS_SYNC', + selfLink: 'http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident', + quotedETag: '"7f54005e-f4de-23af-d7bd-2bbed28a808d"', + unquotedETag: '7f54005e-f4de-23af-d7bd-2bbed28a808d', + _type: null }; const mockEvacOrders = [ @@ -101,25 +102,25 @@ const mockAreaRestrictions = [ export default { title: 'Components/IncidentInfoPanel', - component: IncidentInfoPanel, + component: IncidentInfoPanelComponent, decorators: [ moduleMetadata({ - declarations: [IncidentInfoPanel], + declarations: [IncidentInfoPanelComponent], imports: [CommonModule, MatIconModule, MatButtonModule], }), ], -} as Meta; +} as Meta; -type Story = StoryObj; +type Story = StoryObj; -export const Default: Story = { +export const example: Story = { args: { incident: mockIncident, evacOrders: mockEvacOrders, }, }; -export const WithoutEvacuations: Story = { +export const withoutEvacuations: Story = { args: { incident: { ...mockIncident, @@ -130,7 +131,7 @@ export const WithoutEvacuations: Story = { }, }; -export const WithMultipleEvacuations: Story = { +export const withMultipleEvacuations: Story = { args: { incident: mockIncident, evacOrders: [ diff --git a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-tabs/incident-tabs.component.stories.ts b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-tabs/incident-tabs.component.stories.ts index 5a2f0c1f0d..472b909e65 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-tabs/incident-tabs.component.stories.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/public-incident-page/incident-tabs/incident-tabs.component.stories.ts @@ -6,84 +6,85 @@ import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; // Import your specific component import { IncidentGalleryPanel } from '../incident-gallery-panel/incident-gallery-panel.component'; -import { IncidentInfoPanel } from '../incident-info-panel/incident-info-panel.component'; +import { IncidentInfoPanelComponent } from '../incident-info-panel/incident-info-panel.component'; import { IncidentMapsPanel } from '../incident-maps-panel/incident-maps-panel.component'; import { IncidentOverviewPanel } from '../incident-overview-panel/incident-overview-panel.component'; import { IncidentTabsComponent } from './incident-tabs.component'; // Mock data for the story const mockIncident = { - "cacheExpiresMillis": null, - "links": [ + cacheExpiresMillis: null, + links: [ { - "rel": "self", - "href": "http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident", - "method": "GET", - "_type": null + rel: 'self', + href: 'http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident', + method: 'GET', + _type: null } ], - "publishedIncidentDetailGuid": "2ae55318-a6b7-43be-b947-f6b29130f580", - "incidentGuid": "185C2BDF5C437589E0631D09228E0F61", - "incidentNumberLabel": "V65041", - "newsCreatedTimestamp": 1715629914000, - "stageOfControlCode": "HOLDING", - "generalIncidentCauseCatId": 2, - "newsPublicationStatusCode": "PUBLISHED", - "discoveryDate": 1715629716000, - "declaredOutDate": null, - "fireCentreCode": "50", - "fireCentreName": "Coastal Fire Centre", - "fireOfNoteInd": true, - "wasFireOfNoteInd": true, - "incidentName": "Blenkinsop Lake Fire", - "incidentLocation": "Island in Blenkinsop Lake", - "traditionalTerritoryDetail": "Blenkinsop FN", - "incidentSizeEstimatedHa": 2.0, - "incidentSizeMappedHa": 2.0, - "incidentSizeDetail": "Fire size is based on the last known mapped size in hectares.", - "incidentCauseDetail": "When lightning strikes an object it can release enough heat to ignite a tree or other fuels.", - "wildfireCrewResourcesInd": true, - "wildfireAviationResourceInd": true, - "heavyEquipmentResourcesInd": true, - "incidentMgmtCrewRsrcInd": true, - "structureProtectionRsrcInd": false, - "crewResourceCount": null, - "aviationResourceCount": null, - "heavyEquipmentResourceCount": null, - "incidentManagementResourceCount": null, - "structureProtectionResourceCount": null, - "publishedTimestamp": 1715880522303, - "lastUpdatedTimestamp": 1715880522299, - "createDate": 1715629719759, - "updateDate": 1715880522307, - "latitude": "48.48435", - "longitude": "-123.361566", - "fireYear": 2024, - "responseTypeCode": "FULL", - "responseTypeDetail": null, - "fireZoneUnitIdentifier": 54, - "incidentOverview": "

Weather:

  • Earlier forecasts suggested strong winds overnight on May 12th for the Fort Nelson area, based on the setup of a default ridge over the North of BC, these winds arrived later than expected. 
  • The inversion overnight on May 12th led to calm stable conditions over the Fort Nelson area into the late evening/ early morning hours of May 13th.
  • Winds were 0-2km/hr and humidifies rose above 50% by the late evening which limited fire behaviour for G90267 to a creeping ground fire.
  • G90267 saw almost no overnight growth on the 12th of May.
  • Winds aloft picked up in the early morning hours on May 13th for the area, the inversion is expected to break early this morning with an increase in wind speeds following into the later morning/ early afternoon.
  • With higher forecasted wind speeds, and the low humidifies extreme fire behaviour is forecasted for the Fort Nelson area on May 13th with the dryness of the available fuels.

Resources: 

  • An Incident Management Team is in operational command of this incident. 
  • BC Wildfire Service resources are working in conjunction with The Northern Rockies Municipal Fire Department and emergency services staff.
  • 69 BCWS firefighters are responding to this incident.
  • 16 helicopters are assigned to the Fort Nelson Zone and fixed wing airtankers are available should they be required for operational objectives.
  • A Structure Protection Branch is established including: four Structure Protection Specialists, two type 2 Structure Protections Trailers and one Type 1 Structure Protection Trailer.  
  • 17 pieces of heavy equipment are assigned to this incident. 

Operations:

  • Command and operational staff from the BCWS Incident Management Team remain at the Incident Command Post in Fort Nelson alongside BCWS crews and structure protection personnel.
  • The helicopter base has been relocated in order maintain operations due to heavy smoke in the Fort Nelson area. 
  • Operations continue to be run 24 hour as the Structure Protection Branch remains established and a structure defense plan has been finalized. Structure protection and BCWS personnel are working in two main priority areas: The Fort Nelson First Nation and along the Old Alaska Highway. The Northern Rockies Regional Municipality Fire Department has structure defense resources to respond within their fire response area.
  • Overnight, structure protection personnel actioned hot spots adjacent to identified values.
  • Located in the Fort Nelson First Nation, two Structure Protection Specialists are working alongside structure protection tenders, engines, structure protection crews and a BC Wildfire Service Unit Crew.
  • Located in the Old Alaska Highway, adjacent to Highway 97, a Structure Protection Specialist is supported by a task force.
  • BCWS staff continues to work alongside the Northern Rocky Municipal Fire Department as they remain a dedicated task force in their fire protected area. 
  • Approximately a 200 hectare pocket of available fuel located adjacent to Highway 97 was removed by a planned aerial ignition. BCWS crews supported this planned ignition operation by performing small scale hand ignitions to remove any remaining unburnt fuel and to reinforce containment lines. 

Evacuation Alerts and Orders/Highway Closures:

  • Highway 97 (Alaska Highway) is currently closed north of Fort Nelson. Information on Highway 97 closures can be requested at 250-774-6956 and information on Highway 77 closures can be found on DriveBC.
  • The Northern Rockies Regional Municipality has issued an Evacuation Order for Fort Nelson and area, and the Fort Nelson First Nation, to protect public life and safety. Impacted residents can evacuate to the Fort St. John Reception Centre at the North Peace Arena. More information on the Evacuation Order is available online at EmergencyInfoBC and the Northern Rockies Regional Municipality website.
  • The Northern Rockies Regional Municipality has upgraded the already existing Evacuation Alert to an Evacuation Order. More information on the Evacuation Order is available online at EmergencyInfoBC and the Northern Rockies Regional Municipality website 
", - "incidentSizeType": "Mapped", - "contactOrgUnitIdentifer": 50, - "contactPhoneNumber": "250-951-4209", - "contactEmailAddress": "BCWS.COFCInformationOfficer@gov.bc.ca", - "resourceDetail": null, - "wildfireCrewResourcesDetail": "There are currently 4 Initial Attack and 4 Unit Crews responding to this wildfire.", - "wildfireAviationResourceDetail": "There are currently 1 helicopters and 1 airtankers responding to this wildfire.", - "heavyEquipmentResourcesDetail": "There are currently 1 pieces of heavy equipment responding to this wildfire.", - "incidentMgmtCrewRsrcDetail": "An Incident Management Team has been assigned to this wildfire.", - "structureProtectionRsrcDetail": null, - "publishedUserTypeCode": null, - "publishedUserGuid": null, - "publishedUserUserId": null, - "publishedUserName": null, - "publishedIncidentRevisionCount": 116, - "createUser": "SCL\\WFNEWS_SYNC", - "updateUser": "SCL\\WFNEWS_SYNC", - "selfLink": "http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident", - "quotedETag": "\"471f04b0-c6e4-da9f-20be-895b9a064b30\"", - "unquotedETag": "471f04b0-c6e4-da9f-20be-895b9a064b30", - "_type": null + publishedIncidentDetailGuid: '2ae55318-a6b7-43be-b947-f6b29130f580', + incidentGuid: '185C2BDF5C437589E0631D09228E0F61', + incidentNumberLabel: 'V65041', + newsCreatedTimestamp: 1715629914000, + stageOfControlCode: 'HOLDING', + generalIncidentCauseCatId: 2, + newsPublicationStatusCode: 'PUBLISHED', + discoveryDate: 1715629716000, + declaredOutDate: null, + fireCentreCode: '50', + fireCentreName: 'Coastal Fire Centre', + fireOfNoteInd: true, + wasFireOfNoteInd: true, + incidentName: 'Blenkinsop Lake Fire', + incidentLocation: 'Island in Blenkinsop Lake', + traditionalTerritoryDetail: 'Blenkinsop FN', + incidentSizeEstimatedHa: 2.0, + incidentSizeMappedHa: 2.0, + incidentSizeDetail: 'Fire size is based on the last known mapped size in hectares.', + incidentCauseDetail: 'When lightning strikes an object it can release enough heat to ignite a tree or other fuels.', + wildfireCrewResourcesInd: true, + wildfireAviationResourceInd: true, + heavyEquipmentResourcesInd: true, + incidentMgmtCrewRsrcInd: true, + structureProtectionRsrcInd: false, + crewResourceCount: null, + aviationResourceCount: null, + heavyEquipmentResourceCount: null, + incidentManagementResourceCount: null, + structureProtectionResourceCount: null, + publishedTimestamp: 1715880522303, + lastUpdatedTimestamp: 1715880522299, + createDate: 1715629719759, + updateDate: 1715880522307, + latitude: '48.48435', + longitude: '-123.361566', + fireYear: 2024, + responseTypeCode: 'FULL', + responseTypeDetail: null, + fireZoneUnitIdentifier: 54, + // eslint-disable-next-line max-len + incidentOverview: '

Weather:

  • Earlier forecasts suggested strong winds overnight on May 12th for the Fort Nelson area, based on the setup of a default ridge over the North of BC, these winds arrived later than expected. 
  • The inversion overnight on May 12th led to calm stable conditions over the Fort Nelson area into the late evening/ early morning hours of May 13th.
  • Winds were 0-2km/hr and humidifies rose above 50% by the late evening which limited fire behaviour for G90267 to a creeping ground fire.
  • G90267 saw almost no overnight growth on the 12th of May.
  • Winds aloft picked up in the early morning hours on May 13th for the area, the inversion is expected to break early this morning with an increase in wind speeds following into the later morning/ early afternoon.
  • With higher forecasted wind speeds, and the low humidifies extreme fire behaviour is forecasted for the Fort Nelson area on May 13th with the dryness of the available fuels.

Resources: 

  • An Incident Management Team is in operational command of this incident. 
  • BC Wildfire Service resources are working in conjunction with The Northern Rockies Municipal Fire Department and emergency services staff.
  • 69 BCWS firefighters are responding to this incident.
  • 16 helicopters are assigned to the Fort Nelson Zone and fixed wing airtankers are available should they be required for operational objectives.
  • A Structure Protection Branch is established including: four Structure Protection Specialists, two type 2 Structure Protections Trailers and one Type 1 Structure Protection Trailer.  
  • 17 pieces of heavy equipment are assigned to this incident. 

Operations:

  • Command and operational staff from the BCWS Incident Management Team remain at the Incident Command Post in Fort Nelson alongside BCWS crews and structure protection personnel.
  • The helicopter base has been relocated in order maintain operations due to heavy smoke in the Fort Nelson area. 
  • Operations continue to be run 24 hour as the Structure Protection Branch remains established and a structure defense plan has been finalized. Structure protection and BCWS personnel are working in two main priority areas: The Fort Nelson First Nation and along the Old Alaska Highway. The Northern Rockies Regional Municipality Fire Department has structure defense resources to respond within their fire response area.
  • Overnight, structure protection personnel actioned hot spots adjacent to identified values.
  • Located in the Fort Nelson First Nation, two Structure Protection Specialists are working alongside structure protection tenders, engines, structure protection crews and a BC Wildfire Service Unit Crew.
  • Located in the Old Alaska Highway, adjacent to Highway 97, a Structure Protection Specialist is supported by a task force.
  • BCWS staff continues to work alongside the Northern Rocky Municipal Fire Department as they remain a dedicated task force in their fire protected area. 
  • Approximately a 200 hectare pocket of available fuel located adjacent to Highway 97 was removed by a planned aerial ignition. BCWS crews supported this planned ignition operation by performing small scale hand ignitions to remove any remaining unburnt fuel and to reinforce containment lines. 

Evacuation Alerts and Orders/Highway Closures:

  • Highway 97 (Alaska Highway) is currently closed north of Fort Nelson. Information on Highway 97 closures can be requested at 250-774-6956 and information on Highway 77 closures can be found on DriveBC.
  • The Northern Rockies Regional Municipality has issued an Evacuation Order for Fort Nelson and area, and the Fort Nelson First Nation, to protect public life and safety. Impacted residents can evacuate to the Fort St. John Reception Centre at the North Peace Arena. More information on the Evacuation Order is available online at EmergencyInfoBC and the Northern Rockies Regional Municipality website.
  • The Northern Rockies Regional Municipality has upgraded the already existing Evacuation Alert to an Evacuation Order. More information on the Evacuation Order is available online at EmergencyInfoBC and the Northern Rockies Regional Municipality website 
', + incidentSizeType: 'Mapped', + contactOrgUnitIdentifer: 50, + contactPhoneNumber: '250-951-4209', + contactEmailAddress: 'BCWS.COFCInformationOfficer@gov.bc.ca', + resourceDetail: null, + wildfireCrewResourcesDetail: 'There are currently 4 Initial Attack and 4 Unit Crews responding to this wildfire.', + wildfireAviationResourceDetail: 'There are currently 1 helicopters and 1 airtankers responding to this wildfire.', + heavyEquipmentResourcesDetail: 'There are currently 1 pieces of heavy equipment responding to this wildfire.', + incidentMgmtCrewRsrcDetail: 'An Incident Management Team has been assigned to this wildfire.', + structureProtectionRsrcDetail: null, + publishedUserTypeCode: null, + publishedUserGuid: null, + publishedUserUserId: null, + publishedUserName: null, + publishedIncidentRevisionCount: 116, + createUser: 'SCL\\WFNEWS_SYNC', + updateUser: 'SCL\\WFNEWS_SYNC', + selfLink: 'http://wfnews-server.pp93w9-dev.nimbus.cloud.gov.bc.ca/publishedIncident', + quotedETag: '"471f04b0-c6e4-da9f-20be-895b9a064b30"', + unquotedETag: '471f04b0-c6e4-da9f-20be-895b9a064b30', + _type: null }; const mockEvacOrders = [ @@ -113,7 +114,7 @@ const meta: Meta = { moduleMetadata({ declarations: [ IncidentTabsComponent, - IncidentInfoPanel, + IncidentInfoPanelComponent, IncidentOverviewPanel, IncidentGalleryPanel, IncidentMapsPanel @@ -134,7 +135,7 @@ export default meta; type Story = StoryObj; // Story for the default view -export const Default: Story = { +export const example: Story = { args: { incident: mockIncident, evacOrders: mockEvacOrders, @@ -142,4 +143,4 @@ export const Default: Story = { showImageWarning: false, showMapsWarning: false, } -}; \ No newline at end of file +}; diff --git a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/area-restriction-list/area-restriction-list.component.ts b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/area-restriction-list/area-restriction-list.component.ts index 5096464ea1..4b0a35d51e 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/area-restriction-list/area-restriction-list.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/area-restriction-list/area-restriction-list.component.ts @@ -68,7 +68,7 @@ export class AreaRestrictionListComponent implements OnInit { private dialog: MatDialog, protected router: Router, private capacitorService: CapacitorService, - ) {} + ) { } ngOnInit(): void { this.search(); @@ -89,72 +89,72 @@ export class AreaRestrictionListComponent implements OnInit { : null; try { - this.agolService - .getAreaRestrictions( - whereString, - location - ? { + this.agolService + .getAreaRestrictions( + whereString, + location + ? { x: location.longitude, y: location.latitude, radius: location.radius, } - : null, - { returnCentroid: true, returnGeometry: false }, - ) - .subscribe((areaRestrictions) => { - const areaRestrictionData = []; - if (areaRestrictions && areaRestrictions.features) { - for (const element of areaRestrictions.features) { - let distance = null; - if (userLocation) { - const currentLat = Number(userLocation.coords.latitude); - const currentLong = Number(userLocation.coords.longitude); - - if (element.centroid) { - distance = ( - haversineDistance( - element.centroid.y, - currentLat, - element.centroid.x, - currentLong, - ) / 1000 - ).toFixed(2); + : null, + { returnCentroid: true, returnGeometry: false }, + ) + .subscribe((areaRestrictions) => { + const areaRestrictionData = []; + if (areaRestrictions && areaRestrictions.features) { + for (const element of areaRestrictions.features) { + let distance = null; + if (userLocation) { + const currentLat = Number(userLocation.coords.latitude); + const currentLong = Number(userLocation.coords.longitude); + + if (element.centroid) { + distance = ( + haversineDistance( + element.centroid.y, + currentLat, + element.centroid.x, + currentLong, + ) / 1000 + ).toFixed(2); + } } + areaRestrictionData.push({ + protRsSysID: element.attributes.PROT_RA_SYSID, + name: element.attributes.NAME, + issuedOn: this.convertToDateTime( + element.attributes.ACCESS_STATUS_EFFECTIVE_DATE, + ), + fireCentre: element.attributes.FIRE_CENTRE_NAME, + fireZone: element.attributes.FIRE_ZONE_NAME, + bulletinUrl: element.attributes.BULLETIN_URL, + distance, + latitude: element.centroid.y, + longitude: element.centroid.x, + }); } - areaRestrictionData.push({ - protRsSysID: element.attributes.PROT_RA_SYSID, - name: element.attributes.NAME, - issuedOn: this.convertToDateTime( - element.attributes.ACCESS_STATUS_EFFECTIVE_DATE, - ), - fireCentre: element.attributes.FIRE_CENTRE_NAME, - fireZone: element.attributes.FIRE_ZONE_NAME, - bulletinUrl: element.attributes.BULLETIN_URL, - distance, - latitude: element.centroid.y, - longitude: element.centroid.x, - }); } - } - if (this.selectedSortValue !== '') { - this.selectedSortOrder = - this.selectedSortOrder === 'asc' ? 'desc' : 'asc'; - const sortVal = this.selectedSortOrder === 'asc' ? 1 : -1; - areaRestrictionData.sort((a, b) => - a[this.selectedSortValue] > b[this.selectedSortValue] - ? sortVal - : b[this.selectedSortValue] > a[this.selectedSortValue] - ? sortVal * -1 - : 0, - ); - this.selectedSortValue = ''; - } - this.dataSource.data = areaRestrictionData; - this.searchingComplete = true; - this.cdr.detectChanges(); - }); - }catch(error) { - console.error('Error retrieving area restrictions: ' + error) + if (this.selectedSortValue !== '') { + this.selectedSortOrder = + this.selectedSortOrder === 'asc' ? 'desc' : 'asc'; + const sortVal = this.selectedSortOrder === 'asc' ? 1 : -1; + areaRestrictionData.sort((a, b) => + a[this.selectedSortValue] > b[this.selectedSortValue] + ? sortVal + : b[this.selectedSortValue] > a[this.selectedSortValue] + ? sortVal * -1 + : 0, + ); + this.selectedSortValue = ''; + } + this.dataSource.data = areaRestrictionData; + this.searchingComplete = true; + this.cdr.detectChanges(); + }); + } catch (error) { + console.error('Error retrieving area restrictions: ' + error); } } diff --git a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/bans-list/bans-list.component.ts b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/bans-list/bans-list.component.ts index 7e3262de57..0f0fe1d9eb 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/bans-list/bans-list.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/bans-list/bans-list.component.ts @@ -68,7 +68,7 @@ export class BansListComponent implements OnInit { private breakpointObserver: BreakpointObserver, private dialog: MatDialog, private capacitorService: CapacitorService, - ) {} + ) { } ngOnInit(): void { this.search(); @@ -80,6 +80,7 @@ export class BansListComponent implements OnInit { let whereString = ''; if (this.searchText && this.searchText.length > 0) { + // eslint-disable-next-line max-len whereString += `(ACCESS_PROHIBITION_DESCRIPTION LIKE '%${this.searchText}%' OR FIRE_CENTRE_NAME LIKE '%${this.searchText}%' OR TYPE LIKE '%${this.searchText}%') AND (`; } @@ -101,24 +102,24 @@ export class BansListComponent implements OnInit { } if (whereString.startsWith(' OR ')) { -whereString = whereString.substring(3); -} + whereString = whereString.substring(3); + } if (whereString.endsWith(' AND ()')) { -whereString = whereString.substring(0, whereString.length - 7); -} + whereString = whereString.substring(0, whereString.length - 7); + } if (whereString === '') { -whereString = null; -} + whereString = null; + } this.agolService .getBansAndProhibitions( whereString, location ? { - x: location.longitude, - y: location.latitude, - radius: location.radius, - } + x: location.longitude, + y: location.latitude, + radius: location.radius, + } : null, { returnCentroid: true, returnGeometry: false }, ) diff --git a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/evac-list/evac-list.component.ts b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/evac-list/evac-list.component.ts index 17401528c6..06601829b5 100644 --- a/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/evac-list/evac-list.component.ts +++ b/client/wfnews-war/src/main/angular/src/app/components/wildfires-list-header/evac-list/evac-list.component.ts @@ -72,7 +72,7 @@ export class EvacListComponent implements OnInit { private breakpointObserver: BreakpointObserver, private dialog: MatDialog, private capacitorService: CapacitorService - ) {} + ) { } ngOnInit(): void { this.search(); @@ -90,6 +90,7 @@ export class EvacListComponent implements OnInit { let whereString = ''; if (this.searchText && this.searchText.length > 0) { + // eslint-disable-next-line max-len whereString += `(EVENT_NAME LIKE '%${this.searchText}%' OR ORDER_ALERT_STATUS LIKE '%${this.searchText}%' OR ISSUING_AGENCY LIKE '%${this.searchText}%') AND (`; } @@ -106,83 +107,83 @@ export class EvacListComponent implements OnInit { } if (whereString.startsWith(' OR ')) { -whereString = whereString.substring(3); -} + whereString = whereString.substring(3); + } if (whereString.endsWith(' AND ()')) { -whereString = whereString.substring(0, whereString.length - 7); -} + whereString = whereString.substring(0, whereString.length - 7); + } if (whereString === '') { -whereString = null; -} + whereString = null; + } - try { - this.agolService - .getEvacOrders( - whereString, - location - ? { + try { + this.agolService + .getEvacOrders( + whereString, + location + ? { x: location.longitude, y: location.latitude, radius: location.radius, } - : null, - { returnCentroid: userLocation !== null, returnGeometry: false }) - .subscribe((evacs) => { - const evacData = []; - if (evacs && evacs.features) { - for (const element of evacs.features.filter( - (e) => e.attributes.EVENT_TYPE.toLowerCase() === 'wildfire' || e.attributes.EVENT_TYPE.toLowerCase() === 'fire', - )) { - let distance = null; - if (userLocation) { - const currentLat = Number(userLocation.coords.latitude); - const currentLong = Number(userLocation.coords.longitude); + : null, + { returnCentroid: userLocation !== null, returnGeometry: false }) + .subscribe((evacs) => { + const evacData = []; + if (evacs && evacs.features) { + for (const element of evacs.features.filter( + (e) => e.attributes.EVENT_TYPE.toLowerCase() === 'wildfire' || e.attributes.EVENT_TYPE.toLowerCase() === 'fire', + )) { + let distance = null; + if (userLocation) { + const currentLat = Number(userLocation.coords.latitude); + const currentLong = Number(userLocation.coords.longitude); - if (element.centroid) { - distance = ( - haversineDistance( - element.centroid.y, - currentLat, - element.centroid.x, - currentLong, - ) / 1000 - ).toFixed(2); + if (element.centroid) { + distance = ( + haversineDistance( + element.centroid.y, + currentLat, + element.centroid.x, + currentLong, + ) / 1000 + ).toFixed(2); + } } + evacData.push({ + name: element.attributes.EVENT_NAME, + eventType: element.attributes.EVENT_TYPE, + status: element.attributes.ORDER_ALERT_STATUS, + agency: element.attributes.ISSUING_AGENCY, + preOcCode: element.attributes.PREOC_CODE, + emrgOAAsysID: element.attributes.EMRG_OAA_SYSID, + issuedOn: this.convertToDateTime(element.attributes.DATE_MODIFIED), + distance, + latitude: element.centroid.y, + longitude: element.centroid.x, + eventNumber: element.attributes.EVENT_NUMBER + }); } - evacData.push({ - name: element.attributes.EVENT_NAME, - eventType: element.attributes.EVENT_TYPE, - status: element.attributes.ORDER_ALERT_STATUS, - agency: element.attributes.ISSUING_AGENCY, - preOcCode: element.attributes.PREOC_CODE, - emrgOAAsysID: element.attributes.EMRG_OAA_SYSID, - issuedOn: this.convertToDateTime(element.attributes.DATE_MODIFIED), - distance, - latitude: element.centroid.y, - longitude: element.centroid.x, - eventNumber: element.attributes.EVENT_NUMBER - }); } - } - if (this.selectedSortValue !== '') { - this.selectedSortOrder = - this.selectedSortOrder === 'asc' ? 'desc' : 'asc'; - const sortVal = this.selectedSortOrder === 'asc' ? 1 : -1; - evacData.sort((a, b) => - a[this.selectedSortValue] > b[this.selectedSortValue] - ? sortVal - : b[this.selectedSortValue] > a[this.selectedSortValue] - ? sortVal * -1 - : 0, - ); - this.selectedSortValue = ''; - } - this.dataSource.data = evacData; - this.searchingComplete = true; - this.cdr.detectChanges(); - }); - }catch(error) { - console.error('Error retrieving evac orders: ' + error) + if (this.selectedSortValue !== '') { + this.selectedSortOrder = + this.selectedSortOrder === 'asc' ? 'desc' : 'asc'; + const sortVal = this.selectedSortOrder === 'asc' ? 1 : -1; + evacData.sort((a, b) => + a[this.selectedSortValue] > b[this.selectedSortValue] + ? sortVal + : b[this.selectedSortValue] > a[this.selectedSortValue] + ? sortVal * -1 + : 0, + ); + this.selectedSortValue = ''; + } + this.dataSource.data = evacData; + this.searchingComplete = true; + this.cdr.detectChanges(); + }); + } catch (error) { + console.error('Error retrieving evac orders: ' + error); } }