diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 9408fd15..3ea5138e 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -7,16 +7,20 @@ use Filament\Http\Middleware\AuthenticateSession; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; use Filament\Navigation\NavigationGroup; +use Filament\Navigation\NavigationItem; use Filament\Pages\Dashboard; use Filament\Panel; use Filament\PanelProvider; use Filament\Support\Colors\Color; +use Filament\Support\Facades\FilamentView; +use Filament\View\PanelsRenderHook; use Filament\Widgets\AccountWidget; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; use Illuminate\Foundation\Http\Middleware\PreventRequestForgery; use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Session\Middleware\StartSession; +use Illuminate\Support\Facades\Blade; use Illuminate\View\Middleware\ShareErrorsFromSession; class AdminPanelProvider extends PanelProvider @@ -29,9 +33,17 @@ class AdminPanelProvider extends PanelProvider ->path('admin') ->login() ->brandName('AfterSales CRM') + ->topNavigation() ->colors([ - 'primary' => Color::Blue, + 'primary' => '#0058be', + 'secondary' => '#585f6c', + 'gray' => '#585f6c', + 'success' => '#10b981', + 'warning' => '#f59e0b', + 'danger' => '#ba1a1a', + 'info' => '#3b82f6', ]) + ->font('Inter') ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources') ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages') ->pages([ @@ -60,6 +72,14 @@ class AdminPanelProvider extends PanelProvider ]) ->authMiddleware([ Authenticate::class, - ]); + ]) + ->renderHook( + PanelsRenderHook::HEAD_END, + fn (): string => '', + ) + ->renderHook( + PanelsRenderHook::BODY_END, + fn (): string => '', + ); } } diff --git a/public/css/filament-custom.css b/public/css/filament-custom.css new file mode 100644 index 00000000..86e233a7 --- /dev/null +++ b/public/css/filament-custom.css @@ -0,0 +1,497 @@ +/* ================================================================ + AfterSales CRM — Custom Filament Theme + Derived from Material Design tokens in webappUI/ HTML designs + ================================================================ */ + +/* ---------- Google Fonts ---------- */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@500;600;700;800&family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap'); + +/* ---------- CSS Variables (Design Tokens from HTML) ---------- */ +:root { + /* Primary palette */ + --crm-primary: #0058be; + --crm-primary-hover: #2170e4; + --crm-primary-container: #2170e4; + --crm-on-primary: #ffffff; + --crm-on-primary-container: #fefcff; + --crm-primary-fixed: #d8e2ff; + --crm-primary-fixed-dim: #adc6ff; + --crm-on-primary-fixed: #001a42; + --crm-on-primary-fixed-variant: #004395; + --crm-inverse-primary: #adc6ff; + + /* Secondary palette */ + --crm-secondary: #585f6c; + --crm-secondary-container: #dce2f3; + --crm-on-secondary: #ffffff; + --crm-on-secondary-container: #5e6572; + --crm-secondary-fixed: #dce2f3; + --crm-secondary-fixed-dim: #c0c7d6; + --crm-on-secondary-fixed: #151c27; + --crm-on-secondary-fixed-variant: #404754; + + /* Tertiary */ + --crm-tertiary: #924700; + --crm-tertiary-container: #b75b00; + --crm-tertiary-fixed: #ffdcc6; + --crm-tertiary-fixed-dim: #ffb786; + + /* Surface / Background */ + --crm-background: #f9f9ff; + --crm-surface: #f9f9ff; + --crm-surface-bright: #f9f9ff; + --crm-surface-dim: #d8d9e3; + --crm-surface-container: #ecedf7; + --crm-surface-container-low: #f2f3fd; + --crm-surface-container-lowest: #ffffff; + --crm-surface-container-high: #e6e7f2; + --crm-surface-container-highest: #e1e2ec; + --crm-surface-variant: #e1e2ec; + --crm-surface-tint: #005ac2; + + /* Text on surface */ + --crm-on-surface: #191b23; + --crm-on-surface-variant: #424754; + --crm-on-background: #191b23; + --crm-inverse-surface: #2e3038; + --crm-inverse-on-surface: #eff0fa; + + /* Borders / Outlines */ + --crm-outline: #727785; + --crm-outline-variant: #c2c6d6; + + /* Error */ + --crm-error: #ba1a1a; + --crm-error-container: #ffdad6; + --crm-on-error: #ffffff; + --crm-on-error-container: #93000a; + + /* Spacing */ + --crm-nav-height: 56px; + --crm-margin-x: 1.5rem; + --crm-gutter: 1rem; + --crm-stack-gap: 1.5rem; + --crm-form-gap: 1.25rem; + --crm-container-max: 1280px; + + /* Radius */ + --crm-radius: 0.125rem; + --crm-radius-lg: 0.25rem; + --crm-radius-xl: 0.5rem; + --crm-radius-full: 0.75rem; + + /* Font */ + --crm-font-heading: 'Manrope', sans-serif; + --crm-font-body: 'Inter', sans-serif; +} + +/* ---------- Override Filament Defaults ---------- */ + +/* Force font family everywhere */ +.fi-body, +.fi-main, +.fi-sidebar, +.fi-topbar, +body { + font-family: var(--crm-font-body) !important; +} + +.fi-header h1, +.fi-header h2, +.fi-header h3, +.fi-widget-heading, +.fi-section-header h3, +.fi-modal-heading, +h1, h2, h3 { + font-family: var(--crm-font-heading) !important; +} + +/* Override Filament primary colors */ +.fi-btn.fi-color { + --c-500: var(--crm-primary); + --c-600: var(--crm-primary-hover); +} + +.fi-btn.fi-btn-color-primary { + background-color: var(--crm-primary) !important; + border-radius: var(--crm-radius) !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; + font-family: var(--crm-font-body) !important; + font-weight: 500 !important; + font-size: 14px !important; +} + +.fi-btn.fi-btn-color-primary:hover { + background-color: var(--crm-primary-hover) !important; + filter: brightness(1.1); +} + +/* Sharper border radius globally */ +.fi-card, +.fi-ta-ctn, +.fi-fo-tabs, +.fi-modal-window, +.fi-dropdown-panel, +.fi-section, +input, select, textarea { + border-radius: var(--crm-radius) !important; +} + +/* Card/section borders */ +.fi-card { + border: 1px solid var(--crm-outline-variant) !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; + border-radius: var(--crm-radius-xl) !important; +} + +/* Page background */ +body { + background-color: var(--crm-background) !important; + color: var(--crm-on-background) !important; +} + +/* ---------- TOP NAVIGATION BAR ---------- */ +.fi-top-nav { + height: var(--crm-nav-height) !important; + background-color: var(--crm-surface-container-lowest) !important; + border-bottom: 1px solid var(--crm-outline-variant) !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; + font-family: var(--crm-font-body) !important; +} + +.fi-top-nav .fi-top-nav-item a { + font-size: 14px !important; + font-weight: 500 !important; + color: var(--crm-on-surface-variant) !important; + transition: color 0.2s !important; +} + +.fi-top-nav .fi-top-nav-item a:hover { + color: var(--crm-primary) !important; +} + +.fi-top-nav .fi-top-nav-item-active a { + color: var(--crm-primary) !important; + border-bottom: 2px solid var(--crm-primary) !important; +} + +/* Brand name in top nav */ +.fi-top-nav .fi-logo { + font-family: var(--crm-font-heading) !important; + font-weight: 700 !important; + font-size: 20px !important; + color: var(--crm-primary) !important; +} + +/* ---------- MAIN CONTENT AREA ---------- */ +.fi-main { + background: var(--crm-background) !important; +} + +.fi-main-ctn { + max-width: var(--crm-container-max) !important; + margin-left: auto !important; + margin-right: auto !important; + padding-left: var(--crm-margin-x) !important; + padding-right: var(--crm-margin-x) !important; + padding-top: 1.5rem !important; +} + +/* ---------- TABLES ---------- */ +.fi-ta { + border-radius: var(--crm-radius-xl) !important; + border: 1px solid var(--crm-outline-variant) !important; + background: var(--crm-surface-container-lowest) !important; +} + +.fi-ta-header { + background: var(--crm-surface-container-low) !important; + border-bottom: 1px solid var(--crm-outline-variant) !important; +} + +.fi-ta-header-cell { + font-family: var(--crm-font-body) !important; + font-size: 12px !important; + font-weight: 600 !important; + color: var(--crm-on-surface-variant) !important; + text-transform: none !important; + padding: 12px 16px !important; +} + +.fi-ta-row { + border-bottom: 1px solid var(--crm-outline-variant) !important; +} + +.fi-ta-row:hover { + background: var(--crm-surface-container-low) !important; +} + +.fi-ta-cell { + font-family: var(--crm-font-body) !important; + font-size: 14px !important; + color: var(--crm-on-surface) !important; + padding: 12px 16px !important; +} + +/* ---------- STATUS BADGES ---------- */ +.fi-badge { + border-radius: 4px !important; + font-size: 11px !important; + font-weight: 600 !important; +} + +/* Pending - amber */ +.fi-badge-color-warning { + background-color: #fff8e1 !important; + color: #b45309 !important; + border: 1px solid #fde68a !important; +} + +/* Processing - blue */ +.fi-badge-color-info { + background-color: #d8e2ff !important; + color: #004395 !important; + border: 1px solid #adc6ff !important; +} + +/* Resolved - green */ +.fi-badge-color-success { + background-color: #ecfdf5 !important; + color: #047857 !important; + border: 1px solid #a7f3d0 !important; +} + +/* Closed - gray */ +.fi-badge-color-gray { + background-color: #f3f4f6 !important; + color: #374151 !important; + border: 1px solid #d1d5db !important; +} + +/* Tag badges */ +.fi-ta-tags .fi-badge { + background-color: var(--crm-surface-container-high) !important; + color: var(--crm-on-surface-variant) !important; + border: 1px solid var(--crm-outline-variant) !important; + border-radius: 2px !important; + font-size: 10px !important; + padding: 1px 6px !important; +} + +/* ---------- FORM COMPONENTS ---------- */ +.fi-fo-field-label { + font-family: var(--crm-font-body) !important; + font-size: 14px !important; + font-weight: 600 !important; + color: var(--crm-on-surface) !important; +} + +.fi-input-wrp input, +.fi-input-wrp select, +.fi-input-wrp textarea, +.fi-select-input, +select { + border: 1px solid var(--crm-outline-variant) !important; + border-radius: var(--crm-radius) !important; + background: var(--crm-surface-container-lowest) !important; + color: var(--crm-on-surface) !important; + font-family: var(--crm-font-body) !important; + font-size: 14px !important; + padding: 8px 12px !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; +} + +.fi-input-wrp input:focus, +.fi-input-wrp select:focus, +.fi-input-wrp textarea:focus { + border-color: var(--crm-primary) !important; + box-shadow: 0 0 0 3px rgba(0,88,190,0.15) !important; + ring: 2px !important; +} + +/* Form sections */ +.fi-section { + border: 1px solid var(--crm-outline-variant) !important; + border-radius: var(--crm-radius-xl) !important; + background: var(--crm-surface-container-lowest) !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; +} + +.fi-section-header { + padding: 16px 24px !important; + border-bottom: 1px solid rgba(194,198,214,0.5) !important; + background: rgba(249,249,255,0.5) !important; +} + +/* ---------- STAT CARDS (Dashboard) ---------- */ +.fi-wi-stats-overview-stat { + background: var(--crm-surface-container-lowest) !important; + border: 1px solid var(--crm-outline-variant) !important; + border-radius: var(--crm-radius-xl) !important; + box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; + padding: 20px !important; +} + +.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-value { + font-family: var(--crm-font-heading) !important; + font-size: 32px !important; + font-weight: 700 !important; + color: var(--crm-on-background) !important; +} + +.fi-wi-stats-overview-stat .fi-wi-stats-overview-stat-label { + font-family: var(--crm-font-body) !important; + font-size: 14px !important; + font-weight: 600 !important; + color: var(--crm-on-surface-variant) !important; +} + +/* ---------- PAGE HEADER (breadcrumb + title) ---------- */ +.fi-header { + margin-bottom: var(--crm-stack-gap) !important; +} + +.fi-breadcrumbs a, +.fi-breadcrumbs span { + font-size: 12px !important; + color: var(--crm-on-surface-variant) !important; +} + +/* ---------- TABS ---------- */ +.fi-tabs { + border-bottom: 1px solid var(--crm-outline-variant) !important; + gap: 1.5rem !important; +} + +.fi-tabs .fi-tabs-item { + padding-bottom: 12px !important; + font-family: var(--crm-font-body) !important; + font-size: 14px !important; + font-weight: 600 !important; + color: var(--crm-secondary) !important; +} + +.fi-tabs .fi-tabs-item-active { + color: var(--crm-primary) !important; + border-bottom: 2px solid var(--crm-primary) !important; +} + +/* ---------- MODALS ---------- */ +.fi-modal-window { + border-radius: var(--crm-radius-xl) !important; + border: 1px solid var(--crm-outline-variant) !important; + box-shadow: 0 20px 25px rgba(0,0,0,0.1) !important; +} + +.fi-modal-heading { + font-family: var(--crm-font-heading) !important; + font-size: 18px !important; + font-weight: 600 !important; +} + +/* ---------- DELETE / DANGER BUTTONS ---------- */ +.fi-btn.fi-btn-color-danger { + border: 1px solid rgba(186,26,26,0.3) !important; + background: var(--crm-surface-container-lowest) !important; + color: var(--crm-error) !important; + border-radius: var(--crm-radius) !important; + font-weight: 500 !important; +} + +.fi-btn.fi-btn-color-danger:hover { + background: var(--crm-error-container) !important; +} + +/* ---------- SECONDARY / OUTLINED BUTTONS ---------- */ +.fi-btn.fi-btn-color-gray, +.fi-btn.fi-btn-color-secondary { + background: var(--crm-surface-container-lowest) !important; + border: 1px solid var(--crm-outline-variant) !important; + color: var(--crm-secondary) !important; + border-radius: var(--crm-radius) !important; + font-family: var(--crm-font-body) !important; + font-weight: 500 !important; + font-size: 14px !important; +} + +.fi-btn.fi-btn-color-gray:hover, +.fi-btn.fi-btn-color-secondary:hover { + background: var(--crm-surface-variant) !important; +} + +/* ---------- TOGGLE SWITCH ---------- */ +.fi-toggle .fi-toggle-input:checked ~ .fi-toggle-bg { + background-color: var(--crm-primary) !important; +} + +/* ---------- CHECKBOX ---------- */ +.fi-checkbox-input:checked { + background-color: var(--crm-primary) !important; + border-color: var(--crm-primary) !important; +} + +/* ---------- FILTER BAR ---------- */ +.fi-filters { + background: var(--crm-surface-container-lowest) !important; + border: 1px solid var(--crm-outline-variant) !important; + border-radius: var(--crm-radius-lg) !important; + padding: 1rem !important; + margin-bottom: var(--crm-stack-gap) !important; +} + +/* ---------- PAGINATION ---------- */ +.fi-pagination .fi-pagination-item-active { + background-color: var(--crm-primary) !important; + color: var(--crm-on-primary) !important; + border-radius: var(--crm-radius) !important; +} + +/* ---------- SIDEBAR (hide since we use top nav) ---------- */ +.fi-sidebar { + display: none !important; +} + +/* Adjust main content when sidebar is hidden */ +.fi-main-ctn { + padding-left: var(--crm-margin-x) !important; +} + +/* ---------- NOTIFICATION BELL ---------- */ +.fi-icon-btn { + color: var(--crm-on-surface-variant) !important; +} + +.fi-icon-btn:hover { + color: var(--crm-primary) !important; +} + +/* ---------- USER MENU ---------- */ +.fi-user-menu .fi-user-menu-trigger { + font-family: var(--crm-font-body) !important; + font-size: 14px !important; +} + +/* ---------- DARK MODE OVERRIDES ---------- */ +.dark, [class*="dark"] { + --crm-background: #0f172a; + --crm-surface-container-lowest: #1e293b; + --crm-surface-container-high: #334155; + --crm-surface-variant: #334155; + --crm-on-surface: #e2e8f0; + --crm-on-surface-variant: #94a3b8; + --crm-on-background: #e2e8f0; + --crm-outline-variant: #475569; +} + +/* ---------- FIX: remove Filament's default blue backgrounds ---------- */ +.fi-sidebar, .fi-topbar { + background-color: var(--crm-surface-container-lowest) !important; +} + +/* ---------- Similar Cases footer panel ---------- */ +.fi-footer { + margin-top: 2rem; + background: var(--crm-surface-container-lowest) !important; + border: 1px solid var(--crm-outline-variant) !important; + border-radius: var(--crm-radius-xl) !important; +} diff --git a/resources/views/filament/resources/feedback/attachment-links.blade.php b/resources/views/filament/resources/feedback/attachment-links.blade.php index fbe9e6c7..5027b3d1 100644 --- a/resources/views/filament/resources/feedback/attachment-links.blade.php +++ b/resources/views/filament/resources/feedback/attachment-links.blade.php @@ -1,42 +1,40 @@ -
+
@if(empty($links) || count($links) === 0) -

