Ajustes de UX
This commit is contained in:
@@ -15,11 +15,12 @@ class OperacoesDashboardController < ApplicationController
|
||||
@operacoes_agrupadas = Operacao.agrupadas_por_mes
|
||||
@tabelas_validas = Operacao.nomes_validos
|
||||
@filtros, @chips = cross_filtros
|
||||
@data_filtro = parse_data(params[:f_data]) # clique no gráfico "Entregas por Dia"
|
||||
|
||||
case @modo
|
||||
when 'global'
|
||||
# Global: agrega TODAS as operações dentro da faixa de datas escolhida.
|
||||
@metricas = montar(@tabelas_validas, inicio: @periodo_inicio, fim: @periodo_fim, filtros: @filtros)
|
||||
@metricas = montar(@tabelas_validas, inicio: @periodo_inicio, fim: @periodo_fim, filtros: @filtros, data: @data_filtro)
|
||||
when 'comparar'
|
||||
# Comparar: cada operação inteira (sem filtro de data — só vale no Global).
|
||||
@op_a = Operacao.sanitizar([params[:op_a]]).first || @tabelas_validas[0]
|
||||
@@ -29,25 +30,29 @@ class OperacoesDashboardController < ApplicationController
|
||||
else
|
||||
# Operação única: a operação inteira (a data vem dos próprios dados).
|
||||
@operacao = Operacao.sanitizar([params[:operacao]]).first || @tabelas_validas.first
|
||||
@metricas = montar([@operacao], filtros: @filtros) if @operacao
|
||||
@metricas = montar([@operacao], filtros: @filtros, data: @data_filtro) if @operacao
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def montar(tabelas, inicio: nil, fim: nil, filtros: {})
|
||||
Analytics::OperacaoMetricas.new(tabelas: tabelas, inicio: inicio, fim: fim, filtros: filtros)
|
||||
def montar(tabelas, inicio: nil, fim: nil, filtros: {}, data: nil)
|
||||
Analytics::OperacaoMetricas.new(tabelas: tabelas, inicio: inicio, fim: fim, filtros: filtros, data: data)
|
||||
end
|
||||
|
||||
# Cross-filter por clique nas tabelas. Cada param vira um filtro de coluna e um
|
||||
# "chip" removível na tela. Retorna [filtros (coluna=>valor), chips (p/ a view)].
|
||||
CROSS = {
|
||||
'f_driver' => { coluna: 'driver', rotulo: 'Motorista' },
|
||||
'f_sts' => { coluna: 'contact_name', rotulo: 'Unidade' },
|
||||
'f_status' => { coluna: 'status_gade', rotulo: 'Status' },
|
||||
'f_obs' => { coluna: 'observation', rotulo: 'Observação' }
|
||||
'f_driver' => { coluna: 'driver', rotulo: 'Motorista' },
|
||||
'f_sts' => { coluna: 'contact_name', rotulo: 'Unidade' },
|
||||
'f_status' => { coluna: 'status_gade', rotulo: 'Status' },
|
||||
'f_obs' => { coluna: 'observation', rotulo: 'Observação' },
|
||||
'f_resultado' => { coluna: 'status', rotulo: 'Resultado' }
|
||||
}.freeze
|
||||
|
||||
# Rótulos amigáveis para o filtro de Resultado (clique no donut "Insucessos %").
|
||||
RESULTADO_LABEL = { 'completed' => 'Completas', 'failed' => 'Falhas' }.freeze
|
||||
|
||||
def cross_filtros
|
||||
filtros = {}
|
||||
chips = []
|
||||
@@ -55,7 +60,12 @@ class OperacoesDashboardController < ApplicationController
|
||||
valor = params[param].to_s.strip
|
||||
next if valor.empty?
|
||||
filtros[cfg[:coluna]] = valor
|
||||
chips << { param: param, valor: valor, rotulo: cfg[:rotulo] }
|
||||
display = param == 'f_resultado' ? (RESULTADO_LABEL[valor] || valor) : valor
|
||||
chips << { param: param, valor: valor, display: display, rotulo: cfg[:rotulo] }
|
||||
end
|
||||
# Filtro por DIA (clique no gráfico "Entregas por Dia") — tratado à parte (data).
|
||||
if (dia = parse_data(params[:f_data]))
|
||||
chips << { param: 'f_data', valor: params[:f_data].to_s, display: dia.strftime('%d/%m/%Y'), rotulo: 'Dia' }
|
||||
end
|
||||
[filtros, chips]
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user