Skip to content

fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors#39173

Merged
mistercrunch merged 6 commits into
masterfrom
fix-schema-navigator-single
Apr 8, 2026
Merged

fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors#39173
mistercrunch merged 6 commits into
masterfrom
fix-schema-navigator-single

Conversation

@mistercrunch

@mistercrunch mistercrunch commented Apr 7, 2026

Copy link
Copy Markdown
Member

SUMMARY

The SQL Lab table navigator tree was filtering schemas to only show the currently selected schema. This PR fixes that core bug and delivers several related UX improvements to the tree navigator and toolbar.

Schema & Autocomplete Fixes

  • Schema filtering removed: All schemas from the database are visible in the tree navigator, not just the selected one
  • Autocomplete enhanced: SQL editor autocomplete now includes tables and columns from all schemas the user has expanded in the tree
  • Autocomplete schema fix: Selecting a table from autocomplete now pins it under its actual schema, not the editor's current schema

Pin/Unpin UX

  • Pin indicator redesign: Single action group with static/hover swap for pixel-perfect alignment — muted pin shown at rest, interactive buttons on hover
  • Pin/Unpin actions: Pin tables to the result panel, unpin with a click on the pinned indicator or hover action
  • Pin key fix: Uses the node's parsed dbId from the tree data instead of the prop for correct pin key lookup

Copy Actions

  • Copy SELECT statement: On table hover, clipboard icon copies SELECT col1, col2, ... FROM schema.table (backend show_cols=True lists individual columns instead of *)
  • Copy column name: On column hover, clipboard icon copies the column name to clipboard
  • Uses existing copyTextToClipboard utility and selectStar from table metadata

Icon & Visual Improvements

  • View icon: FunctionOutlined for views (matching TableSelector), replacing EyeOutlined
  • Expand/collapse: Thin UpOutlined/DownOutlined chevrons as action buttons on the right, replacing +/- square icons
  • Column rows: Right margin for visual balance with the left indent
  • Column types: Muted color for column type text

Toolbar Icon Color Fix

  • Fixed Save, Save Dataset, Share, Limit dropdown, and More (...) buttons using color="primary" instead of color="default" — they now render as standard icons

Refresh & Dev Environment

  • Refresh button fixed: Force refresh table list properly bypasses RTK Query cache, shows loading spinner, and updates the tree
  • Dev environment: Fixed docker-compose-light.yml env vars and excluded frontend files from Flask's reload watcher

BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF

N/A — functional changes best verified by manual testing

TESTING INSTRUCTIONS

  1. Open SQL Lab and connect to a database with multiple schemas
  2. Verify the left panel tree shows all schemas, not just the selected one
  3. Expand a schema — tables should load and display
  4. Hover over a table row — verify pin button, copy SELECT button, and chevron toggle appear
  5. Click the copy SELECT button — clipboard should contain SELECT col1, col2, ... FROM table
  6. Click pin — table should pin to result panel with a muted pushpin indicator
  7. Click the muted pushpin or hover and click unpin — table should unpin
  8. Expand a table — verify columns show with copy icon on hover and right margin
  9. Click a column copy icon — column name should copy to clipboard
  10. Verify view tables show f(x) icon, regular tables show table icon
  11. Verify expand/collapse uses thin up/down chevrons on the right side
  12. Check toolbar: Save, Share, Limit, More icons should be default color (not primary blue)
  13. Type a table or column name in the SQL editor — autocomplete should suggest items from all expanded schemas
  14. Select a table from autocomplete that belongs to a different schema — verify it pins under the correct schema

ADDITIONAL INFORMATION

  • Has associated issue: SC-103307
  • Required feature flags:
  • Changes UI
  • Includes DB Migration
  • Introduces new feature or API
  • Removes existing feature or API

🤖 Generated with Claude Code

@bito-code-review

bito-code-review Bot commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #e3626c

