Modificando o Filtro de Operação
This commit is contained in:
BIN
Imagens para implantação /Imagem colada (15).png
Normal file
BIN
Imagens para implantação /Imagem colada (15).png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
@@ -35,6 +35,7 @@ class DashboardController < ApplicationController
|
|||||||
def carregar_dados_dashboard
|
def carregar_dados_dashboard
|
||||||
# Filtro de operação (multi-seleção) — aplicado a todo o dashboard.
|
# Filtro de operação (multi-seleção) — aplicado a todo o dashboard.
|
||||||
@operacoes = Operacao.todas
|
@operacoes = Operacao.todas
|
||||||
|
@operacoes_agrupadas = Operacao.agrupadas_por_mes
|
||||||
@operacao_filtro = Operacao.sanitizar(params[:operacoes])
|
@operacao_filtro = Operacao.sanitizar(params[:operacoes])
|
||||||
|
|
||||||
# Entregas do período (tabela read-only) — restritas à conta Gade
|
# Entregas do período (tabela read-only) — restritas à conta Gade
|
||||||
|
|||||||
@@ -42,6 +42,31 @@ class Operacao
|
|||||||
tabela.to_s.delete_prefix(PREFIXO).tr('_', ' ').strip.titleize
|
tabela.to_s.delete_prefix(PREFIXO).tr('_', ' ').strip.titleize
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Abreviações de mês usadas nos nomes das tabelas (gade_entregas_emad_fev_2026).
|
||||||
|
MESES = {
|
||||||
|
'jan' => [1, 'Janeiro'], 'fev' => [2, 'Fevereiro'], 'mar' => [3, 'Março'],
|
||||||
|
'abr' => [4, 'Abril'], 'mai' => [5, 'Maio'], 'jun' => [6, 'Junho'],
|
||||||
|
'jul' => [7, 'Julho'], 'ago' => [8, 'Agosto'], 'set' => [9, 'Setembro'],
|
||||||
|
'out' => [10, 'Outubro'], 'nov' => [11, 'Novembro'], 'dez' => [12, 'Dezembro']
|
||||||
|
}.freeze
|
||||||
|
|
||||||
|
# Agrupa as operações por mês/ano (extraído do nome da tabela), do mais recente
|
||||||
|
# para o mais antigo; as que não têm mês reconhecível caem em "Outras".
|
||||||
|
# Retorna um Array de [titulo_do_grupo, [{ tabela:, label: }, ...]].
|
||||||
|
def agrupadas_por_mes
|
||||||
|
grupos = Hash.new { |h, k| h[k] = [] }
|
||||||
|
ordem = {}
|
||||||
|
|
||||||
|
todas.each do |op|
|
||||||
|
g = grupo_de(op[:tabela])
|
||||||
|
grupos[g[:titulo]] << { tabela: op[:tabela], label: g[:item] }
|
||||||
|
ordem[g[:titulo]] ||= g[:ordem]
|
||||||
|
end
|
||||||
|
|
||||||
|
grupos.each_value { |itens| itens.sort_by! { |i| i[:label] } }
|
||||||
|
grupos.sort_by { |titulo, _| ordem[titulo] }.map { |titulo, itens| [titulo, itens] }
|
||||||
|
end
|
||||||
|
|
||||||
# Dados agregados das entregas das operações informadas, para pré-preencher o
|
# Dados agregados das entregas das operações informadas, para pré-preencher o
|
||||||
# formulário de nova consolidação. Une as NFs de todas as tabelas válidas.
|
# formulário de nova consolidação. Une as NFs de todas as tabelas válidas.
|
||||||
def dados(tabelas)
|
def dados(tabelas)
|
||||||
@@ -59,6 +84,27 @@ class Operacao
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# Extrai { titulo:, item:, ordem: } do nome da tabela.
|
||||||
|
# Ex.: gade_entregas_emad_fev_2026 → titulo "Fevereiro 2026", item "Emad".
|
||||||
|
def grupo_de(tabela)
|
||||||
|
tokens = tabela.to_s.delete_prefix(PREFIXO).split('_')
|
||||||
|
idx = tokens.index { |t| MESES.key?(t.downcase) }
|
||||||
|
|
||||||
|
if idx
|
||||||
|
num, nome = MESES[tokens[idx].downcase]
|
||||||
|
ano = tokens[idx + 1] =~ /\A\d{4}\z/ ? tokens[idx + 1].to_i : nil
|
||||||
|
resto = (tokens[0...idx] + tokens[(ano ? idx + 2 : idx + 1)..]).join(' ').strip
|
||||||
|
{
|
||||||
|
titulo: ano ? "#{nome} #{ano}" : nome,
|
||||||
|
item: resto.presence&.titleize || nome,
|
||||||
|
# mais recente primeiro; sem ano vai pro fim do bloco do mês
|
||||||
|
ordem: [-(ano || 0), -num]
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ titulo: 'Outras', item: label(tabela), ordem: [1, 0] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def vazio
|
def vazio
|
||||||
{ motoristas: [], veiculos: [], inicio: nil, fim: nil }
|
{ motoristas: [], veiculos: [], inicio: nil, fim: nil }
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -37,8 +37,19 @@
|
|||||||
<summary class="cursor-pointer list-none pl-4 pr-4 py-2.5 bg-[#1a1a1a] border border-white/10 rounded-xl text-white text-sm whitespace-nowrap hover:border-orange-500">
|
<summary class="cursor-pointer list-none pl-4 pr-4 py-2.5 bg-[#1a1a1a] border border-white/10 rounded-xl text-white text-sm whitespace-nowrap hover:border-orange-500">
|
||||||
🗂️ <%= @operacao_filtro.present? ? "#{@operacao_filtro.size} operação(ões)" : 'Todas as operações' %>
|
🗂️ <%= @operacao_filtro.present? ? "#{@operacao_filtro.size} operação(ões)" : 'Todas as operações' %>
|
||||||
</summary>
|
</summary>
|
||||||
<div class="absolute right-0 mt-2 z-30 w-72 max-h-72 overflow-y-auto bg-[#1a1a1a] border border-white/10 rounded-xl p-2 shadow-xl">
|
<div class="absolute right-0 mt-2 z-30 w-72 max-h-80 overflow-y-auto bg-[#1a1a1a] border border-white/10 rounded-xl p-2 shadow-xl">
|
||||||
<% @operacoes.each do |op| %>
|
<%# Limpar seleção — recarrega o dashboard sem filtro de operação %>
|
||||||
|
<div class="flex items-center justify-between px-2 pb-2 mb-1 border-b border-white/10">
|
||||||
|
<span class="text-xs uppercase tracking-wider text-gray-400">Operações</span>
|
||||||
|
<% if @operacao_filtro.present? %>
|
||||||
|
<%= link_to '✕ Limpar', dashboard_path(inicio: @periodo_inicio.strftime('%Y-%m-%d'), fim: @periodo_fim.strftime('%Y-%m-%d')),
|
||||||
|
data: { turbo: false }, class: 'text-xs text-orange-400 hover:text-orange-300 font-semibold' %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% @operacoes_agrupadas.each do |titulo, ops| %>
|
||||||
|
<p class="px-2 pt-2 pb-1 text-xs font-bold uppercase tracking-wider text-gray-400"><%= titulo %></p>
|
||||||
|
<% ops.each do |op| %>
|
||||||
<label class="flex items-center gap-2 text-white text-sm hover:bg-[#0a0a0a] rounded px-2 py-2 cursor-pointer">
|
<label class="flex items-center gap-2 text-white text-sm hover:bg-[#0a0a0a] rounded px-2 py-2 cursor-pointer">
|
||||||
<input type="checkbox" name="operacoes[]" value="<%= op[:tabela] %>"
|
<input type="checkbox" name="operacoes[]" value="<%= op[:tabela] %>"
|
||||||
<%= 'checked' if @operacao_filtro.include?(op[:tabela]) %>
|
<%= 'checked' if @operacao_filtro.include?(op[:tabela]) %>
|
||||||
@@ -46,6 +57,7 @@
|
|||||||
<%= op[:label] %>
|
<%= op[:label] %>
|
||||||
</label>
|
</label>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
Reference in New Issue
Block a user