You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HasTableColumnToggleForm.php 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace App\Filament\Company\Pages\Concerns;
  3. use App\Support\Column;
  4. use Filament\Actions\Action;
  5. use Filament\Forms\Components\Checkbox;
  6. use Filament\Forms\Form;
  7. use Filament\Support\Enums\ActionSize;
  8. use Filament\Support\Facades\FilamentIcon;
  9. use Illuminate\Support\Arr;
  10. trait HasTableColumnToggleForm
  11. {
  12. public array $toggledTableColumns = [];
  13. public function mountHasTableColumnToggleForm(): void
  14. {
  15. if (! count($this->toggledTableColumns ?? [])) {
  16. $this->getTableColumnToggleForm()->fill(session()->get(
  17. $this->getTableColumnToggleFormStateSessionKey(),
  18. $this->getDefaultTableColumnToggleState()
  19. ));
  20. }
  21. }
  22. protected function getDefaultTableColumnToggleState(): array
  23. {
  24. $state = [];
  25. foreach ($this->getTable() as $column) {
  26. if (! $column->isToggleable()) {
  27. continue;
  28. }
  29. data_set($state, $column->getName(), ! $column->isToggledHiddenByDefault());
  30. }
  31. return $state;
  32. }
  33. public function updatedToggledTableColumns(): void
  34. {
  35. session()->put([
  36. $this->getTableColumnToggleFormStateSessionKey() => $this->toggledTableColumns,
  37. ]);
  38. }
  39. public function getTableColumnToggleForm(): Form
  40. {
  41. if ((! $this->isCachingForms) && $this->hasCachedForm('toggleTableColumnForm')) {
  42. return $this->getForm('toggleTableColumnForm');
  43. }
  44. return $this->makeForm()
  45. ->schema($this->getTableColumnToggleFormSchema())
  46. ->statePath('toggledTableColumns')
  47. ->live();
  48. }
  49. protected function hasToggleableColumns(): bool
  50. {
  51. return ! empty($this->getTableColumnToggleFormSchema());
  52. }
  53. /**
  54. * @return array<Checkbox>
  55. */
  56. protected function getTableColumnToggleFormSchema(): array
  57. {
  58. $schema = [];
  59. foreach ($this->getTable() as $column) {
  60. if (! $column->isToggleable()) {
  61. continue;
  62. }
  63. $schema[] = Checkbox::make($column->getName())
  64. ->label($column->getLabel());
  65. }
  66. return $schema;
  67. }
  68. public function isTableColumnToggledHidden(string $name): bool
  69. {
  70. return Arr::has($this->toggledTableColumns, $name) && ! data_get($this->toggledTableColumns, $name);
  71. }
  72. public function getTableColumnToggleFormStateSessionKey(): string
  73. {
  74. $table = class_basename($this::class);
  75. return "tables.{$table}_toggled_columns";
  76. }
  77. public function getToggleColumnsTriggerAction(): Action
  78. {
  79. return Action::make('toggleColumns')
  80. ->label(__('filament-tables::table.actions.toggle_columns.label'))
  81. ->iconButton()
  82. ->size(ActionSize::Large)
  83. ->icon(FilamentIcon::resolve('tables::actions.toggle-columns') ?? 'heroicon-m-view-columns')
  84. ->color('gray')
  85. ->livewireClickHandlerEnabled(false);
  86. }
  87. protected function getToggledColumns(): array
  88. {
  89. return array_values(
  90. array_filter(
  91. $this->getTable(),
  92. fn (Column $column) => ! $column->isToggleable() || ($this->toggledTableColumns[$column->getName()] ?? false)
  93. )
  94. );
  95. }
  96. }