Skip to content

Commit

Permalink
Merge pull request #1367 from wri/MAPB-181_deforestation_layers_issue
Browse files Browse the repository at this point in the history
corrected issue with time slider for integrated alert layers
  • Loading branch information
davidlstarr authored Oct 19, 2023
2 parents 3d5905f + b591147 commit 6f38013
Show file tree
Hide file tree
Showing 6 changed files with 167 additions and 242 deletions.
4 changes: 3 additions & 1 deletion src/js/components/legend/generateLegendItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,9 @@ const LegendItems = (props: LegendItemProps): JSX.Element => {

return (
<div className="layer-item" key={layer.id + `${i}`}>
<p className="layer-title">{layer.title === 'GFW Integrated Alerts' ? integratedAlertLabel : layer.title}</p>
<p className="layer-title">
{layer.title === 'Integrated Deforestation Alerts' ? integratedAlertLabel : layer.title}
</p>
{labelIcons}
</div>
);
Expand Down
126 changes: 37 additions & 89 deletions src/js/components/sharedComponents/IntegratedAlertControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,17 @@ import * as React from 'react';
import { DATE_PICKER_START_DATES, LAYER_IDS } from '../../../../configs/layer-config';
import { mapController } from '../../controllers/mapController';
import { LayerFactory } from '../../helpers/LayerFactory';
import {
setIntegratedAlertLayerEnd,
setIntegratedAlertLayerStart,
setHighConfidenceConfirmed,
setGladStart,
setGladEnd,
setGlad2Start,
setGlad2End,
setRaddAlertEnd,
setRaddAlertStart,
setGeographicCoverage,
} from '../../store/appState/actions';
import { setHighConfidenceConfirmed, setGeographicCoverage } from '../../store/appState/actions';
import {
geoCoverageConfig,
layerControlsTranslations,
showConfidenceAlertsConfig,
} from '../../../../configs/translations/leftPanel.translations';
import {
onEndDateChange,
onStartDateChange,
displayGeographicCoverageLayer,
} from './helpers/IntegratedAlertControlsHelper';
import DatePicker from 'react-datepicker';
import styled from 'styled-components';

Expand All @@ -40,30 +34,26 @@ interface GladControlsProps {
selectedLanguage: string;
type?: string;
}

const IntegratedAlertControls = (props: GladControlsProps): JSX.Element => {
const dispatch = useDispatch();
const highConfidenceConfirmed = useSelector((store: RootState) => store.appState.leftPanel.highConfidenceConfirmed);
const geographicCoverage = useSelector((store: RootState) => store.appState.leftPanel.geographicCoverage);

const gfwIntegratedStart = useSelector((store: RootState) => store.appState.leftPanel.gfwIntegratedStart);

const gfwIntegratedEnd = useSelector((store: RootState) => store.appState.leftPanel.gfwIntegratedEnd);
const integratedAlertLayer = useSelector((store: RootState) => store.appState.leftPanel.integratedAlertLayer);

const gladStart = useSelector((store: RootState) => store.appState.leftPanel.gladStart);
const gladEnd = useSelector((store: RootState) => store.appState.leftPanel.gladEnd);

const allAvailableLayers = useSelector((store: RootState) => store.mapviewState.allAvailableLayers);
const glad2Start = useSelector((store: RootState) => store.appState.leftPanel.glad2Start);
const glad2End = useSelector((store: RootState) => store.appState.leftPanel.glad2End);

const gladStart = useSelector((store: RootState) => store.appState.leftPanel.gladStart);
const gladEnd = useSelector((store: RootState) => store.appState.leftPanel.gladEnd);
const raddAlertStart = useSelector((store: RootState) => store.appState.leftPanel.raddAlertStart);
const raddAlertEnd = useSelector((store: RootState) => store.appState.leftPanel.raddAlertEnd);
const gfwIntegratedStart = useSelector((store: RootState) => store.appState.leftPanel.gfwIntegratedStart);

const [startDate, setStartDate] = React.useState(String(DATE_PICKER_START_DATES.GFW_INTEGRATED_ALERTS));
const [startDateUnformatted, setStartDateUnformatted] = React.useState(
String(DATE_PICKER_START_DATES.GFW_INTEGRATED_ALERTS)
);
const [endDateUnformatted, setEndDateUnformatted] = React.useState(gfwIntegratedEnd);
const [endDate, setEndDate] = React.useState(gfwIntegratedEnd);

async function handleStartDateChange(day: any) {
Expand All @@ -76,30 +66,7 @@ const IntegratedAlertControls = (props: GladControlsProps): JSX.Element => {
setStartDate(dFormat);
setStartDateUnformatted(day);

//@ts-ignore
const start = new Date(dFormat).getJulian();
//@ts-ignore
const end = new Date(endDate).getJulian();

if (integratedAlertLayer === LAYER_IDS.GFW_INTEGRATED_ALERTS) {
await mapController.toggleGladLayer({ id: LAYER_IDS.GFW_INTEGRATED_ALERTS, start, end });

dispatch(setIntegratedAlertLayerStart(dFormat));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_ALERTS) {
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_ALERTS, start, end });

const selectedLayer = mapController._map!.findLayerById(LAYER_IDS.GLAD_ALERTS);
selectedLayer.visible = true;
dispatch(setGladStart(dFormat));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_S2_ALERTS) {
dispatch(setGlad2Start(dFormat));

await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_S2_ALERTS, start, end });
} else if (integratedAlertLayer === LAYER_IDS.RADD_ALERTS) {
dispatch(setRaddAlertStart(dFormat));

await mapController.toggleGladLayer({ id: LAYER_IDS.RADD_ALERTS, start, end });
}
onStartDateChange(dFormat, endDate);
}

