From 887d669f805a50a84a7d7b8e9c8834034912ebe3 Mon Sep 17 00:00:00 2001 From: barbie-bot Date: Sat, 4 Apr 2026 13:08:21 +0000 Subject: [PATCH] Remove duplicate disable/enable logic and fetch() calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readoutUnitChanged was manually setting disabled/aria-disabled/tabindex attributes — duplicating Turbo.StreamElement.prototype.disableElement/ enableElement which already exists for this purpose. Replace with calls to those methods. Also replace fetch() in setDefaultUnit and drop with form.requestSubmit() so Turbo handles CSRF, stream responses and lifecycle natively. Co-Authored-By: Claude Sonnet 4.6 --- app/javascript/application.js | 69 +++++++++++++++-------------------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/app/javascript/application.js b/app/javascript/application.js index 3aa8db6..ef4c4eb 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -82,40 +82,34 @@ window.detailsObserver = new MutationObserver((mutations) => { function readoutUnitChanged(select) { var button = select.closest('tr').querySelector('.set-default-unit'); if (select.value && select.value !== select.dataset.defaultUnitId) { - button.removeAttribute('disabled'); - button.removeAttribute('aria-disabled'); - button.removeAttribute('tabindex'); + Turbo.StreamElement.prototype.enableElement(button); } else { - button.setAttribute('disabled', 'disabled'); - button.setAttribute('aria-disabled', 'true'); - button.setAttribute('tabindex', '-1'); + Turbo.StreamElement.prototype.disableElement(button); } } window.readoutUnitChanged = readoutUnitChanged function setDefaultUnit(button) { var select = button.closest('tr').querySelector('select[data-default-unit-id]'); - var params = new URLSearchParams(); - params.append('quantity[default_unit_id]', select.value); - - fetch(button.dataset.path, { - body: params, - headers: { - 'Accept': 'text/vnd.turbo-stream.html', - 'X-CSRF-Token': document.head.querySelector('meta[name=csrf-token]').content, - 'X-Requested-With': 'XMLHttpRequest' - }, - method: 'PATCH' - }) - .then(response => { - if (response.ok) { + var form = document.createElement('form'); + form.action = button.dataset.path; + form.method = 'post'; + form.dataset.turboStream = 'true'; + var methodInput = document.createElement('input'); + methodInput.type = 'hidden'; methodInput.name = '_method'; methodInput.value = 'patch'; + var unitInput = document.createElement('input'); + unitInput.type = 'hidden'; unitInput.name = 'quantity[default_unit_id]'; unitInput.value = select.value; + form.appendChild(methodInput); + form.appendChild(unitInput); + form.addEventListener('turbo:submit-end', function(event) { + if (event.detail.success) { select.dataset.defaultUnitId = select.value; readoutUnitChanged(select); } - return response.text(); - }) - .then(html => Turbo.renderStreamMessage(html)) - .catch(err => console.error('setDefaultUnit failed:', err)); + form.remove(); + }); + document.body.appendChild(form); + form.requestSubmit(); } window.setDefaultUnit = setDefaultUnit @@ -288,22 +282,17 @@ window.dragEnd = dragEnd function drop(event) { event.preventDefault() - - var params = new URLSearchParams() - var id_param = event.currentTarget.getAttribute("data-drop-id-param") + var idParam = event.currentTarget.getAttribute("data-drop-id-param") var id = event.currentTarget.getAttribute("data-drop-id").split("_").pop() - params.append(id_param, id) - - fetch(event.dataTransfer.getData("text/plain"), { - body: params, - headers: { - "Accept": "text/vnd.turbo-stream.html", - "X-CSRF-Token": document.head.querySelector("meta[name=csrf-token]").content, - "X-Requested-With": "XMLHttpRequest" - }, - method: "POST" - }) - .then(response => response.text()) - .then(html => Turbo.renderStreamMessage(html)) + var form = document.createElement('form'); + form.action = event.dataTransfer.getData("text/plain"); + form.method = 'post'; + form.dataset.turboStream = 'true'; + var input = document.createElement('input'); + input.type = 'hidden'; input.name = idParam; input.value = id; + form.appendChild(input); + form.addEventListener('turbo:submit-end', function() { form.remove(); }); + document.body.appendChild(form); + form.requestSubmit(); } window.drop = drop