Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#458 urlReplacements #459

Merged
merged 1 commit into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions config/js/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down
15 changes: 14 additions & 1 deletion docs/pages/Configure/Layers/Tile/Tile.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
14 changes: 7 additions & 7 deletions private/api/spice/getKernelUtils/get-kernels-tgo.bat
Original file line number Diff line number Diff line change
@@ -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
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
59 changes: 52 additions & 7 deletions src/essence/Ancillary/TimeControl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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 = []
Expand Down
3 changes: 1 addition & 2 deletions src/essence/Ancillary/TimeUI.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,6 @@ const TimeUI = {
e.oldDate != null
)
TimeUI.startTempusSavedLastDate = e.date

TimeUI.endTempus.updateOptions({
restrictions: {
minDate: e.date,
Expand Down Expand Up @@ -525,7 +524,7 @@ const TimeUI = {
// Remove end date enforcement
TimeUI.endTempus.updateOptions({
restrictions: {
minDate: new Date(0).toISOString(),
minDate: new Date(0),
},
})
} else {
Expand Down
5 changes: 3 additions & 2 deletions src/essence/Basics/Layers_/leaflet-tilelayer-middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 6 additions & 4 deletions src/essence/Basics/Map_/Map_.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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])
Expand Down