teste #10

Merged
victor merged 10 commits from teste into main 2026-07-22 11:40:17 -03:00
3 changed files with 44 additions and 27 deletions
Showing only changes of commit 3dbb65efd2 - Show all commits

View File

@@ -24,19 +24,21 @@
<%# basis-40: o nome não pode ser espremido até virar "P…" — se não couber <%# basis-40: o nome não pode ser espremido até virar "P…" — se não couber
com o resto, a linha quebra em vez de esmagar a identificação. %> com o resto, a linha quebra em vez de esmagar a identificação. %>
<div class="min-w-0 flex-1 basis-40"> <div class="min-w-0 flex-1 basis-40">
<h1 class="text-lg lg:text-xl font-bold text-white flex items-center gap-2 truncate"><%= icone :caminhao, espaco: false %> <%= @motorista %></h1> <h1 class="text-xl lg:text-2xl font-bold text-white flex items-center gap-2 truncate"><%= icone :caminhao, espaco: false %> <%= @motorista %></h1>
<p class="text-gray-400 text-xs truncate"><%= @consolidacao.nome %> · <%= l @consolidacao.data_inicio, format: :short %> → <%= l @consolidacao.data_fim, format: :short %></p> <p class="text-gray-400 text-sm truncate"><%= @consolidacao.nome %> · <%= l @consolidacao.data_inicio, format: :short %> → <%= l @consolidacao.data_fim, format: :short %></p>
</div> </div>
<%# Progresso ao lado do título (em vez de um card de 70px só p/ ele). No <%# Progresso ao lado do título (em vez de um card de 70px só p/ ele). No
celular vai para uma linha própria, no fim, para não brigar pelo espaço. %> celular vai para uma linha própria, no fim, para não brigar pelo espaço.
<p class="order-last w-full text-left sm:order-none sm:w-auto sm:shrink-0 sm:text-right text-xs text-gray-300"> Números em branco/negrito: esta é a informação que o ADM confere o tempo
<% if @veiculos_sel.any? %><%= icone :caminhao %> <%= @veiculos_sel.join(', ') %> — <% end %> todo enquanto classifica — compactar não pode custar a leitura dela. %>
<span data-validacao-target="contadorClassificadas"><%= @classificadas %></span>/<span data-validacao-target="contadorTotal"><%= @total_entregas %></span> <p class="order-last w-full text-left sm:order-none sm:w-auto sm:shrink-0 sm:text-right text-sm text-gray-400">
<span class="hidden sm:inline">classificadas</span> <% if @veiculos_sel.any? %><span class="text-gray-300"><%= icone :caminhao %> <%= @veiculos_sel.join(', ') %></span> — <% end %>
<span class="text-white font-semibold"><span data-validacao-target="contadorClassificadas"><%= @classificadas %></span>/<span data-validacao-target="contadorTotal"><%= @total_entregas %></span></span>
classificadas
<span data-validacao-target="manuaisInfo" class="<%= 'hidden' unless @manuais.positive? %> text-blue-400">· <span data-validacao-target="manuaisInfo" class="<%= 'hidden' unless @manuais.positive? %> text-blue-400">·
+<span data-validacao-target="contadorManuais"><%= @manuais %></span> manuais</span> +<span data-validacao-target="contadorManuais"><%= @manuais %></span> manuais</span>
<span class="text-orange-500 font-bold ml-1" data-validacao-target="percentual"></span> <span class="text-orange-500 font-bold ml-1 text-base" data-validacao-target="percentual"></span>
</p> </p>
<%= link_to revisar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista), <%= link_to revisar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: @motorista),
@@ -46,9 +48,9 @@
</div> </div>
<%# Barra com 2 segmentos: laranja = elegíveis classificadas · azul = manuais %> <%# Barra com 2 segmentos: laranja = elegíveis classificadas · azul = manuais %>
<div class="w-full bg-[#0a0a0a] rounded-full h-1.5 flex overflow-hidden mb-2"> <div class="w-full bg-[#0a0a0a] rounded-full h-2 flex overflow-hidden mb-2">
<div data-validacao-target="barra" class="h-1.5 bg-orange-500 transition-all duration-300" style="width: 0%"></div> <div data-validacao-target="barra" class="h-2 bg-orange-500 transition-all duration-300" style="width: 0%"></div>
<div data-validacao-target="barraManuais" class="h-1.5 bg-blue-500 transition-all duration-300" style="width: 0%"></div> <div data-validacao-target="barraManuais" class="h-2 bg-blue-500 transition-all duration-300" style="width: 0%"></div>
</div> </div>
<%# Fechar por veículo — filtra a tela por carro, mostra o estado (pronto/ <%# Fechar por veículo — filtra a tela por carro, mostra o estado (pronto/

