fix: Hidden summaries

This commit is contained in:
Dan Harrin
2025-06-23 10:53:28 +01:00
parent 241a2e8ad2
commit ab736d0fba
8 changed files with 53 additions and 34 deletions
@@ -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
<x-filament-tables::summary.header-cell
@@ -94,8 +97,7 @@
</x-filament-tables::row>
@php
$query = $this->getPageTableSummaryQuery();
$selectedState = $this->getTableSummarySelectedState($query)[0] ?? [];
$selectedState = $this->getTableSummarySelectedState($pageTableSummaryQuery)[0] ?? [];
@endphp
<x-filament-tables::summary.row
@@ -105,7 +107,7 @@
:extra-heading-column="$extraHeadingColumn"
:heading="__('filament-tables::table.summary.subheadings.page', ['label' => $pluralModelLabel])"
:placeholder-columns="$placeholderColumns"
:query="$query"
:query="$pageTableSummaryQuery"
:record-checkbox-position="$recordCheckboxPosition"
:selected-state="$selectedState"
:selection-enabled="$selectionEnabled"
@@ -113,8 +115,7 @@
@endif
@php
$query = $this->getAllTableSummaryQuery();
$selectedState = $this->getTableSummarySelectedState($query)[0] ?? [];
$selectedState = $this->getTableSummarySelectedState($allTableSummaryQuery)[0] ?? [];
@endphp
<x-filament-tables::summary.row
@@ -125,7 +126,7 @@
:groups-only="$groupsOnly"
:heading="__(($hasPageSummary ? 'filament-tables::table.summary.subheadings.all' : 'filament-tables::table.summary.heading'), ['label' => $pluralModelLabel])"
:placeholder-columns="$placeholderColumns"
:query="$query"
:query="$allTableSummaryQuery"
:record-checkbox-position="$recordCheckboxPosition"
:selected-state="$selectedState"
:selection-enabled="$selectionEnabled"
@@ -57,7 +57,7 @@
continue;
}
if ($column->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 }}
</span>
@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
</x-filament-tables::cell>
@@ -24,7 +24,7 @@
$filterIndicators = $getFilterIndicators();
$hasColumnGroups = $hasColumnGroups();
$hasColumnsLayout = $hasColumnsLayout();
$hasSummary = $hasSummary();
$hasSummary = $hasSummary($this->getFilteredTableQuery());
$header = $getHeader();
$headerActions = array_filter(
$getHeaderActions(),
@@ -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<string | int, Summarizer>
*/
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));
}
}
@@ -10,6 +10,11 @@ trait CanBeHidden
protected bool | Closure $isVisible = true;
/**
* @var array<string, bool>
*/
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
@@ -33,7 +33,7 @@ trait CanSummarizeRecords
$selects = [];
foreach ($this->getTable()->getVisibleColumns() as $column) {
$summarizers = $column->getSummarizers();
$summarizers = $column->getSummarizers($query);
if (! count($summarizers)) {
continue;
@@ -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;
}
}
@@ -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)) {