, Correçoes UX consolidaçoes e de backa-end

This commit is contained in:
2026-08-28 16:38:51 -03:00
parent b6fe6f796f
commit bfa474262f
7 changed files with 290 additions and 40 deletions

View 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
}
}