feat(hints): contextual help system + FAQ page (MVP)

Infrastructure for a portal-wide in-app help system:

* Users have hints_enabled (default true) and dismissed_hints (JSON
  array) columns. User::shouldSeeHint(key) checks both.
* app/Support/Hints.php — single-source-of-truth registry with 14
  pilot hints across Service (5), CRM (3), Depozit (3), Finanțe (3).
  Each entry has RO/RU/EN title + body + optional next-step + links.
* <x-hint key="wo.dashboard.overview" /> Blade component renders a
  small "?" icon with Alpine.js popover; the popover shows title,
  body, next-step, related links and an "X" button that POSTs to
  /app/hints/{key}/dismiss.
* HintController handles dismiss (per key), toggle (global on/off)
  and reset (clear dismissed + re-enable). Routes are auth:web.
* /app/faq page (Filament Page under Admin group) renders the whole
  registry grouped by area with a live search box and buttons to
  toggle global hints or reset dismissed ones.
* Wired 3 pilot hints into the WO dashboard: title (overview), Docs
  tab PDF preview, and the Chat client card.

Follow-ups: extend registry to cover more pages and add <x-hint>
tags where useful. Filament resource fields can also reuse the same
copy via ->hint()/->helperText().

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-01 09:46:07 +00:00
parent 293373f4ac
commit 06081159b6
14 changed files with 559 additions and 2 deletions
+7
View File
@@ -32,6 +32,7 @@
":n poziții importate în Purchase nouă": ":n items imported into a new Purchase",
"> 0 calculează automat prețul client.": "> 0 auto-calculates client price.",
"A1-03": "A1-03",
"ACTIVE": "ON",
"AGRNMD2X": "AGRNMD2X",
"AI provider": "AI provider",
"AI: preț recomandat": "AI: recommended price",
@@ -372,6 +373,7 @@
"Category": "Category",
"Caută": "Search",
"Caută client, mașină, număr...": "Search client, vehicle, number...",
"Caută în ghid...": "Search the guide...",
"Caută în tabel": "Search in table",
"Cauza adresării": "Reason for request",
"Caz asigurare": "Insurance case",
@@ -825,6 +827,7 @@
"Eșapament": "Exhaust",
"Ești sigur?": "Are you sure?",
"Eșuat": "Failed",
"FAQ & Ghid utilizator": "FAQ & User guide",
"FIȘĂ DE LUCRU": "WORK ORDER",
"Facturi": "Invoices",
"Facturi & abonament": "Facturi & abonament",
@@ -952,6 +955,7 @@
"IBAN:": "IBAN:",
"ID": "ID",
"IDNO / CUI": "IDNO / CUI",
"INACTIVE": "OFF",
"INJECTOARE": "INJECTORS",
"ITP": "MOT",
"Ianuarie": "January",
@@ -1281,6 +1285,7 @@
"Nicio piesă montată.": "No parts installed.",
"Nicio plată": "No payments",
"Nicio plată în perioada selectată.": "No payments in selected period.",
"Nicio potrivire pentru „:q\".": "No matches for \":q\".",
"Nicio programare în această perioadă.": "No appointments in this period.",
"Nicio programare în perioada selectată.": "No appointments in selected period.",
"Niciodată": "Never",
@@ -1350,6 +1355,7 @@
"Nu există date": "No data",
"Nu există rezultate": "No results",
"Nu găsit": "Not found",
"Nu mai arăta": "Don't show again",
"Nu pot porni camera: ": "Cannot start camera: ",
"Nu re-trimite mai des de X zile": "Don't resend more often than every X days",
"Nu te poți șterge pe tine!": "You can't delete yourself!",
@@ -1938,6 +1944,7 @@
"Subtotal piese:": "Subtotal piese:",
"Succes": "Success",
"Sugerează revizie / piese de uzură.": "Suggest service / wear parts.",
"Sugestii pe pagini:": "In-page hints:",
"Sumă": "Amount",
"Sumă achitată": "Sumă achitată",
"Sumă:": "Sumă:",