From a4ef58276728ec859a1a1a6cf1220f0a6bd45dfe Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Fri, 29 Dec 2023 09:27:05 -0500 Subject: [PATCH 1/8] Most stories preloaded --- web/js/containers/tour.js | 30 ++++++++++++++++++++++++++- web/js/map/layerbuilder.js | 5 ++++- web/js/modules/map/util.js | 42 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 5a9e1c4d7a..6416421a08 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -39,6 +39,7 @@ import { changeTab as changeTabAction } from '../modules/sidebar/actions'; import ErrorBoundary from './error-boundary'; import history from '../main'; import util from '../util/util'; +import { promiseImageryForTour } from '../modules/map/util'; const { HIDE_TOUR } = safeLocalStorage.keys; @@ -138,7 +139,7 @@ class Tour extends React.Component { selectTour(e, currentStory, currentStoryIndex, currentStoryId) { const { - config, renderedPalettes, selectTour, processStepLink, isKioskModeActive, isEmbedModeActive, + config, renderedPalettes, selectTour, processStepLink, isKioskModeActive, isEmbedModeActive, preProcessStepLink, promiseImageryForTour, } = this.props; if (e) e.preventDefault(); const kioskParam = this.getKioskParam(isKioskModeActive); @@ -157,6 +158,13 @@ class Tour extends React.Component { this.fetchMetadata(currentStory, 0); const storyStep = currentStory.steps[0]; const transitionParam = getTransitionAttr(storyStep.transition); + currentStory.steps.forEach((step) => { + preProcessStepLink( + `${step.stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, + config, + promiseImageryForTour, + ); + }); processStepLink( currentStoryId, 1, @@ -522,6 +530,24 @@ const mapDispatchToProps = (dispatch) => ({ dispatch({ type: LOCATION_POP_ACTION, payload: location }); } }, + preProcessStepLink: async (search, config, promiseImageryForTour) => { + search = search.split('/?').pop(); + const parameters = util.fromQueryString(search); + let layers = []; + const promises = []; + + if (parameters.l) { + layers = layersParse12(parameters.l, config); + layers = uniqBy(layers, 'id'); + promises.push(promiseImageryForTour(layers, parameters.t)); + if (parameters.l1) { + layers = layersParse12(parameters.l1, config); + layers = uniqBy(layers, 'id'); + promises.push(promiseImageryForTour(layers, parameters.t1, 'activeB')); + } + } + await Promise.all(promises); + }, startTour: () => { dispatch(startTourAction()); }, @@ -561,6 +587,7 @@ const mapStateToProps = (state) => { screenHeight, renderedPalettes: palettes.rendered, activeTab: sidebar.activeTab, + promiseImageryForTour: (layers, dateString, activeString) => promiseImageryForTour(state, layers, dateString, activeString), }; }; @@ -582,6 +609,7 @@ Tour.propTypes = { isActive: PropTypes.bool, isKioskModeActive: PropTypes.bool, processStepLink: PropTypes.func, + preProcessStepLink: PropTypes.func, renderedPalettes: PropTypes.object, resetProductPicker: PropTypes.func, screenHeight: PropTypes.number, diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 71ee646a2a..a180ea222b 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -115,6 +115,9 @@ export default function mapLayerBuilder(config, cache, store) { if (isVectorStyleActive(def.id, activeGroupStr, state)) { style = getVectorStyleKeys(def.id, undefined, state); } + if (options.style) { + style = options.style; + } return [layerId, projId, date, style, activeGroupStr].join(':'); }; @@ -241,7 +244,7 @@ export default function mapLayerBuilder(config, cache, store) { previousDate, } = getRequestDates(def, options); const date = closestDate; - if (date) { + if (date && !options.date) { options.date = date; } const dateOptions = { date, nextDate, previousDate }; diff --git a/web/js/modules/map/util.js b/web/js/modules/map/util.js index 5e1cdc65ee..5433169af2 100644 --- a/web/js/modules/map/util.js +++ b/web/js/modules/map/util.js @@ -11,6 +11,7 @@ import OlRendererCanvasTileLayer from 'ol/renderer/canvas/TileLayer'; import Promise from 'bluebird'; import { encode } from '../link/util'; import { getActiveVisibleLayersAtDate } from '../layers/selectors'; +import { tryCatchDate } from '../date/util'; /* * Set default extent according to time of day: @@ -305,3 +306,44 @@ export async function promiseImageryForTime(state, date, activeString) { selected.getView().changed(); return date; } + +/** + * Trigger tile requests for all given layers on a given date. + * @method promiseImageryForTour + */ +export async function promiseImageryForTour(state, layers, dateString, activeString) { + const { map } = state; + if (!map.ui.proj) return; + const { + cache, selected, createLayer, layerKey, + } = map.ui; + const appNow = lodashGet(state, 'date.appNow'); + const date = tryCatchDate(dateString, appNow); + await Promise.all(layers.map(async (layer) => { + if (layer.type === 'granule' || layer.type === 'ttiler') { + return Promise.resolve(); + } + const options = { date, group: activeString }; + const keys = []; + if (layer.custom) { + keys.push(`palette=${layer.custom}`); + } + if (layer.min) { + keys.push(`min=${layer.min}`); + } + if (layer.max) { + keys.push(`max=${layer.max}`); + } + if (layer.squash) { + keys.push('squash'); + } + if (keys.length > 0) { + options.style = keys.join(','); + } + + const key = layerKey(layer, options, state); + const layerGroup = cache.getItem(key) || await createLayer(layer, options); + return promiseLayerGroup(layerGroup, selected); + })); + selected.getView().changed(); +} From 374a0f9dd3614603ad4905dcab4991efcd2d3f50 Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Wed, 10 Jan 2024 10:19:48 -0500 Subject: [PATCH 2/8] Custom palette issues --- web/js/containers/tour.js | 6 ++++++ web/js/map/layerbuilder.js | 2 +- web/js/modules/palettes/selectors.js | 5 +++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 6416421a08..4d34365823 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -546,6 +546,12 @@ const mapDispatchToProps = (dispatch) => ({ promises.push(promiseImageryForTour(layers, parameters.t1, 'activeB')); } } + preloadPalettes(layers, {}, false).then((obj) => { + dispatch({ + type: BULK_PALETTE_RENDERING_SUCCESS, + rendered: obj.rendered, + }); + }); await Promise.all(promises); }, startTour: () => { diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index a180ea222b..cb330706d7 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -115,7 +115,7 @@ export default function mapLayerBuilder(config, cache, store) { if (isVectorStyleActive(def.id, activeGroupStr, state)) { style = getVectorStyleKeys(def.id, undefined, state); } - if (options.style) { + if (def.custom && options.style) { style = options.style; } return [layerId, projId, date, style, activeGroupStr].join(':'); diff --git a/web/js/modules/palettes/selectors.js b/web/js/modules/palettes/selectors.js index 08d317456b..48362bee5b 100644 --- a/web/js/modules/palettes/selectors.js +++ b/web/js/modules/palettes/selectors.js @@ -350,15 +350,16 @@ export function getKey(layerId, groupStr, state) { return ''; } const def = getPalette(layerId, undefined, groupStr, state); + const { values } = getPalette(layerId, 0, groupStr, state).entries; const keys = []; if (def.custom) { keys.push(`palette=${def.custom}`); } if (def.min) { - keys.push(`min=${def.min}`); + keys.push(`min=${getMinValue(values[def.min])}`); } if (def.max) { - keys.push(`max=${def.max}`); + keys.push(`max=${getMinValue(values[def.max])}`); } if (def.squash) { keys.push('squash'); From ddded2f58be458862b8b4c2ad85d98f149baca10 Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Tue, 16 Jan 2024 15:03:08 -0500 Subject: [PATCH 3/8] Custom palette implemented --- web/js/containers/tour.js | 43 ++++++++++++++++++---------- web/js/map/layerbuilder.js | 11 +++++++ web/js/modules/map/util.js | 1 - web/js/modules/palettes/constants.js | 1 + web/js/modules/palettes/reducers.js | 6 ++++ web/js/modules/palettes/util.js | 2 ++ 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 4d34365823..9e072b6ae6 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -24,7 +24,10 @@ import { import { clearCustoms, } from '../modules/palettes/actions'; -import { BULK_PALETTE_RENDERING_SUCCESS } from '../modules/palettes/constants'; +import { + BULK_PALETTE_RENDERING_SUCCESS, + BULK_PALETTE_PRELOADING_SUCCESS, +} from '../modules/palettes/constants'; import { stop as stopAnimation } from '../modules/animation/actions'; import { onClose as closeModal } from '../modules/modal/actions'; import { LOCATION_POP_ACTION } from '../redux-location-state-customs'; @@ -158,13 +161,6 @@ class Tour extends React.Component { this.fetchMetadata(currentStory, 0); const storyStep = currentStory.steps[0]; const transitionParam = getTransitionAttr(storyStep.transition); - currentStory.steps.forEach((step) => { - preProcessStepLink( - `${step.stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, - config, - promiseImageryForTour, - ); - }); processStepLink( currentStoryId, 1, @@ -173,6 +169,13 @@ class Tour extends React.Component { config, renderedPalettes, ); + currentStory.steps.forEach((step) => { + preProcessStepLink( + `${step.stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, + config, + promiseImageryForTour, + ); + }); } fetchMetadata(currentStory, stepIndex) { @@ -524,6 +527,10 @@ const mapDispatchToProps = (dispatch) => ({ type: BULK_PALETTE_RENDERING_SUCCESS, rendered: obj.rendered, }); + dispatch({ + type: BULK_PALETTE_PRELOADING_SUCCESS, + tourStoryPalettes: obj.rendered, + }); dispatch({ type: LOCATION_POP_ACTION, payload: location }); }); } else { @@ -535,24 +542,30 @@ const mapDispatchToProps = (dispatch) => ({ const parameters = util.fromQueryString(search); let layers = []; const promises = []; + const temp = []; if (parameters.l) { layers = layersParse12(parameters.l, config); layers = uniqBy(layers, 'id'); - promises.push(promiseImageryForTour(layers, parameters.t)); + temp.push({ layers, dateString: parameters.t }); if (parameters.l1) { layers = layersParse12(parameters.l1, config); layers = uniqBy(layers, 'id'); - promises.push(promiseImageryForTour(layers, parameters.t1, 'activeB')); + temp.push({ layers, dateString: parameters.t1, activeString: 'activeB' }); } } - preloadPalettes(layers, {}, false).then((obj) => { - dispatch({ - type: BULK_PALETTE_RENDERING_SUCCESS, - rendered: obj.rendered, + console.log(layers); + preloadPalettes(layers, {}, false).then(async (obj) => { + console.log(obj); + await dispatch({ + type: BULK_PALETTE_PRELOADING_SUCCESS, + tourStoryPalettes: obj.rendered, + }); + temp.forEach((set) => { + promises.push(promiseImageryForTour(set.layers, set.dateString, set.activeString)); }); + await Promise.all(promises); }); - await Promise.all(promises); }, startTour: () => { dispatch(startTourAction()); diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index cb330706d7..a4f6cfb499 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -41,6 +41,9 @@ import { applyStyle, } from '../modules/vector-styles/selectors'; import { nearestInterval } from '../modules/layers/util'; +import { + lookup as createLookup, +} from '../modules/palettes/util'; import { LEFT_WING_EXTENT, RIGHT_WING_EXTENT, LEFT_WING_ORIGIN, RIGHT_WING_ORIGIN, CENTER_MAP_ORIGIN, } from '../modules/map/constants'; @@ -377,9 +380,17 @@ export default function mapLayerBuilder(config, cache, store) { wrapX: false, style: typeof style === 'undefined' ? 'default' : style, }; + console.log(def.id, def, options, state.palettes); if (isPaletteActive(id, options.group, state)) { const lookup = getPaletteLookup(id, options.group, state); + console.log(def.id, lookup); + sourceOptions.tileClass = lookupFactory(lookup, sourceOptions); + } else if (def.palette && def.custom && state.palettes.tourStoryPalettes && state.palettes.tourStoryPalettes[def.palette.id]) { + const lookup = createLookup(state.palettes.tourStoryPalettes[def.palette.id].maps[0].entries, state.palettes.custom[def.custom[0]]); + console.log(def.id, lookup); sourceOptions.tileClass = lookupFactory(lookup, sourceOptions); + // Lookup is now working, so custom palette is properly preloaded + // Still TODO: fix min & max, still not working when preloading } const tileSource = new OlSourceWMTS(sourceOptions); diff --git a/web/js/modules/map/util.js b/web/js/modules/map/util.js index 5433169af2..e51932bee7 100644 --- a/web/js/modules/map/util.js +++ b/web/js/modules/map/util.js @@ -345,5 +345,4 @@ export async function promiseImageryForTour(state, layers, dateString, activeStr const layerGroup = cache.getItem(key) || await createLayer(layer, options); return promiseLayerGroup(layerGroup, selected); })); - selected.getView().changed(); } diff --git a/web/js/modules/palettes/constants.js b/web/js/modules/palettes/constants.js index a843678b0f..0fed270830 100644 --- a/web/js/modules/palettes/constants.js +++ b/web/js/modules/palettes/constants.js @@ -10,6 +10,7 @@ export const CLEAR_CUSTOMS = 'PALETTES/CLEAR_CUSTOMS'; export const SET_CUSTOM = 'PALETTES/SET_CUSTOM'; export const LOADED_CUSTOM_PALETTES = 'PALETTES/LOADED_CUSTOM_PALETTES'; export const BULK_PALETTE_RENDERING_SUCCESS = 'PALETTES/BULK_PALETTE_RENDERING_SUCCESS'; +export const BULK_PALETTE_PRELOADING_SUCCESS = 'PALETTES/BULK_PALETTE_PRELOADING_SUCCESS'; export const PALETTE_STRINGS_PERMALINK_ARRAY = [ 'palette', diff --git a/web/js/modules/palettes/reducers.js b/web/js/modules/palettes/reducers.js index 8bd01dc404..1bc7f31ade 100644 --- a/web/js/modules/palettes/reducers.js +++ b/web/js/modules/palettes/reducers.js @@ -12,6 +12,7 @@ import { SET_THRESHOLD_RANGE_AND_SQUASH, LOADED_CUSTOM_PALETTES, BULK_PALETTE_RENDERING_SUCCESS, + BULK_PALETTE_PRELOADING_SUCCESS, CLEAR_CUSTOM, SET_DISABLED_CLASSIFICATION, } from './constants'; @@ -23,6 +24,7 @@ export const defaultPaletteState = { active: {}, activeB: {}, isLoading: {}, + tourStoryPalettes: {}, }; export function getInitialPaletteState(config) { const rendered = lodashGet(config, 'palettes.rendered') || {}; @@ -46,6 +48,10 @@ export function paletteReducer(state = defaultPaletteState, action) { return update(state, { rendered: { $merge: action.rendered || {} }, }); + case BULK_PALETTE_PRELOADING_SUCCESS: + return update(state, { + tourStoryPalettes: { $merge: action.tourStoryPalettes || {} }, + }); case REQUEST_PALETTE_SUCCESS: { const isLoading = update(state.isLoading, { $unset: [action.id] }); return lodashAssign({}, state, { diff --git a/web/js/modules/palettes/util.js b/web/js/modules/palettes/util.js index 091ac1588a..2216814793 100644 --- a/web/js/modules/palettes/util.js +++ b/web/js/modules/palettes/util.js @@ -375,6 +375,7 @@ export function loadPalettes(permlinkState, state) { } lodashEach(stateArray, (stateObj) => { lodashEach(state.layers[stateObj.groupStr].layers, (layerDef) => { + console.log(layerDef.id, layerDef); if (layerDef.palette) { const layerId = layerDef.id; const min = []; @@ -529,6 +530,7 @@ export function preloadPalettes(layersArray, renderedPalettes, customLoaded) { && !loading[obj.palette.id] ) { const paletteId = obj.palette.id; + console.log(paletteId, obj); const location = `config/palettes/${paletteId}.json`; const promise = util.fetch(location, 'application/json'); loading[paletteId] = true; From 9e017d13fb6968244d2ece95309ca7cb79d975ee Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Tue, 16 Jan 2024 18:00:36 -0500 Subject: [PATCH 4/8] Preloaded tour story imagery --- web/js/containers/tour.js | 13 +++++++------ web/js/map/layerbuilder.js | 14 -------------- web/js/modules/palettes/util.js | 2 -- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 9e072b6ae6..fb0b38b8c1 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -541,22 +541,23 @@ const mapDispatchToProps = (dispatch) => ({ search = search.split('/?').pop(); const parameters = util.fromQueryString(search); let layers = []; + let layers2 = []; const promises = []; const temp = []; if (parameters.l) { layers = layersParse12(parameters.l, config); layers = uniqBy(layers, 'id'); + layers = layers.filter((layer) => !layer.custom && !layer.disabled); temp.push({ layers, dateString: parameters.t }); if (parameters.l1) { - layers = layersParse12(parameters.l1, config); - layers = uniqBy(layers, 'id'); - temp.push({ layers, dateString: parameters.t1, activeString: 'activeB' }); + layers2 = layersParse12(parameters.l1, config); + layers2 = uniqBy(layers2, 'id'); + layers2 = layers2.filter((layer) => !layer.custom && !layer.disabled); + temp.push({ layers: layers2, dateString: parameters.t1, activeString: 'activeB' }); } } - console.log(layers); - preloadPalettes(layers, {}, false).then(async (obj) => { - console.log(obj); + preloadPalettes([...layers, ...layers2], {}, false).then(async (obj) => { await dispatch({ type: BULK_PALETTE_PRELOADING_SUCCESS, tourStoryPalettes: obj.rendered, diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index a4f6cfb499..48ce4836b2 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -41,9 +41,6 @@ import { applyStyle, } from '../modules/vector-styles/selectors'; import { nearestInterval } from '../modules/layers/util'; -import { - lookup as createLookup, -} from '../modules/palettes/util'; import { LEFT_WING_EXTENT, RIGHT_WING_EXTENT, LEFT_WING_ORIGIN, RIGHT_WING_ORIGIN, CENTER_MAP_ORIGIN, } from '../modules/map/constants'; @@ -118,9 +115,6 @@ export default function mapLayerBuilder(config, cache, store) { if (isVectorStyleActive(def.id, activeGroupStr, state)) { style = getVectorStyleKeys(def.id, undefined, state); } - if (def.custom && options.style) { - style = options.style; - } return [layerId, projId, date, style, activeGroupStr].join(':'); }; @@ -380,17 +374,9 @@ export default function mapLayerBuilder(config, cache, store) { wrapX: false, style: typeof style === 'undefined' ? 'default' : style, }; - console.log(def.id, def, options, state.palettes); if (isPaletteActive(id, options.group, state)) { const lookup = getPaletteLookup(id, options.group, state); - console.log(def.id, lookup); - sourceOptions.tileClass = lookupFactory(lookup, sourceOptions); - } else if (def.palette && def.custom && state.palettes.tourStoryPalettes && state.palettes.tourStoryPalettes[def.palette.id]) { - const lookup = createLookup(state.palettes.tourStoryPalettes[def.palette.id].maps[0].entries, state.palettes.custom[def.custom[0]]); - console.log(def.id, lookup); sourceOptions.tileClass = lookupFactory(lookup, sourceOptions); - // Lookup is now working, so custom palette is properly preloaded - // Still TODO: fix min & max, still not working when preloading } const tileSource = new OlSourceWMTS(sourceOptions); diff --git a/web/js/modules/palettes/util.js b/web/js/modules/palettes/util.js index 2216814793..091ac1588a 100644 --- a/web/js/modules/palettes/util.js +++ b/web/js/modules/palettes/util.js @@ -375,7 +375,6 @@ export function loadPalettes(permlinkState, state) { } lodashEach(stateArray, (stateObj) => { lodashEach(state.layers[stateObj.groupStr].layers, (layerDef) => { - console.log(layerDef.id, layerDef); if (layerDef.palette) { const layerId = layerDef.id; const min = []; @@ -530,7 +529,6 @@ export function preloadPalettes(layersArray, renderedPalettes, customLoaded) { && !loading[obj.palette.id] ) { const paletteId = obj.palette.id; - console.log(paletteId, obj); const location = `config/palettes/${paletteId}.json`; const promise = util.fetch(location, 'application/json'); loading[paletteId] = true; From 2379936ec1865c4f9a5fe0be5ac838d8c6eb51e6 Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Wed, 17 Jan 2024 12:16:18 -0500 Subject: [PATCH 5/8] Changed variable names --- web/js/containers/tour.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index fb0b38b8c1..c8174da5af 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -540,29 +540,29 @@ const mapDispatchToProps = (dispatch) => ({ preProcessStepLink: async (search, config, promiseImageryForTour) => { search = search.split('/?').pop(); const parameters = util.fromQueryString(search); - let layers = []; - let layers2 = []; - const promises = []; - const temp = []; + let layersA = []; + let layersB = []; + const promisesParams = []; if (parameters.l) { - layers = layersParse12(parameters.l, config); - layers = uniqBy(layers, 'id'); - layers = layers.filter((layer) => !layer.custom && !layer.disabled); - temp.push({ layers, dateString: parameters.t }); + layersA = layersParse12(parameters.l, config); + layersA = uniqBy(layersA, 'id'); + layersA = layersA.filter((layer) => !layer.custom && !layer.disabled); + promisesParams.push({ layersA, dateString: parameters.t }); if (parameters.l1) { - layers2 = layersParse12(parameters.l1, config); - layers2 = uniqBy(layers2, 'id'); - layers2 = layers2.filter((layer) => !layer.custom && !layer.disabled); - temp.push({ layers: layers2, dateString: parameters.t1, activeString: 'activeB' }); + layersB = layersParse12(parameters.l1, config); + layersB = uniqBy(layersB, 'id'); + layersB = layersB.filter((layer) => !layer.custom && !layer.disabled); + promisesParams.push({ layers: layersB, dateString: parameters.t1, activeString: 'activeB' }); } } - preloadPalettes([...layers, ...layers2], {}, false).then(async (obj) => { + preloadPalettes([...layersA, ...layersB], {}, false).then(async (obj) => { await dispatch({ type: BULK_PALETTE_PRELOADING_SUCCESS, tourStoryPalettes: obj.rendered, }); - temp.forEach((set) => { + const promises = []; + promisesParams.forEach((set) => { promises.push(promiseImageryForTour(set.layers, set.dateString, set.activeString)); }); await Promise.all(promises); From f504c406465bdde7189f4bb701efc7ed14494e6e Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Wed, 17 Jan 2024 15:16:34 -0500 Subject: [PATCH 6/8] Refactored --- web/js/containers/tour.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index c8174da5af..888c1cbf7c 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -55,6 +55,14 @@ const getTransitionAttr = function(transition) { return ''; }; +const prepareLayersList = function(layersString, config) { + let layers; + layers = layersParse12(layersString, config); + layers = uniqBy(layers, 'id'); + layers = layers.filter((layer) => !layer.custom && !layer.disabled); + return layers; +}; + class Tour extends React.Component { constructor(props) { super(props); @@ -545,16 +553,12 @@ const mapDispatchToProps = (dispatch) => ({ const promisesParams = []; if (parameters.l) { - layersA = layersParse12(parameters.l, config); - layersA = uniqBy(layersA, 'id'); - layersA = layersA.filter((layer) => !layer.custom && !layer.disabled); - promisesParams.push({ layersA, dateString: parameters.t }); - if (parameters.l1) { - layersB = layersParse12(parameters.l1, config); - layersB = uniqBy(layersB, 'id'); - layersB = layersB.filter((layer) => !layer.custom && !layer.disabled); - promisesParams.push({ layers: layersB, dateString: parameters.t1, activeString: 'activeB' }); - } + layersA = prepareLayersList(parameters.l, config); + promisesParams.push({ layers: layersA, dateString: parameters.t }); + } + if (parameters.l1) { + layersB = prepareLayersList(parameters.l1, config); + promisesParams.push({ layers: layersB, dateString: parameters.t1, activeString: 'activeB' }); } preloadPalettes([...layersA, ...layersB], {}, false).then(async (obj) => { await dispatch({ From c192db2b7fe97dcc4f781f4f884c19e6b3e12c66 Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Thu, 18 Jan 2024 11:29:44 -0500 Subject: [PATCH 7/8] Preload only 1 step ahead --- web/js/containers/tour.js | 25 +++++++++++++------------ web/js/modules/map/util.js | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/web/js/containers/tour.js b/web/js/containers/tour.js index 888c1cbf7c..42c5d20022 100644 --- a/web/js/containers/tour.js +++ b/web/js/containers/tour.js @@ -177,13 +177,11 @@ class Tour extends React.Component { config, renderedPalettes, ); - currentStory.steps.forEach((step) => { - preProcessStepLink( - `${step.stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, - config, - promiseImageryForTour, - ); - }); + preProcessStepLink( + `${currentStory.steps[1].stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, + config, + promiseImageryForTour, + ); } fetchMetadata(currentStory, stepIndex) { @@ -262,7 +260,7 @@ class Tour extends React.Component { currentStoryId, } = this.state; const { - config, renderedPalettes, processStepLink, isKioskModeActive, activeTab, changeTab, isEmbedModeActive, + config, renderedPalettes, processStepLink, isKioskModeActive, activeTab, changeTab, isEmbedModeActive, preProcessStepLink, promiseImageryForTour, } = this.props; const kioskParam = this.getKioskParam(isKioskModeActive); @@ -283,6 +281,13 @@ class Tour extends React.Component { config, renderedPalettes, ); + if (currentStep + 2 <= totalSteps) { + preProcessStepLink( + `${currentStory.steps[newStep].stepLink}&tr=${currentStoryId}${transitionParam}${kioskParam}&em=${isEmbedModeActive}`, + config, + promiseImageryForTour, + ); + } } if (currentStep + 1 === totalSteps + 1) { this.toggleModalInProgress(e); @@ -535,10 +540,6 @@ const mapDispatchToProps = (dispatch) => ({ type: BULK_PALETTE_RENDERING_SUCCESS, rendered: obj.rendered, }); - dispatch({ - type: BULK_PALETTE_PRELOADING_SUCCESS, - tourStoryPalettes: obj.rendered, - }); dispatch({ type: LOCATION_POP_ACTION, payload: location }); }); } else { diff --git a/web/js/modules/map/util.js b/web/js/modules/map/util.js index e51932bee7..c4bd264e1b 100644 --- a/web/js/modules/map/util.js +++ b/web/js/modules/map/util.js @@ -323,7 +323,7 @@ export async function promiseImageryForTour(state, layers, dateString, activeStr if (layer.type === 'granule' || layer.type === 'ttiler') { return Promise.resolve(); } - const options = { date, group: activeString }; + const options = { date, group: activeString || 'active' }; const keys = []; if (layer.custom) { keys.push(`palette=${layer.custom}`); From b194007407c0f522a3a5e55c917c80ed350b23b1 Mon Sep 17 00:00:00 2001 From: christof-wittreich Date: Fri, 26 Jan 2024 13:51:07 -0500 Subject: [PATCH 8/8] Squashed commit of the following: commit 8e1c50662e36ce4509454029ae2610bdcdb9bd2d Author: Ryan Weiler Date: Fri Jan 26 07:53:29 2024 -0500 dependency updates 1-19-24 (#4948) commit f208caf4b2738878abdc9e7cad16c7aaa08506ee Author: Ryan Weiler Date: Thu Jan 25 12:28:20 2024 -0500 adjusting static map logic for EIC (#4949) commit adfce432e228ba42889be9f5e944d060141c811e Author: Ryan Weiler Date: Thu Jan 25 11:30:51 2024 -0500 Adding conditionals for E2E test notifications (#4950) * refactoring e2e tests * update animation-test * update layer-picker-mobile-test * fix about modal test commit eef0628a73a177e742a2dfd2a7051857fb7fab4b Merge: cffaddb89 f00bd5945 Author: Tom Cariello Date: Wed Jan 17 11:55:03 2024 -0500 Merge pull request #4938 from nasa-gibs/main Main to Develop commit f00bd5945c63c062136c6d383f67b4d7840c5d08 Merge: c28475028 cffaddb89 Author: Tom Cariello Date: Wed Jan 17 11:54:40 2024 -0500 Merge branch 'develop' into main commit c28475028d4db496fa5f496077be36cf63863e0b Merge: dc8a02063 f9f78fc81 Author: Tom Cariello Date: Wed Jan 17 11:51:09 2024 -0500 Merge pull request #4937 from nasa-gibs/release Release to Main commit cffaddb89a09aaae0655e0bb4f60419463f4914c Author: Ryan Weiler Date: Wed Jan 17 10:48:33 2024 -0500 WV-2957 Code Coverage Documentation (#4936) * e2e code coverage test documentation * remove nyc ouput commit f9f78fc817c0e4dead3522db7ac5ac82918a46d1 Merge: 0f0c1b0e7 16bc2db6c Author: Tom Cariello Date: Tue Jan 16 13:57:35 2024 -0500 Merge pull request #4933 from nasa-gibs/UAT-v4.24.0 UAT v4.24.0 commit 16bc2db6c990852d2ba618c9127e652adbd094e8 Author: Tom Cariello Date: Tue Jan 16 13:36:01 2024 -0500 v4.24.0 commit a633c3affd360e4b4c4ee563046014207d7b9189 Author: minniewong Date: Tue Jan 16 10:40:38 2024 -0500 Further updates to steps (#4932) commit d7c4ddd8eb83e07494704a39220bbd0006710947 Author: minniewong Date: Tue Jan 16 10:21:35 2024 -0500 WV-3013: Fix dois and short names for AMSR-E and AMSR2 NSIDC layers (#4931) * Fix dois and short names * Update AU_OCEAN doi to working link commit 6e749a1bb43688f34f38229ba920b956bc100027 Author: Ryan Weiler Date: Fri Jan 12 13:28:06 2024 -0500 update dependencies 1-12-24 (#4930) commit 3719d4044bfa0784cdad87e03eb7ac30542e4862 Author: minniewong Date: Fri Jan 12 12:19:32 2024 -0500 WW-2655: OPERA Surface Water Extent story (#4921) * Initial steps * update story steps * hide surface water extent story in tour story box * update story text * Fix typos and add correct link for Step 5 --------- Co-authored-by: ryanweiler92 commit 7485dfee4fa7d99031a7f954f297bd8895f903e6 Merge: d355e56ac 7be844e99 Author: Ryan Weiler Date: Fri Jan 12 12:08:08 2024 -0500 Merge pull request #4917 from nasa-gibs/wv-gitc-temp-measurement-settings-layers WV GITC Fix for measurement settings layers & handle errors when adjustingStart dates on load commit 7be844e99da394eb0f1433f24bcf58d54d360dbe Author: ryanweiler92 Date: Wed Jan 10 12:05:33 2024 -0500 handle adjusting startDate errors commit d355e56ac0992472f07f375fa514ada300532bb5 Merge: 7a82ea2b9 dc8a02063 Author: Ryan Weiler Date: Mon Jan 8 16:05:57 2024 -0500 Merge pull request #4920 from nasa-gibs/main Main to Develop v4.23.1 commit dc8a02063cd6e13405f48a2bfc9ad9dc370275f1 Merge: bc7625a45 0f0c1b0e7 Author: Ryan Weiler Date: Mon Jan 8 15:29:48 2024 -0500 Merge pull request #4919 from nasa-gibs/release Release to Main v4.23.1 commit 7a82ea2b943cdfb44eb96299f128106ed53d3df7 Author: Patrick Moulden <4834892+PatchesMaps@users.noreply.github.com> Date: Mon Jan 8 13:57:54 2024 -0500 Dependency Updates 01-05-2024 (#4918) commit effb47de024064075b1f31e6c9da9850f31b2ea0 Author: ryanweiler92 Date: Mon Jan 8 12:37:45 2024 -0500 check for layers in settings array that dont exist in config commit 0f0c1b0e7a608d26a1ff2ec442b5dec514353f96 Merge: 94c346580 b0a36ceca Author: Ryan Weiler Date: Mon Jan 8 11:59:57 2024 -0500 Merge pull request #4916 from nasa-gibs/UAT-v4.23.1 UAT-v4.23.1 to Release commit b0a36cecaebc0aa3d7f5a39a040204b782638df0 Author: ryanweiler92 Date: Mon Jan 8 11:58:28 2024 -0500 v4.23.1 commit b9a6ba0a936db9809d988d7e5361fccab86d1a6f Author: minniewong Date: Mon Jan 8 10:33:28 2024 -0500 Fixes for typos, extra spaces, missing parentheses (#4914) * Fixes for typos, extra spaces, missing parentheses * Update VIIRS_SNPP_Ice_Surface_Temp_Night.md commit dc1a710337404ab210996ec8ad662c8df25c9196 Author: Ryan Weiler Date: Mon Jan 8 09:47:15 2024 -0500 update axios (#4915) commit b290693126b864b8ceea2f5065aeb7e062844feb Merge: 5a86501be bc7625a45 Author: Ryan Weiler Date: Wed Jan 3 14:56:07 2024 -0500 Merge pull request #4908 from nasa-gibs/main Main to Develop v4.23.0 commit bc7625a4572acda67e0839a0cec7c84625379b99 Merge: dee0b7241 94c346580 Author: Ryan Weiler Date: Wed Jan 3 14:52:23 2024 -0500 Merge pull request #4907 from nasa-gibs/release Release to Main v4.23.0 commit 94c3465800dac6117cae38d6c3a47701cbe86a1a Merge: 4a3e814fc 68b503a56 Author: Ryan Weiler Date: Wed Jan 3 13:12:34 2024 -0500 Merge pull request #4906 from nasa-gibs/UAT-v4.23.0 UAT v4.23.0 to Release commit 68b503a56d985a67f69a0e8be09da13658560051 Author: ryanweiler92 Date: Wed Jan 3 13:09:59 2024 -0500 v4.23.0 commit 5a86501beaef66e65b594102714015b353cdda10 Author: minniewong Date: Wed Jan 3 12:18:37 2024 -0500 update SMAP dois for new versions (#4905) commit 97fe1c0644a03ebc71bdd254673827ee6b499fc2 Author: Ryan Weiler Date: Tue Jan 2 16:02:58 2024 -0500 WV-2985: Removing Date for EIC Static Map Mode (#4904) * add resolutions section to package.json for follow-redirects version 1.15.4 * hide date during eic static map commit 0112037dd2d0f8c9ed62e84fbafc7859057f4ab6 Author: Ryan Weiler Date: Tue Jan 2 14:45:53 2024 -0500 WV-2981: Dynamically update subdomains for collection updates feature for GITC deployments (#4886) * use correct subdomain in collection updates for gitc deployments * update layer source lookup to use regex for subdomain resolver commit ecb0ebe5edbe7bbf6235dee48af529c1d8dbe03e Author: Ryan Weiler Date: Tue Jan 2 10:20:43 2024 -0500 add resolutions section to package.json for follow-redirects version 1.15.4 (#4903) commit e8c5124341c9416ef0ca9ddfc71fd8f0d685839c Author: christof-wittreich Date: Fri Dec 29 10:07:41 2023 -0600 dependabot updates 12-29-23 (#4902) commit 61b613226e98f5a6d4a254db0ec85a5f5a896db9 Author: minniewong Date: Thu Dec 28 10:16:35 2023 -0500 WV-2960: remove deployment link (#4891) * Removed deployment page and link; updated other misc * Update license.md commit e5aa6c5c9fe41d47b476faf90a067651102b92bb Author: minniewong Date: Tue Dec 26 15:31:04 2023 -0500 Update broken links (#4890) * Update broken links * Update MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md commit 0948ef8dbc759d5fef5963c7b1744b21f2f763f5 Author: minniewong Date: Tue Dec 26 14:48:59 2023 -0500 WV-2571: Update copyright info to 2024 (#4889) * Update copyright info to 2024 * Update LICENSE.md commit e896b360cac6e2d6ea18d4275b44fc44be6821ba Author: Patrick Moulden <4834892+PatchesMaps@users.noreply.github.com> Date: Fri Dec 22 16:49:06 2023 -0500 fix unrelated zots (#4885) commit 1d3845686c23b46c845bc086e41d8cece04f2a2c Author: Patrick Moulden <4834892+PatchesMaps@users.noreply.github.com> Date: Fri Dec 22 16:48:49 2023 -0500 update local state with prop (#4884) commit 37178cd2625f1922686c6fa4219697dfc064b28a Author: Patrick Moulden <4834892+PatchesMaps@users.noreply.github.com> Date: Fri Dec 22 16:48:34 2023 -0500 Wv 2977 comparison available imagery (#4887) * fix comparison mode * lint fix commit 268e7c49c0838ce49172ec3d95c9ebca0bace331 Author: minniewong Date: Fri Dec 22 16:42:57 2023 -0500 WV-2975: Add 4 TRMM/TMI and AMSRE LPRM soil moisture layers (#4888) * Add 4 LPRM and TMI Soil Moisture layers * Add LPRM descriptions commit e53ac04614243bfc2a0b16046c3e500074c13863 Author: minniewong Date: Fri Dec 22 16:04:22 2023 -0500 Update HLS Sentinel band combo; change title of EIC NOAA-20 fires (#4879) commit f77d427aa0b524f6c8f14645aa0b01354bf8c74a Author: Ryan Weiler Date: Fri Dec 22 12:25:22 2023 -0500 dependency updates 12-22-23 (#4883) commit d5784255e72611e4aa275d623c8bab0582c2d04d Merge: 8e21d6254 dee0b7241 Author: Tom Cariello Date: Tue Dec 19 10:47:28 2023 -0500 Merge pull request #4877 from nasa-gibs/main Main to Develop commit dee0b72412b2c054d0a72d27529cb0c705422255 Merge: 54d54198f 4a3e814fc Author: Tom Cariello Date: Tue Dec 19 10:44:40 2023 -0500 Merge pull request #4876 from nasa-gibs/release Release to main commit 4a3e814fcd54501e2999786d630571e6f6e0dbaa Merge: 419c90bc4 1efa98ba5 Author: Tom Cariello Date: Tue Dec 19 08:44:30 2023 -0500 Merge pull request #4875 from nasa-gibs/UAT-v4.22.0 UAT v4.22.0 commit 1efa98ba5988c057a3a280cb883df446f830b5f5 Author: Thomas Cariello Date: Tue Dec 19 08:42:42 2023 -0500 v4.22.0 commit 8e21d625475fcfd62da933067933bef730a43406 Author: Patrick Moulden <4834892+PatchesMaps@users.noreply.github.com> Date: Mon Dec 18 21:19:59 2023 -0500 Wv 2749 locate ddv imagery (#4614) * first pass at imagery search * lint fixes * add ImagerySearch to other layers * lint fixes * look for imagery closest to selected date * lint fix * sort dates and ensure closest img dates shown * tweak styles * remove true color presets * CR changes * lint fixes * css fix * lazy-load list for imagery dates * lint fixes * load dates seperately * remove old method * iteration on date lazy loading * remove trailing spaces * underzoom zot * imagery search enhancements * Zots and alerts * lint fixes * "destroy is not a function" fix * make zot lighter * resolve e2e zot test * modal * spacing fixes * tweak granule params * validate entries * zero out datetime * data to imagery * text changes * requested changes * shorten notices and enable opera layer * change how we get the concept id * style adjustments * update notice on date change * differentiate lazy-load list * remove notice after being dismissed once * only check visible layers * add divider * lint fix * Zoom alert modal * son't show granule alert if zoom alert is showing * clamp max extent and improved error handling * lint fixes * check for granules on visibility change * fix underzoom issue * structure changes commit acbbfcc1e72618d0672b67e4a1cea3ad0d2e9725 Author: christof-wittreich Date: Fri Dec 15 08:23:13 2023 -0600 dependabot updates 12-15-23 (#4874) --- .vscode/settings.json | 2 +- LICENSE.md | 4 +- README.md | 1 - config/default/common/brand/about/license.md | 6 +- .../amsr2/AMSRU2_Cloud_Liquid_Water_Day.md | 2 +- .../amsr2/AMSRU2_Cloud_Liquid_Water_Night.md | 2 +- .../amsr2/AMSRU2_Columnar_Water_Vapor_Day.md | 2 +- .../AMSRU2_Columnar_Water_Vapor_Night.md | 2 +- .../amsr2/AMSRU2_Surface_Precipitation_Day.md | 2 +- .../AMSRU2_Surface_Precipitation_Night.md | 2 +- .../AMSRU2_Total_Precipitable_Water_Day.md | 2 +- .../AMSRU2_Total_Precipitable_Water_Night.md | 2 +- .../layers/amsr2/AMSRU2_Wind_Speed_Day.md | 2 +- .../layers/amsr2/AMSRU2_Wind_Speed_Night.md | 2 +- .../amsre/AMSRE_Columnar_Water_Vapor_Day.md | 2 +- .../amsre/AMSRE_Columnar_Water_Vapor_Night.md | 2 +- .../AMSRE_Surface_Precipitation_Rate_Day.md | 2 +- .../AMSRE_Surface_Precipitation_Rate_Night.md | 2 +- ..._Surface_Soil_Moisture_C_Band_Day_Daily.md | 5 + ...urface_Soil_Moisture_C_Band_Night_Daily.md | 5 + .../metadata/layers/modis/Chlorophyll_a.md | 2 +- .../MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md | 2 +- .../modis/aqua/MODIS_Aqua_NDSI_Snow_Cover.md | 2 +- .../terra/MODIS_Terra_Cloud_Water_Path_PCL.md | 2 +- ...DIS_Terra_L3_Ice_Surface_Temp_Daily_Day.md | 2 +- .../hls/HLS_MGRS_Granule_Grid.md | 2 +- .../layers/multi-mission/hls/Reflectance.md | 2 +- .../SMAP_L1_Passive_Brightness_Temp_Aft_H.md | 2 +- ...MAP_L1_Passive_Brightness_Temp_Aft_H_QA.md | 2 +- ...AP_L1_Passive_Brightness_Temp_Aft_H_RFI.md | 2 +- .../SMAP_L1_Passive_Brightness_Temp_Aft_V.md | 2 +- ...MAP_L1_Passive_Brightness_Temp_Aft_V_QA.md | 2 +- ...AP_L1_Passive_Brightness_Temp_Aft_V_RFI.md | 2 +- .../SMAP_L1_Passive_Brightness_Temp_Fore_H.md | 2 +- ...AP_L1_Passive_Brightness_Temp_Fore_H_QA.md | 2 +- ...P_L1_Passive_Brightness_Temp_Fore_H_RFI.md | 2 +- .../SMAP_L1_Passive_Brightness_Temp_Fore_V.md | 2 +- ...AP_L1_Passive_Brightness_Temp_Fore_V_QA.md | 2 +- ...P_L1_Passive_Brightness_Temp_Fore_V_RFI.md | 2 +- ..._Passive_Enhanced_Brightness_Temp_Aft_H.md | 2 +- ...ssive_Enhanced_Brightness_Temp_Aft_H_QA.md | 2 +- ...sive_Enhanced_Brightness_Temp_Aft_H_RFI.md | 2 +- ..._Passive_Enhanced_Brightness_Temp_Aft_V.md | 2 +- ...ssive_Enhanced_Brightness_Temp_Aft_V_QA.md | 2 +- ...sive_Enhanced_Brightness_Temp_Aft_V_RFI.md | 2 +- ...Passive_Enhanced_Brightness_Temp_Fore_H.md | 2 +- ...sive_Enhanced_Brightness_Temp_Fore_H_QA.md | 2 +- ...ive_Enhanced_Brightness_Temp_Fore_H_RFI.md | 2 +- ...Passive_Enhanced_Brightness_Temp_Fore_V.md | 2 +- ...sive_Enhanced_Brightness_Temp_Fore_V_QA.md | 2 +- ...ive_Enhanced_Brightness_Temp_Fore_V_RFI.md | 2 +- .../SMAP_L1_Passive_Faraday_Rotation_Aft.md | 2 +- .../SMAP_L1_Passive_Faraday_Rotation_Fore.md | 2 +- ...AP_L2_Passive_Day_Soil_Moisture_Option1.md | 2 +- ...AP_L2_Passive_Day_Soil_Moisture_Option2.md | 2 +- ...AP_L2_Passive_Day_Soil_Moisture_Option3.md | 2 +- ...sive_Enhanced_Day_Soil_Moisture_Option1.md | 2 +- ...sive_Enhanced_Day_Soil_Moisture_Option2.md | 2 +- ...sive_Enhanced_Day_Soil_Moisture_Option3.md | 2 +- ...ve_Enhanced_Night_Soil_Moisture_Option1.md | 2 +- ...ve_Enhanced_Night_Soil_Moisture_Option2.md | 2 +- ...ve_Enhanced_Night_Soil_Moisture_Option3.md | 2 +- ..._L2_Passive_Night_Soil_Moisture_Option1.md | 2 +- ..._L2_Passive_Night_Soil_Moisture_Option2.md | 2 +- ..._L2_Passive_Night_Soil_Moisture_Option3.md | 2 +- .../smap/SMAP_L3_Passive_Brightness_Temp_H.md | 2 +- .../smap/SMAP_L3_Passive_Brightness_Temp_V.md | 2 +- .../smap/SMAP_L3_Passive_Day_Freeze_Thaw.md | 2 +- .../smap/SMAP_L3_Passive_Day_Soil_Moisture.md | 2 +- ...MAP_L3_Passive_Enhanced_Day_Freeze_Thaw.md | 2 +- ...P_L3_Passive_Enhanced_Day_Soil_Moisture.md | 2 +- ...P_L3_Passive_Enhanced_Night_Freeze_Thaw.md | 2 +- ...L3_Passive_Enhanced_Night_Soil_Moisture.md | 2 +- .../smap/SMAP_L3_Passive_Night_Freeze_Thaw.md | 2 +- .../SMAP_L3_Passive_Night_Soil_Moisture.md | 2 +- ..._Surface_Soil_Moisture_X_Band_Day_Daily.md | 5 + ...urface_Soil_Moisture_X_Band_Night_Daily.md | 5 + .../metadata/layers/viirs/Chlorophyll_a.md | 2 +- .../VIIRS_NOAA20_Ice_Surface_Temp_Day.md | 2 +- .../VIIRS_NOAA20_Ice_Surface_Temp_Night.md | 4 +- .../VIIRS_NOAA20_Land_Surface_Temp_Day.md | 2 +- .../VIIRS_NOAA20_Land_Surface_Temp_Night.md | 2 +- .../noaa20/VIIRS_NOAA20_NDSI_Snow_Cover.md | 3 +- .../viirs/noaa20/VIIRS_NOAA20_Sea_Ice.md | 3 +- .../layers/viirs/snpp/VIIRS_Black_Marble.md | 2 +- .../VIIRS_SNPP_Brightness_Temp_BandI5_Day.md | 2 +- ...VIIRS_SNPP_Brightness_Temp_BandI5_Night.md | 2 +- .../VIIRS_SNPP_Clear_Sky_Confidence_Day.md | 1 - .../VIIRS_SNPP_DayNightBand_AtSensor_M15.md | 4 +- ...RS_SNPP_DayNightBand_At_Sensor_Radiance.md | 4 +- .../snpp/VIIRS_SNPP_Ice_Surface_Temp_Day.md | 2 +- .../snpp/VIIRS_SNPP_Ice_Surface_Temp_Night.md | 4 +- .../snpp/VIIRS_SNPP_Land_Surface_Temp_Day.md | 2 +- .../VIIRS_SNPP_Land_Surface_Temp_Night.md | 2 +- .../dust_storms_overview_2019/step001.md | 2 +- .../metadata/stories/geostationary/step002.md | 2 +- .../stories/surface_water_extent/step001.md | 1 + .../stories/surface_water_extent/step002.md | 1 + .../stories/surface_water_extent/step003.md | 1 + .../stories/surface_water_extent/step004.md | 3 + .../stories/surface_water_extent/step005.md | 1 + .../stories/surface_water_extent/step006.md | 1 + .../stories/surface_water_extent/step007.md | 2 + .../stories/surface_water_extent/step008.md | 1 + .../stories/surface_water_extent/step009.md | 1 + .../stories/surface_water_extent/step010.md | 3 + .../surface-water-extent.png | Bin 0 -> 122532 bytes .../common/config/wv.json/layerOrder.json | 4 + ...urface_Soil_Moisture_C_Band_Day_Daily.json | 11 + ...face_Soil_Moisture_C_Band_Night_Daily.json | 11 + .../hls/HLS_Customizable_Landsat.json | 3 + .../hls/HLS_Customizable_Sentinel.json | 7 +- .../hls/HLS_False_Color_Landsat.json | 3 + .../hls/HLS_False_Color_Sentinel.json | 3 + .../hls/HLS_False_Color_Urban_Landsat.json | 3 + .../hls/HLS_False_Color_Urban_Sentinel.json | 3 + .../HLS_False_Color_Vegetation_Landsat.json | 3 + .../HLS_False_Color_Vegetation_Sentinel.json | 3 + ...S_L30_Nadir_BRDF_Adjusted_Reflectance.json | 1 + .../hls/HLS_Moisture_Index_Landsat.json | 3 + .../hls/HLS_Moisture_Index_Sentinel.json | 3 + .../multi-mission/hls/HLS_NDSI_Landsat.json | 3 + .../multi-mission/hls/HLS_NDSI_Sentinel.json | 3 + .../multi-mission/hls/HLS_NDVI_Landsat.json | 3 + .../multi-mission/hls/HLS_NDVI_Sentinel.json | 3 + .../multi-mission/hls/HLS_NDWI_Landsat.json | 3 + .../multi-mission/hls/HLS_NDWI_Sentinel.json | 3 + ...S_S30_Nadir_BRDF_Adjusted_Reflectance.json | 1 + .../hls/HLS_Shortwave_Infrared_Landsat.json | 3 + .../hls/HLS_Shortwave_Infrared_Sentinel.json | 3 + ..._Surface_Water_Extent-HLS_Provisional.json | 1 + ...urface_Soil_Moisture_X_Band_Day_Daily.json | 11 + ...face_Soil_Moisture_X_Band_Night_Daily.json | 11 + .../stories/default/surface_water_extent.json | 114 ++ .../common/config/wv.json/storyOrder.json | 1 + doc/config/layers.md | 2 +- doc/deployment.md | 0 doc/e2e_testing.md | 19 + e2e/features/animation/animation-test.spec.js | 16 +- e2e/features/animation/gif-test.spec.js | 16 +- .../animation/mobile-animation-test.spec.js | 5 +- .../compare/compare-mobile-test.spec.js | 4 +- e2e/features/compare/compare-test.spec.js | 9 +- .../compare/layer-dialog-test.spec.js | 4 +- .../compare/layer-sidebar-test.spec.js | 6 +- e2e/features/compare/permalinks-test.spec.js | 16 +- e2e/features/compare/timeline-test.spec.js | 6 +- e2e/features/events/event-filter-test.spec.js | 21 +- e2e/features/events/event-test.spec.js | 44 +- .../events/events-mobile-test.spec.js | 9 +- .../coordinate-format-test.spec.js | 7 +- .../global-unit/global-unit-test.spec.js | 10 +- .../crosses-dateline-test.spec.js | 13 +- .../image-download/formats-test.spec.js | 10 +- .../image-download/global-select-test.spec.js | 6 +- .../image-download/initial-state-test.spec.js | 7 +- .../image-download/layers-test.spec.js | 17 +- .../image-download/projection-test.spec.js | 9 +- .../resolutions3413-test.spec.js | 7 +- .../resolutions4326-test.spec.js | 7 +- e2e/features/image-download/time-test.spec.js | 15 +- .../image-download/unsupported-test.spec.js | 10 +- .../layers/layer-picker-mobile-test.spec.js | 10 +- e2e/features/layers/layer-picker-test.spec.js | 6 +- .../layers/layers-sidebar-test.spec.js | 39 +- .../layers/layers-vector-test.spec.js | 9 +- e2e/features/layers/options-test.spec.js | 5 +- .../layers/recent-layers-mobile-test.spec.js | 6 +- .../layers/recent-layers-test.spec.js | 6 +- .../location-search-mobile-test.spec.js | 5 +- .../location-search-test.spec.js | 20 +- e2e/features/measure/measure-test.spec.js | 6 +- e2e/features/modal/about-modal-test.spec.js | 6 +- .../notifications/notify-test.spec.js | 7 +- e2e/features/palettes/disable-test.spec.js | 10 +- .../projections/projections-test.spec.js | 6 +- e2e/features/share/share-test.spec.js | 21 +- .../timeline/date-selector-test.spec.js | 51 +- .../layer-coverage-panel-test.spec.js | 13 +- .../timeline/timeline-mobile-test.spec.js | 17 +- e2e/features/timeline/timeline-test.spec.js | 24 +- e2e/features/tour/tour-test.spec.js | 5 +- .../ui/distraction-free-mode-test.spec.js | 8 +- e2e/features/ui/info-mobile-test.spec.js | 5 +- e2e/features/ui/info-test.spec.js | 5 +- e2e/test-utils/hooks/wvHooks.js | 8 + package-lock.json | 1118 +++++++++++------ package.json | 58 +- ...Surface_Soil_Moisture_C_Band_Day_Daily.jpg | Bin 0 -> 41250 bytes ...rface_Soil_Moisture_C_Band_Night_Daily.jpg | Bin 0 -> 40880 bytes ...Surface_Soil_Moisture_X_Band_Day_Daily.jpg | Bin 0 -> 24328 bytes ...rface_Soil_Moisture_X_Band_Night_Daily.jpg | Bin 0 -> 22601 bytes web/index.html | 2 +- .../feature-alert/granuleAlertModal.js | 26 + .../feature-alert/zoomAlertModal.js | 26 + .../layer/settings/imagery-search.js | 151 +++ .../layer/settings/layer-settings.js | 6 + web/js/components/tour/tour-box.js | 4 +- web/js/components/tour/tour-boxes.js | 4 +- web/js/containers/sidebar/layer-row.js | 122 +- web/js/containers/sidebar/zot.js | 13 +- web/js/containers/timeline/timeline.js | 9 +- web/js/map/layerbuilder.js | 2 +- .../dev-test-mode/dev-console-test.js | 6 +- .../tile-measurement/tile-measurement.js | 21 +- .../tile-measurement/utils/layer-data-eic.js | 6 +- .../update-collections/updateCollections.js | 74 +- web/js/mapUI/mapUI.js | 4 +- web/js/modules/alerts/constants.js | 24 + web/js/modules/layers/selectors.js | 4 +- web/js/modules/layers/util.js | 13 +- web/js/modules/product-picker/selectors.js | 2 +- web/scss/components/alert.scss | 2 +- web/scss/features/customize-bands.scss | 8 + web/scss/features/layers.scss | 32 + web/scss/features/sidebar-panel.scss | 16 + 216 files changed, 1880 insertions(+), 923 deletions(-) create mode 100644 config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.md create mode 100644 config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.md create mode 100644 config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.md create mode 100644 config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step001.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step002.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step003.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step004.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step005.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step006.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step007.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step008.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step009.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/step010.md create mode 100644 config/default/common/config/metadata/stories/surface_water_extent/surface-water-extent.png create mode 100644 config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.json create mode 100644 config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.json create mode 100644 config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.json create mode 100644 config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.json create mode 100644 config/default/common/config/wv.json/stories/default/surface_water_extent.json delete mode 100644 doc/deployment.md create mode 100644 web/images/layers/previews/geographic/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.jpg create mode 100644 web/images/layers/previews/geographic/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.jpg create mode 100644 web/images/layers/previews/geographic/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.jpg create mode 100644 web/images/layers/previews/geographic/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.jpg create mode 100644 web/js/components/feature-alert/granuleAlertModal.js create mode 100644 web/js/components/feature-alert/zoomAlertModal.js create mode 100644 web/js/components/layer/settings/imagery-search.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 4a1f9fa801..80f2403d87 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "files.trimTrailingWhitespace": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "files.exclude": { "**./node_modules": true diff --git a/LICENSE.md b/LICENSE.md index 90de2dfd8c..1895d457d9 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -3,7 +3,7 @@ This code was originally developed at NASA/Goddard Space Flight Center for the Earth Science Data and Information System (ESDIS) project. -Copyright © 2013 - 2023 United States Government as represented by the +Copyright © 2013 - 2024 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. @@ -131,7 +131,7 @@ customarily used for software exchange. **B.** Each Recipient must ensure that the following copyright notice appears prominently in the Subject Software: - Copyright © 2012-2023 United States Government + Copyright © 2012-2024 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. diff --git a/README.md b/README.md index 037ef0cb60..f93632304f 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,6 @@ To update Worldview, pull down any branch or tag from GitHub. From the `main` br - [Custom Branding](doc/branding.md) - [Optional Features](doc/features.md) - [Developing](doc/developing.md) -- [Deployment](doc/deployment.md) - [Testing](doc/testing.md) - [URL Parameters](doc/url_parameters.md) - [Uploading](doc/upload.md) diff --git a/config/default/common/brand/about/license.md b/config/default/common/brand/about/license.md index b53b25b5fb..db2217b7c0 100644 --- a/config/default/common/brand/about/license.md +++ b/config/default/common/brand/about/license.md @@ -1,11 +1,11 @@

License

-

Copyright © 2013 - 2023 United States Government as represented by the Administrator of the National Aeronautics +

Copyright © 2013 - 2024 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. This software is licensed under the NASA Open Source + href="https://opensource.gsfc.nasa.gov/nosa.php" target="_blank" rel="noopener noreferrer">NASA Open Source Software Agreement, Version 1.3. Source code is available on the NASA GIBS GitHub.


@BUILD_TIMESTAMP@
Responsible NASA Official: Ryan Boller
-Web Privacy Policy

\ No newline at end of file +Web Privacy Policy

\ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Day.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Day.md index 53339529b6..468fe10c9a 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Day.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Day.md @@ -4,4 +4,4 @@ The AMSR2 instrument is a conically scanning passive microwave radiometer. This The imagery resolution is 2 km and sensor resolution is 6.25 km. The temporal resolution is daily. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Night.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Night.md index 2cc1fac33f..4cb1c9010f 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Night.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Cloud_Liquid_Water_Night.md @@ -4,4 +4,4 @@ The AMSR2 instrument is a conically scanning passive microwave radiometer. This The imagery resolution is 2 km and sensor resolution is 6.25 km. The temporal resolution is daily. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) \ No newline at end of file +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Day.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Day.md index 99ebe3da2a..dcf097ad22 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Day.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Day.md @@ -2,4 +2,4 @@ The Columnar Water Vapor (Day) layer is a measure of the columnar water vapor in The AMSR2 instrument is a conically scanning passive microwave radiometer. This instrument senses microwave radiation for twelve channels and six frequencies ranging from 6.9 GHz to 89 GHz on board the Japan Aerospace Exploration Agency (JAXA) Global Change Observation Mission – Water 1 (GCOM-W1) satellite. -References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02) \ No newline at end of file +References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02); AU_RAIN [doi:10.5067/P5MCTDH7674A](https://doi.org/10.5067/P5MCTDH7674A) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Night.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Night.md index 69bc167bc6..2bda9a34f2 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Night.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Columnar_Water_Vapor_Night.md @@ -2,4 +2,4 @@ The Columnar Water Vapor (Night) layer is a measure of the columnar water vapor The AMSR2 instrument is a conically scanning passive microwave radiometer. This instrument senses microwave radiation for twelve channels and six frequencies ranging from 6.9 GHz to 89 GHz on board the Japan Aerospace Exploration Agency (JAXA) Global Change Observation Mission – Water 1 (GCOM-W1) satellite. -References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02) \ No newline at end of file +References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02); AU_RAIN [doi:10.5067/P5MCTDH7674A](https://doi.org/10.5067/P5MCTDH7674A) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Day.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Day.md index 09a8bb7a47..13b312641e 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Day.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Day.md @@ -2,4 +2,4 @@ The Surface Precipitation (Day) layer displays instantaneous surface precipitati The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_Rain_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02) \ No newline at end of file +References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02); AU_RAIN [doi:10.5067/P5MCTDH7674A](https://doi.org/10.5067/P5MCTDH7674A) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Night.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Night.md index 79e5803343..fc110deab4 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Night.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Surface_Precipitation_Night.md @@ -2,4 +2,4 @@ The Surface Precipitation (Night) layer displays instantaneous surface precipita The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_Rain_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02) \ No newline at end of file +References: AU_RAIN_NRT [doi:10.5067/AMSRU/AU_RAIN_NRT_R02](https://doi.org/10.5067/AMSRU/AU_RAIN_NRT_R02); AU_RAIN [doi:10.5067/P5MCTDH7674A](https://doi.org/10.5067/P5MCTDH7674A) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Day.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Day.md index 186efd1b00..b0e528d934 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Day.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Day.md @@ -2,4 +2,4 @@ The Total Precipitable Water (Day) layer displays precipitable water totals over The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) \ No newline at end of file +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Night.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Night.md index 57d5079dfd..7d85501bcd 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Night.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Total_Precipitable_Water_Night.md @@ -2,4 +2,4 @@ The Total Precipitable Water (Night) layer displays precipitable water totals ov The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) \ No newline at end of file +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Day.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Day.md index 97bc6ee0da..c9ecf3de91 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Day.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Day.md @@ -2,4 +2,4 @@ The Wind Speed (Day) layer shows wind speed over oceans in meters per second (m/ The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) \ No newline at end of file +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Night.md b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Night.md index 067f1cc035..a069e62d64 100644 --- a/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Night.md +++ b/config/default/common/config/metadata/layers/amsr2/AMSRU2_Wind_Speed_Night.md @@ -2,4 +2,4 @@ The Wind Speed (Night) layer shows wind speed over oceans in meters per second ( The Advanced Microwave Scanning Radiometer 2 (AMSR2) instrument on the Global Change Observation Mission - Water 1 (GCOM-W1) provides global passive microwave measurements of terrestrial, oceanic, and atmospheric parameters for the investigation of global water and energy cycles. The GCOM-W1 NRT AMSR2 Unified Global Swath Surface Precipitation GSFC Profiling Algorithm is a swath product containing global rain rate and type, calculated by the GPROF 2017 V2R rainfall retrieval algorithm using resampled NRT Level-1R data provided by JAXA. This is the same algorithm that generates the corresponding standard science products in the AMSR SIPS. -References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01) \ No newline at end of file +References: AU_OCEAN_NRT [doi:10.5067/AMSRU/AU_OCEAN_NRT_R01](https://doi.org/10.5067/AMSRU/AU_OCEAN_NRT_R01); AU_OCEAN [doi:10.5067/9YQRFKKEPUP4](https://doi.org/10.5067/9YQRFKKEPUP4) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Day.md b/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Day.md index 654b776d4c..38f8b6f942 100644 --- a/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Day.md +++ b/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Day.md @@ -4,4 +4,4 @@ Onboard NASA's Aqua satellite, the AMSR-E radiometer measured terrestrial, ocean Data field: `TotalColWaterVapor` -References: [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file +References: AE_Rain [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Night.md b/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Night.md index 460a616460..a88ec93c57 100644 --- a/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Night.md +++ b/config/default/common/config/metadata/layers/amsre/AMSRE_Columnar_Water_Vapor_Night.md @@ -4,4 +4,4 @@ Onboard NASA's Aqua satellite, the AMSR-E radiometer measured terrestrial, ocean Data field: `TotalColWaterVapor` -References: [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file +References: AE_Rain [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Day.md b/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Day.md index 553ff0ae08..6caedb269c 100644 --- a/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Day.md +++ b/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Day.md @@ -6,6 +6,6 @@ Onboard NASA's Aqua satellite, the AMSR-E radiometer measured terrestrial, ocean Data field: `surfacePrecipitation` -References: [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) +References: AE_Rain [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) diff --git a/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Night.md b/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Night.md index 7ee079b598..49f8361628 100644 --- a/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Night.md +++ b/config/default/common/config/metadata/layers/amsre/AMSRE_Surface_Precipitation_Rate_Night.md @@ -6,4 +6,4 @@ Onboard NASA's Aqua satellite, the AMSR-E radiometer measured terrestrial, ocean Data field: `surfacePrecipitation` -References: [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file +References: AE_Rain [doi:10.5067/IR85TKB5BLM3](https://doi.org/10.5067/IR85TKB5BLM3) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.md b/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.md new file mode 100644 index 0000000000..317bf81d4b --- /dev/null +++ b/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.md @@ -0,0 +1,5 @@ +The Surface Soil Moisture C-band (Day, Daily) layer displays level 3, daily, gridded surface soil moisture from the daytime (ascending) overpass. The surface soil moisture is derived from passive microwave remote sensing data from the Advanced Microwave Scanning Radiometer-Earth Observing System (AMSR-E), using the Land Parameter Retrieval Model (LPRM). The LPRM is based on a forward radiative transfer model to retrieve surface soil moisture and vegetation optical depth. + +The spatial resolution is 25 km x 25 km, the imagery resolution is 2 km and temporal availability is daily, covering the period from June 2002 to October 2011. + +References: LPRM_AMSRE_A_SOILM3 [doi:10.5067/X3K5V3NNLYAV](https://doi.org/10.5067/X3K5V3NNLYAV) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.md b/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.md new file mode 100644 index 0000000000..78ad4a4085 --- /dev/null +++ b/config/default/common/config/metadata/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.md @@ -0,0 +1,5 @@ +The Surface Soil Moisture C-band (Night, Daily) layer displays level 3, daily, gridded surface soil moisture from the nighttime (descending) overpass. The surface soil moisture is derived from passive microwave remote sensing data from the Advanced Microwave Scanning Radiometer-Earth Observing System (AMSR-E), using the Land Parameter Retrieval Model (LPRM). The LPRM is based on a forward radiative transfer model to retrieve surface soil moisture and vegetation optical depth. + +The spatial resolution is 25 km x 25 km, the imagery resolution is 2 km and temporal availability is daily, covering the period from June 2002 to October 2011. + +References: LPRM_AMSRE_D_SOILM3 [doi:10.5067/MXL0MFDHWP07](https://doi.org/10.5067/MXL0MFDHWP07) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/modis/Chlorophyll_a.md b/config/default/common/config/metadata/layers/modis/Chlorophyll_a.md index 11e9e3c250..d705c6d071 100644 --- a/config/default/common/config/metadata/layers/modis/Chlorophyll_a.md +++ b/config/default/common/config/metadata/layers/modis/Chlorophyll_a.md @@ -1,4 +1,4 @@ ### About Chlorophyll *a* Chlorophyll is a light harvesting pigment found in most photosynthetic organisms. In the ocean, phytoplankton all contain the chlorophyll pigment, which has a greenish color. Derived from the Greek words _phyto_ (plant) and _plankton_ (made to wander or drift), _phytoplankton_ are microscopic organisms that live in watery environments, both salty and fresh. Some phytoplankton are bacteria, some are protists, and most are single-celled plants. The concentration of chlorophyll *a* is used as an index of phytoplankton biomass. Phytoplankton fix carbon through photosynthesis, taking in dissolved carbon dioxide in the sea water and producing oxygen, enabling phytoplankton to grow. Changes in the amount of phytoplankton indicate the change in productivity of the ocean and as marine phytoplankton capture almost an equal amount of carbon as does photosynthesis by land vegetation, it provides an ocean link to global climate change modeling. The MODIS Chlorophyll *a* product is therefore a useful product for assessing the “health” of the ocean. The presence of phytoplankton indicates sufficient nutrient conditions for phytoplankton to flourish, but harmful algal blooms (HABs) can result when high concentrations of phytoplankton produced toxins build up. Known as red tides, blue-green algae or cyanobacteria, harmful algal blooms have severe impacts on human health, aquatic ecosystems and the economy. Chlorophyll features can also be used to trace oceanographic currents, atmospheric jets/streams and upwelling/downwelling/river plumes. Chlorophyll concentration is also useful for studying the Earth’s climate system as it is plays an integral role in the Global Carbon Cycle. More phytoplankton in the ocean may result in a higher capture rate of carbon dioxide into the ocean and help cool the planet. -References: [OceanColor Web - Level 1&2 Browsers](https://oceancolor.gsfc.nasa.gov/cgi/browse.pl?sen=am); [OceanColor Web - Chlorophyll a](https://oceancolor.gsfc.nasa.gov/atbd/chlor_a/); [NASA Earth Observations - Chlorophyll Concentration](https://neo.gsfc.nasa.gov/view.php?datasetId=MY1DMM_CHLORA) +References: [OceanColor Web - Level 1&2 Browsers](https://oceancolor.gsfc.nasa.gov/cgi/browse.pl?sen=am); [Earthdata Algorithm Publication Tool - Chlorophyll a](https://www.earthdata.nasa.gov/apt/documents/chlor-a/v1.0); [NASA Earth Observations - Chlorophyll Concentration](https://neo.gsfc.nasa.gov/view.php?datasetId=MY1DMM_CHLORA) diff --git a/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md b/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md index 907fc99bbf..1bcf7ac7ce 100644 --- a/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md +++ b/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_L3_SST_MidIR_4km_Night_8Day.md @@ -1,5 +1,5 @@ The MODIS L3 SST 4km layer shows global nighttime sea surface temperature (SST) at a depth of a few micrometers with ranges from -1.8 to 32 degree Celsius. The SST is derived with a Mid-Infrared (Short–Wave) SST Algorithm that uses MODIS bands 22 and 23 at 3.959 and 4.050 μm. This Level 3 product is derived from native 1 km Level 2 SST observations that are mapped to a global 4.63 km grid. The temporal resolution of this MODIS L3 SST is 8-Day. -References: MODIS_AQUA_L3_SST_MID-IR_8DAY_4KM_NIGHTTIME_V2019.0 [doi:10.5067/MODAM-8D4N9](https://doi.org/10.5067/MODAM-8D4N9); Details of the [algorithm](https://oceancolor.gsfc.nasa.gov/atbd/sst4/) can be found at Ocean Biology Processing Group (OBPG/OB.DAAC) website. +References: MODIS_AQUA_L3_SST_MID-IR_8DAY_4KM_NIGHTTIME_V2019.0 [doi:10.5067/MODAM-8D4N9](https://doi.org/10.5067/MODAM-8D4N9); Details of the [algorithm](https://oceancolor.gsfc.nasa.gov/resources/atbd/sst4/) can be found at Ocean Biology Processing Group (OBPG/OB.DAAC) website. P. J. Minnett et al., "Sea-surface temperature measurements from the Moderate-Resolution Imaging Spectroradiometer (MODIS) on Aqua and Terra," IGARSS 2004. 2004 IEEE International Geoscience and Remote Sensing Symposium, Anchorage, AK, 2004, pp. 4576-4579 vol.7. [doi:10.1109/IGARSS.2004.1370173](https://doi.org/10.1109/IGARSS.2004.1370173). diff --git a/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_NDSI_Snow_Cover.md b/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_NDSI_Snow_Cover.md index 8334e3db41..e9fb97a132 100644 --- a/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_NDSI_Snow_Cover.md +++ b/config/default/common/config/metadata/layers/modis/aqua/MODIS_Aqua_NDSI_Snow_Cover.md @@ -2,4 +2,4 @@ The MODIS Snow Cover (Normalized Difference Snow Index (NDSI)) layer shows the p The MODIS Snow Cover (Normalized Difference Snow Index) layer is available from both the Terra (MOD10) and Aqua (MYD10) satellites. The sensor and imagery resolution is 500 m and the temporal resolution is daily. -References: MYD10_L2 [doi:10.5067/MODIS/MYD11_L2.061](https://doi.org/10.5067/MODIS/MYD11_L2.061); [NASA Earth Observations - Snow Cover](https://neo.gsfc.nasa.gov/view.php?datasetId=MOD10C1_M_SNOW) +References: MYD10_L2 [doi:10.5067/MODIS/MYD10_L2.061](https://doi.org/10.5067/MODIS/MYD10_L2.061); [NASA Earth Observations - Snow Cover](https://neo.gsfc.nasa.gov/view.php?datasetId=MOD10C1_M_SNOW) diff --git a/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_Cloud_Water_Path_PCL.md b/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_Cloud_Water_Path_PCL.md index 1a57406153..3284205447 100644 --- a/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_Cloud_Water_Path_PCL.md +++ b/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_Cloud_Water_Path_PCL.md @@ -2,4 +2,4 @@ The MODIS Cloud Water Path (PCL) indicates the amount of water in the atmosphere The MODIS Cloud Water Path layers are available from both the Terra (MOD06) and Aqua (MYD06) satellites for daytime overpasses. The sensor/algorithm resolution is 1 km, imagery resolution is 1 km, and the temporal resolution is daily. -References: [MODIS Atmosphere - Cloud (06_L2)](https://modis-atmos.gsfc.nasa.gov/products/cloud); [NCAR|UCAR Climate Date Guide: Cloud Water Path](https://climatedataguide.ucar.edu/climate-data/liquid-water-path-overview); [GES DISC: Cloud Water Path](https://disc.gsfc.nasa.gov/information/glossary?title=Cloud%20Water%20Path) +References: [MODIS Atmosphere - Cloud (06_L2)](https://modis-atmos.gsfc.nasa.gov/products/cloud); [NCAR|UCAR Climate Date Guide: Cloud Dataset Overview](https://climatedataguide.ucar.edu/climate-data/cloud-dataset-overview); [GES DISC: Cloud Water Path](https://disc.gsfc.nasa.gov/information/glossary?title=Cloud%20Water%20Path) diff --git a/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_L3_Ice_Surface_Temp_Daily_Day.md b/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_L3_Ice_Surface_Temp_Daily_Day.md index a2a5212749..281ec4cf72 100644 --- a/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_L3_Ice_Surface_Temp_Daily_Day.md +++ b/config/default/common/config/metadata/layers/modis/terra/MODIS_Terra_L3_Ice_Surface_Temp_Daily_Day.md @@ -2,4 +2,4 @@ The Ice Surface Temperature (L3, Daily, Day) layer shows daily, daytime ice surf The Moderate Resolution Imaging Spectroradiometer (MODIS) is a 36-band visible to thermal-infrared sensor onboard the Terra and Aqua satellites. Two of the bands are imaged at a nominal resolution of 250 m at nadir, five bands at 500 m, and the remaining bands at 1000 m. -References: MOD29P1D [doi:110.5067/MODIS/MOD29P1D.061](https://doi.org/10.5067/MODIS/MOD29P1D.061) +References: MOD29P1D [doi:10.5067/MODIS/MOD29P1D.061](https://doi.org/10.5067/MODIS/MOD29P1D.061) diff --git a/config/default/common/config/metadata/layers/multi-mission/hls/HLS_MGRS_Granule_Grid.md b/config/default/common/config/metadata/layers/multi-mission/hls/HLS_MGRS_Granule_Grid.md index cbee9224fd..16ec9520ec 100644 --- a/config/default/common/config/metadata/layers/multi-mission/hls/HLS_MGRS_Granule_Grid.md +++ b/config/default/common/config/metadata/layers/multi-mission/hls/HLS_MGRS_Granule_Grid.md @@ -4,4 +4,4 @@ The UTM system divides the Earth’s surface into 60 longitude zones, each 6° o The MGRS/HLS Grid layer is a reference layer and does not change over time. -References: [Harmonized Landsat Sentinel-2 (HLS) Product User Guide](https://lpdaac.usgs.gov/documents/1326/HLS_User_Guide_V2.pdf) +References: [Harmonized Landsat Sentinel-2 (HLS) Product User Guide](https://lpdaac.usgs.gov/documents/1698/HLS_User_Guide_V2.pdf) diff --git a/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md b/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md index 3010e03609..765496deb4 100644 --- a/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md +++ b/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md @@ -1,5 +1,5 @@ ### About HLS The Harmonized Landsat and Sentinel-2 (HLS) project provides consistent surface reflectance data from the Operational Land Imager (OLI) aboard the joint NASA/USGS Landsat 8 and 9 satellites and the Multi-Spectral Instrument (MSI) aboard the European Union’s Copernicus Sentinel-2A and Sentinel-2B satellites. The combined measurements between Landsat 8, Landsat 9, Sentinel-2A, and Sentinel-2B enable global observations of the land every 2-3 days at 30 meter (m) spatial resolution. The HLS project uses a set of algorithms to obtain seamless products from OLI and MSI that include atmospheric correction, cloud and cloud-shadow masking, spatial co-registration and common gridding, illumination and view angle normalization, and spectral bandpass adjustment. -References: [Harmonized Landsat Sentinel-2 (HLS) Product User Guide](https://lpdaac.usgs.gov/documents/1326/HLS_User_Guide_V2.pdf) +References: [Harmonized Landsat Sentinel-2 (HLS) Product User Guide](https://lpdaac.usgs.gov/documents/1698/HLS_User_Guide_V2.pdf) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H.md index 4977c8b484..90dc654d18 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA.md index 5c0129f46e..a0aa42c743 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI.md index 43af858625..0efef9403f 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V.md index f69fd514f2..6f4db04378 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA.md index 4fa9ccf971..2c65786e0f 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI.md index b68bbce558..0bfa262c4f 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H.md index 12315abd1b..f91f3df69c 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA.md index fc891e50c8..b6e71e98f0 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI.md index 60f1ccc187..835daf9e4f 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V.md index 972ad4833a..454aed6c20 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA.md index 92cdd552bf..913105f7b8 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI.md index 6cf0cc7f2d..6d5a0a1929 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 36 k Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB [doi: 10.5067/JJ5FL7FRLKJI](https://doi.org/10.5067/JJ5FL7FRLKJI) +References: SPL1CTB [doi:10.5067/DV7IX2DQ681Y](https://doi.org/10.5067/DV7IX2DQ681Y) Data field: `cell_tb_qual_flag_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H.md index e40ecb89b3..caa210dc84 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_QA.md index ac9bbecb4d..e2f462d494 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_RFI.md index 80ea3fc30c..69a3496c43 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_H_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_h_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V.md index c8def889d1..de500d73ad 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_QA.md index f927aa2c18..64d39fd300 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_RFI.md index 3f02c4cf7e..f430583d15 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Aft_V_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_v_aft` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H.md index fc6fa74809..10cace5b31 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_QA.md index cf31d3d92a..3e781f8538 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_RFI.md index 0a5df8ef57..1ec186fa48 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_H_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_h_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V.md index a5e5b58600..b96910d4f2 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km The SMAP spacecraft carries two instruments, a radar (active) and a radiometer (passive), that together make global measurements of land surface soil moisture and freeze/thaw state. It is useful for monitoring and predicting natural hazards such as floods and droughts, understanding the linkages between Earth’s water, energy and carbon cycles, and reducing uncertainties in predicting weather and climate. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_QA.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_QA.md index 53e8858072..3df0c164bb 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_QA.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_QA.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations have acceptable quality for science use, yellow indicates that caution should be used with the TB observations as one or more quality-impacting conditions have been identified, and red indicates that TB observations are flagged as bad due to unacceptable quality. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_RFI.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_RFI.md index 1268dfe142..04a2b89fb4 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_RFI.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Enhanced_Brightness_Temp_Fore_V_RFI.md @@ -2,6 +2,6 @@ The Soil Moisture Active Passive (SMAP) "Uncorrected Brightness Temperature 9 km Within the image, green indicates that TB observations are free of RFI and approved for science use, yellow indicates that caution should be used with the TB observations as RFI was detected but mitigated, and red indicates that TB observations are flagged as bad due to RFI. -References: SPL1CTB_E [doi:10.5067/XB8K63YM4U8O](https://doi.org/10.5067/XB8K63YM4U8O) +References: SPL1CTB_E [doi:10.5067/99LHDR3NUM47](https://dx.doi.org/10.5067/99LHDR3NUM47) Data field: `cell_tb_qual_flag_v_fore` diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Aft.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Aft.md index 5037e7a7a8..f017457974 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Aft.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Aft.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `faraday_rotation_angle` -References: SPL1BTB_NRT [doi:10.5067/UH70WUPQKCFR](https://doi.org/10.5067/UH70WUPQKCFR); SPL1BTB [doi:10.5067/ZHHBN1KQLI20](https://doi.org/10.5067/ZHHBN1KQLI20) \ No newline at end of file +References: SPL1BTB_NRT [doi:10.5067/UH70WUPQKCFR](https://doi.org/10.5067/UH70WUPQKCFR); SPL1BTB [doi:10.5067/GWYQTF307Y9Y](https://doi.org/10.5067/GWYQTF307Y9Y) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Fore.md b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Fore.md index 334342e1b7..ce7c85603c 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Fore.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L1_Passive_Faraday_Rotation_Fore.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `faraday_rotation_angle` -References: SPL1BTB_NRT [doi:10.5067/UH70WUPQKCFR](https://doi.org/10.5067/UH70WUPQKCFR); SPL1BTB [doi:10.5067/ZHHBN1KQLI20](https://doi.org/10.5067/ZHHBN1KQLI20) \ No newline at end of file +References: SPL1BTB_NRT [doi:10.5067/UH70WUPQKCFR](https://doi.org/10.5067/UH70WUPQKCFR); SPL1BTB [doi:10.5067/GWYQTF307Y9Y](https://doi.org/10.5067/GWYQTF307Y9Y) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option1.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option1.md index 4ae92a5bbd..7618a3d935 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option1.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option1.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option1` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option2.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option2.md index 64223604bf..4581752aa3 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option2.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option2.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option2` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option3.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option3.md index caae007dc5..891ab9c7d4 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option3.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Day_Soil_Moisture_Option3.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option3` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option1.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option1.md index b9f7097e6e..4c64c17863 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option1.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option1.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option1` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option2.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option2.md index daf39396d3..a62b9fa961 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option2.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option2.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option2` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option3.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option3.md index fe3ed26761..f26006e6f4 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option3.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Day_Soil_Moisture_Option3.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option3` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option1.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option1.md index e0f65f4f72..dd012df5da 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option1.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option1.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option1` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option2.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option2.md index 463752a0d2..a4bb2d9dc0 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option2.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option2.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option2` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option3.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option3.md index b202491a35..bd330da298 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option3.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Enhanced_Night_Soil_Moisture_Option3.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option3` -References: SPL2SMP_E [doi:10.5067/LOT311EZHH8S](https://doi.org/10.5067/LOT311EZHH8S) +References: SPL2SMP_E [doi:10.5067/BN36FXOMMC4C](https://doi.org/10.5067/BN36FXOMMC4C) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option1.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option1.md index ac691817f2..cb6c5b7213 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option1.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option1.md @@ -4,7 +4,7 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option1` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option2.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option2.md index 2ed1946f9a..b7d639a806 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option2.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option2.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option2` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option3.md b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option3.md index 8e401fa61f..590a3117af 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option3.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L2_Passive_Night_Soil_Moisture_Option3.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture_option3` -References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/LPJ8F0TAK6E0](https://doi.org/10.5067/LPJ8F0TAK6E0) +References: SPL2SMP_NRT [doi:10.5067/NCTT8THPWRTL](https://doi.org/10.5067/NCTT8THPWRTL); SPL2SMP [doi:10.5067/K7Y2D8QQVZ4L](https://doi.org/10.5067/K7Y2D8QQVZ4L) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_H.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_H.md index 28ee9040db..1f522a597a 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_H.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_H.md @@ -6,6 +6,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `tb_h_corrected` -References: SPL3SMP [doi:10.5067/OMHVSRGFX38O](https://doi.org/10.5067/OMHVSRGFX38O) +References: SPL3SMP [doi:10.5067/4XXOGX0OOW1S](https://doi.org/10.5067/4XXOGX0OOW1S) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_V.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_V.md index 6e6ee3c566..a9aebafe2d 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_V.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Brightness_Temp_V.md @@ -6,6 +6,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `tb_v_corrected` -References: SPL3SMP [doi:10.5067/OMHVSRGFX38O](https://doi.org/10.5067/OMHVSRGFX38O) +References: SPL3SMP [doi:10.5067/4XXOGX0OOW1S](https://doi.org/10.5067/4XXOGX0OOW1S) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Freeze_Thaw.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Freeze_Thaw.md index c1686ea7ba..7060fdc950 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Freeze_Thaw.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Freeze_Thaw.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `freeze_thaw` -References: SPL3FTP [doi:10.5067/ZJOKL452HRLD](https://doi.org/10.5067/ZJOKL452HRLD) +References: SPL3FTP [doi:10.5067/LQQ5I3QVGFTU](https://doi.org/10.5067/LQQ5I3QVGFTU) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Soil_Moisture.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Soil_Moisture.md index b330320ddc..2458d4e285 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Soil_Moisture.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Day_Soil_Moisture.md @@ -4,6 +4,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture` -References: SPL3SMP [doi:10.5067/OMHVSRGFX38O](https://doi.org/10.5067/OMHVSRGFX38O) +References: SPL3SMP [doi:10.5067/4XXOGX0OOW1S](https://doi.org/10.5067/4XXOGX0OOW1S) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Freeze_Thaw.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Freeze_Thaw.md index 3c8d52f276..36934e8a1c 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Freeze_Thaw.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Freeze_Thaw.md @@ -4,6 +4,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `freeze_thaw` -References: SPL3FTP_E [doi:10.5067/ZV08T8J395JB](https://doi.org/10.5067/ZV08T8J395JB) +References: SPL3FTP_E [doi:10.5067/NQLCDOZJYAKX](https://doi.org/10.5067/NQLCDOZJYAKX) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Soil_Moisture.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Soil_Moisture.md index 7475f6057d..758f2de899 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Soil_Moisture.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Day_Soil_Moisture.md @@ -4,6 +4,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture` -References: SPL3SMP_E [doi:10.5067/4DQ54OUIJ9DL](https://doi.org/10.5067/4DQ54OUIJ9DL) +References: SPL3SMP_E [doi:10.5067/M20OXIZHY3RJ](https://doi.org/10.5067/M20OXIZHY3RJ) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Freeze_Thaw.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Freeze_Thaw.md index 9ee716f02e..d183dd22d8 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Freeze_Thaw.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Freeze_Thaw.md @@ -4,5 +4,5 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `freeze_thaw` -References: SPL3FTP_E [doi:10.5067/ZV08T8J395JB](https://doi.org/10.5067/ZV08T8J395JB) +References: SPL3FTP_E [doi:10.5067/NQLCDOZJYAKX](https://doi.org/10.5067/NQLCDOZJYAKX) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Soil_Moisture.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Soil_Moisture.md index f516e04942..375b8acb85 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Soil_Moisture.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Enhanced_Night_Soil_Moisture.md @@ -4,6 +4,6 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture` -References: SPL3SMP_E [doi:10.5067/4DQ54OUIJ9DL](https://doi.org/10.5067/4DQ54OUIJ9DL) +References: SPL3SMP_E [doi:10.5067/M20OXIZHY3RJ](https://doi.org/10.5067/M20OXIZHY3RJ) diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Freeze_Thaw.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Freeze_Thaw.md index b1075d69ca..9f01a07129 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Freeze_Thaw.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Freeze_Thaw.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `freeze_thaw` -References: SPL3FTP [doi:10.5067/ZJOKL452HRLD](https://doi.org/10.5067/ZJOKL452HRLD) \ No newline at end of file +References: SPL3FTP [doi:10.5067/LQQ5I3QVGFTU](https://doi.org/10.5067/LQQ5I3QVGFTU) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Soil_Moisture.md b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Soil_Moisture.md index cd36cfad9a..970a0c8230 100644 --- a/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Soil_Moisture.md +++ b/config/default/common/config/metadata/layers/smap/SMAP_L3_Passive_Night_Soil_Moisture.md @@ -4,4 +4,4 @@ The SMAP spacecraft carries two instruments, a radar (active) and a radiometer ( Data field: `soil_moisture` -References: SPL3SMP [doi:10.5067/OMHVSRGFX38O](https://doi.org/10.5067/OMHVSRGFX38O) +References: SPL3SMP [doi:10.5067/4XXOGX0OOW1S](https://doi.org/10.5067/4XXOGX0OOW1S) diff --git a/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.md b/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.md new file mode 100644 index 0000000000..6283ea9c99 --- /dev/null +++ b/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.md @@ -0,0 +1,5 @@ +The Surface Soil Moisture X-band (Day, Daily) layer displays level 3, daily, gridded surface soil moisture for the daytime overpass. The surface soil moisture information is derived from passive microwave remote sensing data from the Tropical Rainfall Measuring Mission (TRMM) Microwave Imager (TMI), using the Land Parameter Retrieval Model (LPRM). The LPRM is based on a forward radiative transfer model to retrieve surface soil moisture and vegetation optical depth. + +The spatial resolution is 25 km x 25 km, the imagery resolution is 2 km and temporal availability is daily, covering the period from December 1997 to April 2015. + +References: LPRM_TMI_DY_SOILM3 [doi:10.5067/8CHFMAWJQTCP](https://doi.org/10.5067/8CHFMAWJQTCP) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.md b/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.md new file mode 100644 index 0000000000..32e7d483dc --- /dev/null +++ b/config/default/common/config/metadata/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.md @@ -0,0 +1,5 @@ +The Surface Soil Moisture X-band (Night, Daily) layer displays level 3, daily, gridded surface soil moisture for the nighttime overpass. The surface soil moisture information is derived from passive microwave remote sensing data from the Tropical Rainfall Measuring Mission (TRMM) Microwave Imager (TMI), using the Land Parameter Retrieval Model (LPRM). The LPRM is based on a forward radiative transfer model to retrieve surface soil moisture and vegetation optical depth. + +The spatial resolution is 25 km x 25 km, the imagery resolution is 2 km and temporal availability is daily, covering the period from December 1997 to April 2015. + +References: LPRM_TMI_NT_SOILM3 [doi:10.5067/GWHRZEL8SA21](https://doi.org/10.5067/GWHRZEL8SA21) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/Chlorophyll_a.md b/config/default/common/config/metadata/layers/viirs/Chlorophyll_a.md index aa963ca78f..14c0cf1ac8 100644 --- a/config/default/common/config/metadata/layers/viirs/Chlorophyll_a.md +++ b/config/default/common/config/metadata/layers/viirs/Chlorophyll_a.md @@ -1,4 +1,4 @@ ### About Chlorophyll *a* Chlorophyll is a light harvesting pigment found in most photosynthetic organisms. In the ocean, phytoplankton all contain the chlorophyll pigment, which has a greenish color. Derived from the Greek words _phyto_ (plant) and _plankton_ (made to wander or drift), _phytoplankton_ are microscopic organisms that live in watery environments, both salty and fresh. Some phytoplankton are bacteria, some are protists, and most are single-celled plants. The concentration of chlorophyll *a* is used as an index of phytoplankton biomass. Phytoplankton fix carbon through photosynthesis, taking in dissolved carbon dioxide in the sea water and producing oxygen, enabling phytoplankton to grow. Changes in the amount of phytoplankton indicate the change in productivity of the ocean and as marine phytoplankton capture almost an equal amount of carbon as does photosynthesis by land vegetation, it provides an ocean link to global climate change modeling. The Chlorophyll *a* product is therefore a useful product for assessing the “health” of the ocean. The presence of phytoplankton indicates sufficient nutrient conditions for phytoplankton to flourish, but harmful algal blooms (HABs) can result when high concentrations of phytoplankton produced toxins build up. Known as red tides, blue-green algae or cyanobacteria, harmful algal blooms have severe impacts on human health, aquatic ecosystems and the economy. Chlorophyll features can also be used to trace oceanographic currents, atmospheric jets/streams and upwelling/downwelling/river plumes. Chlorophyll concentration is also useful for studying the Earth’s climate system as it is plays an integral role in the Global Carbon Cycle. More phytoplankton in the ocean may result in a higher capture rate of carbon dioxide into the ocean and help cool the planet. -References: [OceanColor Web - Level 1&2 Browsers](https://oceancolor.gsfc.nasa.gov/cgi/browse.pl?sen=am); [OceanColor Web - Chlorophyll a](https://oceancolor.gsfc.nasa.gov/atbd/chlor_a/); [NASA Earth Observations - Chlorophyll Concentration](https://neo.gsfc.nasa.gov/view.php?datasetId=MY1DMM_CHLORA) +References: [OceanColor Web - Level 1&2 Browsers](https://oceancolor.gsfc.nasa.gov/cgi/browse.pl?sen=am); [Earthdata Algorithm Publication Tool - Chlorophyll a](https://www.earthdata.nasa.gov/apt/documents/chlor-a/v1.0); [NASA Earth Observations - Chlorophyll Concentration](https://neo.gsfc.nasa.gov/view.php?datasetId=MY1DMM_CHLORA) diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Day.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Day.md index c5af21e104..78c33dad8d 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Day.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Day.md @@ -1,5 +1,5 @@ The Sea Ice Surface Temperature (Day) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. -The Ice Surface Temperature product is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Ice Surface Temperature layer is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VJ130_NRT [doi:10.5067/VIIRS/VJ130_NRT.002](https://doi.org/10.5067/VIIRS/VJ130_NRT.002); VJ130 [doi:10.5067/BW817SEFZ1TT](https://doi.org/10.5067/BW817SEFZ1TT) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Night.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Night.md index c5af21e104..f283b8c36f 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Night.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Ice_Surface_Temp_Night.md @@ -1,5 +1,5 @@ -The Sea Ice Surface Temperature (Day) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. +The Sea Ice Surface Temperature (Night) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. -The Ice Surface Temperature product is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Ice Surface Temperature layer is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VJ130_NRT [doi:10.5067/VIIRS/VJ130_NRT.002](https://doi.org/10.5067/VIIRS/VJ130_NRT.002); VJ130 [doi:10.5067/BW817SEFZ1TT](https://doi.org/10.5067/BW817SEFZ1TT) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Day.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Day.md index ef529db1df..8eb0922c5c 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Day.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Day.md @@ -2,6 +2,6 @@ The Land Surface Temperature (Day) layer shows the temperature of the land surfa The VJ121 product is developed synergistically with the Moderate Resolution Imaging Spectroradiometer (MODIS) LST&E Version 6.1 product (MOD21) using the same input atmospheric products and algorithmic approach based on the ASTER Temperature Emissivity Separation (TES) technique. The VJ121 product uses a physics-based algorithm to dynamically retrieve both the LST and emissivity simultaneously for VIIRS thermal infrared bands M14 (8.55 µm), M15 (10.76 µm), and M16 (12 µm). The TES algorithm is combined with an improved Water Vapor Scaling (WVS) atmospheric correction scheme to stabilize the retrieval during very warm and humid conditions. The overall objective for NASA VIIRS products is to ensure the algorithms and products are compatible with the MODIS Terra and Aqua algorithms to promote the continuity of the Earth Observation System (EOS) mission. -The Land Surface Temperature (Day) layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Land Surface Temperature layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VJ121_NRT [doi:10.5067/VIIRS/VJ121_NRT.002](https://doi.org/10.5067/VIIRS/VJ121_NRT.002); VJ121 [doi:10.5067/VIIRS/VJ121.002](https://doi.org/10.5067/VIIRS/VJ121.002) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Night.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Night.md index a3f2a6cafc..93eaaf650e 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Night.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Land_Surface_Temp_Night.md @@ -2,6 +2,6 @@ The Land Surface Temperature (Night) layer shows the temperature of the land sur The VJ121 product is developed synergistically with the Moderate Resolution Imaging Spectroradiometer (MODIS) LST&E Version 6.1 product (MOD21) using the same input atmospheric products and algorithmic approach based on the ASTER Temperature Emissivity Separation (TES) technique. The VJ121 product uses a physics-based algorithm to dynamically retrieve both the LST and emissivity simultaneously for VIIRS thermal infrared bands M14 (8.55 µm), M15 (10.76 µm), and M16 (12 µm). The TES algorithm is combined with an improved Water Vapor Scaling (WVS) atmospheric correction scheme to stabilize the retrieval during very warm and humid conditions. The overall objective for NASA VIIRS products is to ensure the algorithms and products are compatible with the MODIS Terra and Aqua algorithms to promote the continuity of the Earth Observation System (EOS) mission. -The Land Surface Temperature (Day) layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Land Surface Temperature layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VJ121_NRT [doi:10.5067/VIIRS/VJ121_NRT.002](https://doi.org/10.5067/VIIRS/VJ121_NRT.002); VJ121 [doi:10.5067/VIIRS/VJ121.002](https://doi.org/10.5067/VIIRS/VJ121.002) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_NDSI_Snow_Cover.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_NDSI_Snow_Cover.md index 3620b178be..50d03636b7 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_NDSI_Snow_Cover.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_NDSI_Snow_Cover.md @@ -1,5 +1,4 @@ -The Snow Cover (Normalized Difference Snow Index (NDSI)) layer shows an estimate of snow cover. It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Snow-covered land typically has very high reflectance in visible bands and very low reflectance in the shortwave infrared bands. The Normalized Difference Snow Index (NDSI) reveals the magnitude of this difference, with values greater than 0 typically indicating the presence of at least some snow. The VIIRS snow cover algorithm computes NDSI using VIIRS image bands I1 (0.64 µm, visible red) and I3 (1.61 µm, shortwave near-infrared) and then applies a series of data screens designed to alleviate -likely errors and flag uncertain snow detections. +The Snow Cover (Normalized Difference Snow Index (NDSI)) layer shows an estimate of snow cover. It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Snow-covered land typically has very high reflectance in visible bands and very low reflectance in the shortwave infrared bands. The Normalized Difference Snow Index (NDSI) reveals the magnitude of this difference, with values greater than 0 typically indicating the presence of at least some snow. The VIIRS snow cover algorithm computes NDSI using VIIRS image bands I1 (0.64 µm, visible red) and I3 (1.61 µm, shortwave near-infrared) and then applies a series of data screens designed to alleviate likely errors and flag uncertain snow detections. The Snow Cover (Normalized Difference Snow Index) layer is available from both the joint NASA/NOAA Suomi NPP (VNP10) and NOAA-20 (VJ110) satellites. The sensor resolution is 375 m, imagery resolution is 500 m, and the temporal resolution is daily. diff --git a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Sea_Ice.md b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Sea_Ice.md index 656675d25c..f9d82a9b18 100644 --- a/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Sea_Ice.md +++ b/config/default/common/config/metadata/layers/viirs/noaa20/VIIRS_NOAA20_Sea_Ice.md @@ -1,5 +1,4 @@ -The Sea Ice Extent layer contain estimates of sea ice cover. It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Following the approach used by MODIS, Sea Ice is detected using the Normalized Difference Snow Index. Snow-covered sea ice typically has very high reflectance in visible bands and very low reflectance in the shortwave infrared bands; the NDSI reveals the magnitude of this difference. The VIIRS sea ice cover algorithm computes NDSI using VIIRS image bands I1 (0.64 µm, visible red) and I3 (1.61 µm, shortwave near-infrared) and then applies a series of data screens designed to alleviate likely errors and flag uncertain sea ice -detections. +The Sea Ice Extent layer contain estimates of sea ice cover. It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the Joint Polar Satellite System's first satellite (JPSS-1/NOAA-20). Following the approach used by MODIS, Sea Ice is detected using the Normalized Difference Snow Index. Snow-covered sea ice typically has very high reflectance in visible bands and very low reflectance in the shortwave infrared bands; the NDSI reveals the magnitude of this difference. The VIIRS sea ice cover algorithm computes NDSI using VIIRS image bands I1 (0.64 µm, visible red) and I3 (1.61 µm, shortwave near-infrared) and then applies a series of data screens designed to alleviate likely errors and flag uncertain sea ice detections. The Sea Ice Extent layer is available from both the joint NASA/NOAA Suomi NPP (VNP29) and NOAA-20 (VJ129) satellites. The sensor resolution is 375 m, imagery resolution is 1 km, and the temporal resolution is daily. diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_Black_Marble.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_Black_Marble.md index 6175d0cc3a..686b00dde7 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_Black_Marble.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_Black_Marble.md @@ -2,4 +2,4 @@ The Black Marble layer is a nighttime view of the Earth, showing visible light e Currently, the Black Marble imagery is available only as a single snapshot in time for 2012 and 2016. The sensor resolution is 750 m and the image resolution is 500 m. The imagery can be visualized in Worldview/Global Imagery Browse Services (GIBS). -References: [Earthdata - Nighttime Lights](https://earthdata.nasa.gov/learn/backgrounders/nighttime-lights); [NASA Earth Observatory: Night Light Maps Open Up New Applications](https://earthobservatory.nasa.gov/Features/NightLights); Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi: 10.1175/BAMS-87-2-191](https://journals.ametsoc.org/doi/abs/10.1175/BAMS-87-2-191); [The Lights of London. NASA Earth Observatory](https://earthobservatory.nasa.gov/IOTD/view.php?id=78674); [Out of the Blue and Into the Black. NASA Earth Observatory](https://earthobservatory.nasa.gov/Features/IntotheBlack/); Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://onlinelibrary.wiley.com/doi/10.1002/2014EF000285/full) +References: [Earthdata - Nighttime Lights](https://earthdata.nasa.gov/learn/backgrounders/nighttime-lights); [NASA Earth Observatory: Night Light Maps Open Up New Applications](https://earthobservatory.nasa.gov/Features/NightLights); Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi: 10.1175/BAMS-87-2-191](https://journals.ametsoc.org/doi/abs/10.1175/BAMS-87-2-191); [The Lights of London. NASA Earth Observatory](https://earthobservatory.nasa.gov/IOTD/view.php?id=78674); [Out of the Blue and Into the Black. NASA Earth Observatory](https://earthobservatory.nasa.gov/Features/IntotheBlack/); Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://doi.org/10.1002/2014EF000285) diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Day.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Day.md index bcb1fb8cf2..1c235ddc89 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Day.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Day.md @@ -1,4 +1,4 @@ -The VIIRS Brightness Temperature, Band I5, Day layer is the brightness temperature, measured in Kelvin (K), calculated from the top-of-the-atmosphere radiances. It does not provide an accurate temperature of either clouds nor the land surface, but it does show relative temperature differences which can be used to distinguish features both in clouds and over clear land. It can be used to distinguish land, sea ice, and open water over the polar regions during winter (in cloudless areas). +The VIIRS Brightness Temperature (Band I5, Day) layer is the brightness temperature, measured in Kelvin (K), calculated from the top-of-the-atmosphere radiances. It does not provide an accurate temperature of either clouds nor the land surface, but it does show relative temperature differences which can be used to distinguish features both in clouds and over clear land. It can be used to distinguish land, sea ice, and open water over the polar regions during winter (in cloudless areas). The VIIRS Brightness Temperature layer is calculated from VIIRS Calibrated Radiances (VNP02) and is available from the joint NASA/NOAA Suomi National Polar orbiting Partnership (Suomi NPP) satellite. The sensor resolution is 375m, the imagery resolution is 250m, and the temporal resolution is daily. diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Night.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Night.md index 83fc1a58ac..9e0b4198e4 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Night.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Brightness_Temp_BandI5_Night.md @@ -1,4 +1,4 @@ -The VIIRS Brightness Temperature, Band I5 Night layer is the brightness temperature, measured in Kelvin (K), calculated from the top-of-the-atmosphere radiances. It does not provide an accurate temperature of either clouds nor the land surface, but it does show relative temperature differences which can be used to distinguish features both in clouds and over clear land. It can be used to distinguish land, sea ice, and open water over the polar regions during winter (in cloudless areas). +The VIIRS Brightness Temperature (Band I5, Night) layer is the brightness temperature, measured in Kelvin (K), calculated from the top-of-the-atmosphere radiances. It does not provide an accurate temperature of either clouds nor the land surface, but it does show relative temperature differences which can be used to distinguish features both in clouds and over clear land. It can be used to distinguish land, sea ice, and open water over the polar regions during winter (in cloudless areas). The VIIRS Brightness Temperature layer is calculated from VIIRS Calibrated Radiances (VNP02) and is available from the joint NASA/NOAA Suomi National Polar orbiting Partnership (Suomi NPP) satellite. The sensor resolution is 375m, the imagery resolution is 250m, and the temporal resolution is daily. diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Clear_Sky_Confidence_Day.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Clear_Sky_Confidence_Day.md index 95dc112023..569c3a2fea 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Clear_Sky_Confidence_Day.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Clear_Sky_Confidence_Day.md @@ -1,4 +1,3 @@ - The Clear Sky Confidence product is the output of a cloud mask designed to work on multiple imaging sensors. Data values range from 0->1 and represent a confidence that clear skies were observed. A value of 1.0 means very high confidence of clear sky. A value of 0.0 means very low confidence of clear sky, or very high confidence that cloudy skies were observed. Confidences <= 0.95 are considered to be cloudy or partially cloudy; hence, when viewing this product we would recommend setting the threshold from 0 -> 0.95. By doing that and having the base layer set as the Corrected Reflectance one can see how effective the product is at masking out clouds. Find out more about the [cloud mask product](https://ladsweb.modaps.eosdis.nasa.gov/missions-and-measurements/products/CLDMSK_L2_VIIRS_SNPP/). References: CLDMSK_L2_VIIRS_SNPP_NRT [doi:10.5067/VIIRS/CLDMSK_L2_VIIRS_SNPP_NRT.001](https://doi.org/10.5067/VIIRS/CLDMSK_L2_VIIRS_SNPP_NRT.001) diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_AtSensor_M15.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_AtSensor_M15.md index c4dfd93359..f3162f3f7b 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_AtSensor_M15.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_AtSensor_M15.md @@ -6,6 +6,6 @@ References: VNP46A1 [doi:10.5067/VIIRS/VNP46A1.001](https://doi.org/10.5067/VIIR Román, M. O., Z. Wang, Q. Sun, V. Kalb, S. D. Miller, A. Molthan, L. Schultz, J. Bell, E. C. Stokes, B. Pandey, K. C. Seto, D. Hall, T. Oda, R. E. Wolfe, G. Lin, N. Golpayegani, S. Devadiga, C. Davidson, S. Sarkar, C. Praderas, J. Schmaltz, R. Boller, J. Stevens, O. M. Ramos Gonzalez, E. Padilla, J. Alonso, Y. Detrés, R. Armstrong, I. Miranda, Y. Conte, N. Marrero, K. MacManus, T. Esch, and E. J. Masuoka. 2018. "NASA’s Black Marble nighttime lights product suite." Remote Sensing of Environment 210 113-143 [doi:10.1016/j.rse.2018.03.017](https://doi.org/10.1016/j.rse.2018.03.017) -Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi: 10.1175/BAMS-87-2-191](https://journals.ametsoc.org/doi/abs/10.1175/BAMS-87-2-191) +Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi:10.1175/BAMS-87-2-191](https://doi.org/10.1175/BAMS-87-2-191) -Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://onlinelibrary.wiley.com/doi/10.1002/2014EF000285/full) +Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://doi.org/10.1002/2014EF000285) diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_At_Sensor_Radiance.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_At_Sensor_Radiance.md index 265f4742d3..f3f6a5ba14 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_At_Sensor_Radiance.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_DayNightBand_At_Sensor_Radiance.md @@ -11,6 +11,6 @@ References: VNP46A1 [doi:10.5067/VIIRS/VNP46A1.001](https://doi.org/10.5067/VIIR Román, M. O., Z. Wang, Q. Sun, V. Kalb, S. D. Miller, A. Molthan, L. Schultz, J. Bell, E. C. Stokes, B. Pandey, K. C. Seto, D. Hall, T. Oda, R. E. Wolfe, G. Lin, N. Golpayegani, S. Devadiga, C. Davidson, S. Sarkar, C. Praderas, J. Schmaltz, R. Boller, J. Stevens, O. M. Ramos Gonzalez, E. Padilla, J. Alonso, Y. Detrés, R. Armstrong, I. Miranda, Y. Conte, N. Marrero, K. MacManus, T. Esch, and E. J. Masuoka. 2018. "NASA’s Black Marble nighttime lights product suite." Remote Sensing of Environment 210 113-143 [doi:10.1016/j.rse.2018.03.017](https://doi.org/10.1016/j.rse.2018.03.017) -Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi: 10.1175/BAMS-87-2-191](https://journals.ametsoc.org/doi/abs/10.1175/BAMS-87-2-191) +Lee, T., S. Miller, F. Turk, C. Schueler, R. Julian, S. Deyo, P. Dills, and S. Wang, 2006: The NPOESS VIIRS Day/Night Visible Sensor. Bull. Amer. Meteor. Soc., 87, 191–199, [doi:10.1175/BAMS-87-2-191](https://doi.org/10.1175/BAMS-87-2-191) -Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://onlinelibrary.wiley.com/doi/10.1002/2014EF000285/full) +Román, M. O. and Stokes, E. C. (2015), Holidays in lights: Tracking cultural patterns in demand for energy services. Earth's Future, 3: 182–205. [doi:10.1002/2014EF000285](https://doi.org/10.1002/2014EF000285) diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Day.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Day.md index dc66be4357..bba0ca5723 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Day.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Day.md @@ -1,5 +1,5 @@ The Sea Ice Surface Temperature (Day) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Suomi National Polar-orbiting Partnership (Suomi NPP) satellite. Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. -The Ice Surface Temperature product is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Ice Surface Temperature layer is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VNP30_NRT [doi:10.5067/VIIRS/VNP30_NRT.002](https://doi.org/10.5067/VIIRS/VNP30_NRT.002); VNP30 [doi:10.5067/SC6UQYYRF79V](https://doi.org/10.5067/SC6UQYYRF79V) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Night.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Night.md index dc66be4357..37efa854be 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Night.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Ice_Surface_Temp_Night.md @@ -1,5 +1,5 @@ -The Sea Ice Surface Temperature (Day) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Suomi National Polar-orbiting Partnership (Suomi NPP) satellite. Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. +The Sea Ice Surface Temperature (Night) layer shows the "skin" temperature of the sea ice surface measured in Kelvin (K). It is derived from radiance data acquired by the Visible Infrared Imaging Radiometer Suite (VIIRS) aboard the joint NASA/NOAA Suomi National Polar-orbiting Partnership (Suomi NPP) satellite. Following the approach used by MODIS, the algorithm converts VIIRS calibrated radiances into brightness temperature and computes Ice Surface Temperature (IST) using a split-window technique. Sea Ice Surface Temperature (IST) is an indicator of freeze/thaw processes on ice and has been used to separate thin ice from open water. -The Ice Surface Temperature product is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Ice Surface Temperature layer is available for the Suomi NPP (VNP29) and JPSS-1/NOAA-20 (VJ129) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VNP30_NRT [doi:10.5067/VIIRS/VNP30_NRT.002](https://doi.org/10.5067/VIIRS/VNP30_NRT.002); VNP30 [doi:10.5067/SC6UQYYRF79V](https://doi.org/10.5067/SC6UQYYRF79V) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Day.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Day.md index 5b24475d0b..8cff155b08 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Day.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Day.md @@ -2,6 +2,6 @@ The Land Surface Temperature (Day) layer shows the temperature of the land surfa The VJ121 product is developed synergistically with the Moderate Resolution Imaging Spectroradiometer (MODIS) LST&E Version 6.1 product (MOD21) using the same input atmospheric products and algorithmic approach based on the ASTER Temperature Emissivity Separation (TES) technique. The VJ121 product uses a physics-based algorithm to dynamically retrieve both the Land Surface Temperature (LST) and emissivity simultaneously for VIIRS thermal infrared bands M14 (8.55 µm), M15 (10.76 µm), and M16 (12 µm). The TES algorithm is combined with an improved Water Vapor Scaling (WVS) atmospheric correction scheme to stabilize the retrieval during very warm and humid conditions. The overall objective for NASA VIIRS products is to ensure the algorithms and products are compatible with the MODIS Terra and Aqua algorithms to promote the continuity of the Earth Observation System (EOS) mission. -The Land Surface Temperature (Day) layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Land Surface Temperature layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VNP21_NRT [doi:10.5067/VIIRS/VNP21_NRT.002](https://doi.org/10.5067/VIIRS/VNP21_NRT.002); VNP21 [doi:10.5067/VIIRS/VNP21.002](https://doi.org/10.5067/VIIRS/VNP21.002) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Night.md b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Night.md index e0906fa028..1541d468df 100644 --- a/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Night.md +++ b/config/default/common/config/metadata/layers/viirs/snpp/VIIRS_SNPP_Land_Surface_Temp_Night.md @@ -2,6 +2,6 @@ The Land Surface Temperature (Night) layer shows the temperature of the land sur The VJ121 product is developed synergistically with the Moderate Resolution Imaging Spectroradiometer (MODIS) LST&E Version 6.1 product (MOD21) using the same input atmospheric products and algorithmic approach based on the ASTER Temperature Emissivity Separation (TES) technique. The VJ121 product uses a physics-based algorithm to dynamically retrieve both the Land Surface Temperature (LST) and emissivity simultaneously for VIIRS thermal infrared bands M14 (8.55 µm), M15 (10.76 µm), and M16 (12 µm). The TES algorithm is combined with an improved Water Vapor Scaling (WVS) atmospheric correction scheme to stabilize the retrieval during very warm and humid conditions. The overall objective for NASA VIIRS products is to ensure the algorithms and products are compatible with the MODIS Terra and Aqua algorithms to promote the continuity of the Earth Observation System (EOS) mission. -The Land Surface Temperature (Night) layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. +The Land Surface Temperature layer is available from both the joint NASA/NOAA Suomi NPP (VNP21) and NOAA-20 (VJ121) satellites. The sensor resolution is 750 m, imagery resolution is 1 km, and the temporal resolution is daily. References: VNP21_NRT [doi:10.5067/VIIRS/VNP21_NRT.002](https://doi.org/10.5067/VIIRS/VNP21_NRT.002); VNP21 [doi:10.5067/VIIRS/VNP21.002](https://doi.org/10.5067/VIIRS/VNP21.002) \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/dust_storms_overview_2019/step001.md b/config/default/common/config/metadata/stories/dust_storms_overview_2019/step001.md index f84a47bc59..80036a65e0 100644 --- a/config/default/common/config/metadata/stories/dust_storms_overview_2019/step001.md +++ b/config/default/common/config/metadata/stories/dust_storms_overview_2019/step001.md @@ -1,3 +1,3 @@ Sand and dust storms commonly occur in arid and semi-arid regions, like deserts. Strong winds pick up dust and sand from areas with dry, bare soils, lift the dust into the atmosphere, and can transport the dust many, many kilometers away. Main sources of dust are Northern Africa, the Arabian Peninsula, Central Asia and China. Areas like Australia, America and South Africa have minor contributions, yet are still important. Providing a general idea of where the major dust contributors are, this Dust Surface Mass Concentration layer from the Modern-Era Retrospective analysis for Research and Applications, Version 2 (MERRA-2) shows the dust surface mass concentrations for February 2019. MERRA-2 assimilates space-based observations and model-bases analyses to produce long-term, global information on the Earth System. -References: [World Meteorological Organization: Sand and Dust Storms](https://public.wmo.int/en/our-mandate/focus-areas/environment/SDS); [Global Modeling and Assimilation Office: Modern-Era Retrospective analysis for Research and Applications, Version 2](https://gmao.gsfc.nasa.gov/reanalysis/MERRA-2/) +References: [Global Modeling and Assimilation Office: Modern-Era Retrospective analysis for Research and Applications, Version 2](https://gmao.gsfc.nasa.gov/reanalysis/MERRA-2/) diff --git a/config/default/common/config/metadata/stories/geostationary/step002.md b/config/default/common/config/metadata/stories/geostationary/step002.md index 793906c91d..fa98f0da54 100644 --- a/config/default/common/config/metadata/stories/geostationary/step002.md +++ b/config/default/common/config/metadata/stories/geostationary/step002.md @@ -1 +1 @@ -Worldview now has imagery from several geostationary satellites! These satellites follow the same direction and rate of the Earth's rotation, so from Earth, it appears the satellite is fixed in one location. This means the satellite captures the same view of Earth and provides almost continuous coverage of one area. Worldview has imagery from the Geostationary Operational Environmental Satellites-East (GOES-East), GOES-West, and Himawari-8. The geostationary imagery is available in 10 minute increments, available approximately 30 to 40 minutes after satellite observation, and on a rolling 30 to 90 day basis. \ No newline at end of file +Worldview now has imagery from several geostationary satellites! These satellites follow the same direction and rate of the Earth's rotation, so from Earth, it appears the satellite is fixed in one location. This means the satellite captures the same view of Earth and provides almost continuous coverage of one area. Worldview has imagery from the Geostationary Operational Environmental Satellites-East (GOES-East), GOES-West, and Himawari-8. The geostationary imagery is available in 10 minute increments, available approximately 30 to 40 minutes after satellite observation, and on a rolling 90 day basis. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step001.md b/config/default/common/config/metadata/stories/surface_water_extent/step001.md new file mode 100644 index 0000000000..1f92208e86 --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step001.md @@ -0,0 +1 @@ +Near-global surface water extent at 30 meter resolution is available in Worldview through the Observational Products for End-Users from Remote Sensing Analysis (OPERA) project. The Level-3 product maps surface water every few days. The layer has 5 classifications: Not Water, Open Water, Partial Surface Water, Snow/Ice, and Cloud. The input dataset is the Harmonized Landsat Sentinel-2 (HLS) dataset, and currently uses data from Landsat 8, Sentinel-2A and Sentinel-2B. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step002.md b/config/default/common/config/metadata/stories/surface_water_extent/step002.md new file mode 100644 index 0000000000..4e75edb368 --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step002.md @@ -0,0 +1 @@ +The Laguna de Aculeo is a two hours' drive from Santiago, Chile and was a long-time popular summer vacationing spot to go boating, swimming, and water skiing. A combination of nearby population growth, purchasing of water rights for agriculture, and drought caused the shallow lake to go dry in 2018. This true-color reflectance image from 18 May 2023 from the European Space Agency's (ESA) Sentinel-2A and -2B satellites show a dry lake bed in shades of brown in the center of the map. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step003.md b/config/default/common/config/metadata/stories/surface_water_extent/step003.md new file mode 100644 index 0000000000..2e2a06bfe3 --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step003.md @@ -0,0 +1 @@ +An intense winter storm fueled by an atmospheric river in late-August 2023 caused the lake to partially refill. The image on the left shows the dried lake bed on 18 May 2023, and the image on the right shows the partially filled lake on 15 September 2023. Swipe the bar back and forth to see the lake fill and turn greenish blue on the right "B" side of the map. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step004.md b/config/default/common/config/metadata/stories/surface_water_extent/step004.md new file mode 100644 index 0000000000..5577444dde --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step004.md @@ -0,0 +1,3 @@ +The OPERA surface water extent layer helps to highlight the refilled lake in shades of blue, indicating open water and partial surface water. The layer is designed to improve our understanding of the spatial and temporal variations of land inundation by surface water. It is currently unclear how long this lake will remain filled, but as of 19 December 2023 in the right image, the lake appears to be at a similar water level as the left image from 15 September. + +Learn more at Earth Observatory's [Water Returns to Laguna de Acuelo](https://earthobservatory.nasa.gov/images/151836/water-returns-to-laguna-de-aculeo). \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step005.md b/config/default/common/config/metadata/stories/surface_water_extent/step005.md new file mode 100644 index 0000000000..970e19f823 --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step005.md @@ -0,0 +1 @@ +The Indus River Valley receives heavy monsoon rains each summer which contribute to the appearance of extensive surface water. These false-color reflectance images from Landsat 8 show water in dark blues. The left image is from 3 May 2023, before the monsoon rains, and the right side is from 7 August 2023. Swiping the bar back and forth reveals the extent of floodwaters along the riverbanks and in the surrounding region. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step006.md b/config/default/common/config/metadata/stories/surface_water_extent/step006.md new file mode 100644 index 0000000000..8d6ced3909 --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step006.md @@ -0,0 +1 @@ +The OPERA surface water extent layer shows the floodwaters very clearly in shades of dark and light blue. It highlights how much surface water there is beyond the meandering river banks and the water covering the surrounding region. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step007.md b/config/default/common/config/metadata/stories/surface_water_extent/step007.md new file mode 100644 index 0000000000..48978ba27f --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step007.md @@ -0,0 +1,2 @@ +The Kakhovka Dam, along the Dnieper River in Ukraine was breached on 6 June 2023. The left image is from 5 June 2023, and shows the filled Kakhovka Reservoir in the right portion of the map. The right image is from 5 July 2023 and shows the drained reservoir. Turn on and off the OPERA surface water extent layer to see that the reservoir is no longer full of water, but is mostly brown, exposed ground. + diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step008.md b/config/default/common/config/metadata/stories/surface_water_extent/step008.md new file mode 100644 index 0000000000..4654f2792b --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step008.md @@ -0,0 +1 @@ +Zooming in closer, it is evident that the dam was breached. Swipe the bar back and forth to compare the amount of water in the reservoir between 5 June 2023 and 4 August 2023. The right image shows light brown, exposed land of the drained reservoir. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step009.md b/config/default/common/config/metadata/stories/surface_water_extent/step009.md new file mode 100644 index 0000000000..e96bb5360c --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step009.md @@ -0,0 +1 @@ +Tulare Lake in San Joaquin Valley, California, was once the largest freshwater lake west of the Mississippi River but feeder rivers were diverted for irrigation and municipal water use. Since the 1920s, the dry lake bed has been used to grow crops like almonds and tomatoes. Drag the comparison slider to the right "B" side shows how heavy rains caused the area to flood and re-fill. \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/step010.md b/config/default/common/config/metadata/stories/surface_water_extent/step010.md new file mode 100644 index 0000000000..85a4111ccb --- /dev/null +++ b/config/default/common/config/metadata/stories/surface_water_extent/step010.md @@ -0,0 +1,3 @@ +Storm Ciarán hit northwestern France on 1 November 2023 and moved to Britain and western Europe on 2 November causing heavy rains and strong winds. This comparison of northwestern Tuscany shows 2 October 2023 on the "A" left side, and 3 November on the "B" right side. The "B" side shows flooded agricultural fields near the river banks in dark and light blue. + +Read more at Earth Observatory's [Flooding in Tuscany](https://earthobservatory.nasa.gov/images/152051/flooding-in-tuscany). \ No newline at end of file diff --git a/config/default/common/config/metadata/stories/surface_water_extent/surface-water-extent.png b/config/default/common/config/metadata/stories/surface_water_extent/surface-water-extent.png new file mode 100644 index 0000000000000000000000000000000000000000..764606fda5e9fb73f106f470d6c6936e485126cc GIT binary patch literal 122532 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 z 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 N002ovPDHLkV1fX6Cb<9r literal 0 HcmV?d00001 diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index c523a2cca9..50c02f43d9 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -414,6 +414,10 @@ "LPRM_AMSR2_Surface_Soil_Moisture_C1_Band_Night_Daily", "LPRM_AMSR2_Downscaled_Surface_Soil_Moisture_C1_Band_Day_Daily", "LPRM_AMSR2_Downscaled_Surface_Soil_Moisture_C1_Band_Night_Daily", + "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily", + "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily", + "LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily", + "LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily", "AMSUA_NOAA15_Brightness_Temp_Channel_1", "AMSUA_NOAA15_Brightness_Temp_Channel_2", "AMSUA_NOAA15_Brightness_Temp_Channel_3", diff --git a/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.json b/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.json new file mode 100644 index 0000000000..82eb6b5f78 --- /dev/null +++ b/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.json @@ -0,0 +1,11 @@ +{ + "layers": { + "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily": { + "id": "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily", + "description": "amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily", + "tags": "amsre", + "group": "overlays", + "layergroup": "Soil Moisture" + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.json b/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.json new file mode 100644 index 0000000000..755c6b5a2e --- /dev/null +++ b/config/default/common/config/wv.json/layers/amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily.json @@ -0,0 +1,11 @@ +{ + "layers": { + "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily": { + "id": "LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily", + "description": "amsre/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Night_Daily", + "tags": "amsre", + "group": "overlays", + "layergroup": "Soil Moisture" + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Landsat.json index 39f5b3f574..cba52e0230 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_Customizable_Landsat": { "id": "HLS_Customizable_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "HLS Customizable Landsat 8 & 9 *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_Customizable_Landsat", @@ -20,6 +22,7 @@ }, "disableSnapshot": true, "wrapX": false, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Sentinel.json index cd3fa11203..3f25484058 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Customizable_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_Customizable_Sentinel": { "id": "HLS_Customizable_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "HLS Customizable Sentinel 2A & 2B *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_Customizable_Sentinel", @@ -14,12 +16,13 @@ "orbitTracks": ["OrbitTracks_Sentinel-2A_Descending", "OrbitTracks_Sentinel-2B_Descending"], "orbitDirection": ["descending", "descending"], "bandCombo": { - "r": "B07", - "g": "B05", + "r": "B12", + "g": "B8A", "b": "B04" }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Landsat.json index 1792544917..8feec12659 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Landsat": { "id": "HLS_False_Color_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Reflectance (Color Infrared, Bands 5-4-3) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_False_Color_Landsat", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Sentinel.json index 2b708ff334..e36e1a5e1a 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Sentinel": { "id": "HLS_False_Color_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Reflectance (Color Infrared, Bands 8-4-3) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_False_Color_Sentinel", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Landsat.json index 0bef4e5f4d..31362c0037 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Urban_Landsat": { "id": "HLS_False_Color_Urban_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Reflectance (Urban False Color, Bands 7-6-4) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_False_Color_Urban_Landsat", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Sentinel.json index 092e2aa05e..c7795a5b91 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Urban_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Urban_Sentinel": { "id": "HLS_False_Color_Urban_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Reflectance (Urban False Color, Bands 12-11-4) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_False_Color_Urban_Sentinel", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Landsat.json index 37c7f7cc11..d16ca639e9 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Vegetation_Landsat": { "id": "HLS_False_Color_Vegetation_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Reflectance (Vegetative Analysis False Color, Bands 6-5-4) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_False_Color_Vegetation_Landsat", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Sentinel.json index 3586a3e1b9..0c9c2f928d 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_False_Color_Vegetation_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_False_Color_Vegetation_Sentinel": { "id": "HLS_False_Color_Vegetation_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Reflectance (Vegetative Analysis False Color, Bands 11-8A-4) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_False_Color_Vegetation_Sentinel", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_L30_Nadir_BRDF_Adjusted_Reflectance.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_L30_Nadir_BRDF_Adjusted_Reflectance.json index 3a81c87464..f5255bd923 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_L30_Nadir_BRDF_Adjusted_Reflectance.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_L30_Nadir_BRDF_Adjusted_Reflectance.json @@ -2,6 +2,7 @@ "layers": { "HLS_L30_Nadir_BRDF_Adjusted_Reflectance": { "id": "HLS_L30_Nadir_BRDF_Adjusted_Reflectance", + "enableCMRDataFinder": true, "description": "multi-mission/hls/HLS_L30_Nadir_BRDF_Adjusted_Reflectance", "tags": "corrected surface landsat oli sentinel msi s30", "group": "overlays", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Landsat.json index b3496d525b..84c5ec875c 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_Moisture_Index_Landsat": { "id": "HLS_Moisture_Index_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Moisture Index (NDMI) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_Moisture_Index_Landsat", @@ -20,6 +22,7 @@ "colormap_name": "jet_r" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Sentinel.json index 4a42c8f498..fb789f0a9e 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Moisture_Index_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_Moisture_Index_Sentinel": { "id": "HLS_Moisture_Index_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Moisture Index (NDMI) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_Moisture_Index_Sentinel", @@ -20,6 +22,7 @@ "colormap_name": "jet_r" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Landsat.json index 9f09d3b2f9..d4899fba97 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDSI_Landsat": { "id": "HLS_NDSI_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Snow Index (NDSI) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_NDSI_Landsat", @@ -20,6 +22,7 @@ "colormap_name": "winter_r" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Sentinel.json index 1b17eca0b1..843d765beb 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDSI_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDSI_Sentinel": { "id": "HLS_NDSI_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Snow Index (NDSI) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_NDSI_Sentinel", @@ -20,6 +22,7 @@ "colormap_name": "winter_r" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Landsat.json index 833868b5db..b134c91a88 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDVI_Landsat": { "id": "HLS_NDVI_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Vegetation Index (NDVI) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_NDVI_Landsat", @@ -20,6 +22,7 @@ "colormap_name": "greens" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Sentinel.json index 85b734138a..9661d2156c 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDVI_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDVI_Sentinel": { "id": "HLS_NDVI_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Vegetation Index (NDVI) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_NDVI_Sentinel", @@ -20,6 +22,7 @@ "colormap_name": "greens" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Landsat.json index 7ca0419c38..76155c860e 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDWI_Landsat": { "id": "HLS_NDWI_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Water Index (NDWI) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_NDWI_Landsat", @@ -20,6 +22,7 @@ "colormap_name": "gnbu" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Sentinel.json index b012a82c6e..920f852402 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_NDWI_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_NDWI_Sentinel": { "id": "HLS_NDWI_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Water Index (NDWI) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_NDWI_Sentinel", @@ -20,6 +22,7 @@ "colormap_name": "gnbu" }, "disableSnapshot": true, + "minZoom": 7, "wrapX": false, "projections": { "geographic": { diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_S30_Nadir_BRDF_Adjusted_Reflectance.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_S30_Nadir_BRDF_Adjusted_Reflectance.json index f4e655d0e5..8c252cd792 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_S30_Nadir_BRDF_Adjusted_Reflectance.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_S30_Nadir_BRDF_Adjusted_Reflectance.json @@ -2,6 +2,7 @@ "layers": { "HLS_S30_Nadir_BRDF_Adjusted_Reflectance": { "id": "HLS_S30_Nadir_BRDF_Adjusted_Reflectance", + "enableCMRDataFinder": true, "description": "multi-mission/hls/HLS_S30_Nadir_BRDF_Adjusted_Reflectance", "tags": "corrected surface landsat oli sentinel msi s30", "group": "overlays", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Landsat.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Landsat.json index ef7e7f8f71..a97fa5d3cc 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Landsat.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Landsat.json @@ -2,6 +2,8 @@ "layers": { "HLS_Shortwave_Infrared_Landsat": { "id": "HLS_Shortwave_Infrared_Landsat", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957657-LPCLOUD", "title": "Reflectance (Shortwave Infrared, Bands 7-5-4) *BETA*", "subtitle": "Landsat 8 & 9 / OLI", "description": "multi-mission/hls/HLS_Shortwave_Infrared_Landsat", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Sentinel.json b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Sentinel.json index 84b8b3e9a7..5f1a9d9328 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Sentinel.json +++ b/config/default/common/config/wv.json/layers/multi-mission/hls/HLS_Shortwave_Infrared_Sentinel.json @@ -2,6 +2,8 @@ "layers": { "HLS_Shortwave_Infrared_Sentinel": { "id": "HLS_Shortwave_Infrared_Sentinel", + "enableCMRDataFinder": true, + "collectionConceptID": "C2021957295-LPCLOUD", "title": "Reflectance (Shortwave Infrared, Bands 12-8A-4) *BETA*", "subtitle": "Sentinel 2A & 2B / MSI", "description": "multi-mission/hls/HLS_Shortwave_Infrared_Sentinel", @@ -20,6 +22,7 @@ }, "wrapX": false, "disableSnapshot": true, + "minZoom": 7, "projections": { "geographic": { "source": "DDV", diff --git a/config/default/common/config/wv.json/layers/multi-mission/opera/OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional.json b/config/default/common/config/wv.json/layers/multi-mission/opera/OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional.json index de33424e5a..e3c874a587 100644 --- a/config/default/common/config/wv.json/layers/multi-mission/opera/OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional.json +++ b/config/default/common/config/wv.json/layers/multi-mission/opera/OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional.json @@ -2,6 +2,7 @@ "layers": { "OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional": { "id": "OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional", + "enableCMRDataFinder": true, "description": "multi-mission/opera/OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional", "tags": "podaac PO.DAAC DSWx flood", "group": "overlays", diff --git a/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.json b/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.json new file mode 100644 index 0000000000..ef4928452b --- /dev/null +++ b/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.json @@ -0,0 +1,11 @@ +{ + "layers": { + "LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily": { + "id": "LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily", + "description": "trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily", + "tags": "trmm tmi", + "group": "overlays", + "layergroup": "Soil Moisture" + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.json b/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.json new file mode 100644 index 0000000000..33adcd37a0 --- /dev/null +++ b/config/default/common/config/wv.json/layers/trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily.json @@ -0,0 +1,11 @@ +{ + "layers": { + "LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily": { + "id": "LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily", + "description": "trmm/LPRM_TMI_Surface_Soil_Moisture_X_Band_Night_Daily", + "tags": "trmm tmi", + "group": "overlays", + "layergroup": "Soil Moisture" + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/stories/default/surface_water_extent.json b/config/default/common/config/wv.json/stories/default/surface_water_extent.json new file mode 100644 index 0000000000..b412b40b2f --- /dev/null +++ b/config/default/common/config/wv.json/stories/default/surface_water_extent.json @@ -0,0 +1,114 @@ +{ + "stories": { + "surface_water_extent": { + "id": "surface_water_extent", + "type": "default", + "title": "Surface Water Extent", + "description": "View near-global surface water extent at 30 meter resolution in Worldview.", + "backgroundImage": "", + "backgroundImageHover": "", + "readMoreLinks": [ + { + "title": "Observational Products for End-Users from Remote Sensing Analysis", + "link": "https://www.jpl.nasa.gov/go/opera" + }, + { + "title": "OPERA - DSWx Product Suite", + "link": "https://www.jpl.nasa.gov/go/opera/products/dswx-product-suite" + } + ], + "steps": [ + { + "id": "001", + "description": "step001.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=-174.25840338686484,-75.27671304270082,141.53238355885279,76.68146944943469&l=Coastlines_15m,Reference_Features_15m,Reference_Labels_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden),Land_Water_Map&lg=true&t=2023-09-16-T19%3A28%3A37Z" + }, + { + "id": "002", + "description": "step002.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=-71.08920797480265,-33.94007931277668,-70.7352894090859,-33.76590273267728&l=Reference_Labels_15m,Coastlines_15m,HLS_S30_Nadir_BRDF_Adjusted_Reflectance,Land_Water_Map&lg=truet&t=2023-05-18-T02%3A00%3A00Z" + }, + { + "id": "003", + "description": "step003.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=-71.07486930852178,-33.93245949860628,-70.75488664634847,-33.778484190323425&l=Reference_Labels_15m,Coastlines_15m,HLS_L30_Nadir_BRDF_Adjusted_Reflectance,HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden)&lg=true&l1=Reference_Labels_15m,Coastlines_15m,HLS_L30_Nadir_BRDF_Adjusted_Reflectance,HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden)&lg1=true&ca=false&t=2023-05-18-T02%3A00%3A00Z&t1=2023-09-15-T13%3A50%3A15Z" + }, + { + "id": "004", + "description": "step004.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=-71.05340019654669,-33.914504013845885,-70.78826085072096,-33.786919249614755&l=Reference_Labels_15m,Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-3-0-4),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg=true&l1=Reference_Labels_15m,Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0-3-4),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg1=true&ca=false&cv=53&t=2023-09-15-T02%3A00%3A00Z&t1=2023-12-19-T19%3A06%3A41Z" + }, + { + "id": "005", + "description": "step005.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=66.26097333885345,26.79208364911574,70.01383041589206,28.63900515761756&l=Reference_Labels_15m,Reference_Features_15m(hidden),Coastlines_15m,HLS_Customizable_Landsat(bandCombo=%7B%22r%22%3A%22B07%22;%22g%22%3A%22B05%22;%22b%22%3A%22B04%22%7D),Land_Water_Map&lg=true&l1=Reference_Labels_15m,Reference_Features_15m(hidden),Coastlines_15m,HLS_Customizable_Landsat(bandCombo=%7B%22r%22%3A%22B07%22;%22g%22%3A%22B05%22;%22b%22%3A%22B04%22%7D),Land_Water_Map&lg1=true&ca=true&t=2023-05-03-T13%3A24%3A03Z&t1=2023-08-07-T05%3A24%3A03Z" + }, + { + "id": "006", + "description": "step006.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=66.26097333885345,26.79208364911574,70.01383041589206,28.63900515761756&l=Reference_Labels_15m,Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-4-0-3),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,and_Water_Map&lg=true&l1=Reference_Labels_15m,Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-4-0-3),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,Land_Water_Map&lg1=true&ca=false&t=2023-05-03-T13%3A24%3A03Z&t1=2023-08-07-T05%3A24%3A03Z" + }, + { + "id": "007", + "description": "step007.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=30.53197246393441,45.73511857652907,37.0819472324028,48.88695929617898&l=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg=true&l1=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg1=true&ca=false&cv=49&s=33.3662,46.7822%2B33.3662,46.7822&t=2023-06-05-T03%3A54%3A43Z&t1=2023-07-05-T07%3A54%3A43Z" + }, + { + "id": "008", + "description": "step008.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=33.22962382325344,46.70316794794333,33.49071034396659,46.83165840222557&l=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg=true&l1=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0),HLS_L30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_S30_Nadir_BRDF_Adjusted_Reflectance&lg1=true&ca=true&cv=50&t=2023-06-05-T03%3A54%3A43Z&t1=2023-08-04-T07%3A54%3A43Z" + }, + { + "id": "009", + "description": "step009.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=-120.85451125731684,35.39445775071759,-118.54001784177758,36.53350663605869&l=Reference_Labels_15m,Reference_Features_15m,Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(hidden,disabled=5),HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,Land_Water_Map&lg=true&l1=Reference_Labels_15m,Reference_Features_15m,Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=0-4),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden),Land_Water_Map&lg1=true&ca=false&cm=opacity&t=2023-04-30-T15%3A35%3A22Z&t1=2023-04-30-T09%3A35%3A22Z" + }, + { + "id": "010", + "description": "step010.html", + "transition": { + "element": "", + "action": "" + }, + "stepLink": "v=9.858292854006226,43.29704344520309,11.057128062815007,43.8870351466844&l=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-4-0-3),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden),Land_Water_Map&lg=true&l1=Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,OPERA_L3_Dynamic_Surface_Water_Extent-HLS_Provisional(disabled=5-0-3-4),HLS_L30_Nadir_BRDF_Adjusted_Reflectance,HLS_S30_Nadir_BRDF_Adjusted_Reflectance(hidden),Land_Water_Map&lg1=true&ca=false&t=2023-10-02-T19%3A45%3A11Z&t1=2023-11-03-T19%3A45%3A11Z" + } + ] + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/storyOrder.json b/config/default/common/config/wv.json/storyOrder.json index dd4712ec5b..51a3aac260 100644 --- a/config/default/common/config/wv.json/storyOrder.json +++ b/config/default/common/config/wv.json/storyOrder.json @@ -1,5 +1,6 @@ { "storyOrder": [ + "surface_water_extent", "atmospheric_rivers", "flood-product", "black_marble_night_lights", diff --git a/doc/config/layers.md b/doc/config/layers.md index aa1e7e1157..13d32794df 100644 --- a/doc/config/layers.md +++ b/doc/config/layers.md @@ -104,7 +104,7 @@ Example: * **id**: Identifier of the palette. This should match the name of the colormap file without the extension. * **recommended**: Array of custom palette identifiers that are recommended for use with this layer (see [`config/default/common/config/palettes-custom.json`](../../config/default/common/config/palettes-custom.json)). Example, *["orange_1", "red_1"]* * **immutable**(optional): When this flag is set to true, the options to adjust thresholds and colormaps are removed. -* **availability**: Used to denote datetime availability info that cannot be gleaned from the capabilities document. Primarily for our geostationary layers which only have historical coverage going back ~30 days. Represented as an object with the following properties: +* **availability**: Used to denote datetime availability info that cannot be gleaned from the capabilities document. Primarily for our geostationary layers which only have historical coverage going back ~90 days. Represented as an object with the following properties: * **rollingWindow**: Number of days, counting backwards from app load time, that a layer has available coverage. Setting this will cause a layer's `startDate` property to be dynamically set at app load time. * **historicalRanges**: An array of date range objects denoting specific time periods in the past when imagery is available. Each range object should have the following properties: * startDate - `YYYY-MM-DDTHH:MM:SSZ` diff --git a/doc/deployment.md b/doc/deployment.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/doc/e2e_testing.md b/doc/e2e_testing.md index a6e7862718..0a28912463 100644 --- a/doc/e2e_testing.md +++ b/doc/e2e_testing.md @@ -141,3 +141,22 @@ test('Recent tab shows layers that were selected', async () => { - For elements that are not defined in the `selectors.js` file you can use `page.locator()` or any other locator. A full list can be found in the [Playwright Locators docs](https://playwright.dev/docs/locators) - If you are only performing an action on an element such as `click()` you do not need to define the element as a variable. You can simply write `await page.locator('.recent-tab').click()` - If you are performing an assertion on an element, you will need to define the element as a variable first `const aquaAerosolRow = await page.locator('#MODIS_Aqua_Aerosol-search-row')` `await expect(aquaAerosolRow).toBeVisible()` + +### Running Code Coverage Tests +1. `npm install nyc playwright-test-coverage start-server-and-test` +2. Create the following scripts in the `package.json` +``` + "playwright:coverage": "NODE_ENV=playwright nyc playwright test --project=chromium --reporter=list", + "playwright:ci": "start-server-and-test start http-get://localhost:3000 playwright:coverage", +``` +3. Add the following to babel.config.js +``` + env: { + playwright: { + plugins: ['istanbul'] + } + } +``` +4. Use VSCode's search & replace tool to search for all instances of "@playwright/test" in the e2e/features directory and replace them with "playwright-test-coverage". +5. Run the `playwright:ci script` +6. After the tests finish, you can view results from the coverage/lcov-report directory index.html file. \ No newline at end of file diff --git a/e2e/features/animation/animation-test.spec.js b/e2e/features/animation/animation-test.spec.js index bfcaaae38d..5f178c311b 100644 --- a/e2e/features/animation/animation-test.spec.js +++ b/e2e/features/animation/animation-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour, activeAnimationWidget, animationGeostationary } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -18,9 +19,9 @@ test.afterAll(async () => { }) test('Clicking the animation widget button opens the widget', async () => { - const { dragger, animationWidget, animationButton, modalCloseButton } = selectors + const { dragger, animationWidget, animationButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(dragger).toBeVisible() await expect(animationWidget).not.toBeVisible() await animationButton.click() @@ -28,9 +29,8 @@ test('Clicking the animation widget button opens the widget', async () => { }) test('Opening custom interval widget', async () => { - const { modalCloseButton } = selectors await page.goto(activeAnimationWidget) - await modalCloseButton.click() + await closeModal(page) await page.locator('.wv-animation-widget-header #timeline-interval-btn-container #current-interval').hover() const yearInterval = page.locator('.wv-animation-widget-header .timeline-interval .interval-years') await expect(yearInterval).toBeVisible() @@ -45,9 +45,9 @@ test('Opening custom interval widget', async () => { }) test('Changing animation time interval', async () => { - const { animationButton, modalCloseButton } = selectors + const { animationButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await animationButton.click() await page.locator('.wv-animation-widget-header #timeline-interval-btn-container #current-interval').hover() const yearInterval = page.locator('.wv-animation-widget-header .timeline-interval .interval-years') @@ -61,9 +61,9 @@ test('Changing animation time interval', async () => { }) test('Disable playback when max frames exceeded', async () => { - const { modalCloseButton, playButton, yearStartInput } = selectors + const { playButton, yearStartInput } = selectors await page.goto(animationGeostationary) - await modalCloseButton.click() + await closeModal(page) const animateYearDown = page.locator('.wv-date-range-selector > div > div > div:nth-child(3) > svg > .downarrow').first() const animateYearUp = page.locator('.wv-date-range-selector > div > div > div > svg > .uparrow').first() await animateYearDown.click() diff --git a/e2e/features/animation/gif-test.spec.js b/e2e/features/animation/gif-test.spec.js index 4d391eae6b..9901c1f569 100644 --- a/e2e/features/animation/gif-test.spec.js +++ b/e2e/features/animation/gif-test.spec.js @@ -7,6 +7,7 @@ const { animationTooManyFramesGif, animationProjectionRotated } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -23,9 +24,9 @@ test.afterAll(async () => { }) test('Clicking the animation widget button opens the widget', async () => { - const { createGifIcon, arcticRotationResetButton, modalCloseButton, rotationDialogOkButton } = selectors + const { createGifIcon, arcticRotationResetButton, rotationDialogOkButton } = selectors await page.goto(animationProjectionRotated) - await modalCloseButton.click() + await closeModal(page) await createGifIcon.click() await expect(arcticRotationResetButton).toHaveText('-18') await rotationDialogOkButton.click() @@ -39,11 +40,10 @@ test('GIF selection preview is Accurate and selections that are too high disable gifPreviewEndDate, gifPreviewFrameRateValue, gifPreviewEndResolutionSelector, - gifDownloadButton, - modalCloseButton + gifDownloadButton } = selectors await page.goto(activeAnimationWidget) - await modalCloseButton.click() + await closeModal(page) await createGifIcon.click() await expect(gifPreviewStartDate).toHaveText('2018 MAR 28') await expect(gifPreviewEndDate).toHaveText('2018 APR 04') @@ -60,17 +60,15 @@ test('GIF selection preview is Accurate and selections that are too high disable }) test('GIF download is disabled when too many frames would be requested with standard interval', async () => { - const { modalCloseButton } = selectors await page.goto(animationTooManyFramesGif) - await modalCloseButton.click() + await closeModal(page) const createGif = page.locator('#create-gif-button') await expect(createGif).toHaveClass(/disabled/) }) test('GIF download is disabled when too many frames would be requested with custom interval', async () => { - const { modalCloseButton } = selectors await page.goto(animationTooManyFramesGifCustomInterval) - await modalCloseButton.click() + await closeModal(page) const createGif = page.locator('#create-gif-button') await expect(createGif).toHaveClass(/disabled/) }) diff --git a/e2e/features/animation/mobile-animation-test.spec.js b/e2e/features/animation/mobile-animation-test.spec.js index a97581d859..eb10827845 100644 --- a/e2e/features/animation/mobile-animation-test.spec.js +++ b/e2e/features/animation/mobile-animation-test.spec.js @@ -1,6 +1,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { knownDate } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,9 +21,9 @@ test.afterAll(async () => { }) test('Clicking the animation widget button opens the widget', async () => { - const { mobileAnimateButton, modalCloseButton } = selectors + const { mobileAnimateButton } = selectors await page.goto(knownDate) - await modalCloseButton.click() + await closeModal(page) await mobileAnimateButton.click() const customIntervalInput = page.locator('.custom-interval-delta-input') await expect(customIntervalInput).toHaveValue('1') diff --git a/e2e/features/compare/compare-mobile-test.spec.js b/e2e/features/compare/compare-mobile-test.spec.js index dc472067a9..ebd8e92ad9 100644 --- a/e2e/features/compare/compare-mobile-test.spec.js +++ b/e2e/features/compare/compare-mobile-test.spec.js @@ -1,6 +1,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { swipeAndAIsActive, spyAndBIsActive, opacityAndBIsActive } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,9 +21,8 @@ test.afterAll(async () => { }) test('Mobile comparison A|B toggle buttons are visible and only A is selected by default', async () => { - const { modalCloseButton } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) const aMobileCompareButton = page.locator('.comparison-mobile-select-toggle > div:nth-child(1)') const bMobileCompareButton = page.locator('.comparison-mobile-select-toggle > div:nth-child(2)') await expect(aMobileCompareButton).toHaveClass(/compare-btn-selected/) diff --git a/e2e/features/compare/compare-test.spec.js b/e2e/features/compare/compare-test.spec.js index e0979759a3..7aac62f8d0 100644 --- a/e2e/features/compare/compare-test.spec.js +++ b/e2e/features/compare/compare-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { swipeAndAIsActive, spyAndBIsActive } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -18,9 +19,9 @@ test.afterAll(async () => { }) test('Animation is disabled when compare mode active', async () => { - const { animationButtonCase, animationWidget, modalCloseButton } = selectors + const { animationButtonCase, animationWidget } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(animationButtonCase).toHaveClass(/wv-disabled-button/) const disableMessage = 'Animation feature is deactivated when Compare feature is active' await expect(animationButtonCase).toHaveAttribute('aria-label', disableMessage) @@ -83,9 +84,9 @@ test('Removing layer removes correct layer from correct layer group', async () = }) test('Collapse layer list with B state and test label shows correct number of layers', async () => { - const { toggleButton, collapsedToggleButton, modalCloseButton } = selectors + const { toggleButton, collapsedToggleButton } = selectors await page.goto(spyAndBIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(collapsedToggleButton).not.toBeVisible() await toggleButton.click() await expect(collapsedToggleButton).toBeVisible() diff --git a/e2e/features/compare/layer-dialog-test.spec.js b/e2e/features/compare/layer-dialog-test.spec.js index 9f6fc78586..0f234b04b6 100644 --- a/e2e/features/compare/layer-dialog-test.spec.js +++ b/e2e/features/compare/layer-dialog-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { swipeAOD } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -28,9 +29,8 @@ test.afterAll(async () => { }) test('Layer option features work in A|B mode', async () => { - const { modalCloseButton } = selectors await page.goto(swipeAOD) - await modalCloseButton.click() + await closeModal(page) await expect(AodOptionsPanelBody).not.toBeVisible() await aerosolLayer.hover() await page.locator('#active-MODIS_Terra_Aerosol .wv-layers-options').click() diff --git a/e2e/features/compare/layer-sidebar-test.spec.js b/e2e/features/compare/layer-sidebar-test.spec.js index 320c7abf8b..6b072f8ed6 100644 --- a/e2e/features/compare/layer-sidebar-test.spec.js +++ b/e2e/features/compare/layer-sidebar-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { swipeAndAIsActive } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -25,11 +26,10 @@ test('Add AOD Layer to Layer Group A', async () => { const { addLayers, aerosolOpticalDepth, - layersModalCloseButton, - modalCloseButton + layersModalCloseButton } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) await addLayers.click() await aerosolOpticalDepth.click() await aodCheckBox.click() diff --git a/e2e/features/compare/permalinks-test.spec.js b/e2e/features/compare/permalinks-test.spec.js index ebd8c024bd..7cf3f5f4cc 100644 --- a/e2e/features/compare/permalinks-test.spec.js +++ b/e2e/features/compare/permalinks-test.spec.js @@ -6,6 +6,7 @@ const { opacityAndBIsActive, spyAndBIsActive } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -22,36 +23,35 @@ test.afterAll(async () => { }) test('Swipe mode and A|B state A are active and date is correct', async () => { - const { modalCloseButton, swipeButton, aTab } = selectors + const { swipeButton, aTab } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(swipeButton).not.toBeEnabled() await expect(aTab).toHaveClass(/active/) await expect(aTab).toContainText('A: 2018 AUG 17') }) test('Opacity mode and A|B state B are active and date is correct', async () => { - const { modalCloseButton, opacityButton, bTab } = selectors + const { opacityButton, bTab } = selectors await page.goto(opacityAndBIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(opacityButton).not.toBeEnabled() await expect(bTab).toHaveClass(/active/) await expect(bTab).toContainText('B: 2018 AUG 16') }) test('Spy mode is active in B state', async () => { - const { modalCloseButton, spyButton, bTab } = selectors + const { spyButton, bTab } = selectors await page.goto(spyAndBIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(spyButton).not.toBeEnabled() await expect(bTab).toHaveClass(/active/) await expect(bTab).toContainText('B: 2018 AUG 16') }) test('A|B loaded with only one layer in A section -- Corrected Reflectance (True Color)', async () => { - const { modalCloseButton } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) const overlayLayer = page.locator('.ab-tabs-case .tab-pane.active ul#overlays .item') const correctedReflectance = page.locator('#active-MODIS_Terra_CorrectedReflectance_TrueColor') await expect(overlayLayer).not.toBeVisible() diff --git a/e2e/features/compare/timeline-test.spec.js b/e2e/features/compare/timeline-test.spec.js index e3fda9f69c..f932432a1f 100644 --- a/e2e/features/compare/timeline-test.spec.js +++ b/e2e/features/compare/timeline-test.spec.js @@ -2,7 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { swipeAndAIsActive } = require('../../test-utils/global-variables/querystrings') -const { timelineDrag, dateSelectorMonthDay } = require('../../test-utils/hooks/wvHooks') +const { timelineDrag, dateSelectorMonthDay, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -19,9 +19,9 @@ test.afterAll(async () => { }) test('Verify that A|B draggers are visible', async () => { - const { draggerA, draggerB, modalCloseButton } = selectors + const { draggerA, draggerB } = selectors await page.goto(swipeAndAIsActive) - await modalCloseButton.click() + await closeModal(page) await expect(draggerA).toBeVisible() await expect(draggerB).toBeVisible() }) diff --git a/e2e/features/events/event-filter-test.spec.js b/e2e/features/events/event-filter-test.spec.js index 4609dc0706..80f6f78f7c 100644 --- a/e2e/features/events/event-filter-test.spec.js +++ b/e2e/features/events/event-filter-test.spec.js @@ -2,7 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { fixedAppNow, wildfiresWithDates, backwardsCompatibleEventUrl, extentsUrl } = require('../../test-utils/global-variables/querystrings') -const { switchProjections, clickAndWait } = require('../../test-utils/hooks/wvHooks') +const { switchProjections, clickAndWait, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -38,9 +38,9 @@ test.afterAll(async () => { }) test('Default filtering includes last 120 days and all categories', async () => { - const { eventsTab, filterIcons, filterDates, modalCloseButton } = selectors + const { eventsTab, filterIcons, filterDates } = selectors await page.goto(fixedAppNow) - await modalCloseButton.click() + await closeModal(page) await eventsTab.click() await expect(filterIcons).toHaveCount(8) await expect(filterDates).toContainText('2011 SEP 02 - 2011 DEC 31') @@ -88,7 +88,6 @@ test('Loading from permalink sets all criteria properly', async () => { filterIcons, manmadeSwitch, mapExtentFilterCheckbox, - modalCloseButton, seaLakeIceSwitch, severeStormsSwitch, snowSwitch, @@ -98,7 +97,7 @@ test('Loading from permalink sets all criteria properly', async () => { wildfiresIcon } = selectors await page.goto(wildfiresWithDates) - await modalCloseButton.click() + await closeModal(page) const currentUrl = await page.url() @@ -133,14 +132,13 @@ test('Changing criteria in modal DOES NOT update summary of criteria in sidebar filterDates, filterIcons, filterModalCancel, - modalCloseButton, startInputYear, startInputMonth, startInputDay, wildfiresIcon } = selectors await page.goto(wildfiresWithDates) - await modalCloseButton.click() + await closeModal(page) await filterButton.click() await startInputYear.fill('2000') await startInputMonth.fill('APR') @@ -220,11 +218,10 @@ test('Event Selected, No Filter Params: Shows only day of event, all categories, filterDates, filterButton, filterIcons, - mapExtentFilterCheckbox, - modalCloseButton + mapExtentFilterCheckbox } = selectors await page.goto(backwardsCompatibleEventUrl) - await modalCloseButton.click() + await closeModal(page) await expect(filterDates).toContainText('2005 DEC 31 - 2005 DEC 31') await filterButton.click() await assertDateInputValues('2005-DEC-31', '2005-DEC-31') @@ -234,9 +231,9 @@ test('Event Selected, No Filter Params: Shows only day of event, all categories, }) test('No extent search checkbox in polar projections', async () => { - const { filterButton, mapExtentFilterCheckbox, modalCloseButton } = selectors + const { filterButton, mapExtentFilterCheckbox } = selectors await page.goto(extentsUrl) - await modalCloseButton.click() + await closeModal(page) await filterButton.click() await expect(mapExtentFilterCheckbox).toBeVisible() await expect(mapExtentFilterCheckbox).toBeChecked() diff --git a/e2e/features/events/event-test.spec.js b/e2e/features/events/event-test.spec.js index b0090129e4..631ccddd6f 100644 --- a/e2e/features/events/event-test.spec.js +++ b/e2e/features/events/event-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { mockEvents } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -17,10 +18,10 @@ test.afterAll(async () => { await page.close() }) -test('Make sure that 4 fire layers are not present in layer list: use mock', async ({ browserName }) => { - const { modalCloseButton, sidebarEvent, thermAnomSNPPday, thermAnomSNPPnight, thermAnomVIIRSday, thermAnomVIIRSnight } = selectors +test('Make sure that 4 fire layers are not present in layer list: use mock', async () => { + const { sidebarEvent, thermAnomSNPPday, thermAnomSNPPnight, thermAnomVIIRSday, thermAnomVIIRSnight } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await expect(sidebarEvent).toBeVisible() await expect(thermAnomSNPPday).not.toBeVisible() await expect(thermAnomSNPPnight).not.toBeVisible() @@ -30,9 +31,9 @@ test('Make sure that 4 fire layers are not present in layer list: use mock', asy test('Check that 4 fire layers are now present', async ({ browserName }) => { test.skip(browserName === 'firefox', 'firefox cant find iceberg event sometimes') - const { layersTab, modalCloseButton, sidebarEvent, thermAnomSNPPday, thermAnomSNPPnight, thermAnomVIIRSday, thermAnomVIIRSnight } = selectors + const { layersTab, sidebarEvent, thermAnomSNPPday, thermAnomSNPPnight, thermAnomVIIRSday, thermAnomVIIRSnight } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await sidebarEvent.click() await layersTab.click() await page.waitForTimeout(5000) @@ -42,18 +43,18 @@ test('Check that 4 fire layers are now present', async ({ browserName }) => { await expect(thermAnomVIIRSnight).toBeVisible() }) -test('Use Mock to make sure appropriate number of event markers are appended to map', async ({ browserName }) => { - const { eventIcons, listOfEvents, modalCloseButton } = selectors +test('Use Mock to make sure appropriate number of event markers are appended to map', async () => { + const { eventIcons, listOfEvents } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await expect(listOfEvents).toBeVisible() await expect(eventIcons).toHaveCount(8) }) -test('Selecting event shows track points and markers which are not visible when switched to layer tab', async ({ browserName }) => { - const { eventIcons, eventsTab, layersTab, modalCloseButton, secondEvent, trackMarker } = selectors +test('Selecting event shows track points and markers which are not visible when switched to layer tab', async () => { + const { eventIcons, eventsTab, layersTab, secondEvent, trackMarker } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await page.waitForTimeout(1000) await secondEvent.click() await page.waitForTimeout(5000) @@ -68,43 +69,42 @@ test('Selecting event shows track points and markers which are not visible when await expect(eventIcons).toHaveCount(8) }) -test('Clicking an event in the list selects the event', async ({ browserName }) => { +test('Clicking an event in the list selects the event', async () => { const { firstEvent, selectedFirstEvent } = selectors await firstEvent.click() await page.waitForTimeout(6000) await expect(selectedFirstEvent).toBeVisible() }) -test('Verify that Url is updated', async ({ browserName }) => { - const { modalCloseButton } = selectors +test('Verify that Url is updated', async () => { await page.waitForTimeout(5000) await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) const currentUrl = await page.url() expect(currentUrl).toContain('efs=true') expect(currentUrl).toContain('efa=false') expect(currentUrl).toContain('lg=false') }) -test('Verify Events message and clicking message opens dialog', async ({ browserName }) => { - const { firstEvent, notifyMessage, modalCloseButton } = selectors +test('Verify Events message and clicking message opens dialog', async () => { + const { firstEvent, notifyMessage } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await firstEvent.click() await expect(notifyMessage).toBeVisible() await expect(notifyMessage).toContainText('Events may not be visible at all times.') await notifyMessage.click() await expect(page.locator('#event_visibility_info h1')).toContainText('Why can’t I see an event?') - await modalCloseButton.click() + await closeModal(page) await expect(page.locator('#event_visibility_info')).not.toBeVisible() await page.locator('#event-alert-close').click() await expect(page.locator('.wv-alert .close-alert .fa-times')).not.toBeVisible() }) -test('Clicking selected event deselects event', async ({ browserName }) => { - const { firstEvent, selectedFirstEvent, eventsTab, modalCloseButton } = selectors +test('Clicking selected event deselects event', async () => { + const { firstEvent, selectedFirstEvent, eventsTab } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await firstEvent.click() await selectedFirstEvent.click() await eventsTab.hover() diff --git a/e2e/features/events/events-mobile-test.spec.js b/e2e/features/events/events-mobile-test.spec.js index 2bcb3cfd61..4c8b2910be 100644 --- a/e2e/features/events/events-mobile-test.spec.js +++ b/e2e/features/events/events-mobile-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { mockEvents, stormEventSelected } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -24,9 +25,9 @@ test.afterAll(async () => { test('Events populated in sidebar', async ({ browserName }) => { test.skip(browserName === 'firefox', 'firefox cant find iceberg event sometimes') - const { modalCloseButton, sidebarButton, sidebarContent, eventsTab, icebergEvent } = selectors + const { sidebarButton, sidebarContent, eventsTab, icebergEvent } = selectors await page.goto(mockEvents) - await modalCloseButton.click() + await closeModal(page) await sidebarButton.click() await expect(sidebarContent).toBeVisible() await eventsTab.click() @@ -45,9 +46,9 @@ test('Clicking event in list closes sidebar and selects marker for event on map' test('Events load when arriving via permalink', async ({ browserName }) => { test.skip(browserName === 'firefox', 'firefox cant find iceberg event sometimes') - const { modalCloseButton, sidebarButton, sidebarContent, selectedMarker } = selectors + const { sidebarButton, sidebarContent, selectedMarker } = selectors await page.goto(stormEventSelected) - await modalCloseButton.click() + await closeModal(page) await expect(selectedMarker).toBeVisible() await expect(sidebarContent).not.toBeVisible() await expect(sidebarButton).toBeVisible() diff --git a/e2e/features/global-unit/coordinate-format-test.spec.js b/e2e/features/global-unit/coordinate-format-test.spec.js index 842081d893..cc2d839515 100644 --- a/e2e/features/global-unit/coordinate-format-test.spec.js +++ b/e2e/features/global-unit/coordinate-format-test.spec.js @@ -1,12 +1,11 @@ // @ts-check const { test, expect } = require('@playwright/test') -const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') const url = 'http://localhost:3000/?v=-78.52435703125,37.8608744140625,-75.56244296875,39.7483255859375&l=Reference_Labels_15m,Reference_Features_15m(hidden),Coastlines_15m,VIIRS_NOAA20_CorrectedReflectance_TrueColor(hidden),VIIRS_SNPP_CorrectedReflectance_TrueColor(hidden),MODIS_Aqua_CorrectedReflectance_TrueColor(hidden),MODIS_Terra_CorrectedReflectance_TrueColor&lg=false&s=-77.0434,38.8046&t=2023-02-15-T19%3A53%3A41Z' let page let dmButton let marker -let selectors test.describe.configure({ mode: 'serial' }) @@ -14,7 +13,6 @@ test.beforeAll(async ({ browser }) => { page = await browser.newPage() dmButton = page.getByRole('button', { name: 'Set latlon-dm Format' }) marker = page.locator('.tooltip-coordinates') - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -22,9 +20,8 @@ test.afterAll(async () => { }) test('Open page', async () => { - const { modalCloseButton } = selectors await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await expect(page).toHaveTitle('@OFFICIAL_NAME@') }) diff --git a/e2e/features/global-unit/global-unit-test.spec.js b/e2e/features/global-unit/global-unit-test.spec.js index 92a1c9fc2f..a1f1e36fff 100644 --- a/e2e/features/global-unit/global-unit-test.spec.js +++ b/e2e/features/global-unit/global-unit-test.spec.js @@ -1,6 +1,6 @@ // @ts-check const { test, expect } = require('@playwright/test') -const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') const SSTQueryString = 'http://localhost:3000/?l=GHRSST_L4_MUR_Sea_Surface_Temperature,Reference_Labels_15m(hidden),Reference_Features_15m(hidden),Coastlines_15m,VIIRS_NOAA20_CorrectedReflectance_TrueColor(hidden),VIIRS_SNPP_CorrectedReflectance_TrueColor(hidden),MODIS_Aqua_CorrectedReflectance_TrueColor(hidden),MODIS_Terra_CorrectedReflectance_TrueColor&lg=false&t=2020-09-28-T20%3A40%3A53Z' @@ -10,7 +10,6 @@ let settingContainer let SSTMinPalette let SSTMaxPalette let kelvinButton -let selectors test.describe.configure({ mode: 'serial' }) @@ -21,7 +20,6 @@ test.beforeAll(async ({ browser }) => { SSTMinPalette = page.locator('#GHRSST_L4_MUR_Sea_Surface_Temperature_GHRSST_Sea_Surface_Temperature_0_legend_0 > div.wv-palettes-min') SSTMaxPalette = page.locator('#GHRSST_L4_MUR_Sea_Surface_Temperature_GHRSST_Sea_Surface_Temperature_0_legend_0 > div.wv-palettes-max') kelvinButton = page.getByRole('button', { name: 'Kelvin' }) - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -29,9 +27,8 @@ test.afterAll(async () => { }) test('Global settings menu item opens global settings modal', async () => { - const { modalCloseButton } = selectors await page.goto(SSTQueryString) - await modalCloseButton.click() + await closeModal(page) await page.getByRole('button', { name: 'Information' }).click() await page.getByRole('button', { name: 'Settings' }).click() await expect(globalSettingsModal).toBeVisible() @@ -50,9 +47,8 @@ test('Selecting Kelvin unit changes unit being used in layer palette legend', as }) test('Kelvin global unit is retained via localStorage and active on new url', async () => { - const { modalCloseButton } = selectors await page.goto(SSTQueryString) - await modalCloseButton.click() + await closeModal(page) await page.getByRole('button', { name: 'Information' }).click() await page.getByRole('button', { name: 'Settings' }).click() await expect(kelvinButton).toHaveClass(/active/) diff --git a/e2e/features/image-download/crosses-dateline-test.spec.js b/e2e/features/image-download/crosses-dateline-test.spec.js index 6b64eb9016..73dba1434f 100644 --- a/e2e/features/image-download/crosses-dateline-test.spec.js +++ b/e2e/features/image-download/crosses-dateline-test.spec.js @@ -1,9 +1,8 @@ // @ts-check const { test, expect } = require('@playwright/test') -const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page -let selectors const withinMapURLParams = 'http://localhost:3000/?v=-67.80916012733559,-56.052180562072095,-30.50743102883792,-30.873513420586164&t=2021-08-08-T0' const crossesPrevDayURLParams = 'http://localhost:3000/?v=161.16767164758798,-54.46571918482002,198.46940074608565,-29.287052043334096&t=2021-08-08-T0' @@ -13,7 +12,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -21,18 +19,16 @@ test.afterAll(async () => { }) test('No dateline alert notification with message if not crossing dateline(s)', async () => { - const { modalCloseButton } = selectors await page.goto(withinMapURLParams) - await modalCloseButton.click() + await closeModal(page) await page.locator('#wv-image-button').click() const datelineAlert = page.locator('#snapshot-dateline-alert') await expect(datelineAlert).not.toBeVisible() }) test('Dateline alert notification with previous day message if crosses previous day dateline', async () => { - const { modalCloseButton } = selectors await page.goto(crossesPrevDayURLParams) - await modalCloseButton.click() + await closeModal(page) await page.locator('#wv-image-button').click() const datelineAlert = page.locator('#snapshot-dateline-alert') const datelineAlertMessage = page.locator('#snapshot-dateline-alert .wv-alert-message') @@ -41,9 +37,8 @@ test('Dateline alert notification with previous day message if crosses previous }) test('Dateline alert notification with next day message if crosses next day dateline', async () => { - const { modalCloseButton } = selectors await page.goto(crossesNextDayURLParams) - await modalCloseButton.click() + await closeModal(page) await page.locator('#wv-image-button').click() const datelineAlert = page.locator('#snapshot-dateline-alert') const datelineAlertMessage = page.locator('#snapshot-dateline-alert .wv-alert-message') diff --git a/e2e/features/image-download/formats-test.spec.js b/e2e/features/image-download/formats-test.spec.js index f56b84471d..d2dfc902de 100644 --- a/e2e/features/image-download/formats-test.spec.js +++ b/e2e/features/image-download/formats-test.spec.js @@ -4,18 +4,16 @@ const { clickDownload, closeImageDownloadPanel, openImageDownloadPanel, - switchProjections + switchProjections, + closeModal } = require('../../test-utils/hooks/wvHooks') const { getAttribute, joinUrl, selectOption } = require('../../test-utils/hooks/basicHooks') -const createSelectors = require('../../test-utils/global-variables/selectors') let page -let selectors - const startParams = [ 'l=MODIS_Terra_CorrectedReflectance_TrueColor', 'v=-1,-1,1,1', @@ -27,7 +25,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -35,10 +32,9 @@ test.afterAll(async () => { }) test('JPEG is the default', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, null) await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') diff --git a/e2e/features/image-download/global-select-test.spec.js b/e2e/features/image-download/global-select-test.spec.js index 19df4f780f..fa88613aa7 100644 --- a/e2e/features/image-download/global-select-test.spec.js +++ b/e2e/features/image-download/global-select-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { openImageDownloadPanel } = require('../../test-utils/hooks/wvHooks') +const { openImageDownloadPanel, closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl } = require('../../test-utils/hooks/basicHooks') let page @@ -30,10 +30,10 @@ test.afterAll(async () => { }) test('Verify that global select is present and not selected', async () => { - const { globalSelectInput, modalCloseButton } = selectors + const { globalSelectInput } = selectors const url = await joinUrl(startParams, null) await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await expect(globalSelectInput).toBeVisible() await expect(globalSelectInput).not.toBeChecked() diff --git a/e2e/features/image-download/initial-state-test.spec.js b/e2e/features/image-download/initial-state-test.spec.js index e84ab17754..8944872a7d 100644 --- a/e2e/features/image-download/initial-state-test.spec.js +++ b/e2e/features/image-download/initial-state-test.spec.js @@ -5,7 +5,8 @@ const createSelectors = require('../../test-utils/global-variables/selectors') const { openImageDownloadPanel, closeImageDownloadPanel, - switchProjections + switchProjections, + closeModal } = require('../../test-utils/hooks/wvHooks') let page @@ -29,9 +30,9 @@ test.afterAll(async () => { }) test('Check resolutions', async () => { - const { imageResolution, modalCloseButton } = selectors + const { imageResolution } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await expect(imageResolution).toContainText(expectedResolutions) }) diff --git a/e2e/features/image-download/layers-test.spec.js b/e2e/features/image-download/layers-test.spec.js index 8ab1b050cf..724443e6db 100644 --- a/e2e/features/image-download/layers-test.spec.js +++ b/e2e/features/image-download/layers-test.spec.js @@ -1,11 +1,9 @@ // @ts-check const { test, expect } = require('@playwright/test') -const { openImageDownloadPanel, clickDownload } = require('../../test-utils/hooks/wvHooks') +const { openImageDownloadPanel, clickDownload, closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl, getAttribute } = require('../../test-utils/hooks/basicHooks') -const createSelectors = require('../../test-utils/global-variables/selectors') let page -let selectors const startParams = [ 'v=-180,-90,180,90', @@ -17,7 +15,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeEach(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterEach(async () => { @@ -25,10 +22,9 @@ test.afterEach(async () => { }) test('List layers in draw order', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&l=MODIS_Terra_CorrectedReflectance_TrueColor,Reference_Features_15m,MODIS_Terra_Aerosol') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') @@ -37,11 +33,10 @@ test('List layers in draw order', async () => { test('Move AOD over the reference features', async ({ browserName }) => { test.skip(browserName === 'firefox', 'firefox fails this test for unknown reasons') - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&l=MODIS_Terra_CorrectedReflectance_TrueColor,MODIS_Terra_Aerosol,Reference_Features_15m') await page.goto(url) await page.waitForTimeout(1000) - await modalCloseButton.click() + await closeModal(page) await page.waitForTimeout(1000) await openImageDownloadPanel(page) await clickDownload(page) @@ -50,10 +45,9 @@ test('Move AOD over the reference features', async ({ browserName }) => { }) test('Do not include obscured layers', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&l=MODIS_Terra_CorrectedReflectance_TrueColor,MODIS_Terra_Aerosol,Reference_Features_15m') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') @@ -61,10 +55,9 @@ test('Do not include obscured layers', async () => { }) test('Multiple base layers when one is semi-transparent', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&l=MODIS_Terra_CorrectedReflectance_TrueColor(opacity=0.5),MODIS_Aqua_CorrectedReflectance_TrueColor') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') diff --git a/e2e/features/image-download/projection-test.spec.js b/e2e/features/image-download/projection-test.spec.js index ac634bba13..f08f6bfe73 100644 --- a/e2e/features/image-download/projection-test.spec.js +++ b/e2e/features/image-download/projection-test.spec.js @@ -3,14 +3,13 @@ const { test, expect } = require('@playwright/test') const { openImageDownloadPanel, closeImageDownloadPanel, - clickDownload + clickDownload, + closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl, getAttribute } = require('../../test-utils/hooks/basicHooks') const { switchProjections } = require('../../test-utils/hooks/wvHooks') -const createSelectors = require('../../test-utils/global-variables/selectors') let page -let selectors const startParams = [ 'l=MODIS_Terra_CorrectedReflectance_TrueColor', @@ -22,7 +21,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -30,10 +28,9 @@ test.afterAll(async () => { }) test('Geographic is EPSG:4326', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, null) await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') diff --git a/e2e/features/image-download/resolutions3413-test.spec.js b/e2e/features/image-download/resolutions3413-test.spec.js index 2f410c06bf..0c4bbf3c88 100644 --- a/e2e/features/image-download/resolutions3413-test.spec.js +++ b/e2e/features/image-download/resolutions3413-test.spec.js @@ -5,7 +5,8 @@ const { openImageDownloadPanel, closeImageDownloadPanel, clickDownload, - zoomIn + zoomIn, + closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl, getAttribute } = require('../../test-utils/hooks/basicHooks') @@ -32,10 +33,10 @@ test.afterAll(async () => { }) test('In the arctic, top zoom levels is 5km', async () => { - const { imageResolution, modalCloseButton } = selectors + const { imageResolution } = selectors const url = await joinUrl(startParams, null) await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await expect(imageResolution).toHaveValue('20') await closeImageDownloadPanel(page) diff --git a/e2e/features/image-download/resolutions4326-test.spec.js b/e2e/features/image-download/resolutions4326-test.spec.js index ac30a75153..027502983f 100644 --- a/e2e/features/image-download/resolutions4326-test.spec.js +++ b/e2e/features/image-download/resolutions4326-test.spec.js @@ -5,7 +5,8 @@ const { openImageDownloadPanel, closeImageDownloadPanel, clickDownload, - zoomIn + zoomIn, + closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl, getAttribute } = require('../../test-utils/hooks/basicHooks') @@ -32,10 +33,10 @@ test.afterAll(async () => { }) test('In geographic, top two zoom levels are 10km', async () => { - const { imageResolution, modalCloseButton } = selectors + const { imageResolution } = selectors const url = await joinUrl(startParams, null) await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await expect(imageResolution).toHaveValue('40') await closeImageDownloadPanel(page) diff --git a/e2e/features/image-download/time-test.spec.js b/e2e/features/image-download/time-test.spec.js index 85a4c3e043..240543d2d9 100644 --- a/e2e/features/image-download/time-test.spec.js +++ b/e2e/features/image-download/time-test.spec.js @@ -3,13 +3,12 @@ const { test, expect } = require('@playwright/test') const { openImageDownloadPanel, closeImageDownloadPanel, - clickDownload + clickDownload, + closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl, getAttribute } = require('../../test-utils/hooks/basicHooks') -const createSelectors = require('../../test-utils/global-variables/selectors') let page -let selectors const startParams = [ 'imageDownload=' @@ -19,7 +18,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -27,10 +25,9 @@ test.afterAll(async () => { }) test('Image for today', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&now=2018-06-01T3') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') @@ -39,10 +36,9 @@ test('Image for today', async () => { }) test('Image for yesterday', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&now=2018-06-01T0') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') @@ -51,10 +47,9 @@ test('Image for yesterday', async () => { }) test('Image for 2018-05-15', async () => { - const { modalCloseButton } = selectors const url = await joinUrl(startParams, '&t=2018-05-15') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await openImageDownloadPanel(page) await clickDownload(page) const urlAttribute = await getAttribute(page, '#wv-image-download-url', 'url') diff --git a/e2e/features/image-download/unsupported-test.spec.js b/e2e/features/image-download/unsupported-test.spec.js index 4c168ba24c..cce0c6a185 100644 --- a/e2e/features/image-download/unsupported-test.spec.js +++ b/e2e/features/image-download/unsupported-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { closeImageDownloadPanel } = require('../../test-utils/hooks/wvHooks') +const { closeImageDownloadPanel, closeModal } = require('../../test-utils/hooks/wvHooks') const { joinUrl } = require('../../test-utils/hooks/basicHooks') let page @@ -29,10 +29,10 @@ test.afterAll(async () => { }) test('Custom palettes are not supported dialog', async () => { - const { modalCloseButton, snapshotToolbarButton } = selectors + const { snapshotToolbarButton } = selectors const url = await joinUrl(startParams, '&l=MODIS_Terra_Aerosol(palette=red_1)') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await snapshotToolbarButton.click() await expect(notify).toBeVisible() }) @@ -54,10 +54,10 @@ test('Custom palettes: OK button brings up download panel', async () => { }) test('Rotation is not supported dialog', async () => { - const { modalCloseButton, snapshotToolbarButton } = selectors + const { snapshotToolbarButton } = selectors const url = await joinUrl(startParams, '&p=arctic&r=18') await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await snapshotToolbarButton.click() await expect(notify).toBeVisible() }) diff --git a/e2e/features/layers/layer-picker-mobile-test.spec.js b/e2e/features/layers/layer-picker-mobile-test.spec.js index 8d0889cf81..1762a7c524 100644 --- a/e2e/features/layers/layer-picker-mobile-test.spec.js +++ b/e2e/features/layers/layer-picker-mobile-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { assertDefaultLayers, assertCategories } = require('../../test-utils/hooks/wvHooks') +const { assertDefaultLayers, assertCategories, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -23,9 +23,9 @@ test.afterAll(async () => { }) test('Initial state indicates layer count', async () => { - const { layerCount, modalCloseButton } = selectors + const { layerCount } = selectors await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await expect(layerCount).toBeVisible() await expect(layerCount).toContainText('7') }) @@ -178,14 +178,14 @@ test('Clicking the selected row deselects it and hides the details', async () => }) test('Close product picker and confirm added layers show in sidebar', async () => { - const { layersModalCloseButton } = selectors - await layersModalCloseButton.click() + await closeModal(page) const activeLayer = page.locator('#active-MODIS_Aqua_Aerosol') await expect(activeLayer).toBeVisible() }) test('Collapse sidebar and confirm layer count updated', async () => { const { layerCount } = selectors + await page.locator('.layer-btn-close').click() await page.locator('#toggleIconHolder').click() await expect(layerCount).toContainText('8') }) diff --git a/e2e/features/layers/layer-picker-test.spec.js b/e2e/features/layers/layer-picker-test.spec.js index b9c315a0a1..46973a9147 100644 --- a/e2e/features/layers/layer-picker-test.spec.js +++ b/e2e/features/layers/layer-picker-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { assertCategories, switchProjections } = require('../../test-utils/hooks/wvHooks') +const { assertCategories, switchProjections, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,9 +20,9 @@ test.afterAll(async () => { }) test('Layer picker shows categories when first opened', async () => { - const { addLayers, modalCloseButton } = selectors + const { addLayers } = selectors await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await addLayers.click() await assertCategories(page) }) diff --git a/e2e/features/layers/layers-sidebar-test.spec.js b/e2e/features/layers/layers-sidebar-test.spec.js index 56f36d52ab..4a65c0dca9 100644 --- a/e2e/features/layers/layers-sidebar-test.spec.js +++ b/e2e/features/layers/layers-sidebar-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { assertLayerOrdering } = require('../../test-utils/hooks/wvHooks') +const { assertLayerOrdering, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -49,11 +49,10 @@ test('Toggle layer Info', async () => { const { firesLayer, infoButton, - infoDialog, - modalCloseButton + infoDialog } = selectors await page.goto(twoGroupsQueryString) - await modalCloseButton.click() + await closeModal(page) await firesLayer.hover() await infoButton.click() await infoButton.click() @@ -80,11 +79,10 @@ test('Adding a layer causes it to appear in the appropriate group', async () => firesLayer, layersModalCloseButton, layersSearchField, - modalCloseButton, viirsFiresCheckbox } = selectors await page.goto(someGroupsQueryString) - await modalCloseButton.click() + await closeModal(page) await addLayers.click() await layersSearchField.fill('fires') await viirsFiresCheckbox.click() @@ -128,9 +126,9 @@ test('Removing the last layer in a group removes the group', async () => { }) test('Removing a group removes all layers and the group header', async () => { - const { aodGroupHeader, aodGroup, modalCloseButton } = selectors + const { aodGroupHeader, aodGroup } = selectors await page.goto(twoGroupsQueryString) - await modalCloseButton.click() + await closeModal(page) await aodGroupHeader.hover() await page.locator('#active-Aerosol_Optical_Depth .layer-group-more-options > button').click() await page.locator('#active-Aerosol_Optical_Depth .layer-group-more-options #remove-group').click() @@ -142,11 +140,10 @@ test('Load with groups disabled from permalink', async () => { aodGroup, firesGroup, groupCheckbox, - modalCloseButton, overlaysGroup } = selectors await page.goto(mixedLayersGroupsDisabledQueryString) - await modalCloseButton.click() + await closeModal(page) await expect(groupCheckbox).toBeVisible() await expect(groupCheckbox).not.toBeChecked() await expect(firesGroup).not.toBeVisible() @@ -160,11 +157,10 @@ test('Load multiple groups from permalink', async () => { const { aodGroup, firesGroup, - groupCheckbox, - modalCloseButton + groupCheckbox } = selectors await page.goto(twoGroupsQueryString) - await modalCloseButton.click() + await closeModal(page) await expect(groupCheckbox).toBeVisible() await expect(groupCheckbox).toBeChecked() await expect(firesGroup).toBeVisible() @@ -220,11 +216,10 @@ test('Re-ordering groups, then disabling groups keeps individual layer order', a const { aodGroupHeader, firesGroupHeader, - groupCheckbox, - modalCloseButton + groupCheckbox } = selectors await page.goto(twoGroupsQueryString) - await modalCloseButton.click() + await closeModal(page) const aodBoundingBox = await aodGroupHeader.boundingBox() const firesBoundingBox = await firesGroupHeader.boundingBox() // this 'steps' option is important for making the drag action work with the 'react-draggable' library @@ -248,11 +243,10 @@ test('Enabling groups re-orders layers into their groups', async () => { const { aodGroup, firesGroup, - groupCheckbox, - modalCloseButton + groupCheckbox } = selectors await page.goto(mixedLayersGroupsDisabledQueryString) - await modalCloseButton.click() + await closeModal(page) const layersContainer = '#active-overlays li' await assertLayerOrdering(page, layersContainer, mixedLayerIdOrder) await groupCheckbox.click() @@ -276,9 +270,9 @@ test('Immediately disabling groups restores mixed ordering', async () => { }) test('Making a change to grouped layers causes group ordering to be retained when ungrouped', async () => { - const { groupCheckbox, aodGroupHeader, modalCloseButton } = selectors + const { groupCheckbox, aodGroupHeader } = selectors await page.goto(mixedLayersGroupsDisabledQueryString) - await modalCloseButton.click() + await closeModal(page) await groupCheckbox.click() await aodGroupHeader.hover() await page.locator('#active-Aerosol_Optical_Depth .layer-group-more-options > button').click() @@ -289,9 +283,8 @@ test('Making a change to grouped layers causes group ordering to be retained whe }) test('Vector layer has pointer icon & clicking vector layer pointer shows modal', async () => { - const { modalCloseButton } = selectors await page.goto(vectorsQueryString) - await modalCloseButton.click() + await closeModal(page) const handPointer = await page.locator('#active-GRanD_Dams .fa-hand-pointer') await expect(handPointer).toBeVisible() await handPointer.click() diff --git a/e2e/features/layers/layers-vector-test.spec.js b/e2e/features/layers/layers-vector-test.spec.js index af0afc6c27..073eaa84b4 100644 --- a/e2e/features/layers/layers-vector-test.spec.js +++ b/e2e/features/layers/layers-vector-test.spec.js @@ -1,6 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,9 +21,9 @@ test.afterAll(async () => { }) test('Vector layer click does not show alert when all vector layers are clickable', async () => { - const { geographicMap, modalCloseButton, notifyMessage } = selectors + const { geographicMap, notifyMessage } = selectors await page.goto(damsLayerUrl) - await modalCloseButton.click() + await closeModal(page) const pointerIcon = await page.locator('#active-GRanD_Dams .fa-hand-pointer') await expect(pointerIcon).toBeVisible() await geographicMap.click() @@ -31,9 +32,9 @@ test('Vector layer click does not show alert when all vector layers are clickabl test('Vectors show alert when not clickable', async ({ browserName }) => { test.skip(browserName === 'firefox', 'issue identifying pointer') - const { geographicMap, modalCloseButton, notifyMessage } = selectors + const { geographicMap, notifyMessage } = selectors await page.goto(damsLayerWMSZoomLevelUrl) - await modalCloseButton.click() + await closeModal(page) const pointerIcon = await page.locator('#active-GRanD_Dams .fa-hand-pointer') await expect(pointerIcon).toBeVisible() await geographicMap.click() diff --git a/e2e/features/layers/options-test.spec.js b/e2e/features/layers/options-test.spec.js index 80ed0ba5d8..23b5e6a3f4 100644 --- a/e2e/features/layers/options-test.spec.js +++ b/e2e/features/layers/options-test.spec.js @@ -1,6 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -19,9 +20,9 @@ test.afterAll(async () => { }) test('Verify that settings button opens settings modal', async () => { - const { aodSidebarLayer, modalCloseButton } = selectors + const { aodSidebarLayer } = selectors await page.goto(customsSquashedQuerystring) - await modalCloseButton.click() + await closeModal(page) await aodSidebarLayer.hover() const thresholdMinLabel = await page.locator('#wv-layer-options-threshold0 .wv-label-range-min') const combinedAodSettingsButton = await page.locator('#active-MODIS_Combined_Value_Added_AOD .wv-layers-options') diff --git a/e2e/features/layers/recent-layers-mobile-test.spec.js b/e2e/features/layers/recent-layers-mobile-test.spec.js index c42e0ca7c2..586a0052e4 100644 --- a/e2e/features/layers/recent-layers-mobile-test.spec.js +++ b/e2e/features/layers/recent-layers-mobile-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { assertCategories } = require('../../test-utils/hooks/wvHooks') +const { assertCategories, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -23,9 +23,9 @@ test.afterAll(async () => { }) test('Layer picker shows categories when first opened', async () => { - const { addLayers, collapsedLayerButton, modalCloseButton } = selectors + const { addLayers, collapsedLayerButton } = selectors await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await collapsedLayerButton.click() await addLayers.click() await assertCategories(page) diff --git a/e2e/features/layers/recent-layers-test.spec.js b/e2e/features/layers/recent-layers-test.spec.js index fa684b1be7..549bd43626 100644 --- a/e2e/features/layers/recent-layers-test.spec.js +++ b/e2e/features/layers/recent-layers-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { assertCategories } = require('../../test-utils/hooks/wvHooks') +const { assertCategories, closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,9 +20,9 @@ test.afterAll(async () => { }) test('Layer picker shows categories when first opened', async () => { - const { addLayers, modalCloseButton } = selectors + const { addLayers } = selectors await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await addLayers.click() await assertCategories(page) }) diff --git a/e2e/features/location-search/location-search-mobile-test.spec.js b/e2e/features/location-search/location-search-mobile-test.spec.js index b6271dc453..c9b9c3dec5 100644 --- a/e2e/features/location-search/location-search-mobile-test.spec.js +++ b/e2e/features/location-search/location-search-mobile-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -21,9 +22,9 @@ test.afterAll(async () => { }) test('Location Search component is visible by default', async () => { - const { locationSearchMobileDialog, modalCloseButton } = selectors + const { locationSearchMobileDialog } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(locationSearchMobileDialog).not.toBeVisible() }) diff --git a/e2e/features/location-search/location-search-test.spec.js b/e2e/features/location-search/location-search-test.spec.js index 8608e75aba..91ed297c03 100644 --- a/e2e/features/location-search/location-search-test.spec.js +++ b/e2e/features/location-search/location-search-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -22,9 +23,9 @@ test.afterAll(async () => { }) test('Location Search component is visible by default', async () => { - const { locationSearchComponent, modalCloseButton } = selectors + const { locationSearchComponent } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(locationSearchComponent).toBeVisible() }) @@ -35,9 +36,9 @@ test('Clicking the minimize button minimizes the Location Search component', asy }) test('Location Search component remains hidden on subsequent page loads per user preference', async () => { - const { locationSearchComponent, modalCloseButton } = selectors + const { locationSearchComponent } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(locationSearchComponent).not.toBeVisible() }) @@ -48,10 +49,9 @@ test('Clicking Location Search toolbar button expands the Location Search compon }) test('Coordinates dialog for permalink marker is visible by default on page load', async () => { - const { modalCloseButton } = selectors const testMarkerEncodedID = await page.locator('.coordinates-map-marker_-77__2E__032__2C__38__2E__8904') await page.goto(markerUrl) - await modalCloseButton.click() + await closeModal(page) await expect(testMarkerEncodedID).toBeVisible() }) @@ -68,9 +68,9 @@ test('Clicking minimize tooltip hides the coordinates dialog', async () => { }) test('Clicking close tooltip removes the marker and coordinates dialog', async () => { - const { coordinatesMapMarker, modalCloseButton, tooltipCoordinatesCloseButton } = selectors + const { coordinatesMapMarker, tooltipCoordinatesCloseButton } = selectors await page.goto(removeMarkerUrl) - await modalCloseButton.click() + await closeModal(page) await tooltipCoordinatesCloseButton.click() await expect(coordinatesMapMarker).not.toBeVisible() const url = await page.url() @@ -78,9 +78,9 @@ test('Clicking close tooltip removes the marker and coordinates dialog', async ( }) test('Invalid marker query string parameter prevents state update', async () => { - const { coordinatesMapMarker, modalCloseButton } = selectors + const { coordinatesMapMarker } = selectors await page.goto(invalidMarkerQuery) - await modalCloseButton.click() + await closeModal(page) await expect(coordinatesMapMarker).not.toBeVisible() const url = await page.url() expect(url).not.toContain('s=') diff --git a/e2e/features/measure/measure-test.spec.js b/e2e/features/measure/measure-test.spec.js index e4c8b19e66..35dff2182d 100644 --- a/e2e/features/measure/measure-test.spec.js +++ b/e2e/features/measure/measure-test.spec.js @@ -6,7 +6,8 @@ const { getAttribute } = require('../../test-utils/hooks/basicHooks') const { createDistanceMeasurement, createAreaMeasurement, - switchProjections + switchProjections, + closeModal } = require('../../test-utils/hooks/wvHooks') let page @@ -27,11 +28,10 @@ test.afterAll(async () => { }) test('Clicking the measure button opens the menu', async ({ browserName }) => { - const { modalCloseButton } = selectors test.skip(browserName === 'firefox', 'firefox pointer issue') const { measureMenu, measureBtn } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(measureMenu).not.toBeVisible() await measureBtn.click() }) diff --git a/e2e/features/modal/about-modal-test.spec.js b/e2e/features/modal/about-modal-test.spec.js index afe1255175..cbd4d243bb 100644 --- a/e2e/features/modal/about-modal-test.spec.js +++ b/e2e/features/modal/about-modal-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -22,9 +23,8 @@ test.afterAll(async () => { }) test('About modal not open when URL param not present', async () => { - const { modalCloseButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(aboutPage).not.toBeVisible() }) @@ -38,8 +38,6 @@ test('Opening about modal from menu sets URL param', async () => { }) test('About modal is open when URL param is present', async () => { - const { modalCloseButton } = selectors await page.goto(aboutOpenURL) - await modalCloseButton.click() await expect(aboutPage).toBeVisible() }) diff --git a/e2e/features/notifications/notify-test.spec.js b/e2e/features/notifications/notify-test.spec.js index 7d001cc565..68acce7892 100644 --- a/e2e/features/notifications/notify-test.spec.js +++ b/e2e/features/notifications/notify-test.spec.js @@ -1,6 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -40,10 +41,9 @@ test('No visible notifications with mockAlert parameter set to no_types', async }) test('Verify that layer notices don\'t show up in the notification list or contribute to the count', async () => { - const { modalCloseButton } = selectors const url = `${layerNoticesQuery}&mockAlerts=all_types` await page.goto(url) - await modalCloseButton.click() + await closeModal(page) await infoButtonIcon.click() const badge = await page.getByRole('button', { name: 'Notifications 2' }) await expect(badge).toBeVisible() @@ -65,10 +65,9 @@ test('Verify that the user is only alerted if they have not already stored all i }) test('Verify that zots show for the layers that have notices', async () => { - const { modalCloseButton } = selectors const url = `${layerNoticesQuery}&mockAlerts=all_types` await page.goto(url) - await modalCloseButton.click() + await closeModal(page) const aquaZot = await page.locator('#MODIS_Aqua_CorrectedReflectance_TrueColor-zot') const particulateZot = await page.locator('#Particulate_Matter_Below_2__2E__5micrometers_2001-2010-zot') await expect(aquaZot).toBeVisible() diff --git a/e2e/features/palettes/disable-test.spec.js b/e2e/features/palettes/disable-test.spec.js index 3756337b87..3c609573a5 100644 --- a/e2e/features/palettes/disable-test.spec.js +++ b/e2e/features/palettes/disable-test.spec.js @@ -1,9 +1,8 @@ // @ts-check const { test, expect } = require('@playwright/test') -const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page -let selectors const enabledPermalink = 'http://localhost:3000/?l=Last_of_the_Wild_1995-2004' const disabledPermalink = 'http://localhost:3000/?l=Last_of_the_Wild_1995-2004(disabled=0-13-12-1-2-6)' @@ -12,7 +11,6 @@ test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -20,9 +18,8 @@ test.afterAll(async () => { }) test('Verify that toggling class updates permalink and layer-legend', async () => { - const { modalCloseButton } = selectors await page.goto(enabledPermalink) - await modalCloseButton.click() + await closeModal(page) const disabledClassification = await page.locator('#active-Last_of_the_Wild_1995-2004 .disabled-classification') await expect(disabledClassification).not.toBeVisible() await page.locator('#active-Last_of_the_Wild_1995-2004').hover() @@ -53,9 +50,8 @@ test('Verify that toggling class-all on updates permalink and layer-legend', asy }) test('Verify that loaded permalink disables classes', async () => { - const { modalCloseButton } = selectors await page.goto(disabledPermalink) - await modalCloseButton.click() + await closeModal(page) const colorBoxDisabledZero = await page.locator('#Last_of_the_Wild_1995-2004_0_legend-color-Last_of_the_Wild_1995-2004-active0.disabled-classification') const colorBoxDisabledThirteen = await page.locator('#Last_of_the_Wild_1995-2004_0_legend-color-Last_of_the_Wild_1995-2004-active13.disabled-classification') const colorBoxDisabledSix = await page.locator('#Last_of_the_Wild_1995-2004_0_legend-color-Last_of_the_Wild_1995-2004-active6.disabled-classification') diff --git a/e2e/features/projections/projections-test.spec.js b/e2e/features/projections/projections-test.spec.js index 17b7f7b703..541e11c20b 100644 --- a/e2e/features/projections/projections-test.spec.js +++ b/e2e/features/projections/projections-test.spec.js @@ -1,7 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') -const { switchProjections } = require('../../test-utils/hooks/wvHooks') +const { switchProjections, closeModal } = require('../../test-utils/hooks/wvHooks') const { skipTour } = require('../../test-utils/global-variables/querystrings') let page @@ -19,9 +19,9 @@ test.afterAll(async () => { }) test('Verify default page shows projection toolbar button in geographic projection map', async () => { - const { geographicMap, modalCloseButton, projToolbarButton } = selectors + const { geographicMap, projToolbarButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(projToolbarButton).toBeVisible() await expect(geographicMap).toBeVisible() }) diff --git a/e2e/features/share/share-test.spec.js b/e2e/features/share/share-test.spec.js index b787dc8b7e..4409ce4e6a 100644 --- a/e2e/features/share/share-test.spec.js +++ b/e2e/features/share/share-test.spec.js @@ -3,6 +3,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') const { getAttribute } = require('../../test-utils/hooks/basicHooks') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -21,9 +22,9 @@ test.afterAll(async () => { }) test('Clicking the share link button opens the share dialog', async () => { - const { modalCloseButton, shareToolbarButton, shareToolbar } = selectors + const { shareToolbarButton, shareToolbar } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await shareToolbarButton.click() await expect(shareToolbar).toBeVisible() }) @@ -38,10 +39,10 @@ test('Share tabs link and social are visible and enabled', async () => { }) test('Share link clipboard with existing time query string param in the page url will have the same serialized time', async () => { - const { modalCloseButton, shareToolbarButton, shareLinkInput } = selectors + const { shareToolbarButton, shareLinkInput } = selectors const queryString = 'http://localhost:3000/?t=2018-12-31' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await shareToolbarButton.click() const url = await page.url() expect(url).toContain('t=') @@ -49,10 +50,10 @@ test('Share link clipboard with existing time query string param in the page url }) test('Share link clipboard with no time query string param in the page url will have the same serialized time (partial YYYY-MM-DD)', async () => { - const { modalCloseButton, shareToolbarButton } = selectors + const { shareToolbarButton } = selectors const queryString = 'http://localhost:3000/' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await page.getByRole('button', { name: '×' }).click() await shareToolbarButton.click() const minutesOffset = 40 * 60000 // 40 minutes @@ -86,10 +87,10 @@ test('Clicking the social tab displays social share buttons', async () => { }) test('Clicking Shorten link works with links less than 2049 characters', async () => { - const { modalCloseButton, shareToolbarButton } = selectors + const { shareToolbarButton } = selectors const shortQueryString = 'http://localhost:3000/?l=Reference_Labels_15m,Reference_Features_15m,Coastlines_15m,VIIRS_NOAA20_CorrectedReflectance_TrueColor(hidden),VIIRS_SNPP_CorrectedReflectance_TrueColor(hidden),MODIS_Aqua_CorrectedReflectance_TrueColor(hidden),MODIS_Terra_CorrectedReflectance_TrueColor&lg=true&t=2022-08-10-T15%3A15%3A05Z' await page.goto(shortQueryString) - await modalCloseButton.click() + await closeModal(page) const linkShortenCase = await page.locator('#wv-link-shorten-case') await shareToolbarButton.click() await linkShortenCase.click() @@ -97,10 +98,10 @@ test('Clicking Shorten link works with links less than 2049 characters', async ( }) test('Clicking Shorten link is refused with links greater than 2048 characters', async () => { - const { modalCloseButton, shareToolbarButton } = selectors + const { shareToolbarButton } = selectors const longQueryString = 'http://localhost:3000/?l=MODIS_Terra_AOD_Deep_Blue_Combined,MODIS_Terra_AOD_Deep_Blue_Land,MODIS_Terra_Angstrom_Exponent_Ocean,MODIS_Terra_Angstrom_Exponent_Land,MODIS_Terra_Aerosol_Optical_Depth_3km,MODIS_Terra_Aerosol,MISR_Aerosol_Optical_Depth_Avg_Green_Monthly,VIIRS_SNPP_Angstrom_Exponent_Dark_Target_Ocean,VIIRS_SNPP_AOT_Dark_Target_Land_Ocean,VIIRS_SNPP_Angstrom_Exponent_Deep_Blue_Best_Estimate,VIIRS_SNPP_AOT_Deep_Blue_Best_Estimate,SWDB_Aerosol_Angstrom_Exponent_Monthly,SWDB_Aerosol_Optical_Thickness_550nm_Monthly,SWDB_Aerosol_Angstrom_Exponent_Daily,SWDB_Aerosol_Optical_Thickness_550nm_Daily,MERRA2_Total_Aerosol_Optical_Thickness_550nm_Extinction_Monthly,MERRA2_Total_Aerosol_Optical_Thickness_550nm_Scattering_Monthly,OMI_Absorbing_Aerosol_Optical_Thickness_MW_388,OMI_Absorbing_Aerosol_Optical_Depth,OMI_Aerosol_Optical_Depth,MODIS_Aqua_AOD_Deep_Blue_Combined,MODIS_Aqua_AOD_Deep_Blue_Land,MODIS_Aqua_Angstrom_Exponent_Ocean,MODIS_Aqua_Angstrom_Exponent_Land,MODIS_Aqua_Aerosol_Optical_Depth_3km,MODIS_Aqua_Aerosol,MODIS_Combined_MAIAC_L2G_AerosolOpticalDepth,MODIS_Combined_Value_Added_AOD,MLS_CO_215hPa_Night,MLS_CO_215hPa_Day,AIRS_L3_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Monthly_Night,AIRS_L3_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Monthly_Day,AIRS_L3_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Daily_Night,AIRS_L3_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Daily_Day,AIRS_L2_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Night,AIRS_L2_Carbon_Monoxide_500hPa_Volume_Mixing_Ratio_Day,OrbitTracks_Aura_Descending,OrbitTracks_Aura_Ascending,OrbitTracks_Aqua_Ascending,OrbitTracks_Suomi_NPP_Ascending,VIIRS_SNPP_Aerosol_Type_Deep_Blue_Best_Estimate,Reference_Labels_15m,Reference_Features_15m,Coastlines_15m,MODIS_Combined_L3_Nadir-BRDF_Daily,MODIS_Combined_MAIAC_L2G_BidirectionalReflectance_Bands143,VIIRS_NOAA20_CorrectedReflectance_TrueColor(hidden),VIIRS_SNPP_CorrectedReflectance_TrueColor(hidden),MODIS_Aqua_CorrectedReflectance_TrueColor(hidden),MODIS_Terra_CorrectedReflectance_TrueColor&lg=true&t=2022-08-10-T15%3A15%3A05Z' await page.goto(longQueryString) - await modalCloseButton.click() + await closeModal(page) const linkShortenCase = await page.locator('#wv-link-shorten-case') await shareToolbarButton.click() await linkShortenCase.click() diff --git a/e2e/features/timeline/date-selector-test.spec.js b/e2e/features/timeline/date-selector-test.spec.js index 1c89500a16..b6bfd88e57 100644 --- a/e2e/features/timeline/date-selector-test.spec.js +++ b/e2e/features/timeline/date-selector-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { subdailyLayerIntervalTimescale, knownDate } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -23,11 +24,10 @@ test('Verify subdaily default year, month, day, hour, minute date selector input dateSelectorHourInput, dateSelectorDayInput, dateSelectorMonthInput, - dateSelectorYearInput, - modalCloseButton + dateSelectorYearInput } = selectors await page.goto(subdailyLayerIntervalTimescale) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorMinuteInput).toBeVisible() await expect(dateSelectorHourInput).toBeVisible() await expect(dateSelectorDayInput).toBeVisible() @@ -36,9 +36,9 @@ test('Verify subdaily default year, month, day, hour, minute date selector input }) test('Change date using left/right arrows', async () => { - const { dateSelectorDayInput, modalCloseButton } = selectors + const { dateSelectorDayInput } = selectors await page.goto(knownDate) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorDayInput).toHaveValue('22') await page.locator('#left-arrow-group').click() await expect(dateSelectorDayInput).toHaveValue('21') @@ -47,10 +47,9 @@ test('Change date using left/right arrows', async () => { }) test('Left timeline arrow will not be disabled by default', async () => { - const { modalCloseButton } = selectors const queryString = 'http://localhost:3000/' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await page.getByRole('button', { name: '×' }).click() const leftArrow = await page.locator('#left-arrow-group') await expect(leftArrow).not.toHaveClass(/button-disabled/) @@ -75,17 +74,15 @@ test('Left timeline arrow will not be disabled by default', async () => { // }) test('Right timeline arrow will not be disabled', async () => { - const { modalCloseButton } = selectors await page.goto(knownDate) - await modalCloseButton.click() + await closeModal(page) const rightArrow = await page.locator('#right-arrow-group') await expect(rightArrow).not.toHaveClass(/button-disabled/) }) test('Now button will not be disabled if date is not on now', async () => { - const { modalCloseButton } = selectors await page.goto(knownDate) - await modalCloseButton.click() + await closeModal(page) const nowButton = await page.locator('#now-button-group') await expect(nowButton).not.toHaveClass(/button-disabled/) }) @@ -94,12 +91,11 @@ test('Verify date selector is populated with date YYYY-MON-DD', async () => { const { dateSelectorDayInput, dateSelectorMonthInput, - dateSelectorYearInput, - modalCloseButton + dateSelectorYearInput } = selectors const queryString = 'http://localhost:3000/?t=2019-02-22' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorDayInput).toHaveValue('22') await expect(dateSelectorMonthInput).toHaveValue('FEB') await expect(dateSelectorYearInput).toHaveValue('2019') @@ -111,11 +107,10 @@ test('Verify subdaily date selector is populated with date YYYY-MON-DD-HH-MM', a dateSelectorMonthInput, dateSelectorYearInput, dateSelectorHourInput, - dateSelectorMinuteInput, - modalCloseButton + dateSelectorMinuteInput } = selectors await page.goto(subdailyLayerIntervalTimescale) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorMinuteInput).toHaveValue('46') await expect(dateSelectorHourInput).toHaveValue('09') await expect(dateSelectorDayInput).toHaveValue('04') @@ -124,10 +119,10 @@ test('Verify subdaily date selector is populated with date YYYY-MON-DD-HH-MM', a }) test('Allow invalid day values in date selector', async () => { - const { dateSelectorDayInput, modalCloseButton } = selectors + const { dateSelectorDayInput } = selectors const queryString = 'http://localhost:3000/?t=2019-02-22' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await dateSelectorDayInput.fill('31') await page.keyboard.press('Enter') await expect(dateSelectorDayInput).toHaveClass(/invalid-input/) @@ -137,12 +132,11 @@ test('Allow invalid year to valid year values in date selector', async () => { const { dateSelectorDayInput, dateSelectorMonthInput, - dateSelectorYearInput, - modalCloseButton + dateSelectorYearInput } = selectors const queryString = 'http://localhost:3000/?t=2019-02-22' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await dateSelectorYearInput.fill('2020') await dateSelectorMonthInput.fill('MAR') await dateSelectorDayInput.fill('31') @@ -156,12 +150,11 @@ test('Verify invalid days are rolled over', async () => { const { dateSelectorDayInput, dateSelectorMonthInput, - dateSelectorYearInput, - modalCloseButton + dateSelectorYearInput } = selectors const queryString = 'http://localhost:3000/?t=2013-02-29' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorDayInput).toHaveValue('01') await expect(dateSelectorMonthInput).toHaveValue('MAR') await expect(dateSelectorYearInput).toHaveValue('2013') @@ -173,12 +166,11 @@ test('Date selector up arrow rolls over from Feb 28 to 1 (non leap year) and the dayDown, dateSelectorDayInput, dateSelectorMonthInput, - dateSelectorYearInput, - modalCloseButton + dateSelectorYearInput } = selectors const queryString = 'http://localhost:3000/?t=2013-02-28' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await dayUp.click() await expect(dateSelectorDayInput).toHaveValue('01') await expect(dateSelectorMonthInput).toHaveValue('FEB') @@ -190,10 +182,9 @@ test('Date selector up arrow rolls over from Feb 28 to 1 (non leap year) and the }) test('Added future layer and right timeline arrow is not disabled', async () => { - const { modalCloseButton } = selectors const queryString = 'http://localhost:3000/?mockFutureLayer=VIIRS_SNPP_CorrectedReflectance_TrueColor,3D' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) const rightArrow = await page.locator('#right-arrow-group') await expect(rightArrow).not.toHaveClass(/button-disabled/) await rightArrow.click() diff --git a/e2e/features/timeline/layer-coverage-panel-test.spec.js b/e2e/features/timeline/layer-coverage-panel-test.spec.js index a53ed019ff..737009010f 100644 --- a/e2e/features/timeline/layer-coverage-panel-test.spec.js +++ b/e2e/features/timeline/layer-coverage-panel-test.spec.js @@ -1,16 +1,14 @@ // @ts-check const { test, expect } = require('@playwright/test') const { skipTour, referenceLayersOnly } = require('../../test-utils/global-variables/querystrings') -const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page -let selectors test.describe.configure({ mode: 'serial' }) test.beforeAll(async ({ browser }) => { page = await browser.newPage() - selectors = createSelectors(page) }) test.afterAll(async () => { @@ -18,17 +16,15 @@ test.afterAll(async () => { }) test('Layer coverage is shown by default', async () => { - const { modalCloseButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) const layerCoverageAxisLine = await page.locator('.axis-matching-layer-coverage-line') await expect(layerCoverageAxisLine).toBeVisible() }) test('No layer coverage is shown by default', async () => { - const { modalCloseButton } = selectors await page.goto(referenceLayersOnly) - await modalCloseButton.click() + await closeModal(page) const layerCoverageAxisLine = await page.locator('.axis-matching-layer-coverage-line') const layerCoverageHandle = await page.locator('#timeline-layer-coverage-panel-handle') await expect(layerCoverageHandle).toBeVisible() @@ -36,9 +32,8 @@ test('No layer coverage is shown by default', async () => { }) test('Panel opens on handle click', async () => { - const { modalCloseButton } = selectors await page.goto(referenceLayersOnly) - await modalCloseButton.click() + await closeModal(page) const layerCoverageContainer = await page.locator('.timeline-layer-coverage-container') const layerCoverageHandle = await page.locator('#timeline-layer-coverage-panel-handle') await layerCoverageHandle.click() diff --git a/e2e/features/timeline/timeline-mobile-test.spec.js b/e2e/features/timeline/timeline-mobile-test.spec.js index 7f4f86060f..5c7d6909e7 100644 --- a/e2e/features/timeline/timeline-mobile-test.spec.js +++ b/e2e/features/timeline/timeline-mobile-test.spec.js @@ -1,6 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -20,10 +21,10 @@ test.afterAll(async () => { }) test('date.mob.init.2a: Before 3:00 UTC: load yesterdays date', async () => { - const { mobileDatePickerSelectBtn, modalCloseButton } = selectors + const { mobileDatePickerSelectBtn } = selectors const queryString = 'http://localhost:3000/?now=2013-03-15T0' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(mobileDatePickerSelectBtn).toContainText('2013 MAR 14') }) @@ -36,10 +37,10 @@ test('date.mob.init.2b: Before 3:00 UTC: right button is not disabled', async () }) test('date.mob.init.3a: After 3:00 UTC: load todays date', async () => { - const { mobileDatePickerSelectBtn, modalCloseButton } = selectors + const { mobileDatePickerSelectBtn } = selectors const queryString = 'http://localhost:3000/?now=2013-03-15T4' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(mobileDatePickerSelectBtn).toContainText('2013 MAR 15') }) @@ -50,10 +51,10 @@ test('date.mob.init.3b:After 3:00 UTC: right button is disabled', async () => { }) test('date.mob.range.1: Date label should show 2013-03-15', async () => { - const { mobileDatePickerSelectBtn, modalCloseButton } = selectors + const { mobileDatePickerSelectBtn } = selectors const queryString = 'http://localhost:3000/?now=2013-03-15T12' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(mobileDatePickerSelectBtn).toContainText('2013 MAR 15') }) @@ -106,10 +107,10 @@ test('date.mob.range.6: Click okay button verify date has updated', async ({ bro }) test('date.mob.nav.1: Date label should show 2013 JUL 20', async () => { - const { mobileDatePickerSelectBtn, modalCloseButton } = selectors + const { mobileDatePickerSelectBtn } = selectors const queryString = 'http://localhost:3000/?now=2014-03-15&t=2013-07-20T12' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await expect(mobileDatePickerSelectBtn).toContainText('2013 JUL 20') }) diff --git a/e2e/features/timeline/timeline-test.spec.js b/e2e/features/timeline/timeline-test.spec.js index b0bb2839af..872ee6cced 100644 --- a/e2e/features/timeline/timeline-test.spec.js +++ b/e2e/features/timeline/timeline-test.spec.js @@ -6,6 +6,7 @@ const { subdailyLayerIntervalTimescale, knownDate } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -22,9 +23,9 @@ test.afterAll(async () => { }) test('Dragger is visible', async () => { - const { dragger, modalCloseButton } = selectors + const { dragger } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await expect(dragger).toBeVisible() }) @@ -71,9 +72,8 @@ test('Change to year zoom level and axis changes', async () => { }) test('Interval state of HOUR restored from permalink', async () => { - const { modalCloseButton } = selectors await page.goto(subdailyLayerIntervalTimescale) - await modalCloseButton.click() + await closeModal(page) const currentInteval = await page.locator('#current-interval') await page.locator('#timeline-interval-btn-container').hover() await expect(currentInteval).toContainText('1 hour') @@ -101,10 +101,10 @@ test('Custom interval widget opens on selecting custom', async () => { }) test('Select custom interval changes current interval and changes date by current interval', async () => { - const { dateSelectorDayInput, modalCloseButton } = selectors + const { dateSelectorDayInput } = selectors const customInterval = await page.locator('#current-interval') await page.goto(knownDate) - await modalCloseButton.click() + await closeModal(page) await expect(dateSelectorDayInput).toHaveValue('22') await page.locator('#timeline-interval-btn-container').hover() await page.locator('#interval-custom-static').click() @@ -117,22 +117,20 @@ test('Select custom interval changes current interval and changes date by curren }) test('Timescale zoom level defaults to DAY', async () => { - const { modalCloseButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) const currentZoom = await page.locator('#current-zoom') await expect(currentZoom).toContainText('day') }) test('Timescale zoom subdaily default year, month, day, hour, minute, and custom intervals', async () => { - const { modalCloseButton } = selectors const zoomYears = await page.locator('#zoom-years') const zoomMonths = await page.locator('#zoom-months') const zoomDays = await page.locator('#zoom-days') const zoomHours = await page.locator('#zoom-hours') const zoomMinutes = await page.locator('#zoom-minutes') await page.goto(subdailyLayerIntervalTimescale) - await modalCloseButton.click() + await closeModal(page) await page.locator('#current-zoom').hover() await expect(zoomYears).toBeVisible() await expect(zoomMonths).toBeVisible() @@ -147,18 +145,16 @@ test('Timescale zoom HOUR restored from permalink', async () => { }) test('Date tooltip date present load', async () => { - const { modalCloseButton } = selectors const queryString = 'http://localhost:3000/?t=2019-02-22' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) const dateTooltip = await page.locator('.date-tooltip') await expect(dateTooltip).toContainText('2019 FEB 22 (DOY 053)') }) test('Date subdaily tooltip date present on load', async () => { - const { modalCloseButton } = selectors await page.goto(subdailyLayerIntervalTimescale) - await modalCloseButton.click() + await closeModal(page) const dateTooltip = await page.locator('.date-tooltip') await expect(dateTooltip).toContainText('2019 OCT 04 09:46Z (DOY 277)') }) diff --git a/e2e/features/tour/tour-test.spec.js b/e2e/features/tour/tour-test.spec.js index 0054599f3c..73676573fe 100644 --- a/e2e/features/tour/tour-test.spec.js +++ b/e2e/features/tour/tour-test.spec.js @@ -2,6 +2,7 @@ const { test } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -18,9 +19,9 @@ test.afterAll(async () => { }) test('Verify that all tour modals are present when the page is loaded', async () => { - const { infoToolbarButton, modalCloseButton } = selectors + const { infoToolbarButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) await infoToolbarButton.click() await page.locator('#start_tour_info_item').click() }) diff --git a/e2e/features/ui/distraction-free-mode-test.spec.js b/e2e/features/ui/distraction-free-mode-test.spec.js index d2daf64092..be87d97167 100644 --- a/e2e/features/ui/distraction-free-mode-test.spec.js +++ b/e2e/features/ui/distraction-free-mode-test.spec.js @@ -1,6 +1,7 @@ // @ts-check const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -71,10 +72,10 @@ const distractionFreeModeValidElsRemoved = async (proj, isActive) => { } test('Enabling distraction free mode with shortcut key hides UI elements', async () => { - const { locationSearchMinimizeButton, infoToolbarButton, modalCloseButton } = selectors + const { locationSearchMinimizeButton, infoToolbarButton } = selectors const queryString = 'http://localhost:3000/?p=arctic' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await locationSearchMinimizeButton.click() await infoToolbarButton.click() await page.locator('#distraction_free_info_item').click() @@ -88,9 +89,8 @@ test('Disabling distraction free mode with shortcut key returns UI elements', as }) test('Enabling distraction free mode activates query string parameter df', async () => { - const { modalCloseButton } = selectors const queryString = 'http://localhost:3000/?df=true' await page.goto(queryString) - await modalCloseButton.click() + await closeModal(page) await distractionFreeModeValidElsRemoved('geographic', true) }) diff --git a/e2e/features/ui/info-mobile-test.spec.js b/e2e/features/ui/info-mobile-test.spec.js index 942cf1af04..2421218489 100644 --- a/e2e/features/ui/info-mobile-test.spec.js +++ b/e2e/features/ui/info-mobile-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -21,9 +22,9 @@ test.afterAll(async () => { }) test('Mobile info toolbar is visible and contains valid mobile menu items', async () => { - const { infoToolbarButton, modalCloseButton } = selectors + const { infoToolbarButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) const sendFeedback = await page.locator('#send_feedback_info_item') const settingsInfo = await page.locator('#settings_info_item') const aboutInfo = await page.locator('#about_info_item') diff --git a/e2e/features/ui/info-test.spec.js b/e2e/features/ui/info-test.spec.js index 51daee1ec5..db2daf9442 100644 --- a/e2e/features/ui/info-test.spec.js +++ b/e2e/features/ui/info-test.spec.js @@ -2,6 +2,7 @@ const { test, expect } = require('@playwright/test') const createSelectors = require('../../test-utils/global-variables/selectors') const { skipTour } = require('../../test-utils/global-variables/querystrings') +const { closeModal } = require('../../test-utils/hooks/wvHooks') let page let selectors @@ -18,9 +19,9 @@ test.afterAll(async () => { }) test('Info toolbar is visible and contains valid menu items', async () => { - const { infoToolbarButton, modalCloseButton } = selectors + const { infoToolbarButton } = selectors await page.goto(skipTour) - await modalCloseButton.click() + await closeModal(page) const sendFeedback = await page.locator('#send_feedback_info_item') const startTour = await page.locator('#start_tour_info_item') const settingsInfo = await page.locator('#settings_info_item') diff --git a/e2e/test-utils/hooks/wvHooks.js b/e2e/test-utils/hooks/wvHooks.js index 2becce1eb9..0332cb1e0c 100644 --- a/e2e/test-utils/hooks/wvHooks.js +++ b/e2e/test-utils/hooks/wvHooks.js @@ -169,12 +169,20 @@ const clickAndWait = async (page, locator) => { await page.waitForTimeout(200) } +const closeModal = async (page) => { + const closeButton = page.locator('.modal-close-btn') + if (await closeButton.count() > 0) { + await closeButton.click() + } +} + module.exports = { assertCategories, assertDefaultLayers, assertLayerOrdering, clickDownload, closeImageDownloadPanel, + closeModal, createAreaMeasurement, createDistanceMeasurement, dateSelectorMonthDay, diff --git a/package-lock.json b/package-lock.json index 564f2483f6..bd61475265 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "worldview", - "version": "4.21.1", + "version": "4.24.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "worldview", - "version": "4.21.1", + "version": "4.24.0", "hasInstallScript": true, "license": "NASA-1.3", "dependencies": { @@ -18,7 +18,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@khanisak/temperature-converter": "^2.0.1", "@redux-devtools/extension": "^3.2.6", - "axios": "^1.6.2", + "axios": "^1.6.5", "bluebird": "3.7.2", "bootstrap": "^5.3.2", "cachai": "^1.0.2", @@ -37,13 +37,13 @@ "jsdom-worker": "^0.3.0", "lodash": "^4.17.21", "masonry-layout": "^4.2.2", - "moment": "^2.29.4", + "moment": "^2.30.1", "moment-locales-webpack-plugin": "^1.2.0", "node-dir": "^0.1.17", "ol": "^8.2.0", "ol-mapbox-style": "^12.1.1", - "p-queue": "^8.0.0", - "proj4": "^2.9.2", + "p-queue": "^8.0.1", + "proj4": "^2.10.0", "prop-types": "^15.8.1", "qs": "^6.11.2", "react": "^18.0.0", @@ -51,21 +51,21 @@ "react-device-detect": "^2.2.3", "react-dom": "^18.0.0", "react-draggable": "^4.4.6", - "react-image-crop": "^11.0.1", + "react-image-crop": "^11.0.4", "react-infinite-scroller": "^1.2.6", - "react-joyride": "^2.7.1", + "react-joyride": "^2.7.2", "react-mobile-datepicker": "^4.0.2", "react-redux": "^8.1.3", "react-resizable": "^3.0.5", "react-swipe-to-delete-component": "1.0.5", "react-visibility-sensor": "^5.1.1", "reactstrap": "^9.2.1", - "recharts": "^2.10.3", + "recharts": "^2.10.4", "redux": "^4.2.1", "redux-location-state": "^2.8.2", "redux-logger": "^3.0.6", "redux-thunk": "^2.4.2", - "regenerator-runtime": "^0.14.0", + "regenerator-runtime": "^0.14.1", "reselect": "^4.1.8", "rgbcolor": "^1.0.1", "simplebar": "^6.2.5", @@ -74,37 +74,37 @@ "supercluster": "^8.0.1", "tough-cookie": "^4.1.3", "upng-js": "^2.1.0", - "url-template": "^3.1.0", + "url-template": "^3.1.1", "what-input": "^5.2.12" }, "devDependencies": { - "@babel/core": "^7.23.5", + "@babel/core": "^7.23.7", "@babel/eslint-parser": "^7.23.3", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/preset-env": "^7.23.5", + "@babel/preset-env": "^7.23.8", "@babel/preset-react": "^7.23.3", - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.41.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@webpack-cli/serve": "^2.0.5", "ajv": "^8.12.0", - "autoprefixer": "^10.4.16", + "autoprefixer": "^10.4.17", "babel-loader": "^9.1.3", "cheerio": "^1.0.0-rc.12", "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", + "css-loader": "^6.9.1", + "css-minimizer-webpack-plugin": "^6.0.0", "css-url-relative-plugin": "^1.1.0", - "cssnano": "^6.0.1", - "eslint": "^8.55.0", + "cssnano": "^6.0.3", + "eslint": "^8.56.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.1.0", "eslint-import-resolver-webpack": "^0.13.8", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.6.2", "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-n": "^16.3.1", + "eslint-plugin-n": "^16.6.2", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.1.1", @@ -116,32 +116,32 @@ "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", "jest-environment-jsdom": "^29.7.0", - "mini-css-extract-plugin": "^2.7.6", + "mini-css-extract-plugin": "^2.7.7", "node-dir": "^0.1.17", "node-fetch": "^2.6.9", "node-ssh": "^13.1.0", "npm-run-all": "^4.1.5", "patch-package": "^8.0.0", - "postcss": "^8.4.32", - "postcss-loader": "^7.3.3", + "postcss": "^8.4.33", + "postcss-loader": "^8.0.0", "react-refresh": "^0.14.0", "react-test-renderer": "^18.0.0", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.69.5", - "sass-loader": "^13.3.2", + "sass": "^1.70.0", + "sass-loader": "^14.0.0", "shelljs": "^0.8.5", "showdown": "^2.1.0", "stylelint": "^15.11.0", "stylelint-config-standard-scss": "^11.1.0", - "stylelint-high-performance-animation": "^1.9.0", + "stylelint-high-performance-animation": "^1.10.0", "tar": "^6.2.0", - "terser-webpack-plugin": "^5.3.9", + "terser-webpack-plugin": "^5.3.10", "uuid": "^9.0.1", "webpack": "^5.89.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", - "webpack-dev-middleware": "^6.1.1", + "webpack-dev-middleware": "^7.0.0", "webpack-dev-server": "^4.15.1", "xml-js": "^1.6.11", "xml2js": "^0.6.2", @@ -190,20 +190,21 @@ } }, "node_modules/@babel/core": { - "version": "7.23.5", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -236,11 +237,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.5", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -285,13 +287,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -351,9 +354,10 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -555,13 +559,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.5", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" @@ -580,9 +585,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -621,9 +627,10 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5" @@ -917,9 +924,10 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -1009,15 +1017,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.5", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -1134,11 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1689,17 +1699,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.5", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1720,13 +1731,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", @@ -1734,7 +1745,7 @@ "@babel/plugin-transform-dynamic-import": "^7.23.4", "@babel/plugin-transform-exponentiation-operator": "^7.23.3", "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.6", "@babel/plugin-transform-function-name": "^7.23.3", "@babel/plugin-transform-json-strings": "^7.23.4", "@babel/plugin-transform-literals": "^7.23.3", @@ -1768,9 +1779,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1842,19 +1853,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.5", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1862,8 +1874,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2224,9 +2237,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3146,7 +3159,8 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3154,7 +3168,8 @@ }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3169,8 +3184,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "license": "MIT", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", + "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3270,11 +3286,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.1", + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.0.tgz", + "integrity": "sha512-Grvzj841THwtpBOrfiHOeYTJQxDRnKofMSzCiV8XeyLWu3o89qftQ4BCKfkziJhSUQRd0utKhrddtIsiraIwmw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.40.1" + "playwright": "1.41.0" }, "bin": { "playwright": "cli.js" @@ -3395,8 +3412,9 @@ }, "node_modules/@trysound/sax": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -3639,8 +3657,9 @@ }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/lodash": { "version": "4.14.199", @@ -4253,6 +4272,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" @@ -4464,7 +4489,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", "dev": true, "funding": [ { @@ -4480,11 +4507,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4519,10 +4545,11 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "license": "MIT", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -4748,12 +4775,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -4761,23 +4789,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4994,7 +5024,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "funding": [ { "type": "opencollective", @@ -5009,11 +5041,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -5138,8 +5169,9 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -5148,7 +5180,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001542", + "version": "1.0.30001579", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", + "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", "funding": [ { "type": "opencollective", @@ -5162,8 +5196,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -5710,11 +5743,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.0", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -5899,11 +5933,12 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.4.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz", + "integrity": "sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==", "dev": true, - "license": "ISC", "engines": { - "node": "^10 || ^12 || >=14" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.0.9" @@ -5918,18 +5953,19 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", + "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -5943,19 +5979,20 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-6.0.0.tgz", + "integrity": "sha512-BLpR9CCDkKvhO3i0oZQgad6v9pCxUuhSc5RT6iUEy9M8hBXi4TJb5vqF2GQ2deqYHmRi3O6IR9hgAZQWg0EBwA==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" + "@jridgewell/trace-mapping": "^0.3.21", + "cssnano": "^6.0.3", + "jest-worker": "^29.7.0", + "postcss": "^8.4.33", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -6105,12 +6142,13 @@ "license": "MIT" }, "node_modules/cssnano": { - "version": "6.0.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.3.tgz", + "integrity": "sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==", "dev": true, - "license": "MIT", "dependencies": { - "cssnano-preset-default": "^6.0.1", - "lilconfig": "^2.1.0" + "cssnano-preset-default": "^6.0.3", + "lilconfig": "^3.0.0" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6120,66 +6158,69 @@ "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-preset-default": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^4.0.0", - "postcss-calc": "^9.0.0", - "postcss-colormin": "^6.0.0", - "postcss-convert-values": "^6.0.0", - "postcss-discard-comments": "^6.0.0", - "postcss-discard-duplicates": "^6.0.0", - "postcss-discard-empty": "^6.0.0", - "postcss-discard-overridden": "^6.0.0", - "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.1", - "postcss-minify-font-values": "^6.0.0", - "postcss-minify-gradients": "^6.0.0", - "postcss-minify-params": "^6.0.0", - "postcss-minify-selectors": "^6.0.0", - "postcss-normalize-charset": "^6.0.0", - "postcss-normalize-display-values": "^6.0.0", - "postcss-normalize-positions": "^6.0.0", - "postcss-normalize-repeat-style": "^6.0.0", - "postcss-normalize-string": "^6.0.0", - "postcss-normalize-timing-functions": "^6.0.0", - "postcss-normalize-unicode": "^6.0.0", - "postcss-normalize-url": "^6.0.0", - "postcss-normalize-whitespace": "^6.0.0", - "postcss-ordered-values": "^6.0.0", - "postcss-reduce-initial": "^6.0.0", - "postcss-reduce-transforms": "^6.0.0", - "postcss-svgo": "^6.0.0", - "postcss-unique-selectors": "^6.0.0" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.3.tgz", + "integrity": "sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^7.1.1", + "cssnano-utils": "^4.0.1", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.0.2", + "postcss-convert-values": "^6.0.2", + "postcss-discard-comments": "^6.0.1", + "postcss-discard-duplicates": "^6.0.1", + "postcss-discard-empty": "^6.0.1", + "postcss-discard-overridden": "^6.0.1", + "postcss-merge-longhand": "^6.0.2", + "postcss-merge-rules": "^6.0.3", + "postcss-minify-font-values": "^6.0.1", + "postcss-minify-gradients": "^6.0.1", + "postcss-minify-params": "^6.0.2", + "postcss-minify-selectors": "^6.0.2", + "postcss-normalize-charset": "^6.0.1", + "postcss-normalize-display-values": "^6.0.1", + "postcss-normalize-positions": "^6.0.1", + "postcss-normalize-repeat-style": "^6.0.1", + "postcss-normalize-string": "^6.0.1", + "postcss-normalize-timing-functions": "^6.0.1", + "postcss-normalize-unicode": "^6.0.2", + "postcss-normalize-url": "^6.0.1", + "postcss-normalize-whitespace": "^6.0.1", + "postcss-ordered-values": "^6.0.1", + "postcss-reduce-initial": "^6.0.2", + "postcss-reduce-transforms": "^6.0.1", + "postcss-svgo": "^6.0.2", + "postcss-unique-selectors": "^6.0.2" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/cssnano-utils": { - "version": "4.0.0", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.1.tgz", + "integrity": "sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/csso": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, - "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -6190,8 +6231,9 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -6203,8 +6245,9 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "dev": true, - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true }, "node_modules/cssom": { "version": "0.5.0", @@ -6736,8 +6779,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.537", - "license": "ISC" + "version": "1.4.615", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", + "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==" }, "node_modules/element-resize-detector": { "version": "1.2.4", @@ -6805,6 +6849,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.8.1", "dev": true, @@ -7032,14 +7085,14 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -7085,6 +7138,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-airbnb": { "version": "19.0.4", "dev": true, @@ -7261,12 +7326,14 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.2.0", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0" + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -7279,9 +7346,10 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -7299,7 +7367,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -7328,9 +7396,10 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.0", + "version": "27.6.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", + "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, @@ -7381,14 +7450,16 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.3.1", + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", + "eslint-plugin-es-x": "^7.5.0", "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", "ignore": "^5.2.4", "is-builtin-module": "^3.2.1", "is-core-module": "^2.12.1", @@ -7406,6 +7477,33 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-no-storage": { "version": "1.0.2", "dev": true, @@ -7943,6 +8041,13 @@ "version": "3.1.3", "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "peer": true + }, "node_modules/fast-equals": { "version": "5.0.1", "license": "MIT", @@ -8254,14 +8359,15 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.2", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8326,9 +8432,10 @@ } }, "node_modules/fraction.js": { - "version": "4.3.6", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -8367,8 +8474,10 @@ }, "node_modules/fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "license": "MIT", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -8996,6 +9105,15 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "dev": true, @@ -11631,11 +11749,12 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/lines-and-columns": { @@ -11705,10 +11824,18 @@ "version": "4.17.21", "license": "MIT" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "peer": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lodash.difference": { "version": "4.5.0", @@ -11726,8 +11853,9 @@ }, "node_modules/lodash.memoize": { "version": "4.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -11745,8 +11873,9 @@ }, "node_modules/lodash.uniq": { "version": "4.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", @@ -11985,9 +12114,10 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz", + "integrity": "sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==", "dev": true, - "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -12091,8 +12221,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "license": "MIT", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -12242,8 +12373,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.13", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/node-ssh": { "version": "13.1.0", @@ -12669,9 +12801,9 @@ } }, "node_modules/p-queue": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.0.tgz", - "integrity": "sha512-7LAaj8F47D5963LiTIAb/4UWR6w6SnDrDlxXg9ev/U0Lg9h35Kg8C8KiBry0c6MUofSicdLsEvS0j25gHAyCuA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" @@ -13156,11 +13288,12 @@ } }, "node_modules/playwright": { - "version": "1.40.1", + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.0.tgz", + "integrity": "sha512-XOsfl5ZtAik/T9oek4V0jAypNlaCNzuKOwVhqhgYT3os6kH34PzbRb74F0VWcLYa5WFdnmxl7qyAHBXvPv7lqQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.41.0" }, "bin": { "playwright": "cli.js" @@ -13173,9 +13306,10 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.0.tgz", + "integrity": "sha512-UGKASUhXmvqm2Lxa1fNr8sFwAtqjpgBRr9jQ7XBI8Rn5uFiEowGUGwrruUQsVPIom4bk7Lt+oLGpXobnXzrBIw==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -13194,9 +13328,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -13223,8 +13357,9 @@ }, "node_modules/postcss-calc": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -13237,11 +13372,12 @@ } }, "node_modules/postcss-colormin": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.2.tgz", + "integrity": "sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.22.2", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -13250,79 +13386,85 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-convert-values": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.2.tgz", + "integrity": "sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.22.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-comments": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz", + "integrity": "sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-duplicates": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.1.tgz", + "integrity": "sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-empty": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.1.tgz", + "integrity": "sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-discard-overridden": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz", + "integrity": "sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-loader": { - "version": "7.3.3", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.0.0.tgz", + "integrity": "sha512-+RiNlmYd1aXYv6QSBOAu6n9eJYy0ydyXTfjljAJ3vFU6MMo2M552zTVcBpBH+R5aAeKaYVG1K9UEyAVsLL1Qjg==", "dev": true, - "license": "MIT", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -13333,47 +13475,94 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", "dev": true, "license": "MIT" }, "node_modules/postcss-merge-longhand": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz", + "integrity": "sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.0.0" + "stylehacks": "^6.0.2" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-rules": { - "version": "6.0.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.3.tgz", + "integrity": "sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.22.2", "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-utils": "^4.0.1", + "postcss-selector-parser": "^6.0.15" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-font-values": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.1.tgz", + "integrity": "sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13381,53 +13570,56 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-gradients": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.1.tgz", + "integrity": "sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==", "dev": true, - "license": "MIT", "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^4.0.0", + "cssnano-utils": "^4.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-params": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.2.tgz", + "integrity": "sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^4.0.0", + "browserslist": "^4.22.2", + "cssnano-utils": "^4.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-selectors": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz", + "integrity": "sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==", "dev": true, - "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.15" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-modules-extract-imports": { @@ -13442,9 +13634,10 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13458,9 +13651,10 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", "dev": true, - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13486,20 +13680,22 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.1.tgz", + "integrity": "sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==", "dev": true, - "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-display-values": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.1.tgz", + "integrity": "sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13507,13 +13703,14 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-positions": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.1.tgz", + "integrity": "sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13521,13 +13718,14 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.1.tgz", + "integrity": "sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13535,13 +13733,14 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-string": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.1.tgz", + "integrity": "sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13549,13 +13748,14 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.1.tgz", + "integrity": "sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13563,28 +13763,30 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-unicode": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.2.tgz", + "integrity": "sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.22.2", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-url": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.1.tgz", + "integrity": "sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13592,13 +13794,14 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-whitespace": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.1.tgz", + "integrity": "sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13606,43 +13809,46 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-ordered-values": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.1.tgz", + "integrity": "sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==", "dev": true, - "license": "MIT", "dependencies": { - "cssnano-utils": "^4.0.0", + "cssnano-utils": "^4.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-initial": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.2.tgz", + "integrity": "sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.22.2", "caniuse-api": "^3.0.0" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-reduce-transforms": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.1.tgz", + "integrity": "sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13650,7 +13856,7 @@ "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-resolve-nested-selector": { @@ -13699,9 +13905,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13711,32 +13918,34 @@ } }, "node_modules/postcss-svgo": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.2.tgz", + "integrity": "sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^3.0.2" + "svgo": "^3.2.0" }, "engines": { "node": "^14 || ^16 || >= 18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-unique-selectors": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz", + "integrity": "sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==", "dev": true, - "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.15" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-value-parser": { @@ -13786,8 +13995,9 @@ "license": "MIT" }, "node_modules/proj4": { - "version": "2.9.2", - "license": "MIT", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.10.0.tgz", + "integrity": "sha512-0eyB8h1PDoWxucnq88/EZqt7UZlvjhcfbXCcINpE7hqRN0iRPWE/4mXINGulNa/FAvK+Ie7F+l2OxH/0uKV36A==", "dependencies": { "mgrs": "1.0.0", "wkt-parser": "^1.3.3" @@ -13918,6 +14128,21 @@ "version": "2.0.0", "license": "ISC" }, + "node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "dev": true, + "peer": true, + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/raf-schd": { "version": "4.0.3", "license": "MIT" @@ -14090,9 +14315,9 @@ "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==" }, "node_modules/react-image-crop": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-11.0.1.tgz", - "integrity": "sha512-rPXi9iJWoSZP0RWNhevoyAHvNz2ZElQilWE89AWXXRM9MKQUws5J9D0gfpuDOJBtUocirbWUyDcdNPAggP2AYQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-11.0.5.tgz", + "integrity": "sha512-A/Y/kspOzki1zDL/bSgwWIY1X3CQ9F1QwpdnncWLBVAktnKfAZDIQnWmjXzuzEjZHDMsBlArytIcPBVi6DNklg==", "peerDependencies": { "react": ">=16.13.1" } @@ -14120,9 +14345,9 @@ "license": "MIT" }, "node_modules/react-joyride": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.7.1.tgz", - "integrity": "sha512-G6/wtM5K6TyRxGebpaEiUg8dExQhGGtYPczjqOkFpeov7eXOHXdzT1huGJxp9fj7nW82cfKVQa6wTsO5aZ1ilw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.7.2.tgz", + "integrity": "sha512-AVzEweJxjQMc6hXUbJlH6St987GCmw0pkCSoz+X3XBMQmrk57FCMOrh1LvyMvW5GaT95C4D5oZpoaVjaOsgptg==", "dependencies": { "@gilbarbara/deep-equal": "^0.3.1", "@gilbarbara/helpers": "^0.9.0", @@ -14562,8 +14787,9 @@ } }, "node_modules/recharts": { - "version": "2.10.3", - "license": "MIT", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.4.tgz", + "integrity": "sha512-/Q7/wdf8bW91lN3NEeCjL9RWfaiXQViJFgdnas4Eix/I8B9HAI3tHHK/CW/zDfgRMh4fzW1zlfjoz1IAapLO1Q==", "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", @@ -14704,8 +14930,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "license": "MIT" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -14947,6 +15174,23 @@ "version": "1.3.3", "license": "BSD-3-Clause" }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "peer": true + }, "node_modules/safe-array-concat": { "version": "1.0.1", "dev": true, @@ -14992,9 +15236,10 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.69.5", + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", + "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -15008,30 +15253,27 @@ } }, "node_modules/sass-loader": { - "version": "13.3.2", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.0.0.tgz", + "integrity": "sha512-oceP9wWbep/yRJ2+sMbCzk0UsXsDzdNis+N8nu9i5GwPXjy6v3DNB6TqfJLSpPO9k4+B8x8p/CEgjA9ZLkoLug==", "dev": true, - "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { - "optional": true - }, "node-sass": { "optional": true }, @@ -15195,8 +15437,9 @@ "license": "MIT" }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "license": "BSD-3-Clause", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -15930,18 +16173,19 @@ "license": "ISC" }, "node_modules/stylehacks": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.2.tgz", + "integrity": "sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "browserslist": "^4.22.2", + "postcss-selector-parser": "^6.0.15" }, "engines": { "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/stylelint": { @@ -16064,14 +16308,15 @@ } }, "node_modules/stylelint-high-performance-animation": { - "version": "1.9.0", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/stylelint-high-performance-animation/-/stylelint-high-performance-animation-1.10.0.tgz", + "integrity": "sha512-YzNI+E6taN8pwgaM0INazRg4tw23VA17KNMKUVdOeohpnpSyJLBnLVT9NkRcaCFLodK/67smS5VZK+Qe4Ohrvw==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { - "stylelint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0" + "stylelint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/stylelint-scss": { @@ -16208,14 +16453,16 @@ "dev": true }, "node_modules/svgo": { - "version": "3.0.2", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", "dev": true, - "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, @@ -16283,8 +16530,9 @@ } }, "node_modules/terser": { - "version": "5.20.0", - "license": "BSD-2-Clause", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -16299,14 +16547,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "license": "MIT", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -16364,11 +16613,13 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16524,9 +16775,10 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -16536,8 +16788,9 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -16547,8 +16800,9 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -16825,8 +17079,9 @@ } }, "node_modules/url-template": { - "version": "3.1.0", - "license": "BSD-3-Clause", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-3.1.1.tgz", + "integrity": "sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -17146,18 +17401,19 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.1", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.0.0.tgz", + "integrity": "sha512-tZ5hqsWwww/8DislmrzXE3x+4f+v10H1z57mA2dWFrILb4i3xX+dPhTkcdR0DLyQztrhF2AUmO5nN085UYjd/Q==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.12", + "memfs": "^4.6.0", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -17172,6 +17428,57 @@ } } }, + "node_modules/webpack-dev-middleware/node_modules/json-joy": { + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/json-joy/-/json-joy-9.9.1.tgz", + "integrity": "sha512-/d7th2nbQRBQ/nqTkBe6KjjvDciSwn9UICmndwk3Ed/Bk9AqkTRm4PnLVfXG4DKbT0rEY0nKnwE7NqZlqKE6kg==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "hyperdyperid": "^1.2.0" + }, + "bin": { + "jj": "bin/jj.js", + "json-pack": "bin/json-pack.js", + "json-pack-test": "bin/json-pack-test.js", + "json-patch": "bin/json-patch.js", + "json-patch-test": "bin/json-patch-test.js", + "json-pointer": "bin/json-pointer.js", + "json-pointer-test": "bin/json-pointer-test.js", + "json-unpack": "bin/json-unpack.js" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "quill-delta": "^5", + "rxjs": "7", + "tslib": "2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.6.0.tgz", + "integrity": "sha512-I6mhA1//KEZfKRQT9LujyW6lRbX7RkC24xKododIDO3AGShcaFAMKElv1yFGWX8fD4UaSiwasr3NeQ5TdtHY1A==", + "dev": true, + "dependencies": { + "json-joy": "^9.2.0", + "thingies": "^1.11.1" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", "dev": true, @@ -17190,6 +17497,25 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/webpack-dev-middleware/node_modules/thingies": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.16.0.tgz", + "integrity": "sha512-J23AVs11hSQxuJxvfQyMIaS9z1QpDxOCvMkL3ZxZl8/jmkgmnNGWrlyNxVz6Jbh0U6DuGmHqq6f7zUROfg/ncg==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "peer": true + }, "node_modules/webpack-dev-server": { "version": "4.15.1", "dev": true, diff --git a/package.json b/package.json index 264bf8cf48..5b1f416000 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "worldview", - "version": "4.21.1", + "version": "4.24.0", "description": "Interactive interface for browsing full-resolution, global satellite imagery", "keywords": [ "NASA", @@ -77,33 +77,33 @@ "upload": "node tasks/util/upload.js" }, "devDependencies": { - "@babel/core": "^7.23.5", + "@babel/core": "^7.23.7", "@babel/eslint-parser": "^7.23.3", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/preset-env": "^7.23.5", + "@babel/preset-env": "^7.23.8", "@babel/preset-react": "^7.23.3", - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.41.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@webpack-cli/serve": "^2.0.5", "ajv": "^8.12.0", - "autoprefixer": "^10.4.16", + "autoprefixer": "^10.4.17", "babel-loader": "^9.1.3", "cheerio": "^1.0.0-rc.12", "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", + "css-loader": "^6.9.1", + "css-minimizer-webpack-plugin": "^6.0.0", "css-url-relative-plugin": "^1.1.0", - "cssnano": "^6.0.1", - "eslint": "^8.55.0", + "cssnano": "^6.0.3", + "eslint": "^8.56.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.1.0", "eslint-import-resolver-webpack": "^0.13.8", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.6.2", "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-n": "^16.3.1", + "eslint-plugin-n": "^16.6.2", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.1.1", @@ -115,32 +115,32 @@ "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", "jest-environment-jsdom": "^29.7.0", - "mini-css-extract-plugin": "^2.7.6", + "mini-css-extract-plugin": "^2.7.7", "node-dir": "^0.1.17", "node-fetch": "^2.6.9", "node-ssh": "^13.1.0", "npm-run-all": "^4.1.5", "patch-package": "^8.0.0", - "postcss": "^8.4.32", - "postcss-loader": "^7.3.3", + "postcss": "^8.4.33", + "postcss-loader": "^8.0.0", "react-refresh": "^0.14.0", "react-test-renderer": "^18.0.0", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.69.5", - "sass-loader": "^13.3.2", + "sass": "^1.70.0", + "sass-loader": "^14.0.0", "shelljs": "^0.8.5", "showdown": "^2.1.0", "stylelint": "^15.11.0", "stylelint-config-standard-scss": "^11.1.0", - "stylelint-high-performance-animation": "^1.9.0", + "stylelint-high-performance-animation": "^1.10.0", "tar": "^6.2.0", - "terser-webpack-plugin": "^5.3.9", + "terser-webpack-plugin": "^5.3.10", "uuid": "^9.0.1", "webpack": "^5.89.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", - "webpack-dev-middleware": "^6.1.1", + "webpack-dev-middleware": "^7.0.0", "webpack-dev-server": "^4.15.1", "xml-js": "^1.6.11", "xml2js": "^0.6.2", @@ -155,7 +155,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@khanisak/temperature-converter": "^2.0.1", "@redux-devtools/extension": "^3.2.6", - "axios": "^1.6.2", + "axios": "^1.6.5", "bluebird": "3.7.2", "bootstrap": "^5.3.2", "cachai": "^1.0.2", @@ -174,13 +174,13 @@ "jsdom-worker": "^0.3.0", "lodash": "^4.17.21", "masonry-layout": "^4.2.2", - "moment": "^2.29.4", + "moment": "^2.30.1", "moment-locales-webpack-plugin": "^1.2.0", "node-dir": "^0.1.17", "ol": "^8.2.0", "ol-mapbox-style": "^12.1.1", - "p-queue": "^8.0.0", - "proj4": "^2.9.2", + "p-queue": "^8.0.1", + "proj4": "^2.10.0", "prop-types": "^15.8.1", "qs": "^6.11.2", "react": "^18.0.0", @@ -188,21 +188,21 @@ "react-device-detect": "^2.2.3", "react-dom": "^18.0.0", "react-draggable": "^4.4.6", - "react-image-crop": "^11.0.1", + "react-image-crop": "^11.0.4", "react-infinite-scroller": "^1.2.6", - "react-joyride": "^2.7.1", + "react-joyride": "^2.7.2", "react-mobile-datepicker": "^4.0.2", "react-redux": "^8.1.3", "react-resizable": "^3.0.5", "react-swipe-to-delete-component": "1.0.5", "react-visibility-sensor": "^5.1.1", "reactstrap": "^9.2.1", - "recharts": "^2.10.3", + "recharts": "^2.10.4", "redux": "^4.2.1", "redux-location-state": "^2.8.2", "redux-logger": "^3.0.6", "redux-thunk": "^2.4.2", - "regenerator-runtime": "^0.14.0", + "regenerator-runtime": "^0.14.1", "reselect": "^4.1.8", "rgbcolor": "^1.0.1", "simplebar": "^6.2.5", @@ -211,7 +211,7 @@ "supercluster": "^8.0.1", "tough-cookie": "^4.1.3", "upng-js": "^2.1.0", - "url-template": "^3.1.0", + "url-template": "^3.1.1", "what-input": "^5.2.12" }, "overrides": { diff --git a/web/images/layers/previews/geographic/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.jpg b/web/images/layers/previews/geographic/LPRM_AMSRE_Surface_Soil_Moisture_C_Band_Day_Daily.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70b698545ae6699c4ac40193b3b104d15ddc278f GIT binary patch literal 41250 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 Sc0_J4#P~-)gh)U_q~`$u=s(Lu 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 literal 0 HcmV?d00001 diff --git a/web/images/layers/previews/geographic/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.jpg b/web/images/layers/previews/geographic/LPRM_TMI_Surface_Soil_Moisture_X_Band_Day_Daily.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3883578b4636a9a99717f448dc195048258aad76 GIT binary patch literal 24328 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 diff --git a/web/js/components/feature-alert/granuleAlertModal.js b/web/js/components/feature-alert/granuleAlertModal.js new file mode 100644 index 0000000000..3a74519d77 --- /dev/null +++ b/web/js/components/feature-alert/granuleAlertModal.js @@ -0,0 +1,26 @@ +import React from 'react'; +import { Container, Row, Col } from 'reactstrap'; + +function GranuleAlertModalBody() { + return ( + + + +

+ Why can't I see the imagery for this layer? +

+ +
+ + + +

+ Certain imagery visualization layers have narrower and smaller footprints so there isn't imagery to view at every location across the globe. Some imagery layers also have lower temporal revisit periods meaning there won't be daily imagery for a specific location on earth. Click on “View Options” in the layer list to access a date picker to locate imagery for your desired location. +

+ +
+
+ ); +} + +export default GranuleAlertModalBody; diff --git a/web/js/components/feature-alert/zoomAlertModal.js b/web/js/components/feature-alert/zoomAlertModal.js new file mode 100644 index 0000000000..744d17aff1 --- /dev/null +++ b/web/js/components/feature-alert/zoomAlertModal.js @@ -0,0 +1,26 @@ +import React from 'react'; +import { Container, Row, Col } from 'reactstrap'; + +function ZoomAlertModalBody() { + return ( + + + +

+ Why can't I see the imagery at this zoom level? +

+ +
+ + + +

+ Imagery for certain layers is dynamically generated and only available when zoomed in. Please zoom in to view this product. +

+ +
+
+ ); +} + +export default ZoomAlertModalBody; diff --git a/web/js/components/layer/settings/imagery-search.js b/web/js/components/layer/settings/imagery-search.js new file mode 100644 index 0000000000..0de3c41b6e --- /dev/null +++ b/web/js/components/layer/settings/imagery-search.js @@ -0,0 +1,151 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { useSelector, useDispatch } from 'react-redux'; +import { + Spinner, +} from 'reactstrap'; +import { selectDate as selectDateAction } from '../../../modules/date/actions'; + +const dateOptions = { + year: 'numeric', + month: 'long', + day: 'numeric', +}; +const parseGranuleTimestamp = (granule) => new Date(granule.time_start); +const maxExtent = [-180, -90, 180, 90]; + +export default function ImagerySearch({ layer }) { + const listRef = useRef(null); + const startRef = useRef(null); + const endRef = useRef(null); + const dispatch = useDispatch(); + const selectDate = (date) => { dispatch(selectDateAction(date)); }; + const date = useSelector((state) => state.date); + const compare = useSelector((state) => state.compare); + const map = useSelector((state) => state.map); + const [granulesStartStatus, setGranulesStartStatus] = useState(undefined); + const [granulesEndStatus, setGranulesEndStatus] = useState(undefined); + const [olderGranuleDates, setOlderGranuleDates] = useState([]); + const [newerGranuleDates, setNewerGranuleDates] = useState([]); + const [page, setPage] = useState(1); + + let selectedDate = date.selected; + + if (compare.active && !compare.isCompareA) { + selectedDate = date.selectedB; + } + + const conceptID = layer?.conceptIds?.[0]?.value || layer?.collectionConceptID; + + const getOlderGranules = async (layer, refDate = selectedDate, pageNum = 1) => { + // clamp extent to maximum extent allowed by the CMR api + const extent = map.extent.map((coord, i) => { + const condition = i <= 1 ? coord > maxExtent[i] : coord < maxExtent[i]; + if (condition) { + return coord; + } + return maxExtent[i]; + }); + try { + const olderResponse = await fetch(`https://cmr.earthdata.nasa.gov/search/granules.json?collection_concept_id=${conceptID}&bounding_box=${extent.join(',')}&temporal=,${refDate.toISOString()}&sort_key=-start_date&pageSize=25&page_num=${pageNum}`); + const olderGranules = await olderResponse.json(); + const olderDates = olderGranules.feed.entry.map(parseGranuleTimestamp); + + return olderDates; + } catch (e) { + return []; + } + }; + + const getNewerGranules = async (layer, refDate = selectedDate, pageNum = 1) => { + // clamp extent to maximum extent allowed by the CMR api + const extent = map.extent.map((coord, i) => { + const condition = i <= 1 ? coord > maxExtent[i] : coord < maxExtent[i]; + if (condition) { + return coord; + } + return maxExtent[i]; + }); + try { + const newerResponse = await fetch(`https://cmr.earthdata.nasa.gov/search/granules.json?collection_concept_id=${conceptID}&bounding_box=${extent.join(',')}&temporal=${refDate.toISOString()},&sort_key=start_date&pageSize=25&page_num=${pageNum}`); + const newerGranules = await newerResponse.json(); + const newerDates = newerGranules.feed.entry.map(parseGranuleTimestamp); + + return newerDates; + } catch (e) { + return []; + } + }; + + const loadNewerDates = async (layer, pageNum = 1) => { + setGranulesStartStatus('loading'); + const newerDates = await getNewerGranules(layer, newerGranuleDates[0], pageNum); + const dates = [...newerGranuleDates, ...newerDates].sort((a, b) => Date.parse(b) - Date.parse(a)); + setNewerGranuleDates(dates); + setGranulesStartStatus('loaded'); + }; + + const loadOlderDates = async (layer, pageNum = 1) => { + setGranulesEndStatus('loading'); + const olderDates = await getOlderGranules(layer, olderGranuleDates.at(-1), pageNum); + const dates = [...olderGranuleDates, ...olderDates].sort((a, b) => Date.parse(b) - Date.parse(a)); + setOlderGranuleDates(dates); + setGranulesEndStatus('loaded'); + }; + + const handleSelection = (date) => { + selectDate(new Date(date)); + }; + + useEffect(() => { + const asyncFunc = async () => { + if (listRef.current.scrollHeight <= listRef.current.clientHeight) { + await loadOlderDates(layer, page); + await loadNewerDates(layer, page); + setPage(page + 1); + } else { + listRef.current.scrollTop = listRef.current.scrollHeight / 2; + } + }; + asyncFunc(); + }, [page]); + + const renderDates = () => { + const granuleDates = [...olderGranuleDates, ...newerGranuleDates].sort((a, b) => Date.parse(b) - Date.parse(a)); + const renderedDates = [...new Set(granuleDates.map((date) => date.toLocaleDateString('en-US', dateOptions)))].map((date, i) => ( +
  • handleSelection(date)}> + {date} +
  • + )); + return renderedDates; + }; + + const handleScroll = (e) => { + const { scrollTop } = e.target; + const position = e.target.scrollHeight - e.target.clientHeight; + const scrollPercentage = scrollTop / position; + + if (scrollPercentage <= 0.1) { + loadNewerDates(layer); + } + + if (scrollPercentage >= 0.9) { + loadOlderDates(layer); + } + }; + + return ( +
    +

    Available Imagery Dates

    +
      +
    • + {granulesStartStatus === 'loading' && Loading...} +
    • + {renderDates()} +
    • + {granulesEndStatus === 'loading' && Loading...} +
    • +
    +
    +
    + ); +} diff --git a/web/js/components/layer/settings/layer-settings.js b/web/js/components/layer/settings/layer-settings.js index 53be5256b1..019a29e232 100644 --- a/web/js/components/layer/settings/layer-settings.js +++ b/web/js/components/layer/settings/layer-settings.js @@ -15,6 +15,8 @@ import PaletteThreshold from './palette-threshold'; import GranuleLayerDateList from './granule-date-list'; import GranuleCountSlider from './granule-count-slider'; import safeLocalStorage from '../../../util/local-storage'; +import ImagerySearch from './imagery-search'; + import { palettesTranslate, @@ -338,10 +340,12 @@ class LayerSettings extends React.Component { customPalettesIsActive, layer, palettedAllowed, + zot, } = this.props; const hasAssociatedLayers = layer.associatedLayers && layer.associatedLayers.length; const hasTracks = layer.orbitTracks && layer.orbitTracks.length; const ttilerLayer = layer.id === 'HLS_Customizable_Sentinel' || layer.id === 'HLS_Customizable_Landsat'; + const granuleMetadata = layer?.enableCMRDataFinder && !(zot?.underZoomValue > 0); const layerGroup = layer.layergroup; if (layer.type !== 'vector') { @@ -365,6 +369,7 @@ class LayerSettings extends React.Component { {this.renderGranuleSettings()} {renderCustomizations} {ttilerLayer && } + {granuleMetadata && } {(hasAssociatedLayers || hasTracks) && } ); @@ -486,4 +491,5 @@ LayerSettings.propTypes = { updateGranuleLayerOptions: PropTypes.func, toggleAllClassifications: PropTypes.func, vectorStyles: PropTypes.object, + zot: PropTypes.object, }; diff --git a/web/js/components/tour/tour-box.js b/web/js/components/tour/tour-box.js index d71662fa95..c09f6b0404 100644 --- a/web/js/components/tour/tour-box.js +++ b/web/js/components/tour/tour-box.js @@ -53,8 +53,8 @@ class TourBox extends React.Component { } = this.props; const { styles } = this.state; let floatBox = ''; - if (storyOrder.length - (index + 1) === 0 - || storyOrder.length - (index + 2) === 0) { + if (storyOrder.length - (index + 2) === 0 + || storyOrder.length - (index + 3) === 0) { floatBox = ' tour-box-float'; } return ( diff --git a/web/js/components/tour/tour-boxes.js b/web/js/components/tour/tour-boxes.js index dcb69aee92..31055aeab2 100644 --- a/web/js/components/tour/tour-boxes.js +++ b/web/js/components/tour/tour-boxes.js @@ -5,10 +5,12 @@ import TourBox from './tour-box'; function TourBoxes(props) { const { stories, storyOrder, selectTour } = props; + // when we remove this we need to update tour-box.js render function to index+1 && index+2 + const activeStoryOrder = storyOrder.filter((storyId) => storyId !== 'surface_water_extent'); return (
    - {storyOrder.map((storyId, i) => { + {activeStoryOrder.map((storyId, i) => { const story = stories[storyId]; return ( ({ // some basic styles to make the items look a bit nicer ...draggableStyle, @@ -74,6 +75,8 @@ function LayerRow (props) { onOptionsClick, hasClickableFeature, openVectorAlertModal, + openGranuleAlertModal, + openZoomAlertModal, toggleVisibility, isDisabled, isVisible, @@ -105,6 +108,61 @@ function LayerRow (props) { const [showDropdownBtn, setDropdownBtnVisible] = useState(false); const [showDropdownMenu, setDropdownMenuVisible] = useState(false); const [runningDataObj, setRunningDataObj] = useState({}); + const [disabled, setDisabled] = useState(isDisabled); + const [activeZot, setActiveZot] = useState(zot); + const [showZoomAlert, setShowZoomAlert] = useState(false); + const [showGranuleAlert, setShowGranuleAlert] = useState(false); + const [hideZoomAlert, setHideZoomAlert] = useState(false); + const [hideGranuleAlert, setHideGranuleAlert] = useState(false); + const map = useSelector((state) => state.map); + const selectedDate = useSelector((state) => state.date.selected); + + useEffect(() => { + const asyncFunc = async () => { + if (layer.enableCMRDataFinder && isVisible) { + const conceptID = layer?.conceptIds?.[0]?.value || layer?.collectionConceptID; + const dateTime = selectedDate?.toISOString().split('T'); + dateTime.pop(); + dateTime.push('00:00:00.000Z'); + const zeroedDate = dateTime.join('T'); + const maxExtent = [-180, -90, 180, 90]; + // clamp extent to maximum extent allowed by the CMR api + const extent = map.extent.map((coord, i) => { + const condition = i <= 1 ? coord > maxExtent[i] : coord < maxExtent[i]; + if (condition) { + return coord; + } + return maxExtent[i]; + }); + const olderRes = await fetch(`https://cmr.earthdata.nasa.gov/search/granules.json?collection_concept_id=${conceptID}&bounding_box=${extent.join(',')}&temporal=P0Y0M0DT0H0M/${zeroedDate}&sort_key=-start_date&pageSize=1`); + const newerRes = await fetch(`https://cmr.earthdata.nasa.gov/search/granules.json?collection_concept_id=${conceptID}&bounding_box=${extent.join(',')}&temporal=${zeroedDate}/P0Y0M1DT0H0M&sort_key=-start_date&pageSize=1`); + if (!olderRes.ok || !newerRes.ok) return; + const olderGranules = await olderRes.json(); + const newerGranules = await newerRes.json(); + const olderEntries = olderGranules?.feed?.entry || []; + const newerEntries = newerGranules?.feed?.entry || []; + const granules = [...olderEntries, ...newerEntries]; + if (zot?.underZoomValue > 0) { + setShowZoomAlert(true); + } else { + setShowZoomAlert(false); + } + if (!granules.length && !(zot?.underZoomValue > 0)) { + setActiveZot({ hasGranules: false }); + setShowGranuleAlert(true); + } else { + setActiveZot(zot); + setShowGranuleAlert(false); + } + if (!granules.length || zot?.underZoomValue > 0) { + setDisabled(true); + } else { + setDisabled(isDisabled); + } + } + }; + asyncFunc(); + }, [map.extent, zot, selectedDate, isVisible]); useEffect(() => { events.on(MAP_RUNNING_DATA, setRunningDataObj); @@ -113,6 +171,10 @@ function LayerRow (props) { }; }, []); + useEffect(() => { + setDisabled(isDisabled); + }, [isDisabled]); + const toggleDropdownMenuVisible = () => { if (showDropdownMenu) { setDropdownBtnVisible(false); @@ -127,7 +189,7 @@ function LayerRow (props) { ? compare.activeString === compareState && !!runningDataForLayer : !!runningDataForLayer; const colorHex = isRunningData ? runningDataForLayer.paletteHex : null; - let width = zot ? 220 : 231; + let width = activeZot || zot ? 220 : 231; if (isEmbedModeActive) { width = 201; } @@ -212,7 +274,7 @@ function LayerRow (props) { id={layerOptionsBtnId} aria-label={layerOptionsBtnTitle} className="button wv-layers-options layer-options-dropdown-item" - onClick={() => onOptionsClick(layer, title)} + onClick={() => onOptionsClick(layer, title, zot)} > {layerOptionsBtnTitle} @@ -248,7 +310,7 @@ function LayerRow (props) { aria-label={layerOptionsBtnTitle} className={isMobile ? 'hidden wv-layers-options' : 'button wv-layers-options'} onMouseDown={stopPropagation} - onClick={() => onOptionsClick(layer, title)} + onClick={() => onOptionsClick(layer, title, zot)} > {layerOptionsBtnTitle} @@ -309,23 +371,23 @@ function LayerRow (props) { const getLayerItemClasses = () => { let baseClasses = 'item productsitem layer-enabled'; if (isAnimating) baseClasses += ' disabled'; - if (!isVisible || isDisabled) { + if (!isVisible || disabled) { baseClasses += ' layer-hidden'; } else { baseClasses += ' layer-visible'; } - if (zot) baseClasses += ' zotted'; + if (activeZot || zot) baseClasses += ' zotted'; return baseClasses; }; const getVisibilityToggleClass = () => { let baseClasses = 'visibility'; - if (isDisabled || isAnimating) { + if (disabled || isAnimating) { baseClasses += ' disabled'; } else { baseClasses += ' layer-enabled'; } - if (isVisible && !isDisabled) { + if (isVisible && !disabled) { baseClasses += ' layer-visible'; } else { baseClasses += ' layer-hidden'; @@ -333,13 +395,13 @@ function LayerRow (props) { return baseClasses; }; - const visibilityTitle = !isVisible && !isDisabled + const visibilityTitle = !isVisible && !disabled ? 'Show layer' - : isDisabled + : disabled ? getDisabledTitle(layer) : 'Hide layer'; - const visibilityIconClass = isDisabled + const visibilityIconClass = disabled ? 'ban' : !isVisible ? ['fas', 'eye-slash'] @@ -360,7 +422,7 @@ function LayerRow (props) { id={`hide${encodedLayerId}`} className={getVisibilityToggleClass()} aria-label={visibilityTitle} - onClick={() => !isAnimating && !isDisabled && toggleVisibility(layer.id, !isVisible)} + onClick={() => !isAnimating && !disabled && toggleVisibility(layer.id, !isVisible)} > {!isAnimating && ( )} - +
    @@ -441,6 +503,26 @@ function LayerRow (props) { ))}
    )} + {showZoomAlert && !hideZoomAlert && ( + setHideZoomAlert(true)} + onClick={openZoomAlertModal} + /> + )} + {showGranuleAlert && !hideGranuleAlert && ( + setHideGranuleAlert(true)} + onClick={openGranuleAlertModal} + /> + )}
    ); @@ -543,10 +625,18 @@ const mapDispatchToProps = (dispatch) => ({ const { id, props } = vectorModalProps; dispatch(openCustomContent(id, props)); }, + openGranuleAlertModal: () => { + const { id, props } = granuleModalProps; + dispatch(openCustomContent(id, props)); + }, + openZoomAlertModal: () => { + const { id, props } = zoomModalProps; + dispatch(openCustomContent(id, props)); + }, onRemoveClick: (id) => { dispatch(removeLayer(id)); }, - onOptionsClick: (layer, title) => { + onOptionsClick: (layer, title, zot) => { const key = `LAYER_OPTIONS_MODAL-${layer.id}`; googleTagManager.pushEvent({ event: 'sidebar_layer_options', @@ -563,6 +653,7 @@ const mapDispatchToProps = (dispatch) => ({ timeout: 150, bodyComponentProps: { layer, + zot, }, }), ); @@ -640,6 +731,7 @@ LayerRow.propTypes = { hasClickableFeature: PropTypes.bool, tracksForLayer: PropTypes.array, openVectorAlertModal: PropTypes.func, + openGranuleAlertModal: PropTypes.func, zot: PropTypes.object, isVectorLayer: PropTypes.bool, isAnimating: PropTypes.bool, diff --git a/web/js/containers/sidebar/zot.js b/web/js/containers/sidebar/zot.js index 0e19048153..cad4c28966 100644 --- a/web/js/containers/sidebar/zot.js +++ b/web/js/containers/sidebar/zot.js @@ -9,10 +9,21 @@ export default function Zot (props) { let tooltipString = ''; const delay = isMobile ? { show: 300, hide: 300 } : { show: 50, hide: 500 }; if (zot) { - const { overZoomValue, layerNotices } = zot; + const { + overZoomValue, + layerNotices, + underZoomValue, + hasGranules, + } = zot; if (overZoomValue) { className = 'zot overzoom'; tooltipString += `Layer is overzoomed by ${zot.overZoomValue.toString()}x its maximum zoom level.
    `; + } else if (underZoomValue > 0) { + className = 'zot underzoom'; + tooltipString += `Layer is underzoomed by ${zot.underZoomValue.toString()}x its minimum zoom level; zoom in to see imagery
    `; + } else if (Object.hasOwn(zot, 'hasGranules') && !hasGranules) { + className = 'zot no-granules'; + tooltipString += 'No visible imagery on this date and/or location.
    Try moving the map or select a different date in the layer\'s settings.
    '; } if (layerNotices) { tooltipString += zot.layerNotices; diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index c014004fb7..5068778d40 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -1137,6 +1137,7 @@ class Timeline extends React.Component { breakpoints, dateA, dateB, + displayStaticMap, draggerSelected, hasFutureLayers, hasSubdailyLayers, @@ -1453,7 +1454,10 @@ class Timeline extends React.Component { id="distraction-free-timeline-header" className={`distraction-free-timeline-header ${hasSubdailyLayers ? 'subdaily' : ''} ${isMobile ? 'mobile' : ''}`} style={ - { marginRight: isTimelineHidden ? '20px' : '0' } + { + marginRight: isTimelineHidden ? '20px' : '0', + display: displayStaticMap ? 'none' : 'flex', + } } > @@ -1496,7 +1500,7 @@ function mapStateToProps(state) { } = date; const { isCompareA } = compare; const isCompareModeActive = compare.active; - const { isDistractionFreeModeActive, isKioskModeActive } = ui; + const { isDistractionFreeModeActive, isKioskModeActive, displayStaticMap } = ui; const { isEmbedModeActive } = embed; const isMobile = screenSize.isMobileDevice; const { @@ -1621,6 +1625,7 @@ function mapStateToProps(state) { isDistractionFreeModeActive, isEmbedModeActive, isKioskModeActive, + displayStaticMap, }; } diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 48ce4836b2..d4bd1b4ae7 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -720,7 +720,7 @@ export default function mapLayerBuilder(config, cache, store) { const layer = new OlLayerTile({ source: xyzSource, className, - minZoom: 7, + minZoom: def.minZoom, extent: maxExtent, }); diff --git a/web/js/mapUI/components/dev-test-mode/dev-console-test.js b/web/js/mapUI/components/dev-test-mode/dev-console-test.js index 9b0fdcc28f..1d61179c20 100644 --- a/web/js/mapUI/components/dev-test-mode/dev-console-test.js +++ b/web/js/mapUI/components/dev-test-mode/dev-console-test.js @@ -6,11 +6,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; function ConsoleTest () { // eslint-disable-next-line no-unused-vars const dispatch = useDispatch(); - const { - map, - } = useSelector((state) => ({ - map: state.map.ui.selected, - })); + const map = useSelector((state) => state.map.ui.selected); const consoleResponse = () => { console.log(map); diff --git a/web/js/mapUI/components/kiosk/tile-measurement/tile-measurement.js b/web/js/mapUI/components/kiosk/tile-measurement/tile-measurement.js index d7d05cb35e..7e5cba4a2b 100644 --- a/web/js/mapUI/components/kiosk/tile-measurement/tile-measurement.js +++ b/web/js/mapUI/components/kiosk/tile-measurement/tile-measurement.js @@ -130,7 +130,7 @@ function TileMeasurement({ ui }) { const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - const verifyTilesAndHandleErrors = async (abortProceedure) => { + const verifyTilesAndHandleErrors = async () => { console.log('Verifying tiles on map...'); // most of these variables are purely for debugging purposes @@ -140,6 +140,7 @@ function TileMeasurement({ ui }) { let emptyTilesCount = 0; let totalTilesLoadedWithBadImageCount = 0; let otherTileStates = []; + let abort = false; // In rare cases the TileLayer may not have finished loading tiles at the time of measurement // We can verify this by checking the otherTileStates array for values of 1 that indicate that tiles were still loading @@ -168,21 +169,23 @@ function TileMeasurement({ ui }) { } } + if (retries >= 9) abort = true; + const loadedTiles = loadedTilesCount > 0; const tileStatus = `Out of an expected ${tileCount} tiles, ${loadedTilesCount} were loaded. There were ${totalTilesLoadedWithBadImageCount} tiles loaded with bad images, ${errorTilesCount} error tiles, and ${emptyTilesCount} empty tiles. There were ${otherTileStates.length} other tile states: ${otherTileStates.join(', ')}`; console.log(tileStatus); console.log('LoadedTiles === ', loadedTiles); - if ((eic === 'da' || eic === 'sa') && !abortProceedure) { + if ((eic === 'da' || eic === 'sa') && !abort) { setEICMeasurementComplete(); } - if (loadedTiles && !abortProceedure) { + if (loadedTiles && !abort) { setEICMeasurementComplete(); console.log('Tile verified... EIC measure process complete...'); - } else if (loadedTiles && abortProceedure) { + } else if (loadedTiles && abort) { console.log('EIC measure process aborted... Loaded map tiles found... Leaving map as is...'); setEICMeasurementAborted(); - } else if (!loadedTiles && abortProceedure) { + } else if (!loadedTiles && abort) { console.log('EIC measure process aborted... No tiles found on map... Displaying static map...'); toggleStaticMap(true); const activeLayerIds = activeLayers.map((layer) => layer.id); @@ -198,7 +201,7 @@ function TileMeasurement({ ui }) { const measurementLayers = findLayersToMeasure(); if (!measurementLayers.length) { console.error('No layers found to be measured... Aborting...'); - return verifyTilesAndHandleErrors(true); + return verifyTilesAndHandleErrors(); } const layersIncludeSubdaily = measurementLayers.some((layer) => layer.period === 'subdaily'); @@ -207,7 +210,7 @@ function TileMeasurement({ ui }) { const dateRange = findDateRange(layerPeriod); if (!dateRange) { console.error('No date range found... Aborting..'); - return verifyTilesAndHandleErrors(true); + return verifyTilesAndHandleErrors(); } const fullImageryDate = await findFullImageryDate(measurementLayers, dateRange); @@ -215,12 +218,12 @@ function TileMeasurement({ ui }) { // If we are using the best date, we need to make sure there are tiles on the map so we include the abort prodcedure parameter // This allows us to fall back to the static map if the best date fails as a last resort const bestDate = findBestDate(measurementLayers, bestDates); - if (!fullImageryDate || bestDate === fullImageryDate) return verifyTilesAndHandleErrors(true); + if (!fullImageryDate || bestDate === fullImageryDate) return verifyTilesAndHandleErrors(); // Format date based on period and dispatch redux action updateDate(fullImageryDate, layerPeriod); - verifyTilesAndHandleErrors(false); + verifyTilesAndHandleErrors(); } catch (error) { console.error('Error calculating measurements:', error); } diff --git a/web/js/mapUI/components/kiosk/tile-measurement/utils/layer-data-eic.js b/web/js/mapUI/components/kiosk/tile-measurement/utils/layer-data-eic.js index e7c82f3167..d854d3ae6a 100644 --- a/web/js/mapUI/components/kiosk/tile-measurement/utils/layer-data-eic.js +++ b/web/js/mapUI/components/kiosk/tile-measurement/utils/layer-data-eic.js @@ -67,7 +67,7 @@ export const bestDates = { export const travelModeData = { 1: { - title: 'True Color Imagery from Terra Satellite', + title: 'True Color Imagery from Terra satellite', }, 2: { title: 'Geostationary imagery from NOAA and JAXA satellites', @@ -76,7 +76,7 @@ export const travelModeData = { title: 'Active fires detected by Suomi NPP satellite', }, 4: { - title: 'Black Marble Night Time Imaging from Suomi NPP Satellite', + title: 'Black Marble Night Time Imaging from Suomi NPP satellite', }, 5: { title: 'Rain and Snow', @@ -94,7 +94,7 @@ export const travelModeData = { title: 'Antarctic Sea Ice', }, 10: { - title: 'Active fires detected by Suomi NPP satellite', + title: 'Active fires detected by NOAA-20 satellite', }, 11: { title: 'Nitrogen Dioxide (NO2) by Aura satellite', diff --git a/web/js/mapUI/components/update-collections/updateCollections.js b/web/js/mapUI/components/update-collections/updateCollections.js index a6d0788f86..8966ac2687 100644 --- a/web/js/mapUI/components/update-collections/updateCollections.js +++ b/web/js/mapUI/components/update-collections/updateCollections.js @@ -12,50 +12,49 @@ function UpdateCollections () { const layers = useSelector((state) => state.layers.active.layers); const selectedDate = useSelector((state) => getSelectedDate(state)); const proj = useSelector((state) => state.proj); + const sources = useSelector((state) => state.config.sources); + const layerConfig = useSelector((state) => state.layers.layerConfig); + + // Finds the correct subdomain to query headers from based on the layer source and GIBS/GITC env + const lookupLayerSource = (layerId) => { + const { source } = layerConfig[layerId].projections[proj.id]; + const subRegex = /-{[a-z]{1}-[a-z]{1}}/i; + const sourceDomain = sources[source].url.replace(subRegex, '-a'); + + return sourceDomain; + }; const getHeaders = async (def, date) => { const { id, period } = def; const { matrixSet } = def.projections[proj.id]; - const crs = `epsg${proj.selected.epsg}`; const isoStringDate = util.toISOStringSeconds(util.roundTimeOneMinute(selectedDate)); const imageType = def.format === 'image/png' ? 'png' : 'jpeg'; - const srcs = [ - `https://gibs-a.earthdata.nasa.gov/wmts/${crs}/best/wmts.cgi?TIME=${isoStringDate}&layer=${id}&style=default&tilematrixset=${matrixSet}&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2F${imageType}&TileMatrix=0&TileCol=0&TileRow=0`, - `https://gibs-b.earthdata.nasa.gov/wmts/${crs}/best/wmts.cgi?TIME=${isoStringDate}&layer=${id}&style=default&tilematrixset=${matrixSet}&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2F${imageType}&TileMatrix=0&TileCol=0&TileRow=0`, - `https://gibs-c.earthdata.nasa.gov/wmts/${crs}/best/wmts.cgi?TIME=${isoStringDate}&layer=${id}&style=default&tilematrixset=${matrixSet}&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2F${imageType}&TileMatrix=0&TileCol=0&TileRow=0`, - ]; - - // eslint-disable-next-line no-restricted-syntax - for (const src of srcs) { - try { - // eslint-disable-next-line no-await-in-loop - const response = await fetch(src); - if (!response.ok) { - // If the response is not OK (e.g., 400 error), continue to the next URL - // eslint-disable-next-line no-continue - continue; - } - - const { headers } = response; - const actualId = headers.get('layer-identifier-actual'); - if (!actualId) return undefined; - - const parts = actualId.split('_'); - const type = parts[parts.length - 1]; - const version = parts[parts.length - 2]; - const formattedDate = period === 'daily' ? formatDailyDate(date) : formatSubdailyDate(date); - - if (type !== 'NRT' && type !== 'STD') return undefined; - - return { - id, date: formattedDate, type, version, - }; - } catch (error) { - console.error(error); - } + const sourceDomain = lookupLayerSource(id); + + const sourceUrl = `${sourceDomain}?TIME=${isoStringDate}&layer=${id}&style=default&tilematrixset=${matrixSet}&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2F${imageType}&TileMatrix=0&TileCol=0&TileRow=0`; + try { + const response = await fetch(sourceUrl); + + const { headers } = response; + const actualId = headers.get('layer-identifier-actual'); + if (!actualId) return undefined; + + const parts = actualId.split('_'); + const type = parts[parts.length - 1]; + const version = parts[parts.length - 2]; + const formattedDate = period === 'daily' ? formatDailyDate(date) : formatSubdailyDate(date); + + if (type !== 'NRT' && type !== 'STD') return undefined; + + return { + id, date: formattedDate, type, version, + }; + } catch (error) { + // errors will clutter console, turn this on for debugging + // console.error(error); } - // Return undefined if all srcs fail + // Return undefined if query fails return undefined; }; @@ -86,7 +85,8 @@ function UpdateCollections () { const validCollections = results.filter((result) => result !== undefined); updateCollection(validCollections); } catch (error) { - console.error('error', error); + // errors will clutter console, turn this on for debugging + // console.error(error); } }; diff --git a/web/js/mapUI/mapUI.js b/web/js/mapUI/mapUI.js index fd4961dbe8..257fdaf09c 100644 --- a/web/js/mapUI/mapUI.js +++ b/web/js/mapUI/mapUI.js @@ -101,7 +101,7 @@ function MapUI(props) { const [preloadAction, setPreloadAction] = useState({}); // eslint-disable-next-line no-unused-vars - const [tileImageTestMode, setTileImageTestMode] = useState(false); + const [devTestMode, setDevTestMode] = useState(false); const subscribeToStore = function(action) { switch (action.type) { @@ -416,7 +416,7 @@ function MapUI(props) { { (isTravelModeActive && !isStaticMapActive) && } )} - {tileImageTestMode && } + {devTestMode && } ); diff --git a/web/js/modules/alerts/constants.js b/web/js/modules/alerts/constants.js index 25a66b2d88..97f053e761 100644 --- a/web/js/modules/alerts/constants.js +++ b/web/js/modules/alerts/constants.js @@ -1,6 +1,8 @@ import EventsAlertModalBody from '../../components/events/alert-body'; import CompareAlertModalBody from '../../components/compare/alert'; import VectorZoomAlertModalBody from '../../components/feature-alert/vector-alert-modal'; +import GranuleAlertModalBody from '../../components/feature-alert/granuleAlertModal'; +import ZoomAlertModalBody from '../../components/feature-alert/zoomAlertModal'; export const DISABLE_VECTOR_ZOOM_ALERT = 'ALERTS/DISABLE_VECTOR_ZOOM_ALERT'; export const ACTIVATE_VECTOR_ZOOM_ALERT = 'ALERTS/ACTIVATE_VECTOR_ZOOM_ALERT'; @@ -41,4 +43,26 @@ export const MODAL_PROPERTIES = { desktopOnly: true, }, }, + granuleModalProps: { + id: 'granule_layer_info', + props: { + headerText: 'Layer imagery is not visible at this location or date.', + backdrop: false, + size: 'lg', + clickableBehindModal: true, + bodyComponent: GranuleAlertModalBody, + desktopOnly: true, + }, + }, + zoomModalProps: { + id: 'zoom_layer_info', + props: { + headerText: 'Layer imagery is not visible at this zoom level.', + backdrop: false, + size: 'lg', + clickableBehindModal: true, + bodyComponent: ZoomAlertModalBody, + desktopOnly: true, + }, + }, }; diff --git a/web/js/modules/layers/selectors.js b/web/js/modules/layers/selectors.js index 428d2c59fe..51fce8f142 100644 --- a/web/js/modules/layers/selectors.js +++ b/web/js/modules/layers/selectors.js @@ -779,11 +779,13 @@ export function getZotsForActiveLayers(state) { lodashEach(getActiveLayersMap(state), (layer) => { if (layer.projections[projection]) { const overZoomValue = getZoomLevel(layer, zoom, projection, sources); + const underZoomValue = Math.round((layer.minZoom - zoom) * 100) / 100; const layerNotices = getLayerNoticesForLayer(layer.id, notifications); - if (overZoomValue || layerNotices.length) { + if (overZoomValue || layerNotices.length || underZoomValue > 0) { zotObj[layer.id] = { overZoomValue, layerNotices, + underZoomValue, }; } } diff --git a/web/js/modules/layers/util.js b/web/js/modules/layers/util.js index 22895a5f4a..9fb1ff4358 100644 --- a/web/js/modules/layers/util.js +++ b/web/js/modules/layers/util.js @@ -1412,7 +1412,7 @@ export function adjustStartDates(layers) { .format('YYYY-MM-DDThh:mm:ss')}Z`; const applyDateAdjustment = (layer) => { - const { availability, dateRanges } = layer; + const { availability, dateRanges, endDate } = layer; if (!availability) { return; } @@ -1420,8 +1420,15 @@ export function adjustStartDates(layers) { if (Array.isArray(dateRanges) && dateRanges.length) { const [firstDateRange] = dateRanges; - firstDateRange.startDate = adjustDate(rollingWindow); - layer.startDate = adjustDate(rollingWindow); + const adjustedDate = adjustDate(rollingWindow); + + // To prevent a startDate greater than endDate for layers with a rollingWindow and specific start and end dates + if (endDate && new Date(adjustedDate) > new Date(endDate)) { + return; + } + + firstDateRange.startDate = adjustedDate; + layer.startDate = adjustedDate; } else { console.warn(`GetCapabilities is missing the time value for ${layer.id}`); } diff --git a/web/js/modules/product-picker/selectors.js b/web/js/modules/product-picker/selectors.js index 507ece0c8e..feca2368b4 100644 --- a/web/js/modules/product-picker/selectors.js +++ b/web/js/modules/product-picker/selectors.js @@ -43,7 +43,7 @@ export const getSourcesForProjection = createSelector( const trackGroup = currentMeasurement && currentMeasurement.id === 'orbital-track'; const sourcesForProj = sources && sources.filter( (source) => source.settings.some((layerId) => { - if (!config.layers[layerId].projections) return; + if (!config.layers[layerId] || !config.layers[layerId].projections) return; const { projections, layergroup } = config.layers[layerId]; const isOrbitTrack = layergroup === 'Orbital Track'; const inProj = !!projections[projection]; diff --git a/web/scss/components/alert.scss b/web/scss/components/alert.scss index 52eb6562e9..22fa9db591 100644 --- a/web/scss/components/alert.scss +++ b/web/scss/components/alert.scss @@ -13,7 +13,7 @@ border-radius: 0; display: flex; align-items: center; - justify-content: center; + justify-content: space-between; min-height: 40px; cursor: pointer; padding: 0; diff --git a/web/scss/features/customize-bands.scss b/web/scss/features/customize-bands.scss index 24c78069fe..fd0713dac5 100644 --- a/web/scss/features/customize-bands.scss +++ b/web/scss/features/customize-bands.scss @@ -26,6 +26,14 @@ } } +.imagery-search-container { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-bottom: 1.5rem; + padding-top: 3px; +} + .customize-bands-container { display: flex; justify-content: center; diff --git a/web/scss/features/layers.scss b/web/scss/features/layers.scss index 3db40afd8d..66f679d486 100644 --- a/web/scss/features/layers.scss +++ b/web/scss/features/layers.scss @@ -22,6 +22,38 @@ line-height: 0; } +.lazyload-list { + list-style-type: none; + height: 100px; + width: 100%; + display: flex; + flex-direction: column; + overflow: scroll; + background-color: #383838; + + li { + user-select: none; + } + + li:hover { + background-color: black; + } +} + +.imagery-search-spinner { + height: 13px; + width: 100%; +} + +.lazyload-title { + margin-bottom: 8px; +} + +.imagery-search-container hr { + margin-top: 20px; + width: 100%; +} + .layer-list-container .layers-all-layer { transition: background-color 200ms ease-out; left: 0; diff --git a/web/scss/features/sidebar-panel.scss b/web/scss/features/sidebar-panel.scss index c782916c5f..49e2af1768 100644 --- a/web/scss/features/sidebar-panel.scss +++ b/web/scss/features/sidebar-panel.scss @@ -449,6 +449,22 @@ li.item.productsitem.inmotion, } } + &.underzoom { + background: #0095ff; + + &:hover { + background: #003ada; + } + } + + &.no-granules { + background: #0095ff; + + &:hover { + background: #003ada; + } + } + &.layer-notice { background-color: #f60;