diff --git a/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx index 12b2b7457..81967152d 100644 --- a/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx @@ -137,7 +137,7 @@ function getConnectorTypeDisplayName(connectorType: string): string { } type InboxTab = "comments" | "status"; -type InboxFilter = "all" | "unread"; +type InboxFilter = "all" | "unread" | "errors"; // Tab-specific data source with independent pagination interface TabDataSource { @@ -399,6 +399,12 @@ export function InboxSidebar({ if (activeFilter === "unread") { items = items.filter((item) => !item.read); + } else if (activeFilter === "errors") { + items = items.filter((item) => { + if (item.type === "page_limit_exceeded") return true; + const meta = item.metadata as Record | undefined; + return typeof meta?.status === "string" && meta.status === "failed"; + }); } return items; @@ -712,6 +718,27 @@ export function InboxSidebar({ {activeFilter === "unread" && } + {activeTab === "status" && ( + + )} {/* Sources section - only for status tab */} @@ -815,6 +842,18 @@ export function InboxSidebar({ {activeFilter === "unread" && } + {activeTab === "status" && ( + setActiveFilter("errors")} + className="flex items-center justify-between" + > + + + {t("errors_only") || "Errors only"} + + {activeFilter === "errors" && } + + )} {activeTab === "status" && statusSourceOptions.length > 0 && ( <> @@ -949,7 +988,13 @@ export function InboxSidebar({ setActiveTab(value as InboxTab)} + onValueChange={(value) => { + const tab = value as InboxTab; + setActiveTab(tab); + if (tab !== "status" && activeFilter === "errors") { + setActiveFilter("all"); + } + }} className="shrink-0 mx-4" > diff --git a/surfsense_web/messages/en.json b/surfsense_web/messages/en.json index d491899ad..42d2a0437 100644 --- a/surfsense_web/messages/en.json +++ b/surfsense_web/messages/en.json @@ -719,6 +719,7 @@ "filter": "Filter", "all": "All", "unread": "Unread", + "errors_only": "Errors only", "connectors": "Connectors", "all_connectors": "All connectors", "sources": "Sources", diff --git a/surfsense_web/messages/es.json b/surfsense_web/messages/es.json index 758c93baf..d1421686e 100644 --- a/surfsense_web/messages/es.json +++ b/surfsense_web/messages/es.json @@ -719,6 +719,7 @@ "filter": "Filtrar", "all": "Todo", "unread": "No leído", + "errors_only": "Solo errores", "connectors": "Conectores", "all_connectors": "Todos los conectores", "sources": "Fuentes", diff --git a/surfsense_web/messages/hi.json b/surfsense_web/messages/hi.json index 07dcddbcc..49eaccb84 100644 --- a/surfsense_web/messages/hi.json +++ b/surfsense_web/messages/hi.json @@ -719,6 +719,7 @@ "filter": "फ़िल्टर", "all": "सभी", "unread": "अपठित", + "errors_only": "केवल त्रुटियाँ", "connectors": "कनेक्टर", "all_connectors": "सभी कनेक्टर", "sources": "स्रोत", diff --git a/surfsense_web/messages/pt.json b/surfsense_web/messages/pt.json index 9691d4727..14e7d58ed 100644 --- a/surfsense_web/messages/pt.json +++ b/surfsense_web/messages/pt.json @@ -719,6 +719,7 @@ "filter": "Filtrar", "all": "Tudo", "unread": "Não lido", + "errors_only": "Apenas erros", "connectors": "Conectores", "all_connectors": "Todos os conectores", "sources": "Fontes", diff --git a/surfsense_web/messages/zh.json b/surfsense_web/messages/zh.json index 969ea2b25..28b84e8e5 100644 --- a/surfsense_web/messages/zh.json +++ b/surfsense_web/messages/zh.json @@ -703,6 +703,7 @@ "filter": "筛选", "all": "全部", "unread": "未读", + "errors_only": "仅错误", "connectors": "连接器", "all_connectors": "所有连接器", "sources": "来源",