From b5737a7ee7db65d0ee7ff0d4c1faf08e29896246 Mon Sep 17 00:00:00 2001 From: Emiliano Frascaro Date: Thu, 3 Sep 2026 07:36:48 +0200 Subject: [PATCH] Rende leggibili card, badge e testi mute in tema scuro. Le righe task di oggi restavano crema con testo chiaro; i badge e gli heading senza dark: si perdevano sullo sfondo. Co-authored-by: Cursor --- app/assets/stylesheets/application.css | 22 +++++++ app/helpers/application_helper.rb | 62 +++++++++---------- app/views/dashboard/show.html.erb | 6 +- app/views/imports/preview.html.erb | 2 +- app/views/mailings/dashboard.html.erb | 2 +- app/views/organizations/show.html.erb | 2 +- app/views/shared/_task_list.html.erb | 12 ++-- app/views/tasks/index.html.erb | 4 +- app/views/today/show.html.erb | 4 +- test/controllers/dashboard_controller_test.rb | 10 +++ test/helpers/application_helper_test.rb | 25 ++++++++ 11 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 test/helpers/application_helper_test.rb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 3debc85..e7d79e4 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -123,6 +123,28 @@ html.dark .hover\:bg-slate-50:hover { background-color: #27272a; } +/* Testi “light-only” usati ovunque come mute/alert: in dark restano leggibili. */ +html.dark .text-slate-500, +html.dark .text-slate-400 { + color: #a1a1aa; +} + +html.dark .text-slate-600 { + color: #d4d4d8; +} + +html.dark .text-rose-700 { + color: #fb7185; +} + +html.dark .text-amber-700 { + color: #fbbf24; +} + +html.dark .text-emerald-700 { + color: #34d399; +} + html.dark input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]), html.dark select, html.dark textarea { diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 556eedd..491f636 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -79,41 +79,41 @@ module ApplicationHelper def status_badge(status) colors = { - "prospect" => "bg-sky-100 text-sky-800", - "active_customer" => "bg-emerald-100 text-emerald-800", - "inactive_customer" => "bg-slate-100 text-slate-700", - "partner" => "bg-violet-100 text-violet-800", - "lost" => "bg-rose-100 text-rose-800" + "prospect" => "bg-sky-100 text-sky-800 dark:bg-sky-950 dark:text-sky-200", + "active_customer" => "bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-200", + "inactive_customer" => "bg-slate-100 text-slate-700 dark:bg-zinc-800 dark:text-zinc-300", + "partner" => "bg-violet-100 text-violet-800 dark:bg-violet-950 dark:text-violet-200", + "lost" => "bg-rose-100 text-rose-800 dark:bg-rose-950 dark:text-rose-200" } content_tag :span, Catalog.label_for(Catalog::ORGANIZATION_STATUSES, status), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-slate-100 text-slate-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-slate-100 text-slate-700 dark:bg-zinc-800 dark:text-zinc-300'}" end def stage_badge(stage) colors = { - "to_contact" => "bg-slate-100 text-slate-700", - "contacted" => "bg-sky-100 text-sky-800", - "replied" => "bg-cyan-100 text-cyan-800", - "interested" => "bg-amber-100 text-amber-800", - "demo_trial" => "bg-orange-100 text-orange-800", - "first_use" => "bg-lime-100 text-lime-800", - "proposal" => "bg-indigo-100 text-indigo-800", - "won" => "bg-emerald-100 text-emerald-800", - "lost" => "bg-rose-100 text-rose-800" + "to_contact" => "bg-slate-100 text-slate-700 dark:bg-zinc-800 dark:text-zinc-300", + "contacted" => "bg-sky-100 text-sky-800 dark:bg-sky-950 dark:text-sky-200", + "replied" => "bg-cyan-100 text-cyan-800 dark:bg-cyan-950 dark:text-cyan-200", + "interested" => "bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-200", + "demo_trial" => "bg-orange-100 text-orange-800 dark:bg-orange-950 dark:text-orange-200", + "first_use" => "bg-lime-100 text-lime-800 dark:bg-lime-950 dark:text-lime-200", + "proposal" => "bg-indigo-100 text-indigo-800 dark:bg-indigo-950 dark:text-indigo-200", + "won" => "bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-200", + "lost" => "bg-rose-100 text-rose-800 dark:bg-rose-950 dark:text-rose-200" } content_tag :span, Catalog.label_for(Catalog::PIPELINE_STAGES, stage), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[stage] || 'bg-slate-100 text-slate-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[stage] || 'bg-slate-100 text-slate-700 dark:bg-zinc-800 dark:text-zinc-300'}" end def priority_badge(priority) colors = { - "low" => "bg-slate-100 text-slate-600", - "normal" => "bg-sky-100 text-sky-700", - "high" => "bg-amber-100 text-amber-800", - "urgent" => "bg-rose-100 text-rose-800" + "low" => "bg-slate-100 text-slate-600 dark:bg-zinc-800 dark:text-zinc-300", + "normal" => "bg-sky-100 text-sky-700 dark:bg-sky-950 dark:text-sky-200", + "high" => "bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-200", + "urgent" => "bg-rose-100 text-rose-800 dark:bg-rose-950 dark:text-rose-200" } content_tag :span, Catalog.label_for(Catalog::TASK_PRIORITIES, priority), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[priority] || 'bg-slate-100'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[priority] || 'bg-slate-100 text-slate-700 dark:bg-zinc-800 dark:text-zinc-300'}" end def format_money(value) @@ -139,7 +139,7 @@ module ApplicationHelper end def progress_bar(percentage, color: "bg-emerald-500") - content_tag :div, class: "h-3 w-full overflow-hidden rounded-full bg-slate-200 dark:bg-zinc-700" do + content_tag :div, class: "h-3 w-full overflow-hidden rounded-full bg-zinc-200 dark:bg-zinc-600" do content_tag :div, "", class: "h-full #{color} transition-all", style: "width: #{percentage.to_i}%" end end @@ -167,7 +167,7 @@ module ApplicationHelper "cancelled" => "bg-rose-100 text-rose-800 dark:bg-rose-950 dark:text-rose-200" } content_tag :span, Catalog.label_for(Catalog::MAILING_STATUSES, status), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-200'}" end def mailing_recipient_status_badge(status) @@ -179,7 +179,7 @@ module ApplicationHelper "failed" => "bg-rose-100 text-rose-800 dark:bg-rose-950 dark:text-rose-200" } content_tag :span, Catalog.label_for(Catalog::MAILING_RECIPIENT_STATUSES, status), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-200'}" end def mailing_open_badge(recipient) @@ -203,7 +203,7 @@ module ApplicationHelper "B" => "bg-fuchsia-100 text-fuchsia-800 dark:bg-fuchsia-950 dark:text-fuchsia-200" } content_tag :span, "Test #{variant}", - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[variant] || 'bg-zinc-100 text-zinc-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[variant] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-200'}" end def sanitize_email_html(html) @@ -218,14 +218,14 @@ module ApplicationHelper return if status.blank? colors = { - "not_detected" => "bg-zinc-100 text-zinc-700", - "limited" => "bg-amber-100 text-amber-800", - "yes_partial" => "bg-sky-100 text-sky-800", - "yes" => "bg-emerald-100 text-emerald-800", - "yes_sportcam" => "bg-emerald-100 text-emerald-800" + "not_detected" => "bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-300", + "limited" => "bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-200", + "yes_partial" => "bg-sky-100 text-sky-800 dark:bg-sky-950 dark:text-sky-200", + "yes" => "bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-200", + "yes_sportcam" => "bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-200" } content_tag :span, Catalog.label_for(Catalog::STREAMING_STATUSES, status), - class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700'}" + class: "inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium #{colors[status] || 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-300'}" end def yes_no(value) diff --git a/app/views/dashboard/show.html.erb b/app/views/dashboard/show.html.erb index 6843a69..58ca436 100644 --- a/app/views/dashboard/show.html.erb +++ b/app/views/dashboard/show.html.erb @@ -22,11 +22,11 @@

Cosa devo fare oggi

-

In ritardo (<%= @overdue_tasks.size %>)

+

In ritardo (<%= @overdue_tasks.size %>)

<%= render "shared/task_list", tasks: @overdue_tasks %>
-

Da fare oggi (<%= @today_tasks.size %>)

+

Da fare oggi (<%= @today_tasks.size %>)

<%= render "shared/task_list", tasks: @today_tasks %>
@@ -55,7 +55,7 @@ ["Task scaduti", @metrics.overdue_tasks_count] ].each do |label, value| %>
-
<%= label %>
+
<%= label %>
<%= value %>
<% end %> diff --git a/app/views/imports/preview.html.erb b/app/views/imports/preview.html.erb index 58d35c9..e7db190 100644 --- a/app/views/imports/preview.html.erb +++ b/app/views/imports/preview.html.erb @@ -2,7 +2,7 @@

