diff --git a/widgets/explore.py b/widgets/explore.py index 3deac0cef..67c08d566 100644 --- a/widgets/explore.py +++ b/widgets/explore.py @@ -13,6 +13,7 @@ from widgets.workflow_search import ( SearchFilters, render_search_bar_with_redirect, + get_filtered_published_runs, render_search_filters, render_search_results, ) @@ -62,6 +63,7 @@ def render(request: Request, search_filters: SearchFilters | None): ) search_filters = search_filters or SearchFilters() + qs = get_filtered_published_runs(request.user, search_filters) render_search_bar_with_redirect( request=request, search_filters=search_filters, @@ -69,7 +71,9 @@ def render(request: Request, search_filters: SearchFilters | None): ) with gui.div(className="mt-3"): new_filters = render_search_filters( - current_user=request.user, search_filters=copy(search_filters) + current_user=request.user, + search_filters=copy(search_filters), + result_count=len(qs), ) if new_filters != search_filters: # if the search bar value has changed, redirect to the new search page @@ -79,7 +83,7 @@ def render(request: Request, search_filters: SearchFilters | None): if search_filters: with gui.div(className="my-4"): - render_search_results(request.user, search_filters) + render_search_results(qs, request.user, search_filters) return for category, pages in all_home_pages_by_category.items(): diff --git a/widgets/workflow_search.py b/widgets/workflow_search.py index 3705a377c..25b423b8d 100644 --- a/widgets/workflow_search.py +++ b/widgets/workflow_search.py @@ -11,6 +11,7 @@ QuerySet, Value, ) +from django.utils.translation import ngettext from pydantic import BaseModel from app_users.models import AppUser @@ -70,7 +71,9 @@ def __bool__(self): def render_search_filters( - current_user: AppUser | None = None, search_filters: SearchFilters | None = None + current_user: AppUser | None = None, + search_filters: SearchFilters | None = None, + result_count: int | None = None, ): if not search_filters: search_filters = SearchFilters() @@ -113,6 +116,11 @@ def render_search_filters( with gui.div( className=f"{col_class} d-flex gap-2 justify-content-end align-items-center", ): + if result_count is not None: + gui.caption( + f"{result_count} {ngettext('result', 'results', result_count)}", + className="text-muted d-none d-md-block", + ) sort_options: dict[str, str] = { (opt.value if opt != SortOptions.get() else ""): ( f'{opt.icon} {opt.label}' @@ -365,8 +373,9 @@ def _render_selectbox( ) -def render_search_results(user: AppUser | None, search_filters: SearchFilters): - qs = get_filtered_published_runs(user, search_filters) +def render_search_results( + qs: QuerySet[PublishedRun], user: AppUser | None, search_filters: SearchFilters +): qs = qs.select_related("workspace", "created_by", "saved_run") def _render_run(pr: PublishedRun):