feat: use Last-Modified header from remote data when available

fix #2589
This commit is contained in:
Yohan Boniface 2025-04-08 17:03:06 +02:00
parent fea0f02b80
commit 2baeaace24
3 changed files with 24 additions and 3 deletions

View file

@ -74,10 +74,10 @@ export default class Caption extends Utils.WithTemplate {
this.addCredits()
if (this._umap.properties.created_at) {
const created_at = translate('created at {date}', {
date: new Date(this._umap.properties.created_at).toLocaleDateString(),
date: this._umap.createdAt.toLocaleDateString(),
})
const modified_at = translate('modified at {date}', {
date: new Date(this._umap.properties.modified_at).toLocaleDateString(),
date: this._umap.modifiedAt.toLocaleDateString(),
})
this.elements.dates.innerHTML = `${created_at} - ${modified_at}`
} else {

View file

@ -220,6 +220,7 @@ export class DataLayer {
this._loading = true
const [geojson, response, error] = await this._umap.server.get(this._dataUrl())
if (!error) {
this._umap.modifiedAt = response.headers.get('last-modified')
this.setReferenceVersion({ response, sync: false })
// FIXME: for now the _umap_options property is set dynamically from backend
// And thus it's not in the geojson file in the server
@ -303,7 +304,10 @@ export class DataLayer {
async getUrl(url, initialUrl) {
const response = await this._umap.request.get(url)
return new Promise((resolve) => {
if (response?.ok) return resolve(response.text())
if (response?.ok) {
this._umap.modifiedAt = response.headers.get('last-modified')
return resolve(response.text())
}
Alert.error(
translate('Cannot load remote data for layer "{layer}" with url "{url}"', {
layer: this.getName(),

View file

@ -57,6 +57,8 @@ export default class Umap {
},
geojson.properties
)
this.createdAt = new Date(this.properties.created_at)
this.modifiedAt = this.properties.modified_at
this.searchParams = new URLSearchParams(window.location.search)
// Locale name (pt_PT, en_US…)
@ -237,6 +239,21 @@ export default class Umap {
this._activeFeature = feature
}
get modifiedAt() {
return this._modifiedAt
}
set modifiedAt(at) {
if (!at) return
if (typeof at === 'string') {
at = new Date(at)
}
if (!this._modifiedAt || at > this._modifiedAt) {
console.log('set modifiedAt to', at)
this._modifiedAt = at
}
}
setPropertiesFromQueryString() {
const asBoolean = (key) => {
const value = this.searchParams.get(key)