From 40f70872c7248676858ebd3b81b23b9134b9dc76 Mon Sep 17 00:00:00 2001 From: Tariq Soliman Date: Mon, 4 Dec 2023 18:20:08 -0800 Subject: [PATCH] #458 urlReplacements --- config/js/config.js | 14 +++++ docs/pages/Configure/Layers/Tile/Tile.md | 15 ++++- .../spice/getKernelUtils/get-kernels-tgo.bat | 14 ++--- src/essence/Ancillary/TimeControl.js | 59 ++++++++++++++++--- src/essence/Ancillary/TimeUI.js | 3 +- .../Layers_/leaflet-tilelayer-middleware.js | 5 +- src/essence/Basics/Map_/Map_.js | 10 ++-- 7 files changed, 97 insertions(+), 23 deletions(-) diff --git a/config/js/config.js b/config/js/config.js index 27a4be1f..ae1c5531 100644 --- a/config/js/config.js +++ b/config/js/config.js @@ -2799,6 +2799,20 @@ function layerPopulateVariable(modalId, layerType) { currentLayerVars.shortcutSuffix = currentLayerVars.shortcutSuffix || null; if (layerType == "tile") { + currentLayerVars.urlReplacements = currentLayerVars.urlReplacements + ? currentLayerVars.urlReplacements + : { + "name_of_{}_value_to_replace_in_url": { + on: "timeChange", + url: "url", + type: "GET || POST", + body: { + some_body: "{starttime} and {endtime} get filled", + }, + return: + "value_in_response_to_replace_with.use.dot.notation.to.traverse.objects", + }, + }; } else if (layerType == "data") { currentLayerVars = currentLayerVars.shader ? { shader: currentLayerVars.shader } diff --git a/docs/pages/Configure/Layers/Tile/Tile.md b/docs/pages/Configure/Layers/Tile/Tile.md index be7d6656..4ce50733 100644 --- a/docs/pages/Configure/Layers/Tile/Tile.md +++ b/docs/pages/Configure/Layers/Tile/Tile.md @@ -102,8 +102,21 @@ Example: ```javascript { - "shortcutSuffix": "single letter to 'ATL + {letter}' toggle the layer on and off" + "shortcutSuffix": "single letter to 'ATL + {letter}' toggle the layer on and off", + "urlReplacements": { + "name_of_{}_value_to_replace_in_url": { + on: "timeChange", + url: "url", + type: "GET || POST", + body: { + some_body: "{starttime} and {endtime} get filled", + }, + return: + "value_in_response_to_replace_with.use.dot.notation.to.traverse.objects", + }, + } } ``` - `shortcutSuffix`: A single letter to 'ALT + {letter}' toggle the layer on and off. Please verify that your chosen shortcut does not conflict with other system or browser-level keyboard shortcuts. +- `urlReplacements`: For the case where parts or all of a tileset's url comes from intermediary endpoints. For example a service may require sending a query to a server that then returns a uuid and that uuid is required in the tileset's url to query it. diff --git a/private/api/spice/getKernelUtils/get-kernels-tgo.bat b/private/api/spice/getKernelUtils/get-kernels-tgo.bat index 5e4d6055..d835591f 100644 --- a/private/api/spice/getKernelUtils/get-kernels-tgo.bat +++ b/private/api/spice/getKernelUtils/get-kernels-tgo.bat @@ -1,7 +1,7 @@ -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/EXOMARS2016/kernels/spk/em16_tgo_fsp_296_01_20230424_20231007_v01.bsp -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/lsk/naif0012.tls -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/pck00011.tpc -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de440.bsp -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/MARS2020/kernels/spk/mar097s.bsp -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/mars_iau2000_v1.tpc -wget -nc -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de440.bsp \ No newline at end of file +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/EXOMARS2016/kernels/spk/em16_tgo_fsp_296_01_20230424_20231007_v01.bsp +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/lsk/naif0012.tls +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/pck00011.tpc +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de440.bsp +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/MARS2020/kernels/spk/mar097s.bsp +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/mars_iau2000_v1.tpc +wget -N -P ../kernels https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de440.bsp \ No newline at end of file diff --git a/src/essence/Ancillary/TimeControl.js b/src/essence/Ancillary/TimeControl.js index cbff9bcb..707e17b9 100644 --- a/src/essence/Ancillary/TimeControl.js +++ b/src/essence/Ancillary/TimeControl.js @@ -176,21 +176,25 @@ var TimeControl = { if (L_.layers.layer[layer.name] === null) return - var layerTimeFormat = d3.utcFormat(layer.time.format) + let layerTimeFormat = d3.utcFormat(layer.time.format) layer.time.current = TimeControl.currentTime // keeps track of when layer was refreshed + let originalUrl = layer.url + + layer.url = await TimeControl.performTimeUrlReplacements(layer) + let changedUrl = null + if (layer.url !== originalUrl) changedUrl = layer.url + if (layer.type === 'tile') { if (layer.time && layer.time.enabled === true) { TimeControl.setLayerWmsParams(layer) } if (evenIfControlled === true || layer.controlled !== true) { if (L_.layers.on[layer.name] || evenIfOff) { - L_.layers.layer[layer.name].refresh() + L_.layers.layer[layer.name].refresh(changedUrl) } } } else { - var originalUrl = layer.url - // replace start/endtime keywords if (layer.time && layer.time.enabled === true) { if ( @@ -225,14 +229,55 @@ var TimeControl = { if (L_.layers.on[layer.name] || evenIfOff) { await Map_.refreshLayer(layer) } - // put start/endtime keywords back - if (layer.time && layer.time.enabled === true) - layer.url = originalUrl } } + // put start/endtime keywords back + if (layer.time && layer.time.enabled === true) layer.url = originalUrl return true }, + performTimeUrlReplacements: async function (layer) { + return new Promise(async (resolve, reject) => { + let layerTimeFormat = d3.utcFormat(layer.time.format) + + let nextUrl = layer.url + if (layer.variables?.urlReplacements) { + const keys = Object.keys(layer.variables.urlReplacements) + for (let i = 0; i < keys.length; i++) { + const r = layer.variables.urlReplacements[keys[i]] + + if (r.on === 'timeChange') { + const response = await fetch(r.url, { + method: r.type, + headers: { + accept: 'application/json', + 'content-type': 'application/json', + }, + body: JSON.stringify(r.body) + .replaceAll( + '{starttime}', + layerTimeFormat( + Date.parse(layer.time.start) + ) + ) + .replaceAll( + '{endtime}', + layerTimeFormat(Date.parse(layer.time.end)) + ), + }) + const res = await response.json() + const replacement = F_.getIn(res, r.return) + if (replacement) + nextUrl = nextUrl.replace( + `{${keys[i]}}`, + encodeURIComponent(replacement) + ) + } + } + } + resolve(nextUrl) + }) + }, reloadTimeLayers: function () { // refresh time enabled layers var reloadedLayers = [] diff --git a/src/essence/Ancillary/TimeUI.js b/src/essence/Ancillary/TimeUI.js index cd282d4a..285276d2 100644 --- a/src/essence/Ancillary/TimeUI.js +++ b/src/essence/Ancillary/TimeUI.js @@ -255,7 +255,6 @@ const TimeUI = { e.oldDate != null ) TimeUI.startTempusSavedLastDate = e.date - TimeUI.endTempus.updateOptions({ restrictions: { minDate: e.date, @@ -525,7 +524,7 @@ const TimeUI = { // Remove end date enforcement TimeUI.endTempus.updateOptions({ restrictions: { - minDate: new Date(0).toISOString(), + minDate: new Date(0), }, }) } else { diff --git a/src/essence/Basics/Layers_/leaflet-tilelayer-middleware.js b/src/essence/Basics/Layers_/leaflet-tilelayer-middleware.js index 4372c723..dfbc393e 100644 --- a/src/essence/Basics/Layers_/leaflet-tilelayer-middleware.js +++ b/src/essence/Basics/Layers_/leaflet-tilelayer-middleware.js @@ -111,14 +111,15 @@ var colorFilterExtension = { } img.src = url }, - refresh: function () { + refresh: function (newUrl) { + if (newUrl) this._url = newUrl if (this._map == null) return - for (let key in this._tiles) { const tile = this._tiles[key] if (tile.current && tile.active) { const oldsrc = tile.el.src const newsrc = this.getTileUrl(tile.coords) + if (oldsrc != newsrc) { //L.DomEvent.off(tile, 'load', this._tileOnLoad); ... this doesnt work! this._refreshTileUrl(tile, newsrc) diff --git a/src/essence/Basics/Map_/Map_.js b/src/essence/Basics/Map_/Map_.js index dc4f713a..1943994c 100644 --- a/src/essence/Basics/Map_/Map_.js +++ b/src/essence/Basics/Map_/Map_.js @@ -830,18 +830,19 @@ async function makeLayer(layerObj, evenIfOff, forceGeoJSON) { }) } - function makeTileLayer() { - var layerUrl = layerObj.url + async function makeTileLayer() { + let layerUrl = layerObj.url if (!F_.isUrlAbsolute(layerUrl)) layerUrl = L_.missionPath + layerUrl - var bb = null + let bb = null if (layerObj.hasOwnProperty('boundingBox')) { bb = L.latLngBounds( L.latLng(layerObj.boundingBox[3], layerObj.boundingBox[2]), L.latLng(layerObj.boundingBox[1], layerObj.boundingBox[0]) ) } + layerUrl = await TimeControl.performTimeUrlReplacements(layerObj) - var tileFormat = 'tms' + let tileFormat = 'tms' // For backward compatibility with the .tms option if (typeof layerObj.tileformat === 'undefined') { tileFormat = @@ -870,6 +871,7 @@ async function makeLayer(layerObj, evenIfOff, forceGeoJSON) { typeof layerObj.time === 'undefined' ? '' : layerObj.time.start, endtime: typeof layerObj.time === 'undefined' ? '' : layerObj.time.end, + variables: layerObj.variables || {}, }) L_.setLayerOpacity(layerObj.name, L_.layers.opacity[layerObj.name])