, Correçoes UX consolidaçoes e de backa-end
This commit is contained in:
50
app/javascript/controllers/selecao_lote_controller.js
Normal file
50
app/javascript/controllers/selecao_lote_controller.js
Normal file
@@ -0,0 +1,50 @@
|
||||
import { Controller } from "@hotwired/stimulus"
|
||||
|
||||
// Seleção em massa da lista de consolidações (?visao=lista): marca várias e
|
||||
// arquiva de uma vez.
|
||||
//
|
||||
// POR QUE ELE É TÃO PEQUENO: o formulário é HTML de verdade — os checkboxes
|
||||
// carregam `name="ids[]"` e `form="form-arquivar-lote"`, e o botão é um submit
|
||||
// comum. Este controller só cuida do CONFORTO (marcar todas, contar, desabilitar
|
||||
// quando não há nada marcado). Se o JS não carregar — e já carregou 404 em
|
||||
// produção, ver README de 28/08/2026 — marcar na mão e enviar continua
|
||||
// funcionando, e o botão continua habilitado porque quem desabilita é ele.
|
||||
//
|
||||
// "Selecionar todas" marca TODAS as da lista filtrada, inclusive as que o
|
||||
// carrossel escondeu na página seguinte: o carrossel só põe a classe `hidden`,
|
||||
// os campos continuam no DOM e são enviados. É o que se espera de "em lote" —
|
||||
// e o contador diz o número, então não há surpresa no envio.
|
||||
export default class extends Controller {
|
||||
static targets = ["todos", "item", "contador", "botao"]
|
||||
|
||||
connect() {
|
||||
this.atualizar()
|
||||
}
|
||||
|
||||
alternarTodos() {
|
||||
this.itemTargets.forEach((c) => { c.checked = this.todosTarget.checked })
|
||||
this.atualizar()
|
||||
}
|
||||
|
||||
atualizar() {
|
||||
const marcados = this.itemTargets.filter((c) => c.checked).length
|
||||
const total = this.itemTargets.length
|
||||
|
||||
if (this.hasTodosTarget) {
|
||||
this.todosTarget.checked = total > 0 && marcados === total
|
||||
// Estado "algumas": o quadradinho vira traço em vez de mentir que está
|
||||
// tudo (ou nada) marcado.
|
||||
this.todosTarget.indeterminate = marcados > 0 && marcados < total
|
||||
}
|
||||
|
||||
if (this.hasContadorTarget) {
|
||||
this.contadorTarget.textContent =
|
||||
marcados === 0 ? "Marque as que quer arquivar"
|
||||
: `${marcados} de ${total} selecionada${marcados > 1 ? "s" : ""}`
|
||||
this.contadorTarget.classList.toggle("text-gray-500", marcados === 0)
|
||||
this.contadorTarget.classList.toggle("text-white", marcados > 0)
|
||||
}
|
||||
|
||||
if (this.hasBotaoTarget) this.botaoTarget.disabled = marcados === 0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user