ソースを参照

Merge pull request #59 from andrewdwallo/development-3.x

Defer report initial page load
3.x
Andrew Wallo 1年前
コミット
2f37d03f9e
コミッターのメールアドレスに関連付けられたアカウントが存在しません

+ 8
- 3
app/Filament/Company/Pages/Reports/BaseReportPage.php ファイルの表示

@@ -41,6 +41,8 @@ abstract class BaseReportPage extends Page
41 41
 
42 42
     public Company $company;
43 43
 
44
+    public bool $reportLoaded = false;
45
+
44 46
     #[Session]
45 47
     public array $toggledTableColumns = [];
46 48
 
@@ -63,8 +65,6 @@ abstract class BaseReportPage extends Page
63 65
 
64 66
         $this->loadDefaultDateRange();
65 67
 
66
-        $this->loadReportData();
67
-
68 68
         $this->loadDefaultTableColumnToggleState();
69 69
     }
70 70
 
@@ -94,6 +94,7 @@ abstract class BaseReportPage extends Page
94 94
     public function loadReportData(): void
95 95
     {
96 96
         unset($this->report);
97
+        $this->reportLoaded = true;
97 98
     }
98 99
 
99 100
     protected function loadDefaultTableColumnToggleState(): void
@@ -142,8 +143,12 @@ abstract class BaseReportPage extends Page
142 143
     }
143 144
 
144 145
     #[Computed(persist: true)]
145
-    public function report(): ExportableReport
146
+    public function report(): ?ExportableReport
146 147
     {
148
+        if ($this->reportLoaded === false) {
149
+            return null;
150
+        }
151
+
147 152
         $columns = $this->getToggledColumns();
148 153
         $reportDTO = $this->buildReport($columns);
149 154
 

+ 17
- 5
app/Services/ExportService.php ファイルの表示

@@ -12,19 +12,24 @@ class ExportService
12 12
 {
13 13
     public function exportToCsv(Company $company, ExportableReport $report, string $startDate, string $endDate): StreamedResponse
14 14
     {
15
-        $filename = $company->name . ' ' . $report->getTitle() . ' ' . $startDate . ' to ' . $endDate . '.csv';
15
+        $formattedStartDate = Carbon::parse($startDate)->format('Y-m-d');
16
+        $formattedEndDate = Carbon::parse($endDate)->format('Y-m-d');
17
+
18
+        $timestamp = Carbon::now()->format('Y-m-d-H_i');
19
+
20
+        $filename = $company->name . ' ' . $report->getTitle() . ' ' . $formattedStartDate . ' to ' . $formattedEndDate . ' ' . $timestamp . '.csv';
16 21
 
17 22
         $headers = [
18 23
             'Content-Type' => 'text/csv',
19 24
             'Content-Disposition' => 'attachment; filename="' . $filename . '"',
20 25
         ];
21 26
 
22
-        $callback = function () use ($report, $company, $startDate, $endDate) {
27
+        $callback = function () use ($report, $company, $formattedStartDate, $formattedEndDate) {
23 28
             $file = fopen('php://output', 'wb');
24 29
 
25 30
             fputcsv($file, [$report->getTitle()]);
26 31
             fputcsv($file, [$company->name]);
27
-            fputcsv($file, ['Date Range: ' . $startDate . ' to ' . $endDate]);
32
+            fputcsv($file, ['Date Range: ' . $formattedStartDate . ' to ' . $formattedEndDate]);
28 33
             fputcsv($file, []);
29 34
 
30 35
             fputcsv($file, $report->getHeaders());
@@ -50,15 +55,22 @@ class ExportService
50 55
 
51 56
     public function exportToPdf(Company $company, ExportableReport $report, string $startDate, string $endDate): StreamedResponse
52 57
     {
58
+        $formattedStartDate = Carbon::parse($startDate)->format('Y-m-d');
59
+        $formattedEndDate = Carbon::parse($endDate)->format('Y-m-d');
60
+
61
+        $timestamp = Carbon::now()->format('Y-m-d-H_i');
62
+
63
+        $filename = $company->name . ' ' . $report->getTitle() . ' ' . $formattedStartDate . ' to ' . $formattedEndDate . ' ' . $timestamp . '.pdf';
64
+
53 65
         $pdf = Pdf::loadView('components.company.reports.report-pdf', [
54 66
             'company' => $company,
55 67
             'report' => $report,
56 68
             'startDate' => Carbon::parse($startDate)->format('M d, Y'),
57 69
             'endDate' => Carbon::parse($endDate)->format('M d, Y'),
58
-        ])->setPaper('a4');
70
+        ])->setPaper('letter');
59 71
 
60 72
         return response()->streamDownload(function () use ($pdf) {
61 73
             echo $pdf->stream();
62
-        }, strtolower(str_replace(' ', '-', $company->name . '-' . $report->getTitle())) . '.pdf');
74
+        }, $filename);
63 75
     }
64 76
 }

+ 6
- 8
resources/views/components/company/reports/report-pdf.blade.php ファイルの表示

@@ -6,8 +6,8 @@
6 6
     <title>{{ $report->getTitle() }}</title>
7 7
     <style>
8 8
         @page {
9
-            size: A4;
10
-            margin: 8.5mm 8.5mm 30mm 8.5mm;
9
+            size: auto;
10
+            margin: 10mm 7.5mm;
11 11
         }
12 12
 
13 13
         .header {
@@ -15,6 +15,10 @@
15 15
             margin-bottom: 1rem;
16 16
         }
17 17
 
18
+        .header > * + * {
19
+            margin-top: 0.5rem;
20
+        }
21
+
18 22
         .table-head {
19 23
             display: table-row-group;
20 24
         }
@@ -36,12 +40,6 @@
36 40
             color: #374151;
37 41
         }
38 42
 
39
-        .header .title,
40
-        .header .company-name,
41
-        .header .date-range {
42
-            margin-bottom: 0.125rem; /* Uniform space between header elements */
43
-        }
44
-
45 43
         .title {
46 44
             font-size: 1.5rem;
47 45
         }

+ 4
- 2
resources/views/filament/company/pages/reports/detailed-report.blade.php ファイルの表示

@@ -17,14 +17,16 @@
17 17
                 </form>
18 18
             </div>
19 19
             <div class="divide-y divide-gray-200 overflow-x-auto overflow-y-hidden dark:divide-white/10 dark:border-t-white/10">
20
-                <div class="flex items-center justify-center">
20
+                <div wire:init="loadReportData" class="flex items-center justify-center">
21 21
                     <div wire:loading.delay wire:target="loadReportData">
22 22
                         <x-filament::loading-indicator class="p-6 text-primary-700 dark:text-primary-300" />
23 23
                     </div>
24 24
                 </div>
25 25
 
26 26
                 <div wire:loading.remove wire:target="loadReportData">
27
-                    <x-company.tables.reports.detailed-report :report="$this->report" />
27
+                    @if($this->report)
28
+                        <x-company.tables.reports.detailed-report :report="$this->report" />
29
+                    @endif
28 30
                 </div>
29 31
             </div>
30 32
             <div class="es-table__footer-ctn border-t border-gray-200"></div>

読み込み中…
キャンセル
保存