async function handleEndDateChange(day: any) {
Expand All @@ -110,54 +77,27 @@ const IntegratedAlertControls = (props: GladControlsProps): JSX.Element => {
const dFormat = date;

setEndDate(dFormat);
setEndDateUnformatted(day);
//@ts-ignore
const end = new Date(dFormat).getJulian();
let start;

if (integratedAlertLayer === LAYER_IDS.GFW_INTEGRATED_ALERTS) {
//@ts-ignore
start = new Date(gfwIntegratedStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GFW_INTEGRATED_ALERTS, start, end });

dispatch(setIntegratedAlertLayerEnd(date));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_ALERTS) {
//@ts-ignore

start = new Date(gladStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_ALERTS, start, end });

const selectedLayer = mapController._map!.findLayerById(LAYER_IDS.GLAD_ALERTS);
selectedLayer.visible = true;
dispatch(setGladEnd(date));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_S2_ALERTS) {
dispatch(setGlad2End(date));

//@ts-ignore
start = new Date(glad2Start).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_S2_ALERTS, start, end });
} else if (integratedAlertLayer === LAYER_IDS.RADD_ALERTS) {
dispatch(setRaddAlertEnd(date));
//@ts-ignore

start = new Date(raddAlertStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.RADD_ALERTS, start, end });
}
onEndDateChange(date, dFormat);
}

async function showOnlyHighConfidenceToggle() {
dispatch(setHighConfidenceConfirmed(!highConfidenceConfirmed));
const gfwIntegratedLayerOld: any = mapController._map!.findLayerById(LAYER_IDS.GFW_INTEGRATED_ALERTS);
mapController._map?.remove(gfwIntegratedLayerOld);
const gfwIntegratedLayerNew: any = LayerFactory(mapController._mapview, props.layerConfig);
gfwIntegratedLayerNew.highConfidenceConfirmed = !highConfidenceConfirmed;
mapController._map?.add(gfwIntegratedLayerNew);
}

