forked from fixin.me/fixin.me
Compare commits
1 Commits
fix/form-c
...
refactor/e
| Author | SHA1 | Date | |
|---|---|---|---|
| 67f519052a |
@@ -2,6 +2,7 @@
|
|||||||
// https://github.com/rails/importmap-rails
|
// https://github.com/rails/importmap-rails
|
||||||
import "@hotwired/turbo-rails"
|
import "@hotwired/turbo-rails"
|
||||||
import "controllers"
|
import "controllers"
|
||||||
|
import { disableElement, enableElement } from "element_helpers"
|
||||||
|
|
||||||
|
|
||||||
/* Hide page before loaded for testing purposes */
|
/* Hide page before loaded for testing purposes */
|
||||||
@@ -12,23 +13,13 @@ document.addEventListener('turbo:load', showPage)
|
|||||||
|
|
||||||
|
|
||||||
/* Turbo stream actions */
|
/* Turbo stream actions */
|
||||||
Turbo.StreamElement.prototype.disableElement = function(element) {
|
Turbo.StreamElement.prototype.disableElement = disableElement
|
||||||
element.setAttribute("disabled", "disabled")
|
Turbo.StreamElement.prototype.enableElement = enableElement
|
||||||
element.setAttribute("aria-disabled", "true")
|
|
||||||
element.setAttribute("tabindex", "-1")
|
|
||||||
}
|
|
||||||
Turbo.StreamActions.disable = function() {
|
Turbo.StreamActions.disable = function() {
|
||||||
this.targetElements.forEach((e) => { this.disableElement(e) })
|
this.targetElements.forEach(disableElement)
|
||||||
}
|
|
||||||
|
|
||||||
Turbo.StreamElement.prototype.enableElement = function(element) {
|
|
||||||
element.removeAttribute("disabled")
|
|
||||||
element.removeAttribute("aria-disabled")
|
|
||||||
// Assume 'tabindex' is not used explicitly, so removing it is safe
|
|
||||||
element.removeAttribute("tabindex")
|
|
||||||
}
|
}
|
||||||
Turbo.StreamActions.enable = function() {
|
Turbo.StreamActions.enable = function() {
|
||||||
this.targetElements.forEach((e) => { this.enableElement(e) })
|
this.targetElements.forEach(enableElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: change to visibility = collapse to avoid width change? */
|
/* TODO: change to visibility = collapse to avoid width change? */
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Controller } from "@hotwired/stimulus"
|
import { Controller } from "@hotwired/stimulus"
|
||||||
|
import { disableElement, enableElement } from "element_helpers"
|
||||||
|
|
||||||
export default class extends Controller {
|
export default class extends Controller {
|
||||||
static targets = ["countLabel", "submitButton", "list"]
|
static targets = ["countLabel", "submitButton", "list"]
|
||||||
@@ -18,10 +19,10 @@ export default class extends Controller {
|
|||||||
const count = this.element.querySelectorAll('input:checked:not([disabled])').length
|
const count = this.element.querySelectorAll('input:checked:not([disabled])').length
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
this.countLabelTarget.textContent = count + ' selected'
|
this.countLabelTarget.textContent = count + ' selected'
|
||||||
Turbo.StreamElement.prototype.enableElement(this.submitButtonTarget)
|
enableElement(this.submitButtonTarget)
|
||||||
} else {
|
} else {
|
||||||
this.countLabelTarget.textContent = this.countLabelTarget.dataset.prompt
|
this.countLabelTarget.textContent = this.countLabelTarget.dataset.prompt
|
||||||
Turbo.StreamElement.prototype.disableElement(this.submitButtonTarget)
|
disableElement(this.submitButtonTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,30 +22,4 @@ export default class extends Controller {
|
|||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel(event) {
|
|
||||||
event.preventDefault()
|
|
||||||
const el = this.element
|
|
||||||
|
|
||||||
// Move focus to next open form if this one had focus
|
|
||||||
const focused = document.activeElement
|
|
||||||
if (!focused || focused === document.body || el.contains(focused)) {
|
|
||||||
const next = el.parentElement?.querySelector(`#${el.id} ~ tr:has([autofocus])`)
|
|
||||||
?? el.parentElement?.querySelector("tr:has([autofocus])")
|
|
||||||
next?.querySelector("[autofocus]")?.focus()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove associated inner form element (tabular: <tr> wraps a separate <form>)
|
|
||||||
document.getElementById(el.dataset.form)?.remove()
|
|
||||||
|
|
||||||
// Re-enable trigger link
|
|
||||||
const enableId = el.dataset.link ?? el.dataset.cancelEnable
|
|
||||||
if (enableId) Turbo.StreamElement.prototype.enableElement(document.getElementById(enableId))
|
|
||||||
|
|
||||||
// Show hidden row (tabular forms) or no-items placeholder (create form)
|
|
||||||
document.getElementById(el.dataset.hiddenRow)?.removeAttribute("style")
|
|
||||||
document.getElementById(el.dataset.cancelShow)?.style.removeProperty("display")
|
|
||||||
|
|
||||||
el.remove()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import { Controller } from "@hotwired/stimulus"
|
import { Controller } from "@hotwired/stimulus"
|
||||||
|
import { disableElement, enableElement } from "element_helpers"
|
||||||
|
|
||||||
export default class extends Controller {
|
export default class extends Controller {
|
||||||
static targets = ["select", "button"]
|
static targets = ["select", "button"]
|
||||||
|
|
||||||
unitChanged() {
|
unitChanged() {
|
||||||
if (this.selectTarget.value && this.selectTarget.value !== this.selectTarget.dataset.defaultUnitId) {
|
if (this.selectTarget.value && this.selectTarget.value !== this.selectTarget.dataset.defaultUnitId) {
|
||||||
Turbo.StreamElement.prototype.enableElement(this.buttonTarget)
|
enableElement(this.buttonTarget)
|
||||||
} else {
|
} else {
|
||||||
Turbo.StreamElement.prototype.disableElement(this.buttonTarget)
|
disableElement(this.buttonTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
11
app/javascript/element_helpers.js
Normal file
11
app/javascript/element_helpers.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
export function disableElement(element) {
|
||||||
|
element.setAttribute("disabled", "disabled")
|
||||||
|
element.setAttribute("aria-disabled", "true")
|
||||||
|
element.setAttribute("tabindex", "-1")
|
||||||
|
}
|
||||||
|
|
||||||
|
export function enableElement(element) {
|
||||||
|
element.removeAttribute("disabled")
|
||||||
|
element.removeAttribute("aria-disabled")
|
||||||
|
element.removeAttribute("tabindex")
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<%= form.button %>
|
<%= form.button %>
|
||||||
<%= image_link_to t(:cancel), "close-outline", measurements_path,
|
<%= image_link_to t(:cancel), "close-outline", measurements_path,
|
||||||
class: 'dangerous', name: :cancel,
|
class: 'dangerous', name: :cancel,
|
||||||
data: {action: 'click->form#cancel'} %>
|
onclick: render_turbo_stream('edit_form_close', {row: row}) %>
|
||||||
</td>
|
</td>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
2
app/views/measurements/_edit_form_close.html.erb
Normal file
2
app/views/measurements/_edit_form_close.html.erb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<%= turbo_stream.close_form row %>
|
||||||
|
<%= turbo_stream.update :flashes %>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<%= form.button %>
|
<%= form.button %>
|
||||||
<%= image_link_to t(:cancel), "close-outline", measurements_path,
|
<%= image_link_to t(:cancel), "close-outline", measurements_path,
|
||||||
class: 'dangerous', name: :cancel,
|
class: 'dangerous', name: :cancel,
|
||||||
data: {action: 'click->form#cancel'} %>
|
onclick: render_turbo_stream('edit_form_close', {row: row}) %>
|
||||||
</td>
|
</td>
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
<%= tabular_form_with model: Measurement.new, id: :measurement_form,
|
<%= tabular_form_with model: Measurement.new, id: :measurement_form,
|
||||||
class: 'topside-area flex vertical center',
|
class: 'topside-area flex vertical center',
|
||||||
html: {data: {controller: 'form', action: 'keydown->form#processKey',
|
html: {data: {controller: 'form', action: 'keydown->form#processKey'}} do |form| %>
|
||||||
cancel_enable: 'new_measurement_link',
|
|
||||||
cancel_show: 'no_items'}} do |form| %>
|
|
||||||
|
|
||||||
<table class="items-table center">
|
<table class="items-table center">
|
||||||
<tbody id="readouts">
|
<tbody id="readouts">
|
||||||
@@ -36,6 +34,6 @@
|
|||||||
<div class="flex reverse">
|
<div class="flex reverse">
|
||||||
<%= form.button id: :create_measurement_button, disabled: true -%>
|
<%= form.button id: :create_measurement_button, disabled: true -%>
|
||||||
<%= image_link_to t(:cancel), "close-outline", measurements_path, name: :cancel,
|
<%= image_link_to t(:cancel), "close-outline", measurements_path, name: :cancel,
|
||||||
class: 'dangerous', data: {action: 'click->form#cancel'} %>
|
class: 'dangerous', onclick: render_turbo_stream('form_close') %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
4
app/views/measurements/_form_close.html.erb
Normal file
4
app/views/measurements/_form_close.html.erb
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<%= turbo_stream.update :flashes %>
|
||||||
|
<%= turbo_stream.remove :measurement_form %>
|
||||||
|
<%= turbo_stream.show :no_items -%>
|
||||||
|
<%= turbo_stream.enable :new_measurement_link -%>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
<td class="flex">
|
<td class="flex">
|
||||||
<%= form.button %>
|
<%= form.button %>
|
||||||
<%= image_link_to t(:cancel), "close-outline", quantities_path, class: 'dangerous',
|
<%= image_link_to t(:cancel), "close-outline", quantities_path, class: 'dangerous',
|
||||||
name: :cancel, data: {action: 'click->form#cancel'} %>
|
name: :cancel, onclick: render_turbo_stream('form_close', {row: row}) %>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
2
app/views/quantities/_form_close.html.erb
Normal file
2
app/views/quantities/_form_close.html.erb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<%= turbo_stream.close_form row %>
|
||||||
|
<%= turbo_stream.update :flashes %>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<td class="flex">
|
<td class="flex">
|
||||||
<%= form.button %>
|
<%= form.button %>
|
||||||
<%= image_link_to t(:cancel), "close-outline", units_path, class: 'dangerous',
|
<%= image_link_to t(:cancel), "close-outline", units_path, class: 'dangerous',
|
||||||
name: :cancel, data: {action: 'click->form#cancel'} %>
|
name: :cancel, onclick: render_turbo_stream('form_close', {row: row}) %>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
2
app/views/units/_form_close.html.erb
Normal file
2
app/views/units/_form_close.html.erb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<%= turbo_stream.close_form row %>
|
||||||
|
<%= turbo_stream.update :flashes %>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# Pin npm packages by running ./bin/importmap
|
# Pin npm packages by running ./bin/importmap
|
||||||
|
|
||||||
pin "application", preload: true
|
pin "application", preload: true
|
||||||
|
pin "element_helpers"
|
||||||
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
|
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
|
||||||
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
|
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
|
||||||
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
|
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
|
||||||
|
|||||||
Reference in New Issue
Block a user