51 lines
2.0 KiB
JavaScript
51 lines
2.0 KiB
JavaScript
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
|
|
}
|
|
}
|