diff --git a/packages/tables/resources/views/index.blade.php b/packages/tables/resources/views/index.blade.php index d78632db0f..a462231c4a 100644 --- a/packages/tables/resources/views/index.blade.php +++ b/packages/tables/resources/views/index.blade.php @@ -1649,9 +1649,6 @@ class="fi-ta-record-checkbox fi-checkbox-input" }} > <{{ $columnWrapperTag }} - @if (filled($columnTooltip = $column->getTooltip())) - x-tooltip="{ content: @js($columnTooltip), theme: $store.theme }" - @endif @if ($columnWrapperTag === 'a') {{ \Filament\Support\generate_href_html($columnUrl ?: $recordUrl, $columnUrl ? $column->shouldOpenUrlInNewTab() : $openRecordUrlInNewTab) }} @elseif ($columnWrapperTag === 'button') diff --git a/packages/tables/src/Columns/CheckboxColumn.php b/packages/tables/src/Columns/CheckboxColumn.php index 1bcc9fae5f..3d33c6d3ff 100644 --- a/packages/tables/src/Columns/CheckboxColumn.php +++ b/packages/tables/src/Columns/CheckboxColumn.php @@ -50,6 +50,12 @@ public function toEmbeddedHtml(): string ->merge([ 'disabled' => $isDisabled, 'x-bind:disabled' => $isDisabled ? null : 'isLoading', + 'x-tooltip' => filled($tooltip = $this->getTooltip($state)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class([ 'fi-checkbox-input', diff --git a/packages/tables/src/Columns/ColorColumn.php b/packages/tables/src/Columns/ColorColumn.php index 0593c07022..8d3fe3f2e7 100644 --- a/packages/tables/src/Columns/ColorColumn.php +++ b/packages/tables/src/Columns/ColorColumn.php @@ -28,7 +28,17 @@ public function toEmbeddedHtml(): string 'fi-inline' => $this->isInline(), ]); - if (empty($state)) { + if (blank($state)) { + $attributes = $attributes + ->merge([ + 'x-tooltip' => filled($tooltip = $this->getEmptyTooltip()) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, + ], escape: false); + $placeholder = $this->getPlaceholder(); ob_start(); ?> @@ -83,6 +93,12 @@ public function toEmbeddedHtml(): string }) JS : null, + 'x-tooltip' => filled($tooltip = $this->getTooltip($stateItem)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class([ 'fi-ta-color-item', diff --git a/packages/tables/src/Columns/Column.php b/packages/tables/src/Columns/Column.php index d200d0ea7c..cf48f50e73 100644 --- a/packages/tables/src/Columns/Column.php +++ b/packages/tables/src/Columns/Column.php @@ -11,13 +11,12 @@ use Filament\Support\Concerns\HasCellState; use Filament\Support\Concerns\HasExtraAttributes; use Filament\Support\Concerns\HasPlaceholder; -use Filament\Support\Concerns\HasTooltip; use Filament\Support\Concerns\HasVerticalAlignment; use Filament\Support\Enums\Alignment; +use Filament\Tables\Columns\Concerns\HasTooltip; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\HtmlString; -use Illuminate\Support\Js; use Illuminate\View\ComponentAttributeBag; use function Filament\Support\generate_href_html; @@ -157,12 +156,6 @@ public function renderInLayout(): ?HtmlString $attributes = $attributes ->merge([ - 'x-tooltip' => filled($tooltip = $this->getTooltip()) - ? '{ - content: ' . Js::from($tooltip) . ', - theme: $store.theme, - }' - : null, 'type' => ($wrapperTag === 'button') ? 'button' : null, 'wire:click' => $wireClickAction = match (true) { ($wrapperTag !== 'button') => null, diff --git a/packages/tables/src/Columns/Concerns/HasTooltip.php b/packages/tables/src/Columns/Concerns/HasTooltip.php new file mode 100644 index 0000000000..f19f53a604 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasTooltip.php @@ -0,0 +1,38 @@ +tooltip = $tooltip; + + return $this; + } + + public function getTooltip(mixed $state = null): ?string + { + return $this->evaluate($this->tooltip, [ + 'state' => $state, + ]); + } + + public function emptyTooltip(string | Closure | null $tooltip): static + { + $this->emptyTooltip = $tooltip; + + return $this; + } + + public function getEmptyTooltip(): ?string + { + return $this->evaluate($this->emptyTooltip); + } +} diff --git a/packages/tables/src/Columns/IconColumn.php b/packages/tables/src/Columns/IconColumn.php index 11916cb4b9..589047fd44 100644 --- a/packages/tables/src/Columns/IconColumn.php +++ b/packages/tables/src/Columns/IconColumn.php @@ -10,6 +10,7 @@ use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Arr; use Illuminate\Support\Collection; +use Illuminate\Support\Js; use Illuminate\View\ComponentAttributeBag; use function Filament\Support\generate_icon_html; @@ -254,7 +255,17 @@ public function toEmbeddedHtml(): string 'fi-inline' => $this->isInline(), ]); - if (empty($state)) { + if (blank($state)) { + $attributes = $attributes + ->merge([ + 'x-tooltip' => filled($tooltip = $this->getEmptyTooltip()) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, + ], escape: false); + $placeholder = $this->getPlaceholder(); ob_start(); ?> @@ -290,6 +301,14 @@ public function toEmbeddedHtml(): string ?> getIcon($stateItem), attributes: (new ComponentAttributeBag) + ->merge([ + 'x-tooltip' => filled($tooltip = $this->getTooltip($stateItem)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, + ], escape: false) ->class([ match ($color) { null, 'gray' => null, diff --git a/packages/tables/src/Columns/ImageColumn.php b/packages/tables/src/Columns/ImageColumn.php index 2d2e01b089..4c58126a6e 100644 --- a/packages/tables/src/Columns/ImageColumn.php +++ b/packages/tables/src/Columns/ImageColumn.php @@ -10,6 +10,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Js; use Illuminate\View\ComponentAttributeBag; use League\Flysystem\UnableToCheckFileExistence; use Throwable; @@ -349,7 +350,17 @@ public function toEmbeddedHtml(): string 'fi-inline' => $this->isInline(), ]); - if (empty($state)) { + if (blank($state)) { + $attributes = $attributes + ->merge([ + 'x-tooltip' => filled($tooltip = $this->getEmptyTooltip()) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, + ], escape: false); + $placeholder = $this->getPlaceholder(); ob_start(); ?> @@ -407,6 +418,12 @@ public function toEmbeddedHtml(): string getExtraImgAttributeBag() ->merge([ 'src' => filled($stateItem) ? $this->getImageUrl($stateItem) : $defaultImageUrl, + 'x-tooltip' => filled($tooltip = $this->getTooltip($stateItem)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ]) ->style([ "height: {$height}" => $height, diff --git a/packages/tables/src/Columns/SelectColumn.php b/packages/tables/src/Columns/SelectColumn.php index c957665b13..c16c1e35c8 100644 --- a/packages/tables/src/Columns/SelectColumn.php +++ b/packages/tables/src/Columns/SelectColumn.php @@ -75,6 +75,12 @@ public function toEmbeddedHtml(): string ->merge([ 'disabled' => $isDisabled, 'x-bind:disabled' => $isDisabled ? null : 'isLoading', + 'x-tooltip' => filled($tooltip = $this->getTooltip($state)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class([ 'fi-select-input', diff --git a/packages/tables/src/Columns/TextColumn.php b/packages/tables/src/Columns/TextColumn.php index 4e6512a8a1..9dbe29291a 100644 --- a/packages/tables/src/Columns/TextColumn.php +++ b/packages/tables/src/Columns/TextColumn.php @@ -183,7 +183,17 @@ public function toEmbeddedHtml(): string 'fi-inline' => $this->isInline(), ]); - if (empty($state)) { + if (blank($state)) { + $attributes = $attributes + ->merge([ + 'x-tooltip' => filled($tooltip = $this->getEmptyTooltip()) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, + ], escape: false); + $placeholder = $this->getPlaceholder(); ob_start(); ?> @@ -303,6 +313,12 @@ public function toEmbeddedHtml(): string }) JS : null, + 'x-tooltip' => filled($tooltip = $this->getTooltip($stateItem)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class([ 'fi-ta-text-item', diff --git a/packages/tables/src/Columns/TextInputColumn.php b/packages/tables/src/Columns/TextInputColumn.php index b3589550aa..12975b3c59 100644 --- a/packages/tables/src/Columns/TextInputColumn.php +++ b/packages/tables/src/Columns/TextInputColumn.php @@ -97,6 +97,12 @@ public function toEmbeddedHtml(): string 'step' => $this->getStep(), 'type' => $type, 'x-mask' . ($mask instanceof RawJs ? ':dynamic' : '') => filled($mask) ? $mask : null, + 'x-tooltip' => filled($tooltip = $this->getTooltip($state)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class([ 'fi-input', diff --git a/packages/tables/src/Columns/ToggleColumn.php b/packages/tables/src/Columns/ToggleColumn.php index 7f735e4fc7..ecc24313b8 100644 --- a/packages/tables/src/Columns/ToggleColumn.php +++ b/packages/tables/src/Columns/ToggleColumn.php @@ -60,6 +60,12 @@ public function toEmbeddedHtml(): string $buttonAttributes = (new ComponentAttributeBag) ->merge([ 'disabled' => $this->isDisabled(), + 'x-tooltip' => filled($tooltip = $this->getTooltip($state)) + ? '{ + content: ' . Js::from($tooltip) . ', + theme: $store.theme, + }' + : null, ], escape: false) ->class(['fi-toggle']);