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() this.addCredits()
if (this._umap.properties.created_at) { if (this._umap.properties.created_at) {
const created_at = translate('created at {date}', { 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}', { 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}` this.elements.dates.innerHTML = `${created_at} - ${modified_at}`
} else { } else {

View file

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

View file

@ -57,6 +57,8 @@ export default class Umap {
}, },
geojson.properties geojson.properties
) )
this.createdAt = new Date(this.properties.created_at)
this.modifiedAt = this.properties.modified_at
this.searchParams = new URLSearchParams(window.location.search) this.searchParams = new URLSearchParams(window.location.search)
// Locale name (pt_PT, en_US…) // Locale name (pt_PT, en_US…)
@ -237,6 +239,21 @@ export default class Umap {
this._activeFeature = feature 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() { setPropertiesFromQueryString() {
const asBoolean = (key) => { const asBoolean = (key) => {
const value = this.searchParams.get(key) const value = this.searchParams.get(key)