Anteprima import

- + <% @preview[:headers].each do |h| %><% end %> diff --git a/app/views/mailings/dashboard.html.erb b/app/views/mailings/dashboard.html.erb index c8944cc..36450b4 100644 --- a/app/views/mailings/dashboard.html.erb +++ b/app/views/mailings/dashboard.html.erb @@ -118,7 +118,7 @@ <% if mailing.draft? && mailing.tested? %>
Prova ok
<% elsif mailing.draft? %> -
Manca prova
+
Manca prova
<% end %>
<%= h %>
diff --git a/app/views/organizations/show.html.erb b/app/views/organizations/show.html.erb index b180621..cb219f2 100644 --- a/app/views/organizations/show.html.erb +++ b/app/views/organizations/show.html.erb @@ -96,7 +96,7 @@
<%= contact.full_name %> - <% if contact.primary_contact? %>Principale<% end %> + <% if contact.primary_contact? %>Principale<% end %>
<%= [contact.role, contact.email, contact.phone.presence || contact.mobile].compact_blank.join(" · ") %>
diff --git a/app/views/shared/_task_list.html.erb b/app/views/shared/_task_list.html.erb index 478c37f..92a14a5 100644 --- a/app/views/shared/_task_list.html.erb +++ b/app/views/shared/_task_list.html.erb @@ -1,27 +1,27 @@
<% tasks.each do |task| %> -
+
<%= link_to task.organization.name, task.organization, class: "font-medium text-zinc-900 hover:underline dark:text-zinc-100" %> <%= priority_badge(task.priority) %> - <%= task.task_type_label %> + <%= task.task_type_label %>
<%= task.title %>
-
+
<%= task.contact&.full_name || "—" %> · <%= format_dt(task.due_at) %> <% if task.assigned_user %>· <%= task.assigned_user.full_name %><% end %>
- <%= button_to "Completa", complete_task_path(task), method: :patch, class: "rounded-md bg-emerald-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-emerald-700" %> - <%= link_to "Modifica", edit_task_path(task), class: "rounded-md border border-zinc-300 px-3 py-1.5 text-xs font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-600 dark:text-zinc-200 dark:hover:bg-zinc-800" %> + <%= button_to "Completa", complete_task_path(task), method: :patch, class: "rounded-md bg-emerald-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-emerald-700 dark:bg-emerald-700 dark:hover:bg-emerald-600" %> + <%= link_to "Modifica", edit_task_path(task), class: "rounded-md border border-zinc-300 bg-white px-3 py-1.5 text-xs font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-500 dark:bg-zinc-700 dark:text-zinc-50 dark:hover:bg-zinc-600" %>
<% end %> <% if tasks.blank? %> -
Nessun task
+
Nessun task
<% end %>
diff --git a/app/views/tasks/index.html.erb b/app/views/tasks/index.html.erb index 5c479bd..f092309 100644 --- a/app/views/tasks/index.html.erb +++ b/app/views/tasks/index.html.erb @@ -4,11 +4,11 @@ <%= link_to "Nuovo task", new_task_path, class: "#{btn_primary} w-full sm:w-auto" %>
-

