From b165dfd40f75bbd1b5cdf0ec2821e09331cbaf9e Mon Sep 17 00:00:00 2001 From: Brian Holmes Date: Thu, 8 Jan 2026 14:08:48 -0500 Subject: [PATCH] fix: dimension filter contains mode --- .../features/canvas/stores/filter-state.ts | 58 +++++++++++++------ .../dimension-filters/DimensionFilter.svelte | 16 +++++ 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/web-common/src/features/canvas/stores/filter-state.ts b/web-common/src/features/canvas/stores/filter-state.ts index c09316461b4..c44aedcb3c0 100644 --- a/web-common/src/features/canvas/stores/filter-state.ts +++ b/web-common/src/features/canvas/stores/filter-state.ts @@ -31,6 +31,7 @@ import type { DimensionThresholdFilter } from "../../dashboards/stores/explore-s import { convertExpressionToFilterParam } from "../../dashboards/url-state/filters/converters"; import { FilterManager, type UIFilters } from "./filter-manager"; import { getDimensionDisplayName } from "../../dashboards/filters/getDisplayName"; +import { eventBus } from "@rilldata/web-common/lib/event-bus/event-bus"; export type ParsedFilters = ReturnType; @@ -280,27 +281,46 @@ export class FilterState { ) ?? -1; let expr = wf.cond?.exprs?.[exprIndex]; - const wasLikeFilter = - expr?.cond?.op === V1Operation.OPERATION_LIKE || - expr?.cond?.op === V1Operation.OPERATION_NLIKE; - - if (!expr?.cond?.exprs || wasLikeFilter) { - expr = createInExpression(dimensionName, [], exclude); + if (!expr?.cond?.exprs) { + expr = createInExpression(dimensionName, dimensionValues, exclude); wf.cond?.exprs?.push(expr); exprIndex = wf.cond!.exprs!.length - 1; - } - - const wasInListFilter = dimensionsWithInListFilter.includes(dimensionName); - if (wasInListFilter) { - dimensionsWithInListFilter.filter((d) => d !== dimensionName); - } - - dimensionValues.forEach((dimensionValue) => { - toggleDimensionFilterValue(expr, dimensionValue, !!isExclusiveFilter); - }); - - if (expr?.cond?.exprs?.length === 1) { - wf.cond?.exprs?.splice(exprIndex, 1); + } else { + const wasLikeFilter = + expr?.cond?.op === V1Operation.OPERATION_LIKE || + expr?.cond?.op === V1Operation.OPERATION_NLIKE; + + const wasInListFilter = + dimensionsWithInListFilter.includes(dimensionName); + + if (wasLikeFilter || wasInListFilter) { + eventBus.emit("notification", { + message: "Converted filter type to Select", + link: { + text: "Undo", + href: window.location.href, + }, + }); + + expr = createInExpression(dimensionName, dimensionValues, exclude); + wf.cond?.exprs?.splice(exprIndex, 1, expr); + + if (wasInListFilter) { + dimensionsWithInListFilter.filter((d) => d !== dimensionName); + } + } else if (expr) { + dimensionValues.forEach((dimensionValue) => { + toggleDimensionFilterValue( + expr!, + dimensionValue, + !!isExclusiveFilter, + ); + }); + + if (expr?.cond?.exprs?.length === 1) { + wf.cond?.exprs?.splice(exprIndex, 1); + } + } } return getFilterParam( diff --git a/web-common/src/features/dashboards/filters/dimension-filters/DimensionFilter.svelte b/web-common/src/features/dashboards/filters/dimension-filters/DimensionFilter.svelte index 7ffd1d61793..22c6cf511d9 100644 --- a/web-common/src/features/dashboards/filters/dimension-filters/DimensionFilter.svelte +++ b/web-common/src/features/dashboards/filters/dimension-filters/DimensionFilter.svelte @@ -79,6 +79,10 @@ pinned, } = filterData); + $: if (!open && filterData.mode !== curMode) { + resyncFilterData(filterData); + } + // Sync proxy when selectedValues changes (for Select mode) $: if (!open && mode === DimensionFilterMode.Select) { selectedValuesProxy = structuredClone(filterData.selectedValues) ?? []; @@ -383,6 +387,18 @@ await toggleDimensionValueSelections(name, [value], metricsViewNames); } } + + function resyncFilterData(filterData: DimensionFilterItem) { + curMode = filterData.mode; + curSearchText = filterData.inputText ?? ""; + curExcludeMode = filterData.isInclude === false; + selectedValuesProxy = filterData.selectedValues ?? []; + searchedBulkValues = + filterData.mode === DimensionFilterMode.InList + ? (filterData.selectedValues ?? []) + : []; + curPinned = filterData.pinned; + }