diff --git a/Imagens para correção /Imagem colada (13).png b/Imagens para correção /Imagem colada (13).png new file mode 100644 index 0000000..c58c218 Binary files /dev/null and b/Imagens para correção /Imagem colada (13).png differ diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1375b63..925ecee 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -57,6 +57,7 @@ module ApplicationHelper when 'gerente' then { cor: 'bg-orange-800 text-white' } when 'operador' then { cor: 'bg-gray-700 text-white' } when 'motorista' then { cor: 'bg-gray-900 text-orange-400 border border-orange-500' } + when 'externo' then { cor: 'bg-blue-900 text-blue-200 border border-blue-500' } else { cor: 'bg-gray-800 text-gray-400' } end label = User::ROLES_LABEL[role.to_s] || role.to_s.humanize diff --git a/app/models/user.rb b/app/models/user.rb index 22738ec..1b58b5e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,13 +7,16 @@ class User < ApplicationRecord :validatable # ── Roles ────────────────────────────────────────────────── - enum role: { admin: 0, gerente: 1, operador: 2, motorista: 3 } + # externo: acesso somente-leitura ao dashboard (ex.: gerências de outras áreas + # que só precisam visualizar os indicadores). Login normal por e-mail/senha. + enum role: { admin: 0, gerente: 1, operador: 2, motorista: 3, externo: 4 } ROLES_LABEL = { 'admin' => 'Administrador', 'gerente' => 'Gerente', 'operador' => 'Operador', - 'motorista' => 'Motorista' + 'motorista' => 'Motorista', + 'externo' => 'Externo (só dashboard)' }.freeze # ── Validações ────────────────────────────────────────────── diff --git a/app/views/dashboard/index.html.erb b/app/views/dashboard/index.html.erb index abafc9e..d475d47 100644 --- a/app/views/dashboard/index.html.erb +++ b/app/views/dashboard/index.html.erb @@ -441,11 +441,19 @@ String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0'); + // Os valores vêm em ISO (YYYY-MM-DD), mas o dateFormat exibido é d/m/Y. + // Convertendo para Date local antes evita o flatpickr interpretar errado + // (era a causa da caixa mostrar uma data solta em vez do período). + const parseISO = (s) => { + const [y, m, d] = s.split('-').map(Number); + return new Date(y, m - 1, d); + }; + flatpickr(input, { mode: 'range', - locale: 'pt', + locale: Object.assign({}, flatpickr.l10ns.pt, { rangeSeparator: ' até ' }), dateFormat: 'd/m/Y', - defaultDate: [inicio, fim], + defaultDate: [parseISO(inicio), parseISO(fim)], maxDate: 'today', onClose: function (selectedDates) { if (selectedDates.length === 0) return; diff --git a/app/views/layouts/_navbar.html.erb b/app/views/layouts/_navbar.html.erb index f1004cc..e365a80 100644 --- a/app/views/layouts/_navbar.html.erb +++ b/app/views/layouts/_navbar.html.erb @@ -25,6 +25,7 @@ <%= current_user.admin? ? 'bg-orange-500 text-black' : current_user.gerente? ? 'bg-orange-800 text-white' : current_user.operador? ? 'bg-gray-700 text-white' : + current_user.externo? ? 'bg-blue-900 text-blue-200 border border-blue-500' : 'bg-gray-900 text-orange-400 border border-orange-500' %>"> <%= current_user.role_label %> @@ -33,9 +34,13 @@ <%# Navegação %>