feat(native-filters): make filter dependency support extensible via plugin registry#40905
feat(native-filters): make filter dependency support extensible via plugin registry#40905ashah65 wants to merge 14 commits into
Conversation
…lugin registry Replace hardcoded ALLOW_DEPENDENCIES list with a registry-based check so any filter plugin registering with Behavior.NativeFilter automatically supports the cascade dependency feature — no core changes needed for new plugins. Also adds isColumnSelect support in getControlItemsMap to allow plugins to declare dataset column picker controls.
|
The flagged issue is correct. When divider edits are made, the To resolve this, you should ensure that divider-specific changes are tracked. You can update Would you like me to fetch all other comments on this PR to validate them and implement minimal fixes for those as well? superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx |
There was a problem hiding this comment.
Code Review Agent Run #d2347d
Actionable Suggestions - 3
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx - 2
- Missing error handling for API call · Line 122-135
- Missing value prop for saved data restoration · Line 343-343
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx - 1
- Divider edits silently dropped on save · Line 473-476
Additional Suggestions - 2
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx - 1
-
Dead code from incomplete removal · Line 650-691Since the operatorType auto-reset logic depends on columns.type_generic, you should either add 'columns.type_generic' back to the API query's columns list or remove the related operatorType auto-reset code (lines 650–691) entirely.
-
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx - 1
-
Missing test coverage for isColumnSelect · Line 322-350The new `isColumnSelect` feature block (lines 322-350) lacks test coverage. Existing tests mock `ColumnSelect` but not `DatasetColumnSelect`. Add unit tests following the pattern in lines 212-251 to validate the new feature's behavior, including `notifyChange` propagation and initial value resolution.
-
Filtered by Review Rules
Bito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx - 1
- Missing unit tests for DatasetColumnSelect · Line 105-149
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx - 1
- Hardcoded label bypasses feature flag · Line 975-975
Review Details
-
Files reviewed - 5 · Commit Range:
3596459..3596459- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/hooks/index.ts
- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/hooks/useFilterOperations.ts
-
Files skipped - 0
-
Tools
- Whispers (Secret Scanner) - ✔︎ Successful
- Detect-secrets (Secret Scanner) - ✔︎ Successful
- Eslint (Linter) - ✔︎ Successful
Bito Usage Guide
Commands
Type the following command in the pull request comment and save the comment.
-
/review- Manually triggers a full AI review. -
/pause- Pauses automatic reviews on this pull request. -
/resume- Resumes automatic reviews. -
/resolve- Marks all Bito-posted review comments as resolved. -
/abort- Cancels all in-progress reviews.
Refer to the documentation for additional commands.
Configuration
This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.
Documentation & Help
There was a problem hiding this comment.
Pull request overview
This PR refactors native filter cascading-dependency support to be registry-driven (based on plugin metadata behaviors) and extends the native filter config modal’s control mapping to support plugin-declared dataset column picker controls (isColumnSelect).
Changes:
- Replaced the hardcoded native-filter dependency allowlist with a registry-based
Behavior.NativeFiltercheck. - Exported the new dependency-support helper through the hooks index and config modal module.
- Added
isColumnSelecthandling ingetControlItemsMapand introduced a dataset-column fetching select control for plugins.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/hooks/useFilterOperations.ts | Switches dependency eligibility to a registry/behavior-based check. |
| superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/hooks/index.ts | Re-exports the new helper instead of the removed hardcoded allowlist. |
| superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx | Wires the new helper export; modifies form onValuesChange handling. |
| superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx | Adds isColumnSelect rendering and a dataset column select control. |
| superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx | Adopts the new dependency helper; includes additional unrelated UI logic changes. |
- Mark divider edits as modified so canSave is enabled for divider changes - Persist sortMetric=undefined when Select is cleared via allowClear - Restore datasetLabel() for semantic-layers feature flag consistency - Restore time_grains allowlist UI for filter_timegrain config - Restore operatorType (Match type) UI for filter_select config - Fix ControlLabel to resolve function-typed label/description props - Fix DatasetColumnSelect: add cancellation, error handling, allowClear Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
✅ Deploy Preview for superset-docs-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Code Review Agent Run #0adbb6Actionable Suggestions - 0Additional Suggestions - 2
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
…g in FiltersConfigForm Add optional chaining on controlValues access to prevent TypeError when filter field value is undefined, and pass ReactNode descriptions directly to InfoTooltip to avoid String() coercion producing [object Object]. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Code Review Agent Run #28597fActionable Suggestions - 0Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
|
| Language | Fuzzy before | Fuzzy after | New |
|---|---|---|---|
fi |
4808 | 4809 | +1 |
th |
4808 | 4809 | +1 |
How to fix
1. Install dependencies (if not already set up):
pip install -r superset/translations/requirements.txt
sudo apt-get install gettext # or: brew install gettext2. Re-extract strings and sync .po files:
./scripts/translations/babel_update.shThis rewrites superset/translations/messages.pot from the current source files and merges the changes into every .po file. Strings whose msgid changed will be marked #, fuzzy.
3. Resolve the fuzzy entries in the affected language files (fi, th):
grep -n '#, fuzzy' superset/translations/<lang>/LC_MESSAGES/messages.poFor each fuzzy entry, either rewrite the msgstr to match the new string and remove the #, fuzzy line, or clear the msgstr to "" if you cannot provide a translation.
4. Commit your changes to the .po files.
…ilter-dependency-registry # Conflicts: # superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
…bility, not generic behavior Replace the Behavior.NativeFilter check in filterSupportsDependencies with a dedicated supportsCascadeDependencies flag on ChartMetadata. Every native filter declares Behavior.NativeFilter, so the previous check silently let filter_timegrain/filter_timecolumn act as cascade parents even though they emit dataset/column-bound extraFormData (time_grain_sqla, granularity_sqla) that isn't safe to merge into a child filter on a different dataset. Restores the original filter_select/filter_range/filter_time allowlist behavior while keeping the capability extensible for other plugins to opt into. Also reset defaultDataMask when the dataset column changes in the plugin column-picker path, mirroring the existing groupby column handler, so a stale default isn't persisted against the newly selected column.
Code Review Agent Run #040c3aActionable Suggestions - 0Additional Suggestions - 1
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
…cade fallback Add validation rules to the isColumnSelect plugin control loop in getControlItemsMap.tsx, mirroring the existing groupby column handler, so a plugin control declaring config.required is actually validated before save. Make ChartMetadata.supportsCascadeDependencies distinguish "never declared" (undefined) from an explicit opt-out (false), and have filterSupportsDependencies fall back to the plugin's Behavior.NativeFilter declaration only when the flag is unset. This preserves cascade-dependency support for existing/third-party native filter plugins that predate the new flag, while filter_timegrain/filter_timecolumn keep their explicit false opt-out instead of relying on an implicit default. Update NativeFiltersModal.test.tsx's getChartMetadataRegistry mock to include supportsCascadeDependencies for filter_select, matching production metadata.
Code Review Agent Run #3f71f9Actionable Suggestions - 0Additional Suggestions - 1
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #40905 +/- ##
==========================================
+ Coverage 63.76% 63.80% +0.03%
==========================================
Files 2652 2652
Lines 144846 144901 +55
Branches 33421 33436 +15
==========================================
+ Hits 92366 92455 +89
+ Misses 50808 50774 -34
Partials 1672 1672
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…kbox, and filter control handlers Closes Codecov patch-coverage gaps from the extensible filter dependency registry changes by exercising the new isColumnSelect plugin control, the requiredFirst checkbox branch, and the sort/single-value/match-type handlers that previously had no test invoking them. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Code Review Agent Run #bbac83Actionable Suggestions - 0Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
EnxDev
left a comment
There was a problem hiding this comment.
EnxDev's Review Agent — #40905 · HEAD c506e5d
comment — Core registry refactor is sound and most earlier bot findings are already addressed at this HEAD; one CI blocker (prettier) plus a couple of small guards.
Note: several automated reviews above (Copilot/codeant/bito) were filed against an earlier, larger force-pushed revision. Their findings — broken handleValuesChange divider tracking, missing defaultDataMask reset, missing required validation, missing fetch error handling, the stale-response race, removed operatorType/time_grains/datasetLabel UI — are not present at HEAD c506e5d; they're fixed or never existed here. Reviewed against the current diff only.
🔴 Functional
- CI
pre-commitis red —prettier-frontendreformatsgetControlItemsMap.test.tsx(the rest are(unchanged)).lint-frontendpasses, so it's pure formatting. Runpre-commit run prettier --files .../getControlItemsMap.test.tsx(ornpm run prettier) and push — this blocks merge.
🟡 Should-fix
getControlItemsMap.tsx:273— therenderTriggercheckbox loop doesn't excludeisColumnSelectcontrols. A plugin declaring bothrenderTrigger: trueandisColumnSelect: truerenders twice (checkbox and column picker). Add&& !item.config?.isColumnSelectto the filter as a cheap guard? (test: a control config with both flags renders one element)useFilterOperations.ts:26— the behavior fallback makes every already-installed third-partyBehavior.NativeFilterplugin cascade-capable by default, where before onlyfilter_range/select/timewere. That's the intended extensibility, but it's a silent default change for existing deployments — worth stating explicitly in the PR body/docs so it's a deliberate opt-out (supportsCascadeDependencies: false), not a surprise.
🔵 Nits
FiltersConfigModal.tsx:474—useCallback(fn, deps)→useMemo(() => fn, deps)is churn; they're identical, keepuseCallback. Also now reads onlyObject.keys(changedValues.filters)[0], where the original iterated all changed ids — if two dividers change in one event the rest are skipped (edge case).getControlItemsMap.tsx:191—notifyChangeswaps the checkbox path's order (formChanged(); forceUpdate()→forceUpdate(); formChanged()). Harmless, but an unflagged behavior reorder inside a "refactor."FiltersConfigForm.tsx:950— droppingoptionRender/getOptionDataTestremovesdata-testhooks from the filter-type/customization-type options, and the new sort/single-value/match-type modal tests are unrelated to this PR's stated goal. Confirmed nothing else references thosedata-teststrings (safe), but the scope creep makes review harder — consider splitting.
🙌 Praise
ChartMetadata.ts:56/ TimeColumn+TimeGrainindex.ts—supportsCascadeDependenciesundefined → fall back to NativeFilter behavior, with time-grain/time-column explicitlyfalse, cleanly preserves third-party extensibility while blocking the unsafe cross-datasetextraFormDatamerge. Correct call.getControlItemsMap.tsx:135—DatasetColumnSelectguards both the stale-response race (cancelledflag ondatasetIdchange) and fetch errors. Good async hygiene.
Reviewed by EnxDev's Review Agent — @EnxDev.
…ocks Replace the any-typed filterValues column param and the as-any-cast cachedSupersetGet mock payloads with concrete types, per code review. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…description callbacks ControlLabel now only invokes zero-argument label/description callbacks; state-dependent ones (state, controlState, chartState) are a real BaseControlConfig pattern but this control list has no such state to supply, so invoking them would throw. Also flattens the new isColumnSelect test block into standalone test() cases instead of introducing a second describe() wrapper. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Code Review Agent Run #1ff897Actionable Suggestions - 0Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
…n picker DatasetColumnSelect fetched columns for the new dataset but never checked whether the previously selected value still existed, so switching datasets could leave an invalid column reference in form state and saved with the filter. Mirror ColumnSelect's existing reset behavior by clearing the value via onChange(null) when it's absent from the fetched columns, the fetch fails, or the dataset is cleared. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
| .catch(() => { | ||
| if (cancelled) return; | ||
| setFetchState({ loadedForId: datasetId, fetchedColumns: [] }); | ||
| if (value) { | ||
| onChange?.(null); | ||
| } | ||
| }); |
There was a problem hiding this comment.
Suggestion: The error path clears the current column value whenever the dataset-column fetch fails, so a transient API/network failure will silently wipe an already-saved plugin column selection and trigger downstream default-mask reset logic even though the user did not change anything. Keep the existing value on fetch failure and only clear when you positively know the selected column is invalid from a successful response. [logic error]
Severity Level: Major ⚠️
❌ Native filter plugin column-picker loses selection on fetch failure.
⚠️ Default data mask resets unexpectedly on transient dataset API errors.Steps of Reproduction ✅
1. Open a dashboard and launch the Manage native filters modal, which renders
`FiltersConfigForm` at
`/workspace/superset/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:410-449`;
this calls `getControlItemsMap` with `datasetId` and `filterToEdit` (line 10-24 of that
snippet).
2. Register or use a filter plugin whose control panel item has `config.isColumnSelect ===
true` so that `getControlItemsMap` renders the plugin column picker block at
`/workspace/superset/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:111-154`,
wrapping `DatasetColumnSelect` in a `StyledFormItem` with `name={['filters', filterId,
'controlValues', controlItem.name]}` and `initialValue` bound to the previously saved
column (lines 115-125).
3. Ensure the filter already has a saved column selection in
`controlValues[controlItem.name]` so that AntD Form injects this as the `value` prop into
`DatasetColumnSelect` when the modal opens; the component’s effect (lines 143-178) calls
`cachedSupersetGet` to fetch dataset columns from `/api/v1/dataset/${datasetId}` (lines
152-156).
4. Trigger a transient failure for that dataset API call (e.g., by forcing the endpoint to
return 500 or simulating a network error) so `cachedSupersetGet` rejects; the `.catch`
block at lines 167-173 executes, and because `value` still contains the previously saved
column, `if (value) { onChange?.(null); }` clears the form field, wiping the user’s column
selection and (via the Form-controlled `onChange` plus the plugin’s `onChange` callback at
lines 138-146) also resets `defaultDataMask` even though the user did not change the
column.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
**Line:** 167:173
**Comment:**
*Logic Error: The error path clears the current column value whenever the dataset-column fetch fails, so a transient API/network failure will silently wipe an already-saved plugin column selection and trigger downstream default-mask reset logic even though the user did not change anything. Keep the existing value on fetch failure and only clear when you positively know the selected column is invalid from a successful response.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fixThere was a problem hiding this comment.
Code Review Agent Run #3c0345
Actionable Suggestions - 1
-
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx - 1
- Missing test coverage for new behavior · Line 143-178
Review Details
-
Files reviewed - 2 · Commit Range:
b9bcea0..d56f758- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
- superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
-
Files skipped - 0
-
Tools
- Whispers (Secret Scanner) - ✔︎ Successful
- Detect-secrets (Secret Scanner) - ✔︎ Successful
Bito Usage Guide
Commands
Type the following command in the pull request comment and save the comment.
-
/review- Manually triggers a full AI review. -
/pause- Pauses automatic reviews on this pull request. -
/resume- Resumes automatic reviews. -
/resolve- Marks all Bito-posted review comments as resolved. -
/abort- Cancels all in-progress reviews.
Refer to the documentation for additional commands.
Configuration
This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.
Documentation & Help
| useEffect(() => { | ||
| if (!datasetId) { | ||
| // dataset cleared — drop any stale selection immediately | ||
| if (value) { | ||
| onChange?.(null); | ||
| } | ||
| return undefined; | ||
| } | ||
| let cancelled = false; | ||
| cachedSupersetGet({ | ||
| endpoint: `/api/v1/dataset/${datasetId}?q=${rison.encode({ | ||
| columns: ['columns.column_name'], | ||
| })}`, | ||
| }) | ||
| .then(({ json: { result } }) => { | ||
| if (cancelled) return; | ||
| const columnNames: string[] = result.columns | ||
| .map((col: { column_name: string }) => col.column_name) | ||
| .filter(Boolean); | ||
| setFetchState({ loadedForId: datasetId, fetchedColumns: columnNames }); | ||
| if (value && !columnNames.includes(value)) { | ||
| onChange?.(null); | ||
| } | ||
| }) | ||
| .catch(() => { | ||
| if (cancelled) return; | ||
| setFetchState({ loadedForId: datasetId, fetchedColumns: [] }); | ||
| if (value) { | ||
| onChange?.(null); | ||
| } | ||
| }); | ||
| return () => { | ||
| cancelled = true; | ||
| }; | ||
| // eslint-disable-next-line react-hooks/exhaustive-deps | ||
| }, [datasetId]); |
There was a problem hiding this comment.
New behavior introduced by this diff (clearing stale selections on dataset clear, column mismatch, and errors) lacks test coverage. Per testing guidelines, verify actual business logic in tests, not just component rendering.
Code Review Run #3c0345
Should Bito avoid suggestions like this for future reviews? (Manage Rules)
- Yes, avoid them
|
Thanks @ashah65. The core change, swapping the hardcoded Two things: this PR is also carrying an There's also a small bug in the new |
…rsConfigModal/FiltersConfigForm/getControlItemsMap.tsx Co-authored-by: Evan Rusackas <evan@preset.io>
EnxDev's Review Agent — #40905 · HEAD 8e50b80comment — Core registry refactor is sound; the prettier CI blocker from my last pass is now green, and the remaining items are scope + minor guards, not blockers. Supersedes my earlier review at c506e5d. Since then, new commits landed and CI is now fully green — Note on the automated reviews above: several Copilot/codeant/bito findings target an earlier, larger force-pushed revision. Verified against the diff at HEAD 8e50b80, the following are not present here and should not gate merge — broken 🟡 Should-fix
🔵 Nits
🙌 Praise
|
…column-picker race condition Split filterSupportsDependencies into filterCanBeDependencyParent and filterCanHaveDependencies so a filter that opts out of being a cascade parent (e.g. filter_timegrain) can still be configured to depend on other filters, which the single predicate incorrectly prevented. Add a fallback label to the checkbox and isColumnSelect control loops in getControlItemsMap so controls with non-zero-arity label functions no longer render blank. Fix DatasetColumnSelect to read the latest value via a ref inside its async fetch handlers instead of a stale closure, and stop clearing the selected value when the dataset-column fetch fails outright, since a failed request says nothing about the value's validity.
Code Review Agent Run #3e30caActionable Suggestions - 0Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
…y-registry' into feat/extensible-filter-dependency-registry # Conflicts: # superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
Code Review Agent Run #658896Actionable Suggestions - 0Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Replace hardcoded ALLOW_DEPENDENCIES list with a registry-based check so any filter plugin registering with Behavior.NativeFilter automatically supports the cascade dependency feature — no core changes needed for new plugins.
Also adds isColumnSelect support in getControlItemsMap to allow plugins to declare dataset column picker controls.
SUMMARY
Currently, the mechanism that determines which native filters support cascading dependencies relies on a hardcoded list (ALLOW_DEPENDENCIES) within the core Superset codebase. This creates a tight coupling that blocks external, third-party, or custom filter plugins from leveraging cascading features without directly mutating core files.
This PR refactors the filter dependency system to be entirely registry-driven and enhances control mapping flexibility.
Related Discussion: #26084
Design Decisions & Changes:
Registry-Driven Dependencies: Replaced the hardcoded check with a dynamic lookup. Any filter plugin that registers with Behavior.NativeFilter now automatically inherits support for the cascade dependency feature out-of-the-box. This eliminates the need for future core repository changes when new filters are introduced.
Dynamic Column Selection Controls: Added explicit support for isColumnSelect inside getControlItemsMap. This allows external plugins to declaratively request dataset column picker controls directly from the native filter configuration modal.
TESTING INSTRUCTIONS
Since this is an architectural enablement patch, testing should focus on verifying that existing core filters suffer no regressions, and that the underlying hooks resolve correctly.
Navigate to a dashboard and open the Manage native filters modal.
Create a standard core filter (e.g., a Select or Numerical Range filter).
Ensure that the "Filter is dependent on..." (cascading) configuration option is visible, selectable, and functional.
Verify that dataset column configuration selectors still populate and save accurately for out-of-the-box filters.
Register a custom dummy plugin leveraging Behavior.NativeFilter to verify it successfully reveals dependency options without updating core mapping arrays.
ADDITIONAL INFORMATION