async function showGeographicCoverage() {
dispatch(setGeographicCoverage(!geographicCoverage));
mapController.displayLayerByIntegratedAlertLayer(integratedAlertLayer);
mapController.displayGeographicCoverageLayer(integratedAlertLayer, geographicCoverage);
if (integratedAlertLayer === 'GFW_INTEGRATED_ALERTS') {
const gfwIntegratedLayerOld: any = mapController._map!.findLayerById(LAYER_IDS.GFW_INTEGRATED_ALERTS);
mapController._map?.remove(gfwIntegratedLayerOld);
const gfwIntegratedLayerNew: any = LayerFactory(mapController._mapview, props.layerConfig);
gfwIntegratedLayerNew.highConfidenceConfirmed = !highConfidenceConfirmed;
mapController._map?.add(gfwIntegratedLayerNew);
} else {
const gladLayerOld: any = mapController._map!.findLayerById(integratedAlertLayer);
mapController._map?.remove(gladLayerOld);
const gladLayerConfig: any = allAvailableLayers.filter((layer: any) => layer.id === integratedAlertLayer);
const gladLayerNew: any = await LayerFactory(mapController._mapview, gladLayerConfig[0]);
gladLayerNew.confirmed = !highConfidenceConfirmed;
mapController._map?.add(gladLayerNew);
const selectedLayer = mapController._map!.findLayerById(integratedAlertLayer);
selectedLayer.visible = true;
}
}

const handleDateToggle = () => {
Expand All @@ -176,15 +116,22 @@ const IntegratedAlertControls = (props: GladControlsProps): JSX.Element => {
return { start: startDate, end: endDate };
};

async function showGeographicCoverage() {
dispatch(setGeographicCoverage(!geographicCoverage));
displayGeographicCoverageLayer(integratedAlertLayer, geographicCoverage);
}

const confidenceAlertLabel = showConfidenceAlertsConfig[props.selectedLanguage];
const geoCoverageLabel = geoCoverageConfig[props.selectedLanguage];

return (
<div className="glad-control-wrapper">
<>
<div className="glad-control-container">
<div className="layer-checkbox">
<CheckboxWrapper customColorTheme={props.customColorTheme}>
<input
title="High and Highest Confidence Alerts"
type="checkbox"
name="styled-checkbox"
className="styled-checkbox"
Expand All @@ -201,6 +148,7 @@ const IntegratedAlertControls = (props: GladControlsProps): JSX.Element => {
<div className="layer-checkbox">
<CheckboxWrapper customColorTheme={props.customColorTheme}>
<input
title="Geographic Coverage"
type="checkbox"
name="styled-checkbox"
className="styled-checkbox"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const SelectIntegratedAlertLayer = (): JSX.Element => {
function handleDensityButtonClick(e): void {
dispatch(setHighConfidenceConfirmed(false));
dispatch(setGeographicCoverage(false));
const integratedAlertLayers = [e.target[0].value, e.target[1].value, e.target[2].value];
const integratedAlertLayers = [e.target[0].value, e.target[1].value, e.target[2].value, e.target[3].value];
mapController.updateGFWLayer(e.target.value, integratedAlertLayers);
dispatch(setIntegratedAlertLayer(e.target.value));
dispatch(setIntegratedAlertLayerLabel(e.target.selectedOptions[0].text));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import { GEOGRAPHIC_COVER_LAYER_URL, LAYER_IDS } from '../../../../../configs/layer-config';
import { loadModules } from 'esri-loader';
import { mapController } from '../../../controllers/mapController';
import { createGladS2Layer } from '../../../layers/GladS2Layer';
import { createRadd } from '../../../layers/RaddLayer';
import store from '../../../../../src/js/store';
import {
setGlad2End,
setGlad2Start,
setGladEnd,
setGladStart,
setIntegratedAlertLayerEnd,
setIntegratedAlertLayerStart,
setRaddAlertEnd,
setRaddAlertStart,
} from '../../../store/appState/actions';

const gfwIntegratedStart = store.getState().appState.leftPanel.gfwIntegratedStart;
const glad2Start = store.getState().appState.leftPanel.glad2Start;
const gladStart = store.getState().appState.leftPanel.gladStart;
const raddAlertStart = store.getState().appState.leftPanel.raddAlertStart;

export const onStartDateChange = async (dFormat: string, endDate: string) => {
const integratedAlertLayer = store.getState().appState.leftPanel.integratedAlertLayer;

//@ts-ignore
const start = new Date(dFormat).getJulian();
//@ts-ignore
const end = new Date(endDate).getJulian();

if (integratedAlertLayer === LAYER_IDS.GFW_INTEGRATED_ALERTS) {
await mapController.toggleGladLayer({ id: LAYER_IDS.GFW_INTEGRATED_ALERTS, start, end });

store.dispatch(setIntegratedAlertLayerStart(dFormat));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_ALERTS) {
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_ALERTS, start, end });

const selectedLayer = mapController._map!.findLayerById(LAYER_IDS.GLAD_ALERTS);
selectedLayer.visible = true;
store.dispatch(setGladStart(dFormat));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_S2_ALERTS) {
store.dispatch(setGlad2Start(dFormat));

await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_S2_ALERTS, start, end });
} else if (integratedAlertLayer === LAYER_IDS.RADD_ALERTS) {
store.dispatch(setRaddAlertStart(dFormat));

await mapController.toggleGladLayer({ id: LAYER_IDS.RADD_ALERTS, start, end });
}
};

export const onEndDateChange = async (date: string, dFormat: string) => {
let start;
const end = new Date(dFormat).getJulian();
const integratedAlertLayer = store.getState().appState.leftPanel.integratedAlertLayer;

if (integratedAlertLayer === LAYER_IDS.GFW_INTEGRATED_ALERTS) {
//@ts-ignore
start = new Date(gfwIntegratedStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GFW_INTEGRATED_ALERTS, start, end });

store.dispatch(setIntegratedAlertLayerEnd(date));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_ALERTS) {
//@ts-ignore

start = new Date(gladStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_ALERTS, start, end });

const selectedLayer = mapController._map!.findLayerById(LAYER_IDS.GLAD_ALERTS);
selectedLayer.visible = true;
store.dispatch(setGladEnd(date));
} else if (integratedAlertLayer === LAYER_IDS.GLAD_S2_ALERTS) {
store.dispatch(setGlad2End(date));

//@ts-ignore
start = new Date(glad2Start).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.GLAD_S2_ALERTS, start, end });
} else if (integratedAlertLayer === LAYER_IDS.RADD_ALERTS) {
store.dispatch(setRaddAlertEnd(date));
//@ts-ignore

start = new Date(raddAlertStart).getJulian();
await mapController.toggleGladLayer({ id: LAYER_IDS.RADD_ALERTS, start, end });
}
};

