| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | <?php
namespace App\Filament\Company\Pages\Concerns;
use App\Support\Column;
use Filament\Actions\Action;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Form;
use Filament\Support\Enums\ActionSize;
use Filament\Support\Facades\FilamentIcon;
use Illuminate\Support\Arr;
trait HasTableColumnToggleForm
{
    public array $toggledTableColumns = [];
    public function mountHasTableColumnToggleForm(): void
    {
        if (! count($this->toggledTableColumns ?? [])) {
            $this->getTableColumnToggleForm()->fill(session()->get(
                $this->getTableColumnToggleFormStateSessionKey(),
                $this->getDefaultTableColumnToggleState()
            ));
        }
    }
    protected function getDefaultTableColumnToggleState(): array
    {
        $state = [];
        foreach ($this->getTable() as $column) {
            if (! $column->isToggleable()) {
                continue;
            }
            data_set($state, $column->getName(), ! $column->isToggledHiddenByDefault());
        }
        return $state;
    }
    public function updatedToggledTableColumns(): void
    {
        session()->put([
            $this->getTableColumnToggleFormStateSessionKey() => $this->toggledTableColumns,
        ]);
    }
    public function getTableColumnToggleForm(): Form
    {
        if ((! $this->isCachingForms) && $this->hasCachedForm('toggleTableColumnForm')) {
            return $this->getForm('toggleTableColumnForm');
        }
        return $this->makeForm()
            ->schema($this->getTableColumnToggleFormSchema())
            ->statePath('toggledTableColumns')
            ->live();
    }
    protected function hasToggleableColumns(): bool
    {
        return ! empty($this->getTableColumnToggleFormSchema());
    }
    /**
     * @return array<Checkbox>
     */
    protected function getTableColumnToggleFormSchema(): array
    {
        $schema = [];
        foreach ($this->getTable() as $column) {
            if (! $column->isToggleable()) {
                continue;
            }
            $schema[] = Checkbox::make($column->getName())
                ->label($column->getLabel());
        }
        return $schema;
    }
    public function isTableColumnToggledHidden(string $name): bool
    {
        return Arr::has($this->toggledTableColumns, $name) && ! data_get($this->toggledTableColumns, $name);
    }
    public function getTableColumnToggleFormStateSessionKey(): string
    {
        $table = class_basename($this::class);
        return "tables.{$table}_toggled_columns";
    }
    public function getToggleColumnsTriggerAction(): Action
    {
        return Action::make('toggleColumns')
            ->label(__('filament-tables::table.actions.toggle_columns.label'))
            ->iconButton()
            ->size(ActionSize::Large)
            ->icon(FilamentIcon::resolve('tables::actions.toggle-columns') ?? 'heroicon-m-view-columns')
            ->color('gray')
            ->livewireClickHandlerEnabled(false);
    }
    protected function getToggledColumns(): array
    {
        return array_values(
            array_filter(
                $this->getTable(),
                fn (Column $column) => ! $column->isToggleable() || ($this->toggledTableColumns[$column->getName()] ?? false)
            )
        );
    }
}
 |