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