Skip to content

Commit 9978077

Browse files
committed
allow excluding of certain filter fields from 'all' filter requests
1 parent f126696 commit 9978077

2 files changed

Lines changed: 86 additions & 51 deletions

File tree

app/sprinkles/admin/src/Sprunje/UserSprunje.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* UserFrosting (http://www.userfrosting.com)
44
*
55
* @link https://github.com/userfrosting/UserFrosting
6-
* @copyright Copyright (c) 2013-2016 Alexander Weissman
76
* @license https://github.com/userfrosting/UserFrosting/blob/master/licenses/UserFrosting.md (MIT License)
87
*/
98
namespace UserFrosting\Sprinkle\Admin\Sprunje;
@@ -35,6 +34,11 @@ class UserSprunje extends Sprunje
3534
'flag_enabled'
3635
];
3736

37+
protected $excludeForAll = [
38+
'last_activity',
39+
'flag_enabled'
40+
];
41+
3842
/**
3943
* {@inheritDoc}
4044
*/

app/sprinkles/core/src/Sprunje/Sprunje.php

Lines changed: 81 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* UserFrosting (http://www.userfrosting.com)
44
*
55
* @link https://github.com/userfrosting/UserFrosting
6-
* @copyright Copyright (c) 2013-2016 Alexander Weissman
76
* @license https://github.com/userfrosting/UserFrosting/blob/master/licenses/UserFrosting.md (MIT License)
87
*/
98
namespace UserFrosting\Sprinkle\Core\Sprunje;
@@ -37,11 +36,6 @@ abstract class Sprunje
3736
*/
3837
protected $name = '';
3938

40-
/**
41-
* Separator to use when splitting filter values to treat them as ORs.
42-
*/
43-
protected $orSeparator = '||';
44-
4539
/**
4640
* @var \Illuminate\Database\Eloquent\Builder
4741
*/
@@ -74,6 +68,18 @@ abstract class Sprunje
7468
*/
7569
protected $sortable = [];
7670

71+
/**
72+
* List of fields to exclude when processing an "_all" filter.
73+
*
74+
* @var array[string]
75+
*/
76+
protected $excludeForAll = [];
77+
78+
/**
79+
* Separator to use when splitting filter values to treat them as ORs.
80+
*/
81+
protected $orSeparator = '||';
82+
7783
/**
7884
* Constructor.
7985
*
@@ -261,26 +267,82 @@ protected function applyFilters()
261267
$e->addUserMessage('VALIDATE.SPRUNJE.BAD_FILTER', ['name' => $name]);
262268
throw $e;
263269
}
270+
// Set orFilter to 'false' to require a match on _all_ fields
271+
$this->query = $this->buildFilterQuery($this->query, $name, $value, false);
272+
}
264273

265-
// Determine if a custom filter method has been defined
266-
$methodName = 'filter'.studly_case($name);
274+
return $this->query;
275+
}
267276

268-
if (method_exists($this, $methodName)) {
269-
$this->query = $this->$methodName($this->query, $value);
277+
/**
278+
* Match any filter in `filterable`.
279+
*
280+
* @param Builder $query
281+
* @param mixed $value
282+
* @return Builder
283+
*/
284+
protected function filterAll($query, $value)
285+
{
286+
foreach ($this->filterable as $name) {
287+
if (studly_case($name) != 'all' && !in_array($name, $this->excludeForAll)) {
288+
$query = $this->buildFilterQuery($query, $name, $value, true);
289+
}
290+
}
291+
292+
return $query;
293+
}
294+
295+
/**
296+
* Build the filter query for a single field.
297+
*
298+
* @param Builder $query
299+
* @param string $name
300+
* @param mixed $value
301+
* @return Builder
302+
*/
303+
protected function buildFilterQuery($query, $name, $value, $orFilter = true)
304+
{
305+
$methodName = 'filter'.studly_case($name);
306+
307+
// Determine if a custom filter method has been defined
308+
if (method_exists($this, $methodName)) {
309+
$query = $this->$methodName($query, $value);
310+
} else {
311+
if ($orFilter) {
312+
// Since we want to match _any_ of the fields, we wrap the field callback in a 'orWhere' callback
313+
$query = $query->orWhere(function ($fieldQuery) use ($name, $value) {
314+
return $this->buildFilterDefaultFieldQuery($fieldQuery, $name, $value);
315+
});
270316
} else {
271-
// Split value on separator for OR queries
272-
$values = explode($this->orSeparator, $value);
273-
274-
$this->query = $this->query->where(function ($query) use ($name, $values) {
275-
foreach ($values as $value) {
276-
$query = $query->orLike($name, $value);
277-
}
278-
return $query;
317+
// Since we want to match _all_ of the fields, we wrap the field callback in a 'where' callback
318+
$query = $query->where(function ($fieldQuery) use ($name, $value) {
319+
return $this->buildFilterDefaultFieldQuery($fieldQuery, $name, $value);
279320
});
280321
}
281322
}
282323

283-
return $this->query;
324+
return $query;
325+
}
326+
327+
/**
328+
* Perform a 'like' query on a single field, separating the value string on the or separator and
329+
* matching any of the supplied values.
330+
*
331+
* @param Builder $query
332+
* @param string $name
333+
* @param mixed $value
334+
* @return Builder
335+
*/
336+
protected function buildFilterDefaultFieldQuery($query, $name, $value)
337+
{
338+
// Default filter - split value on separator for OR queries
339+
// and search by column name
340+
$values = explode($this->orSeparator, $value);
341+
foreach ($values as $value) {
342+
$query = $query->orLike($name, $value);
343+
}
344+
345+
return $query;
284346
}
285347

286348
/**
@@ -367,35 +429,4 @@ protected function countFiltered()
367429
{
368430
return $this->query->count();
369431
}
370-
371-
/**
372-
* Match any filter in `filterable`.
373-
*
374-
* @param Builder $query
375-
* @param mixed $value
376-
* @return Builder
377-
*/
378-
protected function filterAll($query, $value)
379-
{
380-
foreach ($this->filterable as $name) {
381-
$methodName = 'filter'.studly_case($name);
382-
if ($methodName != 'filterAll') {
383-
$query = $query->orWhere(function ($likeQuery) use ($name, $methodName, $value) {
384-
385-
if (method_exists($this, $methodName)) {
386-
$likeQuery = $this->$methodName($likeQuery, $value);
387-
} else {
388-
// Split value on separator for OR queries
389-
$values = explode($this->orSeparator, $value);
390-
foreach ($values as $value) {
391-
$likeQuery = $likeQuery->orLike($name, $value);
392-
}
393-
}
394-
return $likeQuery;
395-
});
396-
}
397-
}
398-
399-
return $query;
400-
}
401432
}

0 commit comments

Comments
 (0)