diff --git a/packages/app-builder/src/components/Analytics/RuleVsDecisionOutcomes.tsx b/packages/app-builder/src/components/Analytics/RuleVsDecisionOutcomes.tsx index 6eeaf32aab..ce393bb371 100644 --- a/packages/app-builder/src/components/Analytics/RuleVsDecisionOutcomes.tsx +++ b/packages/app-builder/src/components/Analytics/RuleVsDecisionOutcomes.tsx @@ -94,7 +94,7 @@ export function RuleVsDecisionOutcomes({
{isLoading ? ( diff --git a/packages/app-builder/src/models/analytics/decisions-outcomes-perday.ts b/packages/app-builder/src/models/analytics/decisions-outcomes-perday.ts index 70e836c22f..63b8d1f4ac 100644 --- a/packages/app-builder/src/models/analytics/decisions-outcomes-perday.ts +++ b/packages/app-builder/src/models/analytics/decisions-outcomes-perday.ts @@ -76,6 +76,7 @@ export const triggerFilter = z.object({ name: z.string(), op: z.enum(['=', '!=', '>', '>=', '<', '<=', 'in']), value: z.array(z.union([z.string(), z.number(), z.boolean()])), + unavailable: z.boolean(), }); export const mergeDateRanges = (dateRanges: DecisionOutcomesPerDayResponseDto[][]): DecisionOutcomesPerDayEntity[] => diff --git a/packages/app-builder/src/models/analytics/index.ts b/packages/app-builder/src/models/analytics/index.ts index a5e550d48a..1262f5d6c4 100644 --- a/packages/app-builder/src/models/analytics/index.ts +++ b/packages/app-builder/src/models/analytics/index.ts @@ -85,12 +85,14 @@ export const analyticsQuery = analyticsFiltersQuery.extend({ }); export const transformTriggersFiltersToFieldsFilters = (filters: AnalyticsFiltersQuery['trigger']): FieldFilterDto[] => - filters?.map((f) => ({ - source: 'trigger_object', - field: f.name, - op: f.op, - values: f.value, - })) ?? []; + filters + ?.filter((f) => !f.unavailable) + .map((f) => ({ + source: 'trigger_object', + field: f.name, + op: f.op, + values: f.value, + })) ?? []; // export const TransformAnalyticsQueryRequest = analyticsQuery.transform((val): AnalyticsQueryDto[] => { diff --git a/packages/app-builder/src/routes/_builder+/_analytics+/analytics.$scenarioId.tsx b/packages/app-builder/src/routes/_builder+/_analytics+/analytics.$scenarioId.tsx index a98c1b1db4..6b202e0d6c 100644 --- a/packages/app-builder/src/routes/_builder+/_analytics+/analytics.$scenarioId.tsx +++ b/packages/app-builder/src/routes/_builder+/_analytics+/analytics.$scenarioId.tsx @@ -251,7 +251,7 @@ export default function Analytics() { const values = Array.isArray(textFilter.value) ? (textFilter.value as string[]).filter((v) => v != null && String(v).length > 0) : []; - return values.length ? [{ name, op: textFilter.op, value: values }] : []; + return values.length ? [{ name, op: textFilter.op, value: values, unavailable: descriptor.unavailable }] : []; } case 'number': { @@ -265,13 +265,15 @@ export default function Analytics() { const cleaned = (values as Array).filter( (v) => v !== null && v !== undefined && (typeof v !== 'string' || v.length > 0), ); - return cleaned.length ? [{ name, op: numFilter.op, value: cleaned }] : []; + return cleaned.length + ? [{ name, op: numFilter.op, value: cleaned, unavailable: descriptor.unavailable }] + : []; } case 'boolean': { // Boolean filter: boolean value if (typeof val !== 'boolean') return [] as any[]; - return [{ name, op: '=', value: [val] }]; + return [{ name, op: '=', value: [val], unavailable: descriptor.unavailable }]; } default: diff --git a/packages/ui-design-system/src/FiltersBar/FiltersBar.tsx b/packages/ui-design-system/src/FiltersBar/FiltersBar.tsx index a8626fc00a..c11bf554f8 100644 --- a/packages/ui-design-system/src/FiltersBar/FiltersBar.tsx +++ b/packages/ui-design-system/src/FiltersBar/FiltersBar.tsx @@ -272,7 +272,9 @@ export function FiltersBar({ descriptors = [], dynamicDescriptors = [], value, o key={filter.name} buttonState={buttonState({ state: - textFilter.selectedValue?.value && textFilter.selectedValue.value.length > 0 + !textFilter.unavailable && + textFilter.selectedValue?.value && + textFilter.selectedValue.value.length > 0 ? 'enabled' : 'disabled', })} diff --git a/packages/ui-design-system/src/FiltersBar/internals/NumberValueFilter.tsx b/packages/ui-design-system/src/FiltersBar/internals/NumberValueFilter.tsx index d8f3483083..7284e0c8bf 100644 --- a/packages/ui-design-system/src/FiltersBar/internals/NumberValueFilter.tsx +++ b/packages/ui-design-system/src/FiltersBar/internals/NumberValueFilter.tsx @@ -71,9 +71,9 @@ export function NumberValueFilter({ filter, buttonState }: { filter: NumberFilte const raw = (filter.selectedValue as any)?.value ?? localValue.value; const val = Array.isArray(raw) ? Number((raw as number[])[0]) : Number(raw as number); return ( - <> + {op} {val} - + ); })()} {filter.unavailable ? ( diff --git a/packages/ui-design-system/src/FiltersBar/internals/TextMatchFilter.tsx b/packages/ui-design-system/src/FiltersBar/internals/TextMatchFilter.tsx index 60e6685534..3da6bf91ec 100644 --- a/packages/ui-design-system/src/FiltersBar/internals/TextMatchFilter.tsx +++ b/packages/ui-design-system/src/FiltersBar/internals/TextMatchFilter.tsx @@ -4,6 +4,7 @@ import { ButtonV2 } from '../../Button/Button'; import { useI18n } from '../../contexts/I18nContext'; import { Input } from '../../Input/Input'; import { Tooltip } from '../../Tooltip/Tooltip'; +import { cn } from '../../utils'; import { type TextFilter } from '../types'; import { FilterItem, FilterPopover } from './FilterPopover'; import { useFiltersBarContext } from './FiltersBarContext'; @@ -39,7 +40,7 @@ export function TextMatchFilter({ filter, buttonState }: { filter: TextFilter; b {filter.name} {filter.selectedValue?.value && filter.selectedValue.value.length > 0 ? ( - + {t('filters:ds.text_match_filter.selected_values', { values: filter.selectedValue.value.join(', '), })}