Skip to content

Commit 638cd7d

Browse files
committed
wip
1 parent 813a081 commit 638cd7d

File tree

7 files changed

+49
-17
lines changed

7 files changed

+49
-17
lines changed

src/Fields/Date.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ public function resolveFormat(Request $request, Model $model): ?string
154154
/**
155155
* Set the filterable attribute.
156156
*/
157-
public function filterable(?Closure $callback = null, bool|Closure $search = false): static
157+
public function filterable(bool|Closure $value = true, ?Closure $callback = null): static
158158
{
159159
$callback ??= function (Request $request, Builder $query, mixed $value, string $attribute): Builder {
160160
return $query->whereDate($query->qualifyColumn($attribute), $value);
161161
};
162162

163-
return parent::filterable($callback, $search);
163+
return parent::filterable($value, $callback);
164164
}
165165

166166
/**

src/Fields/Field.php

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ abstract class Field implements Arrayable, JsonSerializable
117117
*/
118118
protected bool|Closure $searchable = false;
119119

120+
/**
121+
* The filter query resolver callback.
122+
*/
123+
protected ?Closure $searchQueryResolver = null;
124+
125+
/**
126+
* Indicates if the field is filterable.
127+
*/
128+
protected bool|Closure $filterable = false;
129+
120130
/**
121131
* The filter query resolver callback.
122132
*/
@@ -317,25 +327,37 @@ public function isSortable(): bool
317327
*/
318328
public function searchable(bool|Closure $value = true, ?Closure $callback = null): static
319329
{
320-
$callback ??= function (Request $request, Builder $query, mixed $value, string $attribute): Builder {
330+
$this->searchable = $value;
331+
332+
$this->searchQueryResolver = $callback ?: function (Request $request, Builder $query, mixed $value, string $attribute): Builder {
321333
return $query->where($query->qualifyColumn($attribute), 'like', "%{$value}%", 'or');
322334
};
323335

324-
return $this->filterable($callback, $value);
336+
return $this;
325337
}
326338

327339
/**
328340
* Determine if the field is searchable.
329341
*/
330342
public function isSearchable(): bool
331343
{
332-
if (! $this->isFilterable()) {
344+
if ($this->computed) {
333345
return false;
334346
}
335347

336348
return $this->searchable instanceof Closure ? call_user_func($this->searchable) : $this->searchable;
337349
}
338350

351+
/**
352+
* Resolve the search query.
353+
*/
354+
public function resolveSearchQuery(Request $request, Builder $query, mixed $value): Builder
355+
{
356+
return $this->isSearchable()
357+
? call_user_func_array($this->searchQueryResolver, [$request, $query, $value, $this->getModelAttribute()])
358+
: $query;
359+
}
360+
339361
/**
340362
* Set the translatable attribute.
341363
*/
@@ -361,9 +383,9 @@ public function isTranslatable(): bool
361383
/**
362384
* Set the filterable attribute.
363385
*/
364-
public function filterable(?Closure $callback = null, bool|Closure $search = false): static
386+
public function filterable(bool|Closure $value = true, ?Closure $callback = null): static
365387
{
366-
$this->searchable = $search;
388+
$this->filterable = $value;
367389

368390
$this->filterQueryResolver = $callback ?: function (Request $request, Builder $query, mixed $value, string $attribute): Builder {
369391
return $query->where($query->qualifyColumn($attribute), $value);
@@ -377,7 +399,11 @@ public function filterable(?Closure $callback = null, bool|Closure $search = fal
377399
*/
378400
public function isFilterable(): bool
379401
{
380-
return ! $this->computed && $this->filterQueryResolver instanceof Closure;
402+
if ($this->computed) {
403+
return false;
404+
}
405+
406+
return $this->filterable instanceof Closure ? call_user_func($this->filterable) : $this->filterable;
381407
}
382408

383409
/**

src/Fields/Fields.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ public function sortable(): static
6767
return $this->filter->isSortable();
6868
}
6969

70+
/**
71+
* Filter the filterable fields.
72+
*/
73+
public function filterable(): static
74+
{
75+
return $this->filter->isFilterable();
76+
}
77+
7078
/**
7179
* Filter the relation fields.
7280
*/

src/Fields/Relation.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,13 @@ public function getSearchableColumns(): array
284284
/**
285285
* Resolve the filter query.
286286
*/
287-
public function resolveFilterQuery(Request $request, Builder $query, mixed $value): Builder
287+
public function resolveSearchQuery(Request $request, Builder $query, mixed $value): Builder
288288
{
289-
if (! $this->isFilterable()) {
290-
return parent::resolveFilterQuery($request, $query, $value);
289+
if (! $this->isSearchable()) {
290+
return parent::resolveSearchQuery($request, $query, $value);
291291
}
292292

293-
return call_user_func_array($this->filterQueryResolver, [
293+
return call_user_func_array($this->searchQueryResolver, [
294294
$request, $query, $value, $this->getSearchableColumns(),
295295
]);
296296
}

src/Filters/Search.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function apply(Request $request, Builder $query, mixed $value): Builder
3535

3636
return $query->where(function (Builder $query) use ($request, $value): void {
3737
$this->fields->each(function (Field $field) use ($request, $query, $value): void {
38-
$field->resolveFilterQuery($request, $query, $value);
38+
$field->resolveSearchQuery($request, $query, $value);
3939
});
4040
});
4141
}

src/Resources/Resource.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,7 @@ public function filters(Request $request): array
386386

387387
$sortables = $fields->sortable();
388388

389-
$filterables = $fields->filter(static function (Field $field): bool {
390-
return $field->isFilterable() && ! $field->isSearchable();
391-
});
389+
$filterables = $fields->filterable();
392390

393391
return array_values(array_filter([
394392
$searchables->isNotEmpty() ? new Search($searchables) : null,

src/Root.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Root
2525
*
2626
* @var string
2727
*/
28-
public const string VERSION = '2.6.1';
28+
public const string VERSION = '2.6.2';
2929

3030
/**
3131
* The registered booting callbacks.

0 commit comments

Comments
 (0)