123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <?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 Livewire\Attributes\Session;
-
- trait HasToggleTableColumnForm
- {
- #[Session]
- public array $toggledTableColumns = [];
-
- public function mountHasToggleTableColumnForm(): void
- {
- $this->loadDefaultTableColumnToggleState();
- }
-
- protected function getHasToggleTableColumnFormForms(): array
- {
- return [
- 'toggleTableColumnForm' => $this->getToggleTableColumnForm(),
- ];
- }
-
- public function getToggleTableColumnForm(): Form
- {
- return $this->toggleTableColumnForm($this->makeForm()
- ->statePath('toggledTableColumns'));
- }
-
- public function toggleTableColumnForm(Form $form): Form
- {
- return $form;
- }
-
- protected function hasToggleableColumns(): bool
- {
- return ! empty($this->getTableColumnToggleFormSchema());
- }
-
- /**
- * @return array<Checkbox>
- */
- protected function getTableColumnToggleFormSchema(): array
- {
- $schema = [];
-
- foreach ($this->getTable() as $column) {
- if ($column->isToggleable()) {
- $schema[] = Checkbox::make($column->getName())
- ->label($column->getLabel());
- }
- }
-
- return $schema;
- }
-
- public function toggleColumnsAction(): 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');
- }
-
- protected function loadDefaultTableColumnToggleState(): void
- {
- $tableColumns = $this->getTable();
-
- foreach ($tableColumns as $column) {
- $columnName = $column->getName();
-
- if (empty($this->toggledTableColumns)) {
- if ($column->isToggleable()) {
- $this->toggledTableColumns[$columnName] = ! $column->isToggledHiddenByDefault();
- } else {
- $this->toggledTableColumns[$columnName] = true;
- }
- }
-
- // Handle cases where the toggle state needs to be reset
- if (! $column->isToggleable()) {
- $this->toggledTableColumns[$columnName] = true;
- } elseif ($column->isToggleable() && $column->isToggledHiddenByDefault() && isset($this->toggledTableColumns[$columnName]) && $this->toggledTableColumns[$columnName]) {
- $this->toggledTableColumns[$columnName] = false;
- }
- }
- }
-
- protected function getToggledColumns(): array
- {
- return array_values(
- array_filter(
- $this->getTable(),
- fn (Column $column) => $this->toggledTableColumns[$column->getName()] ?? false,
- )
- );
- }
- }
|