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"]')