diff --git a/apps/desktop/src/components/document/DocumentBrowser.vue b/apps/desktop/src/components/document/DocumentBrowser.vue index 6af08563e6..57e25e913a 100644 --- a/apps/desktop/src/components/document/DocumentBrowser.vue +++ b/apps/desktop/src/components/document/DocumentBrowser.vue @@ -321,6 +321,9 @@ type DocumentGridChanges = { rows: MongoInputValue[][]; }; const documentFilterBuilderOpen = ref(false); +/// Why an Apply click did not filter. The shared `error` banner lives in the document pane, which +/// the open filter popover covers, so a rejected rule there reads as a dead button. +const documentFilterBuilderError = ref(""); const documentFilterFieldPopoverOpen = ref>({}); const documentFilterFieldSearch = ref>({}); const documentFilterRules = ref(restoredDocumentBrowserState?.documentFilterRules ?? []); @@ -908,12 +911,14 @@ function documentFilterFieldKindLabel(kind: DocumentFieldPathNode["kind"]): stri } function removeDocumentFilterRule(ruleId: string) { + documentFilterBuilderError.value = ""; documentFilterRules.value = documentFilterRules.value.filter((rule) => rule.id !== ruleId); setDocumentFilterFieldPopoverOpen(ruleId, false); if (documentFilterRules.value.length === 0) appliedDocumentFilter.value = null; } function updateDocumentFilterRule(ruleId: string, patch: Partial) { + documentFilterBuilderError.value = ""; documentFilterRules.value = documentFilterRules.value.map((rule) => { if (rule.id !== ruleId) return rule; const next = { ...rule, ...patch }; @@ -947,6 +952,7 @@ function elasticsearchQueryTypeLabel(queryType: ElasticsearchQueryType): string } function resetDocumentFilterBuilder() { + documentFilterBuilderError.value = ""; appliedDocumentFilter.value = null; documentFilterFieldPopoverOpen.value = {}; documentFilterFieldSearch.value = {}; @@ -1399,9 +1405,10 @@ async function applyDocumentStructuredFilters() { })) .filter((item): item is { rule: DocumentFilterRule; condition: Record } => !!item.condition); } catch (e) { - error.value = e instanceof Error ? e.message : String(e); + documentFilterBuilderError.value = e instanceof Error ? e.message : String(e); return; } + documentFilterBuilderError.value = ""; error.value = ""; const structured = combineDocumentFilterConditions( items.map((item) => item.condition), @@ -3186,6 +3193,10 @@ defineExpose({ focusSearch }); {{ t("grid.filterBuilderEmpty") }} +

+ {{ documentFilterBuilderError }} +

+