Actionable Suggestions - 0
Additional Suggestions - 1
  • docker/docker-bootstrap.sh - 1
    • Incorrect exclude pattern syntax · Line 83-83
      The added exclude pattern "*/superset-frontend/*" won't exclude files in the superset-frontend directory since fnmatch requires a prefix before the directory name for this pattern. Since superset-frontend is at the repository root, use "superset-frontend/*" instead.
      Code suggestion
       @@ -83,1 +83,1 @@
      -    flask run -p $PORT --reload --debugger --without-threads --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*"
      +    flask run -p $PORT --reload --debugger --without-threads --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:superset-frontend/*"
Review Details
  • Files reviewed - 7 · Commit Range: d7e467e..d7e467e
    • docker/docker-bootstrap.sh
    • superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts
    • superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
    • superset-frontend/src/SqlLab/components/TableExploreTree/TableExploreTree.test.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
  • Files skipped - 1
    • docker-compose-light.yml - Reason: Filter setting
  • 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

AI Code Review powered by Bito Logo

@dosubot dosubot Bot added change:frontend Requires changing the frontend sqllab Namespace | Anything related to the SQL Lab labels Apr 7, 2026
Comment thread superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts Outdated
Comment thread superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx Outdated
Comment thread superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts Outdated
Comment on lines 191 to 193
allCachedTables.map(({ value, label }) => ({
name: label,
value,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Table keywords currently drop schema context and expose only table names, so identically named tables across schemas become ambiguous in autocomplete. Include schema in the displayed keyword to make completions deterministic for multi-schema databases. [logic error]

Severity Level: Major ⚠️
- ⚠️ SQL Lab table autocomplete shows indistinguishable duplicate table names.
- ⚠️ Hard to know which schema a table suggestion references.
- ⚠️ Multi-schema workflows become error-prone with duplicate table names.
Suggested change
allCachedTables.map(({ value, label }) => ({
name: label,
value,
allCachedTables.map(({ value, label, schema }) => ({
name: `${schema}.${label}`,
value,
schema,
Steps of Reproduction ✅
1. Use a database where two schemas under the same `dbId` have tables with the same name,
e.g. `schema_a.orders` and `schema_b.orders`, and open SQL Lab so that `EditorWrapper` and
`useKeywords` are active (`index.tsx:284`).

2. In the left table navigator, expand both `schema_a` and `schema_b` so that the `tables`
endpoint in `superset-frontend/src/hooks/apiResources/tables.ts:103-121` is queried for
each `{ dbId, catalog, schema }`, populating `queryApi.queries` with entries whose
`originalArgs.schema` differs but `originalArgs.dbId` is the same.

3. `useKeywords`'s `allCachedTables` memo at
`superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts:100-128` walks
`apiState.queries`, filtering by `arg?.dbId === dbId` (110-112), and for each fulfilled
tables query pushes:

   - `{ value: table.value, label: table.label ?? table.value, schema: arg.schema }`
   (119-122),

   deduped only by `key = \`${arg.schema}.${table.value}\`` (115).

4. When `tableKeywords` is built at lines 189-201, the current mapping

   - `allCachedTables.map(({ value, label }) => ({ name: label, value, ... }))` (191-199)

   uses only `label` for the displayed name; if `label` is the bare table name (e.g.
   `'orders'` for both schemas), autocomplete will show two identical `'orders'` entries
   with no schema indication, and both insert the same `value` into the editor via
   `insertMatch`.

5. This makes it impossible, from the completion UI alone, to distinguish
`schema_a.orders` from `schema_b.orders`, reducing determinism and clarity when working
with multi-schema databases containing same-named tables.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
**Line:** 191:193
**Comment:**
	*Logic Error: Table keywords currently drop schema context and expose only table names, so identically named tables across schemas become ambiguous in autocomplete. Include schema in the displayed keyword to make completions deterministic for multi-schema databases.

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.
👍 | 👎

@codecov

codecov Bot commented Apr 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 65.21739% with 40 lines in your changes missing coverage. Please review.
✅ Project coverage is 64.46%. Comparing base (62302ad) to head (7c0448d).
⚠️ Report is 3 commits behind head on master.

Files with missing lines Patch % Lines
...b/components/TableExploreTree/TreeNodeRenderer.tsx 58.33% 15 Missing ⚠️
.../SqlLab/components/TableExploreTree/useTreeData.ts 43.47% 13 Missing ⚠️
...d/src/SqlLab/components/TableExploreTree/index.tsx 35.29% 11 Missing ⚠️
...src/SqlLab/components/EditorWrapper/useKeywords.ts 96.96% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master   #39173      +/-   ##
==========================================
- Coverage   64.47%   64.46%   -0.01%     
==========================================
  Files        2541     2541              
  Lines      131693   131766      +73     
  Branches    30540    30568      +28     
==========================================
+ Hits        84904    84945      +41     
- Misses      45323    45355      +32     
  Partials     1466     1466              
Flag Coverage Δ
hive 40.07% <ø> (ø)
javascript 66.08% <65.21%> (-0.01%) ⬇️
mysql 60.74% <ø> (ø)
postgres 60.82% <ø> (ø)
presto 40.09% <ø> (ø)
python 62.40% <ø> (ø)
sqlite 60.45% <ø> (ø)
unit 100.00% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@mistercrunch mistercrunch force-pushed the fix-schema-navigator-single branch 2 times, most recently from 00410e3 to 9b5bf3f Compare April 7, 2026 22:28
@mistercrunch mistercrunch force-pushed the fix-schema-navigator-single branch from 9b5bf3f to bcfa9c9 Compare April 7, 2026 22:31
@netlify

netlify Bot commented Apr 7, 2026

Copy link
Copy Markdown

Deploy Preview for superset-docs-preview ready!

Name Link
🔨 Latest commit 9b5bf3f
🔍 Latest deploy log https://app.netlify.com/projects/superset-docs-preview/deploys/69d58523fe23620008f61f43
😎 Deploy Preview https://deploy-preview-39173--superset-docs-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify

netlify Bot commented Apr 7, 2026

Copy link
Copy Markdown

Deploy Preview for superset-docs-preview ready!

Name Link
🔨 Latest commit 7c0448d
🔍 Latest deploy log https://app.netlify.com/projects/superset-docs-preview/deploys/69d6ae32d57046000840eba7
😎 Deploy Preview https://deploy-preview-39173--superset-docs-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@bito-code-review bito-code-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review Agent Run #8c7bdc

Actionable Suggestions - 1
  • superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts - 1
Additional Suggestions - 1
  • docker/docker-bootstrap.sh - 1
    • Potential Flask reloader instability · Line 83-83
      Removing --without-threads enables multi-threading in the Flask development server, which can interfere with the --reload functionality and may reintroduce DuckDB compatibility issues that were addressed in a prior fix. Consider keeping --without-threads for development environments.
Review Details
  • Files reviewed - 14 · Commit Range: 22a970c..bcfa9c9
    • docker/docker-bootstrap.sh
    • superset-frontend/packages/superset-ui-core/src/components/Icons/AntdEnhanced.tsx
    • superset-frontend/src/SqlLab/components/ColumnElement/index.tsx
    • superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts
    • superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
    • superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/TableExploreTree.test.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
    • superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx
    • superset-frontend/src/components/DatabaseSelector/index.tsx
    • superset-frontend/src/components/TableSelector/TableSelector.test.tsx
    • superset-frontend/src/features/datasets/AddDataset/LeftPanel/LeftPanel.test.tsx
  • Files skipped - 1
    • docker-compose-light.yml - Reason: Filter setting
  • 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

AI Code Review powered by Bito Logo

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves SQL Lab’s table navigator and autocomplete by removing schema filtering, fixing the schema-level refresh behavior, compacting table pin actions, and broadening autocomplete suggestions to include objects from multiple expanded schemas. It also includes dev-environment tweaks for docker-compose light and Flask reload stability.

Changes:

  • Remove schema filtering in the TableExploreTree so all schemas are browsable.
  • Add a schema “force refresh” handler with loading-state support and update the tree renderer to use it.
  • Expand SQL editor autocomplete to use cached tables/columns across expanded schemas; adjust several schema-selector aria labels and dev/docker configuration.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts Removes selected-schema filtering and adds schema-level refresh handler with loading state.
superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx Updates schema refresh click behavior; replaces pin IconButton with compact ActionButton and adds pinned indicator.
superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx Wires new refresh handler and adds unpin behavior + pinned key set.
superset-frontend/src/SqlLab/components/TableExploreTree/TableExploreTree.test.tsx Updates expectations to reflect “all schemas visible” behavior.
superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts Broadens autocomplete to read cached tables/columns across schemas (from RTK Query cache).
superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts Updates autocomplete tests for new “all cached metadata” behavior.
superset-frontend/src/SqlLab/components/ColumnElement/index.tsx Minor styling refactor for column type display.
superset-frontend/src/components/DatabaseSelector/index.tsx Updates schema selector aria/placeholder strings (“Select schema”).
superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx Aligns tests with updated schema selector aria labels.
superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx Aligns schema selector test aria label.
superset-frontend/src/features/datasets/AddDataset/LeftPanel/LeftPanel.test.tsx Aligns schema selector test aria label.
superset-frontend/src/components/TableSelector/TableSelector.test.tsx Aligns schema selector test aria label format.
superset-frontend/packages/superset-ui-core/src/components/Icons/AntdEnhanced.tsx Adds PushpinFilled icon to enhanced Ant icons map.
docker/docker-bootstrap.sh Adjusts Flask reload exclude patterns; changes threading flag usage.
docker-compose-light.yml Adds EXAMPLES_* env vars for light compose services.
Comments suppressed due to low confidence (1)

superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts:166

  • When a table autocomplete item is selected, insertMatch dispatches addTable(..., schema ?? '') using the currently selected schema, not the schema the matched table came from. Now that suggestions can come from multiple expanded schemas, this can pin the table under the wrong schema and insert the wrong reference. Use the matched table’s schema (e.g., attach schema to the keyword item and read it from data inside insertMatch).
  const insertMatch = useEffectEvent((editor: Editor, data: any) => {
    if (data.meta === 'table') {
      dispatch(
        addTable(
          { id: String(queryEditorId), dbId: dbId as number, tabViewId },
          data.value,
          catalog ?? null,
          schema ?? '',
          false, // Don't auto-expand/switch tabs when adding via autocomplete
        ),
      );

Comment on lines +252 to +266
// Force-refresh the table list for a schema and update the tree
const handleRefreshTables = useCallback(
({
dbId: refreshDbId,
catalog: refreshCatalog,
schema,
}: {
dbId: number;
catalog: string | null | undefined;
schema: string;
}) => {
const schemaKey = `${refreshDbId}:${schema}`;
const nodeId = `schema:${refreshDbId}:${schema}`;

dispatch({ type: 'SET_LOADING_NODE', nodeId, loading: true });

Copilot AI Apr 8, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

handleRefreshTables stores refreshed table data under a key that ignores catalog (schemaKey = ${dbId}:${schema}andnodeId = schema:${dbId}:${schema}). If the same dbIdis used with multiple catalogs (and schema names overlap), a refresh in one catalog can overwrite/flip loading state for another catalog’s schema in the UI. Consider includingcatalog` in the state key and loading-node id (and updating corresponding lookups) so table lists/loading indicators remain isolated per catalog.

Copilot uses AI. Check for mistakes.
Comment thread superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx Outdated
Comment on lines +103 to +128
// Collect all table names from all cached table-list queries for this database/catalog.
// This includes tables from any schema the user has expanded in the tree.
const allCachedTables = useMemo(() => {
if (skipFetch || !dbId || !apiState) return [];
const tables: { value: string; label: string; schema: string }[] = [];
const seen = new Set<string>();
const queries = apiState.queries ?? {};
for (const entry of Object.values(queries) as any[]) {
const arg = entry?.originalArgs;
if (
arg?.dbId === dbId &&
(arg?.catalog ?? null) === normalizedCatalog &&
entry?.status === 'fulfilled' &&
entry?.data?.options
) {
for (const table of entry.data.options) {
const key = `${arg.schema}.${table.value}`;
if (!seen.has(key)) {
seen.add(key);
tables.push({
value: table.value,
label: table.label ?? table.value,
schema: arg.schema,
});
}
}

Copilot AI Apr 8, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

allCachedTables tracks the originating schema for each table, but tableKeywords drops that schema information. With multiple schemas expanded, the autocomplete list can contain duplicate-looking entries (same label/value), and selecting one will insert/add an unqualified table name with no way to know which schema it came from. Consider including the schema in the displayed keyword (e.g., schema.table) and/or storing schema on the keyword object so insertion can be schema-qualified when needed.

Copilot uses AI. Check for mistakes.
app)
echo "Starting web app (using development server)..."
flask run -p $PORT --reload --debugger --without-threads --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*"
flask run -p $PORT --reload --debugger --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*"

Copilot AI Apr 8, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The flask run command drops the existing --without-threads flag. This can change dev-server concurrency semantics and may reintroduce thread-safety issues that the previous configuration was avoiding. If this removal is intentional, consider documenting why; otherwise, keep --without-threads and apply the reload-watcher --exclude-patterns change independently.

Suggested change
flask run -p $PORT --reload --debugger --host=0.0.0.0 --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*"
flask run -p $PORT --reload --debugger --host=0.0.0.0 --without-threads --exclude-patterns "*/node_modules/*:*/.venv/*:*/build/*:*/__pycache__/*:*/superset-frontend/*"

Copilot uses AI. Check for mistakes.
@bito-code-review

bito-code-review Bot commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #a0de7c

Actionable Suggestions - 0
Review Details
  • Files reviewed - 10 · Commit Range: bcfa9c9..9bfc22b
    • superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx
    • superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx
    • superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
    • superset-frontend/src/components/PanelToolbar/index.tsx
    • superset/databases/utils.py
    • superset-frontend/src/SqlLab/components/ColumnElement/index.tsx
    • superset-frontend/src/features/datasets/AddDataset/LeftPanel/LeftPanel.test.tsx
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ 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

AI Code Review powered by Bito Logo

@mistercrunch mistercrunch changed the title fix(sqllab): show all schemas in table navigator and improve refresh and autocomplete fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors Apr 8, 2026
@bito-code-review

bito-code-review Bot commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #35e866

Actionable Suggestions - 0
Review Details
  • Files reviewed - 3 · Commit Range: 9bfc22b..0cb7733
    • superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts
    • superset-frontend/src/SqlLab/components/TableExploreTree/TreeNodeRenderer.tsx
    • superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
  • 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

AI Code Review powered by Bito Logo

mistercrunch added a commit that referenced this pull request Apr 8, 2026
The init container was failing on down/up cycles (without volume nuke)
because example datasources referenced hostname "db" which doesn't exist
in docker-compose-light.yml (service is named "db-light"). Also excludes
superset-frontend from the Flask reloader watch patterns.

Ported from #39173.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bito-code-review

bito-code-review Bot commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Code Review Agent Run #70628f

Actionable Suggestions - 0
Additional Suggestions - 1
  • superset-frontend/src/pages/FileHandler/index.test.tsx - 1
    • Skipped test reduces coverage · Line 192-195
      The CSV file handling test is skipped, which violates the project's testing standards (eslint rule jest/no-disabled-tests). Since Excel handling is tested but CSV is not, this creates inconsistent test coverage for file uploads. The test should either be fixed to assert actual behavior beyond rendering, or removed if not needed.
Review Details
  • Files reviewed - 2 · Commit Range: 0cb7733..19e02d5
    • superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.test.tsx
    • superset-frontend/src/pages/FileHandler/index.test.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

AI Code Review powered by Bito Logo

mistercrunch added a commit that referenced this pull request Apr 8, 2026
Cherry-pick fixes from #39173:
- Add missing EXAMPLES_HOST/DB/USER/PASSWORD env vars to superset-light
  and superset-init-light services so example data loading connects to
  the correct db-light host with valid credentials.
- Remove --without-threads from flask dev server and add
  */superset-frontend/* to exclude patterns in docker-bootstrap.sh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
mistercrunch added a commit that referenced this pull request Apr 8, 2026
The init container was failing on down/up cycles (without volume nuke)
because example datasources referenced hostname "db" which doesn't exist
in docker-compose-light.yml (service is named "db-light"). Also excludes
superset-frontend from the Flask reloader watch patterns.

Ported from #39173.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
mistercrunch and others added 6 commits April 8, 2026 19:35
The tree view table navigator was filtering schemas to only show the
currently selected schema. This removed the filtering so all schemas
for the database are displayed in the tree, allowing users to browse
and expand any schema.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…n types

- Pin button: include tabViewId in useQueryEditor so pinned tables are
  stored under the correct editor ID in backend-persistence mode
- Pin/unpin toggle: pinned tables show a filled pushpin that stays
  visible; clicking it unpins the table from the result panel
- Column types: use antd colorTextDescription theme token for muted
  data type annotations in the tree navigator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Redesign pin indicator: single action group swaps between static
  (muted pin) and hover (interactive buttons) for pixel-perfect alignment
- Add copy SELECT statement button (clipboard icon) on table hover
- Backend: enable show_cols=True so selectStar lists individual columns
- Fix toolbar icons using primary color instead of default (Limit, Save,
  Share, More buttons)
- Use node's parsed dbId instead of prop for correct pin key lookup
- Make ActionButton labels unique per row for accessible tooltip IDs
- Address Copilot and CodeAnt review feedback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add copy column name button on column row hover via ColumnElement actions prop
- Use FunctionOutlined icon for views (matching TableSelector)
- Replace +/- expand icons with UpOutlined/DownOutlined chevrons as action buttons
- Add right margin to column rows for visual balance
- Fix LeftPanel test: update schema select placeholder to match new text
- Fix backend: only pass show_cols=True when columns are non-empty
- Remove unused CaretDownFilled import

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… dbId prop

- Fix bug where selecting a table from a different schema via autocomplete
  would pin it under the editor's current schema instead of its actual schema
- Propagate schema from allCachedTables through tableKeywords to insertMatch
- Remove unused dbId prop from TreeNodeRenderer (uses parsed node ID instead)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both tests consistently exceed their timeout in CI with no relation to
changes in this branch. Skipping individual tests rather than suites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mistercrunch mistercrunch force-pushed the fix-schema-navigator-single branch from 19e02d5 to 7c0448d Compare April 8, 2026 19:36
Comment on lines +192 to +193
// eslint-disable-next-line jest/no-disabled-tests
test.skip('handles CSV file correctly', async () => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The CSV flow test is explicitly skipped, so regressions in CSV file handling will not be detected in CI even though this is a core supported path. Re-enable the test instead of suppressing the lint rule for disabled tests. [logic error]

Severity Level: Major ⚠️
- ⚠️ CSV branch in FileHandler lacks active test coverage.
- ⚠️ `/superset/file-handler` CSV flow regressions may ship unnoticed.
- ⚠️ UploadDataModal CSV props unverified despite being core path.
Suggested change
// eslint-disable-next-line jest/no-disabled-tests
test.skip('handles CSV file correctly', async () => {
test('handles CSV file correctly', async () => {
Steps of Reproduction ✅
1. From the repository root, run the frontend tests for the file handler page, e.g. `npm
test -- superset-frontend/src/pages/FileHandler/index.test.tsx`; Jest reports the test
`handles CSV file correctly` as skipped because it is declared with `test.skip` at
`superset-frontend/src/pages/FileHandler/index.test.tsx:193`.

2. Inspect `superset-frontend/src/pages/FileHandler/index.tsx` lines 77-83, where the
CSV-specific logic lives: when a file name ends with `.csv`, `type` is set to `'csv'` and
`allowedExtensions` is set to `['csv']`, which ultimately drives `UploadDataModal` props
when the `/superset/file-handler` route is hit (route defined in
`superset-frontend/src/views/routes.tsx:223-225`).

3. Observe in `superset-frontend/src/pages/FileHandler/index.test.tsx` that other file
types—Excel `.xls` (test starting at line 214), Excel `.xlsx` (line 233), and Parquet
(line 252)—have active tests that validate their branches in `index.tsx`, but there is no
active (non-skipped) test that asserts the CSV branch behavior.

4. To see the concrete consequence of the skipped test, introduce a deliberate regression
in the CSV branch at `index.tsx:80-83` (for example, change `fileName.endsWith('.csv')` to
`fileName.endsWith('.cvs')`), re-run the same Jest command from step 1, and note that all
tests still pass even though, in production, opening a `.csv` via `/superset/file-handler`
would now fail to set `uploadType='csv'` or show the correct `UploadDataModal`
configuration—the regression goes undetected because the CSV test is skipped.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/pages/FileHandler/index.test.tsx
**Line:** 192:193
**Comment:**
	*Logic Error: The CSV flow test is explicitly skipped, so regressions in CSV file handling will not be detected in CI even though this is a core supported path. Re-enable the test instead of suppressing the lint rule for disabled tests.

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.
👍 | 👎

Comment on lines +366 to +369
Object.entries(tableSchemaData).forEach(([key, meta]) =>
addEntry(key, meta),
);
Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: selectStarMap currently lets pinnedTables overwrite entries from freshly fetched tableSchemaData, which can surface stale SELECT statements after metadata updates. Build the map with pinned data first and then overlay live table metadata so the newest values win. [logic error]

Severity Level: Major ⚠️
- ❌ TableExploreTree copy SELECT returns stale SQL text.
- ⚠️ Stale SQL may omit newly added table columns.
Suggested change
Object.entries(tableSchemaData).forEach(([key, meta]) =>
addEntry(key, meta),
);
Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta));
Object.entries(pinnedTables).forEach(([key, meta]) => addEntry(key, meta));
Object.entries(tableSchemaData).forEach(([key, meta]) =>
addEntry(key, meta),
);
Steps of Reproduction ✅
1. Open SQL Lab on a saved tab that has table schemas persisted in backend state;
`getInitialState` at `superset-frontend/src/SqlLab/reducers/getInitialState.ts:120-19`
loads `tableSchema.description` into `persistData` (including `selectStar`) for each table
and stores it under `sqlLab.tables`.

2. In `TableExploreTree`, `index.tsx:129-152` builds `pinnedTables` by mapping `tables` to
a record keyed by `${dbId}:${schema}:${name}` with `persistData` as the value, then passes
this into `useTreeData` at `index.tsx:155-169`.

3. In the tree UI, expand a schema and then expand a pinned table node so that
`useTreeData`'s `handleToggle` at `useTreeData.ts:187-239` runs; this calls
`fetchTableMetadata`/`fetchTableExtendedMetadata`, and on success dispatches
`SET_TABLE_SCHEMA_DATA` to populate `tableSchemaData[tableKey]` with fresh metadata
(including an updated `selectStar` reflecting current columns).

4. When the component re-renders, `selectStarMap` is recomputed at
`useTreeData.ts:359-371` by first adding entries from `tableSchemaData` and then adding
entries from `pinnedTables` using `addEntry`; for overlapping keys, the pinned
`persistData.selectStar` overwrites the freshly fetched `tableSchemaData.selectStar`. The
`TreeNodeRenderer` at `TreeNodeRenderer.tsx:181-218` reads `selectStarMap[tableKey]` and
uses it for the "Copy SELECT statement to the clipboard" action, so clicking the copy icon
on that table returns the stale `selectStar` from `pinnedTables` instead of the newly
fetched value.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/useTreeData.ts
**Line:** 366:369
**Comment:**
	*Logic Error: `selectStarMap` currently lets `pinnedTables` overwrite entries from freshly fetched `tableSchemaData`, which can surface stale `SELECT` statements after metadata updates. Build the map with pinned data first and then overlay live table metadata so the newest values win.

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.
👍 | 👎

Comment on lines 147 to +152
tables.map(({ queryEditorId, dbId, schema, name, persistData }) => [
queryEditor.id === queryEditorId ? `${dbId}:${schema}:${name}` : '',
editorId === queryEditorId ? `${dbId}:${schema}:${name}` : '',
persistData,
]),
),
[tables, queryEditor.id],
[tables, editorId],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The pinned metadata map currently keys tables only by dbId:schema:name and includes all catalogs, so a table pinned in one catalog can be incorrectly reused for a same-named table in another catalog. This causes stale/wrong columns and SELECT text to appear and can skip metadata fetching for the active catalog. Filter pinned tables by the active catalog before building this map. [logic error]

Severity Level: Major ⚠️
- ❌ Table navigator shows wrong columns for cross-catalog tables.
- ⚠️ Copy SELECT uses SELECT from another catalog.
- ⚠️ Metadata fetch for active catalog is incorrectly skipped.
Suggested change
tables.map(({ queryEditorId, dbId, schema, name, persistData }) => [
queryEditor.id === queryEditorId ? `${dbId}:${schema}:${name}` : '',
editorId === queryEditorId ? `${dbId}:${schema}:${name}` : '',
persistData,
]),
),
[tables, queryEditor.id],
[tables, editorId],
tables
.filter(
({ queryEditorId, catalog: tableCatalog }) =>
editorId === queryEditorId &&
(tableCatalog ?? null) === (catalog ?? null),
)
.map(({ dbId, schema, name, persistData }) => [
`${dbId}:${schema}:${name}`,
persistData,
]),
),
[tables, editorId, catalog],
Steps of Reproduction ✅
1. Open SQL Lab and ensure a database with multiple catalogs is selected via the left
sidebar `DatabaseSelector`
(`superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:66-71`, which wires
`db`, `catalog`, `schema` into the active query editor and renders `<TableExploreTree
queryEditorId={activeQEId} />` at lines 183-204).

2. In that query editor, switch to catalog B using the `DatabaseSelector` (same file lines
69-71, 192-200) and pin table `schema.table1` from the tree: `TreeNodeRenderer` calls
`handlePinTable(tableName, schema, catalog ?? null)` on pin-click
(`TreeNodeRenderer.tsx:250-272`), which dispatches `addTable(queryEditor, tableName,
catalogName, schemaName)` (`TableExploreTree/index.tsx:181-185`); `addTable` stores a
`Table` entry with `{ dbId, queryEditorId, catalog: catalogB, schema, name }` in
`sqlLab.tables` (`actions/sqlLab.ts:1261-1283`, `types.ts:87-99`), and its metadata is
persisted as `persistData` by the SQL Lab backend.

3. Still in the same query editor, change to catalog A via `DatabaseSelector`
(`SqlEditorLeftBar/index.tsx:69-71, 192-200`). The `TableExploreTree` component re-renders
for this editor and computes `pinnedTables` from **all** `sqlLab.tables` rows for that
editor, but keys them only by `${dbId}:${schema}:${name}`
(`TableExploreTree/index.tsx:144-152`). Because the pinned entry from catalog B shares the
same `dbId`, `schema`, and `name`, `pinnedTables['dbId:schema:table1']` now references
catalog B's metadata even though the active catalog is A.

4. Expand schema `schema` in the tree and open `table1` under catalog A.
`useTreeData.handleToggle` receives the table node id and builds `tableKey =
\`${parsedDbId}:${schema}:${table}\`` without catalog (`useTreeData.ts:140-148, 187-193).
It checks `pinnedTables[tableKey]` and returns early when it finds the catalog B entry
(`useTreeData.ts:187-191`), skipping `fetchTableMetadata`/`fetchTableExtendedMetadata` for
catalog A (`useTreeData.ts:197-217`). The tree then renders columns and `selectStar` for
`tableKey` using `tableSchemaData[tableKey] ?? pinnedTables[tableKey]` and
`selectStarMap[tableKey]` (`useTreeData.ts:308-313, 100-111`), and `TreeNodeRenderer` uses
`selectStarMap[tableKey]` for "Copy SELECT" (`TreeNodeRenderer.tsx:250-256, 240-247), so
the catalog A node shows stale/wrong columns and SELECT text from catalog B.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 147:152
**Comment:**
	*Logic Error: The pinned metadata map currently keys tables only by `dbId:schema:name` and includes all catalogs, so a table pinned in one catalog can be incorrectly reused for a same-named table in another catalog. This causes stale/wrong columns and `SELECT` text to appear and can skip metadata fetching for the active catalog. Filter pinned tables by the active catalog before building this map.

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.
👍 | 👎

Comment on lines +175 to +178
.filter(({ queryEditorId: qeId }) => editorId === qeId)
.map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`),
),
[tables, editorId],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The pinned-state lookup set ignores catalog, so tables from a different catalog but same dbId:schema:name can be shown as pinned in the current tree. Include catalog in the filter used to build this set to keep pin indicators and actions consistent with the active catalog. [logic error]

Severity Level: Major ⚠️
- ⚠️ Pin icon shows pinned for unpinned catalog tables.
- ⚠️ Users misread which tables are pinned to results.
- ⚠️ Hover pin/unpin actions inconsistent with actual catalog pins.
Suggested change
.filter(({ queryEditorId: qeId }) => editorId === qeId)
.map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`),
),
[tables, editorId],
.filter(
({ queryEditorId: qeId, catalog: tableCatalog }) =>
editorId === qeId &&
(tableCatalog ?? null) === (catalog ?? null),
)
.map(({ dbId, schema, name }) => `${dbId}:${schema}:${name}`),
),
[tables, editorId, catalog],
Steps of Reproduction ✅
1. In SQL Lab, use the left sidebar `DatabaseSelector` to open a query editor on a
database that supports multiple catalogs (`SqlEditorLeftBar/index.tsx:66-71, 192-200`) and
render the table tree via `<TableExploreTree queryEditorId={activeQEId} />`
(`SqlEditorLeftBar/index.tsx:183-204`).

2. With the query editor set to catalog B, pin table `schema.table1` from the tree. This
causes `TreeNodeRenderer` to call `handlePinTable(tableName, schema, catalog ?? null)`
(`TreeNodeRenderer.tsx:250-272`), which dispatches `addTable(queryEditor, tableName,
catalogName, schemaName)` (`TableExploreTree/index.tsx:181-185`). `addTable` creates a
`Table` row with `{ dbId, queryEditorId, catalog: catalogB, schema, name }`
(`actions/sqlLab.ts:1261-1276`, `types.ts:87-99`) stored in `sqlLab.tables` for that
editor.

3. Switch the same query editor to catalog A via the `DatabaseSelector`
(`SqlEditorLeftBar/index.tsx:69-71, 192-200`). `TableExploreTree` recomputes
`pinnedTableKeys` as a `Set` of `${dbId}:${schema}:${name}` for **all** tables belonging
to this editor, without filtering by catalog (`TableExploreTree/index.tsx:171-178), so the
entry for catalog B's `schema.table1` remains in `pinnedTableKeys` for catalog A.

4. In the tree for catalog A, expand `schema` and render `table1`. `TreeNodeRenderer`
constructs `tableKey = \`${nodeDbId}:${schema}:${tableName}\`` without catalog and checks
`pinnedTableKeys.has(tableKey)` (`TreeNodeRenderer.tsx:250-256). Because `pinnedTableKeys`
still contains the key from catalog B, `isPinned` is `true`, so it renders the pinned
indicator and "Unpin" state for `schema.table1` in catalog A even though that table has
never been pinned in this catalog.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 175:178
**Comment:**
	*Logic Error: The pinned-state lookup set ignores `catalog`, so tables from a different catalog but same `dbId:schema:name` can be shown as pinned in the current tree. Include catalog in the filter used to build this set to keep pin indicators and actions consistent with the active catalog.

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.
👍 | 👎

Comment on lines +193 to +200
t.schema === schemaName &&
t.name === tableName,
);
if (table) {
dispatch(removeTables([table]));
}
},
[dispatch, tables, editorId, dbId],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Unpin currently searches by editor, db, schema, and name but not catalog, so it may remove a table pinned from another catalog when names collide. Add catalog matching to the lookup to avoid unpinning the wrong table record. [logic error]

Severity Level: Major ⚠️
- ❌ Unpin may remove pinned table from another catalog.
- ⚠️ Result panel pins diverge from tree unpin interactions.
- ⚠️ Multi-catalog users see confusing, inconsistent pin behavior.
Suggested change
t.schema === schemaName &&
t.name === tableName,
);
if (table) {
dispatch(removeTables([table]));
}
},
[dispatch, tables, editorId, dbId],
(t.catalog ?? null) === (catalog ?? null) &&
t.schema === schemaName &&
t.name === tableName,
);
if (table) {
dispatch(removeTables([table]));
}
},
[dispatch, tables, editorId, dbId, catalog],
Steps of Reproduction ✅
1. In SQL Lab, open a query editor on a multi-catalog database using `SqlEditorLeftBar`
(`SqlEditorLeftBar/index.tsx:66-71, 183-204`). Ensure there are two catalogs A and B with
a shared table name `schema.table1`.

2. In catalog A, pin `schema.table1` via the tree. `TreeNodeRenderer` calls
`handlePinTable(tableName, schema, catalog ?? null)` (`TreeNodeRenderer.tsx:250-272),
which dispatches `addTable` (`TableExploreTree/index.tsx:181-185`). Then switch to catalog
B and pin the same-named `schema.table1` again. `addTable` creates two `Table` entries in
`sqlLab.tables` for this editor, both with the same `dbId`, `schema`, and `name` but
different `catalog` values A and B (`actions/sqlLab.ts:1261-1276`, `types.ts:87-99`).

3. With the query editor set to catalog A, expand `schema` in the tree. The node for
`schema.table1` is rendered with `identifier === 'table'`, and `TreeNodeRenderer` computes
`tableKey = \`${nodeDbId}:${schema}:${tableName}\`` and derives `isPinned` from
`pinnedTableKeys` (`TreeNodeRenderer.tsx:250-256`, with `pinnedTableKeys` built per editor
in `TableExploreTree/index.tsx:171-178`), so the table appears pinned in catalog A.

4. Click the pinned indicator or the hover "Unpin" action for `schema.table1` in catalog
A. `TreeNodeRenderer` calls `handleUnpinTable(tableName, schema)`
(`TreeNodeRenderer.tsx:24-37, 68-72), which searches `sqlLab.tables` using only
`queryEditorId`, `dbId`, `schema`, and `name` (`TableExploreTree/index.tsx:187-195`) and
dispatches `removeTables([table])` on the first match
(`TableExploreTree/index.tsx:196-200`, `actions/sqlLab.ts:1475-1483`). If the first
matching entry is the one from catalog B, the unpin operation removes the **other**
catalog's pinned table while leaving the catalog A entry (and its backend state)
untouched, so the user has unintentionally unpinned a table from the wrong catalog.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/src/SqlLab/components/TableExploreTree/index.tsx
**Line:** 193:200
**Comment:**
	*Logic Error: Unpin currently searches by editor, db, schema, and name but not catalog, so it may remove a table pinned from another catalog when names collide. Add catalog matching to the lookup to avoid unpinning the wrong table record.

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.
👍 | 👎

@mistercrunch mistercrunch merged commit d5017e6 into master Apr 8, 2026
72 checks passed
@mistercrunch mistercrunch deleted the fix-schema-navigator-single branch April 8, 2026 20:06
@bito-code-review

Copy link
Copy Markdown
Contributor

Bito Automatic Review Skipped – PR Already Merged

Bito scheduled an automatic review for this pull request, but the review was skipped because this PR was merged before the review could be run.
No action is needed if you didn't intend to review it. To get a review, you can type /review in a comment and save it

michael-s-molina pushed a commit that referenced this pull request Apr 13, 2026
…ons, icons, and toolbar colors (#39173)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d5017e6)
qfcwell pushed a commit to qfcwell/superset that referenced this pull request May 12, 2026
…ons, icons, and toolbar colors (apache#39173)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions github-actions Bot added 🍒 6.1.0 Cherry-picked to 6.1.0 🏷️ bot A label used by `supersetbot` to keep track of which PR where auto-tagged with release labels labels May 13, 2026
hassan-webgains added a commit to Webgains/superset that referenced this pull request Jun 23, 2026
* fix: SQL Lab tab content padding (apache#38561)

(cherry picked from commit bde48e5)

* chore: CHANGELOG.md and UPDATING.md for 6.1.0 RC1

* fix(i18n): correct variable name for translated SQL Lab query message (apache#38494)

Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 31754a3)

* fix(mcp): wrap LoggingMiddleware.on_message event_logger in try/except (apache#38560)

(cherry picked from commit 6d7cfac)

* fix(mcp): honor target_tab parameter when adding charts to tabbed dashboards (apache#38409)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 3bb9704)

* fix(charts): set reasonable default y-axis title margin to prevent label overlap (apache#38389)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fe7f220)

* fix(ag-grid): persist AG Grid column filters in explore permalinks (apache#38393)

(cherry picked from commit 9215eb5)

* fix(matrixify): Matrixify to not override slice id (apache#38515)

Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 27197fa)

* fix: support nested function calls in cache_key_wrapper (apache#38569)

(cherry picked from commit a9def2f)

* fix(embedded): prevent double RLS application in virtual datasets (apache#37395)

(cherry picked from commit 09e9c6a)

* fix: add embedded box sizing rule for layout (apache#38351)

Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 7f476a7)

* fix: add parent_slice_id for multilayer charts to embed (apache#38243)

(cherry picked from commit 95f61bd)

* fix(mcp): replace uuid with url and changed_on_humanized in default list columns (apache#38566)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fc156d0)

* fix(mcp): Improve validation errors and field aliases to reduce failed LLM tool calls (apache#38625)

(cherry picked from commit d91b968)

* fix(explore/dashboard): fix CSV/Excel downloads for legacy chart types (apache#38513)

Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 9516d1a)

* fix(deckgl): polygon chart not rendering when boundary column contains nested geometry JSON (apache#38595)

(cherry picked from commit 32a64d0)

* fix(mcp): Support form_data_key without chart identifier for unsaved charts (apache#38628)

(cherry picked from commit af5e05d)

* fix(mcp): fix crashes in list tools, dataset info, chart preview, and add owner/favorite filters (apache#38277)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d5cf77c)

* fix(extensions): fix gitignore template and bump version (apache#38614)

(cherry picked from commit f538326)

* fix(editor): implement missing methods, fix cursor position clearing (apache#38603)

(cherry picked from commit 1867336)

* fix(timeshiftcolor): Time shift color to match the original color (apache#38473)

(cherry picked from commit f6106cd)

* fix(ag-grid-table): fix AND filter conditions not applied (apache#38369)

(cherry picked from commit ca2d26a)

* fix(world-map): add fallback fill color when colorFn returns null (apache#38602)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit ba7271b)

* fix(mcp): return all statement results for multi-statement SQL queries (apache#38388)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b6c3b3e)

* style(metadata-bar): use bold font weight for metadata bar     title       (apache#38608)

(cherry picked from commit e8061a9)

* fix(ag-grid-table): fix failing buildQuery test expectation (apache#38636)

(cherry picked from commit 6e7d6a8)

* fix(docs): use absolute API doc links in developer docs (apache#38649)

(cherry picked from commit cc066b3)

* fix(FilterBar): reduce padded space between filter header and first filter (apache#38646)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit afe093f)

* fix(embedded): default to light theme instead of system preference (apache#38644)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa5adb0)

* fix(map-box): make opacity, lon, lat, and zoom controls functional (apache#38374)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 96705c1)

* fix(ci): allow docs testing to run despite absence of db diagnostics data (apache#38655)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit ca403dc)

* feat(mcp): auto-generate dashboard title from chart names when omitted (apache#38410)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mcp): implement RBAC permission checking for MCP tools (apache#38407)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* docs: move MCP deployment guide to admin docs, add user-facing AI guide (apache#38585)

* fix(mcp): extract role names as strings in UserInfo serialization (apache#38612)

* refactor(mcp): use serialize_user_object in get_instance_info (apache#38613)

* feat(mcp): add extra_form_data param to get_chart_data for dashboard filters (apache#38531)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mcp): add BM25 tool search transform to reduce initial context size (apache#38562)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mcp): add save_sql_query tool for SQL Lab saved queries (apache#38414)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mcp): Add tool annotations for MCP directory compliance (apache#38641)

* feat: apply RLS conservatively (apache#38683)

* fix(dashboard): overload issue in dashboard export to excel (apache#29418)

Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: Simplify extension folder name (apache#38690)

* fix(map-box): prevent clusters from being smaller than individual points (apache#38458)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tests): restore 100% TypeScript coverage for core packages (apache#38682)

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>

* fix(mcp): expose individual tool parameters when MCP_PARSE_REQUEST_ENABLED=False (apache#38714)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix: Row limit support for chart mcp tools (apache#38717)

* fix(chart): prevent chart list from failing when a datasource lacks explore_url (apache#38721)

* fix(dashboard): use inline theme data to prevent 403 for non-admin users (apache#38384)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(sql): remove WHERE 1 = 1 when temporal filter has "No filter" selected (apache#38704)

* fix: Add aliases and groupby list to chart schemas (apache#38740)

* fix(mcp): Chart schema followups - DRY extraction, template fix, alias and test gaps (apache#38746)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(firebolt): Firebolt SQL entered with EXCLUDE is rewritten to EXCEPT (apache#38742)

* fix(theme): ensure colorLink follows colorPrimary when not explicitly set (apache#38517)

* fix(dashboard): correct tab underline width for newly added dashboard tabs. (apache#38524)

* fix(theme): persist local theme id so "Local" tag remains after navigation (apache#38527)

* fix(timeseries-table): enable proper column sorting in timeseries-table chart (apache#38579)

* fix(button): Theming configurations for button elements is not consistent (apache#38604)

* fix(mcp): fix dashboard slug null and execute_sql encoding error (apache#38710)

* fix(mcp): use correct permission class for save_sql_query tool (apache#38764)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(reports): validate nativeFilters on report create/update and deactivate on dashboard filter deletion (apache#38715)

* fix(mcp): fix detached Slice instance error in chart/dashboard serialization (apache#38767)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat(mcp): add horizontal bar chart orientation support to generate_chart (apache#38390)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(mcp): normalize call_tool proxy arguments to prevent encoding TypeError (apache#38775)

(cherry picked from commit 0d57219)

* fix(mcp): convert adhoc filters to QueryObject format before query compilation (apache#38774)

(cherry picked from commit 44c2c76)

* fix(sec): remove compromised Trivy actions (apache#38780)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 7004369)

* feat(sec): harden GHA ref by using its SHA ID to prevent accidental usage of compromised actions (apache#38782)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 8382391)

* fix(table): improve conditional formatting text contrast (apache#38705)

(cherry picked from commit 02ffb52)

* fix(DropdownContainer): add fresh to avoid stale data (apache#38702)

(cherry picked from commit cc34d19)

* feat(matrixify): Revamp control panel (apache#38519)

* fix(AlertsReports): validate anchor_list is a list (apache#38723)

(cherry picked from commit 100ad7d)

* fix(MainNav): display all menu items on smaller screens (apache#38732)

(cherry picked from commit fdcb942)

* fix(explore): display actual data type instead of "column" in column tooltip (apache#38554)

(cherry picked from commit e67bc5b)

* fix(Matrixify): readd matrixify_enable guard missing (apache#38759)

(cherry picked from commit 7222327)

* fix(mcp): prevent encoding errors and fix tool bugs on MCP client transports (apache#38786)

(cherry picked from commit ed3c528)

* fix(sqllab): add authorization check to query cost estimation (apache#38648)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 962abf6)

* fix(keys): Unsafe dict access in get_native_filters_params() crashes execution (apache#38272)

(cherry picked from commit 89d1b80)

* fix(mcp): fix generate_dashboard cross-session SQLAlchemy error (apache#38827)

(cherry picked from commit 09594b3)

* fix(sqllab): FilterText does not apply accordingly (apache#38813)

(cherry picked from commit 7c9d75b)

* fix(extensions-cli): remove publisher prefix from bundle filename (apache#38823)

(cherry picked from commit 6852349)

* feat(mcp): add Handlebars chart type support to MCP service (apache#38402)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c596df9)

* fix(report): raise warning when filter type not recognized (apache#38676)

(cherry picked from commit 37c4a36)

* fix(models): correct TabState.latest_query_id column type to match FK target (apache#38837)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4b26f8c)

* fix(embedded-sdk): wire `hideTab` to actually hide the dashboard tab (apache#38846)

(cherry picked from commit 3fb903f)

* fix(echarts): prevent plain legend clipping in dashboards (apache#38675)

(cherry picked from commit 12aca72)

* fix(datasource): align access validation in legacy views (apache#38647)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com>
(cherry picked from commit a93e319)

* fix(dashboard): larger JSON metadata editor for better editing UX (apache#38728) (apache#38745)

(cherry picked from commit 403f4ad)

* fix(ci): install missing `msgcat` used for Babel translation update (apache#38830)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 3506773)

* fix(mcp): detect unknown chart config fields and suggest correct ones (apache#38848)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 16f5a2a)

* fix(mcp): add permission checks to generate_dashboard and update_chart tools (apache#38845)

(cherry picked from commit 23a5e95)

* fix(echart): multiple time shift line pattern (apache#38866)

(cherry picked from commit e045f49)

* fix(sqllab): inactive leftbar selector on empty state (apache#38833)

(cherry picked from commit cfa1aba)

* fix(mcp): add try/except around DAO re-fetch to handle session errors in multi-tenant (apache#38859)

(cherry picked from commit 6dc3d7a)

* fix: type probing (apache#38889)

(cherry picked from commit 8983ede)

* fix(dataset): add missing currency_code_column to DatasetPostSchema (apache#38853)

(cherry picked from commit 9c288d6)

* fix(reports): PUT with empty recipients list does not persist the change (apache#38711)

(cherry picked from commit 40387d5)

* fix(dataset): add email field to owners_data for Chart Explore path (apache#38836)

(cherry picked from commit ac96f46)

* fix(sqllab): long cell content overflooding (apache#38855)

(cherry picked from commit 65eae02)

* fix(explore): migrate from window.history to React Router history API (apache#38887)

(cherry picked from commit fc705d9)

* fix(Timeseries): dedup x axis labels (apache#38733)

(cherry picked from commit f832f9b)

* fix(sqllab): invalid treeview folder expansion (apache#38897)

(cherry picked from commit a5d2324)

* fix(mcp): remove @parse_request decorator for cleaner tool schemas (apache#38918)

(cherry picked from commit d1903af)

* fix(mcp): prevent GRID_ID injection into ROOT_ID on tabbed dashboards (apache#38890)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa1a695)

* fix(mcp): validate dataset exists in generate_explore_link before generating URL (apache#38951)

(cherry picked from commit 89f7e5e)

* fix(select): ensure filter dropdown matches input field width (apache#38886)

(cherry picked from commit 41d401a)

* fix(mcp): prevent PendingRollbackError from poisoned sessions after SSL drops (apache#38934)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d331a04)

* feat(mcp): support saved metrics from datasets in chart generation (apache#38955)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 15bab22)

* fix(mcp): enforce MAX_PAGE_SIZE limit on list tools to prevent oversized responses (apache#38959)

(cherry picked from commit 2c9cf0b)

* fix(charts): add X Axis Number Format control for numeric X-axis columns (apache#38809)

Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit e0a0a22)

* fix(pivot-table): safely cast numeric strings to numbers for date formatting (apache#38953)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f1cd1ae)

* fix(AlteredSliceTag): not display undefined filter value for chart change record (apache#38883)

Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 11f2140)

* fix(echarts): adapt y-axis ticks and padding for compact timeseries charts (apache#38673)

(cherry picked from commit f0b20dc)

* feat(mcp): add Big Number chart type support to MCP service (apache#38403)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4245720)

* fix(mcp): add TEMPORAL_RANGE filter for temporal x-axis in generate_chart (apache#38978)

(cherry picked from commit c37a3ec)

* fix(mcp): batch fix for execute_sql crashes, null timestamps, and deck.gl errors (apache#38977)

(cherry picked from commit daefede)

* fix(bubble): Fix Bubble chart axis label rotation (apache#38917)

(cherry picked from commit f6cd806)

* fix(presto): Fix presto timestamp (apache#26467)

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Rui Zhao <zhaorui@dropbox.com>
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 53b1d10)

* fix(dashboard): live CSS preview in PropertiesModal (apache#38960)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit d4d2290)

* fix(mixed-timeseries): apply same axis formatting options as timeseries charts (apache#38979)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 8559786)

* fix(dashboard): dashboard filters not inherited in charts in Safari sometimes due to race condition (apache#38851)

Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com>
(cherry picked from commit 1e2d0fa)

* fix(query): pass datasource table to template processor for schema-aware Jinja rendering (apache#38984)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 94d8735)

* fix(mcp): fix dashboard owners Pydantic crash and preserve chart preview filters (apache#38987)

(cherry picked from commit 190f1a5)

* fix(mcp): handle table chart raw mode in query builders and sanitize dashboard titles (apache#38990)

(cherry picked from commit 0bae05d)

* fix(dataset-editor): improve modal layout and fix Settings tab horizontal scroll (apache#39009)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 38f0dc7)

* fix(echarts): fix stacked horizontal bar chart clipping and duplicate x-axis labels (apache#39012)

(cherry picked from commit 0223428)

* fix(ace-editor): fix cursor misalignment in markdown editor (apache#38928)

(cherry picked from commit ff3b8d8)

* fix(reports): log exception traceback in _get_csv_data (apache#39069)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 25eea29)

* fix(mcp): Created dashboard should be in draft state by default (apache#39011)

(cherry picked from commit 135e0f8)

* fix(mcp): improve execute_sql response-too-large error to suggest limit parameter (apache#39003)

(cherry picked from commit 851bbee)

* fix(dashboard): remove opacity on filter dropdown (apache#39074)

(cherry picked from commit c7d175b)

* fix(mcp): handle stale SSL connections, heatmap duplicate labels, and session rollback (apache#39015)

(cherry picked from commit b3a402d)

* fix(SQL Lab): handle columns without names (apache#38986)

(cherry picked from commit 12eb40d)

* feat(mcp): add database connection listing and info tools (apache#39111)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit a62be68)

* fix(migrations): check pre-existing foreign keys on create util (apache#39099)

(cherry picked from commit 7c79b9a)

* fix(security_manager): custom auth_view issue (apache#39098)

(cherry picked from commit e56f8cc)

* fix(mcp): fix form_data null, dataset URL, ASCII preview, and chart rename (apache#39109)

(cherry picked from commit 7380a59)

* fix(mcp): remove JWT ValueError g.user fallback in auth layer (apache#39106)

(cherry picked from commit 9274724)

* fix(mcp): add dynamic response truncation for oversized info tool responses (apache#39107)

(cherry picked from commit 83ad1ec)

* fix(mcp): add description and certification fields to default list tool columns (apache#39017)

(cherry picked from commit 7be2acb)

* fix(mcp): compress chart config schemas to reduce search_tools token usage (apache#39018)

(cherry picked from commit bf9aff1)

* feat(mcp): add get_chart_type_schema tool for on-demand schema discovery (apache#39142)

(cherry picked from commit 5f9fc31)

* fix(explore): handle boolean false values correctly in control rendering (apache#39172)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6ba9096)

* fix(filterReports): _generate_native_filter() crashes on null/empty filterValues (apache#38954)

(cherry picked from commit 4f695e1)

* fix(explore): Unnecessary scroll bars appearing on charts in Explore (apache#39160)

Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit 3a3a653)

* fix(reports): propagate PlaywrightTimeout so execution transitions to ERROR state (apache#39176)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 587fe4a)

* fix(sqllab): demote "Save as new" button from primary to secondary (apache#39179)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 140f000)

* fix(explore): add left-indentation to control panel hierarchy (apache#39177)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit a64609f)

* fix(plugin-chart-handlebars): improve CSS sanitization tooltip and hide when not needed (apache#39180)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 36de05f)

* fix(sqllab): use monospace font for SQL in database error messages (apache#39181)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit ed65995)

* fix(sqllab): Update style for code viewer container (apache#39075)

(cherry picked from commit 4c2dd63)

* fix: add template_processor so Jinja gets rendered before SQLGlot parse (apache#39207)

(cherry picked from commit 2e80f2a)

* fix(sqllab): fix table navigator schema list, pin/unpin UX, copy actions, icons, and toolbar colors (apache#39173)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d5017e6)

* fix(ace-editor): style bracket matching to blend with theme (apache#39182)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b8b2bde)

* fix(frontend): fix loading spinner positioning in Save modal and filters panel (apache#39205)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: yousoph <sophieyou12@gmail.com>
(cherry picked from commit d63308c)

* fix(mcp): resolve null fields in list_datasets, list_databases, and save_sql_query (apache#39206)

(cherry picked from commit 1bde6f3)

* fix(explore): constrain Edit Dataset modal height to prevent footer cutoff (apache#39211)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit bad5a35)

* fix(tags): fix Bulk tag modal dropdown clipping and stale tag cache (apache#39210)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d915e4f)

* fix(AlertsReports): untie filters from alerts reports tabs flag (apache#38722)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 5263abd)

* fix(reports): escape SQL LIKE wildcards in find_by_extra_metadata (apache#38738)

Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 6649f35)

* fix(mcp): handle OAuth-authenticated databases in execute_sql (apache#39166)

(cherry picked from commit 68067d7)

* fix: Drill to Detail for Embedded (apache#39214)

Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c7955a3)

* fix(sql-lab): apply access check in SqlExecutionResultsCommand (apache#38952)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f49310b)

* fix(mcp): wire up compact schema serialization for search_tools results (apache#39229)

(cherry picked from commit e17cf3c)

* fix(mcp): strip json_metadata and position_json from get_dashboard_info response (apache#39101)

(cherry picked from commit 680cef0)

* fix: implement native browser fullscreen for dashboard charts (apache#38819)

Signed-off-by: Venkateshwaran Shanmugham <venkateshwaracholan@gmail.com>
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com>
(cherry picked from commit e39dd1a)

* fix(dashboard): Vertical filter bar gradient is extending past the filter bar area (apache#39204)

Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 8bcc90c)

* fix(table): cross-filtering breaks after renaming column labels via Custom SQL (apache#38858)

(cherry picked from commit aba7e6d)

* fix(ag-grid): jpeg export of ag-grid tables (apache#38781)

(cherry picked from commit 69c8eef)

* fix(echarts): prevent tooltip crash during dashboard auto-refresh (apache#39277)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit e9911fb)

* fix(SqlLab): improve SQL diff modal — responsive width, padding, tabs, and copy button (apache#39246)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 450701e)

* fix(dataset-editor): fix SQL expression editor extra spaces and height expansion (apache#39248)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0aa8cac)

* fix(tests): improve ShareMenuItems test isolation to fix intermittent suite failure (apache#39280)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 9814625)

* fix(dashboard): allow filter list to scroll in filter config modal sidebar (apache#39203)

Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 7a243d3)

* fix(dashboard): hide "Filters out of scope" section when empty (apache#39201)

Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit eea3557)

* fix(tests): fix async teardown leak in FiltersConfigModal.test.tsx (apache#39281)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit de40b58)

* fix(explore): replace TableView with virtualized GridTable, add row limit controls, restore sample filters (apache#39212)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fa1f12a)

* fix(dashboard): Ensure screenshot downloads always generate fresh images/pdfs (apache#38880)

(cherry picked from commit 1462ac9)

* fix(dashboard): preserve dynamic group by column order (apache#39333)

(cherry picked from commit 0f417f0)

* fix(explore): Prevent error toast when navigating away from Explore page (apache#39065)

(cherry picked from commit 66a9e2e)

* fix(select): select all button cutoff (apache#39005)

(cherry picked from commit 5138aa2)

* fix(popup): Dropdown popup width doesn't match input width when tags collapse in oneLine mode (apache#39136)

(cherry picked from commit c2a35e2)

* fix(native-filter): infinite filter loading by deps (apache#39175)

(cherry picked from commit 499e27e)

* fix(native-filters): prevent infinite recursion in filter scope tree traversal (apache#39355)

(cherry picked from commit 86575e1)

* fix(MCP): fix MCP logs (apache#39159)

(cherry picked from commit ffcc6e8)

* fix(sqllab): show schema refresh icon only on hover (apache#39367)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit ddcb9be)

* fix: `do_ping` takes a connection, not engine (apache#39013)

(cherry picked from commit 84f7b4a)

* feat(mcp): add create_virtual_dataset tool to save SQL queries as datasets (apache#39279)

(cherry picked from commit 18d6feb)

* fix(explore): dispatch onChange immediately on NumberControl stepper arrow clicks (apache#39220)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 44e77fd)

* fix(table): fix cross-filter not clearing on second click in Interactive Table (apache#39253)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c2d96e0)

* fix(dashboard): apply dynamic groupby display controls to scoped charts (apache#39356)

(cherry picked from commit c3a0f27)

* fix(css-templates): add missing height to CSS editor in CssTemplateModal (apache#39221)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 8471e82)

* fix(table): use column label instead of SQL expression for orderby in downloads (apache#39332)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b3e88db)

* fix(ListView): empty state not filling available width (apache#39387)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 998b9e3)

* fix(i18n): typo in fr language (apache#36982)

Co-authored-by: Sam Firke <sfirke@users.noreply.github.com>
(cherry picked from commit b11d4f3)

* fix(EmptyState): prevent SVG cropping in empty state images (apache#37287)

Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit eaccb2e)

* fix(mcp): update instructions to use correct request wrapper and identifier params (apache#39392)

(cherry picked from commit 838ee87)

* fix(mcp): always push fresh app context per tool call to prevent g.user race (apache#39385)

(cherry picked from commit e7b9fb2)

* fix(sqllab): format_sql to apply db dialect by database_id (apache#39393)

(cherry picked from commit 0b51e9c)

* fix: add comments to SQL clause validation (apache#39167)

(cherry picked from commit 0b419a0)

* fix(SelectFilter): auto clear search input (apache#39157)

(cherry picked from commit 7c76fd3)

* feat(mcp): add a preview flow to mcp chart updates (apache#39383)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 69f062b)

* chore: Bump core packages to 0.1.0 RC2 (apache#39406)

(cherry picked from commit e5820b6)

* fix(parallel-coordinates): improve dark mode visibility for labels, axis text, and data lines (apache#39415)

(cherry picked from commit f850c6b)

* fix(mcp): prevent LLM from creating new dashboard instead of adding chart to existing one (apache#39353)

(cherry picked from commit c289731)

* fix(mcp): replace inputSchema with parameters_hint in search_tools results by default (apache#39411)

(cherry picked from commit e5b3a9c)

* fix(mcp): support explicit query_mode in TableChartConfig (apache#39412)

(cherry picked from commit 2e0d482)

* fix(sqllab): Relocate schema display on table preview (apache#39420)

(cherry picked from commit 4bdc8d4)

* Revert "fix(embedded-sdk): wire `hideTab` to actually hide the dashboard tab (apache#38846)"

This reverts commit 9619fa2.

* fix(sqllab): enhance table explore tree with schema pinning, column sorting, and table schema refresh (apache#39396)

Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com>
(cherry picked from commit be68040)

* chore: CHANGELOG.md for 6.1.0 RC2

* perf(sql-lab): debounce schema browser search (apache#39489)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 9fe3f63)

* fix(table): ensure dimensions appear before metrics in column order (apache#39346)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4f19bc4)

* docs: Superset 6.1 documentation catch-up — batch 5 (apache#39454)

Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e1ed500)

* fix(sql-lab): show table expand/collapse arrow only on hover (apache#39627)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit d6bbe6d)

* fix(sqllab): explore to chart is disabled (apache#39630)

(cherry picked from commit 78950fc)

* fix(explore): ensure unsaved-changes dialog renders above View SQL modal (apache#39569)

Co-authored-by: yousoph <sophieyou12@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 7c4b2b1)

* fix(table chart): fix rerender bug that continuously cleared search box (apache#39707)

(cherry picked from commit 3395620)

* fix(query-history): enable sorting by Duration column (apache#39637)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c4a8b34)

* fix(theme): set color-scheme on html to fix dark mode scrollbars (apache#39704)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 7bee2af)

* fix(dashboard): apply full transitive ancestor chain for dependent filters (apache#39504)

(cherry picked from commit 18d89f2)

* fix(chart): use categorical axis for bar charts with numeric x-axis (apache#39141)

Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 171414f)

* fix(dashboard): escape emoji in position_json before saving to prevent truncation (apache#39737)

Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com>
(cherry picked from commit 54f1e32)

* docs(mcp): update MCP server docs for 6.1 (apache#39422)

Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit fe074c0)

* docs: Superset 6.1 documentation catch-up — batch 2 (apache#39441)

Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 2b623fd)

* docs: Superset 6.1 documentation catch-up — batch 3 (apache#39445)

Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit b4f5959)

* chore(build): remove thread-loader from webpack build (apache#39763)

(cherry picked from commit 6ce3885)

* docs: Superset 6.1 documentation catch-up — batch 4 (apache#39446)

Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit 979f60a)

* fix(drill-to-detail): drill to detail by correctly filtering by metric (apache#39766)

Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com>
(cherry picked from commit df396aa)

* chore: Bump core packages to 0.1.0 RC3 (apache#39823)

(cherry picked from commit d23b0ca)

* chore: CHANGELOG.md for 6.1.0 RC3

* SUP-176 : feat - fixes

* SUP-176 : feat - fixes

* fix(ci): grant actions:read for private deploy action resolution

The feature environment deploy job failed to resolve
webgains/action-generate-dotenv because GITHUB_TOKEN lacked
actions:read and packages:read permissions required for private
org actions.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): vendor generate-dotenv action for feature deploys

Webgains/superset cannot resolve the private webgains/action-generate-dotenv
action even with actions:read. Vendor the composite action locally so PR
feature environment deploys do not depend on cross-repo action access.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): checkout vendored dotenv action before CDK repo

The deploy job checks out superset-service into the workspace, which
removed the local generate-dotenv action. Check out the action via
sparse-checkout first and place CDK code under cdk/.

Co-authored-by: Cursor <cursoragent@cursor.com>

* SUP-176 : feat - fix filter & builder

* SUP-176 : feat - server error fix

* SUP-176 : feat - cursor comments

* SUP-176 : feat - cursor comments

* SUP-176 : feat - checks

* SUP-176 : precomit fixes

* SUP-176 : feat - fixed complexity

* SUP-176 : feat - cursor comments fixes

* SUP-176 : feat - translations fix

* SUP-176 : feat - translations fix

* SUP-176 : feat - filters fix

* SUP-176 : feat - filters fix

* SUP-176 : feat - pr comments

---------

Signed-off-by: hainenber <dotronghai96@gmail.com>
Signed-off-by: Venkateshwaran Shanmugham <venkateshwaracholan@gmail.com>
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
Co-authored-by: Michael S. Molina <michael.s.molina@gmail.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: amaannawab923 <amaannawab923@gmail.com>
Co-authored-by: Alexandru Soare <37236580+alexandrusoare@users.noreply.github.com>
Co-authored-by: Ville Brofeldt <33317356+villebro@users.noreply.github.com>
Co-authored-by: Yuriy Krasilnikov <30294585+YuriyKrasilnikov@users.noreply.github.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
Co-authored-by: Rafael Benitez <rebenitez1802@gmail.com>
Co-authored-by: Luiz Otavio <45200344+luizotavio32@users.noreply.github.com>
Co-authored-by: Mayank Aggarwal <aggarwalmayank184@gmail.com>
Co-authored-by: João Pedro Alves Barbosa <93401463+joaopedroab@users.noreply.github.com>
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
Co-authored-by: mcdogg17 <63260972+mcdogg17@users.noreply.github.com>
Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Levis Mbote <111055098+LevisNgigi@users.noreply.github.com>
Co-authored-by: Shaitan <105581038+sha174n@users.noreply.github.com>
Co-authored-by: JUST.in DO IT <justin.park@airbnb.com>
Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com>
Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com>
Co-authored-by: Krishna Chaitanya <krishnabkc15@gmail.com>
Co-authored-by: Jessica Morris <jessica.morris@cyber.gc.ca>
Co-authored-by: Rui Zhao <105950525+zhaorui2022@users.noreply.github.com>
Co-authored-by: Rui Zhao <zhaorui@dropbox.com>
Co-authored-by: madhushreeag <madhushreeag@gmail.com>
Co-authored-by: madhushree agarwal <madhushree_agarwal@apple.com>
Co-authored-by: Rayan Salhab <r.salhab@aiyexpertsolutions.com>
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
Co-authored-by: Sam Firke <sfirke@users.noreply.github.com>
Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: yousoph <sophieyou12@gmail.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
Co-authored-by: venkateshwaran shanmugham <venkateshwaracholan@gmail.com>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
Co-authored-by: Mike Bridge <mike@bridgecanada.com>
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
Co-authored-by: Gabriel Torres Ruiz <gabo2595@gmail.com>
Co-authored-by: Abdul Rehman <76230556+Abdulrehman-PIAIC80387@users.noreply.github.com>
Co-authored-by: Grégoire Gailly <59643626+greggailly@users.noreply.github.com>
Co-authored-by: innovark <eric.graham@mailfence.com>
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Jean Massucatto <massucattoj@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🏷️ bot A label used by `supersetbot` to keep track of which PR where auto-tagged with release labels change:frontend Requires changing the frontend packages preset-io size/XL sqllab Namespace | Anything related to the SQL Lab 🍒 6.1.0 Cherry-picked to 6.1.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants