diff --git a/assets/controllers/form_upload_guard_controller.js b/assets/controllers/form_upload_guard_controller.js
new file mode 100644
index 0000000..ddfd492
--- /dev/null
+++ b/assets/controllers/form_upload_guard_controller.js
@@ -0,0 +1,40 @@
+import { Controller } from '@hotwired/stimulus'
+
+export default class extends Controller {
+
+ static targets = ['submit']
+
+ connect () {
+ this.uploading = false
+ this.boundOnUploading = this.onUploading.bind(this)
+ this.boundOnComplete = this.onComplete.bind(this)
+ window.addEventListener('dropzone:uploading', this.boundOnUploading)
+ window.addEventListener('dropzone:complete', this.boundOnComplete)
+ }
+
+ onUploading () {
+ this.uploading = true
+ this.submitTargets.forEach(button => {
+ button.disabled = true
+ })
+ }
+
+ onComplete () {
+ this.uploading = false
+ this.submitTargets.forEach(button => {
+ button.disabled = false
+ })
+ }
+
+ guard (event) {
+ if (this.uploading) {
+ event.preventDefault()
+ event.stopImmediatePropagation()
+ }
+ }
+
+ disconnect () {
+ window.removeEventListener('dropzone:uploading', this.boundOnUploading)
+ window.removeEventListener('dropzone:complete', this.boundOnComplete)
+ }
+}
diff --git a/assets/controllers/upload_collection_controller.js b/assets/controllers/upload_collection_controller.js
index 3898a70..8b483a4 100644
--- a/assets/controllers/upload_collection_controller.js
+++ b/assets/controllers/upload_collection_controller.js
@@ -73,7 +73,7 @@ export default class extends Controller {
})
}
- disconnect() {
+ disconnect () {
this.dropzone.destroy()
}
}
diff --git a/assets/styles/components/button.css b/assets/styles/components/button.css
index 426332a..1833cdd 100644
--- a/assets/styles/components/button.css
+++ b/assets/styles/components/button.css
@@ -1,6 +1,6 @@
.btn {
@apply inline-flex space-x-1 justify-center rounded-lg text-sm uppercase font-semibold py-2.5 px-4;
- @apply bg-primary text-white hover:bg-primary/80 shadow-md;
+ @apply bg-primary text-white hover:bg-primary/80 shadow-md disabled:opacity-50 disabled:cursor-not-allowed;
}
.btn--small {
diff --git a/templates/admin/system/contact/_form.html.twig b/templates/admin/system/contact/_form.html.twig
index a470281..5ee3f32 100644
--- a/templates/admin/system/contact/_form.html.twig
+++ b/templates/admin/system/contact/_form.html.twig
@@ -1,4 +1,5 @@
-{{ form_start(form, { 'attr': { 'hx-post': app.request.uri, 'hx-target': '#htmx-modal', 'hx-swap': 'outerHTML' } }) }}
+{% set formAttr = stimulus_controller('form-upload-guard')|stimulus_action('form-upload-guard', 'guard', 'submit') %}
+{{ form_start(form, { 'attr': { 'hx-post': app.request.uri, 'hx-target': '#htmx-modal', 'hx-swap': 'outerHTML' }|merge(formAttr.toArray()) }) }}
{{ form_row(form.category) }}
{{ form_row(form.name) }}
@@ -18,7 +19,7 @@
{{ form_errors(form) }}
-