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:
@@ -31,6 +31,7 @@ class User extends Authenticatable implements FilamentUser, HasAppAuthentication
|
||||
protected $fillable = [
|
||||
'company_id', 'name', 'email', 'phone', 'avatar_url',
|
||||
'role', 'status', 'locale',
|
||||
'hints_enabled', 'dismissed_hints',
|
||||
'specialization', 'color', 'hourly_rate', 'internal_margin_pct',
|
||||
'email_verified_at', 'password', 'last_login_at',
|
||||
'email_authentication_at',
|
||||
@@ -53,9 +54,18 @@ class User extends Authenticatable implements FilamentUser, HasAppAuthentication
|
||||
'password' => 'hashed',
|
||||
'app_authentication_secret' => 'encrypted',
|
||||
'app_authentication_recovery_codes' => 'encrypted:array',
|
||||
'hints_enabled' => 'boolean',
|
||||
'dismissed_hints' => 'array',
|
||||
];
|
||||
}
|
||||
|
||||
/** True when the user has hints on globally AND this specific key isn't dismissed. */
|
||||
public function shouldSeeHint(string $key): bool
|
||||
{
|
||||
if (! $this->hints_enabled) return false;
|
||||
return ! in_array($key, (array) ($this->dismissed_hints ?? []), true);
|
||||
}
|
||||
|
||||
public function canAccessPanel(Panel $panel): bool
|
||||
{
|
||||
return $panel->getId() === 'tenant'
|
||||
|
||||
Reference in New Issue
Block a user