View File

@@ -71,28 +71,37 @@
</div> </div>
<%# ── Filtros ──────────────────────────────────────────── %> <%# ── Filtros ──────────────────────────────────────────── %>
<%# Filtros em flex-wrap, NÃO em grade de 6 colunas fixas.
Motivo: os breakpoints do Tailwind (md:, lg:…) enxergam a JANELA, mas o
conteúdo perde 256px para a sidebar (`main.md:ml-64`). A mesma janela de
1280px tem duas larguras conforme o menu esteja aberto ou recolhido, então
`md:grid-cols-6` espremia os campos a ~150px e o texto do botão "Filtrar"
vazava para fora do fundo. Com flex-wrap + largura mínima, cada campo mantém
tamanho legível e a linha quebra sozinha conforme o espaço REAL. %>
<%= form_with url: consolidacoes_path, method: :get, <%= form_with url: consolidacoes_path, method: :get,
class: 'bg-[#1a1a1a] border border-[#2a2a2a] rounded-xl p-4 mb-6 grid grid-cols-1 md:grid-cols-6 gap-3' do |f| %> class: 'bg-[#1a1a1a] border border-[#2a2a2a] rounded-xl p-4 mb-6 flex flex-wrap items-center gap-3' do |f| %>
<%= f.text_field :nome, value: params[:nome], placeholder: 'Buscar por nome…', <%= f.text_field :nome, value: params[:nome], placeholder: 'Buscar por nome…',
class: 'bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5 focus:border-orange-500 focus:outline-none' %> class: 'flex-1 basis-48 min-w-0 bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5 focus:border-orange-500 focus:outline-none' %>
<%= f.select :status, <%= f.select :status,
options_for_select([['Todos os status', ''], ['Rascunho', 'rascunho'], ['Finalizada', 'finalizada']], params[:status]), options_for_select([['Todos os status', ''], ['Rascunho', 'rascunho'], ['Finalizada', 'finalizada']], params[:status]),
{}, class: 'bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %> {}, class: 'flex-1 basis-40 min-w-0 bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %>
<%= f.select :pagamento, <%= f.select :pagamento,
options_for_select([['Pagamento (todos)', ''], ['Pagas', 'pago'], ['Parciais', 'parcial'], ['Pendentes', 'pendente']], params[:pagamento]), options_for_select([['Pagamento (todos)', ''], ['Pagas', 'pago'], ['Parciais', 'parcial'], ['Pendentes', 'pendente']], params[:pagamento]),
{}, class: 'bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %> {}, class: 'flex-1 basis-44 min-w-0 bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %>
<%= f.date_field :inicio, value: params[:inicio], <%= f.date_field :inicio, value: params[:inicio],
class: 'bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %> class: 'flex-1 basis-36 max-w-[13rem] min-w-0 bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %>
<%= f.date_field :fim, value: params[:fim], <%= f.date_field :fim, value: params[:fim],
class: 'bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %> class: 'flex-1 basis-36 max-w-[13rem] min-w-0 bg-[#0a0a0a] border border-[#2a2a2a] text-white rounded-lg px-3 py-2.5' %>
<div class="flex gap-2"> <%# shrink-0 + whitespace-nowrap: os botões nunca são espremidos a ponto de
<%= f.submit 'Filtrar', class: 'flex-1 bg-orange-500 hover:bg-orange-600 text-black font-bold rounded-lg cursor-pointer' %> cortar o texto — se faltar espaço, a linha quebra e eles descem inteiros. %>
<%= link_to 'Limpar', consolidacoes_path, class: 'px-4 py-2.5 text-gray-400 hover:text-white border border-[#2a2a2a] rounded-lg' %> <div class="flex gap-2 shrink-0">
<%= f.submit 'Filtrar', class: 'bg-orange-500 hover:bg-orange-600 text-black font-bold rounded-lg cursor-pointer px-5 py-2.5 whitespace-nowrap' %>
<%= link_to 'Limpar', consolidacoes_path, class: 'px-4 py-2.5 text-gray-400 hover:text-white border border-[#2a2a2a] rounded-lg whitespace-nowrap' %>
</div> </div>
<% end %> <% end %>

View File

@@ -117,15 +117,21 @@
</form> </form>
</div> </div>
<%# CARDS GRANDES — KPIs %> <%# CARDS GRANDES — KPIs
<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-5 gap-4"> auto-fit + minmax em vez de `xl:grid-cols-5`: o breakpoint xl olha a JANELA
(1280px), mas com a sidebar aberta sobram ~960px de conteúdo — 5 colunas de
~176px, e "R$ 82.692,00" em text-4xl era cortado pelo overflow-hidden do
card. Com auto-fit o número de colunas cai sozinho quando o menu está
aberto e sobe quando ele é recolhido, sem depender de breakpoint. %>
<div class="grid grid-cols-[repeat(auto-fit,minmax(13rem,1fr))] gap-4">
<%# Card 1: Valor estimado %> <%# Card 1: Valor estimado — sempre 2 faixas: é o maior número da tela %>
<div class="sm:col-span-2 xl:col-span-1 bg-[#f97316] rounded-2xl p-6 relative overflow-hidden"> <div class="sm:col-span-2 bg-[#f97316] rounded-2xl p-6 relative overflow-hidden">
<div class="absolute inset-0 bg-gradient-to-br from-orange-400/20 to-transparent"></div> <div class="absolute inset-0 bg-gradient-to-br from-orange-400/20 to-transparent"></div>
<div class="relative"> <div class="relative">
<p class="text-orange-100 text-sm font-medium mb-2 flex items-center gap-2"><%= icone :dinheiro, cor: nil, espaco: false %> Valor Estimado</p> <p class="text-orange-100 text-sm font-medium mb-2 flex items-center gap-2"><%= icone :dinheiro, cor: nil, espaco: false %> Valor Estimado</p>
<p class="text-4xl font-black text-white mb-1"> <%# break-words: se ainda faltar espaço, quebra a linha em vez de cortar %>
<p class="text-3xl lg:text-4xl font-black text-white mb-1 break-words">
<%= moeda(@valor_estimado) %> <%= moeda(@valor_estimado) %>
</p> </p>
<p class="text-orange-200 text-sm"> <p class="text-orange-200 text-sm">
@@ -178,7 +184,7 @@
</div> </div>
<%# KPIs FINANCEIROS (consolidações finalizadas, já com filtro de operação) %> <%# KPIs FINANCEIROS (consolidações finalizadas, já com filtro de operação) %>
<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4"> <div class="grid grid-cols-[repeat(auto-fit,minmax(13rem,1fr))] gap-4">
<div class="bg-[#1a1a1a] rounded-2xl border border-white/5 p-6"> <div class="bg-[#1a1a1a] rounded-2xl border border-white/5 p-6">
<p class="text-gray-400 text-sm font-medium mb-2 flex items-center gap-2"><%= icone :dinheiro, espaco: false %> Custo total</p> <p class="text-gray-400 text-sm font-medium mb-2 flex items-center gap-2"><%= icone :dinheiro, espaco: false %> Custo total</p>
<p class="text-3xl font-black text-white"><%= moeda(@fin_custo_total) %></p> <p class="text-3xl font-black text-white"><%= moeda(@fin_custo_total) %></p>
@@ -445,7 +451,7 @@
<% if @por_operacao.any? %> <% if @por_operacao.any? %>
<div class="bg-[#1a1a1a] rounded-2xl border border-white/5 p-6"> <div class="bg-[#1a1a1a] rounded-2xl border border-white/5 p-6">
<h2 class="text-lg font-semibold text-white mb-4 flex items-center gap-2"><%= icone :operacao, espaco: false %> Entregas por Local</h2> <h2 class="text-lg font-semibold text-white mb-4 flex items-center gap-2"><%= icone :operacao, espaco: false %> Entregas por Local</h2>
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3"> <div class="grid grid-cols-[repeat(auto-fit,minmax(9rem,1fr))] gap-3">
<% total_op = @por_operacao.values.sum.to_f %> <% total_op = @por_operacao.values.sum.to_f %>
<% @por_operacao.each do |local, qtd| %> <% @por_operacao.each do |local, qtd| %>
<div class="bg-[#0a0a0a] rounded-xl p-4 border border-white/5 text-center"> <div class="bg-[#0a0a0a] rounded-xl p-4 border border-white/5 text-center">