From ab736d0fbad6b5befe4d4faae9d2ba1ba06add8e Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 23 Jun 2025 10:53:28 +0100 Subject: [PATCH] fix: Hidden summaries --- .../views/components/summary/index.blade.php | 15 ++++++++------- .../views/components/summary/row.blade.php | 16 +++++----------- .../tables/resources/views/index.blade.php | 2 +- .../src/Columns/Concerns/CanBeSummarized.php | 15 ++++++++++++--- .../Summarizers/Concerns/CanBeHidden.php | 18 +++++++++++++++--- .../src/Concerns/CanSummarizeRecords.php | 2 +- .../src/Table/Concerns/CanSummarizeRecords.php | 15 +++++++++++---- .../tables/src/Table/Concerns/HasColumns.php | 4 ---- 8 files changed, 53 insertions(+), 34 deletions(-) diff --git a/packages/tables/resources/views/components/summary/index.blade.php b/packages/tables/resources/views/components/summary/index.blade.php index df70924bad..3a4fc3970a 100644 --- a/packages/tables/resources/views/components/summary/index.blade.php +++ b/packages/tables/resources/views/components/summary/index.blade.php @@ -25,6 +25,9 @@ } $hasPageSummary = (! $groupsOnly) && $records instanceof \Illuminate\Contracts\Pagination\Paginator && $records->hasPages(); + + $pageTableSummaryQuery = $hasPageSummary ? $this->getPageTableSummaryQuery() : null; + $allTableSummaryQuery = $this->getAllTableSummaryQuery(); @endphp @if ($hasPageSummary) @@ -54,7 +57,7 @@ $alignment = filled($alignment) ? (Alignment::tryFrom($alignment) ?? $alignment) : null; } - $hasColumnHeaderLabel = (! $placeholderColumns) || $column->hasSummary(); + $hasColumnHeaderLabel = (! $placeholderColumns) || ($pageTableSummaryQuery && $column->hasSummary($pageTableSummaryQuery)) || $column->hasSummary($allTableSummaryQuery); @endphp @php - $query = $this->getPageTableSummaryQuery(); - $selectedState = $this->getTableSummarySelectedState($query)[0] ?? []; + $selectedState = $this->getTableSummarySelectedState($pageTableSummaryQuery)[0] ?? []; @endphp getAllTableSummaryQuery(); - $selectedState = $this->getTableSummarySelectedState($query)[0] ?? []; + $selectedState = $this->getTableSummarySelectedState($allTableSummaryQuery)[0] ?? []; @endphp hasSummary()) { + if ($column->hasSummary($query)) { break; } @@ -67,7 +67,7 @@ @endif @foreach ($columns as $column) - @if (($loop->first || $extraHeadingColumn || $groupsOnly || ($loop->iteration > $headingColumnSpan)) && ($placeholderColumns || $column->hasSummary())) + @if (($loop->first || $extraHeadingColumn || $groupsOnly || ($loop->iteration > $headingColumnSpan)) && ($placeholderColumns || $column->hasSummary($query))) @php $alignment = $column->getAlignment() ?? Alignment::Start; @@ -96,15 +96,9 @@ > {{ $heading }} - @elseif ((! $placeholderColumns) || $column->hasSummary()) - @foreach ($column->getSummarizers() as $summarizer) - @php - $summarizer->query($query)->selectedState($selectedState); - @endphp - - @if ($summarizer->isVisible()) - {{ $summarizer }} - @endif + @elseif ((! $placeholderColumns) || $column->hasSummary($query)) + @foreach ($column->getSummarizers($query) as $summarizer) + {{ $summarizer->query($query)->selectedState($selectedState) }} @endforeach @endif diff --git a/packages/tables/resources/views/index.blade.php b/packages/tables/resources/views/index.blade.php index 7439e65bb3..304a22dc8f 100644 --- a/packages/tables/resources/views/index.blade.php +++ b/packages/tables/resources/views/index.blade.php @@ -24,7 +24,7 @@ $filterIndicators = $getFilterIndicators(); $hasColumnGroups = $hasColumnGroups(); $hasColumnsLayout = $hasColumnsLayout(); - $hasSummary = $hasSummary(); + $hasSummary = $hasSummary($this->getFilteredTableQuery()); $header = $getHeader(); $headerActions = array_filter( $getHeaderActions(), diff --git a/packages/tables/src/Columns/Concerns/CanBeSummarized.php b/packages/tables/src/Columns/Concerns/CanBeSummarized.php index 27ff10c15a..6a07acb37c 100644 --- a/packages/tables/src/Columns/Concerns/CanBeSummarized.php +++ b/packages/tables/src/Columns/Concerns/CanBeSummarized.php @@ -2,7 +2,9 @@ namespace Filament\Tables\Columns\Concerns; +use Closure; use Filament\Tables\Columns\Summarizers\Summarizer; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Arr; trait CanBeSummarized @@ -38,13 +40,20 @@ trait CanBeSummarized /** * @return array */ - public function getSummarizers(): array + public function getSummarizers(Builder | Closure | null $query = null): array { + if ($query) { + return array_filter( + $this->summarizers, + fn (Summarizer $summarizer): bool => $summarizer->query($query)->isVisible(), + ); + } + return $this->summarizers; } - public function hasSummary(): bool + public function hasSummary(Builder | Closure | null $query = null): bool { - return (bool) count($this->getSummarizers()); + return (bool) count($this->getSummarizers($query)); } } diff --git a/packages/tables/src/Columns/Summarizers/Concerns/CanBeHidden.php b/packages/tables/src/Columns/Summarizers/Concerns/CanBeHidden.php index fbfc252393..514c97c442 100644 --- a/packages/tables/src/Columns/Summarizers/Concerns/CanBeHidden.php +++ b/packages/tables/src/Columns/Summarizers/Concerns/CanBeHidden.php @@ -10,6 +10,11 @@ trait CanBeHidden protected bool | Closure $isVisible = true; + /** + * @var array + */ + protected array $visibilityCache = []; + public function hidden(bool | Closure $condition = true): static { $this->isHidden = $condition; @@ -26,11 +31,18 @@ trait CanBeHidden public function isHidden(): bool { - if ($this->evaluate($this->isHidden)) { - return true; + $query = $this->getQuery(); + $querySql = $query ? md5($query->toRawSql()) : ''; + + if (array_key_exists($querySql, $this->visibilityCache)) { + return $this->visibilityCache[$querySql]; } - return ! $this->evaluate($this->isVisible); + if ($this->evaluate($this->isHidden)) { + return $this->visibilityCache[$querySql] = true; + } + + return $this->visibilityCache[$querySql] = ! $this->evaluate($this->isVisible); } public function isVisible(): bool diff --git a/packages/tables/src/Concerns/CanSummarizeRecords.php b/packages/tables/src/Concerns/CanSummarizeRecords.php index 2b8b0a41cd..aac1385596 100644 --- a/packages/tables/src/Concerns/CanSummarizeRecords.php +++ b/packages/tables/src/Concerns/CanSummarizeRecords.php @@ -33,7 +33,7 @@ trait CanSummarizeRecords $selects = []; foreach ($this->getTable()->getVisibleColumns() as $column) { - $summarizers = $column->getSummarizers(); + $summarizers = $column->getSummarizers($query); if (! count($summarizers)) { continue; diff --git a/packages/tables/src/Table/Concerns/CanSummarizeRecords.php b/packages/tables/src/Table/Concerns/CanSummarizeRecords.php index aa2c935ebd..289c2b0995 100644 --- a/packages/tables/src/Table/Concerns/CanSummarizeRecords.php +++ b/packages/tables/src/Table/Concerns/CanSummarizeRecords.php @@ -2,12 +2,19 @@ namespace Filament\Tables\Table\Concerns; +use Closure; +use Illuminate\Database\Eloquent\Builder; + trait CanSummarizeRecords { - protected bool $hasSummary = false; - - public function hasSummary(): bool + public function hasSummary(Builder | Closure | null $query): bool { - return $this->hasSummary; + foreach ($this->getColumns() as $column) { + if ($column->hasSummary($query)) { + return true; + } + } + + return false; } } diff --git a/packages/tables/src/Table/Concerns/HasColumns.php b/packages/tables/src/Table/Concerns/HasColumns.php index c3519ccdfa..8941b6c79e 100644 --- a/packages/tables/src/Table/Concerns/HasColumns.php +++ b/packages/tables/src/Table/Concerns/HasColumns.php @@ -81,10 +81,6 @@ trait HasColumns } foreach ($this->columns as $column) { - if ($column->hasSummary()) { - $this->hasSummary = true; - } - $action = $column->getAction(); if (($action === null) || ($action instanceof Closure)) {