Skip to content
Closed
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Components/Filters/FilterBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class FilterBase implements Wireable

public array $filterRelation = [];

public mixed $defaultValue = null;

public function __construct(
public string $column,
public ?string $field = null,
Expand Down Expand Up @@ -70,6 +72,13 @@ public function baseClass(string $attrClass): self
return $this;
}

public function default(mixed $value): self
{
$this->defaultValue = $value;

return $this;
}

public function toLivewire(): array
{
return (array) $this;
Expand Down
101 changes: 101 additions & 0 deletions src/Concerns/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,107 @@ trait Filter

public bool $showFilters = false;

protected function applyDefaultFilters(): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion:

$columnsByField = collect($this->columns)
  ->mapWithKeys(fn (Column $column) => [
      filled($column->field) ?? filled($column->dataField) => $column,
  ]);

collect($this->filters())
    ->filter(fn ($filter) => filled($filter->defaultValue))
    ->each(function (FilterBase $filter) use (&$defaultFiltersApplied, $columnsByField) {
        $field = $filter->field;
        $column = $filter->column;
        $key = $filter->key;
        $defaultValue = $filter->defaultValue;

        $columnData = $columnsByField->get($column);
        $label = data_get($columnData, 'title', $field);

        switch ($key) {
            case 'select':
                data_set($this->filters, "select.{$field}", $defaultValue);
                $this->addEnabledFilters($field, $label);
                $defaultFiltersApplied = true;
                break;

            case 'multi_select':
                $values = is_array($defaultValue) ? $defaultValue : [$defaultValue];
                data_set($this->filters, "multi_select.{$field}", $values);
                $this->addEnabledFilters($field, $label);
                $defaultFiltersApplied = true;
                break;

            case 'boolean':
                data_set($this->filters, "boolean.{$field}", $defaultValue);
                $this->addEnabledFilters($field, $label);
                $defaultFiltersApplied = true;
                break;

            case 'input_text':
                if (is_array($defaultValue)) {
                    // Support for both value and operator
                    data_set($this->filters, "input_text.{$field}", $defaultValue['value'] ?? '');
                    if (isset($defaultValue['operator'])) {
                        data_set($this->filters, "input_text_options.{$field}", $defaultValue['operator']);
                    }
                } else {
                    data_set($this->filters, "input_text.{$field}", $defaultValue);
                }
                $this->addEnabledFilters($field, $label);
                $defaultFiltersApplied = true;
                break;

            case 'number':
                if (is_array($defaultValue)) {
                    if (isset($defaultValue['start'])) {
                        data_set($this->filters, "number.{$field}.start", $defaultValue['start']);
                    }
                    if (isset($defaultValue['end'])) {
                        data_set($this->filters, "number.{$field}.end", $defaultValue['end']);
                    }
                } else {
                    data_set($this->filters, "number.{$field}.start", $defaultValue);
                }
                $this->addEnabledFilters($field, $label);
                $defaultFiltersApplied = true;
                break;

            case 'date':
            case 'datetime':
                if (is_array($defaultValue) && isset($defaultValue['start']) && isset($defaultValue['end'])) {
                    $this->filters[$key][$field] = [
                        'start' => $defaultValue['start'],
                        'end' => $defaultValue['end'],
                        'formatted' => $defaultValue['formatted'] ?? '',
                    ];
                    $this->addEnabledFilters($field, $label);
                    $defaultFiltersApplied = true;
                }
                break;
        }
    });

if ($defaultFiltersApplied) {
    $this->persistState('filters');
}

{
// Only apply defaults if no filters are currently set
// This prevents overriding persisted filters
if (! empty($this->filters)) {
return;
}

$defaultFiltersApplied = false;

collect($this->filters())
->each(function ($filter) use (&$defaultFiltersApplied) {
// Check if filter has a default value set
if (! isset($filter->defaultValue) || is_null($filter->defaultValue)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think is_null check is redundant here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup you are correct. Fixing it.

return;
}

$field = data_get($filter, 'field');
$column = data_get($filter, 'column');
$key = data_get($filter, 'key');
$defaultValue = $filter->defaultValue;

// Find the column to get the label
$columnData = collect($this->columns)
->first(fn ($col) => data_get($col, 'field') === $column ||
data_get($col, 'dataField') === $column
);

$label = data_get($columnData, 'title', $field);

// Apply the default value based on filter type
switch ($key) {
case 'select':
data_set($this->filters, "select.{$field}", $defaultValue);
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
break;

case 'multi_select':
$values = is_array($defaultValue) ? $defaultValue : [$defaultValue];
data_set($this->filters, "multi_select.{$field}", $values);
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
break;

case 'boolean':
data_set($this->filters, "boolean.{$field}", $defaultValue);
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
break;

case 'input_text':
if (is_array($defaultValue)) {
// Support for both value and operator
data_set($this->filters, "input_text.{$field}", $defaultValue['value'] ?? '');
if (isset($defaultValue['operator'])) {
data_set($this->filters, "input_text_options.{$field}", $defaultValue['operator']);
}
} else {
data_set($this->filters, "input_text.{$field}", $defaultValue);
}
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
break;

case 'number':
if (is_array($defaultValue)) {
if (isset($defaultValue['start'])) {
data_set($this->filters, "number.{$field}.start", $defaultValue['start']);
}
if (isset($defaultValue['end'])) {
data_set($this->filters, "number.{$field}.end", $defaultValue['end']);
}
} else {
data_set($this->filters, "number.{$field}.start", $defaultValue);
}
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
break;

case 'date':
case 'datetime':
if (is_array($defaultValue) && isset($defaultValue['start']) && isset($defaultValue['end'])) {
$this->filters[$key][$field] = [
'start' => $defaultValue['start'],
'end' => $defaultValue['end'],
'formatted' => $defaultValue['formatted'] ?? '',
];
$this->addEnabledFilters($field, $label);
$defaultFiltersApplied = true;
}
break;
}
});

// Persist the default filters if any were applied
if ($defaultFiltersApplied) {
$this->persistState('filters');
}
}

/**
* @throws Exception
*/
Expand Down
2 changes: 2 additions & 0 deletions src/PowerGridComponent.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public function mount(): void

$this->restoreState();

$this->applyDefaultFilters();

$this->resolveSummarizeColumn();
}

Expand Down