Files
Reem-Notas/app/views/admin/perfis_acesso/_form.html.erb

84 lines
4.4 KiB
Plaintext

<%# app/views/admin/perfis_acesso/_form.html.erb
O ADM marca o que o perfil enxerga. As caixas vêm agrupadas por área do
catálogo (Permissao.por_grupo) e cada uma traz a descrição do EFEITO real —
"Registrar pagamento" sem a linha de baixo não diz se inclui estornar. %>
<%= form_with model: [:admin, perfil], url: (perfil.persisted? ? admin_perfil_path(perfil) : admin_perfis_path),
data: { turbo: false }, class: 'space-y-6' do |f| %>
<% if perfil.errors.any? %>
<div class="bg-red-500/10 border border-red-500/30 rounded-xl p-4">
<p class="text-red-400 font-semibold mb-1"><%= icone :erro, cor: 'text-red-400' %> Não foi possível salvar</p>
<ul class="text-red-300 text-sm list-disc list-inside space-y-0.5">
<% perfil.errors.full_messages.each do |msg| %><li><%= msg %></li><% end %>
</ul>
</div>
<% end %>
<%# ── Identificação ──────────────────────────────────── %>
<div class="bg-[#1a1a1a] border border-[#2a2a2a] rounded-2xl p-6 space-y-4">
<div>
<%= f.label :nome, 'Nome do perfil', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
<%= f.text_field :nome, required: true, placeholder: 'Ex.: Gerente sem configurações',
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white
focus:outline-none focus:border-[#f97316]' %>
</div>
<div>
<%= f.label :descricao, 'Para que serve', class: 'block text-sm font-medium text-gray-300 mb-1.5' %>
<%= f.text_field :descricao, placeholder: 'Quem usa este perfil e por quê',
class: 'w-full px-4 py-3 bg-[#0a0a0a] border border-white/10 rounded-xl text-white
focus:outline-none focus:border-[#f97316]' %>
</div>
<div class="flex items-center justify-between">
<div>
<%= f.label :ativo, 'Perfil ativo', class: 'block text-sm font-medium text-gray-300' %>
<p class="text-gray-500 text-xs mt-0.5">Desativado, quem estiver nele perde os acessos marcados aqui.</p>
</div>
<%= f.check_box :ativo, class: 'w-5 h-5 accent-orange-500' %>
</div>
<% if perfil.sistema? %>
<p class="text-amber-400 text-sm">
<%= icone :alerta, cor: 'text-amber-400' %> Perfil que vem com o sistema: pode ser editado e desativado, mas não excluído.
</p>
<% end %>
</div>
<%# ── Permissões ─────────────────────────────────────────
O campo vazio antes das caixas é obrigatório: sem ele, desmarcar TUDO faria
o parâmetro sumir do POST e o controller entenderia "não mexeu". %>
<%= hidden_field_tag 'perfil_acesso[permissoes][]', '' %>
<% marcadas = perfil.permissoes_validas %>
<% Permissao.por_grupo.each do |grupo, itens| %>
<div class="bg-[#1a1a1a] border border-[#2a2a2a] rounded-2xl overflow-hidden">
<div class="flex items-center justify-between gap-3 px-5 py-3 bg-[#0f0f0f] border-b border-[#2a2a2a]">
<h2 class="text-white font-bold"><%= Permissao.grupo_label(grupo) %></h2>
<span class="text-gray-500 text-xs"><%= itens.count { |chave, _| marcadas.include?(chave) } %> de <%= itens.size %></span>
</div>
<div class="divide-y divide-[#2a2a2a]">
<% itens.each do |chave, cfg| %>
<label class="flex items-start gap-3 px-5 py-4 cursor-pointer hover:bg-[#222] min-h-[56px]">
<%= check_box_tag 'perfil_acesso[permissoes][]', chave, marcadas.include?(chave),
id: "perm-#{chave.tr('.', '-')}", class: 'mt-1 w-5 h-5 accent-orange-500 shrink-0' %>
<span class="min-w-0">
<span class="block text-white font-semibold"><%= cfg[:label] %></span>
<span class="block text-gray-400 text-sm mt-0.5"><%= cfg[:descricao] %></span>
</span>
</label>
<% end %>
</div>
</div>
<% end %>
<div class="flex flex-wrap gap-3">
<%= f.submit perfil.persisted? ? 'Salvar perfil' : 'Criar perfil',
class: 'bg-orange-500 hover:bg-orange-600 text-black font-bold px-6 py-3.5 rounded-xl
min-h-[48px] cursor-pointer' %>
<%= link_to 'Cancelar', admin_perfis_path,
class: 'px-5 py-3.5 text-gray-300 hover:text-white border border-[#2a2a2a] rounded-xl min-h-[48px] flex items-center' %>
</div>
<% end %>