Implantação da criação de romaneios
This commit is contained in:
@@ -63,11 +63,17 @@
|
||||
</div>
|
||||
|
||||
<div class="space-y-2 pt-1">
|
||||
<%# Prévia sob demanda: o PDF só é gerado quando alguém pede para ver. %>
|
||||
<button type="button" data-action="romaneio#abrirPreview"
|
||||
class="w-full min-h-[48px] flex items-center justify-center gap-2 bg-[#1a1a1a]
|
||||
hover:bg-[#242424] text-white border border-white/10 rounded-xl">
|
||||
<%= icone :visualizar, cor: nil %> Ver prévia do PDF
|
||||
</button>
|
||||
<%= link_to pdf_admin_romaneio_path(@romaneio, veiculo: @veiculo),
|
||||
target: '_blank', rel: 'noopener',
|
||||
class: 'w-full min-h-[48px] flex items-center justify-center gap-2 bg-[#1a1a1a]
|
||||
hover:bg-[#242424] text-white border border-white/10 rounded-xl' do %>
|
||||
<%= icone :visualizar, cor: nil %> PDF deste veículo
|
||||
<%= icone :baixar, cor: nil %> PDF deste veículo
|
||||
<% end %>
|
||||
<%= link_to pdf_admin_romaneio_path(@romaneio),
|
||||
class: 'w-full min-h-[48px] flex items-center justify-center gap-2 bg-[#f97316]
|
||||
|
||||
@@ -73,7 +73,10 @@
|
||||
<select name="operacao_tabela"
|
||||
class="w-full bg-[#1a1a1a] border border-white/10 rounded-xl px-3 py-3 text-white
|
||||
focus:outline-none focus:border-orange-500 min-h-[48px]">
|
||||
<option value="">Sem operação — só o que o plano trouxer</option>
|
||||
<%# "Deixe em branco" e não "Sem operação": deixar vazio agora tenta
|
||||
deduzir a operação pelo nome do PLANO, e é esse o caminho normal.
|
||||
Escolher aqui é o override para quando a dedução não acerta. %>
|
||||
<option value="">Deduzir pelo nome do plano</option>
|
||||
<% @operacoes_agrupadas.each do |titulo, ops| %>
|
||||
<optgroup label="<%= titulo %>">
|
||||
<% ops.each do |op| %>
|
||||
@@ -88,9 +91,13 @@
|
||||
<label class="block text-sm font-medium text-gray-300 mb-1.5">
|
||||
PLANO <span class="text-gray-500 font-normal">(canto direito do PDF)</span>
|
||||
</label>
|
||||
<input type="text" name="rotulo_plano" placeholder="Ex.: EMAD 09.2026"
|
||||
<input type="text" name="rotulo_plano" placeholder="Ex.: ENTREGAS EMAD 09.2026"
|
||||
class="w-full bg-[#1a1a1a] border border-white/10 rounded-xl px-3 py-3 text-white
|
||||
placeholder-gray-600 focus:outline-none focus:border-orange-500 min-h-[48px]">
|
||||
<p class="text-xs text-gray-500 mt-1.5">
|
||||
Cole o nome do plano como está no SimpliRoute — é por ele que a
|
||||
operação do mês (quem é <strong>NOVO</strong>) é encontrada.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<%# app/views/admin/romaneios/show.html.erb
|
||||
Editor do romaneio: tabela editável à esquerda, o PDF REAL à direita.
|
||||
Editor do romaneio: veículos à esquerda, tabela editável à direita, e o PDF
|
||||
REAL numa sobreposição aberta sob demanda.
|
||||
|
||||
A prévia é um <iframe> de mesma origem, e isso não é preferência: o CSP deste
|
||||
app está em modo enforcing com `object_src :none` (config/initializers/
|
||||
@@ -12,7 +13,7 @@
|
||||
data-romaneio-pdf-url-value="<%= pdf_admin_romaneio_path(@romaneio) %>"
|
||||
data-romaneio-veiculo-value="<%= @veiculo %>">
|
||||
|
||||
<div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3">
|
||||
<div class="flex flex-col sm:flex-row sm:flex-wrap sm:items-start sm:justify-between gap-3">
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold text-white">
|
||||
Romaneio de <%= l @romaneio.planned_date, format: '%d/%m/%Y' %>
|
||||
@@ -25,6 +26,22 @@
|
||||
<%= "em #{l @romaneio.importado_em, format: '%d/%m %H:%M'}" if @romaneio.importado_em %>
|
||||
</p>
|
||||
</div>
|
||||
<%# NOVOS x RECORRENTES: o mesmo aviso que o programa antigo dava numa caixa
|
||||
de diálogo depois de aplicar o status. Fica ao lado do título porque é a
|
||||
primeira coisa a conferir — "0 novos" quase sempre significa importação
|
||||
sem operação vinculada, e o aviso azul abaixo explica o que fazer. %>
|
||||
<% contagem = @romaneio.contagem_aparelho %>
|
||||
<div class="flex items-center gap-2 text-sm">
|
||||
<span class="px-3 py-1.5 rounded-xl border
|
||||
<%= contagem[:novos].positive? ? 'bg-green-600/15 border-green-500/40 text-green-300'
|
||||
: 'bg-amber-900/20 border-amber-500/40 text-amber-200' %>">
|
||||
<strong><%= contagem[:novos] %></strong> com aparelho (NOVOS)
|
||||
</span>
|
||||
<span class="px-3 py-1.5 rounded-xl bg-white/5 border border-white/10 text-gray-300">
|
||||
<strong><%= contagem[:recorrentes] %></strong> recorrentes
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<%= link_to rotulo(:baixar, 'Baixar todos'),
|
||||
pdf_admin_romaneio_path(@romaneio),
|
||||
@@ -51,46 +68,55 @@
|
||||
<% else %>
|
||||
<%= render 'avisos' %>
|
||||
|
||||
<%# Três zonas, como no programa que a operação já usava: VEÍCULOS à esquerda,
|
||||
edição no meio, PDF de verdade à direita. Em telas médias a prévia desce
|
||||
para baixo (duas colunas); no celular vira uma coluna só. %>
|
||||
<div class="grid grid-cols-1 lg:grid-cols-[minmax(0,260px)_minmax(0,1fr)]
|
||||
xl:grid-cols-[minmax(0,260px)_minmax(0,1fr)_minmax(0,520px)] gap-5 items-start">
|
||||
<%# Duas zonas na tela: VEÍCULOS e a edição. A prévia saiu do fluxo e virou
|
||||
sobreposição sob demanda (botão "Ver prévia") — antes o <iframe> era montado
|
||||
em TODO carregamento, e cada montagem gerava um PDF no servidor só para
|
||||
ficar num canto que o operador nem sempre olha. Agora o PDF só é gerado
|
||||
quando alguém pede para ver. %>
|
||||
<div class="grid grid-cols-1 lg:grid-cols-[minmax(0,260px)_minmax(0,1fr)] gap-5 items-start">
|
||||
<div class="lg:sticky lg:top-4">
|
||||
<%= render 'veiculos' %>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4 lg:col-span-1">
|
||||
<div class="space-y-4">
|
||||
<%= render 'controles' %>
|
||||
<%= render 'tabela', linhas: @linhas %>
|
||||
<%= render 'removidas', linhas: @removidas %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%# Prévia — no celular vira um bloco recolhido: 6 colunas em tela pequena
|
||||
exigiriam zoom, e o que importa ali é editar, não conferir o layout. %>
|
||||
<div class="lg:col-span-2 xl:col-span-1 xl:sticky xl:top-4">
|
||||
<details class="xl:hidden bg-[#111] border border-white/5 rounded-2xl p-4 mb-4">
|
||||
<summary class="cursor-pointer text-white font-medium select-none min-h-[44px] flex items-center">
|
||||
<%= icone :visualizar %> Ver prévia do PDF
|
||||
</summary>
|
||||
<%= link_to 'Abrir o PDF deste veículo',
|
||||
pdf_admin_romaneio_path(@romaneio, veiculo: @veiculo),
|
||||
class: 'block mt-3 text-orange-400 hover:text-orange-300', target: '_blank', rel: 'noopener' %>
|
||||
</details>
|
||||
<%# ── Prévia em sobreposição ──────────────────────────────────────────────
|
||||
Fica FORA da grade, ocupando a tela inteira quando aberta. `hidden` no
|
||||
markup e o src só preenchido na abertura: um iframe com src carrega
|
||||
mesmo escondido, o que anularia a economia.
|
||||
|
||||
<div class="hidden xl:block bg-[#111] border border-white/5 rounded-2xl p-4">
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<h2 class="text-white font-semibold text-sm">Prévia — <%= @veiculo %></h2>
|
||||
<button type="button" data-action="romaneio#atualizarPreview"
|
||||
class="text-xs text-gray-400 hover:text-white px-3 py-2 rounded-lg hover:bg-white/5">
|
||||
<%= icone :restaurar, tamanho: 'w-4 h-4' %> Atualizar prévia
|
||||
</button>
|
||||
<iframe> e não <embed>/<object>: o CSP está em enforcing com
|
||||
`object_src :none`, e sem `frame_src` ele cai em `default_src :self` —
|
||||
o iframe de mesma origem passa, os outros dois não. %>
|
||||
<div data-romaneio-target="overlay" hidden
|
||||
data-action="click->romaneio#fecharPorFora keydown.esc@window->romaneio#fecharPreview"
|
||||
class="fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-6
|
||||
bg-black/70 backdrop-blur-sm">
|
||||
<div class="w-full max-w-6xl h-[92vh] flex flex-col gap-3"
|
||||
data-romaneio-target="caixaPreview">
|
||||
<div class="flex items-center justify-between gap-3">
|
||||
<h2 class="text-white font-semibold">
|
||||
Prévia — <span data-romaneio-target="tituloPreview"><%= @veiculo %></span>
|
||||
</h2>
|
||||
<div class="flex items-center gap-2">
|
||||
<%= link_to 'Abrir em outra aba',
|
||||
pdf_admin_romaneio_path(@romaneio, veiculo: @veiculo),
|
||||
target: '_blank', rel: 'noopener',
|
||||
class: 'text-sm text-gray-300 hover:text-white px-3 py-2 rounded-lg hover:bg-white/10' %>
|
||||
<button type="button" data-action="romaneio#fecharPreview"
|
||||
aria-label="Fechar prévia"
|
||||
class="min-w-[48px] min-h-[48px] rounded-xl bg-[#1a1a1a] border border-white/10
|
||||
text-white hover:bg-[#242424]">✕</button>
|
||||
</div>
|
||||
<iframe data-romaneio-target="preview"
|
||||
src="<%= pdf_admin_romaneio_path(@romaneio, veiculo: @veiculo) %>"
|
||||
class="w-full h-[78vh] rounded-xl border border-white/10 bg-white"
|
||||
title="Pré-visualização do romaneio do veículo <%= @veiculo %>"></iframe>
|
||||
</div>
|
||||
<iframe data-romaneio-target="preview"
|
||||
class="flex-1 w-full rounded-xl border border-white/10 bg-white"
|
||||
title="Pré-visualização do romaneio"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
Reference in New Issue
Block a user