complete story 6.7 with QA tests and generated epic 10 to fix the branding colors

This commit is contained in:
Naser Mansour
2025-12-27 21:29:01 +02:00
parent 43eca9822f
commit 04d432d69d
16 changed files with 2245 additions and 56 deletions
@@ -0,0 +1,116 @@
<?php
use App\Services\MonthlyReportService;
use Livewire\Volt\Component;
use Symfony\Component\HttpFoundation\StreamedResponse;
new class extends Component
{
public string $selectedPeriod = '';
public bool $generating = false;
public function mount(): void
{
// Default to previous month
$previousMonth = now()->subMonth();
$this->selectedPeriod = $previousMonth->format('Y-m');
}
public function getAvailableMonthsProperty(): array
{
$months = [];
for ($i = 1; $i <= 12; $i++) {
$date = now()->subMonths($i);
$months[] = [
'value' => $date->format('Y-m'),
'label' => $date->translatedFormat('F Y'),
];
}
return $months;
}
public function generate(): ?StreamedResponse
{
$this->generating = true;
try {
[$year, $month] = explode('-', $this->selectedPeriod);
$service = app(MonthlyReportService::class);
return $service->generate((int) $year, (int) $month);
} catch (\Exception $e) {
$this->dispatch('notify', type: 'error', message: __('report.report_failed'));
return null;
} finally {
$this->generating = false;
}
}
}; ?>
<div>
<div class="mb-6 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
<div>
<flux:heading size="xl">{{ __('report.monthly_report') }}</flux:heading>
<flux:text class="mt-1 text-zinc-500 dark:text-zinc-400">{{ __('report.monthly_report_description') }}</flux:text>
</div>
</div>
<div class="rounded-lg border border-zinc-200 bg-white p-6 dark:border-zinc-700 dark:bg-zinc-800">
<div class="flex flex-col gap-6 sm:flex-row sm:items-end">
<div class="w-full sm:w-64">
<flux:select wire:model="selectedPeriod" :label="__('report.select_period')">
@foreach ($this->availableMonths as $option)
<flux:select.option value="{{ $option['value'] }}">
{{ $option['label'] }}
</flux:select.option>
@endforeach
</flux:select>
</div>
<flux:button
wire:click="generate"
wire:loading.attr="disabled"
wire:target="generate"
variant="primary"
icon="document-arrow-down"
>
<span wire:loading.remove wire:target="generate">{{ __('report.generate') }}</span>
<span wire:loading wire:target="generate">{{ __('report.generating') }}</span>
</flux:button>
</div>
<div class="mt-8 rounded-lg bg-zinc-50 p-6 dark:bg-zinc-900">
<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="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">1</span>
<span>{{ __('report.executive_summary') }}</span>
</div>
<div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">2</span>
<span>{{ __('report.user_statistics') }}</span>
</div>
<div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">3</span>
<span>{{ __('report.consultation_statistics') }}</span>
</div>
<div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">4</span>
<span>{{ __('report.timeline_statistics') }}</span>
</div>
<div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">5</span>
<span>{{ __('report.post_statistics') }}</span>
</div>
<div class="flex items-center gap-2">
<span class="flex h-6 w-6 items-center justify-center rounded-full bg-[#0A1F44] text-xs text-white dark:bg-[#D4AF37] dark:text-zinc-900">6</span>
<span>{{ __('report.trends_chart') }}</span>
</div>
</div>
</div>
</div>
</div>
@@ -66,6 +66,9 @@ new class extends Component
<flux:button wire:click="openBlockModal" icon="clock">
{{ __('widgets.block_time_slot') }}
</flux:button>
<flux:button href="{{ route('admin.reports.monthly') }}" icon="document-chart-bar" wire:navigate>
{{ __('widgets.monthly_report') }}
</flux:button>
</div>
@if (session('block_success'))