complete story 12.5

This commit is contained in:
Naser Mansour 2026-01-04 00:49:29 +02:00
parent be05f1d759
commit 82e803dc26
8 changed files with 159 additions and 121 deletions

View File

@ -191,7 +191,7 @@ class MonthlyReportService
], ],
'datasets' => [[ 'datasets' => [[
'data' => [$free, $paid], 'data' => [$free, $paid],
'backgroundColor' => ['#4A4A42', '#C9C4BA'], 'backgroundColor' => ['#8AB357', '#A5C87A'],
]], ]],
], ],
'options' => [ 'options' => [
@ -249,8 +249,8 @@ class MonthlyReportService
'datasets' => [[ 'datasets' => [[
'label' => __('report.consultations', [], $locale), 'label' => __('report.consultations', [], $locale),
'data' => $data, 'data' => $data,
'borderColor' => '#4A4A42', 'borderColor' => '#8AB357',
'backgroundColor' => 'rgba(74, 74, 66, 0.1)', 'backgroundColor' => 'rgba(138, 179, 87, 0.1)',
'fill' => true, 'fill' => true,
'tension' => 0.3, 'tension' => 0.3,
]], ]],

View File

@ -155,21 +155,21 @@ $chartColors = [
## Dev Checklist ## Dev Checklist
- [ ] Update `users-export.blade.php` colors - [x] Update `users-export.blade.php` colors
- [ ] Update `users-export.blade.php` logo - [x] Update `users-export.blade.php` logo
- [ ] Update `consultations-export.blade.php` colors - [x] Update `consultations-export.blade.php` colors
- [ ] Update `consultations-export.blade.php` logo - [x] Update `consultations-export.blade.php` logo
- [ ] Update `timelines-export.blade.php` colors - [x] Update `timelines-export.blade.php` colors
- [ ] Update `timelines-export.blade.php` logo - [x] Update `timelines-export.blade.php` logo
- [ ] Update `monthly-report.blade.php` colors - [x] Update `monthly-report.blade.php` colors
- [ ] Update `monthly-report.blade.php` logo - [x] Update `monthly-report.blade.php` logo
- [ ] Update `MonthlyReportService.php` chart colors - [x] Update `MonthlyReportService.php` chart colors
- [ ] Review `monthly-report.blade.php` Livewire component - [x] Review `monthly-report.blade.php` Livewire component
- [ ] Test Users PDF export - [x] Test Users PDF export
- [ ] Test Consultations PDF export - [x] Test Consultations PDF export
- [ ] Test Timelines PDF export - [x] Test Timelines PDF export
- [ ] Test Monthly Report PDF generation - [x] Test Monthly Report PDF generation
- [ ] Verify logo displays correctly in all PDFs - [x] Verify logo displays correctly in all PDFs
- [ ] Test print preview for readability - [ ] Test print preview for readability
- [ ] Test grayscale printing - [ ] Test grayscale printing
@ -182,3 +182,45 @@ $chartColors = [
- Story 12.1 (Logo Deployment) must be completed for logo files - Story 12.1 (Logo Deployment) must be completed for logo files
- Story 12.2 (Core CSS) should be completed for color reference consistency - Story 12.2 (Core CSS) should be completed for color reference consistency
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
Claude Opus 4.5
### File List
**Modified:**
- `resources/views/pdf/users-export.blade.php` - Updated colors from charcoal to olive green, added square logo
- `resources/views/pdf/consultations-export.blade.php` - Updated colors from charcoal to olive green, added square logo
- `resources/views/pdf/timelines-export.blade.php` - Updated colors from charcoal to olive green, added square logo
- `resources/views/pdf/monthly-report.blade.php` - Updated colors from charcoal to olive green, added square logo (header + cover page)
- `app/Services/MonthlyReportService.php` - Updated chart colors for pie and line charts
- `resources/views/livewire/admin/reports/monthly-report.blade.php` - Updated inline color styles for TOC badges
- `tests/Feature/Admin/PdfBrandColorsTest.php` - Updated tests to check for new olive green colors instead of old charcoal
### Change Log
| Date | Change | Reason |
|------|--------|--------|
| 2026-01-04 | Updated all PDF templates with olive green colors | Story 12.5 requirement |
| 2026-01-04 | Added square logo to all PDF headers | Story 12.5 requirement |
| 2026-01-04 | Updated chart colors in MonthlyReportService | Story 12.5 AC5 |
| 2026-01-04 | Updated Livewire component inline colors | Consistency with PDF changes |
| 2026-01-04 | Updated PdfBrandColorsTest to verify new colors | Tests should validate current state |
### Debug Log References
None - Implementation completed without issues
### Completion Notes
- All PDF templates updated with olive green palette (`#8AB357` primary, `#A5C87A` accent)
- Square logo (50x50px) added to all PDF headers using `public_path('images/logo.png')`
- Monthly report cover page uses larger logo (100x100px)
- Chart colors in MonthlyReportService updated for pie and line charts
- All 76 related tests pass (6 PDF color tests + 70 export tests)
- Print preview and grayscale testing should be done manually by QA

View File

@ -87,27 +87,27 @@ new class extends Component
<flux:heading size="sm" class="mb-4">{{ __('report.table_of_contents') }}</flux:heading> <flux:heading size="sm" class="mb-4">{{ __('report.table_of_contents') }}</flux:heading>
<div class="space-y-2 text-sm text-zinc-600 dark:text-zinc-400"> <div class="space-y-2 text-sm text-zinc-600 dark:text-zinc-400">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">1</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">1</span>
<span>{{ __('report.executive_summary') }}</span> <span>{{ __('report.executive_summary') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">2</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">2</span>
<span>{{ __('report.user_statistics') }}</span> <span>{{ __('report.user_statistics') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">3</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">3</span>
<span>{{ __('report.consultation_statistics') }}</span> <span>{{ __('report.consultation_statistics') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">4</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">4</span>
<span>{{ __('report.timeline_statistics') }}</span> <span>{{ __('report.timeline_statistics') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">5</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">5</span>
<span>{{ __('report.post_statistics') }}</span> <span>{{ __('report.post_statistics') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#4A4A42] text-xs text-white dark:bg-[#C9C4BA] dark:text-zinc-900">6</span> <span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#8AB357] text-xs text-white dark:bg-[#A5C87A] dark:text-zinc-900">6</span>
<span>{{ __('report.trends_chart') }}</span> <span>{{ __('report.trends_chart') }}</span>
</div> </div>
</div> </div>

View File

@ -22,7 +22,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 70px; height: 70px;
border-bottom: 3px solid #C9C4BA; border-bottom: 3px solid #A5C87A;
padding-bottom: 10px; padding-bottom: 10px;
} }
@ -47,7 +47,7 @@
.brand-name { .brand-name {
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.brand-subtitle { .brand-subtitle {
@ -59,7 +59,7 @@
.report-title { .report-title {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
footer { footer {
@ -68,7 +68,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 50px; height: 50px;
border-top: 2px solid #C9C4BA; border-top: 2px solid #A5C87A;
padding-top: 10px; padding-top: 10px;
font-size: 9px; font-size: 9px;
color: #666; color: #666;
@ -98,7 +98,7 @@
.filters-section { .filters-section {
background-color: #E8E4DC; background-color: #E8E4DC;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 10px 15px;
margin-bottom: 20px; margin-bottom: 20px;
@ -106,7 +106,7 @@
.filters-title { .filters-title {
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 5px; margin-bottom: 5px;
} }
@ -118,11 +118,11 @@
.summary { .summary {
margin-bottom: 15px; margin-bottom: 15px;
color: #4A4A42; color: #8AB357;
} }
.summary strong { .summary strong {
color: #4A4A42; color: #8AB357;
} }
table { table {
@ -132,8 +132,8 @@
} }
th { th {
background-color: #4A4A42; background-color: #8AB357;
color: #fff; color: #E8E4DC;
padding: 10px 8px; padding: 10px 8px;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-weight: bold; font-weight: bold;
@ -143,7 +143,7 @@
td { td {
padding: 8px; padding: 8px;
border-bottom: 1px solid #C9C4BA; border-bottom: 1px solid #A5C87A;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-size: 9px; font-size: 9px;
} }
@ -220,8 +220,7 @@
<header> <header>
<div class="header-content"> <div class="header-content">
<div class="header-left"> <div class="header-left">
<div class="brand-name">Libra</div> <img src="{{ public_path('images/logo.png') }}" style="height: 50px; width: 50px;" alt="LIBRA for Rights">
<div class="brand-subtitle">{{ __('export.libra_law_firm', [], $locale) }}</div>
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="report-title">{{ __('export.consultations_export_title', [], $locale) }}</div> <div class="report-title">{{ __('export.consultations_export_title', [], $locale) }}</div>

View File

@ -23,7 +23,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 70px; height: 70px;
border-bottom: 3px solid #C9C4BA; border-bottom: 3px solid #A5C87A;
padding-bottom: 10px; padding-bottom: 10px;
} }
@ -48,7 +48,7 @@
.brand-name { .brand-name {
font-size: 24px; font-size: 24px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.brand-subtitle { .brand-subtitle {
@ -68,7 +68,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 50px; height: 50px;
border-top: 2px solid #C9C4BA; border-top: 2px solid #A5C87A;
padding-top: 10px; padding-top: 10px;
font-size: 9px; font-size: 9px;
color: #666; color: #666;
@ -105,7 +105,7 @@
.cover-brand { .cover-brand {
font-size: 48px; font-size: 48px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 10px; margin-bottom: 10px;
} }
@ -118,13 +118,13 @@
.cover-title { .cover-title {
font-size: 28px; font-size: 28px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 20px; margin-bottom: 20px;
} }
.cover-period { .cover-period {
font-size: 22px; font-size: 22px;
color: #4A4A42; color: #8AB357;
margin-bottom: 60px; margin-bottom: 60px;
} }
@ -141,8 +141,8 @@
.section-title { .section-title {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
border-bottom: 2px solid #C9C4BA; border-bottom: 2px solid #A5C87A;
padding-bottom: 8px; padding-bottom: 8px;
margin-bottom: 20px; margin-bottom: 20px;
margin-top: 30px; margin-top: 30px;
@ -165,7 +165,7 @@
display: table-cell; display: table-cell;
width: 30px; width: 30px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.toc-title { .toc-title {
@ -176,7 +176,7 @@
display: table-cell; display: table-cell;
width: 40px; width: 40px;
text-align: {{ $locale === 'ar' ? 'left' : 'right' }}; text-align: {{ $locale === 'ar' ? 'left' : 'right' }};
color: #4A4A42; color: #8AB357;
} }
/* Stats Grid */ /* Stats Grid */
@ -199,7 +199,7 @@
.stat-box { .stat-box {
background-color: #E8E4DC; background-color: #E8E4DC;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
padding: 15px; padding: 15px;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
@ -215,11 +215,11 @@
.stat-value { .stat-value {
font-size: 24px; font-size: 24px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.stat-value-gold { .stat-value-gold {
color: #4A4A42; color: #8AB357;
} }
/* Data Table */ /* Data Table */
@ -230,8 +230,8 @@
} }
.data-table th { .data-table th {
background-color: #4A4A42; background-color: #8AB357;
color: #fff; color: #E8E4DC;
padding: 10px 12px; padding: 10px 12px;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-weight: bold; font-weight: bold;
@ -241,7 +241,7 @@
.data-table td { .data-table td {
padding: 10px 12px; padding: 10px 12px;
border-bottom: 1px solid #C9C4BA; border-bottom: 1px solid #A5C87A;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
} }
@ -252,7 +252,7 @@
/* Highlights */ /* Highlights */
.highlight-box { .highlight-box {
background-color: #E8E4DC; background-color: #E8E4DC;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
padding: 15px; padding: 15px;
margin-bottom: 20px; margin-bottom: 20px;
@ -260,7 +260,7 @@
.highlight-item { .highlight-item {
padding: 5px 0; padding: 5px 0;
border-bottom: 1px solid rgba(201, 196, 186, 0.5); border-bottom: 1px solid rgba(165, 200, 122, 0.5);
} }
.highlight-item:last-child { .highlight-item:last-child {
@ -268,7 +268,7 @@
} }
.highlight-bullet { .highlight-bullet {
color: #4A4A42; color: #8AB357;
font-weight: bold; font-weight: bold;
margin-{{ $locale === 'ar' ? 'left' : 'right' }}: 8px; margin-{{ $locale === 'ar' ? 'left' : 'right' }}: 8px;
} }
@ -294,14 +294,14 @@
margin: 20px 0; margin: 20px 0;
padding: 15px; padding: 15px;
background-color: #fff; background-color: #fff;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
} }
.chart-title { .chart-title {
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 15px; margin-bottom: 15px;
} }
@ -359,8 +359,7 @@
<header> <header>
<div class="header-content"> <div class="header-content">
<div class="header-left"> <div class="header-left">
<div class="brand-name">Libra</div> <img src="{{ public_path('images/logo.png') }}" style="height: 50px; width: 50px;" alt="LIBRA for Rights">
<div class="brand-subtitle">{{ __('report.libra_law_firm', [], $locale) }}</div>
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="report-info"> <div class="report-info">
@ -384,7 +383,7 @@
<!-- Cover Page --> <!-- Cover Page -->
<div class="cover-page"> <div class="cover-page">
<div class="cover-brand">Libra</div> <img src="{{ public_path('images/logo.png') }}" style="height: 100px; width: 100px; margin-bottom: 20px;" alt="LIBRA for Rights">
<div class="cover-subtitle">{{ __('report.libra_law_firm', [], $locale) }}</div> <div class="cover-subtitle">{{ __('report.libra_law_firm', [], $locale) }}</div>
<div class="cover-title">{{ __('report.report_title', [], $locale) }}</div> <div class="cover-title">{{ __('report.report_title', [], $locale) }}</div>
<div class="cover-period">{{ $period }}</div> <div class="cover-period">{{ $period }}</div>

View File

@ -22,7 +22,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 70px; height: 70px;
border-bottom: 3px solid #C9C4BA; border-bottom: 3px solid #A5C87A;
padding-bottom: 10px; padding-bottom: 10px;
} }
@ -47,7 +47,7 @@
.brand-name { .brand-name {
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.brand-subtitle { .brand-subtitle {
@ -59,7 +59,7 @@
.report-title { .report-title {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
footer { footer {
@ -68,7 +68,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 50px; height: 50px;
border-top: 2px solid #C9C4BA; border-top: 2px solid #A5C87A;
padding-top: 10px; padding-top: 10px;
font-size: 9px; font-size: 9px;
color: #666; color: #666;
@ -98,7 +98,7 @@
.filters-section { .filters-section {
background-color: #E8E4DC; background-color: #E8E4DC;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 10px 15px;
margin-bottom: 20px; margin-bottom: 20px;
@ -106,7 +106,7 @@
.filters-title { .filters-title {
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 5px; margin-bottom: 5px;
} }
@ -118,11 +118,11 @@
.summary { .summary {
margin-bottom: 15px; margin-bottom: 15px;
color: #4A4A42; color: #8AB357;
} }
.summary strong { .summary strong {
color: #4A4A42; color: #8AB357;
} }
table { table {
@ -132,8 +132,8 @@
} }
th { th {
background-color: #4A4A42; background-color: #8AB357;
color: #fff; color: #E8E4DC;
padding: 10px 8px; padding: 10px 8px;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-weight: bold; font-weight: bold;
@ -143,7 +143,7 @@
td { td {
padding: 8px; padding: 8px;
border-bottom: 1px solid #C9C4BA; border-bottom: 1px solid #A5C87A;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-size: 9px; font-size: 9px;
} }
@ -166,13 +166,13 @@
background-color: #E8E4DC; background-color: #E8E4DC;
padding: 10px; padding: 10px;
margin: 5px 0; margin: 5px 0;
border-{{ $locale === 'ar' ? 'right' : 'left' }}: 3px solid #C9C4BA; border-{{ $locale === 'ar' ? 'right' : 'left' }}: 3px solid #8AB357;
} }
.update-entry { .update-entry {
margin-bottom: 8px; margin-bottom: 8px;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: 1px dashed #C9C4BA; border-bottom: 1px dashed #A5C87A;
} }
.update-entry:last-child { .update-entry:last-child {
@ -208,8 +208,7 @@
<header> <header>
<div class="header-content"> <div class="header-content">
<div class="header-left"> <div class="header-left">
<div class="brand-name">Libra</div> <img src="{{ public_path('images/logo.png') }}" style="height: 50px; width: 50px;" alt="LIBRA for Rights">
<div class="brand-subtitle">{{ __('export.libra_law_firm', [], $locale) }}</div>
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="report-title">{{ __('export.timelines_export_title', [], $locale) }}</div> <div class="report-title">{{ __('export.timelines_export_title', [], $locale) }}</div>

View File

@ -22,7 +22,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 70px; height: 70px;
border-bottom: 3px solid #C9C4BA; border-bottom: 3px solid #A5C87A;
padding-bottom: 10px; padding-bottom: 10px;
} }
@ -47,7 +47,7 @@
.brand-name { .brand-name {
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
.brand-subtitle { .brand-subtitle {
@ -59,7 +59,7 @@
.report-title { .report-title {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
} }
footer { footer {
@ -68,7 +68,7 @@
left: 0; left: 0;
right: 0; right: 0;
height: 50px; height: 50px;
border-top: 2px solid #C9C4BA; border-top: 2px solid #A5C87A;
padding-top: 10px; padding-top: 10px;
font-size: 9px; font-size: 9px;
color: #666; color: #666;
@ -98,7 +98,7 @@
.filters-section { .filters-section {
background-color: #E8E4DC; background-color: #E8E4DC;
border: 1px solid #C9C4BA; border: 1px solid #A5C87A;
border-radius: 4px; border-radius: 4px;
padding: 10px 15px; padding: 10px 15px;
margin-bottom: 20px; margin-bottom: 20px;
@ -106,7 +106,7 @@
.filters-title { .filters-title {
font-weight: bold; font-weight: bold;
color: #4A4A42; color: #8AB357;
margin-bottom: 5px; margin-bottom: 5px;
} }
@ -118,11 +118,11 @@
.summary { .summary {
margin-bottom: 15px; margin-bottom: 15px;
color: #4A4A42; color: #8AB357;
} }
.summary strong { .summary strong {
color: #4A4A42; color: #8AB357;
} }
table { table {
@ -132,8 +132,8 @@
} }
th { th {
background-color: #4A4A42; background-color: #8AB357;
color: #fff; color: #E8E4DC;
padding: 10px 8px; padding: 10px 8px;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-weight: bold; font-weight: bold;
@ -143,7 +143,7 @@
td { td {
padding: 8px; padding: 8px;
border-bottom: 1px solid #C9C4BA; border-bottom: 1px solid #A5C87A;
text-align: {{ $locale === 'ar' ? 'right' : 'left' }}; text-align: {{ $locale === 'ar' ? 'right' : 'left' }};
font-size: 9px; font-size: 9px;
} }
@ -184,8 +184,7 @@
<header> <header>
<div class="header-content"> <div class="header-content">
<div class="header-left"> <div class="header-left">
<div class="brand-name">Libra</div> <img src="{{ public_path('images/logo.png') }}" style="height: 50px; width: 50px;" alt="LIBRA for Rights">
<div class="brand-subtitle">{{ __('export.libra_law_firm', [], $locale) }}</div>
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="report-title">{{ __('export.users_export_title', [], $locale) }}</div> <div class="report-title">{{ __('export.users_export_title', [], $locale) }}</div>

View File

@ -4,87 +4,87 @@
// PDF Template Brand Color Tests // PDF Template Brand Color Tests
// =========================================== // ===========================================
// Verifies that all PDF templates use the new brand colors: // Verifies that all PDF templates use the new brand colors:
// - Charcoal: #4A4A42 (primary/header background) // - Olive Green: #8AB357 (primary/header background)
// - Warm Gray: #C9C4BA (accent/borders) // - Light Olive: #A5C87A (accent/borders)
// - Light Background: #E8E4DC // - Light Background: #E8E4DC
// - Deep Black: #1A1A1A (text) // - Deep Black: #1A1A1A (text)
test('users-export PDF template uses new brand colors', function () { test('users-export PDF template uses new brand colors', function () {
$template = file_get_contents(resource_path('views/pdf/users-export.blade.php')); $template = file_get_contents(resource_path('views/pdf/users-export.blade.php'));
// Should contain new colors // Should contain new olive green colors
expect($template)->toContain('#4A4A42'); // Charcoal expect($template)->toContain('#8AB357'); // Olive Green
expect($template)->toContain('#C9C4BA'); // Warm Gray expect($template)->toContain('#A5C87A'); // Light Olive
expect($template)->toContain('#E8E4DC'); // Light Background expect($template)->toContain('#E8E4DC'); // Light Background
expect($template)->toContain('#1A1A1A'); // Deep Black text expect($template)->toContain('#1A1A1A'); // Deep Black text
// Should NOT contain old colors // Should NOT contain old colors
expect($template)->not->toContain('#0A1F44'); // Old Navy expect($template)->not->toContain('#4A4A42'); // Old Charcoal
expect($template)->not->toContain('#D4AF37'); // Old Gold expect($template)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });
test('consultations-export PDF template uses new brand colors', function () { test('consultations-export PDF template uses new brand colors', function () {
$template = file_get_contents(resource_path('views/pdf/consultations-export.blade.php')); $template = file_get_contents(resource_path('views/pdf/consultations-export.blade.php'));
// Should contain new colors // Should contain new olive green colors
expect($template)->toContain('#4A4A42'); // Charcoal expect($template)->toContain('#8AB357'); // Olive Green
expect($template)->toContain('#C9C4BA'); // Warm Gray expect($template)->toContain('#A5C87A'); // Light Olive
expect($template)->toContain('#E8E4DC'); // Light Background expect($template)->toContain('#E8E4DC'); // Light Background
expect($template)->toContain('#1A1A1A'); // Deep Black text expect($template)->toContain('#1A1A1A'); // Deep Black text
// Should NOT contain old colors // Should NOT contain old colors
expect($template)->not->toContain('#0A1F44'); // Old Navy expect($template)->not->toContain('#4A4A42'); // Old Charcoal
expect($template)->not->toContain('#D4AF37'); // Old Gold expect($template)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });
test('timelines-export PDF template uses new brand colors', function () { test('timelines-export PDF template uses new brand colors', function () {
$template = file_get_contents(resource_path('views/pdf/timelines-export.blade.php')); $template = file_get_contents(resource_path('views/pdf/timelines-export.blade.php'));
// Should contain new colors // Should contain new olive green colors
expect($template)->toContain('#4A4A42'); // Charcoal expect($template)->toContain('#8AB357'); // Olive Green
expect($template)->toContain('#C9C4BA'); // Warm Gray expect($template)->toContain('#A5C87A'); // Light Olive
expect($template)->toContain('#E8E4DC'); // Light Background expect($template)->toContain('#E8E4DC'); // Light Background
expect($template)->toContain('#1A1A1A'); // Deep Black text expect($template)->toContain('#1A1A1A'); // Deep Black text
// Should NOT contain old colors // Should NOT contain old colors
expect($template)->not->toContain('#0A1F44'); // Old Navy expect($template)->not->toContain('#4A4A42'); // Old Charcoal
expect($template)->not->toContain('#D4AF37'); // Old Gold expect($template)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });
test('monthly-report PDF template uses new brand colors', function () { test('monthly-report PDF template uses new brand colors', function () {
$template = file_get_contents(resource_path('views/pdf/monthly-report.blade.php')); $template = file_get_contents(resource_path('views/pdf/monthly-report.blade.php'));
// Should contain new colors // Should contain new olive green colors
expect($template)->toContain('#4A4A42'); // Charcoal expect($template)->toContain('#8AB357'); // Olive Green
expect($template)->toContain('#C9C4BA'); // Warm Gray expect($template)->toContain('#A5C87A'); // Light Olive
expect($template)->toContain('#E8E4DC'); // Light Background expect($template)->toContain('#E8E4DC'); // Light Background
expect($template)->toContain('#1A1A1A'); // Deep Black text expect($template)->toContain('#1A1A1A'); // Deep Black text
// Should NOT contain old colors // Should NOT contain old colors
expect($template)->not->toContain('#0A1F44'); // Old Navy expect($template)->not->toContain('#4A4A42'); // Old Charcoal
expect($template)->not->toContain('#D4AF37'); // Old Gold expect($template)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });
test('MonthlyReportService uses new brand colors for charts', function () { test('MonthlyReportService uses new brand colors for charts', function () {
$service = file_get_contents(app_path('Services/MonthlyReportService.php')); $service = file_get_contents(app_path('Services/MonthlyReportService.php'));
// Should contain new colors for charts // Should contain new olive green colors for charts
expect($service)->toContain('#4A4A42'); // Charcoal expect($service)->toContain('#8AB357'); // Olive Green
expect($service)->toContain('#C9C4BA'); // Warm Gray expect($service)->toContain('#A5C87A'); // Light Olive
// Should NOT contain old colors // Should NOT contain old colors
expect($service)->not->toContain('#0A1F44'); // Old Navy expect($service)->not->toContain('#4A4A42'); // Old Charcoal
expect($service)->not->toContain('#D4AF37'); // Old Gold expect($service)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });
test('monthly-report Livewire component uses new brand colors', function () { test('monthly-report Livewire component uses new brand colors', function () {
$template = file_get_contents(resource_path('views/livewire/admin/reports/monthly-report.blade.php')); $template = file_get_contents(resource_path('views/livewire/admin/reports/monthly-report.blade.php'));
// Should contain new colors // Should contain new olive green colors
expect($template)->toContain('#4A4A42'); // Charcoal expect($template)->toContain('#8AB357'); // Olive Green
expect($template)->toContain('#C9C4BA'); // Warm Gray expect($template)->toContain('#A5C87A'); // Light Olive
// Should NOT contain old colors // Should NOT contain old colors
expect($template)->not->toContain('#0A1F44'); // Old Navy expect($template)->not->toContain('#4A4A42'); // Old Charcoal
expect($template)->not->toContain('#D4AF37'); // Old Gold expect($template)->not->toContain('#C9C4BA'); // Old Warm Gray
}); });