From cb38d8609e8355766897846480563a045561cfec Mon Sep 17 00:00:00 2001 From: Carlos Date: Tue, 13 Jan 2026 16:43:16 +0100 Subject: [PATCH 1/2] Fix templates warning --- pcweb/components/docpage/navbar/typesense.py | 8 ++++---- pcweb/pages/gallery/sidebar.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pcweb/components/docpage/navbar/typesense.py b/pcweb/components/docpage/navbar/typesense.py index 6c857d991..65a452a6f 100644 --- a/pcweb/components/docpage/navbar/typesense.py +++ b/pcweb/components/docpage/navbar/typesense.py @@ -470,16 +470,16 @@ def search_input(): ), rx.box( filter_component(), - rx.link( + rx.el.a( ui.button( - ui.icon(icon="SparklesIcon", class_name="shrink-0 size-2"), + ui.icon(icon="SparklesIcon", class_name="shrink-0 size-3"), "Ask AI", type="button", variant="secondary", size="xs", class_name="text-sm flex flex-row gap-x-2 items-center", ), - href="https://reflex.dev/docs/ai-builder/integrations/mcp-overview/", + to="https://reflex.dev/docs/ai-builder/integrations/mcp-overview/", ), ui.button( "Esc", @@ -718,7 +718,7 @@ def typesense_search() -> rx.Component: search_content(), on_interact_outside=SimpleSearch.reset_search, on_escape_key_down=SimpleSearch.reset_search, - class_name="w-full max-w-[650px] mx-auto bg-secondary-1 border-none outline-none p-3 lg:!fixed lg:!top-24 lg:!left-1/2 lg:!transform lg:!-translate-x-1/2 lg:!translate-y-0 lg:!m-0 " + class_name="!font-sans w-full max-w-[650px] mx-auto bg-secondary-1 border-none outline-none p-3 lg:!fixed lg:!top-24 lg:!left-1/2 lg:!transform lg:!-translate-x-1/2 lg:!translate-y-0 lg:!m-0 " + rx.cond(SimpleSearch.query.length() < 3, "min-h[57vh]", "h-[57vh]"), ), ), diff --git a/pcweb/pages/gallery/sidebar.py b/pcweb/pages/gallery/sidebar.py index de5b983a7..778b90f0b 100644 --- a/pcweb/pages/gallery/sidebar.py +++ b/pcweb/pages/gallery/sidebar.py @@ -62,7 +62,7 @@ def clear_filters(self): self.checked_tags = set() self.page = 1 - @rx.var + @rx.var(auto_deps=False) def filtered_templates(self) -> list[str]: all_filtered = self._get_all_filtered_templates() self.total_pages = ( From 80023d6165b97f7722eb58f5f207883dc9473c24 Mon Sep 17 00:00:00 2001 From: Carlos Date: Thu, 15 Jan 2026 10:40:37 +0100 Subject: [PATCH 2/2] fix filtering --- pcweb/pages/gallery/sidebar.py | 81 +++++++++++++++------------------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/pcweb/pages/gallery/sidebar.py b/pcweb/pages/gallery/sidebar.py index 778b90f0b..4ac02e749 100644 --- a/pcweb/pages/gallery/sidebar.py +++ b/pcweb/pages/gallery/sidebar.py @@ -2,6 +2,7 @@ from pcweb.components.new_button import button from pcweb.components.user_input import input +from pcweb.pages.gallery.apps import gallery_apps_data TAGS = { "Category": [ @@ -17,62 +18,52 @@ } ITEMS_PER_PAGE = 12 +TEMPLATES_FOLDER = "templates/" -class TemplatesState(rx.State): - query: rx.Field[str] = rx.field("") - checked_tags: rx.Field[set[str]] = rx.field(default_factory=set) - page: rx.Field[int] = rx.field(1) - total_pages: rx.Field[int] = rx.field(1) - - def _get_all_filtered_templates(self) -> list[str]: - from pcweb.pages.gallery.apps import gallery_apps_data - - filtered = [] - for (_path, folder), document in gallery_apps_data.items(): - if folder != "templates/": - continue - - app_metadata = document.metadata - app_title = app_metadata.get("title", "") - app_description = app_metadata.get("description", "") - app_tags = app_metadata.get("tags", []) +TEMPLATE_SUMMARIES = [ + { + "title": (m := doc.metadata or {}).get("title", ""), + "description": m.get("description", ""), + "tags": m.get("tags", []), + } + for (_, folder), doc in gallery_apps_data.items() + if folder == TEMPLATES_FOLDER +] - # print(app_metadata, app_title, app_tags) - # Text search filtering - if self.query.strip(): - query_lower = self.query.lower() - if not ( - query_lower in app_title.lower() - or query_lower in app_description.lower() - ): - continue - - # Tag filtering - if self.checked_tags and not (set(app_tags) & self.checked_tags): - continue - - filtered.append(app_title) - - return filtered +class TemplatesState(rx.State): + query: rx.Field[str] = rx.field(default="") + checked_tags: rx.Field[set[str]] = rx.field(default_factory=set) + page: rx.Field[int] = rx.field(default=1) @rx.event def clear_filters(self): self.checked_tags = set() self.page = 1 - @rx.var(auto_deps=False) + @rx.var + def all_filtered_templates(self) -> list[str]: + query = self.query.strip().lower() + return [ + t["title"] + for t in TEMPLATE_SUMMARIES + if ( + not query + or query in t["title"].lower() + or query in t["description"].lower() + ) + and (not self.checked_tags or set(t["tags"]) & self.checked_tags) + ] + + @rx.var + def total_pages(self) -> int: + return max(1, -(-len(self.all_filtered_templates) // ITEMS_PER_PAGE)) + + @rx.var def filtered_templates(self) -> list[str]: - all_filtered = self._get_all_filtered_templates() - self.total_pages = ( - (len(all_filtered) + ITEMS_PER_PAGE - 1) // ITEMS_PER_PAGE - if all_filtered - else 1 - ) start = (self.page - 1) * ITEMS_PER_PAGE - end = start + ITEMS_PER_PAGE - return all_filtered[start:end] + return self.all_filtered_templates[start : start + ITEMS_PER_PAGE] @rx.event def set_query(self, value: str): @@ -129,9 +120,9 @@ def checkbox_item(text: str, value: str): return rx.box( rx.checkbox( checked=TemplatesState.checked_tags.contains(value), - on_change=TemplatesState.toggle_template(value), color_scheme="violet", key=value, + class_name="cursor-pointer", ), rx.text( text,