No attachments.

+

No attachments.

@else - +
- - - - - + + + + + @foreach($links as $link) - - - + + - - + @endforeach
FileCollectionSizeAction
FileCollectionSizeAction
{{ $link['name'] }} - - {{ $link['collection'] }} - +
{{ $link['name'] }} + @if($link['collection'] === 'proof_of_resolution') + proof_of_resolution + @elseif($link['collection'] === 'customer_evidence') + customer_evidence + @else + {{ $link['collection'] }} + @endif {{ $link['size'] }} - Download + {{ $link['size'] }} + + Download +
-

Links expire after 60 minutes.

+

Links expire after 60 minutes.

@endif
diff --git a/resources/views/filament/resources/feedback/similar-cases.blade.php b/resources/views/filament/resources/feedback/similar-cases.blade.php index 26ea1b32..e02aff49 100644 --- a/resources/views/filament/resources/feedback/similar-cases.blade.php +++ b/resources/views/filament/resources/feedback/similar-cases.blade.php @@ -15,48 +15,55 @@ @endphp @if($similarCases->isNotEmpty()) -
-

- Similar Cases (shared tags) -

-
- - - - - - - - +
+
+

+ + Similar Cases +

+ Matching tags: {{ $record->tags->pluck('name')->implode(', ') }} +
+
+
TitleCustomerStatusAssigned ToDate
+ + + + + + + - + @foreach($similarCases as $case) - - + - - - -
TitleCustomerStatusHandlerDate
- - {{ $case->title }} - +
+ {{ $case->title }} + {{ $case->customer?->name }} - - {{ ucfirst($case->status) }} - + + @switch($case->status) + @case('pending') + Pending + @break + @case('processing') + Processing + @break + @case('resolved') + Resolved + @break + @case('closed') + Closed + @break + @endswitch + {{ $case->assignedTo?->name ?? 'Unassigned' }} + {{ $case->created_at->format('d/m/Y') }}