Compare commits

..

No commits in common. "a442e56cbca91106ba37a6cea168479d0f60288e" and "3e9982c8cba23bcc37abdbe5adff792b61f4d19c" have entirely different histories.

7 changed files with 17 additions and 57 deletions

View file

@ -57,11 +57,8 @@ class uMapAlert extends uMapElement {
this.container.dataset.duration = duration
this.element.textContent = message
this.setAttribute('open', 'open')
if (this._timeoutId) {
clearTimeout(this._timeoutId)
}
if (Number.isFinite(duration)) {
this._timeoutId = setTimeout(() => {
setTimeout(() => {
this._hide()
}, duration)
}

View file

@ -249,7 +249,6 @@ export class DataLayer extends ServerStored {
}
fromGeoJSON(geojson, sync = true) {
if (!geojson) return []
const features = this.addData(geojson, sync)
this._geojson = geojson
this.onDataLoaded()
@ -283,9 +282,7 @@ export class DataLayer extends ServerStored {
}
backupData() {
if (this._geojson) {
this._geojson_bk = Utils.CopyJSON(this._geojson)
}
this._geojson_bk = Utils.CopyJSON(this._geojson)
}
reindex() {
@ -322,9 +319,7 @@ export class DataLayer extends ServerStored {
if (!this.isRemoteLayer()) return
if (!this.hasDynamicData() && this.hasDataLoaded() && !force) return
if (!this.isVisible()) return
// Keep non proxied url for later use in Alert.
const remoteUrl = this._umap.renderUrl(this.options.remoteData.url)
let url = remoteUrl
let url = this._umap.renderUrl(this.options.remoteData.url)
if (this.options.remoteData.proxy) {
url = this._umap.proxyUrl(url, this.options.remoteData.ttl)
}
@ -333,14 +328,6 @@ export class DataLayer extends ServerStored {
return this._umap.formatter
.parse(raw, this.options.remoteData.format)
.then((geojson) => this.fromGeoJSON(geojson))
.catch((error) => {
Alert.error(
translate('Cannot parse remote data for layer "{layer}" with url "{url}"', {
layer: this.getName(),
url: remoteUrl,
})
)
})
})
}
@ -468,7 +455,7 @@ export class DataLayer extends ServerStored {
// otherwise the layer becomes uneditable.
return this.makeFeatures(geojson, sync)
} catch (err) {
console.debug('Error with DataLayer', this.id)
console.log('Error with DataLayer', this.id)
console.error(err)
return []
}
@ -515,7 +502,7 @@ export class DataLayer extends ServerStored {
feature = new Polygon(this._umap, this, geojson, id)
break
default:
console.debug(geojson)
console.log(geojson)
Alert.error(
translate('Skipping unknown geometry.type: {type}', {
type: geometry.type || 'undefined',
@ -537,9 +524,6 @@ export class DataLayer extends ServerStored {
if (data?.length) this.isDirty = true
return data
})
.catch((error) => {
Alert.error(translate('Import failed: invalid data'))
})
}
readFile(f) {

View file

@ -1,6 +1,5 @@
/* Uses globals for: csv2geojson, osmtogeojson (not available as ESM) */
import { translate } from './i18n.js'
import { uMapAlert as Alert } from '../components/alerts/alert.js'
export const EXPORT_FORMATS = {
geojson: {
@ -59,7 +58,11 @@ export class Formatter {
}
async fromGeoJSON(str) {
return JSON.parse(str)
try {
return JSON.parse(str)
} catch (err) {
U.Alert.error(`Invalid JSON file: ${err}`)
}
}
async fromOSM(str) {
@ -103,8 +106,8 @@ export class Formatter {
message: err[0].message,
})
}
Alert.error(message, 10000)
console.debug(err)
U.Alert.error(message, 10000)
console.error(err)
}
if (result?.features.length) {
callback(result)
@ -124,7 +127,7 @@ export class Formatter {
const doc = new DOMParser().parseFromString(x, 'text/xml')
const errorNode = doc.querySelector('parsererror')
if (errorNode) {
Alert.error(translate('Cannot parse data'))
U.Alert.error(translate('Cannot parse data'))
}
return doc
}

View file

@ -305,7 +305,7 @@ export default class Importer extends Utils.WithTemplate {
this.onSuccess()
} catch (e) {
this.onError(translate('Invalid umap data'))
console.debug(e)
console.error(e)
return false
}
}

View file

@ -1111,7 +1111,7 @@ export default class Umap extends ServerStored {
this._editOverlay(container)
this._editBounds(container)
this._editSlideshow(container)
if (this.properties.websocketEnabled && this.id) {
if (this.properties.websocketEnabled) {
this._editSync(container)
}
this._advancedActions(container)
@ -1450,7 +1450,7 @@ export default class Umap extends ServerStored {
removeDataLayers() {
this.eachDataLayerReverse((datalayer) => {
datalayer.del()
datalayer._delete()
})
}

View file

@ -71,6 +71,7 @@ def test_umap_import_from_file(live_server, tilelayer, page):
expect(nonloaded).to_have_count(1)
@pytest.mark.skip
def test_umap_import_from_textarea(live_server, tilelayer, page, settings):
settings.UMAP_ALLOW_ANONYMOUS = True
page.goto(f"{live_server.url}/map/new/")
@ -122,28 +123,6 @@ def test_import_geojson_from_textarea(tilelayer, live_server, page):
expect(paths).to_have_count(3)
def test_import_invalid_data(tilelayer, live_server, page):
uncaught_errors = []
page.on("pageerror", lambda exc: uncaught_errors.append(exc))
page.goto(f"{live_server.url}/map/new/")
page.get_by_title("Open browser").click()
layers = page.locator(".umap-browser .datalayer")
markers = page.locator(".leaflet-marker-icon")
paths = page.locator("path")
expect(markers).to_have_count(0)
expect(paths).to_have_count(0)
expect(layers).to_have_count(0)
button = page.get_by_title("Import data")
expect(button).to_be_visible()
button.click()
textarea = page.locator(".umap-upload textarea")
textarea.fill("invalid data")
for format in ["geojson", "csv", "gpx", "kml", "georss", "osm", "umap"]:
page.locator('select[name="format"]').select_option(format)
page.get_by_role("button", name="Import data", exact=True).click()
assert not uncaught_errors, f"Error with format {format}"
def test_import_kml_from_textarea(tilelayer, live_server, page):
page.goto(f"{live_server.url}/map/new/")
page.get_by_title("Open browser").click()

View file

@ -503,12 +503,9 @@ def test_create_and_sync_map(new_page, asgi_live_server, tilelayer, login, user)
# Create a syncable map with peerA
peerA = login(user, prefix="Page A")
peerA.goto(f"{asgi_live_server.url}/en/map/new/")
peerA.get_by_role("link", name="Map advanced properties").click()
expect(peerA.get_by_text("Real-time collaboration", exact=True)).to_be_hidden()
with peerA.expect_response(re.compile("./map/create/.*")):
peerA.get_by_role("button", name="Save Draft").click()
peerA.get_by_role("link", name="Map advanced properties").click()
expect(peerA.get_by_text("Real-time collaboration", exact=True)).to_be_visible()
peerA.get_by_text("Real-time collaboration", exact=True).click()
peerA.get_by_text("Enable real-time").click()
peerA.get_by_role("link", name="Update permissions and editors").click()