diff --git a/app/Http/Controllers/Bo/InvoiceController.php b/app/Http/Controllers/Bo/InvoiceController.php index 5399518..2114000 100644 --- a/app/Http/Controllers/Bo/InvoiceController.php +++ b/app/Http/Controllers/Bo/InvoiceController.php @@ -42,9 +42,10 @@ class InvoiceController extends Controller 'firstname', 'lastname', 'ref', + 'site_id', ); } - $searchFields = trans('Nom, Prénom, Référence'); + $searchFields = trans('Nom, Prénom, Référence, Site'); /** Sort columns with a query */ $this->sortQuery($invoiceModels); diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 6f52ca1..ed2f0d8 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -15,6 +15,7 @@ use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\View; +use Illuminate\Support\Str; class Controller extends BaseController { @@ -117,28 +118,80 @@ class Controller extends BaseController * @param array $fields * @return \Illuminate\Database\Eloquent\Builder */ - private function searchOnFields(Builder $query, string $search, array $fields): Builder - { + private function searchOnFields( + Builder $query, + string $search, + array $fields + ): \Illuminate\Database\Eloquent\Builder { $table = $query->getModel()->getTable(); - foreach ($fields as $f) { - $f = str_replace('?', '\?', $f); - if (is_array($f)) { + foreach ($fields as $field) { + $field = str_replace('?', '\?', $field); + if (is_array($field)) { $query->orWhereRaw( - sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($f)->map(function ($q) use ($table) { + sprintf("UPPER(CONCAT(%s)) LIKE UPPER(?)", collect($field)->map(function ($q) use ($table) { return "`$table`.`$q`"; })->implode(', \' \', ')), - ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] - ); - } else { - $query->orWhereRaw( - "UPPER(`$table`.`$f`) LIKE UPPER(?)", - ['%' . filter_var($search, FILTER_SANITIZE_STRING) . '%'] + ['%' . htmlspecialchars($search) . '%'] ); + return $query; } - } + // Get models woth enum's label. + if (is_array($this->getSearchValue($query, $search, $field))) { + foreach ($this->getSearchValue($query, $search, $field) as $array) { + $query->orWhereRaw( + "UPPER(`$table`.`$field`) LIKE UPPER(?)", + ['%' . htmlspecialchars($array->value) . '%'] + ); + } + return $query; + } + // Get models with relation's name/label. + if (Str::endsWith($field, '_id')) { + $query->orWhereHas(Str::remove('_id', $field), function ($queryRelation) use ($field, $search) { + if (Schema::hasColumn(Str::remove('_id', $field) . 's', 'name')) { + $queryRelation->where('name', 'like', '%' . $search . '%'); + } elseif (Schema::hasColumn(Str::remove('_id', $field) . 's', 'label')) { + $queryRelation->where('label', 'like', '%' . $search . '%'); + } + }); + return $query; + } + $query->orWhereRaw( + "UPPER(`$table`.`$field`) LIKE UPPER(?)", + ['%' . htmlspecialchars($this->getSearchValue($query, $search, $field)) . '%'] + ); + } //end foreach return $query; } + /** + * Get the search value (on string or Enum). + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $search + * @param string $field + * @return string|array + */ + protected function getSearchValue(Builder $query, string $search, string $field): string|array + { + $cast = $query->getModel()->getCasts()[$field] ?? null; + if ( + count($query->getModel()->getCasts()) and // Check if the model has casts. + $cast and // Check if there is cast about specific field. + enum_exists($cast) // Check if the cast is an enum. + ) { + /** @var \App\Traits\Enums $cast */ + // @phpstan-ignore-next-line + $cases = collect($cast::toArray()); + $enum = $cases->filter(function ($item) use ($search) { + return preg_match('/' . Str::lower($search) . '/', Str::lower($item->label)); + }); + return $enum->toArray(); + } else { + return $search; + } + } + /** * Sort columns with a query *