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 позиций импортировано в новый заказ",
"> 0 calculează automat prețul client.": "> 0 автоматически рассчитывает цену клиента.",
"A1-03": "A1-03",
"ACTIVE": "ВКЛ",
"AGRNMD2X": "AGRNMD2X",
"AI provider": "AI-провайдер",
"AI: preț recomandat": "AI: рекомендованная цена",
@@ -372,6 +373,7 @@
"Category": "Категория",
"Caută": "Найти",
"Caută client, mașină, număr...": "Поиск клиента, авто, номера...",
"Caută în ghid...": "Поиск по гиду...",
"Caută în tabel": "Поиск в таблице",
"Cauza adresării": "Причина обращения",
"Caz asigurare": "Страховой случай",
@@ -825,6 +827,7 @@
"Eșapament": "Выхлоп",
"Ești sigur?": "Ты уверен?",
"Eșuat": "Ошибка",
"FAQ & Ghid utilizator": "FAQ и гид пользователя",
"FIȘĂ DE LUCRU": "ЗАКАЗ-НАРЯД",
"Facturi": "Счета",
"Facturi & abonament": "Facturi & abonament",
@@ -952,6 +955,7 @@
"IBAN:": "IBAN:",
"ID": "ID",
"IDNO / CUI": "IDNO / CUI",
"INACTIVE": "ВЫКЛ",
"INJECTOARE": "ФОРСУНКИ",
"ITP": "ТО",
"Ianuarie": "Январь",
@@ -1281,6 +1285,7 @@
"Nicio piesă montată.": "Запчасти не установлены.",
"Nicio plată": "Нет платежей",
"Nicio plată în perioada selectată.": "Нет платежей за выбранный период.",
"Nicio potrivire pentru „:q\".": "Нет совпадений для «:q».",
"Nicio programare în această perioadă.": "Нет записей в этом периоде.",
"Nicio programare în perioada selectată.": "Нет записей за выбранный период.",
"Niciodată": "Никогда",
@@ -1350,6 +1355,7 @@
"Nu există date": "Нет данных",
"Nu există rezultate": "Нет результатов",
"Nu găsit": "Не найдено",
"Nu mai arăta": "Больше не показывать",
"Nu pot porni camera: ": "Не удалось запустить камеру: ",
"Nu re-trimite mai des de X zile": "Не отправлять повторно чаще чем раз в X дней",
"Nu te poți șterge pe tine!": "Нельзя удалить себя!",
@@ -1938,6 +1944,7 @@
"Subtotal piese:": "Subtotal piese:",
"Succes": "Успех",
"Sugerează revizie / piese de uzură.": "Предложите ТО / расходники.",
"Sugestii pe pagini:": "Подсказки на страницах:",
"Sumă": "Сумма",
"Sumă achitată": "Sumă achitată",
"Sumă:": "Sumă:",