diff --git a/resources/views/components/tools/filter-pills.blade.php b/resources/views/components/tools/filter-pills.blade.php index c0817ea97..613c5b906 100644 --- a/resources/views/components/tools/filter-pills.blade.php +++ b/resources/views/components/tools/filter-pills.blade.php @@ -1,33 +1,30 @@ @aware([ 'tableName','isTailwind','isBootstrap','isBootstrap4','isBootstrap5']) -@if ($this->filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills()) -
-
$isTailwind, - 'mb-3' => $isBootstrap, - ]) x-cloak x-show="!currentlyReorderingStatus"> - $isTailwind, - '' => $isBootstrap, - ])> - {{ __($this->getLocalisationPath.'Applied Filters') }}: - +
+
$isTailwind, + 'mb-3' => $isBootstrap, + ]) x-cloak x-show="!currentlyReorderingStatus"> + $isTailwind, + '' => $isBootstrap, + ])> + {{ __($this->getLocalisationPath.'Applied Filters') }}: + - @foreach($this->getAppliedFiltersWithValues() as $filterSelectName => $value) - @php($filter = $this->getFilterByKey($filterSelectName)) - @continue(is_null($filter) || $filter->isHiddenFromPills()) - @php( $filterPillTitle = $filter->getFilterPillTitle()) - @php( $filterPillValue = $filter->getFilterPillValue($value)) - @php( $separator = method_exists($filter, 'getPillsSeparator') ? $filter->getPillsSeparator() : ', ') - @continue((is_array($filterPillValue) && empty($filterPillValue))) - - @if ($filter->hasCustomPillBlade()) - @include($filter->getCustomPillBlade(), ['filter' => $filter]) - @else - - @endif - @endforeach - -
+ @tableloop($this->getAppliedFiltersWithValues() as $filterSelectName => $value) + @php($filter = $this->getFilterByKey($filterSelectName)) + @continue(is_null($filter) || $filter->isHiddenFromPills()) + @php( $filterPillValue = $filter->getFilterPillValue($value)) + @continue((is_array($filterPillValue) && empty($filterPillValue))) + @php( $filterPillTitle = $filter->getFilterPillTitle()) + @php( $separator = method_exists($filter, 'getPillsSeparator') ? $filter->getPillsSeparator() : ', ') + @if ($filter->hasCustomPillBlade()) + @include($filter->getCustomPillBlade(), ['filter' => $filter]) + @else + + @endif + @endtableloop +
-@endif +
diff --git a/resources/views/components/tools/filter-pills/item.blade.php b/resources/views/components/tools/filter-pills/item.blade.php index 110766238..740c86512 100644 --- a/resources/views/components/tools/filter-pills/item.blade.php +++ b/resources/views/components/tools/filter-pills/item.blade.php @@ -3,12 +3,12 @@ merge($this->getFilterPillsItemAttributes()) + $attributes->merge($this->getFilterPillsItemAttributes) ->class([ - 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium leading-4 capitalize' => $isTailwind && $this->getFilterPillsItemAttributes()['default-styling'], - 'bg-indigo-100 text-indigo-800 dark:bg-indigo-200 dark:text-indigo-900' => $isTailwind && $this->getFilterPillsItemAttributes()['default-colors'], - 'badge badge-pill badge-info d-inline-flex align-items-center' => $isBootstrap4 && $this->getFilterPillsItemAttributes()['default-styling'], - 'badge rounded-pill bg-info d-inline-flex align-items-center' => $isBootstrap5 && $this->getFilterPillsItemAttributes()['default-styling'], + 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium leading-4 capitalize' => $isTailwind && $this->getFilterPillsItemAttributes['default-styling'], + 'bg-indigo-100 text-indigo-800 dark:bg-indigo-200 dark:text-indigo-900' => $isTailwind && $this->getFilterPillsItemAttributes['default-colors'], + 'badge badge-pill badge-info d-inline-flex align-items-center' => $isBootstrap4 && $this->getFilterPillsItemAttributes['default-styling'], + 'badge rounded-pill bg-info d-inline-flex align-items-center' => $isBootstrap5 && $this->getFilterPillsItemAttributes['default-styling'], ]) ->except(['default-styling', 'default-colors']) }} diff --git a/resources/views/datatable.blade.php b/resources/views/datatable.blade.php index 5a089ce88..2fb08a7b9 100644 --- a/resources/views/datatable.blade.php +++ b/resources/views/datatable.blade.php @@ -7,139 +7,141 @@ @php($isBootstrap5 = $this->isBootstrap5)
-
getTopLevelAttributes() }}> - - @includeWhen( - $this->hasConfigurableAreaFor('before-wrapper'), - $this->getConfigurableAreaFor('before-wrapper'), - $this->getParametersForConfigurableArea('before-wrapper') - ) - - - @if($this->hasActions && !$this->showActionsInToolbar) - - @endif +
+
getTopLevelAttributes() }}> @includeWhen( - $this->hasConfigurableAreaFor('before-tools'), - $this->getConfigurableAreaFor('before-tools'), - $this->getParametersForConfigurableArea('before-tools') + $this->hasConfigurableAreaFor('before-wrapper'), + $this->getConfigurableAreaFor('before-wrapper'), + $this->getParametersForConfigurableArea('before-wrapper') ) - @if($this->shouldShowTools) - - @if ($this->showSortPillsSection) - - @endif - @if($this->showFilterPillsSection) - + + @if($this->hasActions && !$this->showActionsInToolbar) + @endif @includeWhen( - $this->hasConfigurableAreaFor('before-toolbar'), - $this->getConfigurableAreaFor('before-toolbar'), - $this->getParametersForConfigurableArea('before-toolbar') + $this->hasConfigurableAreaFor('before-tools'), + $this->getConfigurableAreaFor('before-tools'), + $this->getParametersForConfigurableArea('before-tools') ) - @if($this->shouldShowToolBar) - - @endif - - @includeWhen( - $this->hasConfigurableAreaFor('after-toolbar'), - $this->getConfigurableAreaFor('after-toolbar'), - $this->getParametersForConfigurableArea('after-toolbar') - ) - - - @endif - - @includeWhen( - $this->hasConfigurableAreaFor('after-tools'), - $this->getConfigurableAreaFor('after-tools'), - $this->getParametersForConfigurableArea('after-tools') - ) + @if($this->shouldShowTools) + + @if ($this->showSortPillsSection) + + @endif + @if($this->showFilterPillsSection) + + @endif - + @includeWhen( + $this->hasConfigurableAreaFor('before-toolbar'), + $this->getConfigurableAreaFor('before-toolbar'), + $this->getParametersForConfigurableArea('before-toolbar') + ) - - @if($this->getCurrentlyReorderingStatus) - - @endif - @if($this->showBulkActionsSections) - - @endif - @if ($this->showCollapsingColumnSections) - - @endif + @if($this->shouldShowToolBar) + + @endif - @foreach($this->selectedVisibleColumns as $index => $column) - - @endforeach - + @includeWhen( + $this->hasConfigurableAreaFor('after-toolbar'), + $this->getConfigurableAreaFor('after-toolbar'), + $this->getParametersForConfigurableArea('after-toolbar') + ) - @if($this->secondaryHeaderIsEnabled() && $this->hasColumnsWithSecondaryHeader()) - - @endif - @if($this->hasDisplayLoadingPlaceholder()) - + @endif - @if($this->showBulkActionsSections) - - @endif + @includeWhen( + $this->hasConfigurableAreaFor('after-tools'), + $this->getConfigurableAreaFor('after-tools'), + $this->getParametersForConfigurableArea('after-tools') + ) + + - @forelse ($this->getRows as $rowIndex => $row) - + @if($this->getCurrentlyReorderingStatus) - + @endif @if($this->showBulkActionsSections) - + @endif @if ($this->showCollapsingColumnSections) - + @endif - @foreach($this->selectedVisibleColumns as $colIndex => $column) - - @if($column->isHtml()) - {!! $column->setIndexes($rowIndex, $colIndex)->renderContents($row) !!} - @else - {{ $column->setIndexes($rowIndex, $colIndex)->renderContents($row) }} - @endif - + @foreach($this->selectedVisibleColumns as $index => $column) + @endforeach - + + + @if($this->secondaryHeaderIsEnabled() && $this->hasColumnsWithSecondaryHeader()) + + @endif + @if($this->hasDisplayLoadingPlaceholder()) + + @endif - @if ($this->showCollapsingColumnSections) - + @if($this->showBulkActionsSections) + @endif - @empty - - @endforelse - - @if ($this->footerIsEnabled() && $this->hasColumnsWithFooter()) - - @if ($this->useHeaderAsFooterIsEnabled()) - - @else - + + @forelse ($this->getRows as $rowIndex => $row) + + @if($this->getCurrentlyReorderingStatus) + + @endif + @if($this->showBulkActionsSections) + + @endif + @if ($this->showCollapsingColumnSections) + + @endif + + @foreach($this->selectedVisibleColumns as $colIndex => $column) + + @if($column->isHtml()) + {!! $column->setIndexes($rowIndex, $colIndex)->renderContents($row) !!} + @else + {{ $column->setIndexes($rowIndex, $colIndex)->renderContents($row) }} + @endif + + @endforeach + + + @if ($this->showCollapsingColumnSections) + @endif - - @endif - + @empty + + @endforelse + + @if ($this->footerIsEnabled() && $this->hasColumnsWithFooter()) + + @if ($this->useHeaderAsFooterIsEnabled()) + + @else + + @endif + + @endif + - + - @includeIf($customView) - + @includeIf($customView) + - @includeWhen( - $this->hasConfigurableAreaFor('after-wrapper'), - $this->getConfigurableAreaFor('after-wrapper'), - $this->getParametersForConfigurableArea('after-wrapper') - ) + @includeWhen( + $this->hasConfigurableAreaFor('after-wrapper'), + $this->getConfigurableAreaFor('after-wrapper'), + $this->getParametersForConfigurableArea('after-wrapper') + ) +
diff --git a/src/Traits/Configuration/FilterConfiguration.php b/src/Traits/Configuration/FilterConfiguration.php deleted file mode 100644 index 059637361..000000000 --- a/src/Traits/Configuration/FilterConfiguration.php +++ /dev/null @@ -1,5 +0,0 @@ -getTableName(), $this->getFilterLayout(), $this->isTailwind(), $this->isBootstrap4(), $this->isBootstrap5()))->toArray(); - } - - public function setFilterGenericData(array $filterGenericData = []): void - { - $this->filterGenericData = $filterGenericData; - } - - public function hasFilterGenericData(): bool - { - return ! empty($this->filterGenericData); - } - - #[Computed] - public function getFilterGenericData(): array - { - if (! $this->hasFilterGenericData()) { - $this->setFilterGenericData($this->generateFilterGenericData()); - } - - return $this->filterGenericData; - } -} diff --git a/src/Traits/Core/Filters/HasFilterMenuStyling.php b/src/Traits/Core/Filters/HasFilterMenuStyling.php deleted file mode 100644 index cf511e8cd..000000000 --- a/src/Traits/Core/Filters/HasFilterMenuStyling.php +++ /dev/null @@ -1,212 +0,0 @@ - '', 'default-width' => true, 'default-colors' => true, 'default-styling' => true]; - - protected array $filterSlidedownWrapperAttributes = ['class' => '', 'default-colors' => true, 'default-styling' => true]; - - protected ?Closure $filterSlidedownRowCallback; - - /** - * Used to set attributes for the Filter Popover - */ - public function setFilterPopoverAttributes(array $filterPopoverAttributes): self - { - $this->filterPopoverAttributes = array_merge($this->filterPopoverAttributes, $filterPopoverAttributes); - - return $this; - } - - /** - * Used to set attributes for the Filter Slidedown Wrapper - */ - public function setFilterSlidedownWrapperAttributes(array $filterSlidedownWrapperAttributes): self - { - $this->filterSlidedownWrapperAttributes = array_merge($this->filterSlidedownWrapperAttributes, $filterSlidedownWrapperAttributes); - - return $this; - } - - /** - * Set a list of attributes to override on the th sort button elements - */ - public function setFilterSlidedownRowAttributes(Closure $callback): self - { - $this->filterSlidedownRowCallback = $callback; - - return $this; - } - - public function setFilterLayout(string $type): self - { - if (! in_array($type, ['popover', 'slide-down'], true)) { - throw new DataTableConfigurationException('Invalid filter layout type'); - } - - $this->filterLayout = $type; - - return $this; - } - - public function setFilterLayoutPopover(): self - { - $this->setFilterLayout('popover'); - - return $this; - } - - public function setFilterLayoutSlideDown(): self - { - $this->setFilterLayout('slide-down'); - - return $this; - } - - public function setFilterSlideDownDefaultStatus(bool $status): self - { - $this->filterSlideDownDefaultVisible = $status; - - return $this; - } - - public function setFilterSlideDownDefaultStatusDisabled(): self - { - $this->setFilterSlideDownDefaultStatus(false); - - return $this; - } - - public function setFilterSlideDownDefaultStatusEnabled(): self - { - $this->setFilterSlideDownDefaultStatus(true); - - return $this; - } - - /** - * Used to get attributes for the Filter Popover - * - * @return array - */ - #[Computed] - public function getFilterPopoverAttributes(): array - { - return $this->filterPopoverAttributes; - - } - - /** - * Used to get attributes for the Filter Slidedown Wrapper - * - * @return array - */ - #[Computed] - public function getFilterSlidedownWrapperAttributes(): array - { - return $this->filterSlidedownWrapperAttributes; - - } - - /** - * Used to get attributes for the Filter Slidedown Row - * - * @return array - */ - #[Computed] - public function getFilterSlidedownRowAttributes(string $rowIndex): array - { - - if (isset($this->filterSlidedownRowCallback)) { - return array_merge(['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => (int) $rowIndex], call_user_func($this->filterSlidedownRowCallback, (int) $rowIndex)); - } - - return ['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => (int) $rowIndex]; - } - - public function getFilterSlideDownDefaultStatus(): bool - { - return $this->filterSlideDownDefaultVisible; - } - - public function filtersSlideDownIsDefaultVisible(): bool - { - return $this->getFilterSlideDownDefaultStatus() === true; - } - - public function filtersSlideDownIsDefaultHidden(): bool - { - return $this->getFilterSlideDownDefaultStatus() === false; - } - - public function getFilterLayout(): string - { - return $this->filterLayout; - } - - public function isFilterLayoutPopover(): bool - { - return $this->getFilterLayout() === 'popover'; - } - - public function isFilterLayoutSlideDown(): bool - { - return $this->getFilterLayout() === 'slide-down'; - } - - /** - * Get whether any filter has a configured slide down row. - */ - public function hasFiltersWithSlidedownRows(): bool - { - return $this->getFilters() - ->reject(fn (Filter $filter) => ! $filter->hasFilterSlidedownRow()) - ->count() > 0; - } - - /** - * Get filters sorted by row - * - * @return array - */ - public function getFiltersByRow(): array - { - $orderedFilters = []; - $filterList = ($this->hasFiltersWithSlidedownRows()) ? $this->getVisibleFilters()->sortBy('filterSlidedownRow') : $this->getVisibleFilters(); - if ($this->hasFiltersWithSlidedownRows()) { - foreach ($filterList as $filter) { - $orderedFilters[(string) $filter->getFilterSlidedownRow()][] = $filter; - } - - if (empty($orderedFilters['1'])) { - $orderedFilters['1'] = (isset($orderedFilters['99']) ? $orderedFilters['99'] : []); - if (isset($orderedFilters['99'])) { - unset($orderedFilters['99']); - } - } - } else { - $orderedFilters = Arr::wrap($filterList); - $orderedFilters['1'] = $orderedFilters['0'] ?? []; - if (isset($orderedFilters['0'])) { - unset($orderedFilters['0']); - } - } - ksort($orderedFilters); - - return $orderedFilters; - } -} diff --git a/src/Traits/Core/Filters/HasFilterPillsStyling.php b/src/Traits/Core/Filters/HasFilterPillsStyling.php deleted file mode 100644 index 907dec0b2..000000000 --- a/src/Traits/Core/Filters/HasFilterPillsStyling.php +++ /dev/null @@ -1,73 +0,0 @@ - true, 'default-colors' => true, 'class' => '']; - - protected array $filterPillsResetFilterButtonAttributes = ['default-styling' => true, 'default-colors' => true, 'class' => '']; - - protected array $filterPillsResetAllButtonAttributes = ['default-styling' => true, 'default-colors' => true, 'class' => '']; - - public function setFilterPillsStatus(bool $status): self - { - $this->filterPillsStatus = $status; - - return $this; - } - - public function setFilterPillsEnabled(): self - { - $this->setFilterPillsStatus(true); - - return $this; - } - - public function setFilterPillsDisabled(): self - { - $this->setFilterPillsStatus(false); - - return $this; - } - - #[Computed] - public function showFilterPillsSection(): bool - { - return $this->filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills(); - } - - public function getFilterPillsStatus(): bool - { - return $this->filterPillsStatus; - } - - public function filterPillsAreEnabled(): bool - { - return $this->getFilterPillsStatus() === true; - } - - public function filterPillsAreDisabled(): bool - { - return $this->getFilterPillsStatus() === false; - } - - public function hasAppliedVisibleFiltersForPills(): bool - { - return collect($this->getAppliedFiltersWithValues()) - ->map(fn ($_item, $key) => $this->getFilterByKey($key)) - ->reject(fn (Filter $filter) => $filter->isHiddenFromPills()) - ->count() > 0; - } -} diff --git a/src/Traits/Core/Filters/HasFiltersStatus.php b/src/Traits/Core/Filters/HasFiltersStatus.php deleted file mode 100644 index 9558b896f..000000000 --- a/src/Traits/Core/Filters/HasFiltersStatus.php +++ /dev/null @@ -1,47 +0,0 @@ -filtersStatus; - } - - public function filtersAreEnabled(): bool - { - return $this->getFiltersStatus() === true; - } - - public function filtersAreDisabled(): bool - { - return $this->getFiltersStatus() === false; - } - - public function setFiltersStatus(bool $status): self - { - $this->filtersStatus = $status; - - return $this; - } - - public function setFiltersEnabled(): self - { - $this->setFiltersStatus(true); - - return $this; - } - - public function setFiltersDisabled(): self - { - $this->setFiltersStatus(false); - - return $this; - } -} diff --git a/src/Traits/Core/HasCustomAttributes.php b/src/Traits/Core/HasCustomAttributes.php index cbc3bcd85..a642c3cac 100644 --- a/src/Traits/Core/HasCustomAttributes.php +++ b/src/Traits/Core/HasCustomAttributes.php @@ -47,6 +47,31 @@ public function setCustomAttributes(string $propertyName, array $customAttribute return $this; } + protected function mergeCustomAttributes(string $propertyName, array $customAttributes): self + { + $mergedArray = array_merge($this->{$propertyName}, $customAttributes); + ksort($mergedArray); + $this->{$propertyName} = $mergedArray; + + return $this; + } + + protected function mergeCustomAttributesClassic(string $propertyName, array $customAttributes): self + { + $attributes = [...$this->getCustomAttributes(propertyName: $propertyName, default: false, classicMode: true), ...$customAttributes]; + ksort($attributes); + + return $this->setCustomAttributes($propertyName, $attributes); + } + + protected function mergeCustomAttributesModern(string $propertyName, array $customAttributes): self + { + $attributes = [...$this->getCustomAttributes(propertyName: $propertyName, default: false, classicMode: false), ...$customAttributes]; + ksort($attributes); + + return $this->setCustomAttributes($propertyName, $attributes); + } + public function getCustomAttributesBagFromArray(array $attributesArray): ComponentAttributeBag { return new ComponentAttributeBag($attributesArray); diff --git a/src/Traits/Core/Filters/ManagesFilters.php b/src/Traits/Filters/Configuration/FilterConfiguration.php similarity index 51% rename from src/Traits/Core/Filters/ManagesFilters.php rename to src/Traits/Filters/Configuration/FilterConfiguration.php index 72bf73ad2..c0b408870 100644 --- a/src/Traits/Core/Filters/ManagesFilters.php +++ b/src/Traits/Filters/Configuration/FilterConfiguration.php @@ -1,45 +1,82 @@ appliedFilters[$filterKey] = $this->filterComponents[$filterKey] = $value; + + $this->callHook('filterSet', ['filter' => $filterKey, 'value' => $value]); + $this->callTraitHook('filterSet', ['filter' => $filterKey, 'value' => $value]); + if ($this->getEventStatusFilterApplied() && $filterKey != null && $value != null) { + event(new FilterApplied($this->getTableName(), $filterKey, $value)); + } + $this->dispatch('filter-was-set', tableName: $this->getTableName(), filterKey: $filterKey, value: $value); + $this->storeFilterValues(); + + } + + #[On('clearFilters')] + #[On('clear-filters')] + public function setFilterDefaults(): void + { + foreach ($this->getFilters() as $filter) { + if ($filter->isResetByClearButton()) { + $this->resetFilter($filter); + } + } - // Set in Frontend - public array $appliedFilters = []; + } /** - * Sets Filter Default Values + * @param mixed $filter */ - public function mountManagesFilters(): void + public function resetFilter($filter): void { - $this->restoreFilterValues(); + if (! $filter instanceof Filter) { + $filter = $this->getFilterByKey($filter); + } + $this->callHook('filterReset', ['filter' => $filter->getKey()]); + $this->callTraitHook('filterReset', ['filter' => $filter->getKey()]); + $this->setFilter($filter->getKey(), $filter->getDefaultValue()); - foreach ($this->getFilters() as $filter) { - if (! isset($this->appliedFilters[$filter->getKey()])) { - if ($filter->hasFilterDefaultValue()) { - $this->setFilter($filter->getKey(), $filter->getFilterDefaultValue()); - } else { - $this->resetFilter($filter); - } - } else { - $this->setFilter($filter->getKey(), $this->appliedFilters[$filter->getKey()]); - } + } + + #[On('livewireArrayFilterUpdateValues')] + public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values): void + { + if ($this->tableName == $tableName) { + $filter = $this->getFilterByKey($filterKey); + $filter->options($values); } + } - public function bootedManagesFilters(): void + public function selectAllFilterOptions(string $filterKey): void { - $this->setBuilder($this->builder()); + $filter = $this->getFilterByKey($filterKey); - foreach ($this->filterComponents as $filterKey => $value) { - $this->appliedFilters[$filterKey] = $value; + if (! $filter instanceof MultiSelectFilter && ! $filter instanceof MultiSelectDropdownFilter) { + return; } + + if (count($this->getAppliedFilterWithValue($filterKey) ?? []) === count($filter->getOptions())) { + $this->resetFilter($filterKey); + + return; + } + + $this->setFilter($filterKey, array_keys($filter->getOptions())); } public function applyFilters(): Builder diff --git a/src/Traits/Filters/Configuration/FilterGenericDataConfiguration.php b/src/Traits/Filters/Configuration/FilterGenericDataConfiguration.php new file mode 100644 index 000000000..e2dbb7f0f --- /dev/null +++ b/src/Traits/Filters/Configuration/FilterGenericDataConfiguration.php @@ -0,0 +1,18 @@ +getTableName(), $this->getFilterLayout(), $this->isTailwind(), $this->isBootstrap4(), $this->isBootstrap5()))->toArray(); + } + + public function setFilterGenericData(array $filterGenericData = []): void + { + $this->filterGenericData = $filterGenericData; + } +} diff --git a/src/Traits/Filters/Configuration/FilterMenuConfiguration.php b/src/Traits/Filters/Configuration/FilterMenuConfiguration.php new file mode 100644 index 000000000..b9f71d4b6 --- /dev/null +++ b/src/Traits/Filters/Configuration/FilterMenuConfiguration.php @@ -0,0 +1,46 @@ +filterLayout = $type; + + return $this; + } + + public function setFilterLayoutPopover(): self + { + return $this->setFilterLayout('popover'); + } + + public function setFilterLayoutSlideDown(): self + { + return $this->setFilterLayout('slide-down'); + } + + public function setFilterSlideDownDefaultStatus(bool $status): self + { + $this->filterSlideDownDefaultVisible = $status; + + return $this; + } + + public function setFilterSlideDownDefaultStatusDisabled(): self + { + return $this->setFilterSlideDownDefaultStatus(false); + } + + public function setFilterSlideDownDefaultStatusEnabled(): self + { + return $this->setFilterSlideDownDefaultStatus(true); + } +} diff --git a/src/Traits/Filters/Configuration/FilterPillsConfiguration.php b/src/Traits/Filters/Configuration/FilterPillsConfiguration.php new file mode 100644 index 000000000..8de1de45a --- /dev/null +++ b/src/Traits/Filters/Configuration/FilterPillsConfiguration.php @@ -0,0 +1,23 @@ +filterPillsStatus = $status; + + return $this; + } + + public function setFilterPillsEnabled(): self + { + return $this->setFilterPillsStatus(true); + } + + public function setFilterPillsDisabled(): self + { + return $this->setFilterPillsStatus(false); + } +} diff --git a/src/Traits/Filters/Configuration/FilterStatusConfiguration.php b/src/Traits/Filters/Configuration/FilterStatusConfiguration.php new file mode 100644 index 000000000..970b72c27 --- /dev/null +++ b/src/Traits/Filters/Configuration/FilterStatusConfiguration.php @@ -0,0 +1,23 @@ +filtersStatus = $status; + + return $this; + } + + public function setFiltersEnabled(): self + { + return $this->setFiltersStatus(true); + } + + public function setFiltersDisabled(): self + { + return $this->setFiltersStatus(false); + } +} diff --git a/src/Traits/Filters/Configuration/FilterVisibilityConfiguration.php b/src/Traits/Filters/Configuration/FilterVisibilityConfiguration.php new file mode 100644 index 000000000..6c3a1d8f0 --- /dev/null +++ b/src/Traits/Filters/Configuration/FilterVisibilityConfiguration.php @@ -0,0 +1,23 @@ +filtersVisibilityStatus = $status; + + return $this; + } + + public function setFiltersVisibilityEnabled(): self + { + return $this->setFiltersVisibilityStatus(true); + } + + public function setFiltersVisibilityDisabled(): self + { + return $this->setFiltersVisibilityStatus(false); + } +} diff --git a/src/Traits/Filters/HasFilterGenericData.php b/src/Traits/Filters/HasFilterGenericData.php new file mode 100644 index 000000000..d60873da1 --- /dev/null +++ b/src/Traits/Filters/HasFilterGenericData.php @@ -0,0 +1,14 @@ +queryStringForFilterIsEnabled()) ? [ @@ -20,65 +20,49 @@ protected function queryStringHasQueryStringForFilter(): array ] : []; } - protected function setupQueryStringStatusForFilter(): void - { - if (! $this->hasQueryStringStatusForFilter()) { - $this->setQueryStringForFilterEnabled(); - } - } - public function hasQueryStringStatusForFilter(): bool { - return isset($this->queryStringStatusForFilter); + return $this->hasQueryStringConfigStatus('filters'); } public function getQueryStringStatusForFilter(): bool { - return $this->queryStringStatusForFilter ?? true; + return $this->getQueryStringConfigStatus('filters'); } public function queryStringForFilterIsEnabled(): bool { - $this->setupQueryStringStatusForFilter(); return $this->getQueryStringStatusForFilter() && $this->filtersAreEnabled(); } public function setQueryStringStatusForFilter(bool $status): self { - $this->queryStringStatusForFilter = $status; - - return $this; + return $this->setQueryStringConfigStatus('filters', $status); } public function setQueryStringForFilterEnabled(): self { - $this->setQueryStringStatusForFilter(true); - - return $this; + return $this->setQueryStringStatusForFilter(true); } public function setQueryStringForFilterDisabled(): self { - $this->setQueryStringStatusForFilter(false); - - return $this; + return $this->setQueryStringStatusForFilter(false); } public function hasQueryStringAliasForFilter(): bool { - return isset($this->queryStringAliasForFilter); + return $this->hasQueryStringConfigAlias('filters'); } public function getQueryStringAliasForFilter(): string { - return $this->queryStringAliasForFilter ?? $this->getQueryStringAlias().'-filters'; + return $this->getQueryStringConfigAlias('filters'); } public function setQueryStringAliasForFilter(string $alias): self { - $this->queryStringAliasForFilter = $alias; - - return $this; + return $this->setQueryStringConfigAlias('filters', $alias); } } diff --git a/src/Traits/Filters/HasFiltersStatus.php b/src/Traits/Filters/HasFiltersStatus.php new file mode 100644 index 000000000..9e043b16b --- /dev/null +++ b/src/Traits/Filters/HasFiltersStatus.php @@ -0,0 +1,16 @@ +filterGenericData); + } + + #[Computed] + public function getFilterGenericData(): array + { + if (! $this->hasFilterGenericData()) { + $this->setFilterGenericData($this->generateFilterGenericData()); + } + + return $this->filterGenericData; + } +} diff --git a/src/Traits/Helpers/FilterHelpers.php b/src/Traits/Filters/Helpers/FilterHelpers.php similarity index 55% rename from src/Traits/Helpers/FilterHelpers.php rename to src/Traits/Filters/Helpers/FilterHelpers.php index f2924c883..0c538653e 100644 --- a/src/Traits/Helpers/FilterHelpers.php +++ b/src/Traits/Filters/Helpers/FilterHelpers.php @@ -1,13 +1,10 @@ appliedFilters[$filterKey] = $this->filterComponents[$filterKey] = $value; - - $this->callHook('filterSet', ['filter' => $filterKey, 'value' => $value]); - $this->callTraitHook('filterSet', ['filter' => $filterKey, 'value' => $value]); - if ($this->getEventStatusFilterApplied() && $filterKey != null && $value != null) { - event(new FilterApplied($this->getTableName(), $filterKey, $value)); - } - $this->dispatch('filter-was-set', tableName: $this->getTableName(), filterKey: $filterKey, value: $value); - $this->storeFilterValues(); - - } - - public function selectAllFilterOptions(string $filterKey): void - { - $filter = $this->getFilterByKey($filterKey); - - if (! $filter instanceof MultiSelectFilter && ! $filter instanceof MultiSelectDropdownFilter) { - return; - } - - if (count($this->getAppliedFilterWithValue($filterKey) ?? []) === count($filter->getOptions())) { - $this->resetFilter($filterKey); - - return; - } - - $this->setFilter($filterKey, array_keys($filter->getOptions())); - } - - #[On('clearFilters')] - #[On('clear-filters')] - public function setFilterDefaults(): void - { - foreach ($this->getFilters() as $filter) { - if ($filter->isResetByClearButton()) { - $this->resetFilter($filter); - } - } - - } - /** * @return array */ @@ -159,28 +111,4 @@ public function getAppliedFiltersWithValuesCount(): int { return count($this->getAppliedFiltersWithValues()); } - - /** - * @param mixed $filter - */ - public function resetFilter($filter): void - { - if (! $filter instanceof Filter) { - $filter = $this->getFilterByKey($filter); - } - $this->callHook('filterReset', ['filter' => $filter->getKey()]); - $this->callTraitHook('filterReset', ['filter' => $filter->getKey()]); - $this->setFilter($filter->getKey(), $filter->getDefaultValue()); - - } - - #[On('livewireArrayFilterUpdateValues')] - public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values): void - { - if ($this->tableName == $tableName) { - $filter = $this->getFilterByKey($filterKey); - $filter->options($values); - } - - } } diff --git a/src/Traits/Filters/Helpers/FilterMenuHelpers.php b/src/Traits/Filters/Helpers/FilterMenuHelpers.php new file mode 100644 index 000000000..267346556 --- /dev/null +++ b/src/Traits/Filters/Helpers/FilterMenuHelpers.php @@ -0,0 +1,81 @@ +filterSlideDownDefaultVisible; + } + + public function filtersSlideDownIsDefaultVisible(): bool + { + return $this->getFilterSlideDownDefaultStatus() === true; + } + + public function filtersSlideDownIsDefaultHidden(): bool + { + return $this->getFilterSlideDownDefaultStatus() === false; + } + + public function getFilterLayout(): string + { + return $this->filterLayout; + } + + public function isFilterLayoutPopover(): bool + { + return $this->getFilterLayout() === 'popover'; + } + + public function isFilterLayoutSlideDown(): bool + { + return $this->getFilterLayout() === 'slide-down'; + } + + /** + * Get whether any filter has a configured slide down row. + */ + public function hasFiltersWithSlidedownRows(): bool + { + return $this->getFilters() + ->reject(fn (Filter $filter) => ! $filter->hasFilterSlidedownRow()) + ->count() > 0; + } + + /** + * Get filters sorted by row + * + * @return array + */ + public function getFiltersByRow(): array + { + $orderedFilters = []; + $filterList = ($this->hasFiltersWithSlidedownRows()) ? $this->getVisibleFilters()->sortBy('filterSlidedownRow') : $this->getVisibleFilters(); + if ($this->hasFiltersWithSlidedownRows()) { + foreach ($filterList as $filter) { + $orderedFilters[(string) $filter->getFilterSlidedownRow()][] = $filter; + } + + if (empty($orderedFilters['1'])) { + $orderedFilters['1'] = (isset($orderedFilters['99']) ? $orderedFilters['99'] : []); + if (isset($orderedFilters['99'])) { + unset($orderedFilters['99']); + } + } + } else { + $orderedFilters = Arr::wrap($filterList); + $orderedFilters['1'] = $orderedFilters['0'] ?? []; + if (isset($orderedFilters['0'])) { + unset($orderedFilters['0']); + } + } + ksort($orderedFilters); + + return $orderedFilters; + } +} diff --git a/src/Traits/Filters/Helpers/FilterPillsHelpers.php b/src/Traits/Filters/Helpers/FilterPillsHelpers.php new file mode 100644 index 000000000..f12cad696 --- /dev/null +++ b/src/Traits/Filters/Helpers/FilterPillsHelpers.php @@ -0,0 +1,38 @@ +filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills(); + } + + public function getFilterPillsStatus(): bool + { + return $this->filterPillsStatus; + } + + public function filterPillsAreEnabled(): bool + { + return $this->getFilterPillsStatus() === true; + } + + public function filterPillsAreDisabled(): bool + { + return $this->getFilterPillsStatus() === false; + } + + public function hasAppliedVisibleFiltersForPills(): bool + { + return collect($this->getAppliedFiltersWithValues()) + ->map(fn ($_item, $key) => $this->getFilterByKey($key)) + ->reject(fn (Filter $filter) => $filter->isHiddenFromPills()) + ->count() > 0; + } +} diff --git a/src/Traits/Filters/Helpers/FilterStatusHelpers.php b/src/Traits/Filters/Helpers/FilterStatusHelpers.php new file mode 100644 index 000000000..47d4f697e --- /dev/null +++ b/src/Traits/Filters/Helpers/FilterStatusHelpers.php @@ -0,0 +1,24 @@ +filtersStatus; + } + + #[Computed] + public function filtersAreEnabled(): bool + { + return $this->getFiltersStatus() === true; + } + + public function filtersAreDisabled(): bool + { + return $this->getFiltersStatus() === false; + } +} diff --git a/src/Traits/Core/Filters/HasFiltersVisibility.php b/src/Traits/Filters/Helpers/FilterVisibilityHelpers.php similarity index 59% rename from src/Traits/Core/Filters/HasFiltersVisibility.php rename to src/Traits/Filters/Helpers/FilterVisibilityHelpers.php index ddb80778b..e66efc516 100644 --- a/src/Traits/Core/Filters/HasFiltersVisibility.php +++ b/src/Traits/Filters/Helpers/FilterVisibilityHelpers.php @@ -1,12 +1,11 @@ getFilters()->reject(fn (Filter $filter) => $filter->isHiddenFromMenus()); } - - #[Locked] - public bool $filtersVisibilityStatus = true; - - public function setFiltersVisibilityStatus(bool $status): self - { - $this->filtersVisibilityStatus = $status; - - return $this; - } - - public function setFiltersVisibilityEnabled(): self - { - $this->setFiltersVisibilityStatus(true); - - return $this; - } - - public function setFiltersVisibilityDisabled(): self - { - $this->setFiltersVisibilityStatus(false); - - return $this; - } } diff --git a/src/Traits/Filters/ManagesFilters.php b/src/Traits/Filters/ManagesFilters.php new file mode 100644 index 000000000..bc2a454dd --- /dev/null +++ b/src/Traits/Filters/ManagesFilters.php @@ -0,0 +1,37 @@ +restoreFilterValues(); + + foreach ($this->getFilters() as $filter) { + if (! isset($this->appliedFilters[$filter->getKey()])) { + if ($filter->hasFilterDefaultValue()) { + $this->setFilter($filter->getKey(), $filter->getFilterDefaultValue()); + } else { + $this->resetFilter($filter); + } + } else { + $this->setFilter($filter->getKey(), $this->appliedFilters[$filter->getKey()]); + } + } + } + + public function bootedManagesFilters(): void + { + $this->setBuilder($this->builder()); + + foreach ($this->filterComponents as $filterKey => $value) { + $this->appliedFilters[$filterKey] = $value; + } + } +} diff --git a/src/Traits/Filters/Styling/Configuration/FilterMenuStylingConfiguration.php b/src/Traits/Filters/Styling/Configuration/FilterMenuStylingConfiguration.php new file mode 100644 index 000000000..d7bd20356 --- /dev/null +++ b/src/Traits/Filters/Styling/Configuration/FilterMenuStylingConfiguration.php @@ -0,0 +1,34 @@ +mergeCustomAttributes(propertyName: 'filterPopoverAttributes', customAttributes: $attributes); + } + + /** + * Used to set attributes for the Filter Slidedown Wrapper + */ + public function setFilterSlidedownWrapperAttributes(array $attributes): self + { + return $this->mergeCustomAttributes(propertyName: 'filterSlidedownWrapperAttributes', customAttributes: $attributes); + } + + /** + * Set a list of attributes to override on the th sort button elements + */ + public function setFilterSlidedownRowAttributes(Closure $callback): self + { + $this->filterSlidedownRowCallback = $callback; + + return $this; + } +} diff --git a/src/Traits/Filters/Styling/Configuration/FilterPillsStylingConfiguration.php b/src/Traits/Filters/Styling/Configuration/FilterPillsStylingConfiguration.php new file mode 100644 index 000000000..107428920 --- /dev/null +++ b/src/Traits/Filters/Styling/Configuration/FilterPillsStylingConfiguration.php @@ -0,0 +1,21 @@ +mergeCustomAttributes(propertyName: 'filterPillsItemAttributes', customAttributes: $attributes); + } + + protected function setFilterPillsResetFilterButtonAttributes(array $attributes = []): self + { + return $this->mergeCustomAttributes(propertyName: 'filterPillsResetFilterButtonAttributes', customAttributes: $attributes); + } + + protected function setFilterPillsResetAllButtonAttributes(array $attributes = []): self + { + return $this->mergeCustomAttributes(propertyName: 'filterPillsResetAllButtonAttributes', customAttributes: $attributes); + } +} diff --git a/src/Traits/Filters/Styling/HasFilterMenuStyling.php b/src/Traits/Filters/Styling/HasFilterMenuStyling.php new file mode 100644 index 000000000..e65ba7d53 --- /dev/null +++ b/src/Traits/Filters/Styling/HasFilterMenuStyling.php @@ -0,0 +1,19 @@ + '', 'default-colors' => true, 'default-styling' => true, 'default-width' => true]; + + protected array $filterSlidedownWrapperAttributes = ['class' => '', 'default-colors' => true, 'default-styling' => true]; + + protected ?Closure $filterSlidedownRowCallback; +} diff --git a/src/Traits/Filters/Styling/HasFilterPillsStyling.php b/src/Traits/Filters/Styling/HasFilterPillsStyling.php new file mode 100644 index 000000000..78c0b829a --- /dev/null +++ b/src/Traits/Filters/Styling/HasFilterPillsStyling.php @@ -0,0 +1,18 @@ + '', 'default-colors' => true, 'default-styling' => true]; + + protected array $filterPillsResetFilterButtonAttributes = ['class' => '', 'default-colors' => true, 'default-styling' => true]; + + protected array $filterPillsResetAllButtonAttributes = ['class' => '', 'default-colors' => true, 'default-styling' => true]; +} diff --git a/src/Traits/Filters/Styling/Helpers/FilterMenuStylingHelpers.php b/src/Traits/Filters/Styling/Helpers/FilterMenuStylingHelpers.php new file mode 100644 index 000000000..c17e2de76 --- /dev/null +++ b/src/Traits/Filters/Styling/Helpers/FilterMenuStylingHelpers.php @@ -0,0 +1,48 @@ + + */ + #[Computed] + public function getFilterPopoverAttributes(): array + { + return $this->filterPopoverAttributes; + + } + + /** + * Used to get attributes for the Filter Slidedown Wrapper + * + * @return array + */ + #[Computed] + public function getFilterSlidedownWrapperAttributes(): array + { + return $this->filterSlidedownWrapperAttributes; + + } + + /** + * Used to get attributes for the Filter Slidedown Row + * + * @return array + */ + #[Computed] + public function getFilterSlidedownRowAttributes(string $rowIndex): array + { + + if (isset($this->filterSlidedownRowCallback)) { + return array_merge(['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => (int) $rowIndex], call_user_func($this->filterSlidedownRowCallback, (int) $rowIndex)); + } + + return ['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => (int) $rowIndex]; + } +} diff --git a/src/Traits/Filters/Styling/Helpers/FilterPillsStylingHelpers.php b/src/Traits/Filters/Styling/Helpers/FilterPillsStylingHelpers.php new file mode 100644 index 000000000..c3bd0d9d5 --- /dev/null +++ b/src/Traits/Filters/Styling/Helpers/FilterPillsStylingHelpers.php @@ -0,0 +1,26 @@ +filterPillsItemAttributes; + } + + #[Computed] + public function getFilterPillsResetFilterButtonAttributes(): array + { + return $this->filterPillsResetFilterButtonAttributes; + } + + #[Computed] + public function getFilterPillsResetAllButtonAttributes(): array + { + return $this->filterPillsResetAllButtonAttributes; + } +} diff --git a/src/Traits/WithFilters.php b/src/Traits/WithFilters.php index 19ff8306b..b80e30b3e 100644 --- a/src/Traits/WithFilters.php +++ b/src/Traits/WithFilters.php @@ -4,15 +4,25 @@ use Illuminate\Support\Collection; use Livewire\Attributes\Locked; -use Rappasoft\LaravelLivewireTables\Traits\Configuration\FilterConfiguration; -use Rappasoft\LaravelLivewireTables\Traits\Core\Filters\HandlesFilterTraits; -use Rappasoft\LaravelLivewireTables\Traits\Helpers\FilterHelpers; +use Rappasoft\LaravelLivewireTables\Traits\Filters\{Configuration\FilterConfiguration, HasFilterGenericData, HasFilterMenu, HasFilterPills, HasFilterQueryString, HasFiltersStatus, HasFiltersVisibility, Helpers\FilterHelpers, ManagesFilters}; trait WithFilters { use FilterConfiguration, - FilterHelpers; - use HandlesFilterTraits; + FilterHelpers, + HasFiltersStatus, + HasFilterGenericData, + HasFilterMenu, + HasFilterPills, + HasFilterQueryString, + HasFiltersVisibility, + ManagesFilters; + + // Set in JS + public array $filterComponents = []; + + // Set in Frontend + public array $appliedFilters = []; #[Locked] public int $filterCount; diff --git a/src/Traits/WithQueryString.php b/src/Traits/WithQueryString.php index 52b2b37f8..b6b37eabf 100644 --- a/src/Traits/WithQueryString.php +++ b/src/Traits/WithQueryString.php @@ -14,7 +14,7 @@ trait WithQueryString #[Locked] public array $queryStringConfig = [ 'columns' => ['status' => false, 'alias' => null], - 'filter' => ['status' => false, 'alias' => null], + 'filters' => ['status' => true, 'alias' => null], 'search' => ['status' => true, 'alias' => null], 'sorts' => ['status' => true, 'alias' => null], ]; diff --git a/tests/Unit/Traits/Configuration/FilterConfigurationTest.php b/tests/Unit/Traits/Configuration/FilterConfigurationTest.php index d9756b5e6..6b4e4c9ff 100644 --- a/tests/Unit/Traits/Configuration/FilterConfigurationTest.php +++ b/tests/Unit/Traits/Configuration/FilterConfigurationTest.php @@ -78,25 +78,18 @@ public function test_filters_layout_can_be_set(): void $this->assertSame('popover', $this->basicTable->getFilterLayout()); - $this->basicTable->setFilterLayout('slide-down'); + $this->assertSame('slide-down', $this->basicTable->setFilterLayout('slide-down')->getFilterLayout()); - $this->assertSame('slide-down', $this->basicTable->getFilterLayout()); + $this->assertSame('popover', $this->basicTable->setFilterLayout('popover')->getFilterLayout()); - $this->basicTable->setFilterLayout('popover'); + $this->assertSame('slide-down', $this->basicTable->setFilterLayoutSlideDown()->getFilterLayout()); - $this->assertSame('popover', $this->basicTable->getFilterLayout()); - - $this->basicTable->setFilterLayout('popover2'); - - $this->assertSame('popover', $this->basicTable->getFilterLayout()); + $this->assertSame('popover', $this->basicTable->setFilterLayout('popover2')->getFilterLayout()); - $this->basicTable->setFilterLayoutSlideDown(); + $this->assertSame('slide-down', $this->basicTable->setFilterLayout('slide-down')->getFilterLayout()); - $this->basicTable->setFilterLayout('slide-down'); + $this->assertSame('popover', $this->basicTable->setFilterLayoutPopover()->getFilterLayout()); - $this->basicTable->setFilterLayoutPopover(); - - $this->basicTable->setFilterLayout('popover'); } public function test_filters_layout_popover_default_can_be_set(): void @@ -118,5 +111,10 @@ public function test_filters_layout_popover_default_can_be_set(): void $this->basicTable->setFilterSlideDownDefaultStatus(false); $this->assertFalse($this->basicTable->filterSlideDownDefaultVisible); + + $this->assertSame('slide-down', $this->basicTable->setFilterLayout('slide-down')->getFilterLayout()); + + $this->assertSame('popover', $this->basicTable->setFilterLayoutPopover()->getFilterLayout()); + } } diff --git a/tests/Unit/Traits/Core/QueryStrings/QueryStringForFiltersTest.php b/tests/Unit/Traits/Core/QueryStrings/QueryStringForFiltersTest.php index 63ae05085..e1117c4ef 100644 --- a/tests/Unit/Traits/Core/QueryStrings/QueryStringForFiltersTest.php +++ b/tests/Unit/Traits/Core/QueryStrings/QueryStringForFiltersTest.php @@ -29,8 +29,11 @@ public function test_can_disable_filter_query_string_status(): void parent::$mock->configure(); parent::$mock->boot(); $this->assertSame(true, parent::$mock->getQueryStringStatusForFilter()); + $this->assertTrue(parent::$mock->hasQueryStringStatusForFilter()); parent::$mock->setQueryStringForFilterDisabled(); $this->assertSame(false, parent::$mock->getQueryStringStatusForFilter()); + $this->assertTrue(parent::$mock->hasQueryStringStatusForFilter()); + } public function test_can_enable_filter_query_string_status(): void diff --git a/tests/Unit/Traits/Filters/FilterDefaultValueTest.php b/tests/Unit/Traits/Filters/FilterDefaultValueTest.php new file mode 100644 index 000000000..176cd9364 --- /dev/null +++ b/tests/Unit/Traits/Filters/FilterDefaultValueTest.php @@ -0,0 +1,45 @@ +useComputedPropertiesDisabled(); + + } + + public function filters(): array + { + return [ + TextFilter::make('Pet Name', 'pet_name_filter') + ->filter(function (Builder $builder, string $value) { + return $builder->where('pets.name', '=', $value); + }) + ->setFilterDefaultValue('car'), + ]; + } + }; + $this->assertSame([], $mock->getAppliedFilters()); + + $mock->bootAll(); + + $this->assertSame(['pet_name_filter' => 'car'], $mock->getAppliedFilters()); + + } +} diff --git a/tests/Unit/Traits/Filters/FilterMenuTest.php b/tests/Unit/Traits/Filters/FilterMenuTest.php new file mode 100644 index 000000000..2019d083f --- /dev/null +++ b/tests/Unit/Traits/Filters/FilterMenuTest.php @@ -0,0 +1,200 @@ +assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true, 'default-width' => true], $this->basicTable->getFilterPopoverAttributes()); + } + + public function test_can_get_default_filter_slidedown_attributes(): void + { + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterSlidedownWrapperAttributes()); + } + + public function test_can_get_default_filter_slidedown_row_attributes(): void + { + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => 1], $this->basicTable->getFilterSlidedownRowAttributes(1)); + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true, 'row' => 2], $this->basicTable->getFilterSlidedownRowAttributes('2')); + + } + + public function test_can_check_filters_with_no_defined_slidedown_rows(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + $this->assertFalse($testTableDefault->hasFiltersWithSlidedownRows()); + } + + public function test_can_check_filters_with_defined_slidedown_rows(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function filters(): array + { + return [ + MultiSelectFilter::make('Breed', 'breed') + ->setFilterSlidedownRow(2) + ->options( + Breed::query() + ->orderBy('name') + ->get() + ->keyBy('id') + ->map(fn ($breed) => $breed->name) + ->toArray() + ) + ->filter(function (Builder $builder, array $values) { + return $builder->whereIn('breed_id', $values); + }), + ]; + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + $this->assertTrue($testTableDefault->hasFiltersWithSlidedownRows()); + } + + public function test_can_get_filter_slidedown_rows(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function filters(): array + { + return [ + MultiSelectFilter::make('Breed 1', 'breed') + ->setFilterSlidedownRow(1) + ->options( + Breed::query() + ->orderBy('name') + ->get() + ->keyBy('id') + ->map(fn ($breed) => $breed->name) + ->toArray() + ) + ->filter(function (Builder $builder, array $values) { + return $builder->whereIn('breed_id', $values); + }), + MultiSelectFilter::make('Breed 3', 'breed3') + ->setFilterSlidedownRow(1) + ->options( + Breed::query() + ->orderBy('name') + ->get() + ->keyBy('id') + ->map(fn ($breed) => $breed->name) + ->toArray() + ) + ->filter(function (Builder $builder, array $values) { + return $builder->whereIn('breed_id', $values); + }), + MultiSelectFilter::make('Breed 2', 'breed2') + ->setFilterSlidedownRow(2) + ->options( + Breed::query() + ->orderBy('name') + ->get() + ->keyBy('id') + ->map(fn ($breed) => $breed->name) + ->toArray() + ) + ->filter(function (Builder $builder, array $values) { + return $builder->whereIn('breed_id', $values); + }), + + MultiSelectFilter::make('Breed 4', 'breed4') + ->options( + Breed::query() + ->orderBy('name') + ->get() + ->keyBy('id') + ->map(fn ($breed) => $breed->name) + ->toArray() + ) + ->filter(function (Builder $builder, array $values) { + return $builder->whereIn('breed_id', $values); + }), + ]; + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + $this->assertSame('Breed 1', $testTableDefault->getFiltersByRow()[1][0]->getName()); + $this->assertSame('Breed 3', $testTableDefault->getFiltersByRow()[1][1]->getName()); + $this->assertSame('Breed 2', $testTableDefault->getFiltersByRow()[2][0]->getName()); + $this->assertSame('Breed 4', $testTableDefault->getFiltersByRow()[''][0]->getName()); + + } +} diff --git a/tests/Unit/Traits/Filters/FilterPillsTest.php b/tests/Unit/Traits/Filters/FilterPillsTest.php new file mode 100644 index 000000000..4f579beea --- /dev/null +++ b/tests/Unit/Traits/Filters/FilterPillsTest.php @@ -0,0 +1,131 @@ +assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPillsItemAttributes()); + } + + public function test_can_get_default_filter_reset_filter_button_attributes(): void + { + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPillsResetFilterButtonAttributes()); + } + + public function test_can_get_default_filter_reset_all_filter_button_attributes(): void + { + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPillsResetAllButtonAttributes()); + } + + public function test_can_change_default_filter_pills_item_attributes(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsItemAttributes()); + $testTableDefault->publiclySetFilterPillsItemAttributes(['class' => 'bg-blue-500']); + $this->assertSame(['class' => 'bg-blue-500', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsItemAttributes()); + $testTableDefault->publiclySetFilterPillsItemAttributes(['class' => 'bg-blue-500', 'default-colors' => false]); + $this->assertSame(['class' => 'bg-blue-500', 'default-colors' => false, 'default-styling' => true], $testTableDefault->getFilterPillsItemAttributes()); + + } + + public function test_can_change_default_filter_pills_reset_button_attributes(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsResetFilterButtonAttributes()); + $testTableDefault->publiclySetResetFilterButtonAttributes(['class' => 'bg-red-500']); + $this->assertSame(['class' => 'bg-red-500', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsResetFilterButtonAttributes()); + $testTableDefault->publiclySetResetFilterButtonAttributes(['class' => 'bg-red-500', 'default-colors' => false]); + $this->assertSame(['class' => 'bg-red-500', 'default-colors' => false, 'default-styling' => true], $testTableDefault->getFilterPillsResetFilterButtonAttributes()); + + } + + public function test_can_change_default_filter_pills_reset_all_button_attributes(): void + { + $testTableDefault = new class extends PetsTable + { + public function configure(): void + { + parent::configure(); + $this->useComputedPropertiesDisabled(); + + } + + public function publiclySetFilterPillsItemAttributes(array $attributes = []) + { + $this->setFilterPillsItemAttributes($attributes); + } + + public function publiclySetResetFilterButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetFilterButtonAttributes($attributes); + } + + public function publiclySetResetFilterAllButtonAttributes(array $attributes = []) + { + $this->setFilterPillsResetAllButtonAttributes($attributes); + } + }; + + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsResetAllButtonAttributes()); + $testTableDefault->publiclySetResetFilterAllButtonAttributes(['class' => 'bg-red-500']); + $this->assertSame(['class' => 'bg-red-500', 'default-colors' => true, 'default-styling' => true], $testTableDefault->getFilterPillsResetAllButtonAttributes()); + $testTableDefault->publiclySetResetFilterAllButtonAttributes(['class' => 'bg-red-500', 'default-colors' => false]); + $this->assertSame(['class' => 'bg-red-500', 'default-colors' => false, 'default-styling' => true], $testTableDefault->getFilterPillsResetAllButtonAttributes()); + + } +} diff --git a/tests/Unit/Traits/Helpers/FilterHelpersTest.php b/tests/Unit/Traits/Helpers/FilterHelpersTest.php index b9104cbd0..bab153264 100644 --- a/tests/Unit/Traits/Helpers/FilterHelpersTest.php +++ b/tests/Unit/Traits/Helpers/FilterHelpersTest.php @@ -204,6 +204,25 @@ public function test_can_check_if_filter_layout_slidedown_is_visible(): void $this->assertTrue($this->basicTable->getFilterSlideDownDefaultStatus()); } + public function test_can_check_if_filter_layout_slidedown_is_visible_directly(): void + { + $this->assertFalse($this->basicTable->filtersSlideDownIsDefaultVisible()); + + $this->basicTable->setFilterSlideDownDefaultStatusEnabled(); + + $this->assertTrue($this->basicTable->filtersSlideDownIsDefaultVisible()); + } + + public function test_can_check_if_filter_layout_slidedown_is_hidden_directly(): void + { + $this->assertTrue($this->basicTable->filtersSlideDownIsDefaultHidden()); + + $this->basicTable->setFilterSlideDownDefaultStatusEnabled(); + + $this->assertFalse($this->basicTable->filtersSlideDownIsDefaultHidden()); + + } + public function test_can_check_if_filter_layout_slidedown_is_hidden(): void { $this->assertFalse($this->basicTable->getFilterSlideDownDefaultStatus()); diff --git a/tests/Unit/Traits/Styling/FilterPopoverStylingTest.php b/tests/Unit/Traits/Styling/FilterPopoverStylingTest.php index 48980ee48..6b43720a5 100644 --- a/tests/Unit/Traits/Styling/FilterPopoverStylingTest.php +++ b/tests/Unit/Traits/Styling/FilterPopoverStylingTest.php @@ -10,20 +10,20 @@ final class FilterPopoverStylingTest extends TestCase { public function test_filter_popover_attributes_returns_default_if_not_set(): void { - $this->assertSame(['class' => '', 'default-width' => true, 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPopoverAttributes()); + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true, 'default-width' => true], $this->basicTable->getFilterPopoverAttributes()); } public function test_filter_popover_attributes_can_be_changed(): void { - $this->assertSame(['class' => '', 'default-width' => true, 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPopoverAttributes()); + $this->assertSame(['class' => '', 'default-colors' => true, 'default-styling' => true, 'default-width' => true], $this->basicTable->getFilterPopoverAttributes()); $this->basicTable->setFilterPopoverAttributes(['class' => 'bg-blue-500']); - $this->assertSame(['class' => 'bg-blue-500', 'default-width' => true, 'default-colors' => true, 'default-styling' => true], $this->basicTable->getFilterPopoverAttributes()); + $this->assertSame(['class' => 'bg-blue-500', 'default-colors' => true, 'default-styling' => true, 'default-width' => true], $this->basicTable->getFilterPopoverAttributes()); $this->basicTable->setFilterPopoverAttributes(['class' => 'bg-red-500', 'default-colors' => false]); - $this->assertSame(['class' => 'bg-red-500', 'default-width' => true, 'default-colors' => false, 'default-styling' => true], $this->basicTable->getFilterPopoverAttributes()); + $this->assertSame(['class' => 'bg-red-500', 'default-colors' => false, 'default-styling' => true, 'default-width' => true], $this->basicTable->getFilterPopoverAttributes()); } }