Remove duplicate disable/enable logic and fetch() calls

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 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 13:08:21 +00:00
parent 366662a948
commit 887d669f80

View File

@@ -82,40 +82,34 @@ window.detailsObserver = new MutationObserver((mutations) => {
function readoutUnitChanged(select) { function readoutUnitChanged(select) {
var button = select.closest('tr').querySelector('.set-default-unit'); var button = select.closest('tr').querySelector('.set-default-unit');
if (select.value && select.value !== select.dataset.defaultUnitId) { if (select.value && select.value !== select.dataset.defaultUnitId) {
button.removeAttribute('disabled'); Turbo.StreamElement.prototype.enableElement(button);
button.removeAttribute('aria-disabled');
button.removeAttribute('tabindex');
} else { } else {
button.setAttribute('disabled', 'disabled'); Turbo.StreamElement.prototype.disableElement(button);
button.setAttribute('aria-disabled', 'true');
button.setAttribute('tabindex', '-1');
} }
} }
window.readoutUnitChanged = readoutUnitChanged window.readoutUnitChanged = readoutUnitChanged
function setDefaultUnit(button) { function setDefaultUnit(button) {
var select = button.closest('tr').querySelector('select[data-default-unit-id]'); var select = button.closest('tr').querySelector('select[data-default-unit-id]');
var params = new URLSearchParams(); var form = document.createElement('form');
params.append('quantity[default_unit_id]', select.value); form.action = button.dataset.path;
form.method = 'post';
fetch(button.dataset.path, { form.dataset.turboStream = 'true';
body: params, var methodInput = document.createElement('input');
headers: { methodInput.type = 'hidden'; methodInput.name = '_method'; methodInput.value = 'patch';
'Accept': 'text/vnd.turbo-stream.html', var unitInput = document.createElement('input');
'X-CSRF-Token': document.head.querySelector('meta[name=csrf-token]').content, unitInput.type = 'hidden'; unitInput.name = 'quantity[default_unit_id]'; unitInput.value = select.value;
'X-Requested-With': 'XMLHttpRequest' form.appendChild(methodInput);
}, form.appendChild(unitInput);
method: 'PATCH' form.addEventListener('turbo:submit-end', function(event) {
}) if (event.detail.success) {
.then(response => {
if (response.ok) {
select.dataset.defaultUnitId = select.value; select.dataset.defaultUnitId = select.value;
readoutUnitChanged(select); readoutUnitChanged(select);
} }
return response.text(); form.remove();
}) });
.then(html => Turbo.renderStreamMessage(html)) document.body.appendChild(form);
.catch(err => console.error('setDefaultUnit failed:', err)); form.requestSubmit();
} }
window.setDefaultUnit = setDefaultUnit window.setDefaultUnit = setDefaultUnit
@@ -288,22 +282,17 @@ window.dragEnd = dragEnd
function drop(event) { function drop(event) {
event.preventDefault() event.preventDefault()
var idParam = event.currentTarget.getAttribute("data-drop-id-param")
var params = new URLSearchParams()
var id_param = event.currentTarget.getAttribute("data-drop-id-param")
var id = event.currentTarget.getAttribute("data-drop-id").split("_").pop() var id = event.currentTarget.getAttribute("data-drop-id").split("_").pop()
params.append(id_param, id) var form = document.createElement('form');
form.action = event.dataTransfer.getData("text/plain");
fetch(event.dataTransfer.getData("text/plain"), { form.method = 'post';
body: params, form.dataset.turboStream = 'true';
headers: { var input = document.createElement('input');
"Accept": "text/vnd.turbo-stream.html", input.type = 'hidden'; input.name = idParam; input.value = id;
"X-CSRF-Token": document.head.querySelector("meta[name=csrf-token]").content, form.appendChild(input);
"X-Requested-With": "XMLHttpRequest" form.addEventListener('turbo:submit-end', function() { form.remove(); });
}, document.body.appendChild(form);
method: "POST" form.requestSubmit();
})
.then(response => response.text())
.then(html => Turbo.renderStreamMessage(html))
} }
window.drop = drop window.drop = drop