diff --git a/umap/static/umap/js/modules/importer.js b/umap/static/umap/js/modules/importer.js
index 15180126e..2135ab009 100644
--- a/umap/static/umap/js/modules/importer.js
+++ b/umap/static/umap/js/modules/importer.js
@@ -1,86 +1,105 @@
export default class Importer {
constructor(map) {
this.map = map
- this.presets = map.options.importPresets
}
- #buildDatalayerOptions(layerSelect) {
- let option
- this.map.eachDataLayerReverse((datalayer) => {
- if (datalayer.isLoaded() && !datalayer.isRemoteLayer()) {
- const id = L.stamp(datalayer)
- option = L.DomUtil.add('option', '', layerSelect, datalayer.options.name)
- option.value = id
- }
+ open() {
+ if (!this.form) this._build()
+ this.map.ui.openPanel({
+ data: { html: this.form },
+ className: 'dark',
})
- L.DomUtil.element(
- 'option',
- { value: '', textContent: L._('Import in a new layer') },
- layerSelect
- )
}
- #buildPresetsOptions(presetSelect) {
- if (this.presets.length) {
- const presetBox = this.form.querySelector('#preset-box')
- presetBox.removeAttribute('hidden')
- const noPreset = L.DomUtil.create('option', '', presetSelect)
- noPreset.value = noPreset.textContent = L._('Choose a preset')
- for (const preset of this.presets) {
- option = L.DomUtil.create('option', '', presetSelect)
- option.value = preset.url
- option.textContent = preset.label
- }
- }
+ openFiles() {
+ this.open()
+ this.fileInput.showPicker()
}
- build() {
+ _build() {
const template = document.querySelector('#umap-upload')
this.form = template.content.firstElementChild.cloneNode(true)
- this.presetSelect = this.form.querySelector('[name="preset-select"]')
- this.fileInput = this.form.querySelector('[name="file-input"]')
- this.map.ui.once('panel:closed', () => (this.fileInput.value = null))
+
this.typeLabel = this.form.querySelector('#type-label')
const helpButton = this.typeLabel.querySelector('button')
this.map.help.button(this.typeLabel, 'importFormats', '', helpButton)
- this.formatSelect = this.form.querySelector('[name="format"]')
+
this.layerSelect = this.form.querySelector('[name="datalayer"]')
- this.submitInput = this.form.querySelector('[name="submit-input"]')
- this.#buildDatalayerOptions(this.layerSelect)
- this.#buildPresetsOptions(this.presetSelect)
+ this._buildDatalayerOptions(this.layerSelect)
+ this.presetSelect = this.form.querySelector('[name="preset-select"]')
+ this._buildPresetsOptions(this.presetSelect)
- this.submitInput.addEventListener('click', this.submit.bind(this))
- this.fileInput.addEventListener('change', (e) => {
- let type = ''
- let newType
- for (const file of e.target.files) {
- newType = L.Util.detectFileType(file)
- if (!type && newType) {
- type = newType
- }
- if (type && newType !== type) {
- type = ''
- break
- }
+ this.fileInput = this.form.querySelector('[name="file-input"]')
+ this.formatSelect = this.form.querySelector('[name="format"]')
+
+ this._connectedCallback()
+ }
+
+ _buildDatalayerOptions(layerSelect) {
+ const options = []
+ this.map.eachDataLayerReverse((datalayer) => {
+ if (datalayer.isLoaded() && !datalayer.isRemoteLayer()) {
+ options.push(
+ ``
+ )
}
- this.formatSelect.value = type
})
+ options.push(``)
+ layerSelect.innerHTML = options.join('')
}
- open() {
- if (!this.form) this.build()
- this.map.ui.openPanel({
- data: { html: this.form },
- className: 'dark',
- })
+ _buildPresetsOptions(presetSelect) {
+ const presets = this.map.options.importPresets
+ if (!presets.length) return
+ const options = []
+ presetSelect.parentElement.removeAttribute('hidden')
+ options.push(
+ ``
+ )
+ for (const preset of presets) {
+ options.push(``)
+ }
+ presetSelect.innerHTML = options.join('')
}
- openFiles() {
- this.open()
- this.fileInput.showPicker()
+ _connectedCallback() {
+ const controller = new AbortController()
+ const signal = controller.signal
+ this.form
+ .querySelector('[name="submit-input"]')
+ .addEventListener('click', this._submit.bind(this), { signal })
+
+ this.fileInput.addEventListener(
+ 'change',
+ (e) => {
+ let type = ''
+ let newType
+ for (const file of e.target.files) {
+ newType = L.Util.detectFileType(file)
+ if (!type && newType) {
+ type = newType
+ }
+ if (type && newType !== type) {
+ type = ''
+ break
+ }
+ }
+ this.formatSelect.value = type
+ },
+ { signal }
+ )
+
+ this.map.ui.once(
+ 'panel:closed',
+ () => {
+ this.fileInput.value = null
+ controller.abort()
+ },
+ { signal }
+ )
}
- submit() {
+ _submit() {
const urlInputValue = this.form.querySelector('[name="url-input"]').value
const rawInputValue = this.form.querySelector('[name="raw-input"]').value
const clearFlag = this.form.querySelector('[name="clear"]')