In ritardo

+

In ritardo

<%= render "shared/task_list", tasks: @overdue_tasks %>
-

Oggi

+

Oggi

<%= render "shared/task_list", tasks: @today_tasks %>
diff --git a/app/views/today/show.html.erb b/app/views/today/show.html.erb index f64fae8..6c59324 100644 --- a/app/views/today/show.html.erb +++ b/app/views/today/show.html.erb @@ -5,12 +5,12 @@
-

In ritardo

+

In ritardo

<%= render "shared/task_list", tasks: @overdue_tasks %>
-

Oggi

+

Oggi

<%= render "shared/task_list", tasks: @today_tasks %>
diff --git a/test/controllers/dashboard_controller_test.rb b/test/controllers/dashboard_controller_test.rb index e186f69..3eb95c0 100644 --- a/test/controllers/dashboard_controller_test.rb +++ b/test/controllers/dashboard_controller_test.rb @@ -23,4 +23,14 @@ class DashboardControllerTest < ActionDispatch::IntegrationTest assert_match(/Da qui in poi/, response.body) assert_no_match(/dal passo precedente/, response.body) end + + test "today task rows use dark-mode surfaces" do + login_as users(:admin) + get project_root_path(project_code: "matchlivetv") + + assert_response :success + assert_includes response.body, "dark:bg-amber-950" + assert_includes response.body, "dark:bg-amber-950 dark:text-amber-200" + assert_includes response.body, "dark:bg-zinc-700 dark:text-zinc-50" + end end diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb new file mode 100644 index 0000000..530176e --- /dev/null +++ b/test/helpers/application_helper_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +class ApplicationHelperTest < ActionView::TestCase + test "priority badge includes dark theme colors" do + html = priority_badge("high") + + assert_includes html, "bg-amber-100" + assert_includes html, "dark:bg-amber-950" + assert_includes html, "dark:text-amber-200" + end + + test "stage badge includes dark theme colors" do + html = stage_badge("interested") + + assert_includes html, "dark:bg-amber-950" + assert_includes html, "dark:text-amber-200" + end + + test "status badge includes dark theme colors" do + html = status_badge("prospect") + + assert_includes html, "dark:bg-sky-950" + assert_includes html, "dark:text-sky-200" + end +end