From 300699fa82dd7045497215826745825d9a79ad27 Mon Sep 17 00:00:00 2001 From: thibaud-leclere Date: Sun, 29 Mar 2026 10:23:19 +0200 Subject: [PATCH] feat: add Stimulus import modal controller --- assets/controllers/import_modal_controller.js | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 assets/controllers/import_modal_controller.js diff --git a/assets/controllers/import_modal_controller.js b/assets/controllers/import_modal_controller.js new file mode 100644 index 0000000..21e180d --- /dev/null +++ b/assets/controllers/import_modal_controller.js @@ -0,0 +1,59 @@ +import { Controller } from '@hotwired/stimulus'; + +export default class extends Controller { + static targets = ['overlay', 'fileInput', 'feedback', 'submitBtn']; + + open() { + this.overlayTarget.hidden = false; + } + + close() { + this.overlayTarget.hidden = true; + this.fileInputTarget.value = ''; + this.feedbackTarget.hidden = true; + } + + async submit() { + const file = this.fileInputTarget.files[0]; + if (!file) { + this._showFeedback('Veuillez sélectionner un fichier.', true); + return; + } + + if (!file.name.endsWith('.csv')) { + this._showFeedback('Seuls les fichiers CSV sont acceptés.', true); + return; + } + + this.submitBtnTarget.disabled = true; + + const formData = new FormData(); + formData.append('file', file); + + try { + const response = await fetch('/api/imports', { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + const data = await response.json(); + this._showFeedback(data.error || 'Une erreur est survenue.', true); + return; + } + + this._showFeedback('Import lancé !', false); + setTimeout(() => this.close(), 1500); + } catch (e) { + this._showFeedback('Une erreur est survenue.', true); + } finally { + this.submitBtnTarget.disabled = false; + } + } + + _showFeedback(message, isError) { + this.feedbackTarget.textContent = message; + this.feedbackTarget.className = isError ? 'modal-feedback error' : 'modal-feedback success'; + this.feedbackTarget.hidden = false; + } +}