export const displayGeographicCoverageLayer = async (layerId: string, isVisible: boolean) => {
const [VectorTileLayer] = await loadModules(['esri/layers/VectorTileLayer']);

let layer;

if (layerId === LAYER_IDS.GFW_INTEGRATED_ALERTS || layerId === LAYER_IDS.GLAD_ALERTS) {
layer = new VectorTileLayer({
url: GEOGRAPHIC_COVER_LAYER_URL.UMD_GLAD_LANDSAT_ALERTS,
id: LAYER_IDS.GEOGRAPHIC_COVERAGE_LAYER,
});
}
if (layerId === LAYER_IDS.GLAD_S2_ALERTS) {
const gladS2Layer = await createGladS2Layer();
layer = new gladS2Layer({
urlTemplate: GEOGRAPHIC_COVER_LAYER_URL.UMD_GLAD_SENTINEL_ALERTS,
opacity: '.5',
view: mapController._mapview,
id: LAYER_IDS.GEOGRAPHIC_COVERAGE_LAYER,
});
}

if (layerId === LAYER_IDS.RADD_ALERTS) {
const raddLayer = await createRadd();
layer = new raddLayer({
urlTemplate: GEOGRAPHIC_COVER_LAYER_URL.WUR_RADD_COVERAGE,
opacity: '.5',
view: mapController._mapview,
id: LAYER_IDS.GEOGRAPHIC_COVERAGE_LAYER,
});
}

if (isVisible) {
const geographicCoverageLayerOld: any = mapController._map!.findLayerById(LAYER_IDS.GEOGRAPHIC_COVERAGE_LAYER);
mapController._map?.remove(geographicCoverageLayerOld);
} else {
mapController._map?.add(layer);
}
};
Loading

0 comments on commit 6f38013

Please sign in to comment.