Merge branch 'fix/filterProduct' into 'develop'

fix: 🐛 add check for root route or 'sub' route in filter products

See merge request ldc-web/projets/le-gaulois!173
This commit is contained in:
noah.lancien 2024-11-06 14:25:28 +00:00
commit 678b6e290c
2 changed files with 49 additions and 26 deletions

View file

@ -42,11 +42,11 @@ class ProductController extends Controller
): \Illuminate\Contracts\View\View {
/** @var \Illuminate\Contracts\Pagination\LengthAwarePaginator $productModels */
$productModels = $productModelsFiltered ?? Product::query()
$productModels = $productModelsFiltered ?? Product::query()
->where('published', true)
->orderBy('slug')
->paginate($this->productModelsPerPage);
$productDiscoverModels = Product::getPublishedDiscovered();
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::products);
$rangeModels = Range::getPublishedOrderedWithSubranges();
@ -122,9 +122,9 @@ class ProductController extends Controller
*/
public function getSiblingModels(Product $productModel): array
{
$filter = Cache::get('productsFilter');
$filter = Cache::get('productsFilter');
$cleanedFilter = $this->cleanSubSubFilter($filter);
/** @var string $slug */
$slug = $filter
? ((is_null($productModel->{$filter})
@ -132,7 +132,7 @@ class ProductController extends Controller
: $productModel->{$filter})->slug ?? "")
: "";
// FIXME: the previous element are added on 30/10/24 to avoid error when productFilters was set on "submeat" for example and user access to product which not have submeat relation -> "Attempt to read property 'sub***' on null"
// FIXME: the previous element are added on 30/10/24 to avoid error when productFilters was set on "submeat" for example and user access to product which not have submeat relation -> "Attempt to read property 'sub***' on null"
// this fix will just avoid the error, but in this case, product.show have no previous or next product.
/** @var \Illuminate\Support\Collection $productModelsList */
@ -159,7 +159,7 @@ class ProductController extends Controller
->where('published', true)
->orderBy('slug')
->get();
$collectionIndex = $productModelsList->search(function ($productModelItem, $key) use ($productModel) {
$collectionIndex = $productModelsList->search(function ($productModelItem, $key) use ($productModel) {
if ($productModelItem->getKey() === $productModel->getKey()) {
return $key;
};
@ -260,15 +260,15 @@ class ProductController extends Controller
->with(['range', 'subrange', 'meat', 'submeat'])
->where('published', true)
->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel, $request) {
if ($request->child_slug) {
$q->whereHas('subrange', function (Builder $q) use ($request) {
$q->whereHas('range', function (Builder $q) use ($rangeModel) {
$q->where('published', true)->where('id', $rangeModel->getKey());
})->orWhereHas('subrange', function (Builder $q) use ($rangeModel, $request) {
if ($request->child_slug) {
$q->where('published', true)->where("slug", $request->child_slug);
});
} else {
$q->whereHas('range', function (Builder $q) use ($rangeModel) {
$q->where('published', true)->where('id', $rangeModel->getKey());
});
}
} else {
$q->where('published', true)->whereIn('id', $rangeModel->subranges->pluck('id')->toArray());
}
});
})
->where('published', true)
->orderBy('slug')
@ -278,9 +278,10 @@ class ProductController extends Controller
return response()->json([
'viewsPaginate' => $this->getViewsFromPaginateModels($productModels),
'children' => $subrangeModels,
'productModels' => $productModels,
]);
}
return $this->index($productModels, $subrangeModels);
}
@ -295,17 +296,19 @@ class ProductController extends Controller
Request $request
): \Illuminate\Http\JsonResponse|\Illuminate\Contracts\View\View {
Cache::put('productsFilter', 'subrange');
$rangeModel = Range::query()
$rangeModel = Range::query()
->where('slug', $request->model_slug)
->where('published', true)
->first();
$subrangeModel = Subrange::query()
$subrangeModel = Subrange::query()
->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel) {
$q->where('range_id', $rangeModel->getKey());
})
->where('slug', $request->child_slug)
->where('published', true)
->first();
$subrangeModels = Subrange::query()
->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel) {
$q->where('range_id', $rangeModel->getKey());
@ -323,10 +326,12 @@ class ProductController extends Controller
})
->orderBy('slug')
->paginate($this->productModelsPerPage);
if ($request->ajax()) {
return response()->json([
'productModels' => $productModels,
'viewsPaginate' => $this->getViewsFromPaginateModels($productModels),
'children' => [],
'children' => $subrangeModels,
]);
}
return $this->index($productModels, $subrangeModels);
@ -417,7 +422,7 @@ class ProductController extends Controller
if ($request->ajax()) {
return response()->json([
'viewsPaginate' => $this->getViewsFromPaginateModels($productModels),
'children' => [],
'children' => $submeatModels,
]);
}
return $this->index($productModels, null, $submeatModels);
@ -550,12 +555,15 @@ class ProductController extends Controller
}
/**
* Delete the "sub" start filter to avoid "subsubrange" when user has some filters and hard visit a total different product filter
* @var string $filter
*
*/
private function cleanSubSubFilter($filter) {
/**
* Delete the "sub" start filter to avoid "subsubrange" when user has some filters
* and hard visit a total different product filter
*
* @var string $filter
* @return mixed
*/
private function cleanSubSubFilter($filter): mixed
{
return str_starts_with($filter, "sub") ? preg_replace('/^sub/', '', $filter) : $filter;
}
}

View file

@ -556,6 +556,17 @@ function initChildrenSwiper(): void {
});
}
/**
* Choose between "sub" or root route.
* e.g fo.search.subrange or fo.search.range
* @return string
*/
const routeOrSubRouteSearch = () => {
if(filtersDetailsParameters.selectedChildModel) {
return filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].children?.route ?? filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route;
}
return filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route;
};
/**
* Check if all models are loaded,
* if not, get next models.
@ -571,16 +582,19 @@ function checkScroll(): void {
) {
paginationParameters.page++;
paginationParameters.loading = true;
let routeCustom = (searchParameters.selectedList?.length)
? (getRouteFilter(searchParameters.routeWords) + `?page=${paginationParameters.page}&words=${searchParameters.selectedList.join(",")}`)
: getRouteFilter(
filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route,
routeOrSubRouteSearch(),
(filtersDetailsParameters.selectedChildFilter.length)
? { model_slug: filtersDetailsParameters.selectedFilter, child_slug: filtersDetailsParameters.selectedChildFilter, page: paginationParameters.page }
: (filtersDetailsParameters.selectedFilter.length)
? { model_slug: filtersDetailsParameters.selectedFilter, page: paginationParameters.page }
: { page: paginationParameters.page }
);
let url = (filtersDetailsParameters.selectedChildFilter.length)
? filtersDetailsParameters.selectedChildFilter
: ((filtersDetailsParameters.selectedFilter.length)
@ -693,6 +707,7 @@ function ajaxCall(
filtersDetailsParameters.viewsPaginate = (concatResult)
? filtersDetailsParameters.viewsPaginate.concat(newViewsPaginate)
: newViewsPaginate;
if (updateChildren) {
filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].children!.models = reponse.data.children;
}