Enhance search functionality with loading indicators, dark mode support, and improved UI; implement event handling for search results and refine park filter tests for better coverage

This commit is contained in:
pacnpal
2025-02-13 09:42:58 -05:00
parent 1fe299fb4b
commit c197051b25
8 changed files with 292 additions and 134 deletions

View File

@@ -51,26 +51,43 @@ def get_park_areas(request: HttpRequest) -> HttpResponse:
def search_parks(request: HttpRequest) -> HttpResponse:
"""Search parks and return results for quick searches (dropdowns, etc)"""
"""Search parks and return results for quick searches with auto-suggestions"""
try:
search_query = request.GET.get('search', '').strip()
if not search_query:
return HttpResponse('') # Return empty response for empty query
queryset = (
Park.objects.prefetch_related('location', 'photos')
Park.objects.select_related('owner')
.prefetch_related('location', 'photos')
.annotate(
ride_count=Count('rides'),
coaster_count=Count('rides', filter=Q(rides__category="RC"))
)
.order_by('name')
)
filter_params = {'search': request.GET.get('q', '').strip()}
park_filter = ParkFilter(filter_params, queryset=queryset)
parks = park_filter.qs[:10] # Limit to 10 results
# Use our existing filter but with search-specific configuration
park_filter = ParkFilter({
'search': search_query
}, queryset=queryset)
return render(request, "parks/partials/park_search_results.html", {
parks = park_filter.qs[:8] # Limit to 8 suggestions
response = render(request, "parks/partials/park_search_results.html", {
"parks": parks,
"is_quick_search": True
})
response['HX-Trigger'] = 'searchComplete'
return response
except Exception as e:
return render(request, "parks/partials/park_search_results.html", {
response = render(request, "parks/partials/park_search_results.html", {
"error": f"Error performing search: {str(e)}",
"is_quick_search": True
})
response['HX-Trigger'] = 'searchError'
return response
def location_search(request: HttpRequest) -> JsonResponse:
@@ -174,12 +191,14 @@ class ParkListView(HTMXFilterableMixin, ListView):
"photos",
"location",
"rides",
"rides__manufacturer"
"rides__manufacturer",
"areas"
)
.annotate(
total_rides=Count("rides"),
total_coasters=Count("rides", filter=Q(rides__category="RC")),
)
.order_by("name") # Ensure consistent ordering for pagination
)
except Exception as e:
messages.error(self.request, f"Error loading parks: {str(e)}")