Compare commits

...
Author SHA1 Message Date
Elizabeth ThompsonandClaude 976e0d9d3e fix(reports): fail-loud WARNING diagnostics and log-context tracing for tile readiness
Companion to the previous commit's positive per-tile readiness check,
carrying the rest of PR #42119's changes onto this base:

- Per-tile readiness timeout logs at WARNING (customer chart-loading
  issue, not a system fault -- matching #38130/#38441) with elapsed wait
  time, tile index/total, load_wait, and the identity + stuck-state of
  each unready chart holder (waiting_on_database / spinner_mounted /
  nothing_mounted), then re-raises so the report fails rather than
  shipping a blank or spinner tile. A per-tile DEBUG line logs readiness
  wait time for profiling.
- The deliberate readiness-timeout re-raise is tracked with an explicit
  flag rather than `except PlaywrightTimeout` at the outer level, since
  PlaywrightTimeout is aliased to bare Exception when playwright isn't
  installed and would otherwise swallow-or-propagate the wrong cases.
- Threads an optional log_context (e.g. "execution_id=<uuid>") from
  BaseReportState._get_screenshots through BaseScreenshot.get_screenshot
  and both WebDriverProxy implementations into take_tiled_screenshot,
  so timeout logs correlate back to the report run. Defaults to None
  for callers outside the report pipeline (thumbnails).

Backported from apache/superset#42119 (commits 37da786b52, f6feb70eca,
97d15485ad squashed) onto this branch's base; only the log lines this
change itself adds or touches carry the context suffix -- pre-existing
log lines on this base (f-string style) are left as-is.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-21 18:37:47 +00:00
Elizabeth ThompsonandClaude a9ff21b573 fix(reports): positive per-tile chart readiness check for tiled screenshots
`take_tiled_screenshot()` waited for the *absence* of `.loading` elements
visible in the viewport before capturing each tile. With
DashboardVirtualization on (default), a chart holder that has just scrolled
into view but hasn't fired its IntersectionObserver callback yet mounts
neither a spinner nor a chart, so the predicate passed vacuously and the
tile was captured blank. On top of that, a per-tile timeout was caught,
logged as a warning, and the tile was captured anyway -- delivering a
spinner screenshot to report recipients instead of failing the report.

Replace the absence-of-`.loading` predicate with a positive readiness
check: every chart holder (`data-test="dashboard-component-chart-holder"`)
intersecting the viewport must show a terminal state (a rendered chart via
`.slice_container`, or an error/empty state via `[role="alert"]` /
`.ant-empty` / `.missing-chart-container`) before a tile is captured. A
holder with nothing mounted no longer satisfies the wait.

A per-tile timeout is now logged at ERROR with the tile index, the
load_wait, and the identities of the still-unready chart holders, and
re-raises instead of being swallowed -- the report now fails
(ReportScheduleScreenshotFailedError) instead of silently shipping a
degraded screenshot.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-21 18:28:02 +00:00
Peng Ren aaaa071673 feat(database): SIP-195 Add MongoDB database engine support (#37368)
Co-authored-by: Peng Ren <ia250@cummins.com>
(cherry picked from commit 73d4332b51)
2026-07-20 13:30:17 -07:00
Mehmet Salih Yavuz 5538984135 fix(databases): reset import file entry after invalid file error (#42240)
(cherry picked from commit c1e660fac8)
2026-07-20 11:00:59 -07:00
Jean Massucatto 376d11e1f0 fix(sqllab): reflect query history deletion without page refresh (#41019)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit fe7d9b4724)
2026-07-18 13:17:37 -07:00
Amin Ghadersohi 4ffffb54e9 docs(mcp): fix instruction/docstring drift and annotation metadata in mcp_service (#41922)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 73aa8ef280)
2026-07-17 19:20:49 -07:00
Joe Li 151fb74075 fix(charts): render time comparison without a time grain (#42054)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 157ef61fd8)
2026-07-17 11:29:42 -07:00
Joe Li 25a7461660 fix(dashboard): seed default active tab path at hydration (#42075)
(cherry picked from commit 20e6dfd37d)
2026-07-17 11:29:42 -07:00
Joe Li 2024f30f47 fix(alerts): remove double border on InputNumber fields in report modal (#42090)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 3b7647eb6e)
2026-07-17 11:29:42 -07:00
Evan Rusackas 5a77e7d871 fix(dashboard): prevent filter dropdown button from disappearing during layout recalculations (#38193)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 55bb75efe6)
2026-07-17 11:29:42 -07:00
Joe LiandClaude Fable 5 fe68d20aee fix(components): keep table pagination working after sorting by a column (#969)
The antd Table onChange callback in TableCollection fires for pagination,
filter, and sort changes alike. With an active sorter, every page click
re-dispatched setSortBy with a new array instance; react-table's
usePagination (autoResetPage) resets pageIndex whenever the sortBy state
identity changes, which cancelled the navigation. Sorting a column in any
client-paginated TableView (e.g. the dashboard 'View as table' pane) made
the pagination controls unresponsive, and ListView/server pagination
triggered a spurious page-1 refetch.

Gate the sort dispatch on antd's extra.action so only genuine sorter
changes reach setSortBy.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
Joe LiandClaude Opus 4.8 3aebd88087 ci(pre-commit): install helm-docs via go instead of untrusted brew tap (#973)
Homebrew rolled out an untrusted-tap security change on the GitHub runner
image that makes `brew install norwoodj/tap/helm-docs` fail with "Skipping
norwoodj/tap because it is not trusted", so the pre-commit workflow's
"Enable brew and helm-docs" step now exits non-zero before the hooks ever
run. This turned the "pre-commit checks" job red on every push regardless of
the diff.

Replace the brew tap install with `go install
github.com/norwoodj/helm-docs/cmd/helm-docs@v1.14.2`, matching apache/superset
upstream and keeping the binary version aligned with the helm-docs pre-commit
hook rev in .pre-commit-config.yaml.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
yousoph e415108bd9 fix(dashboard): block dependent filter from fetching until defaultToFirstItem parent selects (#40978)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 8603048518)
2026-07-17 11:29:42 -07:00
yousoph de1313922e fix(plugin-chart-echarts): clarify Tooltip sort by metric description for stacked charts (#42106)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 2dfd08fdb3)
2026-07-17 11:29:42 -07:00
Mike Bridge fc6b5c3c49 fix(charts): preserve time filter for expression axes (#42052)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 90f9238f8a)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi 4d46307576 fix(mcp): await ctx.info calls in update_dashboard tool (#41920)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit cec9afb165)
2026-07-17 11:29:42 -07:00
Elizabeth Thompson 84ece5439c fix(plugin-chart-echarts): use echarts 5.6.0 i18n export path for locale import (#42055)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit beb9d53687)
2026-07-17 11:29:42 -07:00
Joe LiandClaude Opus 4.8 05b33371ee fix(subdirectory): apply the application root to plain anchor links (#962)
Three link sites render plain anchors (Typography.Link href=...) rather than
router <Link to=...>, so they bypass the <Router basename> that prefixes the
rest of the app and produce broken links under a SUPERSET_APP_ROOT
subdirectory deployment:

- the delete-dataset modal's "Affected Dashboards" / "Affected Charts" lists
- the tag list page's dashboard, chart and query rows
- an empty dashboard tab's "create a new chart" link

Add a prefixAppRoot helper to pathUtils and apply it at those sites. It cannot
reuse ensureAppRoot: that helper skips paths that already start with the
application root, and the dashboard route is itself /superset/dashboard/<id>/,
so with an application root of /superset it no-ops and the link stays broken.
prefixAppRoot always prefixes, which is what these router-relative paths need,
and it reproduces exactly what <Link to={url}> already renders via the router
basename on the dashboard and chart list pages. Absolute and protocol-relative
URLs still pass through untouched.

Cover each site with subdirectory regression tests, including the colliding
/superset root, plus unit tests for the helper.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
Amin Ghadersohi 7bb3a48d26 fix(mcp): add AliasChoices to chart/dashboard/dataset request schemas (#41597)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

(cherry picked from commit bd9ba24266)

[6.0 adaptation] Production schema aliases (chart/dashboard/dataset schemas.py)
applied to the 6.0 baseline. Two files needed adaptation because 6.0 predates
later MCP refactors:

- chart/schemas.py: kept the 6.0 base classes and added only
  `model_config = ConfigDict(populate_by_name=True)` to GenerateExploreLinkRequest
  and UpdateChartPreviewRequest. Dropped upstream's ChartRequestNormalizerMixin
  base (absent on 6.0 — would be F821); the model_config achieves the same
  populate-by-name behavior the aliases require.

- test_dashboard_schemas.py: kept TestRequestSchemaAliasChoices (exercises
  GetDashboardInfoRequest / ListDashboardsRequest / AddChartToDashboardRequest —
  all present on 6.0). Dropped upstream's TestDuplicateDashboardResponse (the
  Duplicate Dashboard feature is absent on 6.0).

dashboard/dataset schemas.py, chart/dataset tests, and the new dataset test
file applied clean. pytest: 184 passed (42 alias/canonical-resolution cases)
across all three schema test files.
2026-07-17 11:29:42 -07:00
Mehmet Salih Yavuz 7989bcea9e fix(dashboard): prevent native filter loss when saving chart customizations (#42032)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>

(cherry picked from commit 76bb5f8e69)

[6.0 adaptation] Production sources (reducers/nativeFilters.ts, util/getRelatedCharts.ts,
actions/nativeFilters.ts, actions/chartCustomizationActions.ts) applied clean. Only the two
test files were ported to the 6.0 baseline:

- reducers/nativeFilters.test.ts: dropped 6.0's stale SET_NATIVE_FILTERS_CONFIG_COMPLETE
  tests that asserted the pre-fix "backend response is the source of truth / drop-on-omit"
  behavior; those directly contradict the landed merge-based reducer (which now preserves
  untouched filters and only removes ids in action.deletedIds). Kept #42032's canonical
  new-behavior set: removes deleted / removes all when all ids deleted / preserves untouched
  on omit / mixed Filter+ChartCustomization / adds+removes / merges+deletes.

- util/getRelatedCharts.test.ts: kept the undefined-filter guard test; excluded two
  master-baseline DatasourceType.SemanticView cases (SemanticView is absent on 6.0).

jest: 23/23 green across both files (nativeFilters.test.ts + getRelatedCharts.test.ts).
2026-07-17 11:29:42 -07:00
Antonio Rivero 257332aa71 fix(async-queries): back off polling when async event requests keep failing (#42012)
(cherry picked from commit 42523f8cc4)

6.0-release adaptation: asyncEvent.ts applied clean. asyncEvent.test.ts
ported to fetch-mock v11 (6.0 baseline): callHistory.calls() -> calls(),
clearHistory().removeRoutes() -> reset(). Excluded the reserved-job_id
prototype-pollution test.each block (master-baseline, not part of #42012).
2026-07-17 11:29:42 -07:00
yousoph b957f5668c fix(explore): default Save As for new charts in save dialog (#41314)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 01cd215202)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi 087648c0e9 fix(mcp): bind Big Number chart to a temporal column for dashboard time filters (#41895)
(cherry picked from commit bd61e09b4e)
2026-07-17 11:29:42 -07:00
Maxime Beauchemin 8f6fa85a7b fix(charts): fix time comparison crash when offsets share a numeric prefix (#39344)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0efcd54250)
2026-07-17 11:29:42 -07:00
yousoph 492b74c8f8 fix(dataset): copy catalog field when duplicating a BigQuery dataset (#41106)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit f5deda7864)
2026-07-17 11:29:42 -07:00
yousoph 73646e6c2c fix(oauth2): retrigger queries for unsaved charts and schema loading after OAuth2 redirect (#41101)
(cherry picked from commit 098b95560d)
2026-07-17 11:29:42 -07:00
yousoph 92588d67ab fix(native-filters): persist created/pasted default values in select filter (#40984)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit e08c2c12da)
2026-07-17 11:29:42 -07:00
Enzo Martellucci 8459338f45 fix(chart-echarts): disable animation for report screenshots so time-shift lines render fully (#42003)
(cherry picked from commit 5dd060b714)
2026-07-17 11:29:42 -07:00
Mehmet Salih Yavuz d907259be8 feat(mcp): add update_dataset_metric tool for editing saved dataset metrics (#40975)
(cherry picked from commit 2fac66d1a3)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi ff2ebcfdfb fix(mcp): make list-item truncation cap configurable in get_dashboard_info (#41698)
(cherry picked from commit 62ccdfacc2)
2026-07-14 11:50:37 -07:00
Enzo Martellucci 9ee3272399 fix(dashboard): deleted Display Control reappears after Apply Filters (#41999)
(cherry picked from commit 8f75f1a353)
2026-07-14 11:50:37 -07:00
Amin Ghadersohi 20a6cad0c9 fix(mcp): stop masking dashboard lookup DB errors as not-found (#41919)
(cherry picked from commit 873566c827)
2026-07-14 11:50:37 -07:00
Alexandru Soare 65bd436527 feat(ListView): cherry-picking for folders feature onto 6.0-release (#961)
* feat(ListView): expose expandable prop (#40765)

* feat(listview): Add headerContent prop and HomeOutlined icon (#41244)

* feat(Icons): adding Layout icon (#41853)
2026-07-14 11:50:37 -07:00
Amin Ghadersohi a06173b66a feat(mcp): add get_dashboard_datasets tool (#40961)
(cherry picked from commit fd9c84be43)
2026-07-14 11:50:37 -07:00
amaannawab923 0576ac4b57 fix(ag-grid): honor dataset hour offset in time range filters (#41391)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 9b508ebe0d)
2026-07-13 13:14:19 -07:00
yousoph f723884808 fix(databases): update broken database documentation links to /user-docs namespace (#41557)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 033b7bc385)
2026-07-13 13:14:19 -07:00
yousoph d703cc21ea feat(tags): add favorites filter to Tags list view (#41461)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit c0b0a2fdaf)
2026-07-13 13:14:19 -07:00
yousoph a3285544b3 fix(tags): make favorite star toggle in Tags list view (#41460)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit d42076d541)
2026-07-07 16:19:15 -07:00
amaannawab923 9fb756a207 fix(ag-grid): keep basic conditional formatting aligned after sort (#41390)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit ffd0982942)
2026-07-07 08:33:38 -07:00
amaannawab923 e29a281071 fix(ag-grid): select cell on click instead of its text (#41392)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
(cherry picked from commit 5e384f54d3)
2026-07-07 08:27:46 -07:00
Mehmet Salih Yavuz e12c08b0ea fix(sqllab): preserve saved query description when editing (#41685)
(cherry picked from commit de5a233ccf)
2026-07-07 08:25:05 -07:00
amaannawab923 f94de107b4 fix(ag-grid): persist "None" value aggregation selection (#41386)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit fb496e158a)
2026-07-06 16:34:46 -07:00
yousoph ca5e45458e fix(explore): prevent Results FilterInput from stealing focus during remount (#41100)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 19e94855a1)
2026-07-03 14:38:16 -07:00
Mike Bridge fbf3667cfa fix(dao): SQL-faithful NULL and non-string handling in LIKE-family operators (#41653)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit be46d65e3b)
2026-07-03 14:25:47 -07:00
Joe Li a870453816 fix(sqllab): preserve query history after tab migration (#41403)
(cherry picked from commit 7926c3a93a)
2026-07-03 14:22:22 -07:00
Joe Li 1d026a5322 fix(mixed-chart): preserve order_desc and series_limit_metric in buildQuery (#41401)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 825b582815)
2026-07-03 14:20:28 -07:00
Kamil Gabryjelski 800f57d628 fix(plugin-chart-ag-grid-table): show correct percent-metric totals in summary row (#41247)
Signed-off-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
(cherry picked from commit 2d78a8733c)
2026-07-03 14:19:06 -07:00
Joe LiandClaude Opus 4.8 0cc04ff8a2 fix(mcp): handle SSL connection drop during pre-call session teardown (#39917)
Manual port of apache/superset#39917 (commit 85935b0b) onto 6.0-release.
A clean cherry-pick does not apply because mcp_service/auth.py has diverged
structurally on this branch, but the vulnerable code path is present verbatim:
sync_wrapper calls db.session.remove() before user resolution on reused
thread-pool threads. If the thread-local DBAPI connection died between
requests (RDS SSL idle-timeout / max-connection-age), the implicit rollback
raises a DBAPIError and crashes the tool call.

Wrap the pre-call remove in _remove_session_safe(), which catches DBAPIError,
invalidates the dead connection so the pool discards it, and retries remove()
so the tool proceeds on a fresh connection. Ports the accompanying regression
test byte-for-byte behaviorally.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:21:40 -07:00
Mehmet Salih Yavuz 99a374adda fix(dashboard): show a not-found state for a deleted dashboard (#41686)
(cherry picked from commit 8bf3933972)
2026-07-02 12:37:13 -07:00
Amin Ghadersohi c63ada38f2 feat(mcp): add tags + typed metadata fields to update_dashboard (#40957)
(cherry picked from commit c60d8bb656)
2026-07-02 12:25:24 -07:00
Greg Neighbors 9cd2a0d7b8 feat(mcp): dashboard layout, theme, and CSS control + update_dashboard tool (#40399)
Co-authored-by: gkneighb <26003+gkneighb@users.noreply.github.com>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-MacBook-Air-2.local>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-Air-2.lan>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit d8bcc66472)
2026-07-02 12:11:12 -07:00
Mehmet Salih Yavuz 39a5abe515 fix(sqllab): reject blank saved query and dataset names (#41624)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit a48ca9ce72)
2026-07-02 11:38:48 -07:00
Mehmet Salih Yavuz c3d323f5c5 fix(sqllab): filter results table when typing in the search box (#41625)
(cherry picked from commit a919dda2ac)
2026-07-02 11:32:24 -07:00
Jean Massucatto 4969a91d56 fix(dashboard): pre-filter time grain for display controls (#40000)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit e58ce1cf39)
2026-07-02 11:27:32 -07:00
Mehmet Salih Yavuz 721ec5fcc7 fix(sqllab): truncate long tab names in the overflow ("...") dropdown (#41585)
(cherry picked from commit b7d5de8e52)
2026-07-02 11:23:20 -07:00
Amin Ghadersohi eb8a8aebf5 fix(mcp): escape LIKE wildcards in find_users to prevent user enumeration (#41593)
(cherry picked from commit 7f4cac63c9)
2026-07-02 11:06:44 -07:00
Amin Ghadersohi aab1c0483e chore(mcp): remove low-value list/info tools that fail agent-native policy (#40690)
(cherry picked from commit ef7379c47e)

Adapted for 6.0-release: on this branch only the css_template and theme MCP
tool groups exist, so this pick removes those two groups (their list/get tools,
schemas, and unit tests) along with their docstring and get_schema references.
The plugin, action_log, and task-management tool groups the upstream change
also touched do not exist on 6.0 and were left untouched.
2026-07-02 10:35:18 -07:00
jesperct 214065ac0e fix(explore): stop metric edits from bleeding across metrics with duplicate optionNames (#41208)
Adapted for 6.0-release: the dedupeAdhocMetricOptionName helper and its
wiring were ported onto this branch's pre-TS-migration files
(AdhocMetric.js, MetricsControl.jsx) with type annotations stripped, and
onto DndMetricSelect.tsx whose coerceMetrics lacked the master type
casts. Behavior matches upstream: duplicate optionNames are regenerated
on load so editing one metric no longer overwrites another.

Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 0c12114ea9)
2026-07-02 10:22:40 -07:00
Joe Li 2df6091bb3 fix(dashboard): suppress favorite status error toast on 404 (#41402)
Adapted for 6.0-release: ported onto dashboardState.js/.test.js (still
pre-TS-migration on this branch) and onto the guard-less catch block,
preserving 6.0's existing "toast on any non-404 error" behavior while
swallowing the 404 case. The upstream currentId guard is a separate
change not present on this branch and is intentionally not included.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 797e497f4b)
2026-07-02 10:17:31 -07:00
yousoph 634d2ee2cb fix(explore): enable free-text entry for temporal D3 format selector in Table chart (#41194)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 105b896038)
2026-07-02 10:12:02 -07:00
jesperct 5bffda9a49 fix(sqllab): quote autocomplete table names that need it (#41199)
(cherry picked from commit 15626a047c)
2026-06-30 23:22:08 -07:00
Elizabeth Thompson 074cafc9dd fix(screenshots): catch empty-bytes tiled result and set ERROR on falsy image (#41097)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 134919ea36)
2026-06-30 21:41:27 -07:00
yousoph fdef6d33ee fix(bigquery): quote dotted STRUCT columns per-segment in drill to detail (#41462)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit b8b23d6219)
2026-06-30 16:22:45 -07:00
Elizabeth Thompson 5cd2031618 fix(reports): pre-commit tab permalinks before state machine transaction (#41096)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e15dc5735f)
2026-06-30 16:18:18 -07:00
Maxime Beauchemin 8b6cc68954 feat(mcp): resolve call_tool proxy name and capture error_type in logging (#38915)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit b6f545e61e)
2026-06-30 12:25:20 -07:00
Maxime Beauchemin 527e729a9a fix(table): ensure dimensions appear before metrics in column order (#39346)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4f19bc4c5f)
2026-06-29 11:45:20 -07:00
Amin Ghadersohi 56b5133721 fix(mcp): make search_tools query optional to fix null content on tool discovery (#40906)
(cherry picked from commit 820e3d18d3)
2026-06-26 20:48:41 -07:00
Alexandru Soare 57948b865d feat(security): Add extension hooks for custom access control, ownership, and asset lifecycle (#40707)
(cherry picked from commit 6d08e79259)
2026-06-26 15:59:54 -07:00
Mehmet Salih Yavuz d0c3bc89a9 feat(explore): add full-range option for time-shift comparison (#41334)
(cherry picked from commit 9a11c15a33)
2026-06-26 15:59:54 -07:00
yousoph 1bef0b1d31 fix(pandas-postprocessing): handle prophet errors and validate minimum data points for forecast (#41180)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f6ce105450)
2026-06-26 15:59:54 -07:00
yousoph 605ed6294d fix(sql_lab): serialize dict/list cell values as valid JSON strings (#41099)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 1d0866556f)
2026-06-26 15:59:54 -07:00
Enzo Martellucci d2a5b43548 fix(big-number): respect extra_form_data.time_compare in Big Number with Time Comparison (#41342)
(cherry picked from commit 3ff90bd532)
2026-06-26 15:59:54 -07:00
yousoph f73adb5a89 fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c1f4062af6)
2026-06-26 15:59:54 -07:00
yousoph b6d496532b fix(explore): pre-populate SaveModal dashboard from chart metadata (#41181)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 133473d0f4)
2026-06-26 15:59:54 -07:00
yousoph 111644cdc2 fix(dashboard): normalize legacy currentState to filterState in native_filters URL param (#40929)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f70a2eac89)
2026-06-25 14:10:25 -07:00
Amin Ghadersohi 1465350ae2 fix(dashboards): remove thumbnail_url from list API to reduce cache cost (#38567)
(cherry picked from commit eebe1a1a5b)
2026-06-25 14:04:17 -07:00
Amin Ghadersohi cd4f86c82c fix(bigquery): set default dataset from schema in adjust_engine_params (#40776)
(cherry picked from commit c1b5d05f83)
2026-06-25 14:00:02 -07:00
Amin Ghadersohi 62bf3a0c43 feat(mcp): add aggregation field to BigNumberChartConfig for Big Number with Trendline (#40775)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 4b96b91b53)
2026-06-25 13:58:39 -07:00
Vitor Avila be41e026f1 fix(chart API): Consider time grain filters with the filters_dashboard_id param (#41290)
(cherry picked from commit 3b46a5f121)
2026-06-22 21:02:01 -07:00
Geidō 268f1aee39 fix(dashboard): required filters reliably apply default + Apply enables on change (#40470)
(cherry picked from commit 01ed81785e)
2026-06-22 08:25:08 -07:00
Alexandru Soare 0a8f166c6f fix(matrixify): Set singular metric field for pie and other single-me… (#40852)
(cherry picked from commit 378473a6fe)
2026-06-22 08:21:27 -07:00
Vitor Avila a363c81887 fix(chart API): apply dashboard filters by live scope, not stale chartsInScope (#41214)
(cherry picked from commit 334b13c3d9)
2026-06-19 12:33:44 -07:00
Vitor Avila 34ee189094 fix(chart): preserve SQL_QUERY_MUTATOR line comments structure (#41215)
(cherry picked from commit 9e130e5927)
2026-06-19 12:30:00 -07:00
Vitor Avila 57a4fd096f fix(chart API): Do not duplicate Jinja-applied filters with filters_dashboard_id (#41131)
(cherry picked from commit b4e3452bfd)
2026-06-19 12:26:44 -07:00
Evan Rusackas 4fb3c6cc8d fix(dashboard): replace chartsInScope references at import time (#38171)
Co-authored-by: Rémy Dubois <remy.dubois@komodohealth.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
(cherry picked from commit 19d01521bf)
2026-06-19 12:20:52 -07:00
Richard Fogaca Nienkotter ff0d8d8055 fix(embedded): skip CSRF token fetch for guest streaming chart exports (#41004)
(cherry picked from commit a1bc3c67ed)
2026-06-18 12:29:28 -07:00
jesperct 89c57aa0cc fix(explore): drop inherit/custom time shifts when switching to a viz that can't honor them (#40865)
(cherry picked from commit 188c84f1cd)
2026-06-18 12:25:23 -07:00
jesperct bae6e6a646 fix(charts): apply datetime format to unaggregated temporal columns (#41060)
(cherry picked from commit ef82da8458)
2026-06-17 16:36:33 -07:00
jesperct 5caad5201a fix(plugin-chart-handlebars): follow the app theme in Customize code editors (#40952)
(cherry picked from commit 2d2a8f3ab0)
2026-06-17 16:27:56 -07:00
Joao Amaral de4d0f6d94 fix(celery): check app context before session removal in teardown (#37574)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
(cherry picked from commit 750518cf6f)
2026-06-17 08:15:55 -07:00
Hugh A. Miles II e6db576381 feat(dashboard): add Rison-encoded URL filter support (#39795)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
(cherry picked from commit 9a79588d35)
2026-06-12 10:47:55 -07:00
Alexandru Soare 01ef788f9b fix(explore): require Update Chart for Matrixify dimension changes (#40851)
(cherry picked from commit 56c856e802)
2026-06-12 09:45:10 -07:00
Elizabeth Thompson 226726fbf4 fix: replace deprecated appbuilder.app with current_app (#40876)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c0e78f39d7)
2026-06-12 09:45:10 -07:00
Elizabeth Thompson 827fb467ca fix: use Series.iloc for positional access in generate_join_column (#40936)
(cherry picked from commit b0d7880ac0)
2026-06-12 09:45:10 -07:00
Geidō 6f6aa37df3 fix(deps): cap paramiko <4.0 to keep SSH tunneling working (#40973)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 74845eaf0b)
2026-06-12 09:45:10 -07:00
Mehmet Salih Yavuz bf0f73df02 fix(theme): SDK theme config overrides dashboard-level theme in embedded mode (#40763)
(cherry picked from commit d7ddf2023d)
2026-06-12 09:45:10 -07:00
jesperct 89e5815b66 fix(dashboard): update browser tab title when dashboard is renamed (#40730)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 21189ae130)
2026-06-12 09:45:10 -07:00
03f350a479 fix(sqllab): prevent corrupted query state from blocking SQL Lab access (#40580)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-12 09:45:10 -07:00
chaselynisabella 4136be1f30 feat(path): support metric-based color scales & line width by metric (#39165)
(cherry picked from commit ac035083d7)
2026-06-05 19:31:31 -07:00
yousoph dbfafa83aa fix(dashboard): prevent divider display controls from reverting on second save (#40696)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e956f82224)
2026-06-05 18:41:30 -07:00
jesperct 5125ae0fd8 fix(dashboard): sort Dynamic Group By display values alphabetically (#40220)
(cherry picked from commit 8119204857)
2026-06-05 17:54:29 -07:00
Richard Fogaca Nienkotter 8cfe2ae02a fix(embedded): add guest token to streaming exports (#40712)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit 601f9c2b8c)
2026-06-05 17:51:36 -07:00
Amin Ghadersohi 9e45088364 fix(mcp): add select_columns lean defaults to get_dashboard_info, get_chart_info, get_dataset_info (#40473)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit aa4092ba68)
2026-06-05 17:50:15 -07:00
Maxime Beauchemin 5e46e58453 fix(table): fix cross-filter not clearing on second click in Interactive Table (#39253)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c2d96e0dce)
2026-06-05 17:48:21 -07:00
Amin Ghadersohi f7429845d5 fix(mcp): API key authentication for MCP — transport, validation, and RBAC (#39604)
(cherry picked from commit 7d69f76127)
2026-06-05 17:44:00 -07:00
Amin Ghadersohi 9a72a03608 fix(mcp): fall back to form_data spatial query for Deck.gl charts (#40339)
(cherry picked from commit f4dfb7f026)
2026-06-05 17:35:32 -07:00
Amin Ghadersohi 54fc66b7cf fix(mcp): escape LIKE wildcards in MCP list tool search filters (#40682)
(cherry picked from commit 001834470b)
2026-06-05 17:34:22 -07:00
Kamil Gabryjelski b40738fd10 feat(gsheets): restore public/private sheet selector (#40466)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
(cherry picked from commit 2abbb64e6b)
2026-06-05 17:33:05 -07:00
Amin Ghadersohi 59af59405b chore(deps): migrate MCP service JWT errors from authlib.jose to joserfc (#40582)
(cherry picked from commit a6d2c95480)
2026-06-05 17:27:44 -07:00
Amin Ghadersohi 2ead15894e feat(mcp): add list_reports and get_report_info tools (#40348)
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit 5312d0adf8)
2026-06-05 17:24:35 -07:00
Amin Ghadersohi b84377cdfd feat(mcp): add list_tags and get_tag_info MCP tools (#40349)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d8eeb3505)
2026-06-05 17:12:45 -07:00
Amin Ghadersohi 5f0e9a5377 feat(mcp): add list and get tools for saved queries and query history (#40346)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit a69bbcb044)
2026-06-05 17:10:32 -07:00
Amin Ghadersohi 22327a9a0a feat(mcp): add list and get tools for CSS templates and themes (#40343)
(cherry picked from commit d350792d43)
2026-06-05 17:07:42 -07:00
Amin Ghadersohi 385b84f572 feat(mcp): add list and get tools for annotation layers and annotations (#40342)
(cherry picked from commit f614863ed7)
2026-06-05 17:02:25 -07:00
Mehmet Salih Yavuz e23a3eae1a feat(mcp): add get_dashboard_layout companion tool (#40328)
(cherry picked from commit 8853ab5c75)
2026-06-05 16:59:16 -07:00
Elizabeth Thompson 4e315fd769 fix(roles): resolve HTTP 429 errors on role management page (#39465)
Adapted for 6.0-release: only the fetchOptions.ts concurrency throttle (429
fix) applies. The RoleListEditModal.tsx/test.tsx changes (414 fix) depend on
the AsyncSelect architecture introduced in #38387, which is not present on
6.0; in 6.0 the modal receives permissions/groups as props from the parent
list page rather than fetching them itself with id-IN filters, so the 414
URL-length code path does not exist here.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f037449b75)
2026-06-05 16:57:06 -07:00
Gabriel Torres Ruiz 610d1c5998 feat(mcp): support custom SQL metrics in generate_chart and update_chart (#40448)
(cherry picked from commit e68251fa70)
2026-06-05 16:53:09 -07:00
Amin Ghadersohi 98ee054613 feat(mcp): browser hello page with working middleware and config-driven content (#40471)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 0dc58d1042)
2026-06-05 16:49:56 -07:00
Amin Ghadersohi abc4dfb01c fix(mcp): return error when target_tab not found in add_chart_to_existing_dashboard (#40124)
(cherry picked from commit e041f25385)
2026-06-05 16:48:48 -07:00
Amin Ghadersohi c814025522 fix(mcp): prevent encoding error on tools/list when middleware raises (#40446)
(cherry picked from commit 952a6f3a23)
2026-06-05 16:46:29 -07:00
Joe Li b9cdea4b95 fix(select): replace cached options with search results in AsyncSelect (#40039)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 3b4892c48c)
2026-06-05 16:45:32 -07:00
Amin Ghadersohi 227a97ce73 feat(mcp): add series_limit to generate_chart XY config (#40307)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 5966bb1c1e)
2026-06-05 16:44:27 -07:00
Amin Ghadersohi 8247e67d58 fix(mcp): hide write tools from users without write permissions (#40098)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e25d708197)
2026-06-05 16:42:55 -07:00
SkinnyPigeon 9ee01c54f4 feat: Allow specific mcp tools to be disabled (#39835)
(cherry picked from commit 70419e9d8f)
2026-06-05 16:39:29 -07:00
Beto Dealmeida 93265c1ac7 chore: bump shillelagh to 1.4.4 (#39870)
(cherry picked from commit 76955017eb)
2026-06-05 16:35:49 -07:00
Richard Fogaca Nienkotter febab1e24d fix(mcp): default chart previews to ascii (#39719)
(cherry picked from commit d0abb66fdf)
2026-06-05 16:34:34 -07:00
Amin Ghadersohi 0e12a92930 fix(mcp): correct method name in API key auth (extract_api_key_from_request) (#39437)
(cherry picked from commit 7c4f87615b)
2026-06-05 16:31:35 -07:00
Amin Ghadersohi c9d505eaa8 fix(mcp): unwrap ToolResult payload before truncation in ResponseSizeGuardMiddleware (#39578)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
(cherry picked from commit b1b6a057d8)
2026-06-05 16:30:33 -07:00
Gabriel Torres Ruiz e357c10a44 fix(mcp): clear stale query_context in update_chart so filters and row_limit are applied (#39413)
(cherry picked from commit 919daabe54)
2026-06-05 16:28:59 -07:00
Maxime Beauchemin 020ce9ca8e fix(table): use column label instead of SQL expression for orderby in downloads (#39332)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b3e88db87e)
2026-06-05 15:54:52 -07:00
Richard Fogaca Nienkotter 301b5901f2 fix(dashboard): apply dynamic groupby display controls to scoped charts (#39356)
(cherry picked from commit c3a0f2749b)
2026-06-05 15:21:25 -07:00
Richard Fogaca Nienkotter b63f86765c fix(heatmap): skip orderby for value-based axis sorts (#39290)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c971ea3ec6)
2026-06-05 14:42:26 -07:00
Maxime Beauchemin 8e6c0f05b8 fix(SqlLab): improve SQL diff modal — responsive width, padding, tabs, and copy button (#39246)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 450701ecec)
2026-06-05 13:46:42 -07:00
Evan Rusackas 0f45af3d98 fix(dashboard-import): remap chartsInScope on import (#26338) (#40140)
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 4a9aecda4a)
2026-06-05 11:54:42 -07:00
Mafi fa702ac47b fix(dashboard): use datasetUuid instead of datasetId in display controls export/import (SC-104655) (#40008)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 144dae7c43)
2026-06-05 11:33:17 -07:00
Elizabeth Thompson 3c83e2e18f fix(reports): add per-tile animation wait to prevent partial ECharts renders in tiled screenshots (#40694)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 42367afb25)
2026-06-05 09:16:03 -07:00
Vitor Avila 896c36a14b fix(dashboard-filter): Consider dashboard filters to charts not declared in the dashboard position (#40774)
(cherry picked from commit 7406098708)
2026-06-04 14:27:52 -07:00
Jean Massucatto 2f2da14c58 fix(charts): show non-filterable columns in metric section for table … (#39524)
(cherry picked from commit fc0245bdb0)
2026-06-04 14:25:51 -07:00
Mehmet Salih Yavuz 15d4adb6b6 fix(reports): skip permalink when dashboard state has no anchor or filters (#40530)
(cherry picked from commit e2ed989639)
2026-06-03 15:47:38 -07:00
Jean Massucatto cdbc89408a fix(explore): tighten popover title-to-tabs spacing to 12px (#40410)
(cherry picked from commit d2d46169bf)
2026-06-03 15:47:38 -07:00
Jean Massucatto e0b9397b28 fix(chart-list): sort by changed_on instead of last_saved_at (#39984)
(cherry picked from commit 1b8099811b)
2026-06-03 15:47:38 -07:00
jesperct a1395b3f3e fix(time-comparison): shift offset filter when X-axis is adhoc Custom SQL (#40586)
(cherry picked from commit 699e741c69)
2026-06-03 15:47:38 -07:00
Jean Massucatto 4b0fcb88b7 fix(world-map): preserve bubbles and exclude only null metrics from color scale (#39926)
(cherry picked from commit 7275116f4c)
2026-06-03 15:47:38 -07:00
Jean Massucatto 5824083248 fix(dashboard): clear undo history (#40569)
(cherry picked from commit ddb647cd3a)
2026-06-03 15:47:38 -07:00
Jean Massucatto 2d74122302 fix(dataset): sort by data type when clicking Datatype column header (#40411)
(cherry picked from commit 316dd3db22)
2026-06-03 15:47:38 -07:00
jesperct 5c3f4bc27e fix(dashboard): preserve user selection when Dynamic Group By overlaps base (#40031)
(cherry picked from commit d52e28c564)
2026-06-03 15:47:38 -07:00
jesperct 8de0b923da fix(dataset): validate catalog against allow_multi_catalog on import (#40376)
(cherry picked from commit a2eda11a81)
2026-06-03 15:47:38 -07:00
jesperct 8caa35c2cf fix(chart-echarts): drop white textBorder from Funnel segment labels (#40468)
(cherry picked from commit c73106b7a2)
2026-06-03 15:47:38 -07:00
Maxime Beauchemin c53e38e566 fix(list-view): preserve user name in filter pill after navigation (#39505)
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit a273fe4d62)
2026-06-03 15:47:38 -07:00
Kamil Gabryjelski 33027be139 fix(mcp): Improve validation errors and field aliases to reduce failed LLM tool calls (#38625)
(cherry picked from commit d91b96814e)
2026-06-03 15:47:38 -07:00
Richard Fogaca Nienkotter e2c746a9a5 fix(mcp): return requested update chart previews (#40077)
(cherry picked from commit fa06989ed7)
2026-06-03 15:47:38 -07:00
Alexandru Soare f759506366 feat(mcp): make form_data_key optional in update_chart_preview (#39680)
(cherry picked from commit 33585b0480)
2026-06-03 09:13:54 -07:00
Alexandru Soare 9ea64571dd chore(mcp): Simplify chart preview response (#40020)
(cherry picked from commit b64561f3a3)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz 4349e7c97b fix(mcp): use name URL param so AI-generated SQL Lab titles render (#40288)
(cherry picked from commit 8ab4695ba3)
2026-06-03 09:13:54 -07:00
Alexandru Soare 894d64cdd9 fix(preview): fix chart preview bugs (#40063)
(cherry picked from commit 558ff4452b)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz e8e9fa9e61 feat(mcp): make config optional in generate_explore_link (#39559)
(cherry picked from commit 4c3f65ef0b)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz 4b0bd34372 feat(mcp): include applied dashboard filters in get_chart_info (#39620)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 53d8e5bdfa)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz 7ce69aecdf fix(mcp): eager-load dataset.metrics to prevent Excel export DetachedInstanceError (#39483)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 2f95d288dd)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz cd64365399 feat(mcp): add find_users tool and owner filter columns for listings (#39679)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit d1d07112aa)
2026-06-03 09:13:54 -07:00
Alexandru Soare a88648a793 fix(recommandation): Fix chart recommandation (#39886)
(cherry picked from commit e3711bec39)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz 741693e2f5 feat(mcp): chart formatting options across all supported chart types (#39887)
(cherry picked from commit ce9cab098f)
2026-06-03 09:13:54 -07:00
Alexandru Soare 82050eac85 fix(mcp): Skip misleading trend analysis for categorical ASCII charts (#39761)
(cherry picked from commit fb276b08dd)
2026-06-03 09:13:54 -07:00
Alexandru Soare 41d4d46b55 fix(mcp): raise right error (#39964)
(cherry picked from commit 6e8b3bf976)
2026-06-03 09:13:54 -07:00
Alexandru Soare ad42f8a8b4 feat(mcp): Add mcp_call_id to tool responses for server log correlation (#39776)
(cherry picked from commit 55024e8f4d)
2026-06-03 09:13:54 -07:00
Alexandru Soare 68adc2cb41 fix(mcp): Block destructive DDL (DROP, TRUNCATE, ALTER) in execute_sql (#39621)
(cherry picked from commit b98bd2a07a)
2026-06-03 09:13:54 -07:00
Alexandru Soare 7e47e27ff0 fix(mcp): changed_on_humanized null in write tool responses (generate_dashboard, generate_chart) (#39488)
(cherry picked from commit 0a3a35018c)
2026-06-02 14:25:36 -07:00
Alexandru Soare 575f1cc9cb chore(mcp): Standardize error response shapes across chart tools (#39905)
(cherry picked from commit 966e97989b)
2026-06-02 14:24:55 -07:00
Jean Massucatto 9e96ac04bb fix(explore): hide value input for unary filter operators (#39924)
(cherry picked from commit 965ec47296)
2026-06-01 16:29:57 -07:00
Abdul Rehman b90d74bce0 fix(frontend): handle null/undefined path in ensureAppRoot (#39940)
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit 816794b198)
2026-06-01 11:22:35 -07:00
Martyn Gigg d7a9d99ac0 fix(superset-frontend): Fixes for broken functionality when an application root is defined (#36058)
(cherry picked from commit e4f649e49c)
2026-06-01 11:19:22 -07:00
Joe Li e976a30937 fix(export): URL prefix handling for subdirectory deployments (#36771)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 22cfc4536b)
2026-06-01 11:14:14 -07:00
Joe Li 9f96751d93 test(playwright): convert and create new dataset list playwright tests (#36196)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit d0361cb881)
2026-06-01 11:00:33 -07:00
Evan Rusackas f8314ba725 fix(sqla): pass catalog and schema to get_sqla_engine in values_for_column (#38681)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 26ef4b7ed3)
2026-05-22 15:14:47 -07:00
Elizabeth Thompson c952010683 fix(reports): guard null dashboard height in Playwright screenshots (#40179)
(cherry picked from commit f187a8e1c4)
2026-05-22 15:14:47 -07:00
Jean Massucatto 5f03a3a80b fix(explore): prevent unnecessary scrollbars during chart rendering (#39291)
(cherry picked from commit 054aeb3bae)
2026-05-22 15:14:47 -07:00
Richard Fogaca Nienkotter 51d76fdf9e fix(mcp): apply cached adhoc filters to chart retrieval (#40099)
(cherry picked from commit 8fa5a75c70)
2026-05-22 15:14:47 -07:00
Amin Ghadersohi b46ee47661 fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)
Completes the earlier partial backport of #39636 (commit 9039d1460c)
which only applied the database/schemas.py + test_database_tools.py
chunks and dropped the get_chart_sql.py + test_get_chart_sql.py chunks
entirely. The dropped chunks introduce the `_resolve_engine` and
`_resolve_datasource_name` helpers used by #40099.

(cherry picked from commit 7774ec7e3c)
2026-05-22 15:14:47 -07:00
Maxime Beauchemin 8af0ff7e3b fix(table): fall back to datasource columns for conditional formatting when query results are empty (#39345)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>

Adapted for 6.0-release:
- Dropped the `allColumns` block and ENTIRE_ROW formatting option;
  ObjectFormattingEnum.ENTIRE_ROW was introduced in master-only PR
  #35897 (feat: add formatting column and formatting object to
  conditional formatting table) which is not on 6.0-release.
- The customer-visible fix (fallback to datasource columns when query
  results are empty) is preserved for 6.0's existing numericColumns
  control surface.
- Test file: dropped the two `allColumns`/ENTIRE_ROW assertions and
  the dedicated ENTIRE_ROW test for the same reason.

(cherry picked from commit a60860c969)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi 0dbdf00587 fix(mcp): improve not-found errors to suggest corresponding list_* tools (#39919)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 460992d89b)
2026-05-22 12:08:30 -07:00
Sandesh Devaraju 2fed392839 fix(mcp): JSON-serialize order_by_cols and support sort direction (#39952)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit 823eb905d3)
2026-05-22 12:08:30 -07:00
Richard Fogaca Nienkotter 7f501aab42 fix(mcp): expose table chart type labels in chart responses (#40060)
(cherry picked from commit 2a1dcb79e3)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi aef0d65b3f fix(mcp): clarify request wrapper in list_datasets, list_charts, list_dashboards (#39920)
(cherry picked from commit cfb0b6e811)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi cd341db6d8 fix(mcp): add default request parameter to list_charts and list_dashboards (#39730)
(cherry picked from commit 957b298ae1)
2026-05-22 10:37:55 -07:00
Mafi 0cab4885bc fix(sqllab): execute prequeries on streaming connection to fix PostgreSQL CSV export (#40194)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit b66c104fde)
2026-05-22 10:37:55 -07:00
jesperct 6e38cc4c80 fix(echarts): preserve dataZoom range across setOption(notMerge) (#40173)
(cherry picked from commit 5bb54cc96b)
2026-05-22 10:37:55 -07:00
Richard Fogaca Nienkotter 123d563eb1 feat(mcp): add data boundary instruction to harden against prompt injection (#40080)
(cherry picked from commit c59ab8bffd)
2026-05-21 14:58:34 -07:00
Mafi 464398f37b fix(mixed-timeseries): preserve all-NaN metric columns after pivot when Jinja evaluates to NULL (#40005)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 01224007da)
2026-05-21 14:58:23 -07:00
Jean Massucatto f62211a0ca fix(sqllab): handle scientific notation in big number JSON responses (#39994)
(cherry picked from commit e6179036ec)
2026-05-21 14:57:55 -07:00
Amin Ghadersohi a888e9957a fix(mcp): ASCII chart crashes with NaN when dataset contains null values (#39916)
(cherry picked from commit 547660dcc4)
2026-05-21 14:56:53 -07:00
Richard Fogaca Nienkotter f3628fa653 fix(explore): preserve preview chart name on save (#39908)
(cherry picked from commit 8c80caefa3)
2026-05-21 14:56:29 -07:00
Elizabeth Thompson 680bd7e444 fix(reports): narrow spinner checks to viewport and tighten exception handling (#39895)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d2b655c22)
2026-05-21 14:56:21 -07:00
Elizabeth Thompson 7d28006505 fix(mcp): exclude self-referencing filter columns from get_schema output (#39826)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit ef0efb7493)
2026-05-21 14:55:51 -07:00
Elizabeth Thompson 1bb32b70cb fix(export): fix double app-root prefix in chart/drill-detail export URLs (#39710)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 958d4aa3de)
2026-05-20 18:09:13 -07:00
Mehmet Salih Yavuz 46ef48971b fix: chart rendering race condition and homepage connection reset (#40065)
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit a62bf2b0bb)
2026-05-20 11:58:28 -07:00
Mehmet Salih Yavuz 4745484c7c fix(rls): prevent double-apply when converting physical dataset to virtual (#39725)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 8b0e63b58c)
2026-05-20 11:51:41 -07:00
Mehmet Salih Yavuz ae25eede48 fix(dashboard): Clear All filters now stages changes until Apply (#39778)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 245fffca79)
2026-05-20 11:50:04 -07:00
Mehmet Salih Yavuz d5cd674740 fix(dashboard): row limit warning missing for non-table charts (#39911)
(cherry picked from commit 372b50e19d)
2026-05-20 11:45:48 -07:00
Mehmet Salih Yavuz 94cfefeaa6 fix(table): consolidate visual column options under Visual formatting section (#39856)
(cherry picked from commit 69fbbfd7ce)
2026-05-20 11:43:34 -07:00
Enzo Martellucci debc7da93b fix(embedded-sdk): grant fullscreen and clipboard-write by default (#39943)
(cherry picked from commit d3784879c2)
2026-05-20 11:42:31 -07:00
Richard Fogaca Nienkotter 7344426aea fix(dashboard): match auto-refresh paused-dot outline to icon color (#39909)
(cherry picked from commit 8088c5d1de)
2026-05-20 11:42:02 -07:00
Joe Li c9618cc73a fix(dashboard): restore top-level tab drop target for dashboards with content (#39423)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit d7fa9301cc)
2026-05-19 17:04:44 -07:00
jesperct 7672dce4aa fix(echarts): suppress phantom x-axis label at axis edge when no time grain (#39972)
(cherry picked from commit 5393fdfabf)
2026-05-19 15:12:17 -07:00
Vitor Avila cf2f4c0438 fix(OAuth2): Re-query the OAuth2 token to avoid stale reference (#40071)
(cherry picked from commit d40a5cad5d)
2026-05-19 15:12:17 -07:00
Beto Dealmeida eeedcaf47b fix: OAuth2 exception should be 403 (#40074)
(cherry picked from commit 736a51c13f)
2026-05-19 15:12:17 -07:00
Vitor Avila 1666be2b95 fix(OAuth2): Support OAuth2 exception with legacy endpoint (#39897)
(cherry picked from commit 3745e37182)
2026-05-19 15:12:17 -07:00
Vitor Avila b900cc53b7 fix(GSheets OAuth2): Re-add UnauthenticatedError (#39785)
(cherry picked from commit 3f550f166f)
2026-05-19 15:12:17 -07:00
Vitor Avila 05e68c3187 fix(db oauth2): Improve OAuth2 flow (#39499)
(cherry picked from commit 191337e08d)
2026-05-19 14:06:43 -07:00
Beto Dealmeida b968978ad5 fix(oauth2): silence lock acquisition errors on token refresh (#39463)
Co-authored-by: Beto Dealmeida <beto@preset.io>
(cherry picked from commit 5fb89b865d)
2026-05-19 14:03:39 -07:00
jesperct 3543be247f fix(AlertReportModal): TypeError when pasting text into the Alerts content form search field (#39298)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 6cebba49ca)
2026-05-18 22:12:43 -07:00
Maxime Beauchemin fa2fbb2c00 fix(importexport): honor overwrite flag on /api/v1/assets/import (#39502)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d90d3a2dea)
2026-05-18 14:05:41 -07:00
Maxime Beauchemin 0ba574d3f2 fix(sqllab): include template_params when overwriting a dataset (#39501)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6ee4d694bc)
2026-05-18 14:04:10 -07:00
Maxime Beauchemin 2e4b7accc4 fix(trino/presto): use equality for boolean filters to support computed columns (#39500)
(cherry picked from commit d023fe1703)
2026-05-18 14:03:47 -07:00
Jean Massucatto 3c56ad9bc8 fix(table): restore dropdown arrow visibility on paginated table page… (#39305)
(cherry picked from commit 9c3c8dcc0b)
2026-05-18 14:03:06 -07:00
Jean Massucatto c2079726cd fix(chart): use categorical axis for bar charts with numeric x-axis (#39141)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 171414f165)
2026-05-18 14:02:18 -07:00
Maxime Beauchemin 91678ca2cd fix(import): import tags during CLI native asset import (#39495)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c4cf03f899)
2026-05-18 14:01:44 -07:00
jesperct 271b3fecee fix(time-comparison): use chart row_limit instead of instance config in offset queries (#39490)
(cherry picked from commit d8dd2d99b3)
2026-05-18 10:58:47 -07:00
Gabriel Torres Ruiz 60f1d01f25 feat(mcp): add create_virtual_dataset tool to save SQL queries as datasets (#39279)
(cherry picked from commit 18d6feb499)
2026-05-18 10:56:33 -07:00
Amin Ghadersohi dc5afb132a fix(mcp): use tiktoken for response-size-guard token estimation (#39912)
(cherry picked from commit 9b520312a1)
2026-05-18 10:14:31 -07:00
Amin Ghadersohi d7fdb8a979 fix(mcp): validate column refs in generate_explore_link, update_chart_preview, and update_chart (#39797)
(cherry picked from commit 4a21a5365f)
(cherry picked from commit 7230edcb69869a342e80ca28d76ae1aec3612b80)
2026-05-17 21:37:15 -07:00
Richard Fogaca Nienkotter 4ad3053c7f fix(mcp): warn on invalid chart preview form data key (#39891)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 9459bc7bf4)
2026-05-17 21:37:04 -07:00
Joe Li b03b060533 fix(explore): add matrixify_enable guard to prevent stale validators on pre-revamp charts (#38765)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4b17ac2629)
2026-05-17 19:42:45 -07:00
jesperct bd8801cd5f test(plugin-chart-echarts): regression guards for temporal x-axis labels on timeseries charts (#39208)
(cherry picked from commit 5b5f23d127)
2026-05-17 18:08:11 -07:00
Amin Ghadersohi a4a85b09d1 fix(mcp): point get_dataset_info url to explore view instead of legacy tablemodelview edit (#39838)
(cherry picked from commit 673634f7af)
2026-05-16 23:09:18 -07:00
Amin Ghadersohi 53c2d1a31d feat(mcp): warn when execute_sql template_params used with templating disabled (#39858)
(cherry picked from commit 28239c18d4)
2026-05-16 22:39:51 -07:00
Enzo Martellucci 4bfaeb8f10 feat(mcp): add generate_bug_report tool with PII sanitization (#39595)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit e4fe08ab9e)
2026-05-15 20:10:15 -07:00
Enzo Martellucci fa9ecaa243 fix(mcp): fall back to title match when dashboard slug lookup misses (#39567)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit e3e834bbf7)
2026-05-15 20:09:55 -07:00
Richard Fogaca Nienkotter 8ba59e7351 fix(mcp): sanitize read path output for LLM context (#39738)
(cherry picked from commit c2b9272f4c)
2026-05-15 19:37:31 -07:00
Amin Ghadersohi 9af36ae61c feat(mcp): add get_chart_sql tool and expose chart filters in get_chart_info (#38700)
(cherry picked from commit 6948e73ec7)
2026-05-15 19:26:05 -07:00
Kamil Gabryjelski 65a03dd29a fix(mcp): Support form_data_key without chart identifier for unsaved charts (#38628)
(cherry picked from commit af5e05db2e)
2026-05-15 19:19:06 -07:00
Amin Ghadersohi 0b37b8211b chore(mcp): extract shared chart helpers and ASCII rendering into separate modules (#39438)
(cherry picked from commit e6853894ab)
2026-05-15 14:31:59 -07:00
Gabriel Torres Ruiz 9b94dde8fe fix(mcp): prevent LLM from creating new dashboard instead of adding chart to existing one (#39353)
(cherry picked from commit c289731212)
2026-05-15 11:33:39 -07:00
Maxime Beauchemin ef6c89dab5 fix(dataset-editor): fix SQL expression editor extra spaces and height expansion (#39248)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0aa8cace1b)
2026-05-15 10:49:01 -07:00
Maxime Beauchemin 9342573737 fix(tags): fix Bulk tag modal dropdown clipping and stale tag cache (#39210)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d915e4f3ff)
2026-05-15 09:14:38 -07:00
Amin Ghadersohi 2e502a4019 fix(mcp): add description and certification fields to default list tool columns (#39017)
(cherry picked from commit 7be2acb2f3)
2026-05-14 21:02:44 -07:00
Joe Li cc35510e3e fix(frontend): preserve absolute and protocol-relative URLs in ensureAppRoot (#38316)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 6c359733e1)
2026-05-14 16:49:37 -07:00
Elizabeth Thompson ab722c903e fix(dashboard): prevent duplicate subdirectory prefix when toggling fullscreen (#39534)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 86ba63b072)
2026-05-14 16:49:16 -07:00
Mafi 084a2018e4 fix(plugin-chart-ag-grid-table): use display text for filter and sort on HTML cells (#39885)
Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com>
(cherry picked from commit 187bb416e7)
2026-05-14 16:48:24 -07:00
Amin Ghadersohi 052ed7cacc feat(mcp): add query_dataset tool to query datasets using semantic layer (#39727)
(cherry picked from commit f29d82b3b1)
2026-05-12 14:50:26 -07:00
Joe Liandalex-poor d66d39fd1a feat(explore): add CSV/XLS download to drill-to-detail modal (#37109)
Adds CSV and XLSX download buttons plus an explicit reload control to the
drill-to-detail and drill-by modals. Adds a shared DownloadDropdown
component used by both modals.

Backport of #37109 from master to 6.0-release. Adapted for 6.0-release:
- All @apache-superset/core/* imports collapsed back to @superset-ui/core
  (the namespace refactor is master-only).
- canCopyClipboard from usePermissions is master-only; gated the new
  copy-disabled tooltip on canDownload instead until canCopyClipboard
  is ported.
- TabularDataRow type is master-only (utils/common is still .js); inlined
  as Record<string, unknown>[].
- The Explore pane Results/Samples tabs receive onDownloadCSV/
  onDownloadXLSX/onReload as optional props but the row-limit selector
  changes from master are intentionally omitted (master moved that area
  toward a different pattern that is not present on 6.0-release).
- Backend FRONTEND_CONF_KEYS gains ROW_LIMIT so the new drill download
  payload can read it from common.conf.

(cherry picked from commits fa31ec8, 967fa7b, 9ba8fda, b39419c, b74cc05,
15be40b, d8c8849, 6e1f03b, ca0e9cf, 76cdc1f)

Co-Authored-By: alex-poor <alex@karo.co.nz>
2026-05-11 11:34:59 -07:00
yousoph 012ea6dd59 fix(dashboards): sc 104687 chart name revert (#761) 2026-05-11 00:00:35 -07:00
Amin Ghadersohi 5d88ea00fa fix(mcp): rename _FastMCPValidationFilter to public symbol (#39722)
(cherry picked from commit 09c7e1fc08)
(cherry picked from commit bf1eb3d57e4d10a6c0a5ad15e8cab498c49b006f)
2026-05-08 15:46:58 -07:00
Enzo Martellucci baf1ba6b09 fix(reports): keep body sized so standalone screenshots don't time out (#39944)
(cherry picked from commit b5186d1c65)
2026-05-08 14:28:16 -07:00
Amin Ghadersohi 9039d1460c fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)
(cherry picked from commit 7774ec7e3c)
2026-05-08 12:59:05 -07:00
Mehmet Salih Yavuz c23bd3e8b9 fix(mcp): surface structured errors for generate_chart validation failures (#39484)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 3f28f5d012)
2026-05-08 12:55:26 -07:00
Beto Dealmeida 73db5fa5f4 feat(sqlglot): Vertica dialect (#39969)
(cherry picked from commit 4311a15eb2)
2026-05-08 11:49:22 -07:00
jesperct 6597bcecb8 fix(colors): reassign colliding series when dashboard locks shared dimension color (#39297)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 9e91ae8cff)
2026-05-08 11:48:54 -07:00
Vitor Avila fe1ab92778 fix: OpenSearch dialect identifier delimiters (#39953)
(cherry picked from commit ad5e3170dd)
2026-05-08 11:39:36 -07:00
Maxime Beauchemin b35fc63485 fix(ui): remove makeUrl() double-prefix bugs under subdirectory deployment (#39503)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
(cherry picked from commit aa710672ed)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi 327782d236 fix(mcp): classify user errors as WARNING, system errors as ERROR (#39634)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 6947881ba7)
2026-05-08 11:39:36 -07:00
Mehmet Salih Yavuz 64c1286f42 fix(plugin-chart-handlebars): preserve template on explore open (#39442)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit cf587caca7)
2026-05-08 11:39:36 -07:00
Enzo Martellucci 683d21580a fix(mcp): surface XSS sanitization in chart/dashboard names instead of silently stripping (#39491)
(cherry picked from commit d7941ccfec)
2026-05-08 11:39:36 -07:00
Enzo Martellucci 1e33a5d2ec fix(mcp): surface validation errors in generate_chart instead of empty response (#39522)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit dae79a6cba)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi 8b581d1345 chore(mcp): remove dead parse_request decorator and utility code (#39498)
(cherry picked from commit 29806780dc)
2026-05-08 11:39:36 -07:00
Kamil Gabryjelski 2f8440f496 fix(big-number): use correct default font size for subtitle/subheader (#39493)
(cherry picked from commit bf7ec853fa)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi d3cead1a69 fix(mcp): default XY chart x-axis to dataset primary datetime column (#39421)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 5cff657812)
2026-05-08 11:39:36 -07:00
Gabriel Torres Ruiz d37b592d3b fix(mcp): support explicit query_mode in TableChartConfig (#39412)
(cherry picked from commit 2e0d482ccf)
2026-05-08 11:39:36 -07:00
Gabriel Torres Ruiz ef826a9a50 fix(mcp): replace inputSchema with parameters_hint in search_tools results by default (#39411)
(cherry picked from commit e5b3a9c25d)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi 51d4a98d0a fix(mcp): always push fresh app context per tool call to prevent g.user race (#39385)
(cherry picked from commit e7b9fb277e)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi 3de3155838 fix(mcp): update instructions to use correct request wrapper and identifier params (#39392)
(cherry picked from commit 838ee870d0)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi 0afcfc37a2 fix(mcp): batch fix for execute_sql crashes, null timestamps, and deck.gl errors (#38977)
(cherry picked from commit daefedebcd)
2026-05-08 11:39:35 -07:00
Kamil Gabryjelski fc8f01c188 fix(explore): migrate from window.history to React Router history API (#38887)
(cherry picked from commit fc705d94e3)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi dcb5c21815 fix(mcp): honor target_tab parameter when adding charts to tabbed dashboards (#38409)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 3bb9704cd5)
2026-05-07 23:13:20 -07:00
Amin Ghadersohi a6b4623fe2 fix(mcp): improve default chart names with descriptive format (#38406)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0cfd760a36)
2026-05-07 23:06:14 -07:00
bdonovan1 351e08d487 fix(sqla): parenthesize calculated column expressions in WHERE clause (#39793)
Co-authored-by: Brian Donovan <briand@netflix.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
(cherry picked from commit 5b5dd01028)
2026-05-07 11:15:30 -07:00
Alexandru SoareandClaude Opus 4.7 0008a0606d fix(sql): quote identifiers in transpile_to_dialect to fix case-sensitive column filters (#39521)
(cherry picked from commit adfbbf1433)

Adapted: also lifts a small infrastructure slice from #37311 (commit
87bbd54d0a) — namely the source_engine
parameter and source_dialect logic on transpile_to_dialect, plus its
three accompanying unit tests. #37311 itself is a feature PR
(import-time virtual-dataset transpilation) that is not desired on
6.0-release; only the plumbing this fix relies on is included.

The source_engine plumbing is required because #39521's call site
passes source_engine=engine to make validate() idempotent on its
second pass: the second invocation re-parses already-transpiled output
that may contain dialect-specific quoting (e.g. MySQL/BigQuery
backticks) which the generic Dialect cannot handle. Without it, the
fix would introduce a new regression on those engines.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:42:18 -07:00
Enzo Martellucci 5b6a622c3f fix(reports): preserve urlParams in multi-tab report fan-out (#39884)
(cherry picked from commit 9aaa12c7d4)
2026-05-06 14:00:15 -07:00
Enzo Martellucci b73900a89e fix(echarts): increase default axis title margins to prevent label overlap (#39447)
(cherry picked from commit 1903b919d6)
2026-05-06 12:00:38 -07:00
Beto Dealmeida c520f6ec21 fix(clickhouse): prevent expensive table scan (#39867)
(cherry picked from commit 5325b87e73)
2026-05-06 11:49:41 -07:00
Joe Li 68050c4720 fix(theme): set color-scheme on html to fix dark mode scrollbars (#39704)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 7bee2afa8e)

Adapted: source path superset-frontend/packages/superset-core/src/theme/GlobalStyles.tsx
remapped to superset-frontend/packages/superset-ui-core/... — the superset-core
package rename (#38448) is not present on 6.0-release.
2026-05-06 11:47:57 -07:00
Geidō 8cb56acdc1 fix(dashboard): prevent duplicate screenshot downloads (#39525)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 4fcb3144ff)
2026-05-06 11:11:46 -07:00
Elizabeth Thompson bae1342956 fix(mcp): clear stale thread-local DB session in sync tool wrapper (#39798)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 98eaaaa6d6)
2026-05-01 11:12:10 -07:00
Elizabeth Thompson 1e40128f6f fix(reports): poll for spinner absence instead of snapshotting loading elements (#39579)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f0d521dfc2)
2026-04-30 14:41:56 -07:00
Vitor Avila 4f5152b17d fix: Enforce per-user caching on legacy API endpoint (#39789)
(cherry picked from commit 86eb6176d1)
2026-04-30 14:09:24 -07:00
Brian Schreder 9cd3e54a17 feat(dashboard): pre-filter time grain (#38922)
(cherry picked from commit a222dab781)
2026-04-30 12:32:33 -07:00
Daniel Vaz GasparandClaude Opus 4.6 bd720d57fb fix(mysql): fallback to pymysql when MySQLdb is not installed in get_datatype() (#39729)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-30 11:02:59 -07:00
Elizabeth Thompson be13d5001c feat(mcp): restore self-lookup via created_by_me flag (#39638)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d17c34068)
2026-04-30 11:02:59 -07:00
Richard Fogaca Nienkotter 04e7b705e2 fix(mcp): redact dashboard data model metadata (#39632)
(cherry picked from commit 57e563b177)
2026-04-30 11:02:59 -07:00
Richard Fogaca Nienkotter 8254f3b1f9 fix(mcp): protect data-model metadata from dashboard viewers (#39599)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit d79eb5842a)
2026-04-30 10:58:56 -07:00
Richard Fogaca Nienkotter ac86bcc518 fix(mcp): hide user directory metadata from responses (#39576)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 0d50fd676b)
2026-04-29 15:51:11 -07:00
Amin Ghadersohi 7599b3d92e fix(mcp): restore typed ChartConfig in tool schemas for LLM visibility (#39732)
(cherry picked from commit 4b42f82f13)
2026-04-29 11:59:50 -07:00
Daniel Vaz GasparandClaude Opus 4.6 c202f7637e fix(docs): correct broken link to security documentation (#722)
The networking-settings page linked to /docs/security/securing_superset
which doesn't exist. The correct path is /docs/security/security.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:13:08 -07:00
Daniel Vaz Gaspar be77acec4d chore(deps): bump pillow from 12.1.1 to 12.2.0 (#39590) 2026-04-29 09:12:55 -07:00
Joe Li 44c00a5173 refactor(chart): replace word cloud sort_by_series migration with code defaults (#39575)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 39f12786a2)
2026-04-29 09:12:55 -07:00
bdonovan1 be4991a286 fix(chart): word cloud secondary sort prevents Druid TopN optimization when sort_by_metric enabled (#39073)
Co-authored-by: Brian Donovan <briand@netflix.com>
(cherry picked from commit 78fb09695b)
2026-04-29 09:12:55 -07:00
Declan Zhao 1f0c4be92f feat(user_info): include Groups in user data payload when include_perms is True and show Groups on user_info page (#39450)
(cherry picked from commit 4ee3a0fc07)
2026-04-29 09:12:55 -07:00
Richard Fogaca Nienkotter 7af0c218a5 fix(dashboard): preserve dynamic group by column order (#39333)
(cherry picked from commit 0f417f0040)
2026-04-29 09:12:55 -07:00
Maxime Beauchemin 83d2cfb539 fix(charts): set g.form_data for metric() Jinja macro on GET chart data endpoint (#39347)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 151d7d76da)
2026-04-29 09:12:55 -07:00
Amin Ghadersohi ea91ae1d03 fix(mcp): sanitize chart config errors and accept field name aliases (#39606)
(cherry picked from commit ad20285dd6)
2026-04-29 09:12:55 -07:00
Amin Ghadersohi 5a6cd8f6db fix(mcp): resolve $ref by inlining definitions in compact schema (#39562)
(cherry picked from commit 012bf52c8c)
2026-04-29 09:12:55 -07:00
Maxime Beauchemin ef887b9a8c fix(dashboard): apply full transitive ancestor chain for dependent filters (#39504)
(cherry picked from commit 18d89f25ce)
2026-04-29 09:12:55 -07:00
Damian Pendrak aca0518fb3 fix(deckgl): UI fixes on deck.gl exclude layers (#38958)
(cherry picked from commit 230b25dd72)
2026-04-29 09:12:55 -07:00
Alexandru Soare 11f41f3e8a fix(mcp): Add defensive validator for ColumnInfo.is_nullable (#39365)
(cherry picked from commit 0857611a4e)
2026-04-29 09:12:55 -07:00
Geidō 68918706ea fix(dataset): calculated columns in virtual datasets fail when used as dynamic aggregation filter dimensions (#39004)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 51ea2c297d)
2026-04-29 09:12:55 -07:00
Mehmet Salih Yavuz 67c6956af1 feat(mcp): add a preview flow to mcp chart updates (#39383)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 69f062b804)
2026-04-29 09:12:55 -07:00
Mehmet Salih Yavuz dd3d543e09 fix(SelectFilter): auto clear search input (#39157)
(cherry picked from commit 7c76fd3d81)
2026-04-29 09:12:55 -07:00
Alexandru Soare 25f6866bdd feat(filters): Adding empty state for filter modal (#38909)
(cherry picked from commit 411f769896)
2026-04-29 09:12:55 -07:00
Alexandru Soare b88bd7d301 fix(MCP): fix MCP logs (#39159)
(cherry picked from commit ffcc6e8b63)
2026-04-29 09:12:55 -07:00
Mike Bridge db81802b8c fix(dashboard): allow filter list to scroll in filter config modal sidebar (#39203)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 7a243d329e)
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 f6f60266fb chore(deps): bump yaml from 1.10.2 to 1.10.3 in /superset-frontend (#697)
Fixes Uncontrolled Recursion vulnerability in yaml 1.x.
Updates 3 nested entries (storybook, babel-plugin-macros, superset-ui-demo).

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 aff4204c05 chore(deps): bump prismjs from 1.29.0 to 1.30.0 in /superset-frontend (#698)
Fixes Arbitrary Code Injection vulnerability in prismjs.

Note: refractor 3.6.0 pins prismjs ~1.27.0 — that nested entry requires
a refractor upgrade to fix (addressed separately).

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 bbfbc92590 chore(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /superset-frontend (#694)
Fixes Improperly Controlled Modification of Object Attributes vulnerability.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 4026e52d27 chore(deps): bump jws from 4.0.0 to 4.0.1 in /superset-frontend (#695)
Fixes Improper Verification of Cryptographic Signature vulnerability.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 2cb1ad79d7 chore(deps): bump ajv from 6.12.6 to 6.14.0 and 8.17.1 to 8.18.0 in /superset-frontend (#693)
Fixes ReDoS vulnerability (CVE) in ajv 8.17.1. Also bumps nested ajv 6.x
entries to 6.14.0 to match upstream.

Upstream: 577b965a60

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 eff77319e9 chore(deps-dev): bump copy-webpack-plugin to 14.0.0 and css-minimizer-webpack-plugin to 8.0.0 (#690)
Bumps copy-webpack-plugin 13.0.0→14.0.0 and css-minimizer-webpack-plugin
7.0.2→8.0.0 to resolve serialize-javascript 6.0.2→7.0.5 (CVE-2026-34043,
BDSA-2020-4569 CVSS 8.1, tagged Zero-click RCE).

Note: webpack's bundled terser-webpack-plugin still pulls serialize-javascript
6.0.2 as a transitive dep — requires webpack upgrade to fully resolve.

Cherry-picked from upstream apache/superset commits 361afff798, a2c23a2a58.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 f024995424 fix(security): add UserSAMLModelView to USER_MODEL_VIEWS (#39568)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 2f2418258a chore(deps): bump js-yaml from 3.14.1 to 3.14.2 and 4.1.0 to 4.1.1 in /superset-frontend (#687)
Bumps root js-yaml 3.14.1→3.14.2 and nested js-yaml 4.1.0→4.1.1
to address prototype pollution vulnerability (CVE-2025-64718, CVSS 9.8).
Lerna's exact-pinned 4.1.0 entries are left as-is since they require
that exact version.

Cherry-picked from upstream apache/superset commit 362b5e3b89.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Vitor Avila 8e754a1fc9 fix(OpenSearch): OpenSearch dialect for sqlglot (#39538) 2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 40724b2e2d chore(deps): bump lodash-es from 4.17.23 to 4.18.1 in /superset-frontend (#686)
Bumps lodash-es to ^4.18.1 in generator-superset to address prototype
pollution and arbitrary code injection vulnerabilities.

Cherry-picked from upstream apache/superset commit a9ced5c881.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz GasparandClaude Opus 4.6 806ee595df chore(deps): bump dompurify from 3.3.3 to 3.4.0 in /superset-frontend (#685)
Bumps dompurify to ^3.4.0 in superset-ui-core and legacy-preset-chart-nvd3
to address 3 known vulnerabilities (CVEs). Removes stale nested lock entries
so both workspace packages resolve to the hoisted 3.4.0.

Cherry-picked from upstream apache/superset commit 03725d1aaa.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
DeadmanMatthew DeadmanMatthew Deadmancodeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
e436c6bf05 feat(api): Add filter_dashboard_id parameter to apply dashboard filters to chart/data endpoint (#38638)
Co-authored-by: Matthew Deadman <matthewdeadman@Matthews-MacBook-Pro-2.local>
Co-authored-by: Matthew Deadman <matthewdeadman@matthews-mbp-2.lan>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-04-29 09:07:50 -07:00
Joe Li 5888707fc3 chore: package bumps (#39014) 2026-04-21 17:44:50 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 393047d201 chore(deps): bump pillow from 11.3.0 to 12.1.1 (#37935)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-21 17:01:20 +01:00
Joe Li b1004af91d fix(dashboard): restore groupby in buildExistingColumnsSet and guard null customization config (#39416)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit d3de16c5f5)
2026-04-20 16:10:13 -07:00
dependabot[bot] e85830bfea chore(deps): bump markdown-to-jsx from 9.7.13 to 9.7.15 in /superset-frontend (#39217)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 0d91f5e982)
2026-04-20 14:49:20 -07:00
dependabot[bot] c7aa7946c0 chore(deps): bump markdown-to-jsx from 9.7.6 to 9.7.8 in /superset-frontend (#38507)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 5f99d613a0)
2026-04-20 14:49:20 -07:00
dependabot[bot] 08adb0bcdc chore(deps): bump markdown-to-jsx from 9.7.4 to 9.7.6 in /superset-frontend (#38225)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 4809903bb8)
2026-04-20 14:49:20 -07:00
dependabot[bot] e7940d2df9 chore(deps): bump markdown-to-jsx from 9.7.3 to 9.7.4 in /superset-frontend (#37959)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit ffd7f10320)
2026-04-20 14:49:20 -07:00
dependabot[bot] 3f929c643c chore(deps): bump markdown-to-jsx from 9.7.2 to 9.7.3 in /superset-frontend (#37730)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 1c35c3f6d0)
2026-04-20 14:49:20 -07:00
dependabot[bot] c59576b288 chore(deps): bump markdown-to-jsx from 9.6.1 to 9.7.2 in /superset-frontend (#37691)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 27889651b3)
2026-04-20 14:49:20 -07:00
dependabot[bot] 0171080b2a chore(deps): bump markdown-to-jsx from 9.6.0 to 9.6.1 in /superset-frontend (#37420)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 09b5af5945)
2026-04-20 14:49:20 -07:00
dependabot[bot] 0df13f512a chore(deps): bump lodash from 4.17.23 to 4.18.1 in /superset-frontend (#39043)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit c372f5980c)
2026-04-20 14:49:20 -07:00
dependabot[bot] 61e8aeb2d8 chore(deps): bump dompurify from 3.3.2 to 3.3.3 in /superset-frontend (#38592)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit f4a57a13bc)
2026-04-20 14:49:20 -07:00
dependabot[bot] 212da53fa4 chore(deps): bump dompurify from 3.3.1 to 3.3.2 in /superset-frontend (#38455)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit d752be5f74)
2026-04-20 14:49:20 -07:00
Amin Ghadersohi a618135e6d fix(mcp): handle OAuth-authenticated databases in execute_sql (#39166) 2026-04-20 10:52:44 +01:00
Amin Ghadersohi d60ba0d93b fix(mcp): compress chart config schemas to reduce search_tools token usage (#39018) 2026-04-20 10:52:30 +01:00
Joe LiandClaude Opus 4.6 99d1ba9bcc revert: remove accidental hideTab guard from 6.0-release (#672)
The hideTab guard was unintentionally brought into 6.0-release during
the cherry-pick of #38809 (conflict resolution picked up the master
version which included #38846). Since hideTab was never intended for
6.0-release, remove the guard to restore the pre-regression behavior
where tabs always render and activeTabs populates correctly.

Fixes: SC-104110

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 18:34:20 -07:00
Joe Li ea970d5e5b fix(deckgl): complete scatterplot categorical color fix (#658)
* fix(deckgl): complete cherry-pick of scatterplot categorical color fix (#35537)

The original cherry-pick of apache/superset#35537 was incomplete — it
included CategoricalDeckGLContainer.tsx and controlPanel.ts but missed
buildQuery.ts and transformProps.ts. Those files still referenced
`category_name` while the UI control (deckGLCategoricalColor) saves to
`dimension`, causing the categorical column to never be included in the
query and cat_color to never be populated on data points.

Renames category_name → dimension in buildQuery.ts and transformProps.ts
to match the control panel field name, completing the fix.

[sc-99443]

* fix: update tests and fix sliceId typo in CategoricalDeckGLContainer

Addresses code review feedback:

1. buildQuery.test.ts: rename category_name → dimension in test data
   to match the interface change, preventing test failure

2. transformProps.test.ts: rename category_name → dimension in test
   data and update test name to reflect the current field name

3. CategoricalDeckGLContainer.tsx line 71: fix fd.sliceId → fd.slice_id
   (snake_case). This code path in getCategories() was previously
   unreachable because fd.dimension was always falsy. Now that the
   fix makes it live, the colorFn seed must use the correct field
   to match the rendering path at line 182.

* test: add negative-case regression guards for dimension field

Adds two tests that would have caught the original category_name vs
dimension mismatch:

1. buildQuery: when dimension is absent, no extra column is added
   to the query (only spatial columns remain)

2. transformProps: when dimension is absent, cat_color is not set
   on scatter points (stays undefined)

These guard against future regressions where the form field name
diverges from what buildQuery/transformProps read.
2026-04-17 18:34:10 -07:00
Amin Ghadersohi 2dbc887fab fix(mcp): surface OAuth auth URL when execute_sql hits OAuth-protected database (#670)
The cherry-pick of apache/superset#39166 onto 6.0-release (commit
3cda699864) dropped the changes to
superset/mcp_service/sql_lab/tool/execute_sql.py. As a result,
OAuth2RedirectError raised during SQL execution falls through to
ExecuteSqlCore._handle_execution_error, which only calls str(e) and
drops the authorization URL stored in ex.error.extra["url"].

Clients see error_type=OAUTH2_REDIRECT but no URL in the error body
("You don't have permission to access the data."), so the end user
has no way to start the OAuth flow.

Fix: handle OAuth2RedirectError and OAuth2Error explicitly in
_handle_execution_error and use build_oauth2_redirect_message to
extract the URL from extra, mirroring the behavior already present on
master in execute_sql.py.

[sc-102144]
2026-04-16 18:32:34 -03:00
Joe Li 63f8c6203f Revert "fix(pivot-table): safely cast numeric strings to numbers for date formatting (#38953)"
This reverts commit ff7685de52.
2026-04-16 09:58:19 -07:00
dependabot[bot] 418c3ee49d chore(deps): bump cryptography from 44.0.3 to 46.0.5 (#37912)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit dc995328a8)
2026-04-14 21:17:56 -07:00
Daniel Vaz Gaspar 114de77ee9 fix(deps): bump Python dependencies to fix 7 security vulnerabilities (#38447)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5c4bf0f6ea)
2026-04-14 12:14:07 -07:00
Alexandru Soare 2aee9517d2 fix(explore): Prevent error toast when navigating away from Explore page (#39065)
(cherry picked from commit 66a9e2e16e)
2026-04-14 09:48:00 -07:00
Alexandru Soare 10562ae344 fix(popup): Dropdown popup width doesn't match input width when tags collapse in oneLine mode (#39136)
(cherry picked from commit c2a35e2eea)
2026-04-14 09:43:57 -07:00
Alexandru Soare e7107b0f5c fix(select): select all button cutoff (#39005)
(cherry picked from commit 5138aa2c11)
2026-04-14 09:43:52 -07:00
Alexandru Soare ee2ae515bd fix(dashboard): Ensure screenshot downloads always generate fresh images/pdfs (#38880)
(cherry picked from commit 1462ac9282)
2026-04-13 16:39:24 -07:00
Amin Ghadersohi b5fd6197fa feat(mcp): add get_chart_type_schema tool for on-demand schema discovery (#39142)
(cherry picked from commit 5f9fc31ae2)
2026-04-13 16:39:24 -07:00
Amin Ghadersohi e4a0453b2e feat(mcp): add Big Number chart type support to MCP service (#38403)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4245720851)
2026-04-13 15:31:02 -07:00
Kamil Gabryjelski 476fc81fc7 fix(mcp): Created dashboard should be in draft state by default (#39011)
(cherry picked from commit 135e0f8099)
2026-04-13 15:30:50 -07:00
Geidō 782502cd14 fix(reports): log exception traceback in _get_csv_data (#39069)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 25eea295f6)
2026-04-13 15:30:38 -07:00
Michael S. Molina 850d4b655b fix(echarts): fix stacked horizontal bar chart clipping and duplicate x-axis labels (#39012)
(cherry picked from commit 022342839a)
2026-04-13 10:16:50 -07:00
Michael S. Molina 3818e57fac fix(dataset-editor): improve modal layout and fix Settings tab horizontal scroll (#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 38f0dc74f7)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 54f98293a4 fix(mcp): handle table chart raw mode in query builders and sanitize dashboard titles (#38990)
(cherry picked from commit 0bae05d4a9)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 36cf1845a4 fix(mcp): fix dashboard owners Pydantic crash and preserve chart preview filters (#38987)
(cherry picked from commit 190f1a59c5)
2026-04-13 10:16:50 -07:00
Michael S. Molina 02789bc723 fix(query): pass datasource table to template processor for schema-aware Jinja rendering (#38984)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 94d8735d4b)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 81db93122f fix(mcp): handle stale SSL connections, heatmap duplicate labels, and session rollback (#39015)
(cherry picked from commit b3a402d936)
2026-04-13 10:16:50 -07:00
JUST.in DO IT 7965fc7862 fix(dashboard): remove opacity on filter dropdown (#39074)
(cherry picked from commit c7d175b842)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 2540109ccf fix(mcp): improve execute_sql response-too-large error to suggest limit parameter (#39003)
(cherry picked from commit 851bbeea48)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 98aecb6248 fix(mcp): compress chart config schemas to reduce search_tools token usage (#39018)
(cherry picked from commit bf9aff19b5)
2026-04-13 10:16:50 -07:00
SBIN2010 8f0d01ca96 feat: Add currencies controls in country map (#39016)
(cherry picked from commit b05764d070)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi c982f0eb05 fix(mcp): add dynamic response truncation for oversized info tool responses (#39107)
(cherry picked from commit 83ad1eca26)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi 6f6fb14e1a fix(mcp): remove JWT ValueError g.user fallback in auth layer (#39106)
(cherry picked from commit 92747246fc)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi a93b0842bf fix(mcp): fix form_data null, dataset URL, ASCII preview, and chart rename (#39109)
(cherry picked from commit 7380a59ab8)
2026-04-13 10:16:50 -07:00
Maxime Beauchemin 1757ec5338 feat(mcp): add database connection listing and info tools (#39111)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit a62be684a0)
2026-04-13 10:16:49 -07:00
Sam Firke 5c64c2fe3e fix(SQL Lab): handle columns without names (#38986)
(cherry picked from commit 12eb40db01)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin aae9d4a251 fix(explore): handle boolean false values correctly in control rendering (#39172)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6ba9096870)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi e9c4d537b3 fix(mcp): resolve null fields in list_datasets, list_databases, and save_sql_query (#39206)
(cherry picked from commit 1bde6f3bfd)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin 954bb4c4b7 fix(frontend): fix loading spinner positioning in Save modal and filters panel (#39205)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: yousoph <sophieyou12@gmail.com>
(cherry picked from commit d63308ca37)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin 14f676e036 fix(ace-editor): style bracket matching to blend with theme (#39182)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b8b2bdedf9)
2026-04-13 10:16:49 -07:00
Luiz Otavio ffb66ad5bf fix: add template_processor so Jinja gets rendered before SQLGlot parse (#39207)
(cherry picked from commit 2e80f2a473)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin 938e6db229 fix(sqllab): use monospace font for SQL in database error messages (#39181)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit ed659958f3)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin 2ddfb4bd54 fix(plugin-chart-handlebars): improve CSS sanitization tooltip and hide when not needed (#39180)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 36de05fe36)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin f06a0c22ff fix(sqllab): demote "Save as new" button from primary to secondary (#39179)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 140f0001f2)
2026-04-13 10:16:49 -07:00
Michael S. Molina 41e19876c3 fix(explore): Unnecessary scroll bars appearing on charts in Explore (#39160)
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit 3a3a6536b7)
2026-04-13 10:16:49 -07:00
Alexandru Soare 31e2b33b03 fix(filterReports): _generate_native_filter() crashes on null/empty filterValues (#38954)
(cherry picked from commit 4f695e1b4d)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin 2113e9d28e fix(explore): constrain Edit Dataset modal height to prevent footer cutoff (#39211)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit bad5a35fce)
2026-04-13 10:16:49 -07:00
Mehmet Salih Yavuz 7e63aac9ff fix(AlertsReports): untie filters from alerts reports tabs flag (#38722)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 5263abdc60)
2026-04-13 10:16:49 -07:00
Enzo Martellucci 12b4dc4a4a fix(reports): escape SQL LIKE wildcards in find_by_extra_metadata (#38738)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 6649f35a0d)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi 3cda699864 fix(mcp): handle OAuth-authenticated databases in execute_sql (#39166)
(cherry picked from commit 68067d7f44)
2026-04-13 10:16:49 -07:00
Vitor Avila ece8b8ff5b fix: Drill to Detail for Embedded (#39214)
Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c7955a38ef)
2026-04-13 10:16:49 -07:00
Shaitan 8ffa2216b6 fix(sql-lab): apply access check in SqlExecutionResultsCommand (#38952)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f49310b8ff)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi af097d7857 fix(mcp): wire up compact schema serialization for search_tools results (#39229)
(cherry picked from commit e17cf3c808)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi 4f7e78d088 fix(mcp): strip json_metadata and position_json from get_dashboard_info response (#39101)
(cherry picked from commit 680cef0ee0)
2026-04-13 10:16:48 -07:00
Joe LiandClaude Opus 4.6 ff7685de52 fix(pivot-table): safely cast numeric strings to numbers for date formatting (#38953)
Manual adaptation of apache/superset#38953 for 6.0-release where
TableRenderers is .jsx (not .tsx). Adds convertToNumberIfNumeric()
helper and wraps dateFormatters calls to handle numeric timestamp
strings correctly.

(cherry picked from commit f1cd1ae710)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 10:16:48 -07:00
Kamil Gabryjelski 98cee6eafa feat(mcp): support saved metrics from datasets in chart generation (#38955)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 15bab227bb)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi 3cde64f1ed fix(mcp): validate dataset exists in generate_explore_link before generating URL (#38951)
(cherry picked from commit 89f7e5e7ba)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi 636bd9c77a fix(mcp): prevent PendingRollbackError from poisoned sessions after SSL drops (#38934)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d331a043a3)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi 3a82b4d931 fix(mcp): prevent GRID_ID injection into ROOT_ID on tabbed dashboards (#38890)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa1a69555b)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi 90830f2780 fix(mcp): remove @parse_request decorator for cleaner tool schemas (#38918)
(cherry picked from commit d1903afc69)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi 799f18a626 fix(mcp): prevent stale g.user from causing user impersonation across tool calls (#38747)
(cherry picked from commit 38fdfb4ca2)
2026-04-13 10:16:48 -07:00
Gabriel Torres Ruiz 4f06107761 fix(ag-grid): jpeg export of ag-grid tables (#38781)
(cherry picked from commit 69c8eef78e)
2026-04-13 10:16:48 -07:00
Maxime Beauchemin 9554280795 refactor(plugins): replace react-icons with antd icons, remove 83MB dependency (#39184)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 63cceb6a79)
2026-04-13 10:16:48 -07:00
venkateshwaran shanmugham ae1387ed41 fix: implement native browser fullscreen for dashboard charts (#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 e39dd1afce)
2026-04-13 10:16:48 -07:00
Enzo Martellucci deb64d2595 fix(table): cross-filtering breaks after renaming column labels via Custom SQL (#38858)
(cherry picked from commit aba7e6dae4)
2026-04-13 10:16:48 -07:00
Maxime Beauchemin a2176c30a8 fix(explore): add left-indentation to control panel hierarchy (#39177)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit a64609f4f3)
2026-04-13 10:16:48 -07:00
Mike Bridge 65660bfa99 fix(dashboard): Vertical filter bar gradient is extending past the filter bar area (#39204)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 8bcc90c766)
2026-04-13 10:16:48 -07:00
Richard Fogaca Nienkotter 78507c97de fix(echarts): prevent tooltip crash during dashboard auto-refresh (#39277)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit e9911fbac4)
2026-04-13 10:16:48 -07:00
Đỗ Trọng Hải d4e59a205c fix(AlteredSliceTag): not display undefined filter value for chart change record (#38883)
Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 11f2140c37)
2026-04-13 10:16:48 -07:00
Daniel Vaz GasparandClaude Opus 4.6 aa41f8d48c feat: role/user CRUD events and login/logout tracking in the action log (#39121)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:25:19 -07:00
Elizabeth Thompson b36300201f fix(reports): propagate PlaywrightTimeout so execution transitions to ERROR state (#39176)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 587fe4af63)
2026-04-09 14:57:58 -07:00
Michael S. Molina 45d2a35ad2 chore(deps): Upgrade sqlglot from 27.15.2 to 28.10.0 (#37841)
(cherry picked from commit c41942a38a)
2026-04-09 14:57:58 -07:00
Enzo Martellucci 8768c51e02 fix(charts): add X Axis Number Format control for numeric X-axis columns (#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 e0a0a22542)
2026-04-09 14:57:58 -07:00
Enzo Martellucci e7efb67f3e fix(echarts): adapt y-axis ticks and padding for compact timeseries charts (#38673)
(cherry picked from commit f0b20dc445)
2026-04-08 14:54:39 -07:00
Enzo Martellucci c87cefbb56 fix(select): ensure filter dropdown matches input field width (#38886)
(cherry picked from commit 41d401a879)
2026-04-08 14:43:15 -07:00
Amin Ghadersohi 1a819812f8 fix(mcp): enforce MAX_PAGE_SIZE limit on list tools to prevent oversized responses (#38959)
(cherry picked from commit 2c9cf0bd55)
2026-04-01 10:50:34 -07:00
Amin Ghadersohi e2f50f7dab fix(mcp): resolve chatbot tool call flakiness with URL and instruction fixes (#38532)
(cherry picked from commit 6ef4794778)
2026-03-30 15:57:47 -07:00
Richard Fogaca Nienkotter c5d51ed944 fix(dataset): add missing currency_code_column to DatasetPostSchema (#38853)
(cherry picked from commit 9c288d66b5)
2026-03-30 14:39:16 -07:00
Mehmet Salih Yavuz ed6e4566c3 fix(Timeseries): dedup x axis labels (#38733)
(cherry picked from commit f832f9b0d5)
2026-03-30 11:41:38 -07:00
Enzo Martellucci 0c2d789a89 fix(reports): PUT with empty recipients list does not persist the change (#38711)
(cherry picked from commit 40387d5daa)
2026-03-27 15:14:01 -07:00
Alexandru Soare acfc93c893 refactor(passwords): accept passwords via YAML file (#38059)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 5c782397bb)
2026-03-27 15:13:41 -07:00
Alexandru Soare 680c0afd59 fix(report): raise warning when filter type not recognized (#38676)
(cherry picked from commit 37c4a36fdb)
2026-03-27 14:53:36 -07:00
Mehmet Salih Yavuz d0448991bd fix(MainNav): display all menu items on smaller screens (#38732)
(cherry picked from commit fdcb942f3c)
2026-03-27 14:53:36 -07:00
Beto Dealmeida 13cf98e91f feat: prevent Postgres connection to Redshift (#38693)
(cherry picked from commit 5d9f53ff0c)
2026-03-27 14:53:36 -07:00
Amin Ghadersohi 86d52d1d97 fix(mcp): add try/except around DAO re-fetch to handle session errors in multi-tenant (#38859)
(cherry picked from commit 6dc3d7ad9f)
2026-03-27 14:53:36 -07:00
Beto Dealmeida 31df4f273b fix: type probing (#38889)
(cherry picked from commit 8983edea66)
2026-03-27 14:53:36 -07:00
Enzo Martellucci 6eb942c014 fix(sqla): parenthesize extras where/having clauses in query generation (#38183)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c7a1f57487)
2026-03-27 14:53:36 -07:00
Alexandru Soare c6bb30de1d fix(keys): Unsafe dict access in get_native_filters_params() crashes execution (#38272)
(cherry picked from commit 89d1b80ce7)
2026-03-27 09:31:34 -07:00
Joe Li fe5094c350 fix(models): correct TabState.latest_query_id column type to match FK target (#38837)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4b26f8c712)
2026-03-26 13:34:31 -07:00
Amin Ghadersohi 6df97feb98 feat(api-keys): add API key authentication via FAB SecurityManager (#37973)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
(cherry picked from commit 811dcb3715)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi 45ec9f2cb5 fix(mcp): add permission checks to generate_dashboard and update_chart tools (#38845)
(cherry picked from commit 23a5e95884)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski 87559699d7 fix(mcp): detect unknown chart config fields and suggest correct ones (#38848)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 16f5a2a41a)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi 8dd1088c34 fix(mcp): fix generate_dashboard cross-session SQLAlchemy error (#38827)
(cherry picked from commit 09594b32f9)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi 59dcbe1850 fix(mcp): convert adhoc filters to QueryObject format before query compilation (#38774)
(cherry picked from commit 44c2c765ae)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi 5f6604b874 fix(mcp): normalize call_tool proxy arguments to prevent encoding TypeError (#38775)
(cherry picked from commit 0d5721910e)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski 29285560cc fix(mcp): fix detached Slice instance error in chart/dashboard serialization (#38767)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 1d72480c17)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi 3cc27a8b06 feat(mcp): Add tool annotations for MCP directory compliance (#38641)
(cherry picked from commit 1c8224f4c6)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi f17351c5e2 feat(mcp): add Handlebars chart type support to MCP service (#38402)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c596df9294)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski 847143d9e6 fix(mcp): Chart schema followups - DRY extraction, template fix, alias and test gaps (#38746)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 211f29b723)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski 3411a435c8 fix: Add aliases and groupby list to chart schemas (#38740)
(cherry picked from commit 14b1b456e1)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski fd16e3b870 fix: Row limit support for chart mcp tools (#38717)
(cherry picked from commit a314e5b35e)
2026-03-25 19:24:49 -07:00
Amin Ghadersohi d33cd49e84 fix(mcp): expose individual tool parameters when MCP_PARSE_REQUEST_ENABLED=False (#38714)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit e02ca8871d)
2026-03-25 19:24:49 -07:00
Kamil Gabryjelski f6c23692bf fix(mcp): use correct permission class for save_sql_query tool (#38764)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 5e5c05362c)
2026-03-25 15:36:06 -07:00
Amin Ghadersohi 2c36fb6860 fix(mcp): return all statement results for multi-statement SQL queries (#38388)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b6c3b3ef46)
2026-03-25 11:16:24 -07:00
Mehmet Salih Yavuz 7ab7e501f0 fix(Matrixify): readd matrixify_enable guard missing (#38759)
(cherry picked from commit 7222327992)
2026-03-24 15:43:40 -07:00
Amin Ghadersohi 4a04cefef4 fix(mcp): prevent encoding errors and fix tool bugs on MCP client transports (#38786)
(cherry picked from commit ed3c5280a9)
2026-03-24 15:39:33 -07:00
Amin Ghadersohi b56d6a4628 fix(mcp): fix dashboard slug null and execute_sql encoding error (#38710)
(cherry picked from commit c2a21915ff)
2026-03-24 15:29:07 -07:00
Alexandru Soare 8440925b24 fix(button): Theming configurations for button elements is not consistent (#38604)
(cherry picked from commit 82a74c88aa)
2026-03-24 13:01:40 -07:00
Mehmet Salih Yavuz a23acd9253 feat(theming): Custom label tokens (#38679)
(cherry picked from commit 86a260e39b)
2026-03-24 13:01:40 -07:00
Enzo Martellucci ae46f586bc fix(reports): validate nativeFilters on report create/update and deactivate on dashboard filter deletion (#38715)
(cherry picked from commit e088979fbe)
2026-03-23 16:49:13 -07:00
Mehmet Salih Yavuz 76a81dd59b fix(AlertsReports): validate anchor_list is a list (#38723)
(cherry picked from commit 100ad7d9ee)
2026-03-23 16:49:08 -07:00
Enzo Martellucci 5b82fb60f6 feat(themes): add JSON formatting to theme modal editor (#38739)
(cherry picked from commit cbb2b2f3c2)
2026-03-23 16:46:51 -07:00
Mehmet Salih Yavuz 051fbd386a chore(Reports): remove unused and incorrect field (#38724)
(cherry picked from commit 44179199ba)
2026-03-23 16:44:22 -07:00
Levis Mbote b557a467db fix(explore): display actual data type instead of "column" in column tooltip (#38554)
(cherry picked from commit e67bc5bee5)
2026-03-23 16:44:17 -07:00
Mehmet Salih Yavuz 5f54389754 fix(DropdownContainer): add fresh to avoid stale data (#38702)
(cherry picked from commit cc34d19d24)
2026-03-23 15:31:16 -07:00
Amin Ghadersohi f0c542dcd7 feat(mcp): add BM25 tool search transform to reduce initial context size (#38562)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 97a66f7a64)
2026-03-22 11:44:35 -07:00
Joe Li 654bcd6b3f fix(dashboard): use inline theme data to prevent 403 for non-admin users (#38384)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 03de7e1ec6)
2026-03-20 11:36:09 -07:00
Levis Mbote 5e1a89644e fix(dashboard): correct tab underline width for newly added dashboard tabs. (#38524)
(cherry picked from commit ee233d16d6)
2026-03-20 10:39:55 -07:00
Levis Mbote 7a7840ec83 fix(theme): ensure colorLink follows colorPrimary when not explicitly set (#38517)
(cherry picked from commit 65f13f773e)
2026-03-20 09:34:35 -07:00
Amin Ghadersohi cc76855755 fix(mcp): replace uuid with url and changed_on_humanized in default list columns (#38566)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fc156d0014)
2026-03-20 09:34:35 -07:00
Levis Mbote 7848a8c33e fix(theme): persist local theme id so "Local" tag remains after navigation (#38527)
(cherry picked from commit b754f2d173)
2026-03-20 09:34:35 -07:00
Levis Mbote 46deb48d1b fix(timeseries-table): enable proper column sorting in timeseries-table chart (#38579)
(cherry picked from commit 6b9dd23e3a)
2026-03-20 09:34:34 -07:00
Alexandru Soare fd9e0c076c fix(firebolt): Firebolt SQL entered with EXCLUDE is rewritten to EXCEPT (#38742)
(cherry picked from commit 6465450b64)
2026-03-20 09:34:34 -07:00
Amin Ghadersohi 289602d160 fix(mcp): fix crashes in list tools, dataset info, chart preview, and add owner/favorite filters (#38277)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d5cf77cd60)
2026-03-20 09:34:34 -07:00
Amin Ghadersohi a26f76fcb0 feat(mcp): add save_sql_query tool for SQL Lab saved queries (#38414)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 48220fb33f)
2026-03-18 12:56:12 -07:00
Beto Dealmeida a8d7481c92 feat: apply RLS conservatively (#38683)
(cherry picked from commit a854fa60a2)
2026-03-17 09:23:50 -07:00
Amin Ghadersohi 43567f2172 fix(mcp): wrap LoggingMiddleware.on_message event_logger in try/except (#38560)
(cherry picked from commit 6d7cfac8b2)
2026-03-17 09:17:35 -07:00
Joe Li 29416f48cc fix(embedded): default to light theme instead of system preference (#38644)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa5adb0fce)
2026-03-16 09:48:08 -07:00
Mehmet Salih Yavuz d896d48f24 feat(matrixify): Revamp control panel (#38519)
(cherry picked from commit ed622e254a)
2026-03-14 09:50:36 -07:00
Enzo Martellucci 26ff84377f fix(explore/dashboard): fix CSV/Excel downloads for legacy chart types (#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 9516d1a306)
2026-03-14 09:09:55 -07:00
Amin Ghadersohi 48de355979 feat(mcp): add extra_form_data param to get_chart_data for dashboard filters (#38531)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit f458e2d484)
2026-03-13 23:20:24 -07:00
Amin Ghadersohi f6e2c7c730 fix(mcp): extract role names as strings in UserInfo serialization (#38612)
(cherry picked from commit d4f1f8db00)
2026-03-13 23:19:42 -07:00
Amin Ghadersohi c0d21dc0c2 feat(mcp): implement RBAC permission checking for MCP tools (#38407)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7943af359c)
2026-03-13 23:11:32 -07:00
Amin Ghadersohi c9ee19fdad feat(mcp): auto-generate dashboard title from chart names when omitted (#38410)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit eb77452857)
2026-03-13 16:24:39 -07:00
Alexandru Soare e6a3262c2d fix(matrixify): Matrixify to not override slice id (#38515)
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 27197faba9)
2026-03-13 15:22:37 -07:00
Rafael BenitezandClaude Opus 4.6 b5906a36c1 fix(world-map): add fallback fill color when colorFn returns null (#38602)
Adapted from master commit ba7271b to WorldMap.js (JS) on 6.0-release.

- Accepted: null-safe extents, fallback colorFn, ?? theme.colorBorder
- Accepted: 3 new tests adapted for 6.0-release test structure
- Rejected: TypeScript conversion (file is .js on this branch)

(cherry picked from commit ba7271b4d8)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:21:36 -07:00
Alexandru Soare 3954ace76c fix(timeshiftcolor): Time shift color to match the original color (#38473)
(cherry picked from commit f6106cd26f)
2026-03-13 15:11:20 -07:00
Enzo Martellucci de8ff8e27a fix(deckgl): polygon chart not rendering when boundary column contains nested geometry JSON (#38595)
(cherry picked from commit 32a64d02c7)
2026-03-13 15:06:26 -07:00
Mehmet Salih Yavuz 8d24548b52 fix: add parent_slice_id for multilayer charts to embed (#38243)
(cherry picked from commit 95f61bd223)
2026-03-13 12:07:18 -07:00
Mehmet Salih Yavuz c383a3bbe7 fix: add embedded box sizing rule for layout (#38351)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 7f476a79b3)
2026-03-13 08:59:09 -07:00
Daniel GasparandClaude Opus 4.6 5fed167e11 feat(auth): add SAML login support to frontend (#38606)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:06:32 +00:00
Alexandru Soare 7f7eb90dc4 fix(bug): Error when adding a filter using custom sql (#38246)
(cherry picked from commit 880cab58c3)
2026-03-12 21:41:17 -07:00
Yuriy Krasilnikov 3857fae5ab fix(embedded): prevent double RLS application in virtual datasets (#37395)
(cherry picked from commit 09e9c6a522)
2026-03-12 14:54:59 -07:00
Amin Ghadersohi 2011d7497b fix(charts): set reasonable default y-axis title margin to prevent label overlap (#38389)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fe7f220c21)
2026-03-11 18:10:33 -07:00
Amin Ghadersohi 089e39defa feat(mcp): add horizontal bar chart orientation support to generate_chart (#38390)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6342c4f338)
2026-03-11 18:09:45 -07:00
Amin Ghadersohi 182f086a61 fix(mcp): add guardrails to prevent LLM artifact generation (#38391)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5fa70bdbd8)
2026-03-11 17:45:22 -07:00
Amin Ghadersohi 6be0727015 fix(mcp): add missing command.validate() to MCP chart data tools (#38521)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 2a876e8b86)
2026-03-11 17:42:08 -07:00
Đỗ Trọng Hải 410418e616 fix(plugin/cal-heatmap): properly color tooltip's text for both dark/light theme (#38010)
(cherry picked from commit a30492f55e)
2026-03-11 17:33:29 -07:00
yousoph e2ac463087 fix(dashboard): prevent Apply button from disabling when required filters are auto-applied (#38479)
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 62cebc8a0e)
2026-03-11 16:17:57 -07:00
Amin Ghadersohi 0e42f18746 fix(mcp): improve prompts, resources, and instructions clarity (#37389)
(cherry picked from commit 1ee14c5993)
2026-03-11 15:24:58 -07:00
Vitor Avila 397433786d feat: support for import/export masked_encrypted_extra (frontend) (#38078)
(cherry picked from commit d9a91f99db)
2026-03-11 14:34:43 -07:00
Vitor Avila 88480c5ea4 feat: support for import/export masked_encrypted_extra (backend) (#38077)
(cherry picked from commit 8c9efe5659)
2026-03-11 14:05:09 -07:00
Vitor Avila 780607c1e6 feat: Labels for encrypted fields (#38075)
(cherry picked from commit 228b598409)
2026-03-10 21:52:41 -07:00
Amin Ghadersohi 9fcb6f401d feat(mcp): add pie, pivot table, and mixed timeseries chart creation support (#38375) 2026-03-10 16:55:32 -07:00
Amin Ghadersohi d1a4352a82 feat(mcp): add compile check to validate chart queries before returning (#38408)
(cherry picked from commit 3609cd9544)
2026-03-10 16:45:43 -07:00
Amin Ghadersohi bce38fcda3 fix(mcp): suppress third-party deprecation warnings from client responses (#38401)
(cherry picked from commit 7d2efd8c1a)
2026-03-10 14:55:20 -07:00
Amin Ghadersohi 4f55739936 fix(mcp): use broad Exception in outermost tool-level handlers (#38254)
(cherry picked from commit abf0b7cf4b)
2026-03-10 14:37:48 -07:00
Amin Ghadersohi 3df5816400 fix(mcp): add eager loading to get_info tools to prevent N+1 query timeouts (#38129)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c54b21ef98)
2026-03-10 14:04:30 -07:00
Amin Ghadersohi 55802de557 feat(mcp): support unsaved state in Explore and Dashboard tools (#37183)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 3084907931)
2026-03-10 13:52:17 -07:00
Amin Ghadersohi 7e0535eade fix(mcp): fix dashboard chart placement with proper COLUMN layout and tab support (#37970)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6e94a6c21a)
2026-03-10 13:24:18 -07:00
Gabriel Torres Ruiz ee5b64fcef fix(dashboard): ensure clear all respects required filter validation (#37681)
(cherry picked from commit bc99b710bd)
2026-03-09 13:51:45 -07:00
yousoph a10ca5614d fix(charts): revert: improve negative stacked bar label positioning and accessibility (#37405) (#38484)
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 9983e255f8)
2026-03-09 11:57:14 -07:00
yousoph ac059ef879 fix(heatmap): correct tooltip display to show axis values instead of indices (#38487)
(cherry picked from commit 577654cd02)
2026-03-09 11:52:12 -07:00
Gabriel Torres Ruiz 2077439423 fix(theme): prevent background color flash on page load (#38399)
(cherry picked from commit dca41f9a7b)
2026-03-09 10:32:11 -07:00
Beto Dealmeida 443fa69686 feat(alerts/reports): external URL warning (#35021)
(cherry picked from commit 03ad1789f0)
2026-03-09 10:17:13 -07:00
Vitor Avila 3895c754ba feat: Support OAuth2 single-use refresh tokens (#38364)
(cherry picked from commit fa34609952)
2026-03-09 10:16:32 -07:00
Amin Ghadersohi f5d6a73da1 fix: silence deprecation warnings causing noisy production logs (#38128)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 01d5245cd2)
2026-03-08 20:31:51 -07:00
Amin Ghadersohi 80bb47a15b fix(screenshots): downgrade screenshot timeout logs from ERROR to WARNING (#38130)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 985c3d12a1)
2026-03-08 20:31:20 -07:00
Amin Ghadersohi a4d7521a40 feat(mcp): add user roles to MCP response and permission-aware instructions (#38367)
(cherry picked from commit db7665c0bc)
2026-03-08 20:28:09 -07:00
Vitor Avila ecafff68a6 fix: more DB OAuth2 fixes (#37398)
(cherry picked from commit 6043e7e7e3)
2026-03-08 18:00:26 -07:00
Antonio Rivero 660efb4f66 chore(playwright): Using warning for timeouts (#38441)
(cherry picked from commit 20cc3345d8)
2026-03-07 23:06:57 -08:00
Enzo Martellucci aef92c5dd7 fix(dashboard): fix multiple drag-and-drop and edit mode issues (#37891)
(cherry picked from commit f0416eff78)
2026-03-07 18:25:57 -08:00
Alexandru Soare 340789892d fix(bugs): fixing bugs for world map chart (#38030)
(cherry picked from commit 7743183401)
2026-03-07 18:25:31 -08:00
Joe Li 5f13ad81e8 fix(echarts): adaptive formatting labels (#38017) 2026-03-06 09:42:22 -08:00
Joe Li d44c5ebc08 fix(alerts): fix error toast when editing report with saved tab selection (#38198)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 939e4194c6)
2026-03-06 09:42:22 -08:00
Alexandru Soare 25fb18c5e8 fix(componentParent): Newly created tabs don't show up in Scoping tab (#37807)
(cherry picked from commit 761cee2d85)
2026-03-04 22:21:01 -08:00
Enzo Martellucci 60c56a5125 fix(explore): prevent TypeError when chart dimension returns empty string (#38276)
(cherry picked from commit 016417f793)
2026-03-04 21:34:31 -08:00
Mehmet Salih Yavuz da4d0c3399 fix(Select): select all buttons to inherit font (#38313)
(cherry picked from commit ac2914486f)
2026-03-04 21:30:34 -08:00
Vitor Avila 98f6db917f chore: Support specifying app_root via superset_config.py (#38284)
(cherry picked from commit 6fe69fc81c)
2026-03-04 21:27:27 -08:00
Joe Li d3250bc7ea fix(reports): validate database field on PUT report schedule (#38084)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5eb35a4795)
2026-03-04 21:26:19 -08:00
Amin Ghadersohi 457a3407c2 feat(mcp): add detailed JWT error messages and default auth factory fallback (#37972)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit ae99b19422)
2026-03-01 10:39:16 -08:00
Amin Ghadersohi 813cc00f95 feat(mcp): add response size guard to prevent oversized responses (#37200)
(cherry picked from commit cc1128a404)
2026-03-01 10:38:47 -08:00
Amin Ghadersohi aceb2de180 fix(mcp): normalize column names to fix time series filter prompt issue (#37187)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a1312a86e8)
2026-03-01 10:38:14 -08:00
Amin Ghadersohi 3cbb208b4f feat(mcp): dynamic feature availability via menus and feature flags (#37964)
(cherry picked from commit 1cd35bb102)
2026-03-01 10:37:51 -08:00
Kamil Gabryjelski 26271c8c35 fix: Warning toasts when user drops folder item outside of dnd context (#38304)
(cherry picked from commit 1d141b2948)
2026-03-01 00:54:22 -08:00
Mehmet Salih Yavuz 0376806615 fix(Dataset Folders): improve search-collapse (#38188)
(cherry picked from commit 7f280f5de9)
2026-03-01 00:54:22 -08:00
Joe Li 78b159169b feat(folders-editor): drag entire folder block as single unit (#38122)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 63f1d9eb98)
2026-03-01 00:54:22 -08:00
Joe Li 4fc7e43ad2 fix(folders): remove stale column/metric refs from folders on delete (#38302)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5e890a8cf7)
2026-03-01 00:54:22 -08:00
Kamil Gabryjelski ceeac7039e fix(folders): expand collapsed folders on Select All and add selection counter (#38270)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 11dfda11d3)
2026-02-28 23:43:42 -08:00
Kamil Gabryjelski 9b8e501b1d feat: Persist default folders location when repositioned in folders editor (#38105)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 660357c76b)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski d0ebe47868 fix: Badge count in folders editor (#38100)
(cherry picked from commit 86c8fa5cd7)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski 95e2575cf6 fix(dataset-modal): show warning toast when dropping items outside folders (#38257)
Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
(cherry picked from commit 2ecfb3406c)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski 7079a12938 fix(dataset-modal): prevent shift-select from selecting search-hidden items (#38255)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7f72c747f5)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski fc53623c6d fix(dataset-modal): fix drag overlay shift caused by modal transform containing block (#38274)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 8a053bbe07)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski f8b0c37d45 fix(dataset-modal): include nested folders when dragging all their children (#38275)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0827ec3811)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski 56973bf76a fix(button): use colorLink token for link-style buttons (#38121)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7937246575)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski 44ea2dddc2 fix(dataset-modal): fix folders tab scrollbar by establishing proper flex chain (#38123)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit e30a9caba5)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski a3fbf90cd3 fix: Warning toast copy in folders editor (#38099)
(cherry picked from commit e12140beb6)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski fd9ebdecae fix: Search in folders editor with verbose names (#38101)
(cherry picked from commit f049d3e34a)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski c645c6b6cd feat: Larger folder drag area in folders editor (#38102)
(cherry picked from commit b7a3224f04)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski d8d7e674c2 feat: Dataset folders editor (#36239)
(cherry picked from commit a6a66ca483)
(cherry picked from commit 3cb90d7cc093d03403598397e6aadd69be47e9b0)
2026-02-28 23:33:54 -08:00
Joe Li 05f564754f feat: auto refresh dashboard (#37459) 2026-02-28 23:33:54 -08:00
Joe LiandClaude Opus 4.6 44579ae8a6 fix(crud): reorder table actions + improve react memoization + improve hooks (#37897)
(cherry picked from commit 6fdaa8e9b3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:54 -08:00
Joe LiandClaude Opus 4.6 eb63e4b74f feat(embedded): add feature flag to disable logout button in embedded contexts (#37537)
(cherry picked from commit e06427d1ef)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:54 -08:00
Joe LiandClaude Opus 4.6 c0932f79a3 fix(mcp): validate chart datasets and narrow exception handlers (#38119)
(cherry picked from commit eef4d95c22)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe LiandClaude Opus 4.6 e272c186f6 perf(security): cache RLS filters per-request to avoid repeated DB queries (#38110)
(cherry picked from commit 3e3c9686de)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe LiandClaude Opus 4.6 ee9e19b9bf feat(oauth2): add PKCE support for database OAuth2 authentication (#37067)
(cherry picked from commit 5d20dc57d7)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe LiandClaude Opus 4.6 6490cfbd6b feat(themes): add enhanced validation and error handling with fallback mechanisms (#37378)
(cherry picked from commit 0d5ddb3674)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:27 -08:00
Joe LiandClaude Opus 4.6 a003dceff4 perf(dashboard): skip thumbnail_url computing on single dashboard endpoint (#38015)
(cherry picked from commit f5a5a804e2)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:23 -08:00
Joe LiandClaude Opus 4.6 6995d7c2ad fix(alerts): show friendly filter names in report edit modal (#38054)
(cherry picked from commit 6a61baf5be)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:12 -08:00
Joe LiandClaude Opus 4.6 f656b90e71 fix(chart): make chart error banners non-dismissible (#38014)
(cherry picked from commit c1c012fb52)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:29:24 -08:00
Joe LiandClaude Opus 4.6 3fb3694b21 fix(save-chart): fix info icon alignment in save chart modal (#37708)
(cherry picked from commit bbafae5f62)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:29:24 -08:00
Vitor Avila 1d8d25e5ba fix: Allow non-owners to fave/unfave charts (#38095) 2026-02-27 20:29:24 -08:00
JUST.in DO IT 960da53633 fix(world-map): reset hover highlight on mouse out (#37716)
Co-authored-by: Arunodoy18 <arunodoy630@gmail.com>
(cherry picked from commit a04571fa20)
2026-02-27 20:29:21 -08:00
Enzo Martellucci 5f6cc13b53 fix(alert-modal): show the add filter button on firefox (#38093)
(cherry picked from commit 26053a8b5d)
2026-02-27 20:28:50 -08:00
Enzo Martellucci 87b936f93b fix(chart): prevent x-axis date labels from disappearing when rotated (#37755)
(cherry picked from commit 5a134170a0)
2026-02-27 20:28:50 -08:00
Mehmet Salih Yavuz 0d155c4b64 fix(GAQ): don't use async queries when cache timeout is -1 (#38089)
(cherry picked from commit e4a7cd30c3)
2026-02-27 20:28:50 -08:00
Vitor Avila 9f8c2964a2 fix: Include app_root in next param (#37942)
(cherry picked from commit 9ec56f5f02)
2026-02-27 20:28:50 -08:00
Felipe López 2df50370e3 fix(charts): missing globalOpacity prop with mapbox (#37168)
(cherry picked from commit 319a131ec9)
2026-02-27 20:28:49 -08:00
Felipe López a1ce95b14d fix(charts): numerical column for the Point Radius field in mapbox (#36962)
(cherry picked from commit 675a4c7a66)
2026-02-27 20:28:47 -08:00
Elizabeth Thompson a1a4ca0238 refactor(db): use Dialect instead of Engine in select_star to avoid SSH tunnels (#35540)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e9b494163b)
2026-02-23 11:39:59 -08:00
Gabriel Torres Ruiz 221bbd6d41 test(native-filters): add unit tests for requiredFirst filter logic (#37640)
(cherry picked from commit 75fa474fce)
2026-02-23 11:38:24 -08:00
yousoph 922857f0eb fix(dashboard): update chart customization UI text to "Display controls" (#37462)
Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5fa6925522)
2026-02-23 11:20:12 -08:00
Joe LiandClaude Opus 4.6 055f4cd081 fix(chart-customizations): support migration of dynamic group by (#37176)
(cherry picked from commit 1a77e17179)

Adapted:
- hydrate.ts → hydrate.js: removed TypeScript type assertions, kept JS-compatible imports

Accepted:
- Legacy chart customization format migration (migrateChartCustomization utility)
- LEGACY_GROUPBY_PREFIX support in filter state management
- Dashboard.ts type additions for legacy format
- 490-line test suite

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:19:54 -08:00
Damian Pendrak 2e29c23f9c fix(deckgl): remove dataset field from Deck.gl Layer Visibility Display controls (#37611)
(cherry picked from commit 22ac5e02b6)
2026-02-23 11:18:56 -08:00
Damian Pendrak 256ad817bc feat(dashboard): chart customizations modal and plugins (#36062) 2026-02-23 11:16:59 -08:00
Amin Ghadersohi 1b876feaff fix(mcp): Remove unsupported thumbnail/preview URLs and internal fields from MCP schemas (#38109)
(cherry picked from commit 2a3567d2f1)
2026-02-23 09:08:27 -05:00
Damian Pendrak b1fd97f969 feat(matrixify): add single metric constraint (#37169)
(cherry picked from commit 5a777c0f45)
2026-02-21 16:13:33 -08:00
Jamile Celento f4d50fc98f fix(echarts): formula annotations not rendering with dataset-level columns label (#37522)
(cherry picked from commit 080f629ea2)
2026-02-21 10:06:13 -08:00
Jean Massucatto d70c5d61cd fix(echarts-timeseries-combined-labels): combine annotation labels for events at same timestamp (#37164)
(cherry picked from commit 0c0d915391)
2026-02-20 21:58:03 -08:00
Vanessa Giannoni 719d9d827e feat(charts): improve negative stacked bar label positioning and accessibility (#37405)
(cherry picked from commit 77148277b9)
2026-02-20 21:55:32 -08:00
Luis Sánchez d1e9baba41 feat(timeseries): remove stream style for bar charts (#37532)
(cherry picked from commit 5f0001affc)
2026-02-20 21:45:53 -08:00
Vanessa Giannoni b327c5843a fix(table): preserve time grain aggregation when temporal column casing changes (#37893)
(cherry picked from commit f4acce5727)
2026-02-20 21:45:53 -08:00
Jamile Celento d9f78dd754 fix(native-filters): respect filter scope in nested tabs by prioritizing chartsInScope (#37139)
Cherry-pick from 23fec55e3d.

- Accepted: Core fix to prioritize chartsInScope over rootPath in
  useIsFilterInScope; state.test.ts with 6 nested tab tests;
  getChartIdsInFilterScope.test.ts with comprehensive scope tests
- Adapted: Removed isChartCustomization branch (not present on
  6.0-release); kept 6.0-release types (Filter | Divider)
- Rejected: isChartCustomization logic (depends on chart customizations
  feature not present on 6.0-release)

(cherry picked from commit 23fec55e3d)
2026-02-20 21:45:50 -08:00
Enzo Martellucci 9c1daeac81 fix(charts): improve error display for failed charts in dashboards (#37939)
Cherry-pick frontend changes only from b565128fe7.

- Accepted: Chart.tsx fix to show backend API errors instead of infinite
  loading spinner when datasource is placeholder; ErrorContainer wrapper
  for scrollable error display; Chart.test.tsx with test coverage
- Adapted: Removed chartRenderingSucceeded from test mock (not in
  6.0-release Actions type)
- Rejected: gsheets.py needs_oauth2() changes (method doesn't exist on
  6.0-release); test_gsheets.py test for missing method

(cherry picked from commit b565128fe7)
2026-02-20 21:23:07 -08:00
Amin Ghadersohi 292242cf70 fix(thumbnails): stabilize digest by sorting datasources and charts (#38079)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 1ecff6fe5c)
2026-02-20 15:49:44 -08:00
Amin Ghadersohi 9bff2932df feat(mcp): add LIKE, ILIKE, IN, NOT IN filter operators to MCP chart tools (#38071)
(cherry picked from commit 9f8b212ccc)
2026-02-20 10:24:27 -05:00
Alexandru Soare 599b4e9299 fix(scatter): Fix ad-hoc metric for pointsize (#37669)
(cherry picked from commit 2b411b32ba)
2026-02-18 11:17:21 -08:00
Enzo Martellucci 5be6d41457 fix: Prevent table rows from overlapping pagination in table view (#37174)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit c59d0a73d4)
2026-02-18 11:07:52 -08:00
Alexandru Soare d8b5d45979 fix(sql): fix sql suggestions (#37699)
(cherry picked from commit ae8d671fea)
2026-02-18 11:00:06 -08:00
Mehmet Salih Yavuz a1c96bbce5 fix(explore): Don't show unsaved changes modal on new charts (#37714)
(cherry picked from commit 69c679be20)
2026-02-18 10:16:25 -08:00
Enzo Martellucci 1758b00d70 fix(native-filters): align refresh icon with default value field (#37802)
(cherry picked from commit b012b63e5b)
2026-02-18 10:15:41 -08:00
Mehmet Salih Yavuz 5e9eae0c10 fix(charts): Force refresh uses async mode when GAQ is enabled (#37845)
(cherry picked from commit 7b21979fa3)
2026-02-18 10:15:03 -08:00
Amin Ghadersohi 553d5938a8 feat(mcp): expose current user identity in get_instance_info and add created_by_fk filter (#37967)
(cherry picked from commit f7218e7a19)
2026-02-18 09:17:02 -08:00
Amin GhadersohiandClaude Opus 4.6 465537c249 fix(mcp): use last data-bearing statement in execute_sql response (#37968)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 09:16:49 -08:00
Amin Ghadersohi 77b32b3f82 fix(mcp): handle more chart types in get_chart_data fallback query construction (#37969)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5cd829f13c)
2026-02-18 09:16:30 -08:00
dependabot[bot] b100abb338 chore(deps): bump react-error-boundary from 6.0.0 to 6.1.0 in /superset-frontend (#37206)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 6453980d8d)
2026-02-17 23:43:59 -08:00
dependabot[bot] 4f7fca981d chore(deps): bump markdown-to-jsx from 7.7.4 to 9.6.0 in /superset-frontend (#37354)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 7c69ec7f24)
2026-02-17 23:16:08 -08:00
dependabot[bot] 8b5a649d66 chore(deps): bump min-document from 2.19.0 to 2.19.1 in /superset-frontend (#36046)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit e915d7d1d0)
2026-02-17 23:11:28 -08:00
dependabot[bot] 92a6c6fb7c chore(deps): bump brace-expansion in /superset-frontend (#34744)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 691926f0e1)
2026-02-17 23:07:44 -08:00
dependabot[bot] 079ffaedd4 chore(deps): bump qs from 6.14.1 to 6.14.2 in /superset-frontend (#37936)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 5300f65a74)
2026-02-17 23:04:03 -08:00
dependabot[bot] 698059b524 chore(deps): update dompurify requirement from ^3.3.0 to ^3.3.1 in /superset-frontend/plugins/legacy-preset-chart-nvd3 (#36471)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 955953b467)
2026-02-17 23:04:03 -08:00
dependabot[bot] f3a4870b76 chore(deps): update dompurify requirement from ^3.2.4 to ^3.3.1 in /superset-frontend/packages/superset-ui-core (#36513)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit 46e21c3003)
2026-02-17 23:04:03 -08:00
dependabot[bot] 0b61bf224e chore(deps): bump lodash-es from 4.17.22 to 4.17.23 in /superset-frontend (#37347)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit b576665f9a)
2026-02-17 23:04:03 -08:00
dependabot[bot] 17c7b27891 chore(deps): bump lodash from 4.17.21 to 4.17.23 in /superset-frontend (#37348)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 3a811d680d)
2026-02-17 23:04:03 -08:00
Nancy Chauhan 60e6fa2672 fix(security): update jspdf to 4.0.0 to address CVE-2025-68428 (#37553)
(cherry picked from commit 8fd3401077)
2026-02-17 23:04:03 -08:00
Đỗ Trọng Hải eef2d9781c feat(deps): significant npm audit fix to trim off inadvertently runtime dep from upstream libraries (#37220)
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit a1d65c7529)
2026-02-17 23:04:03 -08:00
Jamile Celento a3f3c0c3c6 fix(native-filters): update TEMPORAL_RANGE filter subject when Time Column filter is applied (#36985)
(cherry picked from commit 2dfc770b0f)
2026-02-17 23:04:03 -08:00
Vanessa Giannoni 21188ccb01 fix(timeseries): restore ECharts tooltip after closing drill menu (#37284)
(cherry picked from commit 6b7b23ed78)
2026-02-17 23:04:03 -08:00
Jonathan Alberth Quispe Fuentes d8b89468ad fix(roles): optimize user fetching and resolve N+1 query issue (#37235)
(cherry picked from commit 88ce1425e2)
2026-02-17 23:04:03 -08:00
Luis Sánchez 843fd75eaa fix(FiltersBadge): world map wont show filter icon after refresh page (#37260)
(cherry picked from commit 88a14f2ba0)
2026-02-17 23:03:42 -08:00
Jamile Celento c60cafe755 fix(table): only show increase/decrease color options when time comparison enabled (#37362)
(cherry picked from commit 3347b9bf6c)
2026-02-12 19:29:08 -08:00
Vinícius Borges Alencar 8bb9e9629a refactor(charts): filter saved metrics by key and label (#37136)
(cherry picked from commit 82d6076804)
2026-02-12 16:11:20 -08:00
Vanessa Giannoni 0dca0294d8 fix(explore): remove extra spacing when Advanced Analytics section is hidden (#37456)
(cherry picked from commit 7110fc9cde)
2026-02-12 16:11:20 -08:00
Jean Massucatto 5f6a07e2dd fix(select): prevent bulk action buttons from being cut off in filters (#37453)
(cherry picked from commit abf90de0ca)
2026-02-12 16:11:19 -08:00
Amin Ghadersohi 7535753e05 fix(mcp): Add database_name as valid filter column for list_datasets (#37865)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 3f64c25712)
2026-02-12 16:11:19 -08:00
Amin Ghadersohi 94e4cb68e1 feat(mcp): add event_logger instrumentation to MCP tools (#37859)
(cherry picked from commit 4dfece9ee5)
(cherry picked from commit adfe91c9167c2d5cbd98d0a28f6e945d3fb81244)
2026-02-12 16:11:19 -08:00
Kamil Gabryjelski 82d8293f86 fix: Unreachable drop zones within tabs in dashbboard editor (#37904) 2026-02-12 16:05:31 -08:00
Kamil Gabryjelski 0f36680719 perf: fix N+1 query in Slice.datasource property (#37899) 2026-02-11 19:04:16 +01:00
Kamil Gabryjelski cd65864b15 perf: fix N+1 query in chart list API when thumbnail_url is requested (#37895) 2026-02-11 19:03:57 +01:00
Kamil Gabryjelski d6616410d5 fix(native-filters): Filters with select first value not restored correctly from url (#37855) 2026-02-10 16:22:49 -08:00
Amin Ghadersohi b5cbbe86b7 fix(security): Add table blocklist and fix MCP SQL validation bypass (#37411)
(cherry picked from commit 15b3c96f8e)
2026-02-10 16:21:57 -08:00
Kamil Gabryjelski a219f6cbe6 fix: Vertical lines in the middle of Treemap categories (#37808) 2026-02-10 16:37:27 +01:00
Alexandru Soare 4f0680c32e fix(dashboard): Prevent fatal error when database connection is unavailable (#37576)
(cherry picked from commit 9ea5ded988)
2026-02-09 09:27:25 -08:00
Amin Ghadersohi f8dd7d8783 fix(mcp): remove html.escape to fix ampersand display in chart titles (#37186)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 01ac966b83)
2026-02-06 09:30:51 -05:00
Amin Ghadersohi 93d371a94c fix(mcp): include x_axis column in query context for series charts with group_by (#37639)
(cherry picked from commit 47db185e3b)
2026-02-05 14:03:19 -05:00
Amin Ghadersohi 9756610269 fix(mcp): prevent DATE_TRUNC on non-temporal columns in chart generation (#37433)
(cherry picked from commit 4147d877fc)
2026-02-05 12:40:57 -05:00
Amin Ghadersohi d6f0b845fd fix(mcp): treat runtime validation warnings as informational, not errors (#37214)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a9dca529c1)
2026-02-05 12:40:35 -05:00
Amin Ghadersohi 837d25579a chore(mcp): remove unused MCP_SERVICE feature flag (#37618)
(cherry picked from commit 5914e83436)
2026-02-03 10:35:32 -05:00
Amin Ghadersohi cc7fb79596 feat(mcp): add config toggle to disable parse_request decorator (#37617)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 0b5e4dd5de)
2026-02-03 10:34:58 -05:00
Beto DealmeidaandClaude Opus 4.5 86caadf861 feat: Add PWA file handler for CSV/XLS/Parquet uploads (#36191)
Cherry-picked from master (f2b6c39) with adaptations:
- Changed import path from @apache-superset/core to @superset-ui/core
- Removed ReactRefreshWebpackPlugin (not in 6.0-release)
- Fixed button type attribute in test file

Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:25:32 -08:00
Luis Sánchez 357ab7597e chore(charts): echarts left padding too big and automation of title (#36993)
(cherry picked from commit 91131d5996)
2026-02-02 21:25:32 -08:00
Ramiro Aquino Romero 4688b7aa8c fix: charts row limit warning is missing for server (#37112)
(cherry picked from commit f60c82e4a6)
2026-02-02 16:29:25 -08:00
Jonathan Alberth Quispe Fuentes f0214b1818 fix: Heatmap does not render correctly on normalization (#37208)
(cherry picked from commit 4a7cdccdad)
2026-02-02 16:29:12 -08:00
Jean Massucatto 32386ecfc5 fix(redshift): normalize table names to lowercase for CSV uploads (#37019)
(cherry picked from commit e8363cf606)
2026-02-02 16:28:49 -08:00
Pedro Rodrigues eda6cad773 fix: big number drill to details column data (#37068)
(cherry picked from commit 2cce0308d4)
2026-02-02 16:12:23 -08:00
Felipe López 854538c858 fix(charts): Table chart shows an error on row limit (#37218) 2026-02-02 16:06:19 -08:00
Beto Dealmeida 4c1e8cc51c feat: AWS Cross-Account IAM Authentication for Aurora (#37585)
(cherry picked from commit 05c2354997)
2026-02-02 16:04:01 -08:00
Alejandro Solares 738919ea5e chore(deps): bump dependencies to address security vulnerabilities (#37552)
(cherry picked from commit d6029f5c8a)
2026-02-02 15:59:05 -08:00
Jean Massucatto 01c4300f17 fix(themes): correct action icons size and restore missing tooltips (#37409)
(cherry picked from commit 5a99588f57)
2026-02-02 15:57:41 -08:00
Jean Massucatto d006b5fda7 fix(deckgl): change deck gl Path default line width unit to meters (#37248) 2026-02-02 15:42:38 -08:00
Mehmet Salih Yavuz 44ef12f5dc fix(Multilayer): preserve dashboard context for embedded (#37495)
(cherry picked from commit 1501af06fe)
2026-02-02 10:23:58 -08:00
Ramiro Aquino Romero 3ff12813c1 feat(deckgl): add auto zoom option in deck gl multi layer (#37221) 2026-01-31 11:31:22 -08:00
Gabriel Torres Ruiz b0b044e653 fix(dashboard): catch DatasourceNotFound in get_datasets to prevent 404 (#37503)
(cherry picked from commit 06e4f4ff4c)
2026-01-30 12:17:18 -08:00
Amin Ghadersohi ffb0519e74 fix(mcp): tools not listed when JWT auth is enabled (#37377)
(cherry picked from commit 6663709a23)
2026-01-30 13:55:50 -05:00
yousoph cf3ab011e3 fix(matrixify): Rename Tag from 'Matrixify' to 'Matrixified' (#37402)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit bb5be6cf54)
2026-01-29 22:08:22 -08:00
Ramiro Aquino Romero f10b2f8584 fix: display correct icon for Multi Chart in quick switcher (#37256) 2026-01-29 11:17:58 -08:00
Kamil Gabryjelski be20fe9db7 fix(mcp): Instance not bound to session error (#37548) 2026-01-29 11:17:58 -08:00
Vanessa Giannoni 887aca2f1b fix(ag-grid-table): preserve time grain aggregation when temporal column casing changes (#36990)
(cherry picked from commit a7e7cc30a9)
2026-01-29 11:17:58 -08:00
Vanessa Giannoni 0fb95136b8 feat(dashboard): show dataset column labels in View as table (#37140)
(cherry picked from commit 2ec3aaaeea)
2026-01-29 11:17:58 -08:00
Reynold Morel 381950124e fix(dashboard): resolve dropdown popup positioning (#36963)
(cherry picked from commit 43653d1fa1)
2026-01-29 11:17:58 -08:00
Vanessa Giannoni 01495d485d fix(dashboard-filters): prevent clearing all filters when editing a native filter (#37253)
(cherry picked from commit ec2509a8b4)
2026-01-29 11:17:58 -08:00
Amin Ghadersohi 1ef94be726 fix(mcp): always filter list responses by columns_requested (#37505) 2026-01-28 14:39:57 +01:00
Daniel Vaz Gaspar 8fad912835 feat(cache): use configurable hash algorithm for flask-caching (#37361)
(cherry picked from commit 290bcc1dbb)
2026-01-26 12:40:53 -08:00
Amin Ghadersohi f309668127 chore(deps): bump fastmcp from 2.14.0 to 2.14.3 (#37410)
(cherry picked from commit 0ecc69d2f1)
2026-01-26 12:40:53 -08:00
Reynold Morel c0c0ee484a fix(chart): implement geohash decoding (#37027)
(cherry picked from commit b99fc582e4)
2026-01-26 12:40:53 -08:00
SBIN2010 55e31e74cb feat(tree chart): add initial tree depth to tree chart (#35425)
(cherry picked from commit 21f85a4145)
2026-01-26 12:40:53 -08:00
Alex Yang e5e2c2a5dd feat: Floating Point Formatting for Scatter Point Chart (#35915)
Co-authored-by: Vincent <vincent.trung4@gmail.com>
(cherry picked from commit 001b6cb801)
2026-01-26 12:40:53 -08:00
Daniel Vaz Gaspar 8c15e72de6 fix: variable shadowing in test_connection command (#37397)
(cherry picked from commit f2b54e882d)
2026-01-26 12:40:53 -08:00
dependabot[bot] d395f5b368 chore(deps): bump @deck.gl/layers from 9.1.13 to 9.2.2 in /superset-frontend (#35743)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit f2e677c150)
2026-01-26 12:40:53 -08:00
Gabriel Torres RuizRafael BenitezClaudeBeto Dealmeidacodeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
0802c6804c fix(theme): migrate APP_NAME to brandAppName theme token with backward compatibility (#37370)
Co-authored-by: Rafael Benitez <rebenitez1802@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-01-26 12:40:53 -08:00
Vitor Avila 3c37bb01ea fix: DB OAuth2 fixes (#37350)
(cherry picked from commit cc972cad5a)
2026-01-26 12:40:53 -08:00
Vitor Avila fa30a74e8e feat: Handle OAuth2 dance with TableSelector (#37315) 2026-01-26 12:40:53 -08:00
Enzo Martellucci 6214278106 fix(echarts): restore dashed line style for time comparison series (#37135)
(cherry picked from commit 3fa5bb4138)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi 872319d415 feat(mcp): add stacked bar/area chart support (#37188)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 0fedfe03d5)
2026-01-26 12:40:52 -08:00
Jean Massucatto 5606d5d2e3 perf(date_parser): bound regex quantifiers for deterministic parsing performance (#36983)
Cherry-picked from master commit 459b4cb23d

Accepted:
- Bounded \s+ to \s{1,5} and \s* to \s{0,5} in time_range_lookup regexes
- Added tests for bounded whitespace validation

Adapted:
- Preserved 6.0-release "first/1st of" patterns between modified sections
- Kept existing tests for "first of" expressions

Original author: Jean Massucatto <massucattoj@gmail.com>
2026-01-26 12:40:52 -08:00
Luis Sánchez a9a03db940 refactor(TimezoneSelector): Enhance timezone selection logic and improve performance (#36486) 2026-01-26 12:40:52 -08:00
Mehmet Salih Yavuz 676c73f6d5 feat(Matrixify): add matrixify tag to list view and explore (#37247) 2026-01-26 12:40:52 -08:00
Richard Fogaca Nienkotter 68c7750f35 feat: Dynamic currency (#36416) 2026-01-26 12:40:52 -08:00
Alexandru Soare 6315380029 fix(transpile_query): Fix export_as_csv error: "transpile_to_dialect": ['Unknown field.'] (#37249)
(cherry picked from commit 2187fb4ab4)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi cf83ef89eb feat(mcp): add time_grain parameter to XY chart generation (#37182)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit e1fa374517)
2026-01-26 12:40:52 -08:00
amaannawab923 f61003756b feat(ag-grid-table): Enable Time Shift feature for AG Grid Table (#37072)
(cherry picked from commit 39238ef8a9)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi 265209a9e4 feat(mcp): Add Redis EventStore support for multi-pod deployments (#37216)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 50d0508a92)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi 1e678737c7 fix(mcp): Remove screenshot URL functionality from MCP chart tools (#37228)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 2d20079a88)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi ad9b3f6182 feat(mcp): Add support for AG Grid Interactive Table (ag-grid-table) viz_type (#37191)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit fe16c828cf)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi 531d8512a8 fix(sqllab): show virtual dataset banner only when isDataset param is true (#37184)
(cherry picked from commit 6e1718910f)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi 152f9ddbe0 fix(mcp): restore select_columns filtering in list tools (#37213)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 896947c787)
2026-01-26 12:40:52 -08:00
Alexandru Soare b5f3892b8c feat(dates): adding handling for first of (#37098)
(cherry picked from commit 8f35cc93673a56ba499510fbefabf9e4a46d8b6f)
2026-01-26 12:40:52 -08:00
SBIN2010 bcd0fc13e2 feat: add tab select with save chart to dashboard (#36332)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
(cherry picked from commit c30edaf075)
2026-01-26 12:40:52 -08:00
Alexandru Soare 1f03ba0683 fix(data-zoom): Data-zoom not rendered properly in Matrixify (#37134)
(cherry picked from commit 9555798d37)
2026-01-26 12:40:52 -08:00
Mehmet Salih Yavuz 88a14f309a chore(Matrixify): disable matrixify for incompatible viz types (#37163)
(cherry picked from commit 95c14b1fc1)
2026-01-26 12:40:52 -08:00
Enzo Martellucci 5d58c8a55e fix(charts): properly parse error responses in StatefulChart (#37130)
(cherry picked from commit 23b91d22ef)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi 104440115e refactor(mcp): simplify single metric chart type check (#37215)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 2bcb66c2fc)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi c6c5d43073 fix(mcp): Handle big_number charts and make semantic warnings non-blocking (#37142)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit d0783da3e5)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi 65eb3bbfa9 fix(mcp): push Flask app context in mcp_auth_hook for tool execution (#37190)
(cherry picked from commit 4532ccf638)
2026-01-26 12:40:51 -08:00
Declan Zhao 4e2afa81d3 fix(prune_logs): improve performance by using id column only for ordering log records when max_rows_per_run is provided (#37138)
(cherry picked from commit 137ebdee39)
2026-01-26 12:40:51 -08:00
Elizabeth Thompson cd2d61f95f fix(table chart): time comparison totals returning null (#37111)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a272253243)
2026-01-26 12:40:51 -08:00
Mehmet Salih Yavuz f435c44189 fix(Matrixify): Do not clear values when saving (#37090)
(cherry picked from commit e053418c97)
2026-01-26 12:40:51 -08:00
Alexandru Soare 435c01c5a3 fix(datasets): ui bug fixes (#37058)
(cherry picked from commit fc67569cd4)
2026-01-26 12:40:51 -08:00
Enzo Martellucci 26b8925600 fix(explore): dispatch NumberControl value on blur to allow field clearing (#37007)
(cherry picked from commit 5f58241795)
2026-01-26 12:40:51 -08:00
Luis Sánchez 66ec7f1e3d chore(chart): rollback legend top alignment to the right (#36994)
(cherry picked from commit dcdcf88969)
2026-01-26 12:40:51 -08:00
amaannawab923 a078221a24 feat(ag-grid): Server Side Filtering for Column Level Filters (#35683)
(cherry picked from commit 4f444ae1d2)
2026-01-26 12:40:51 -08:00
Michael S. Molina e07d12b1bb feat(embedded-sdk): Add resolvePermalinkUrl callback for custom permalink URLs (#36924)
(cherry picked from commit 53dddf4db2)
2026-01-26 12:40:51 -08:00
Beto Dealmeida f04f638506 chore: remove deprecated function (#37021)
(cherry picked from commit 14c0cad0ba)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi 8c6b7b455b fix(mypy): add overrides for superset-core local dev consistency (#36907)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit f895250cf9)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi e85033c0ff fix(mcp): resolve startup failures from circular DAO imports (#37023)
(cherry picked from commit ecefba5bf7)
2026-01-26 12:40:51 -08:00
Enzo Martellucci 9093761713 refactor(db-engine-specs): use standard OAuth 2.0 params in base class (#37010)
(cherry picked from commit ea90d1f141)
2026-01-26 12:40:51 -08:00
Daniel Vaz Gaspar 211cd7a219 chore: bump flask-cors to 6.0.2 (#36640)
(cherry picked from commit f48322c17d)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi 513297ebc6 fix(mcp): remove unused ctx parameter from health_check tool (#36992)
(cherry picked from commit 85cf46dc1c)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi be3097c206 feat(mcp): change save_chart default to False for preview-first workflow (#36935)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 047360641a)
2026-01-26 12:40:51 -08:00
Daniel Vaz Gaspar f34e7687b1 fix: streaming export losing g context (#36950)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a6d85dccf8)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi fe7be94604 fix(mcp): use chart.query_context for get_chart_data like the API does (#36937)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 64ee48f147)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi 519deb99e1 feat(mcp): add unified get_schema tool for schema discovery (#36458)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 84279acd2f)
2026-01-26 12:40:51 -08:00
Enzo Martellucci c5f26c30b7 fix(alert-report-modal): enhance dashboard filters behavior and visibility (#36380)
(cherry picked from commit e1c022344e)
2026-01-26 12:40:50 -08:00
Mehmet Salih YavuzandClaude 67e36b5195 fix(deck.gl): Fix Scatterplot chart error when using fixed point size (#36890)
Co-authored-by: Claude <noreply@anthropic.com>
2026-01-26 12:40:50 -08:00
Geidō 9ea4cbb15f fix: Query history view button in SqlLab (#36540) 2026-01-26 12:40:50 -08:00
Enzo Martellucci 39355ee10d fix(dashboard): resolve tab reorder state sync issues (#36855)
(cherry picked from commit e112d863bf)
2026-01-26 12:40:50 -08:00
Beto Dealmeida ef08904e25 fix: apply EXCLUDE_USERS_FROM_LISTS to /api/v1/security/users/ (#36742)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit ecb4e483df)
2026-01-26 12:40:50 -08:00
Alexandru Soare 75d881909f fix(margin): Fixing margin issues (#36479)
(cherry picked from commit 54eb6317ef)
2026-01-26 12:40:50 -08:00
Kamil Gabryjelski ea8e813fc5 chore: Close playwright browser gracefully (#36537)
(cherry picked from commit f3407d7a56)
2026-01-26 12:40:50 -08:00
Joshua Daniel d675b3ef57 feat(chart): support icons and text in the deck.gl Geojson visualization (#36201)
Co-authored-by: Joshua Daniel <jdaniel@gflenv.com>
(cherry picked from commit 5e0ee40762)
2026-01-26 12:40:50 -08:00
Luis Sánchez 7d8f310ca6 fix(SearchFilter): prevent unintended autocomplete on search input (#36209)
(cherry picked from commit c9ec173647)
2026-01-26 12:40:50 -08:00
Vitor Avila b92d08e4f9 fix: store form_data as dict during viz type migration (#36680)
(cherry picked from commit d14f502126)
2026-01-26 12:40:50 -08:00
Vitor Avila d52ce3999a fix: Support datetime_format during import (#36679)
(cherry picked from commit 821b259805)
2026-01-26 12:40:50 -08:00
Chad Rossouw f63a74ea42 feat(database): add cloudflare d1 support (#36348)
Co-authored-by: danielalyoshin <daniel.alyoshin@gmail.com>
Co-authored-by: Shreyas Rao <raoshreyas2004@gmail.com>
Co-authored-by: Murphy Lee <murphylee2004@gmail.com>
(cherry picked from commit e5579ed939)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi 3ddf4cbd42 chore(deps): upgrade fastmcp from 2.13.x to 2.14.0 (#36594)
(cherry picked from commit a1b5b92265)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi 7aa8b372b7 chore(deps): upgrade redis from 4.x to 5.x (#36593)
(cherry picked from commit 92c63a54e4)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi 879a92ee83 feat(mcp): add datasource field to generate_explore_link form_data (#36543)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit e5b7e38a30)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi 56a2631ccd feat(mcp): return form_data and form_data_key in generate_chart and generate_explore_link responses (#36539)
(cherry picked from commit a588668899)
2026-01-26 12:40:50 -08:00
Daniel Vaz Gaspar 3c2004e588 feat: add option for hash algorithms (#35621)
Co-authored-by: Ville Brofeldt <33317356+villebro@users.noreply.github.com>
(cherry picked from commit bb22eb1ca8)
2026-01-26 12:40:50 -08:00
Gabriel Torres Ruiz 13b5b3f8d1 feat(theming): add per-theme custom font URL support (#36317) 2026-01-26 12:40:50 -08:00
Daniel Vaz Gaspar 35421ad840 fix: core mcp injection and ephemeral envs (#36440)
(cherry picked from commit 1d9c93a793)
2026-01-26 12:40:50 -08:00
Mehmet Salih Yavuz 6c41ff14ea fix(SaveModal): Update chart state when saving in explore (#36441)
(cherry picked from commit fb2826f92e)
2026-01-26 12:40:49 -08:00
Alexandru Soare 6244cc38b1 feat(state): remove chart state when navigation away from the dashboard (#36421)
(cherry picked from commit 8c603a6f8b)
2026-01-26 12:40:49 -08:00
Mohammad Al-QasemandClaude 3ae4e3d3df feat(table): Gradient Toggle (#36280)
Co-authored-by: Claude <noreply@anthropic.com>
2026-01-26 12:40:49 -08:00
Beto Dealmeida e49c5db85a chore: improve types (#36367)
(cherry picked from commit 482c674a0f)
2026-01-26 12:40:49 -08:00
Beto Dealmeida bb7d4ca123 feat: Explorable protocol (#36245)
(cherry picked from commit 16e6452b8c)
2026-01-26 12:40:49 -08:00
Edison Liem edd9345227 feat(dashboard): implement boolean conditional formatting (#36338)
Co-authored-by: Morris <morrisho215215@gmail.com>
(cherry picked from commit eabb5bdf7d)
2026-01-26 12:40:49 -08:00
Antonio Rivero a5afc48768 fix(dashboards): Use same decorators as FAB (#36423)
(cherry picked from commit 4a249a0745)
2026-01-26 12:40:49 -08:00
Daniel Vaz Gasparandcodeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com> 41b46ccb6b chore: bump urllib3 to 2.6.0 (#36526)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-01-26 12:40:49 -08:00
Antonio Rivero 713de8f1dc feat(mcp): Caching uses in-memory store by default when no external store is configured (#36527) 2026-01-26 12:40:49 -08:00
Antonio Rivero 5db29c0f70 feat(mcp): Add ResponseCachingMiddleware and Storage (#36497) 2026-01-26 12:40:49 -08:00
Amin Ghadersohi 5b38b9baf4 fix(mcp): Use config-based URL for MCP service instead of request auto-detection (#36460)
(cherry picked from commit 8d7c83419c)
2026-01-26 12:40:49 -08:00
Declan Zhao 9601d8113c feat(prune_logs): add optional max_rows_per_run param (#36313)
(cherry picked from commit d121cfdbda)
2026-01-26 12:40:49 -08:00
Beto Dealmeida 62d07a9916 chore: cleanup ssh tunnel (#34388)
(cherry picked from commit c458f99dd4)
2026-01-26 12:40:49 -08:00
Kaito Watanabe f94170598c feat: show search filtered total (#36083)
(cherry picked from commit 6e0960c3f5)
2026-01-26 12:40:49 -08:00
Amin Ghadersohi fa6e28598a feat(mcp): add tool tags for Tool Search optimization (#36405)
(cherry picked from commit 5c91ab91fb)
2026-01-26 12:40:49 -08:00
Mehmet Salih Yavuz 683b9a0f05 fix(SaveModal): reset chart state when saving and going to a dashboard (#36402)
(cherry picked from commit b40467c7e2)
2026-01-26 12:40:49 -08:00
Beto Dealmeida 1bf0639f40 feat: DB2 dialect for sqlglot (#36365)
(cherry picked from commit e4cb84bc02)
2026-01-26 12:40:49 -08:00
Beto Dealmeida fea90d8a67 fix: normalize totals cache keys for async hits (#36274)
(cherry picked from commit 775d1ba061)
2026-01-26 12:40:49 -08:00
Vitor Avila b14e107fca fix: Do no aggregate results for CSV downloads from AG Grid raw records table (#36247)
(cherry picked from commit 9fc7a83320)
2026-01-26 12:40:49 -08:00
Mehmet Salih Yavuz ddb16032de fix(timeshift): Add a more reliable strategy for correct temporal col (#36309)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a754258fad)
2026-01-26 12:40:49 -08:00
Gabriel Torres Ruiz a7d6afa295 fix(deckgl): use DatasourceType enum in polygon transformProps test + some TS issues (#36336)
(cherry picked from commit a745fd49fa)
2026-01-26 12:40:48 -08:00
Damian Pendrak dfe04f8fd4 fix(deckgl): polygon elevation fixed value (#35266)
(cherry picked from commit de7f41a888)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi b1a00163db refactor(mcp): use dynamic APP_NAME instead of hardcoded Superset branding (#36371)
(cherry picked from commit 2c6bed27aa)
2026-01-26 12:40:48 -08:00
Enzo Martellucci f2a26236aa feat(alert-report-modal): Use extensions registry for DateFilterControl in AlertReportModal (#36376)
(cherry picked from commit 51798edb23)
2026-01-26 12:40:48 -08:00
Alexandru Soare 6f887bbaf0 feat(embed): get charts payload (#36237)
Co-authored-by: Vitor Avila <vitorfragadeavila@gmail.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 341ae994c5)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi 2a55db95a1 fix(mcp): access wrapped function in dataset tool tests (#36295)
(cherry picked from commit 2af5a5adb0)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi e5def29e63 feat(mcp): implement selective column serialization for list tools (#36035) 2026-01-26 12:40:48 -08:00
Amin Ghadersohi 1674628881 fix(mcp-service): improve MCP tool parameter clarity and validation (#36137)
Co-authored-by: Rafael Benitez <rafael.benitez@contractors.food52.com>
(cherry picked from commit f98939103b)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi 685d4cc891 build: Add pytest-asyncio to enable async MCP service tests (#36251)
(cherry picked from commit ab36bd3965)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi 50326c23a9 feat(datasets): add datetime format detection to dataset columns (#36150)
Co-authored-by: Claude Code <claude@anthropic.com>
(cherry picked from commit 06a8f4df02)
2026-01-26 12:40:48 -08:00
Beto Dealmeida fab1f03527 fix: double computation of contribution_totals (#36226)
(cherry picked from commit aca18fff99)
2026-01-26 12:40:48 -08:00
Beto Dealmeida c01b041e40 fix: cache key generation (#36225)
(cherry picked from commit 0c87034b17)
2026-01-26 12:40:48 -08:00
Antonio Rivero 83bc43898e feat(dashboards): Add config to filter implicit tags in list API (#36246)
(cherry picked from commit c966dd4f9e)
2026-01-26 12:40:48 -08:00
amaannawab923 e08749b9bb feat(ag-grid): add SQLGlot-based SQL escaping for where and having filter clauses (#36136)
(cherry picked from commit 186693b840)
2026-01-26 12:40:48 -08:00
Beto Dealmeida 3d7fb83bef refactor: refactor get_query_result (#36057)
(cherry picked from commit a2267d869b)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi 13c70c7ee3 fix(mcp): Allow MCP tools to accept string or object request formats (#36271)
(cherry picked from commit cf88551a56)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi 3b81e5699e feat(mcp): Add flexible input parsing to handle double-serialized requests (#36249) 2026-01-26 12:40:48 -08:00
Alexandru Soare 32eddb6b1f feat(Tabs): Rearange tabs when editing dashboard (#35156)
(cherry picked from commit 71c015c579)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi e1d0a9f5f0 fix(security): enable AUTH_RATE_LIMITED to work correctly (#36195)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 92d8139136)
2026-01-26 12:40:48 -08:00
amaannawab923 734eff9caf feat(streaming): Streaming CSV uploads for over 100k records for constant memory usage (#35478)
(cherry picked from commit 35f156a1e1)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi 20f1bb0367 docs(mcp): add comprehensive architecture, security, and production deployment documentation (#36017)
(cherry picked from commit 66afdfd119)
2026-01-26 12:40:47 -08:00
Enzo Martellucci cf92127702 chore(DatabaseModal): simplify collapsible logic for extra extension section (#36118)
(cherry picked from commit 53b9045943)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter 7614fbabbf feat(dashboard): "embed code" option on dashboard share tab (#33163)
Co-authored-by: richardfn <richard.fogaca@appsilon.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 80ec241108)
2026-01-26 12:40:47 -08:00
Gabriel Torres Ruiz 72173554fe fix(csv-upload): log detailed errors during chunk concatenation for debugging (#36108)
(cherry picked from commit 9d06a5888f)
2026-01-26 12:40:47 -08:00
Beto Dealmeida dc14cb34fa chore: annotate important types (#36034)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fb7d0e0e3d)
2026-01-26 12:40:47 -08:00
Gabriel Torres Ruiz c5fdf86230 feat(embedded): add setThemeMode API for dynamic theme switching (#36125)
(cherry picked from commit 282f4e5de2)
2026-01-26 12:40:47 -08:00
Kamil Gabryjelski 822fc672f3 perf: Fix dashboard performance issues (#36119)
(cherry picked from commit 6723a58780)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi cff983c91e fix: pin setuptools <81 to prevent pkg_resources removal (#36104)
(cherry picked from commit 519990e2fb)
2026-01-26 12:40:47 -08:00
Enzo Martellucci 216763d05d fix: Use total count to filter datasets (#36135)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 962faa2196)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi 28a3c5f5b9 feat(mcp): add configurable branding for MCP service (#36033)
(cherry picked from commit dad469297c)
2026-01-26 12:40:47 -08:00
Enzo Martellucci 5611f81ec3 style(database-modal): vertically align the button and the InfoTooltip icon (#36087)
(cherry picked from commit f8933c2743)
2026-01-26 12:40:47 -08:00
Daniel Vaz Gaspar 0fd66328df chore: bump FAB to 5.0.2 (#36086)
(cherry picked from commit b051f779e6)
2026-01-26 12:40:47 -08:00
Antonio Rivero b8abe9531e chore(logs): Add is_cached in sync AND async results (#36102)
(cherry picked from commit 60f29ba6fb)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi 462b634a31 fix(mcp): simplify health_check tool and refactor system utils (#36063)
(cherry picked from commit c244e7f847)
2026-01-26 12:40:47 -08:00
Mehmet Salih Yavuz e11e61b5ea feat(frontend): add dataset cache clearing utilities and integration (#35264)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit 0b535b792e)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter 8eba7a7860 fix(dashboard): prevent validation error in properties modal when ope… (#36045)
(cherry picked from commit 9be61a1245)
2026-01-26 12:40:47 -08:00
Joe Li e506cf4bfa fix(tests): fix flakey tests with PropertiesModal.test.tsx, FiltersConfigModal.test.tsx and ChartList.listview.test.tsx (#36037)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 0a5144fc1d)
2026-01-26 12:40:47 -08:00
Joe Li e1c9285467 feat(playwright): Remove Cypress auth tests in favor of Playwright auth tests (#35938)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 64ca080bb8)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi e0d4f9dc27 fix(mcp-service): ensure Flask app context in auth hook and resolve Pydantic warnings (#36013)
(cherry picked from commit 9605a4a9cb)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter 1ea68dd451 style(sqllab): restore Template Parameters modal styling (#35965)
(cherry picked from commit ae63f64771)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi 00ac662977 chore(mcp-service): upgrade fastmcp from 2.10.6 to 2.13.0.2 (#36014)
(cherry picked from commit 3167a0dbc0)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi f59110cf28 refactor(mcp): shorten tool name from get_superset_instance_info to get_instance_info (#36032)
(cherry picked from commit d2550a525b)
2026-01-26 12:40:46 -08:00
Gabriel Torres Ruiz e27e26debe fix(UI): spacings + UI fixes (#36010)
(cherry picked from commit c11be72ead)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi e74ee8ee69 test: revert unrelated flaky test fix from MCP PR (#36015)
(cherry picked from commit f5f5913a29)
2026-01-26 12:40:46 -08:00
Antonio Rivero b003d1bdd7 chore(logs): Use correct log level and remove duplicates for get_query (#36023)
(cherry picked from commit 3765c31163)
2026-01-26 12:40:46 -08:00
Enzo Martellucci c41b061063 fix(ui): bump AntD to 5.26.0 to fix Splitter drag menu issue (#35782)
(cherry picked from commit 84a1abd357)
2026-01-26 12:40:46 -08:00
Antonio Rivero 549dd41388 feat(logs): Add is_cached as part of ChartDataRestApi.data actions (#36001)
(cherry picked from commit a1d4dff99d)
2026-01-26 12:40:46 -08:00
Rafael Benitez 1d6d1ca1a7 fix(dataset): sync columns checkbox not responding to clicks in virtual dataset modal (#35650)
(cherry picked from commit 46db8b7803)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi beff839b5b feat(mcp): MCP service implementation (PRs 3-9 consolidated) (#35877)
(cherry picked from commit fee4e7d8e2)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi 46069a2269 fix(mcp): remove hardcoded admin username fallbacks (#35875)
(cherry picked from commit 7733265fa2)
2026-01-26 12:40:45 -08:00
Amin Ghadersohi 68e8ba7732 feat(mcp): PR2 - Add chart listing and info tools with core infrastructure (#35835)
(cherry picked from commit e1455057e7)
2026-01-26 12:40:45 -08:00
Amin Ghadersohi aceb2f52f6 feat(mcp): PR1 - Add MCP service scaffold for Apache Superset (#35163)
(cherry picked from commit cc6a5dc29a)
2026-01-26 12:40:45 -08:00
Vitor Avila e3fa444d1e chore: Docs and config improvements for Docker setup (#35896)
(cherry picked from commit 0a95f74f11)
2026-01-26 12:40:45 -08:00
Gabriel Torres Ruiz 0b6a5c5183 refactor(explore): improve focus management in adhoc filter editor (#35801) 2026-01-26 12:40:45 -08:00
Amin Ghadersohi 9e65482384 refactor(explore): extract session ID retrieval into overridable method (#35779)
(cherry picked from commit 6f50ddf710)
2026-01-26 12:40:45 -08:00
SBIN2010 72b9ee5d09 feat: show total in waterfall chart (#35876)
(cherry picked from commit 48ee0821d3)
2026-01-26 12:40:45 -08:00
Alexandru Soare 3d7ae46f7c feat(Chart): Save Chart State globally (#35343)
(cherry picked from commit 99b61143f6)
2026-01-26 12:40:45 -08:00
SBIN2010 9edf84304a feat: conditional formatting improvements add flag toAllRow and toTextColor in tables (#34762)
(cherry picked from commit 514d56d1ae)
2026-01-26 12:40:45 -08:00
Joe Li b18351c9ed fix(frontend): resolve race condition in DatasetUsageTab pagination s… (#35691)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 79918a7939)
2026-01-26 12:40:45 -08:00
Geidō bea413d2a2 fix(Themes): Local label inconsistent behaviors (#35663)
(cherry picked from commit fcfafebb29)
2026-01-26 12:40:45 -08:00
SkinnyPigeon 1cd27bf27f feat(reports): allow custom na values (#35481)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit 58758de93d)
2026-01-26 12:40:45 -08:00
Elizabeth Thompson f79ac23776 test(tasks): Add tests for log_task_failure signal handler (#35721)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1b6d57c3f3)
2026-01-26 12:40:45 -08:00
Elizabeth Thompson d90ff786d6 test: add comprehensive unhappy path tests for export (#35718)
(cherry picked from commit 0b3fe3d60c)
2026-01-26 12:40:45 -08:00
Richard Fogaca Nienkotter 504234f575 feat: use in deck.gl custom tooltip instead of SafeMarkdown (#35665)
(cherry picked from commit 8c125d2553)
2026-01-26 12:40:45 -08:00
Joe Li de0b1c2156 refactor(frontend): convert DatasourceEditor tests to TypeScript (#35606)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4ddc3f14ed)
2026-01-26 12:40:45 -08:00
Quentin Leroy 6d7b050792 fix(config.py): reset HTML_SANITIZATION to True by default (#35603)
(cherry picked from commit 09772eeda0)
2026-01-26 12:40:45 -08:00
Gabriel Torres Ruiz a1ec378a12 fix(theming): solve modal dark theme issues + styling and code improvements (#35539)
(cherry picked from commit e6bd03fe98)
2026-01-26 12:40:44 -08:00
Joe Li 773b6938d0 test(frontend): remove 3 duplicate JSX test files (#35590)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 35b5f8dcdc)
2026-01-26 12:40:44 -08:00
Levis Mbote 6910aa23f8 feat(dashboard): chart customization/dynamic group by in dashboards (#33831)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: amaannawab923 <amaannawab923@gmail.com>
(cherry picked from commit 97518544ee)
2026-01-26 12:40:44 -08:00
Elizabeth Thompson fe94f65d1f fix(export): replace iframe with fetch to avoid CSP frame-src violations (#35584)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3dcf85caef)
2026-01-26 12:40:44 -08:00
Gabriel Torres Ruiz 664881ff5f fix(theme-crud): add unsaved changes modal (#35254)
(cherry picked from commit a90928766b)
2026-01-26 12:40:44 -08:00
Elizabeth Thompson 5052e35aea fix(modals): use Modal.useModal hook for proper dark mode theming (#35198)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 8bb911bc91)
2026-01-26 12:40:44 -08:00
Kamil Gabryjelski f86c2f15ae fix(explore): Remove query autotrigger (#35418)
(cherry picked from commit 0364933e8b)
2026-01-26 12:40:44 -08:00
Damian Pendrak 03995adc4d feat(db): custom database error messages (#34674)
(cherry picked from commit 19db0353a9)
2026-01-26 12:40:44 -08:00
Kamil Gabryjelski 163573e8c9 fix: Broken splitter in sql lab and some minor visual fixes (#35416)
(cherry picked from commit 88e5581d04)
2026-01-26 12:40:44 -08:00
Gabriel Torres Ruiz d495df5934 feat(theming): add base theme config (#35220)
(cherry picked from commit 220480b627)
2026-01-26 12:40:44 -08:00
Joe Li f6e3b87621 fix: resolve 6.0 release migration chain conflicts
This commit consolidates migration fixes to resolve conflicts between
4.2-release and 6.0-release branches:

- Correct merge migration to prevent KeyError d482d51c15ca
- Resolve multiple heads with 3-way merge migration
- Complete migration chain linkage to 4.2-release HEAD
- Restore 4.2-release migration chain compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
(cherry picked from commit 84e5cfef51211403f8d54ea8a79bffb4d4a53796)
(cherry picked from commit 912c2d2b1fbf035f9d5786c5d4cc34d8c93d8b75)
(cherry picked from commit 51da0e61c16d4a037b6650848208ae359e37ef7e)
2026-01-26 12:40:44 -08:00
JUST.in DO IT e4b246cc03 chore(sqllab): remove unused json param (#35065)
(cherry picked from commit 0defcb604b)
2026-01-26 12:40:44 -08:00
Mehmet Salih Yavuz 96dc6aba33 fix(PropertiesModal): do not show validation errors while loading (#35215)
(cherry picked from commit cb88d886c7)
2026-01-26 12:40:44 -08:00
Rafael Benitez 85eaa90367 feat(themes): Adding SupersetText support to Themes Modal (#35248)
(cherry picked from commit 4b71adaa9c)
2026-01-26 12:40:44 -08:00
Mehmet Salih Yavuz 9ef9b9b827 chore(effect): add eslint plugin to reduce rerenders (#35223)
(cherry picked from commit 5fbda3af40)
2026-01-26 12:40:44 -08:00
Amin Ghadersohi 0f188a96f6 fix: Enable Playwright migration with graceful Selenium fallback (#35063)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fe7f8062f3)
2026-01-26 12:40:43 -08:00
Damian Pendrak 00e446623f refactor(deckgl): update deck.gl charts to use new api (#34859)
(cherry picked from commit dce74014da)
2026-01-26 12:40:43 -08:00
Alexandru Soare 60975a767a feat(database): Adding per-user caching option in Security tab (#34842)
(cherry picked from commit 5901320933)
2026-01-26 12:40:43 -08:00
Mehmet Salih Yavuz 4baacf5694 chore(matrixify): Remove leftover option (#35195)
(cherry picked from commit 38297edc6b)
2026-01-26 12:40:43 -08:00
Kamil Gabryjelski dbf99d99f9 chore: Bump ag grid to 34.2.0 (#35193)
(cherry picked from commit a889ae75fc)
2026-01-26 12:40:43 -08:00
Mehmet Salih Yavuz b09afd03e0 feat(TimeTable): add other sparkline type options (#35180)
(cherry picked from commit b60be9655f)
2026-01-26 12:40:43 -08:00
Joe Li 738b4468c8 fix(tests): migrate Cypress control tests to React Testing Library (#35181)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 127f6b3d66)
2026-01-26 12:40:43 -08:00
Joe Li 8469bf3dc8 feat(playwright): Add Playwright CI Integration for Cypress Migration (SIP-178) (#35110)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1187902e68)
2026-01-26 12:40:43 -08:00
Maxime Beauchemin 94ee1cc214 feat(matrixify): replace single toggle with separate horizontal/vertical layout controls (#35067)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit ad3eff9e90)
2026-01-26 12:40:43 -08:00
SBIN2010 c2048065ac feat(waterfall): add changes label series and grouping customize settings (#34847)
(cherry picked from commit 3e554674ff)
2026-01-26 12:40:43 -08:00
Amin Ghadersohi 89a36f74ef feat: Add BaseDAO improvements and test reorganization (#35018)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit dced2f8564)
2026-01-26 12:40:43 -08:00
Maxime Beauchemin d35efe3a76 feat: add optional garbage collection after requests (#35061)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit d0cc6f115b)
2026-01-26 12:40:43 -08:00
Hugh A. Miles II 1dc5b5bdb5 feat: Add Dashboard Filter Support for Alert Reports (#32196)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Hugh A Miles II <hugh@Mac.home>
(cherry picked from commit 966e231f94)
2026-01-26 12:40:43 -08:00
Richard Fogaca Nienkotter 5663fb7fa9 feat(custom-tooltip): custom tooltip on deck.gl charts (#34276)
(cherry picked from commit a66737cb05)
2026-01-26 12:40:43 -08:00
Elizabeth Thompson eaba081497 feat: Add comprehensive dark mode support for chart thumbnails and examples (#35111)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7d0a472d1e)
2026-01-26 12:40:42 -08:00
Maxime Beauchemin 6888fa1e1b feat: Add ECharts options overrides to theme system (#34876)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c2534f9155)
2026-01-26 12:40:42 -08:00
Rafael Benitez faa74d377d fix(DashboardEditor): CSS template selector UI in dashboard properties modal restored (#35106)
(cherry picked from commit dea9068647)
2026-01-26 12:40:42 -08:00
SBIN2010 491377e4c1 feat(BoxPlot): add chart data zoom (#35097)
(cherry picked from commit 454ed1883f)
2026-01-26 12:40:42 -08:00
Devanjan Banerjee ecaadac531 feat(Timeseries & MixedTimeseries): Force selected timegrain on timeseries intervals when the x-axis is of timestamp type (#34595)
(cherry picked from commit eb4351af83)
2026-01-26 12:40:42 -08:00
Mehmet Salih Yavuz d6c21acdd8 feat(embedded): Change function signature of setupExtensions (#35062)
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit 7a20a65a4d)
2026-01-26 12:40:42 -08:00
Gabriel Torres Ruiz c335bcb9a0 feat(dataset): create usage tab for dataset (#34707)
(cherry picked from commit 2f64343186)
2026-01-26 12:40:42 -08:00
Amin Ghadersohi 6d4b17fcf1 fix(utils): Suppress pandas date parsing warnings in normalize_dttm_col (#35042)
(cherry picked from commit 15e4e8df94)
2026-01-26 12:40:42 -08:00
Elizabeth Thompson cf18465e0d fix(utils): ensure webdriver timeout compatibility with urllib3 2.x (#34440)
(cherry picked from commit 385471c34d)
2026-01-26 12:40:42 -08:00
Beto Dealmeida 33363cc8b7 feat: allow create metric and add to folder in single request (#34993)
(cherry picked from commit 4e969d19d1)
2026-01-26 12:40:41 -08:00
Vitor Avila 3ebd40559c feat: Use dashboard name for screenshot download (#34988)
(cherry picked from commit ce74ae095d)
2026-01-26 12:40:41 -08:00
SBIN2010 5c5627c5a2 feat: add sort legend to legend section (#34911)
(cherry picked from commit 9424538bb1)
2026-01-26 12:40:41 -08:00
Maxime Beauchemin 1ea5e5af44 feat: add customizable brand spinners with theme integration (#34764)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit b0d3f0f0d4)
2026-01-26 12:40:41 -08:00
Danylo Korostil 2be38e4441 feat(api): dataset read API uuid support (#34836)
(cherry picked from commit 077724c2d2)
2026-01-26 12:40:41 -08:00
SBIN2010 ac8aa6bb03 feat(pie): add sort legend (#34323)
(cherry picked from commit dc7a8844eb)
2026-01-26 12:40:41 -08:00
Vitor Avila a0956a25f4 fix: Chart execution for Databricks (#34906)
(cherry picked from commit 54f071138c)
2026-01-26 12:40:41 -08:00
Kamil Gabryjelski ef6f34eaa6 perf: Use react-router to toggle fullscreen mode on dashboard (#34857)
(cherry picked from commit ce3b93d8a0)
2026-01-26 12:40:41 -08:00
Beto Dealmeida ab1a49fb07 feat(bigquery): show materialized views (#34766)
(cherry picked from commit cb24737825)
2026-01-26 12:40:41 -08:00
Maxime Beauchemin 4bc83507e6 feat: refactor modals to use consistent design patterns (#34711)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e8e1466185)
2026-01-26 12:40:41 -08:00
JUST.in DO IT 3259836e0b feat(sqllab): introduce splitter for adjusting sidebar and query panel (#34767)
(cherry picked from commit 63bb1d55a4)
2026-01-26 12:40:41 -08:00
Elizabeth Thompson d31d307d22 chore: catch sqlalchemy error (#34768)
(cherry picked from commit 009b99bfbb)
2026-01-26 12:40:40 -08:00
Maxime Beauchemin 82f4769ea0 feat(validation): Add SQL expression validation in popovers (#34642)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4683a0827d)
2026-01-26 12:40:40 -08:00
Beto Dealmeida 109fc05151 feat: improve perf of CSV uploads (#34603)
(cherry picked from commit a82e310600)
2026-01-26 12:40:40 -08:00
Maxime Beauchemin c37a91b5cb feat(matrixify): implement matrix of any charts as core Superset feature (#34526)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e6c8343fd0)
2026-01-26 12:40:40 -08:00
SBIN2010 36e8211306 feat: conditional formatting improvements in tables (#34330)
(cherry picked from commit 852adaa6cc)
2026-01-26 12:40:40 -08:00
Joe Li e73229e138 test(dashboard): strengthen fontWeightStrong assertion for markdown bold (#35872)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 2db19008fb)
2026-01-26 12:40:29 -08:00
Enzo Martellucci 3a38eb5483 fix(view-in-sqllab): unable to open virtual dataset after discarding chart edits (#35931)
(cherry picked from commit 392b880b52)
2026-01-26 12:40:29 -08:00
Joe Li 61db201a16 test(useThemeMenuItems): fix race conditions by awaiting all userEvent calls (#35918)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5224347c39)
2026-01-26 12:40:29 -08:00
Rafael Benitez 1dd37ed8c8 fix: pin remark-gfm to v3.0.1 for compatibility with react-markdown v8 (#36388)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit daec330127)
2026-01-26 12:40:29 -08:00
Joe LiandClaude Opus 4.5 5796871919 fix(time-range-modal): time range modal for out of scope filter is not displayed correctly (#36996)
Cherry-picked from 54919c9 with adaptation for 6.0 branch:

Accepted:
- FilterControls.tsx: Fix for overflowedByIndex calculation that now considers
  filterBarOrientation - out-of-scope filters in vertical mode are in a Collapse
  panel and should not be marked as overflowed
- DateFilterLabel.test.tsx: New tests for isOverflowingFilterBar prop behavior

Rejected:
- FilterControls.test.tsx: Incompatible with 6.0 - uses ChartCustomizationType,
  ChartCustomizationDivider, and props that don't exist in this branch version

Original commit: 54919c942a

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:43:15 -08:00
Jean Massucatto 054040be85 fix(dataset-editor): add missing Data type label in calculated columns tab (#37165)
(cherry picked from commit 04c5517206)
2026-01-23 13:38:06 -08:00
Gabriel Torres Ruiz c3a7048c10 fix(sqllab): add colorEditorSelection token for visible text selection (#36932) 2026-01-22 11:50:54 -08:00
Ramiro Aquino Romero 6b8409baf0 fix(api): nan is not properly handled for athena connections (#37071)
(cherry picked from commit fadab21493)
2026-01-22 11:07:10 -08:00
Rafael Benitez 0773e25383 fix: pin remark-gfm to v3.0.1 for compatibility with react-markdown v8 (#36388)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit daec330127)
2026-01-21 13:58:59 -08:00
Luis Sánchez da63984a21 fix(chart): Horizontal bar chart value labels cut off (#36989) 2026-01-21 13:38:00 -08:00
Ramiro Aquino Romero 444f49c6cf fix(delete-filter): deleted native filters are still shown until [sc-96553] (#37012) 2026-01-20 10:58:39 -08:00
Luis Sánchez 9f359f9124 fix(timeseries): x-axis last month was hidden (#37181)
(cherry picked from commit f4597be341)
2026-01-19 11:41:57 -08:00
Jamile Celento cfa0f03e88 fix(native-filters): enable Apply button when selecting Boolean FALSE value (#37017)
(cherry picked from commit 4393db57d9)
2026-01-19 09:32:10 -08:00
Geidō 682599d7de fix(Dashboard): Auto-apply filters with default values when extraForm… (#36927)
(cherry picked from commit 2900258e05)
2026-01-19 09:31:02 -08:00
Jean Massucatto b4b900adce fix(calendar-heatmap): correct month display across timezones (#37064)
(cherry picked from commit 2e29e33dd8)
2026-01-19 08:43:26 -08:00
tiya-9975 1a8bea4072 fix(sunburst): make Show Total text theme-aware (#37177)
Co-authored-by: DarshCode123 <darshjain193@gmail.com>
Co-authored-by: SBIN2010 <Sbin2010@mail.ru>
(cherry picked from commit f984dca5cc)
2026-01-19 08:38:44 -08:00
Yousuf Ansari 82e172dd3e fix(mixed-timeseries): prevent duplicate legend entries (#37217)
(cherry picked from commit a77c2d550c)
2026-01-19 08:37:44 -08:00
Brandon Sovran 261944713c fix: Implement SIP-40 error styles for GAQ (#36596)
(cherry picked from commit 0f56e3b9ae)
2026-01-16 16:03:45 -08:00
Pedro Rodrigues 0d7947c7fc feat: add droppable area to tab empty state (#37210)
(cherry picked from commit 4b1d92e575)
2026-01-16 15:48:26 -08:00
Kamil Gabryjelski bb7e56d8cc fix: HTML detection in tables (#37171)
(cherry picked from commit 54f19856de)
2026-01-16 10:42:52 -08:00
Kamil Gabryjelski e643a47deb fix: Move head_custom_extra above csrf token input (#37173)
(cherry picked from commit ab8df1ab34)
2026-01-16 10:42:21 -08:00
Mehmet Salih Yavuz 2083622f18 fix(controls): Only initialize categorical control on numeric x axis (#37115)
(cherry picked from commit 6eb4db6930)
2026-01-15 16:55:26 -08:00
Reynold Morel 98c8ffa0df fix(dashboard): revert cell hover and active colors to grayscale (#36991)
(cherry picked from commit 0404c99e39)
2026-01-14 15:38:15 -08:00
Jonathan Alberth Quispe Fuentes b183f04fa5 fix(table): keep d3-format semantics when applying currency formatting (#37039)
(cherry picked from commit ad3812edd7)
2026-01-13 11:01:33 -08:00
Damian Pendrak 3fcebdb1cb fix(deckgl): remove visibility condition in deckgl stroke color (#37029)
(cherry picked from commit 2a38ce001e)
2026-01-12 14:36:13 -08:00
ankitajhanwar2001 81149348f1 fix(sqlglot): use Athena dialect for awsathena parsing (#36747)
(cherry picked from commit d8f7ae83ee)
2026-01-12 14:36:13 -08:00
Amin Ghadersohi 7566a551ed fix(models): prevent SQLAlchemy and_() deprecation warning (#37020)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 911d72c957)
2026-01-12 14:36:13 -08:00
Mehmet Salih Yavuz e5192481c6 fix(reports): Use authenticated user as recipient for chart/dashboard reports (#36981)
(cherry picked from commit 4f5789abfe)
2026-01-12 14:36:13 -08:00
Mehmet Salih Yavuz aa3b497262 fix(Tabs): prevent infinite rerenders with nested tabs (#37018)
(cherry picked from commit 0294c30c9e)
2026-01-12 14:35:43 -08:00
Levis Mbote e67e602892 fix: handle undefined template variables safely in query rendering. (#35009)
(cherry picked from commit dfdf8e75d8)
2026-01-07 10:54:23 -08:00
Gabriel Torres Ruiz fe9202ee0b fix(alerts): wrong alert trigger with custom query (#35871)
(cherry picked from commit 5edaed2e5b)
2026-01-07 10:53:46 -08:00
Evan Rusackas c4fd5759af fix(security): enforce datasource access control in get_samples() (#36550)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 861e5cd013)
2026-01-07 10:52:24 -08:00
amaannawab923 977ff44851 fix(ag-grid): Ag Grid Date Filter timezone correction (#36270)
(cherry picked from commit d7d94ba640)
2026-01-07 10:51:51 -08:00
Joe Li d3ba4c7b21 fix(dashboard): prevent table chart infinite reload loop (#36686)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit c026ae2ce7)
2026-01-06 14:37:40 -08:00
Felipe López 16f1bb5b88 fix(SQLLab): remove error icon displayed when writing Jinja SQL even when the script is correct (#36422)
(cherry picked from commit cedc35e39f)
2026-01-06 11:51:55 -08:00
JUST.in DO IT 68c03f501c fix(trino): update query progress using cursor stats (#36872)
(cherry picked from commit 12a266fd2f)
2026-01-06 09:58:58 -08:00
Enzo Martellucci cdb0317be8 fix(plugin-chart-table): remove column misalignment when no scrollbars are present (#36891)
(cherry picked from commit 740ddc03e2)
2026-01-05 11:59:00 -08:00
innovark d3eec7772a fix(RightMenu): fix inconsistent icon alignment in RightMenu items (#36532)
(cherry picked from commit d07a452e9b)
2026-01-05 11:57:55 -08:00
innovark 0022644b84 fix(SavedQueries): unify query card actions styling across all home page cards (#36671)
(cherry picked from commit e5489bd30f)
2026-01-05 11:57:26 -08:00
Levis Mbote 7702515c53 fix(logout): clicking logout displays an error notification "invalid username or password" (#36490) 2026-01-05 11:56:26 -08:00
Luis Sánchez 6042099296 fix(TableChart): render cell bars for columns with NULL values (#36819) 2026-01-05 11:50:32 -08:00
Mehmet Salih Yavuz 0503983d59 fix: Clear database form errors (#36854) 2026-01-05 11:37:13 -08:00
Enzo MartellucciandDiego Pucci 668026eeac fix: SqlLab error when collapsing the left panel preview (#36858)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
2026-01-05 11:24:46 -08:00
Enzo Martellucci 3d644e6918 fix(chart-creation): use exact match when loading dataset from URL parameter (#36831)
(cherry picked from commit fe5d5fdae6)
2026-01-05 08:47:01 -08:00
Levis Mbote 747b4c0125 fix: fix error with dashboard filters when global async queries is enabled and user navigates quickly (#36639) 2026-01-05 08:45:54 -08:00
Mehmet Salih Yavuz fee1f16bfe fix(TableCollection): only apply highlight class when defined (#36809)
(cherry picked from commit 28c802fb6c)
2025-12-29 13:11:06 -08:00
Enzo Martellucci 3b15ff3d83 fix: UI cut off (#36531)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 32c98d02d3)
2025-12-29 13:11:05 -08:00
Vitor Avila 9e9e8ce056 fix: Use is_active for guest users (#36716)
(cherry picked from commit 737a5162e4)
2025-12-17 13:35:28 -08:00
Yousuf Ansari cc428c7a5c fix(echarts): use scroll legend for horizontal layouts to prevent overlap (#36306)
(cherry picked from commit 33a425bbbc)
2025-12-17 12:01:25 -08:00
SBIN2010 8a92092d7e fix: removed dashboard from main page in "All" tab, refreshes dashboard list (#35945) 2025-12-17 12:00:00 -08:00
Evan Rusackas cffaffd769 fix(dashboard): import with overwrite flag replaces charts instead of merging (#36551)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 52c711b0bc)
2025-12-17 11:20:47 -08:00
Evan Rusackas c5c72bbad7 fix(sql): handle backtick-quoted identifiers with base dialect (#36545)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c7a4d4f2cc)
2025-12-16 15:25:27 -08:00
Alexandru Soare 4588d84929 fix(tab): Fix tabs in column not clickable (#36528)
(cherry picked from commit 8b1c41a012)
2025-12-16 15:24:35 -08:00
Evan Rusackas 844c3e1279 fix(api): Fix JWT authentication for /api/v1/me endpoints (#36410)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1f5df7407f)
2025-12-16 15:22:35 -08:00
Elizabeth Thompson 8e70875d6b fix: add subdirectory deployment support for app icon and reports urls (#35098)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Daniel Gaspar <danielvazgaspar@gmail.com>
(cherry picked from commit b35b1d7633)
2025-12-15 14:17:22 -08:00
Luis Sánchez 03e5001e0e fix(SqlLab): enhance SQL formatting with Jinja template support. (#36277)
(cherry picked from commit e7c060466d)
2025-12-15 10:09:51 -08:00
Risheit Munshi cbd27802a8 fix(chart): Display better hover text for country map charts (#36323)
Co-authored-by: askinner1 <144823527+askinner1@users.noreply.github.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 67cf287c03)
2025-12-15 09:59:53 -08:00
Shunki df28ce4deb fix(roles): Add missing SQLLab permissions for estimate and format (#36263)
(cherry picked from commit 440cbc4c1f)
2025-12-15 09:17:06 -08:00
Sam Firke 1236a8582e fix(heatmap): y-axis sorts in order (#36302)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 3345eb32c5)
2025-12-08 15:42:23 -08:00
Enzo Martellucci b1c57c1fc8 fix(Gauge): clearing previously set min and max values in a gauge chart sets the data labels to 0 (#36425)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 236e000398)
2025-12-08 15:41:30 -08:00
Elizabeth Thompson 66a7a0a690 fix(reports): simplify logging to focus on timing metrics (#36227)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vitor Avila <vitorfragadeavila@gmail.com>
(cherry picked from commit c36ac53445)
2025-12-08 15:41:30 -08:00
Gabriel Torres Ruiz 3ce1687725 fix(echarts): pass vizType to enable theme overrides in all chart types (#36389)
(cherry picked from commit 1d8d30e5bb)
2025-12-08 15:30:04 -08:00
yousoph 3e42dd8511 fix: button text capitalization (#36444) 2025-12-08 13:48:10 -08:00
Joe Li 6a1c30e5e7 chore: update changelog for 6.0.0rc4 2025-12-04 10:55:36 -08:00
Felipe López e763c96381 fix(SQLLab): most recent queries at the top in Query History without refreshing the page (#36359)
(cherry picked from commit 62d86aba14)
2025-12-03 10:17:30 -08:00
Beto Dealmeida 0753fd4c45 fix: is_column_reference check (#36382)
(cherry picked from commit d05ab91d11)
2025-12-02 13:15:39 -08:00
om pharate 3a537498f6 feat(controlPanel): add integer validation for rows per page setting (#36289)
(cherry picked from commit 01f032017f)
2025-12-01 14:46:28 -08:00
Daniel Vaz Gaspar 8f061d0c0a fix(log): remove unwanted info from logs REST API (#36269)
(cherry picked from commit bae716fa83)
2025-11-25 16:07:35 -08:00
Daniel Vaz Gaspar e0e52086cd fix: remove unwanted info from tags REST API (#36266)
(cherry picked from commit cd36845d56)
2025-11-25 08:41:39 -08:00
Enzo Martellucci 2a21ef6dc9 fix: Columns bleeding into other cells (#36134)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit 062e4a2922)
2025-11-25 08:41:01 -08:00
Enzo Martellucci 72fbaa6677 fix: Table chart types headers are offset from the columns in the table (#36190)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit ab8352ee66)
2025-11-25 08:40:15 -08:00
Enzo Martellucci 6d49d1e182 fix: Extra controls width for Area Chart on dashboards (#36133)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit cac6ffcd3c)
2025-11-25 08:39:46 -08:00
Elizabeth Thompson 5b51c7e89e fix(screenshots): Only cache thumbnails when image generation succeeds (#36126)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 08c1d03479)
2025-11-25 08:38:39 -08:00
Beto Dealmeida 74f455f076 fix: adhoc column quoting (#36215)
(cherry picked from commit e303537e0c)
2025-11-21 13:43:04 -08:00
Daniel Vaz Gaspar a911a50680 fix(sqllab): validate results backend writes and enhance 410 diagnostics (#36222)
(cherry picked from commit 348b19cb4c)
2025-11-21 11:18:33 -08:00
Enzo Martellucci 5b820699e8 fix(dashboard): adjust vertical spacing for numerical range filter to prevent overlaps (#36167)
(cherry picked from commit 6d359161bb)
2025-11-20 09:25:55 -08:00
Joe Li c3308f4447 chore: update changelog for 6.0.0rc3 2025-11-19 16:07:14 -08:00
Beto Dealmeida 9cfd35d43a chore: bump duckdb et al. (#36171)
(cherry picked from commit 53207302f9)
2025-11-19 13:55:45 -08:00
Evan Rusackas 785a6d0237 chore(docs): config Kapa to use logo from the repo (#36177)
(cherry picked from commit cdbd5bf4f9)
2025-11-19 13:48:28 -08:00
Richard Fogaca Nienkotter 71be38f003 fix(dashboard): ensure charts re-render when visibility state changes (#36011)
(cherry picked from commit 4582f0e8d2)
2025-11-19 13:47:44 -08:00
Enzo Martellucci f3db80bfee fix(datasets): prevent viewport overflow in dataset creation page (#36166)
(cherry picked from commit a268232ed6)
2025-11-18 14:23:20 -08:00
SBIN2010 6cc46750b9 fix: role list edit modal height (#36123)
(cherry picked from commit 43e9e1ec36)
2025-11-18 11:00:58 -08:00
Richard Fogaca Nienkotter c9a7f2d02e fix(cache): apply dashboard filters to non-legacy visualizations (#36109)
(cherry picked from commit 8315804c85)
2025-11-18 11:00:20 -08:00
Richard Fogaca Nienkotter 3c5868c412 fix: 'save and go to dashboard' option was disabled after changing the chart type (#36122)
(cherry picked from commit a9fd600c52)
2025-11-18 10:59:13 -08:00
PolinaFam 4112fecc93 fix(translations): Fix Russian translations for EmptyState (#34055)
Co-authored-by: Polina Fam <pfam@ptsecurity.com>
(cherry picked from commit fb325a8f24)
2025-11-18 10:51:03 -08:00
Yuvraj Singh Chauhan ea1ab05e8d fix(tags): ensure tag creation is compatible with MySQL by avoiding Markup objects (#36075)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 28bdec2c79)
2025-11-18 10:49:04 -08:00
Beto Dealmeida 0e3092dd56 fix(datasets): prevent double time filter application in virtual datasets (#35890)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3b226038ba)
2025-11-18 10:48:18 -08:00
Gabriel Torres Ruiz 91814f3dfe fix(navbar): some styling + components inconsistencies (#36120)
(cherry picked from commit 9bff64824b)
2025-11-17 15:06:20 -08:00
Yong Le He c9501fddb8 fix(dashboard): ensure world map chart uses correct country code format in crossfilter (#35919)
(cherry picked from commit fb8eb2a5c3)
2025-11-17 11:38:21 -08:00
Levis Mbote fe58baa23c fix: fix crossfilter persisting after removal (#35998)
(cherry picked from commit 85413f2a65)
2025-11-17 11:35:58 -08:00
SBIN2010 19ebeea030 fix: opacity color formating (#36101) 2025-11-14 15:53:42 -08:00
Joe LiandClaude 18ed2290bc fix(table-chart): fix missing table header IDs (#35968)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 15:53:24 -08:00
Richard Fogaca Nienkotter 79ec265a30 fix: save button was enabled even no changes were made to the dashboard (#35817) 2025-11-14 14:24:47 -08:00
Janani Gurram aab835a096 fix(histogram): add NULL handling for histogram (#35693)
Co-authored-by: Rachel Pan <r.pan@mail.utoronto.ca>
Co-authored-by: Rachel Pan <panrrachel@gmail.com>
Co-authored-by: Janani Gurram <68124448+JG-ctrl@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit c955a5dc08)
2025-11-14 13:58:38 -08:00
Beto Dealmeida b19372fe16 fix: RLS in virtual datasets (#36061)
(cherry picked from commit f3e620cd0f)
2025-11-14 13:58:26 -08:00
Enzo Martellucci a083e189e2 fix(ace-editor-popover): main AntD popover closes when clicking autocomplete suggestions in Ace Editor (#35986)
(cherry picked from commit 9ef87e75d5)
2025-11-14 12:51:52 -08:00
Richard Fogaca Nienkotter 0f5918dbd9 fix(chart): align legend with chart grid in List mode for Top/Bottom orientations (#36077)
(cherry picked from commit 37d58a476c)
2025-11-14 12:24:03 -08:00
Richard Fogaca Nienkotter 3a54cade44 fix(dashboard): prevent tab content cutoff and excessive whitespace in empty tabs (#35834)
(cherry picked from commit 78f9debdd4)
2025-11-14 12:13:55 -08:00
Mehmet Salih Yavuz cbdbc2c295 fix(dashboard): refresh tabs as they load when dashboard is refreshed (#35265)
(cherry picked from commit 74a590cb76)
2025-11-14 12:12:17 -08:00
Richard Fogaca Nienkotter 548480bd8e fix(explore): re-apply filters when 'Group remaining as Others' is enabled (#35937)
(cherry picked from commit 4a04d46118)
2025-11-13 22:12:28 -08:00
Vitor Avila 6179eb9ef4 fix: Use singlestoredb dialect for sqlglot (#36096)
(cherry picked from commit 6701d0ae0c)
2025-11-13 22:10:06 -08:00
Gabriel Torres Ruiz 15c4ee63b2 fix(navbar): Minor fixes in navbar spacings (#36091)
(cherry picked from commit 4515d18ddd)
2025-11-13 22:09:32 -08:00
Mehmet Salih Yavuz 89a36ea131 fix(sql): quote column names with spaces to prevent SQLGlot parsing errors (#35553)
(cherry picked from commit 306f4c14cf)
2025-11-13 22:08:42 -08:00
Levis Mbote 2d0017033c fix: fix tabs overflow in dashboards (#35984)
(cherry picked from commit bb2e2a5ed6)
2025-11-13 21:21:11 -08:00
Richard Fogaca Nienkotter 1a4ae81058 fix(dashboard): dashboard filter was incorrectly showing as out of scope (#35886)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit a45c0528da)
2025-11-13 19:41:20 -08:00
Richard Fogaca Nienkotter c9d8baf9a1 fix(dashboard): align filter bar elements vertically in horizontal mode (#36036)
(cherry picked from commit d123249bd2)
2025-11-12 10:53:18 -08:00
Richard Fogaca Nienkotter a2fcb64ef3 fix(sqllab): prevent unwanted tab switching when autocompleting table names on SQL Lab (#35992)
(cherry picked from commit 9fbfcf0ccd)
2025-11-12 10:42:01 -08:00
Richard Fogaca Nienkotter 8a84b17270 fix: saved query preview modal not highlighting active rows (#35866)
(cherry picked from commit 4376476ec4)
2025-11-12 10:41:06 -08:00
Mehmet Salih Yavuz 992cb83088 fix(permalink): exclude edit mode from dashboard permalink (#35889)
(cherry picked from commit e2e831e322)
2025-11-12 10:40:15 -08:00
Joe Li 8c43578b70 fix(explore): show validation errors in View Query modal (#35969)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 21d585d586)
2025-11-11 17:19:26 -08:00
Kamil Gabryjelski 933ec0a918 fix: Flakiness around scrolling during taking tiled screenshots with Playwright (#36051)
(cherry picked from commit 63dfd95aa2)
2025-11-10 11:56:32 -08:00
Mehmet Salih Yavuz 70117eb55f fix(date_parser): add check for time range timeshifts (#36039)
(cherry picked from commit c9f65cf1c2)
2025-11-10 10:08:45 -08:00
Elizabeth Thompson 8c22e61ef1 fix(reports): improve error handling for report schedule execution (#35800)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c42e3c6837)
2025-11-10 10:08:39 -08:00
Elizabeth Thompson bed186b32f fix(filters): preserve backend metric-based sorting (#35152)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 909bd877c9)
2025-11-07 12:06:02 -08:00
Vedant Prajapati a52cfef8b1 fix(echarts): Series style hidden for line charts (#33677)
Co-authored-by: Vedant Prajapati <vedantprajapati@geotab.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 258512fef2)
2025-11-07 12:04:11 -08:00
Kamil Gabryjelski 3b7a52d1eb fix: Ensure that Playwright tile height is always positive (#36027)
(cherry picked from commit 728bc2c632)
2025-11-07 12:03:10 -08:00
amaannawab923 d8c8430ed7 fix(Context-Menu): Fixing Context Menu for Table Chart with Html Content (#33791)
(cherry picked from commit 0307c71945)
2025-11-07 12:02:20 -08:00
Gabriel Torres Ruiz bc3f146eaf fix(UI): spacings + UI fixes (#36010)
(cherry picked from commit c11be72ead)
2025-11-07 11:18:29 -08:00
Mehmet Salih Yavuz 1245a1e26a fix(SelectFilterPlugin): clear all clears all filters including dependent ones (#35303)
(cherry picked from commit af37e12de4)
2025-11-06 19:42:21 -08:00
Enzo Martellucci 446136b46c fix(view-in-sqllab): unable to open virtual dataset after discarding chart edits (#35931)
(cherry picked from commit 392b880b52)
2025-11-06 18:05:12 -08:00
ethan-l-geotab 33e53143e6 fix(chart list): Facepile shows correct users when saving chart properties (#33392)
(cherry picked from commit 14f20e644e)
2025-11-06 17:23:56 -08:00
Enzo Martellucci 706a04be7f fix(DatabaseModal): prevent errors when pasting text into supported database select (#35916)
(cherry picked from commit 1f960d5761)
2025-11-06 17:23:23 -08:00
Mehmet Salih Yavuz 2c86d1ae9c fix(explore): Overwriting a chart updates the form_data_key (#35888)
(cherry picked from commit 3f49938b79)
2025-11-06 16:04:45 -08:00
Mehmet Salih Yavuz 8bc1f98033 fix(TimeTable): Match calculations between filtered and non filtered states (#35619)
(cherry picked from commit 04231c86db)
2025-11-06 16:00:21 -08:00
Rafael Benitez f7ebdd71e7 fix(dashboard): fix dataset search in filter config modal (#35488)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 53687ae659)
2025-11-06 14:23:45 -08:00
Mehmet Salih Yavuz c48b5ad65e fix(DatasourceEditor): preserve calculated column order when editing sql (#35790)
(cherry picked from commit 7265567561)
2025-11-04 11:59:56 -08:00
Joe Li 8e4efe2cc2 test(useThemeMenuItems): fix race conditions by awaiting all userEvent calls (#35918)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5224347c39)
2025-11-03 10:42:29 -08:00
Richard Fogaca Nienkotter e818d0b11f fix(sqllab): align refresh buttons with select input fields (#35917)
(cherry picked from commit 27011d0239)
2025-11-03 10:42:03 -08:00
Joe Li e0a4b98351 fix(explore): formatting the SQL in "View Query" pop-up doesn't format (#35898)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit be3690c22b)
2025-11-03 10:41:36 -08:00
Yuvraj Singh Chauhan 131359c78f fix(db2): update time grain expressions for DAY to use DATE function (#35848)
(cherry picked from commit 30d584afd1)
2025-10-31 09:52:37 -07:00
Ville Brofeldt 6267856b0d fix: set pandas 2.1 as requirement (#35912)
(cherry picked from commit f6f15f58ee)
2025-10-31 09:48:04 -07:00
Beto Dealmeida ce21b04621 chore: bump shillelagh to 1.4.3 (#35895)
(cherry picked from commit 5fc934d859)
2025-10-30 12:30:15 -07:00
SBIN2010 1fdb3210f9 fix: displaying cell bars in table (#35885)
(cherry picked from commit dd857a2c7a)
2025-10-30 11:55:11 -07:00
Amin Ghadersohi e21cb9a6d9 fix: add utc=True to pd.to_datetime for timezone-aware datetimes (#35587)
(cherry picked from commit 5c57c9c0b2)
2025-10-29 10:52:38 -07:00
Elizabeth Thompson 3f6f53569f fix(reports): Add celery task execution ID to email notification logs (#35807)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 61c68f7b8f)
2025-10-29 10:51:43 -07:00
Mehmet Salih Yavuz 87f36d2b2f fix(echarts): fix time shift color matching functionality (#35826)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5218b4eea2)
2025-10-29 10:51:06 -07:00
innovark 36c14f81f3 fix: update Russian translations (#35750)
(cherry picked from commit 61758c07d2)
2025-10-28 13:34:26 -07:00
Joe Li e5ee7a0a15 fix(theme): add fontWeightStrong to allowedAntdTokens to fix bold markdown rendering (#35821)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit bf830b2dd5)
2025-10-28 13:33:41 -07:00
Martyn Gigg 78a53484fc fix(sqllab): Fix CSV export button href in SQL Lab when application root is defined (#35118)
(cherry picked from commit 6704c0aaec)
2025-10-28 12:55:36 -07:00
Mehmet Salih Yavuz 5ecd067ed3 fix(SqlLab): South pane visual changes (#35601)
(cherry picked from commit 6e60a00d69)
2025-10-28 11:39:24 -07:00
ngokturkkarli 78983a6f25 fix(native-filters): prevent circular dependencies and improve dependency handling (#35317)
(cherry picked from commit 0bf34d4d6f)
2025-10-28 10:49:54 -07:00
Levis Mbote 4d996cec5e fix(database-modal): fix issue where commas could not be typed into DB configuration. (#35289)
(cherry picked from commit 19473af401)
2025-10-28 10:48:34 -07:00
Daniel Vaz Gaspar 41ac8d8d9c fix: unpin holidays and prophet (#35771)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 51aad52e6c)
2025-10-28 10:47:02 -07:00
Elizabeth Thompson d1feafb400 fix(dashboard): handle invalid thumbnail BytesIO objects gracefully (#35808)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7c9720e22b)
2025-10-28 10:45:05 -07:00
Marcos Amorim 877997ceda fix(alerts): improve Slack API rate limiting for large workspaces (#35622)
(cherry picked from commit c3b8c96db6)
2025-10-28 10:44:07 -07:00
Joe Li 26177314db docs(db_engine_specs): restructure feature table for GitHub rendering (#35809)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 93cb60b24e)
2025-10-28 10:42:28 -07:00
Gabriel Torres Ruiz a3aef76427 fix(ag-grid): fix conditional formatting theme colors and module extensibility (#35605)
(cherry picked from commit 5e4a80e5d0)
2025-10-23 16:26:54 -07:00
Richard Fogaca Nienkotter fc222eefb7 fix: edit dataset modal visual fixes (#35799)
(cherry picked from commit 1234533c67)
2025-10-23 11:01:48 -07:00
Mehmet Salih Yavuz 36bacf2ae4 fix(ThemeController): replace fetch with SupersetClient for proper auth (#35794)
(cherry picked from commit 7f0c0aea94)
2025-10-22 11:47:27 -07:00
Mehmet Salih Yavuz bda2d8c145 fix(security): Add active property to guest user (#35454)
(cherry picked from commit 98fba1eefe)
2025-10-22 11:45:44 -07:00
Geidō a30b212a37 fix(Actions): Improper spacing (#35724)
(cherry picked from commit bad03b1e76)
2025-10-21 14:32:26 -07:00
Erkka Tahvanainen b07011872b fix(playwright): Download dashboard correctly (#35484)
Co-authored-by: Erkka Tahvanainen <erkka.tahvanainen@confidently.fi>
(cherry picked from commit d089a96163)
2025-10-20 15:52:31 -07:00
yousoph 23b02963b6 fix(charts): update axis title labels to sentence case (#35694)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 9ab0a0179d)
2025-10-17 13:29:02 -07:00
Sam Firke 80fce9a662 fix(auth): redirect anonymous attempts to view dashboard with next (#35345) 2025-10-17 12:53:08 -07:00
Beto Dealmeida 3bfd4efa21 fix(dataset): render default URL description properly in settings (#35669)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit f405174fcf)
2025-10-16 16:50:46 -07:00
Gabriel Torres Ruiz 151633a1fd fix(theme-crud): enable overwrite confirmation UI for theme imports (#35558)
(cherry picked from commit de1dd53186)
2025-10-15 18:23:00 -07:00
Gabriel Torres Ruiz fe7823cc10 fix(table-chart): fix page size label visibility and improve header control wrapping (#35648)
(cherry picked from commit 58672dfab6)
2025-10-15 18:22:44 -07:00
Rafael Benitez f7a64f05c5 fix(theme): align "Clear local theme" option with other theme menu items (#35651)
(cherry picked from commit 4b5629d1c8)
2025-10-15 18:22:30 -07:00
Elizabeth Thompson 35861f7ec0 fix: Log Celery task failures with a signal handler (#35595)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit ccc0e3dbb2)
2025-10-15 16:06:57 -07:00
innovark 7abe5c379e fix(d3-format): call setupFormatters synchronously to apply D3 format… (#35529)
(cherry picked from commit c38ba1daa8)
2025-10-14 14:22:24 -07:00
Damian Pendrak 36f23a003f fix(deckgl): scatterplot fix categorical color (#35537) 2025-10-14 14:19:36 -07:00
Luiz Otavio 412d9c8cbc fix(csv upload): Correctly casting to string numbers with floating points (e+) (#35586)
(cherry picked from commit 17ebbdd966)
2025-10-10 14:32:26 -07:00
Elizabeth Thompson c799f5cedd fix(alerts): log execution_id instead of report schedule name in query timing (#35592)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e437ae1f2f)
2025-10-10 12:30:56 -07:00
Mehmet Salih Yavuz 1d6d12cfb4 fix(tables): Dark mode scrollbar styles for webkit (#35338)
(cherry picked from commit 412587ad41)
2025-10-10 12:26:03 -07:00
Mehmet Salih Yavuz b41ad89474 fix(Alerts): Correct icon sizes (#35572)
(cherry picked from commit 5a15c632ad)
2025-10-09 09:38:41 -07:00
Daniel Vaz Gaspar 52993e68e1 fix: dataset update with invalid SQL query (#35543)
(cherry picked from commit 50a5854b25)
2025-10-08 17:13:41 -07:00
Gabriel Torres Ruiz 2a474e017a fix(charts): fix legend theming and hollow symbols in dark mode (#35123)
(cherry picked from commit 7fd5a7668b)
2025-10-08 15:08:16 -07:00
Rafael Benitez 8d4a1cfc05 fix(chart): Fixes BigNumber gradient appearing blackish in light mode (#35527)
(cherry picked from commit f7b9d7a64b)
2025-10-07 10:56:17 -07:00
Mehmet Salih Yavuz 6c82d480a7 fix(explore): Include chart canvases in the screenshot (#35491)
(cherry picked from commit 89932fa0b2)
2025-10-07 10:55:47 -07:00
Daniel Vaz Gaspar f6b050d270 fix: update chart with dashboards validation (#35523)
(cherry picked from commit 9d50f1b8a2)
2025-10-07 10:35:43 -07:00
Amin Ghadersohi 22c8551d64 fix(webdriver): add missing options object to WebDriver initialization (#35504)
(cherry picked from commit 77c3146829)
2025-10-06 13:43:08 -07:00
Vitor Avila 37e280f5bd fix: Support metric macro for embedded users (#35508)
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit 4545d55d30)
2025-10-06 13:42:40 -07:00
Rafael Benitez bc1fda5a4a fix(explore): correct search icon in dashboard submenu (#35489)
(cherry picked from commit a7b158c7fa)
2025-10-06 13:42:07 -07:00
Mehmet Salih Yavuz 0a6b3de884 fix(Select): Prevent closing the select when clicking on a tag (#35487)
(cherry picked from commit d39c55e941)
2025-10-06 13:39:57 -07:00
Elizabeth ThompsonandClaude 012765cd0b fix(loading): improve loading screen theming for dark mode support (#35129)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-06 11:44:32 -07:00
Tran Ngoc Tuan b633bc5577 fix(security-manager): switch from deprecated get_session to session attribute (#35290)
(cherry picked from commit 04b1a45416)
2025-10-03 16:33:53 -07:00
Beto Dealmeida d5fa2d86f0 fix(sqlglot): adhoc expressions (#35482)
(cherry picked from commit 139b5ae20c)
2025-10-03 11:28:20 -07:00
Mehmet Salih Yavuz 8dbbbbf136 fix(dashboard): Navigate to new dashboard when saved as a new one (#35339)
(cherry picked from commit 891f826143)
2025-10-03 11:27:41 -07:00
Mehmet Salih Yavuz e61a0dd619 fix(theming): CRUD view padding (#35321)
(cherry picked from commit 0e2fb1d1a3)
2025-10-03 11:26:00 -07:00
amaannawab923 24a84a23f2 fix(ag-grid-table): remove enterprise features to use community version (#35453)
(cherry picked from commit 96170e43c0)
2025-10-03 11:25:32 -07:00
Beto Dealmeida e4cbc5db4c fix(cache): ensure SQL is sanitized before cache key generation (#35419)
(cherry picked from commit 62dc5c0306)
2025-10-02 10:59:44 -07:00
Beto Dealmeida e0e8d1d177 fix(pinot): more functions (#35451)
(cherry picked from commit 3202ff4b3f)
2025-10-02 10:57:56 -07:00
Gabriel Torres Ruiz b47dc64cd5 fix(dashboard): exit markdown edit mode when clicking outside of element (#35336)
(cherry picked from commit 553204e613)
2025-10-02 10:57:35 -07:00
Rafael Benitez 61bf39f0d5 fix(dataset): sort by database in Dataset and Saved queries Issue (#35277)
(cherry picked from commit fe8348c03a)
2025-10-02 10:57:19 -07:00
Beto Dealmeida efbfcd737d fix(pinot): SUBSTR function (#35427)
(cherry picked from commit 30021f8ede)
2025-10-02 10:57:00 -07:00
Beto Dealmeida 4c60bd1392 fix(pinot): DATE_SUB function (#35426)
(cherry picked from commit f3349388d0)
2025-10-02 10:56:46 -07:00
Antonio Rivero 6420d06fc0 fix(slice): Fix using isdigit when id passed as int (#35452)
(cherry picked from commit 449a89c214)
2025-10-02 10:56:23 -07:00
Beto Dealmeida 51396f0b94 fix(pinot): DATE_ADD function (#35424)
(cherry picked from commit 5428376662)
2025-10-02 10:56:08 -07:00
Beto Dealmeida 6bb13ef3b4 fix(pinot): dialect date truncation (#35420)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit aa97d2fe03)
2025-10-01 13:15:17 -07:00
Beto Dealmeida b842eeb893 fix: table quoting in DBs with supports_cross_catalog_queries=True (#35350)
(cherry picked from commit 13a164dd63)
2025-10-01 13:14:35 -07:00
Rafael Benitez 50e2a06306 fix(explore): close unsaved changes modal when discarding changes (#35307)
(cherry picked from commit d8688cf8b1)
2025-10-01 13:14:08 -07:00
Geidō e80f44716c fix(SqlLab): Hit tableschemaview with a valid queryEditorId (#35341)
(cherry picked from commit a66c230058)
2025-10-01 13:13:29 -07:00
Beto Dealmeida 94d10af733 fix(pinot): restrict types in dialect (#35337)
(cherry picked from commit bf88d9bb1c)
2025-09-30 13:52:42 -07:00
Beto Dealmeida 8d49999af6 fix: adhoc orderby in explore (#35342)
(cherry picked from commit d51b35f61b)
2025-09-30 13:52:30 -07:00
Beto Dealmeida 927c94306e feat: sqlglot dialect for Pinot (#35333)
(cherry picked from commit 4e093a8e2a)
2025-09-30 10:55:26 -07:00
Mehmet Salih Yavuz 5074ee0af8 fix(doris): Don't set supports_cross_catalog_queries to true (#35332)
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit ef78d2af06)
2025-09-30 10:12:35 -07:00
Geidō 7ba76a85f4 fix: AceEditor Autocomplete Highlight (#35316)
(cherry picked from commit 90f281f585)
2025-09-29 16:14:53 -07:00
Elizabeth Thompson d9646dedd9 fix(DatasourceModal): replace imperative modal updates with declarative state (#35256)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 82e2bc6181)
2025-09-29 14:17:28 -07:00
Gabriel Torres Ruiz ac582322b8 fix(sqllab): fix blank bottom section in SQL Lab left panel (#35309)
(cherry picked from commit 784ff82847)
2025-09-29 09:45:29 -07:00
Mehmet Salih Yavuz d2d99d4698 fix(DateFilterControl): remove modal overlay style to fix z-index issues (#35292)
(cherry picked from commit 027b25e6b8)
2025-09-29 09:42:26 -07:00
SBIN2010 76d13176a1 fix(table): New ad-hoc columns retain the name of previous columns (#35274)
(cherry picked from commit b652fab042)
2025-09-29 09:42:01 -07:00
Geidō f6209e1ca9 fix: Cosmetic issues (#35122) 2025-09-25 16:34:27 -07:00
Mehmet Salih Yavuz 97649d7290 fix(BuilderComponentPane): navigation tabs padding (#35213)
(cherry picked from commit 7a9dbfe879)
2025-09-25 10:38:10 -07:00
Giulio Piccolo df0f6f6ec3 fix(deck.gl): ensure min/max values are included in polygon map legend breakpoints (#35033)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit 0de78d8203)
2025-09-25 10:38:00 -07:00
Beto Dealmeida 0a89b306e5 fix(SQL Lab): syncTable on new tabs (#35216)
(cherry picked from commit 94686ddfbe)
2025-09-24 14:10:52 -07:00
SBIN2010 7263133c52 fix(Mixed Chart): Tooltip incorrectly displays numbers with optional Y-axis format and showQueryIdentifiers set to true (#35224)
(cherry picked from commit ec322dfd8d)
2025-09-24 14:10:37 -07:00
Elizabeth Thompson a4e3d21176 fix(dashboard): update header border to use colorBorder token (#35199)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit b6f6b75348)
2025-09-24 13:44:06 -07:00
Mehmet Salih Yavuz 485ff97b0f fix(ConditionalFormattingControl): icon color in dark mode (#35243)
(cherry picked from commit c601341520)
2025-09-23 12:01:22 -07:00
Levis Mbote 1621c70b68 fix(table-chart): fix cell bar visibility in dark theme (#35211)
(cherry picked from commit ce55cc7dd7)
2025-09-23 12:00:51 -07:00
Gabriel Torres Ruiz 13b7bbe9a4 feat(bug): defensive code to avoid accesing attribute of a NoneType object (#35219)
(cherry picked from commit 48e1b1ff2c)
2025-09-23 12:00:17 -07:00
Joe Li 886f525545 chore: Adds RC2 data to CHANGELOG.md 2025-09-22 12:30:01 -07:00
Beto Dealmeida b76a0e1d2d chore: bump sqlglot to 27.15.2 (#35176)
(cherry picked from commit 5ec8f9d886)
2025-09-22 10:23:01 -07:00
Mehmet Salih Yavuz 542efcdb11 fix(SQLPopover): Use correct component (#35212)
(cherry picked from commit 076e477fd4)
2025-09-22 10:22:49 -07:00
SBIN2010 0ac7464649 fix: bug in tooltip timeseries chart in calculated total with annotation layer (#35179)
(cherry picked from commit 1e4bc6ee78)
2025-09-21 18:30:22 -07:00
Pat Buxton e5bb8bf0ff fix: Bump pandas to 2.1.4 for python 3.12 (#34999)
(cherry picked from commit db178cf527)
2025-09-21 18:30:12 -07:00
SBIN2010 8306b66515 fix(Funnel): onInit overridden row_limit to default value on save chart (#35076)
(cherry picked from commit 23bb4f88c0)
2025-09-21 18:29:59 -07:00
Levis Mbote 9a0dc23755 fix(gantt-chart): fix Y-axis label visibility in dark theme (#35189)
(cherry picked from commit 4130b92966)
2025-09-21 18:29:28 -07:00
marun 5561f529f2 fix(CrudThemeProvider): Optimized theme loading logic (#35155)
(cherry picked from commit 1bf112a57a)
2025-09-21 18:29:03 -07:00
marun b0ceb2a162 fix(embedded): resolve theme context error in Loading component (#35168)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1f530d45cb)
2025-09-21 18:28:36 -07:00
Maxime Beauchemin 7fde43b476 fix(viz): resolve dark mode compatibility issues in BigNumber and Heatmap (#35151)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 05c6a1bf20)
2025-09-16 13:49:36 -07:00
SBIN2010 99519cd4ce fix: import bug template params (#35144)
(cherry picked from commit c193d6d6a1)
2025-09-16 13:49:05 -07:00
Joe Li 9525742b56 fix(deck.gl): restore legend display for Polygon charts with linear palette and fixed color schemes (#35142)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fb840b8e71)
2025-09-16 13:48:25 -07:00
Elizabeth Thompson ad7acecbf2 fix: Remove emotion-rgba from dependencies and codebase (#35124)
(cherry picked from commit 19ddcb7e5c)
2025-09-15 12:00:14 -07:00
Gabriel Torres Ruiz a423f8ecda fix(ListView): implement AntD pagination for ListView component (#35057)
(cherry picked from commit 36daa2dc3f)
2025-09-12 18:56:26 -07:00
Mehmet Salih Yavuz 1265b3d3e5 fix(theming): Lighter text colors on dark mode (#35114)
(cherry picked from commit 95333e34b1)
2025-09-12 17:09:19 -07:00
Daniel Vaz Gaspar b2fd9e2fb1 fix: Bump FAB to 5.X (#33055)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit a9fb853e3e)
2025-09-12 17:07:53 -07:00
Michael S. Molina f3163e1c27 fix: SQL Lab tab events (#35105)
(cherry picked from commit e729b2dbb4)
2025-09-12 16:18:10 -07:00
SBIN2010 8c1fdcb179 fix: page size options 'all' correct in table and remove PAGE_SIZE_OPTIONS in handlebars (#35095)
(cherry picked from commit 06261f262b)
2025-09-12 15:43:06 -07:00
Priyanshu Kumar eb2b4bfc30 fix(pie): fixes pie chart other click error (#35086)
(cherry picked from commit b42060c880)
2025-09-12 15:42:54 -07:00
Gabriel Torres Ruiz 5baee67df7 fix(theming): replace error color with bolt icon for local themes (#35090)
(cherry picked from commit 7bf16d805d)
2025-09-12 15:42:44 -07:00
Rafael Benitez e8562bc641 fix(templates): Restores templates files accidentally removed (#35094)
(cherry picked from commit 529adebe1b)
2025-09-12 15:41:52 -07:00
Rafael Benitez dedc10065e fix(settingsMenu): Version (#35096)
(cherry picked from commit 5a2411fa64)
2025-09-12 15:40:53 -07:00
LisaHusband 4dedfac238 fix(drill-to-detail): ensure axis label filters map to original column names (#34694)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit a7d349a5c6)
2025-09-10 10:05:24 -07:00
Mehmet Salih Yavuz 2c870e8528 fix(timeshifts): Add missing feature flag to enum (#35072)
(cherry picked from commit 912ed2ba80)
2025-09-10 10:04:45 -07:00
Nicolas baee1ab82b fix(Table Chart): render null dates properly (#34558)
(cherry picked from commit 65376c7baf)
2025-09-10 10:04:05 -07:00
SBIN2010 a8cf0981fa fix(table): table search input placeholder (#35064)
(cherry picked from commit c5f220a9ff)
2025-09-09 10:08:09 -07:00
catpineapple 8768a3f55a fix(tests): one of integration test in TestSqlaTableModel does not support MySQL "concat" (#35007)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 9efb80dbf4)
2025-09-08 14:12:21 -07:00
Luiz Otavio cf1902a4cc fix: Upload CSV as Dataset (#34763)
(cherry picked from commit 1c2b9db4f0)
2025-09-08 14:12:10 -07:00
Gabriel Torres Ruiz d94c92db01 fix(dashboard): normalize spacings and background colors (#35001)
(cherry picked from commit 0fce5ecfa5)
2025-09-08 12:01:18 -07:00
Rafael Benitez acec8743c0 fix(theming): Icons in ExecutionLogList and Country map chart tooltip theme consistency (#34828)
(cherry picked from commit bef1f4d045)
2025-09-08 12:01:06 -07:00
SBIN2010 9918670315 fix: mixed timeseries chart add legend margin (#35036)
(cherry picked from commit 5a3182ce21)
2025-09-08 11:55:31 -07:00
Damian Pendrak 997e000f6b fix(chart): change "No query." to "Query cannot be loaded" in Multi Layer Deck.gl Chart (#34973)
(cherry picked from commit c65cb284e6)
2025-09-05 11:17:17 -07:00
JUST.in DO IT 428c97a1d6 fix(echarts): rename time series shifted for isTimeComparisonValue (#35022)
(cherry picked from commit bc54b7970a)
2025-09-05 11:15:50 -07:00
SBIN2010 7996359719 fix: display legend mixed timeseries chart (#35005)
(cherry picked from commit 031fb4b5a8)
2025-09-05 11:04:15 -07:00
Evan Rusackas 444b98b95e fix(sql): Add Impala dialect support to sqlglot parser (#34662)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 7fb7ac8bef)
2025-09-04 16:25:30 -07:00
Mehmet Salih Yavuz b51eda51ce fix(theming): more visual bugs (#34987)
(cherry picked from commit 569a7b33a5)
2025-09-04 16:25:10 -07:00
Mehmet Salih Yavuz 8a3dcadf87 fix(RoleListEditModal): display user's other properties in table (#35017)
(cherry picked from commit 59df0d6f15)
2025-09-04 16:22:36 -07:00
catpineapple 07fd60fe20 fix: doris genericDataType modify (#35011)
(cherry picked from commit 2e51d02806)
2025-09-04 16:20:40 -07:00
sha174n 06ada5472e fix(deps): expand pyarrow version range to <19 (#34870)
(cherry picked from commit 8406a827dd)
2025-09-03 22:39:53 -07:00
Joe Li 22826ba876 fix(tests): resolve AlertReportModal checkmark test failures (#34995) 2025-09-03 22:29:11 -07:00
JUST.in DO IT dbe0845dc0 fix(ui-core): Invalid postTransform process (#34874)
(cherry picked from commit 448a28545b)
2025-09-03 18:12:41 -07:00
JUST.in DO IT 0c045127e4 fix(sqllab): autocomplete and delete tabs (#34781)
(cherry picked from commit cefd046ea0)
2025-09-03 18:09:12 -07:00
Gabriel Torres Ruiz f69bdf5475 fix(error-handling): jinja2 error handling improvements (#34803) 2025-09-03 17:52:08 -07:00
Vitor Avila d5a523db25 fix(databricks): string escaper v2 (#34991)
(cherry picked from commit 0de5b28716)
2025-09-03 11:40:44 -07:00
Evan Rusackas 38b456bc8a fix(charts): Handle virtual dataset names without schema prefix correctly (#34760)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit b5ae402c12)
2025-09-02 13:41:41 -07:00
Evan Rusackas e1efc87fdc fix(echarts): Display NULL values in categorical x-axis for bar charts (#34761)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 682cdcc3e0)
2025-09-02 13:41:09 -07:00
Mehmet Salih Yavuz e84bdfaa6d fix(ChartCreation): Translate chart description (#34918)
(cherry picked from commit 5dba59b6a4)
2025-09-02 13:40:35 -07:00
Daniel Vaz Gaspar 930038d763 chore: bump FAB to 4.8.1 (#34838)
(cherry picked from commit 54af1cb2c8)
2025-09-02 13:37:46 -07:00
Daniel Vaz Gaspar d30cd5dc2a fix: playwright feature flag evaluation (#34978)
(cherry picked from commit b2f8803486)
2025-09-02 11:23:27 -07:00
Gabriel Torres Ruiz 714a03e007 fix(TimeTable): use type-only export for TableChartProps to resolve webpack warnings (#34989)
(cherry picked from commit 744fa1f54c)
2025-09-02 11:22:43 -07:00
Gabriel Torres Ruiz 026e016720 fix(dashboard): table charts render correctly after tab switch and refresh (#34975)
(cherry picked from commit 6a4b1df3a2)
2025-09-02 11:22:01 -07:00
Beto Dealmeida 5442521e18 fix: Athena quoting (#34895)
(cherry picked from commit fad3cb3162)
2025-09-02 10:11:58 -07:00
Maxime Beauchemin b8426b92c7 fix: revert mistake setting TALISMAN_ENABLED=False (#34909)
(cherry picked from commit bc9ec6ac63)
2025-09-02 10:10:03 -07:00
Gabriel Torres Ruiz 2f086475f8 fix(theming): fix TimeTable chart issues (#34868)
(cherry picked from commit d183969744)
2025-09-02 10:03:36 -07:00
Maxime Beauchemin 1c95ea5ab8 fix: complete theme management system import/export (#34850)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4695be5cc5)
2025-09-02 10:03:08 -07:00
Kamil Gabryjelski a3a2c494cc fix: Improve table layout and column sizing (#34887)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 175835138c)
2025-09-02 10:02:35 -07:00
Sam Firke d6cc324798 fix(drilling): drill by pagination works with MSSQL data source, cont. (#34724)
(cherry picked from commit c5a84c0985)
2025-09-02 10:00:40 -07:00
Kamil Gabryjelski 5756d25a7c fix: Filter bar orientation submenu should not be highlighted (#34900)
(cherry picked from commit e463743fcf)
2025-08-29 10:28:36 -07:00
Joe Li b16d6ed224 fix(ConfirmStatusChange): remove deprecated event.persist() to fix headless browser crashes (#34864)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit ebfb14c353)
2025-08-28 09:52:25 -07:00
Joe Li 18e8b064de fix(tests): Improve MessageChannel mocking to prevent worker force exits (#34878)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7946ec003f)
2025-08-28 09:52:03 -07:00
Kamil Gabryjelski 0c0dfc0601 fix: SelectControl default sort numeric choices by value (#34858)
(cherry picked from commit 665a11f821)
2025-08-28 09:51:15 -07:00
Kamil Gabryjelski c80b8fea85 fix: Undefined error when viewing query in Explore + visual fixes (#34869)
(cherry picked from commit 5566eb8dd6)
2025-08-28 09:50:37 -07:00
Joe Li 160a8fe16c fix(tests): Mock MessageChannel to prevent Jest hanging from rc-overflow (#34871)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 836540e8c9)
2025-08-27 23:19:01 -07:00
Kamil Gabryjelski fc80861f47 fix: Remove the underline from the right section of main menu (#34855)
(cherry picked from commit b74a244950)
2025-08-27 12:01:38 -07:00
Kamil Gabryjelski 7169d9f2bd fix: DB icon sizes in database add modal (#34854)
(cherry picked from commit ab58b0a8a3)
2025-08-27 12:00:55 -07:00
Kamil Gabryjelski 37347525e7 fix(dashboard): Anchor link positions (#34843)
(cherry picked from commit 97b35a4640)
2025-08-27 12:00:10 -07:00
JUST.in DO IT b6aa68dbfc fix(sqllab): Missing executed sql value in the result table (#34846)
(cherry picked from commit b89b0bdf5d)
2025-08-27 11:58:49 -07:00
Vitor Avila e4f371b126 fix: Avoid dataset drill request if no perm (#34665)
(cherry picked from commit 9c9588cce6)
2025-08-27 11:58:18 -07:00
Vitor Avila d0d816047c fix: Add dataset ID to file name on exports (#34782)
(cherry picked from commit 471d9fe737)
2025-08-27 11:57:07 -07:00
Rafael Benitez 2e28e22596 fix(theming): explore chart type style fixes, nav right menu spacing fixed (#34795)
(cherry picked from commit b381992a75)
2025-08-25 10:24:11 -07:00
Beto Dealmeida a475d68693 fix: make get_image() always return BytesIO (#34801)
(cherry picked from commit 1204507d68)
2025-08-25 10:23:57 -07:00
Kamil Gabryjelski dfd36f5a54 chore: Add instruction for LLMs to use antd theme tokens (#34800)
(cherry picked from commit c7779578f9)
2025-08-25 10:23:40 -07:00
Kamil Gabryjelski ea5ebd2ec9 fix: Unexpected overflow ellipsis dots after status icon in Dashboard list (#34798)
(cherry picked from commit b225432c55)
2025-08-25 10:23:27 -07:00
Kamil Gabryjelski d454a22f1c fix(echarts): Series labels hard to read in dark mode (#34815)
(cherry picked from commit 547f297171)
2025-08-25 10:23:14 -07:00
Joe Li d01934d9d8 fix(Icons): Add missing data-test and aria-label attributes to custom icons (#34809)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5c3c2599db)
2025-08-25 10:22:58 -07:00
Michael S. Molina 25775504b9 fix: User-provided Jinja template parameters causing SQL parsing errors (#34802)
(cherry picked from commit e1234b2264)
2025-08-23 11:17:15 -07:00
JUST.in DO IT 4cc6984ebf fix: customize column description limit size in db_engine_spec (#34808)
(cherry picked from commit 75af53dc3d)
2025-08-23 11:16:43 -07:00
Mehmet Salih Yavuz 548d9e6f7b fix(DetailsPanel): Applied filters colors (#34790)
(cherry picked from commit 2b2cc96f11)
2025-08-23 11:15:57 -07:00
Kamil Gabryjelski 1adaf20ccb fix(native-filters): Low contrast of empty state in dark mode (#34812)
(cherry picked from commit 59c01e016d)
2025-08-23 11:15:20 -07:00
Kamil Gabryjelski 7e9658fad6 fix: Low contrast in viz creator selected tag in dark mode (#34811)
(cherry picked from commit 3895b8b127)
2025-08-23 11:14:53 -07:00
Kamil Gabryjelski 5ff6679804 fix: Remove border around textarea in dashboard edit mode (#34814)
(cherry picked from commit da8c0f94e6)
2025-08-23 11:14:25 -07:00
Kamil Gabryjelski 0899496ca5 fix: Misaligned global controls in Table chart (#34799)
(cherry picked from commit 6908a733a0)
2025-08-23 11:13:35 -07:00
Gabriel Torres Ruiz e2a469c32d fix(dashboard): enable undo/redo buttons for layout changes (#34777)
(cherry picked from commit ff1f7b64e2)
2025-08-23 11:11:46 -07:00
Maxime Beauchemin 2ffc1b95ba fix: Check migration status before initializing database-dependent features (#34679)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c568d463b9)
2025-08-21 14:05:27 -07:00
Tomáš Karela Procházka 3b3aa1e302 fix: default value in run-server.sh (#34719)
(cherry picked from commit 179a6f2cfe)
2025-08-21 14:04:59 -07:00
Elizabeth Thompson 958b29acbc fix: catch no table error (#32640)
(cherry picked from commit 695a20d009)
2025-08-21 14:04:08 -07:00
Mehmet Salih Yavuz f0cfd17dc5 fix(PivotExcelExport): select correct chart for export (#34793)
(cherry picked from commit e908775fb2)
2025-08-21 14:03:38 -07:00
Joe Li ebfddb2b39 fix(tests): make SingleStore test_adjust_engine_params version-agnostic (#34780)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit af05396227)
2025-08-21 09:43:34 -07:00
amaannawab923 e10b6e8ae9 fix(webpack): Bump webpack dev-server to handle Errors on Firefox where error object is not defined (#34791)
(cherry picked from commit 277f03c207)
2025-08-21 09:42:35 -07:00
Evan Rusackas 18d4acdee9 fix(sqllab): Fix save query modal closing prematurely on new tabs (#34765)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 48699a7194)
2025-08-21 09:41:48 -07:00
PolinaFam c199213e8e fix(translations): Fix translation of time-related strings like "7 seconds ago", "a minute ago", etc (#34051)
Co-authored-by: Polina Fam <pfam@ptsecurity.com>
(cherry picked from commit b45141b2a1)
2025-08-21 09:40:38 -07:00
Joe Li 91834bbede fix: Fix TypeError in Slice.get() method when using filter_by() with BinaryExpression (#34769)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 9de1706baa)
2025-08-20 11:24:12 -07:00
Evan Rusackas 7253c79959 fix(duckdb): Add support for DuckDB-specific numeric types (#34743)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a42185cd3b)
2025-08-20 11:04:06 -07:00
JUST.in DO IT 04738c716c fix(sqllab): Invisible grid table due to the invalid height (#34683)
(cherry picked from commit 89eb7b207c)
2025-08-20 11:03:42 -07:00
Michael S. Molina 928dbe43e0 fix: Users can't skip column sync when saving virtual datasets (#34757)
(cherry picked from commit f99022b242)
2025-08-19 09:51:22 -07:00
JUST.in DO IT 3f597a6551 fix(sqllab): Reduce flushing caused by ID updates (#34720)
(cherry picked from commit f8b9e3ace4)
2025-08-19 09:50:52 -07:00
JUST.in DO IT 3661482eb3 chore(saved_query): Copy link to clipboard before redirect to edit (#34567) (#34758)
(cherry picked from commit 9cbe5a90b8)
2025-08-19 09:50:25 -07:00
Mehmet Salih Yavuz 9443fe8b78 fix(RightMenu): Move RightMenu carets to the right side (#34756)
(cherry picked from commit f7fe617f4c)
2025-08-19 09:50:02 -07:00
Kamil Gabryjelski 453241eb33 fix: Highlight outline of numerical range and time range filters (#34705)
(cherry picked from commit 6969f2cf7a)
2025-08-19 09:49:32 -07:00
Joe Li a5f7d236ac chore: Adds RC1 data to CHANGELOG.md and UPDATING.md 2025-08-18 14:38:54 -07:00
2421 changed files with 311683 additions and 31586 deletions
+1
View File
@@ -83,6 +83,7 @@ github:
- cypress-matrix (5, chrome)
- dependency-review
- frontend-build
- playwright-tests (chromium)
- pre-commit (current)
- pre-commit (previous)
- test-mysql
-11
View File
@@ -3,14 +3,3 @@
For complete documentation on using GitHub Codespaces with Apache Superset, please see:
**[Setting up a Development Environment - GitHub Codespaces](https://superset.apache.org/docs/contributing/development#github-codespaces-cloud-development)**
## Pre-installed Development Environment
When you create a new Codespace from this repository, it automatically:
1. **Creates a Python virtual environment** using `uv venv`
2. **Installs all development dependencies** via `uv pip install -r requirements/development.txt`
3. **Sets up pre-commit hooks** with `pre-commit install`
4. **Activates the virtual environment** automatically in all terminals
The virtual environment is located at `/workspaces/{repository-name}/.venv` and is automatically activated through environment variables set in the devcontainer configuration.
+19
View File
@@ -0,0 +1,19 @@
{
// Extend the base configuration
"extends": "../devcontainer-base.json",
"name": "Apache Superset Development (Default)",
// Forward ports for development
"forwardPorts": [9001],
"portsAttributes": {
"9001": {
"label": "Superset (via Webpack Dev Server)",
"onAutoForward": "notify",
"visibility": "public"
}
},
// Auto-start Superset on Codespace resume
"postStartCommand": ".devcontainer/start-superset.sh"
}
+39
View File
@@ -0,0 +1,39 @@
{
"name": "Apache Superset Development",
// Keep this in sync with the base image in Dockerfile (ARG PY_VER)
// Using the same base as Dockerfile, but non-slim for dev tools
"image": "python:3.11.13-bookworm",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"moby": true,
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/node:1": {
"version": "20"
},
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/common-utils:2": {
"configureZshAsDefaultShell": true
},
"ghcr.io/devcontainers/features/sshd:1": {
"version": "latest"
}
},
// Run commands after container is created
"postCreateCommand": "chmod +x .devcontainer/setup-dev.sh && .devcontainer/setup-dev.sh",
// VS Code customizations
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"charliermarsh.ruff",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
]
}
}
}
+17 -63
View File
@@ -3,76 +3,30 @@
echo "🔧 Setting up Superset development environment..."
# System dependencies and uv are now pre-installed in the Docker image
# This speeds up Codespace creation significantly!
# The universal image has most tools, just need Superset-specific libs
echo "📦 Installing Superset-specific dependencies..."
sudo apt-get update
sudo apt-get install -y \
libsasl2-dev \
libldap2-dev \
libpq-dev \
tmux \
gh
# Create virtual environment using uv
echo "🐍 Creating Python virtual environment..."
if ! uv venv; then
echo "❌ Failed to create virtual environment"
exit 1
fi
# Install uv for fast Python package management
echo "📦 Installing uv..."
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install Python dependencies
echo "📦 Installing Python dependencies..."
if ! uv pip install -r requirements/development.txt; then
echo "❌ Failed to install Python dependencies"
echo "💡 You may need to run this manually after the Codespace starts"
exit 1
fi
# Install pre-commit hooks
echo "🪝 Installing pre-commit hooks..."
if source .venv/bin/activate && pre-commit install; then
echo "✅ Pre-commit hooks installed"
else
echo "⚠️ Pre-commit hooks installation failed (non-critical)"
fi
# Add cargo/bin to PATH for uv
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc
# Install Claude Code CLI via npm
echo "🤖 Installing Claude Code..."
if npm install -g @anthropic-ai/claude-code; then
echo "✅ Claude Code installed"
else
echo "⚠️ Claude Code installation failed (non-critical)"
fi
npm install -g @anthropic-ai/claude-code
# Make the start script executable
chmod +x .devcontainer/start-superset.sh
# Add bashrc additions for automatic venv activation
echo "🔧 Setting up automatic environment activation..."
if [ -f ~/.bashrc ]; then
# Check if we've already added our additions
if ! grep -q "Superset Codespaces environment setup" ~/.bashrc; then
echo "" >> ~/.bashrc
cat .devcontainer/bashrc-additions >> ~/.bashrc
echo "✅ Added automatic venv activation to ~/.bashrc"
else
echo "✅ Bashrc additions already present"
fi
else
# Create bashrc if it doesn't exist
cat .devcontainer/bashrc-additions > ~/.bashrc
echo "✅ Created ~/.bashrc with automatic venv activation"
fi
# Also add to zshrc since that's the default shell
if [ -f ~/.zshrc ] || [ -n "$ZSH_VERSION" ]; then
if ! grep -q "Superset Codespaces environment setup" ~/.zshrc; then
echo "" >> ~/.zshrc
cat .devcontainer/bashrc-additions >> ~/.zshrc
echo "✅ Added automatic venv activation to ~/.zshrc"
fi
fi
echo "✅ Development environment setup complete!"
echo ""
echo "📝 The virtual environment will be automatically activated in new terminals"
echo ""
echo "🔄 To activate in this terminal, run:"
echo " source ~/.bashrc"
echo ""
echo "🚀 To start Superset:"
echo " start-superset"
echo ""
echo "🚀 Run '.devcontainer/start-superset.sh' to start Superset"
+23 -62
View File
@@ -1,14 +1,14 @@
#!/bin/bash
# Startup script for Superset in Codespaces
# Log to a file for debugging
LOG_FILE="/tmp/superset-startup.log"
echo "[$(date)] Starting Superset startup script" >> "$LOG_FILE"
echo "[$(date)] User: $(whoami), PWD: $(pwd)" >> "$LOG_FILE"
echo "🚀 Starting Superset in Codespaces..."
echo "🌐 Frontend will be available at port 9001"
# Check if MCP is enabled
if [ "$ENABLE_MCP" = "true" ]; then
echo "🤖 MCP Service will be available at port 5008"
fi
# Find the workspace directory (Codespaces clones as 'superset', not 'superset-2')
WORKSPACE_DIR=$(find /workspaces -maxdepth 1 -name "superset*" -type d | head -1)
if [ -n "$WORKSPACE_DIR" ]; then
@@ -18,71 +18,32 @@ else
echo "📁 Using current directory: $(pwd)"
fi
# Wait for Docker to be available
echo "⏳ Waiting for Docker to start..."
echo "[$(date)] Waiting for Docker..." >> "$LOG_FILE"
max_attempts=30
attempt=0
while ! docker info > /dev/null 2>&1; do
if [ $attempt -eq $max_attempts ]; then
echo "❌ Docker failed to start after $max_attempts attempts"
echo "[$(date)] Docker failed to start after $max_attempts attempts" >> "$LOG_FILE"
echo "🔄 Please restart the Codespace or run this script manually later"
exit 1
fi
echo " Attempt $((attempt + 1))/$max_attempts..."
echo "[$(date)] Docker check attempt $((attempt + 1))/$max_attempts" >> "$LOG_FILE"
sleep 2
attempt=$((attempt + 1))
done
echo "✅ Docker is ready!"
echo "[$(date)] Docker is ready" >> "$LOG_FILE"
# Check if Superset containers are already running
if docker ps | grep -q "superset"; then
echo "✅ Superset containers are already running!"
echo ""
echo "🌐 To access Superset:"
echo " 1. Click the 'Ports' tab at the bottom of VS Code"
echo " 2. Find port 9001 and click the globe icon to open"
echo " 3. Wait 10-20 minutes for initial startup"
echo ""
echo "📝 Login credentials: admin/admin"
exit 0
# Check if docker is running
if ! docker info > /dev/null 2>&1; then
echo "⏳ Waiting for Docker to start..."
sleep 5
fi
# Clean up any existing containers
echo "🧹 Cleaning up existing containers..."
docker-compose -f docker-compose-light.yml down
docker-compose -f docker-compose-light.yml --profile mcp down
# Start services
echo "🏗️ Starting Superset in background (daemon mode)..."
echo "🏗️ Building and starting services..."
echo ""
echo "📝 Once started, login with:"
echo " Username: admin"
echo " Password: admin"
echo ""
echo "📋 Running in foreground with live logs (Ctrl+C to stop)..."
# Start in detached mode
docker-compose -f docker-compose-light.yml up -d
echo ""
echo "✅ Docker Compose started successfully!"
echo ""
echo "📋 Important information:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "⏱️ Initial startup takes 10-20 minutes"
echo "🌐 Check the 'Ports' tab for your Superset URL (port 9001)"
echo "👤 Login: admin / admin"
echo ""
echo "📊 Useful commands:"
echo " docker-compose -f docker-compose-light.yml logs -f # Follow logs"
echo " docker-compose -f docker-compose-light.yml ps # Check status"
echo " docker-compose -f docker-compose-light.yml down # Stop services"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "💤 Keeping terminal open for 60 seconds to test persistence..."
sleep 60
echo "✅ Test complete - check if this terminal is still visible!"
# Show final status
docker-compose -f docker-compose-light.yml ps
# Run docker-compose and capture exit code
if [ "$ENABLE_MCP" = "true" ]; then
echo "🤖 Starting with MCP Service enabled..."
docker-compose -f docker-compose-light.yml --profile mcp up
else
docker-compose -f docker-compose-light.yml up
fi
EXIT_CODE=$?
# If it failed, provide helpful instructions
+29
View File
@@ -0,0 +1,29 @@
{
// Extend the base configuration
"extends": "../devcontainer-base.json",
"name": "Apache Superset Development with MCP",
// Forward ports for development
"forwardPorts": [9001, 5008],
"portsAttributes": {
"9001": {
"label": "Superset (via Webpack Dev Server)",
"onAutoForward": "notify",
"visibility": "public"
},
"5008": {
"label": "MCP Service (Model Context Protocol)",
"onAutoForward": "notify",
"visibility": "private"
}
},
// Auto-start Superset with MCP on Codespace resume
"postStartCommand": "ENABLE_MCP=true .devcontainer/start-superset.sh",
// Environment variables
"containerEnv": {
"ENABLE_MCP": "true"
}
}
+3
View File
@@ -12,6 +12,9 @@ updates:
# not until React >= 18.0.0
- dependency-name: "storybook"
- dependency-name: "@storybook*"
# remark-gfm v4+ requires react-markdown v9+, which needs React 18
- dependency-name: "remark-gfm"
- dependency-name: "react-markdown"
# JSDOM v30 doesn't play well with Jest v30
# Source: https://jestjs.io/blog#known-issues
# GH thread: https://github.com/jsdom/jsdom/issues/3492
+102
View File
@@ -117,6 +117,19 @@ testdata() {
say "::endgroup::"
}
playwright_testdata() {
cd "$GITHUB_WORKSPACE"
say "::group::Load all examples for Playwright tests"
# must specify PYTHONPATH to make `tests.superset_test_config` importable
export PYTHONPATH="$GITHUB_WORKSPACE"
pip install -e .
superset db upgrade
superset load_test_users
superset load_examples
superset init
say "::endgroup::"
}
celery-worker() {
cd "$GITHUB_WORKSPACE"
say "::group::Start Celery worker"
@@ -182,6 +195,95 @@ cypress-run-all() {
kill $flaskProcessId
}
playwright-install() {
cd "$GITHUB_WORKSPACE/superset-frontend"
say "::group::Install Playwright browsers"
npx playwright install --with-deps chromium
# Create output directories for test results and debugging
mkdir -p playwright-results
mkdir -p test-results
say "::endgroup::"
}
playwright-run() {
local APP_ROOT=$1
local TEST_PATH=$2
# Start Flask from the project root (same as Cypress)
cd "$GITHUB_WORKSPACE"
local flasklog="${HOME}/flask-playwright.log"
local port=8081
PLAYWRIGHT_BASE_URL="http://localhost:${port}"
if [ -n "$APP_ROOT" ]; then
export SUPERSET_APP_ROOT=$APP_ROOT
PLAYWRIGHT_BASE_URL=${PLAYWRIGHT_BASE_URL}${APP_ROOT}/
fi
export PLAYWRIGHT_BASE_URL
nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null &
local flaskProcessId=$!
# Ensure cleanup on exit
trap "kill $flaskProcessId 2>/dev/null || true" EXIT
# Wait for server to be ready with health check
local timeout=60
say "Waiting for Flask server to start on port $port..."
while [ $timeout -gt 0 ]; do
if curl -f ${PLAYWRIGHT_BASE_URL}/health >/dev/null 2>&1; then
say "Flask server is ready"
break
fi
sleep 1
timeout=$((timeout - 1))
done
if [ $timeout -eq 0 ]; then
echo "::error::Flask server failed to start within 60 seconds"
echo "::group::Flask startup log"
cat "$flasklog"
echo "::endgroup::"
return 1
fi
# Change to frontend directory for Playwright execution
cd "$GITHUB_WORKSPACE/superset-frontend"
say "::group::Run Playwright tests"
echo "Running Playwright with baseURL: ${PLAYWRIGHT_BASE_URL}"
if [ -n "$TEST_PATH" ]; then
# Check if there are any test files in the specified path
if ! find "playwright/tests/${TEST_PATH}" -name "*.spec.ts" -type f 2>/dev/null | grep -q .; then
echo "No test files found in ${TEST_PATH} - skipping test run"
say "::endgroup::"
kill $flaskProcessId
return 0
fi
echo "Running tests: ${TEST_PATH}"
# Set INCLUDE_EXPERIMENTAL=true to allow experimental tests to run
export INCLUDE_EXPERIMENTAL=true
npx playwright test "${TEST_PATH}" --output=playwright-results
local status=$?
# Unset to prevent leaking into subsequent commands
unset INCLUDE_EXPERIMENTAL
else
echo "Running all required tests (experimental/ excluded via playwright.config.ts)"
npx playwright test --output=playwright-results
local status=$?
fi
say "::endgroup::"
# After job is done, print out Flask log for debugging
echo "::group::Flask log for Playwright run"
cat "$flasklog"
echo "::endgroup::"
# make sure the program exits
kill $flaskProcessId
return $status
}
eyes-storybook-dependencies() {
say "::group::install eyes-storyook dependencies"
sudo apt-get update -y && sudo apt-get -y install gconf-service ca-certificates libxshmfence-dev fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libglib2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libnspr4 libnss3 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release xdg-utils libappindicator1
+10 -9
View File
@@ -29,15 +29,16 @@ jobs:
uses: ./.github/actions/setup-backend/
with:
python-version: ${{ matrix.python-version }}
- name: Enable brew and helm-docs
# Add brew to the path - see https://github.com/actions/runner-images/issues/6283
run: |
echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >>"${GITHUB_ENV}"
echo "HOMEBREW_CELLAR=$HOMEBREW_CELLAR" >>"${GITHUB_ENV}"
echo "HOMEBREW_REPOSITORY=$HOMEBREW_REPOSITORY" >>"${GITHUB_ENV}"
brew install norwoodj/tap/helm-docs
- name: Setup Go
uses: actions/setup-go@v5
- name: Install helm-docs
# Previously `brew install norwoodj/tap/helm-docs`, but Homebrew now
# refuses to install from untrusted third-party taps ("Skipping
# norwoodj/tap because it is not trusted"), which breaks CI. Install the
# pinned binary directly with Go instead — this matches apache/superset
# upstream and keeps the version aligned with the helm-docs pre-commit
# hook rev in .pre-commit-config.yaml.
run: go install github.com/norwoodj/helm-docs/cmd/helm-docs@v1.14.2
- name: Setup Node.js
uses: actions/setup-node@v4
with:
+115
View File
@@ -151,3 +151,118 @@ jobs:
with:
path: ${{ github.workspace }}/superset-frontend/cypress-base/cypress/screenshots
name: cypress-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}-${{ matrix.parallel_id }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
playwright-tests:
runs-on: ubuntu-22.04
permissions:
contents: read
pull-requests: read
strategy:
fail-fast: false
matrix:
browser: ["chromium"]
app_root: ["", "/app/prefix"]
env:
SUPERSET_ENV: development
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
PYTHONPATH: ${{ github.workspace }}
REDIS_PORT: 16379
GITHUB_TOKEN: ${{ github.token }}
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
ports:
- 15432:5432
redis:
image: redis:7-alpine
ports:
- 16379:6379
steps:
# -------------------------------------------------------
# Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@v5
with:
persist-credentials: false
submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ github.event.inputs.ref }}
submodules: recursive
- name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@v5
with:
persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
submodules: recursive
# -------------------------------------------------------
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python || steps.check.outputs.frontend
- name: Setup postgres
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Import test data
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright_testdata
- name: Setup Node.js
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: actions/setup-node@v5
with:
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Install Playwright
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright-install
- name: Run Playwright (Required Tests)
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
env:
NODE_OPTIONS: "--max-old-space-size=4096"
with:
run: playwright-run "${{ matrix.app_root }}"
- name: Set safe app root
if: failure()
id: set-safe-app-root
run: |
APP_ROOT="${{ matrix.app_root }}"
SAFE_APP_ROOT=${APP_ROOT//\//_}
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
- name: Upload Playwright Artifacts
uses: actions/upload-artifact@v4
if: failure()
with:
path: |
${{ github.workspace }}/superset-frontend/playwright-results/
${{ github.workspace }}/superset-frontend/test-results/
name: playwright-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
+142
View File
@@ -0,0 +1,142 @@
name: Playwright Experimental Tests
on:
push:
branches:
- "master"
- "[0-9].[0-9]*"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
workflow_dispatch:
inputs:
ref:
description: 'The branch or tag to checkout'
required: false
default: ''
pr_id:
description: 'The pull request ID to checkout'
required: false
default: ''
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
# NOTE: Required Playwright tests are in superset-e2e.yml (E2E / playwright-tests)
# This workflow contains only experimental tests that run in shadow mode
playwright-tests-experimental:
runs-on: ubuntu-22.04
continue-on-error: true
permissions:
contents: read
pull-requests: read
strategy:
fail-fast: false
matrix:
browser: ["chromium"]
app_root: ["", "/app/prefix"]
env:
SUPERSET_ENV: development
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
PYTHONPATH: ${{ github.workspace }}
REDIS_PORT: 16379
GITHUB_TOKEN: ${{ github.token }}
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
ports:
- 15432:5432
redis:
image: redis:7-alpine
ports:
- 16379:6379
steps:
# -------------------------------------------------------
# Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@v5
with:
persist-credentials: false
submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ github.event.inputs.ref }}
submodules: recursive
- name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@v5
with:
persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
submodules: recursive
# -------------------------------------------------------
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python || steps.check.outputs.frontend
- name: Setup postgres
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Import test data
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright_testdata
- name: Setup Node.js
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: actions/setup-node@v4
with:
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Install Playwright
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright-install
- name: Run Playwright (Experimental Tests)
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
env:
NODE_OPTIONS: "--max-old-space-size=4096"
with:
run: playwright-run "${{ matrix.app_root }}" experimental/
- name: Set safe app root
if: failure()
id: set-safe-app-root
run: |
APP_ROOT="${{ matrix.app_root }}"
SAFE_APP_ROOT=${APP_ROOT//\//_}
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
- name: Upload Playwright Artifacts
uses: actions/upload-artifact@v4
if: failure()
with:
path: |
${{ github.workspace }}/superset-frontend/playwright-results/
${{ github.workspace }}/superset-frontend/test-results/
name: playwright-experimental-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
+6 -1
View File
@@ -60,6 +60,7 @@ tmp
rat-results.txt
superset/app/
superset-websocket/config.json
*.log
# Node.js, webpack artifacts, storybook
*.entry.js
@@ -121,6 +122,8 @@ docker/requirements-local.txt
cache/
docker/*local*
docker/superset-websocket/config.json
docker-compose.override.yml
.temp_cache
@@ -130,7 +133,9 @@ superset/static/stats/statistics.html
# LLM-related
CLAUDE.local.md
PROJECT.md
.aider*
.claude_rc*
.claude/settings.local.json
.env.local
PROJECT.md
*.code-workspace
+1
View File
@@ -25,6 +25,7 @@ repos:
- id: mypy
args: [--check-untyped-defs]
additional_dependencies: [
types-cachetools,
types-simplejson,
types-python-dateutil,
types-requests,
+1 -1
View File
@@ -53,7 +53,7 @@ extension-pkg-whitelist=pyarrow
[MESSAGES CONTROL]
disable=all
enable=disallowed-json-import,disallowed-sql-import,consider-using-transaction
enable=disallowed-sql-import,consider-using-transaction
[REPORTS]
+1
View File
@@ -71,6 +71,7 @@ ibm-db2.svg
postgresql.svg
snowflake.svg
ydb.svg
loading.svg
# docs-related
erd.puml
+4
View File
@@ -44,4 +44,8 @@ under the License.
- [4.0.1](./CHANGELOG/4.0.1.md)
- [4.0.2](./CHANGELOG/4.0.2.md)
- [4.1.0](./CHANGELOG/4.1.0.md)
- [4.1.1](./CHANGELOG/4.1.1.md)
- [4.1.2](./CHANGELOG/4.1.2.md)
- [4.1.3](./CHANGELOG/4.1.3.md)
- [5.0.0](./CHANGELOG/5.0.0.md)
- [6.0.0](./CHANGELOG/6.0.0.md)
+1062
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -114,7 +114,7 @@ RUN useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash
# Some bash scripts needed throughout the layers
COPY --chmod=755 docker/*.sh /app/docker/
RUN pip install --no-cache-dir --upgrade uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Using uv as it's faster/simpler than pip
RUN uv venv /app/.venv
@@ -167,6 +167,8 @@ RUN mkdir -p \
&& touch superset/static/version_info.json
# Install Playwright and optionally setup headless browsers
ENV PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers
ARG INCLUDE_CHROMIUM="false"
ARG INCLUDE_FIREFOX="false"
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
+19 -3
View File
@@ -9,13 +9,17 @@ Apache Superset is a data visualization platform with Flask/Python backend and R
### Frontend Modernization
- **NO `any` types** - Use proper TypeScript types
- **NO JavaScript files** - Convert to TypeScript (.ts/.tsx)
- **Use @superset-ui/core** - Don't import Ant Design directly
- **Use @superset-ui/core** - Don't import Ant Design directly, prefer Ant Design component wrappers from @superset-ui/core/components
- **Use antd theming tokens** - Prefer antd tokens over legacy theming tokens
- **Avoid custom css and styles** - Follow antd best practices and avoid styling and custom CSS whenever possible
### Testing Strategy Migration
- **Prefer unit tests** over integration tests
- **Prefer integration tests** over Cypress end-to-end tests
- **Cypress is last resort** - Actively moving away from Cypress
- **Prefer integration tests** over end-to-end tests
- **Use Playwright for E2E tests** - Migrating from Cypress
- **Cypress is deprecated** - Will be removed once migration is completed
- **Use Jest + React Testing Library** for component testing
- **Use `test()` instead of `describe()`** - Follow [avoid nesting when testing](https://kentcdodds.com/blog/avoid-nesting-when-youre-testing) principles
### Backend Type Safety
- **Add type hints** - All new Python code needs proper typing
@@ -104,6 +108,18 @@ superset/
npm run test # All tests
npm run test -- filename.test.tsx # Single file
# E2E Tests (Playwright - NEW)
npm run playwright:test # All Playwright tests
npm run playwright:ui # Interactive UI mode
npm run playwright:headed # See browser during tests
npx playwright test tests/auth/login.spec.ts # Single file
npm run playwright:debug tests/auth/login.spec.ts # Debug specific file
# E2E Tests (Cypress - DEPRECATED)
cd superset-frontend/cypress-base
npm run cypress-run-chrome # All Cypress tests (headless)
npm run cypress-debug # Interactive Cypress UI
# Backend
pytest # All tests
pytest tests/unit_tests/specific_test.py # Single file
+288
View File
@@ -22,7 +22,242 @@ under the License.
This file documents any backwards-incompatible changes in Superset and
assists people when migrating to a new version.
## 6.0.0
## Next
### `thumbnail_url` removed from dashboard list API response
The `thumbnail_url` field has been removed from `GET /api/v1/dashboard/` list responses. External consumers relying on this field must now construct the thumbnail URL client-side using `id` and `changed_on_utc`:
```
/api/v1/dashboard/{id}/thumbnail/{changed_on_utc}/
```
The thumbnail endpoint redirects to the current digest URL regardless of whether the supplied digest is exact. If the image is not yet cached, that digest URL may return `202` and trigger async generation. Using `changed_on_utc` as the digest is sufficient for cache-busting purposes.
### Dataset import validates catalog against the target connection
Importing a dataset now validates the `catalog` field against the target database connection. When the connection has multi-catalog disabled (`allow_multi_catalog` off) and the dataset's catalog is not the connection's default catalog, the import fails instead of silently persisting the non-default catalog. This matches the validation already enforced on the dataset update path and prevents imported datasets from querying an unintended database.
If you relied on importing datasets with a non-default catalog, enable "Allow changing catalogs" on the target connection, or set the dataset's catalog to the connection's default before importing.
### Dynamic Group By respects the sort toggle for display values
The Dynamic Group By chart customization now orders its display values according to the "Sort display control values" toggle: ascending (AZ), descending (ZA), or the dataset's source order when the toggle is unset. Previously the dropdown always sorted alphabetically. Existing dashboards where the toggle was never set will show options in source order instead of AZ; open the customization and enable the toggle to restore alphabetical ordering.
### MCP Tool Observability
MCP (Model Context Protocol) tools now include enhanced observability instrumentation for monitoring and debugging:
**Two-layer instrumentation:**
1. **Middleware layer** (`LoggingMiddleware`): Automatically logs all MCP tool calls with `duration_ms` and `success` status in the audit log (Action Log UI, logs table)
2. **Sub-operation tracking**: All 19 MCP tools include granular `event_logger.log_context()` blocks for tracking individual operations like validation, database writes, and query execution
**Action naming convention:**
- Tool-level logs: `mcp_tool_call` (via middleware)
- Sub-operation logs: `mcp.{tool_name}.{operation}` (e.g., `mcp.generate_chart.validation`, `mcp.execute_sql.query_execution`)
**Querying MCP logs:**
```sql
-- Top slowest MCP operations
SELECT action, COUNT(*) as calls, AVG(duration_ms) as avg_ms
FROM logs
WHERE action LIKE 'mcp.%'
GROUP BY action
ORDER BY avg_ms DESC
LIMIT 20;
-- MCP tool success rate
SELECT
json_extract(curated_payload, '$.tool') as tool,
COUNT(*) as total_calls,
SUM(CASE WHEN json_extract(curated_payload, '$.success') = 'true' THEN 1 ELSE 0 END) as successful,
ROUND(100.0 * SUM(CASE WHEN json_extract(curated_payload, '$.success') = 'true' THEN 1 ELSE 0 END) / COUNT(*), 2) as success_rate
FROM logs
WHERE action = 'mcp_tool_call'
GROUP BY tool
ORDER BY total_calls DESC;
```
**Security note:** Sensitive parameters (passwords, API keys, tokens) are automatically redacted in logs as `[REDACTED]`.
### Signal Cache Backend
A new `SIGNAL_CACHE_CONFIG` configuration provides a unified Redis-based backend for real-time coordination features in Superset. This backend enables:
- **Pub/sub messaging** for real-time event notifications between workers
- **Atomic distributed locking** using Redis SET NX EX (more performant than database-backed locks)
- **Event-based coordination** for background task management
The signal cache is used by the Global Task Framework (GTF) for abort notifications and task completion signaling, and will eventually replace `GLOBAL_ASYNC_QUERIES_CACHE_BACKEND` as the standard signaling backend. Configuring this is recommended for Redis enabled production deployments.
Example configuration in `superset_config.py`:
```python
SIGNAL_CACHE_CONFIG = {
"CACHE_TYPE": "RedisCache",
"CACHE_KEY_PREFIX": "signal_",
"CACHE_REDIS_URL": "redis://localhost:6379/1",
"CACHE_DEFAULT_TIMEOUT": 300,
}
```
See `superset/config.py` for complete configuration options.
### WebSocket config for GAQ with Docker
[35896](https://github.com/apache/superset/pull/35896) and [37624](https://github.com/apache/superset/pull/37624) updated documentation on how to run and configure Superset with Docker. Specifically for the WebSocket configuration, a new `docker/superset-websocket/config.example.json` was added to the repo, so that users could copy it to create a `docker/superset-websocket/config.json` file. The existing `docker/superset-websocket/config.json` was removed and git-ignored, so if you're using GAQ / WebSocket make sure to:
- Stash/backup your existing `config.json` file, to re-apply it after (will get git-ignored going forward)
- Update the `volumes` configuration for the `superset-websocket` service in your `docker-compose.override.yml` file, to include the `docker/superset-websocket/config.json` file. For example:
``` yaml
services:
superset-websocket:
volumes:
- ./superset-websocket:/home/superset-websocket
- /home/superset-websocket/node_modules
- /home/superset-websocket/dist
- ./docker/superset-websocket/config.json:/home/superset-websocket/config.json:ro
```
### Example Data Loading Improvements
#### New Directory Structure
Examples are now organized by name with data and configs co-located:
```
superset/examples/
├── _shared/ # Shared database & metadata configs
├── birth_names/ # Each example is self-contained
│ ├── data.parquet # Dataset (Parquet format)
│ ├── dataset.yaml # Dataset metadata
│ ├── dashboard.yaml # Dashboard config (optional)
│ └── charts/ # Chart configs (optional)
└── ...
```
#### Simplified Parquet-based Loading
- Auto-discovery: create `superset/examples/my_dataset/data.parquet` to add a new example
- Parquet is an Apache project format: compressed (~27% smaller), self-describing schema
- YAML configs define datasets, charts, and dashboards declaratively
- Removed Python-based data generation from individual example files
#### Test Data Reorganization
- Moved `big_data.py` to `superset/cli/test_loaders.py` - better reflects its purpose as a test utility
- Fixed inverted logic for `--load-test-data` flag (now correctly includes .test.yaml files when flag is set)
- Clarified CLI flags:
- `--force` / `-f`: Force reload even if tables exist
- `--only-metadata` / `-m`: Create table metadata without loading data
- `--load-test-data` / `-t`: Include test dashboards and .test.yaml configs
- `--load-big-data` / `-b`: Generate synthetic stress-test data
#### Bug Fixes
- Fixed numpy array serialization for PostgreSQL (converts complex types to JSON strings)
- Fixed KeyError for `allow_csv_upload` field in database configs (now optional with default)
- Fixed test data loading logic that was incorrectly filtering files
### MCP Service
The MCP (Model Context Protocol) service enables AI assistants and automation tools to interact programmatically with Superset.
#### New Features
- MCP service infrastructure with FastMCP framework
- Tools for dashboards, charts, datasets, SQL Lab, and instance metadata
- Optional dependency: install with `pip install apache-superset[fastmcp]`
- Runs as separate process from Superset web server
- JWT-based authentication for production deployments
#### New Configuration Options
**Development** (single-user, local testing):
```python
# superset_config.py
MCP_DEV_USERNAME = "admin" # User for MCP authentication
MCP_SERVICE_HOST = "localhost"
MCP_SERVICE_PORT = 5008
```
**Production** (JWT-based, multi-user):
```python
# superset_config.py
MCP_AUTH_ENABLED = True
MCP_JWT_ISSUER = "https://your-auth-provider.com"
MCP_JWT_AUDIENCE = "superset-mcp"
MCP_JWT_ALGORITHM = "RS256" # or "HS256" for shared secrets
# Option 1: Use JWKS endpoint (recommended for RS256)
MCP_JWKS_URI = "https://auth.example.com/.well-known/jwks.json"
# Option 2: Use static public key (RS256)
MCP_JWT_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----..."
# Option 3: Use shared secret (HS256)
MCP_JWT_ALGORITHM = "HS256"
MCP_JWT_SECRET = "your-shared-secret-key"
# Optional overrides
MCP_SERVICE_HOST = "0.0.0.0"
MCP_SERVICE_PORT = 5008
MCP_SESSION_CONFIG = {
"SESSION_COOKIE_SECURE": True,
"SESSION_COOKIE_HTTPONLY": True,
"SESSION_COOKIE_SAMESITE": "Strict",
}
```
#### Running the MCP Service
```bash
# Development
superset mcp run --port 5008 --debug
# Production
superset mcp run --port 5008
# With factory config
superset mcp run --port 5008 --use-factory-config
```
#### Deployment Considerations
The MCP service runs as a **separate process** from the Superset web server.
**Important**:
- Requires same Python environment and configuration as Superset
- Shares database connections with main Superset app
- Can be scaled independently from web server
- Requires `fastmcp` package (optional dependency)
**Installation**:
```bash
# Install with MCP support
pip install apache-superset[fastmcp]
# Or add to requirements.txt
apache-superset[fastmcp]>=X.Y.Z
```
**Process Management**:
Use systemd, supervisord, or Kubernetes to manage the MCP service process.
See `superset/mcp_service/PRODUCTION.md` for deployment guides.
**Security**:
- Development: Uses `MCP_DEV_USERNAME` for single-user access
- Production: **MUST** configure JWT authentication
- See `superset/mcp_service/SECURITY.md` for details
#### Documentation
- Architecture: `superset/mcp_service/ARCHITECTURE.md`
- Security: `superset/mcp_service/SECURITY.md`
- Production: `superset/mcp_service/PRODUCTION.md`
- Developer Guide: `superset/mcp_service/CLAUDE.md`
- Quick Start: `superset/mcp_service/README.md`
---
- [35621](https://github.com/apache/superset/pull/35621): The default hash algorithm has changed from MD5 to SHA-256 for improved security and FedRAMP compliance. This affects cache keys for thumbnails, dashboard digests, chart digests, and filter option names. Existing cached data will be invalidated upon upgrade. To opt out of this change and maintain backward compatibility, set `HASH_ALGORITHM = "md5"` in your `superset_config.py`.
- [33055](https://github.com/apache/superset/pull/33055): Upgrades Flask-AppBuilder to 5.0.0. The AUTH_OID authentication type has been deprecated and is no longer available as an option in Flask-AppBuilder. OpenID (OID) is considered a deprecated authentication protocol - if you are using AUTH_OID, you will need to migrate to an alternative authentication method such as OAuth, LDAP, or database authentication before upgrading.
- [35062](https://github.com/apache/superset/pull/35062): Changed the function signature of `setupExtensions` to `setupCodeOverrides` with options as arguments.
- [34871](https://github.com/apache/superset/pull/34871): Fixed Jest test hanging issue from Ant Design v5 upgrade. MessageChannel is now mocked in test environment to prevent rc-overflow from causing Jest to hang. Test environment only - no production impact.
- [34782](https://github.com/apache/superset/pull/34782): Dataset exports now include the dataset ID in their file name (similar to charts and dashboards). If managing assets as code, make sure to rename existing dataset YAMLs to include the ID (and avoid duplicated files).
- [34536](https://github.com/apache/superset/pull/34536): The `ENVIRONMENT_TAG_CONFIG` color values have changed to support only Ant Design semantic colors. Update your `superset_config.py`:
- Change `"error.base"` to just `"error"` after this PR
- Change any hex color values to one of: `"success"`, `"processing"`, `"error"`, `"warning"`, `"default"`
@@ -41,6 +276,59 @@ Note: Pillow is now a required dependency (previously optional) to support image
- [32432](https://github.com/apache/superset/pull/31260) Moves the List Roles FAB view to the frontend and requires `FAB_ADD_SECURITY_API` to be enabled in the configuration and `superset init` to be executed.
- [34319](https://github.com/apache/superset/pull/34319) Drill to Detail and Drill By is now supported in Embedded mode, and also with the `DASHBOARD_RBAC` FF. If you don't want to expose these features in Embedded / `DASHBOARD_RBAC`, make sure the roles used for Embedded / `DASHBOARD_RBAC`don't have the required permissions to perform D2D actions.
### Breaking Changes
#### APP_NAME no longer controls frontend branding
The `APP_NAME` configuration variable no longer controls the browser window/tab title or other frontend branding. Application names should now be configured using the theme system with the `brandAppName` token. The `APP_NAME` config is still used for backend contexts (MCP service, logs, etc.) and serves as a fallback if `brandAppName` is not set.
**Before (5.x):**
```python
APP_NAME = "My Custom App"
```
**After (6.0):**
```python
# Option 1: Use theme system (recommended)
THEME_DEFAULT = {
"token": {
"brandAppName": "My Custom App", # Window titles
"brandLogoAlt": "My Custom App", # Logo alt text
"brandLogoUrl": "/static/assets/images/custom_logo.png"
}
}
# Option 2: Temporary fallback
# Keep APP_NAME for now (will be used as fallback for brandAppName)
APP_NAME = "My Custom App"
# But you should migrate to THEME_DEFAULT.token.brandAppName
```
**Note:** For dark mode, set the same tokens in `THEME_DARK` configuration.
#### CUSTOM_FONT_URLS removed
The `CUSTOM_FONT_URLS` configuration option has been removed. Use the new per-theme `fontUrls` token in `THEME_DEFAULT` or database-managed themes instead.
**Before (5.x):**
```python
CUSTOM_FONT_URLS = [
"https://fonts.example.com/myfont.css",
]
```
**After (6.0):**
```python
THEME_DEFAULT = {
"token": {
"fontUrls": [
"https://fonts.example.com/myfont.css",
],
# ... other tokens
}
}
```
## 5.0.0
- [31976](https://github.com/apache/superset/pull/31976) Removed the `DISABLE_LEGACY_DATASOURCE_EDITOR` feature flag. The previous value of the feature flag was `True` and now the feature is permanently removed.
+2
View File
@@ -125,6 +125,8 @@ services:
EXAMPLES_PASSWORD: superset
# Use light-specific config that disables Redis
SUPERSET_CONFIG_PATH: /app/docker/pythonpath_dev/superset_config_docker_light.py
GITHUB_HEAD_REF: ${GITHUB_HEAD_REF:-}
GITHUB_SHA: ${GITHUB_SHA:-}
superset-init-light:
build:
+3 -3
View File
@@ -132,9 +132,9 @@ services:
- /home/superset-websocket/node_modules
- /home/superset-websocket/dist
# Mounting a config file that contains a dummy secret required to boot up.
# do not use this docker compose in production
- ./docker/superset-websocket/config.json:/home/superset-websocket/config.json
# Mount config file. Create your own docker/superset-websocket/config.json
# for custom settings, then point to it here. Do not use this example in production.
- ./docker/superset-websocket/config.example.json:/home/superset-websocket/config.json:ro
environment:
- PORT=8080
- REDIS_HOST=redis
+17 -1
View File
@@ -34,8 +34,24 @@ intended for use with local development.
### Local overrides
#### Environment Variables
To override environment variables locally, create a `./docker/.env-local` file (git-ignored). This file will be loaded after `.env` and can override any settings.
#### Python Configuration
In order to override configuration settings locally, simply make a copy of [`./docker/pythonpath_dev/superset_config_local.example`](./pythonpath_dev/superset_config_local.example)
into `./docker/pythonpath_dev/superset_config_docker.py` (git ignored) and fill in your overrides.
into `./docker/pythonpath_dev/superset_config_docker.py` (git-ignored) and fill in your overrides.
#### WebSocket Configuration
To customize the WebSocket server configuration, create `./docker/superset-websocket/config.json` (git-ignored) based on [`./docker/superset-websocket/config.example.json`](./superset-websocket/config.example.json).
Then update the `superset-websocket`.`volumes` config to mount it.
#### Docker Compose Overrides
For advanced Docker Compose customization, create a `docker-compose-override.yml` file (git-ignored) to override or extend services without modifying the main compose file.
### Local packages
+4
View File
@@ -78,6 +78,10 @@ case "${1}" in
echo "Starting web app..."
/usr/bin/run-server.sh
;;
mcp)
echo "Starting MCP service..."
superset mcp run --host 0.0.0.0 --port ${MCP_PORT:-5008} --debug
;;
*)
echo "Unknown Operation!!!"
;;
+1 -1
View File
@@ -26,7 +26,7 @@ gunicorn \
--workers ${SERVER_WORKER_AMOUNT:-1} \
--worker-class ${SERVER_WORKER_CLASS:-gthread} \
--threads ${SERVER_THREADS_AMOUNT:-20} \
--log-level "${GUNICORN_LOGLEVEL:info}" \
--log-level "${GUNICORN_LOGLEVEL:-info}" \
--timeout ${GUNICORN_TIMEOUT:-60} \
--keep-alive ${GUNICORN_KEEPALIVE:-2} \
--max-requests ${WORKER_MAX_REQUESTS:-0} \
+1 -1
View File
@@ -99,7 +99,7 @@ class CeleryConfig:
CELERY_CONFIG = CeleryConfig
FEATURE_FLAGS = {"ALERT_REPORTS": True}
FEATURE_FLAGS = {"ALERT_REPORTS": True, "DATASET_FOLDERS": True}
ALERT_REPORTS_NOTIFICATION_DRY_RUN = True
WEBDRIVER_BASEURL = f"http://superset_app{os.environ.get('SUPERSET_APP_ROOT', '/')}/" # When using docker compose baseurl should be http://superset_nginx{ENV{BASEPATH}}/ # noqa: E501
# The base URL for the email report hyperlinks.
@@ -0,0 +1,22 @@
{
"port": 8080,
"logLevel": "info",
"logToFile": false,
"logFilename": "app.log",
"statsd": {
"host": "127.0.0.1",
"port": 8125,
"globalTags": []
},
"redis": {
"port": 6379,
"host": "127.0.0.1",
"password": "",
"db": 0,
"ssl": false
},
"redisStreamPrefix": "async-events-",
"jwtAlgorithms": ["HS256"],
"jwtSecret": "CHANGE-ME-IN-PRODUCTION-GOTTA-BE-LONG-AND-SECRET",
"jwtCookieName": "async-token"
}
@@ -67,6 +67,22 @@ To send alerts and reports to Slack channels, you need to create a new Slack App
Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use `alerts` instead of `#alerts`.
#### Large Slack Workspaces (10k+ channels)
For workspaces with many channels, fetching the complete channel list can take several minutes and may encounter Slack API rate limits. Add the following to your `superset_config.py`:
```python
from datetime import timedelta
# Increase cache timeout to reduce API calls
# Default: 1 day (86400 seconds)
SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds())
# Increase retry count for rate limit errors
# Default: 2
SLACK_API_RATE_LIMIT_RETRY_COUNT = 5
```
### Kubernetes-specific
- You must have a `celery beat` pod running. If you're using the chart included in the GitHub repository under [helm/superset](https://github.com/apache/superset/tree/master/helm/superset), you need to put `supersetCeleryBeat.enabled = true` in your values override.
@@ -219,6 +235,20 @@ def alert_dynamic_minimal_interval(**kwargs) -> int:
ALERT_MINIMUM_INTERVAL = alert_dynamic_minimal_interval
```
## External Link Redirection
For security, Superset rewrites external links in alert/report email HTML so
they go through a warning page before the user is navigated to the external
site. Internal links (matching your configured base URL) are not affected.
```python
# Disable external link redirection entirely (default: True)
ALERT_REPORTS_ENABLE_LINK_REDIRECT = False
```
The feature uses `WEBDRIVER_BASEURL_USER_FRIENDLY` (or `WEBDRIVER_BASEURL`)
to determine which hosts are internal.
## Custom Dockerfile
If you're running the dev version of a released Superset image, like `apache/superset:3.1.0-dev`, you should be set with the above.
@@ -220,11 +220,12 @@ RequestHeader set X-Forwarded-Proto "https"
*Please be advised that this feature is in BETA.*
Superset supports running the application under a non-root path. The root path
prefix can be specified in one of two ways:
prefix can be specified in one of three ways:
- Setting the `SUPERSET_APP_ROOT` environment variable to the desired prefix.
- Customizing the [Flask entrypoint](https://github.com/apache/superset/blob/master/superset/app.py#L29)
by passing the `superset_app_root` variable.
by passing the `superset_app_root` variable; or
- Setting the `SUPERSET_APP_ROOT` environment variable to the desired prefix; or
- Setting the `APPLICATION_ROOT` config in your `superset_config.py` file.
Note, the prefix should start with a `/`.
@@ -363,110 +364,6 @@ CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager
]
```
### Keycloak-Specific Configuration using Flask-OIDC
If you are using Keycloak as OpenID Connect 1.0 Provider, the above configuration based on [`Authlib`](https://authlib.org/) might not work. In this case using [`Flask-OIDC`](https://pypi.org/project/flask-oidc/) is a viable option.
Make sure the pip package [`Flask-OIDC`](https://pypi.org/project/flask-oidc/) is installed on the webserver. This was successfully tested using version 2.2.0. This package requires [`Flask-OpenID`](https://pypi.org/project/Flask-OpenID/) as a dependency.
The following code defines a new security manager. Add it to a new file named `keycloak_security_manager.py`, placed in the same directory as your `superset_config.py` file.
```python
from flask_appbuilder.security.manager import AUTH_OID
from superset.security import SupersetSecurityManager
from flask_oidc import OpenIDConnect
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib.parse import quote
from flask_appbuilder.views import ModelView, SimpleFormView, expose
from flask import (
redirect,
request
)
import logging
class OIDCSecurityManager(SupersetSecurityManager):
def __init__(self, appbuilder):
super(OIDCSecurityManager, self).__init__(appbuilder)
if self.auth_type == AUTH_OID:
self.oid = OpenIDConnect(self.appbuilder.get_app)
self.authoidview = AuthOIDCView
class AuthOIDCView(AuthOIDView):
@expose('/login/', methods=['GET', 'POST'])
def login(self, flag=True):
sm = self.appbuilder.sm
oidc = sm.oid
@self.appbuilder.sm.oid.require_login
def handle_login():
user = sm.auth_user_oid(oidc.user_getfield('email'))
if user is None:
info = oidc.user_getinfo(['preferred_username', 'given_name', 'family_name', 'email'])
user = sm.add_user(info.get('preferred_username'), info.get('given_name'), info.get('family_name'),
info.get('email'), sm.find_role('Gamma'))
login_user(user, remember=False)
return redirect(self.appbuilder.get_url_for_index)
return handle_login()
@expose('/logout/', methods=['GET', 'POST'])
def logout(self):
oidc = self.appbuilder.sm.oid
oidc.logout()
super(AuthOIDCView, self).logout()
redirect_url = request.url_root.strip('/') + self.appbuilder.get_url_for_login
return redirect(
oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout?redirect_uri=' + quote(redirect_url))
```
Then add to your `superset_config.py` file:
```python
from keycloak_security_manager import OIDCSecurityManager
from flask_appbuilder.security.manager import AUTH_OID, AUTH_REMOTE_USER, AUTH_DB, AUTH_LDAP, AUTH_OAUTH
import os
AUTH_TYPE = AUTH_OID
SECRET_KEY: 'SomethingNotEntirelySecret'
OIDC_CLIENT_SECRETS = '/path/to/client_secret.json'
OIDC_ID_TOKEN_COOKIE_SECURE = False
OIDC_OPENID_REALM: '<myRealm>'
OIDC_INTROSPECTION_AUTH_METHOD: 'client_secret_post'
CUSTOM_SECURITY_MANAGER = OIDCSecurityManager
# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True
# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = 'Public'
```
Store your client-specific OpenID information in a file called `client_secret.json`. Create this file in the same directory as `superset_config.py`:
```json
{
"<myOpenIDProvider>": {
"issuer": "https://<myKeycloakDomain>/realms/<myRealm>",
"auth_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/auth",
"client_id": "https://<myKeycloakDomain>",
"client_secret": "<myClientSecret>",
"redirect_uris": [
"https://<SupersetWebserver>/oauth-authorized/<myOpenIDProvider>"
],
"userinfo_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/userinfo",
"token_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/token",
"token_introspection_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/token/introspect"
}
}
```
## LDAP Authentication
FAB supports authenticating user credentials against an LDAP server.
+57
View File
@@ -52,6 +52,7 @@ are compatible with Superset.
| [Ascend.io](/docs/configuration/databases#ascendio) | `pip install impyla` | `ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true` |
| [Azure MS SQL](/docs/configuration/databases#sql-server) | `pip install pymssql` | `mssql+pymssql://UserName@presetSQL:TestPassword@presetSQL.database.windows.net:1433/TestSchema` |
| [ClickHouse](/docs/configuration/databases#clickhouse) | `pip install clickhouse-connect` | `clickhousedb://{username}:{password}@{hostname}:{port}/{database}` |
| [Cloudflare D1](/docs/configuration/databases#cloudflare-d1) | `pip install superset-engine-d1` or `pip install apache_superset[d1]` | `d1://{cloudflare_account_id}:{cloudflare_api_token}@{cloudflare_d1_database_id}` |
| [CockroachDB](/docs/configuration/databases#cockroachdb) | `pip install cockroachdb` | `cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable` |
| [Couchbase](/docs/configuration/databases#couchbase) | `pip install couchbase-sqlalchemy` | `couchbase://{username}:{password}@{hostname}:{port}?truststorepath={ssl certificate path}` |
| [CrateDB](/docs/configuration/databases#cratedb) | `pip install sqlalchemy-cratedb` | `crate://{username}:{password}@{hostname}:{port}`, often useful: `?ssl=true/false` or `?schema=testdrive`. |
@@ -357,6 +358,20 @@ uses the default user without a password (and doesn't encrypt the connection):
clickhousedb://localhost/default
```
#### Cloudflare D1
To use Cloudflare D1 with superset, install the [superset-engine-d1](https://github.com/sqlalchemy-cf-d1/superset-engine-d1) library.
```
pip install superset-engine-d1
```
The expected connection string is formatted as follows:
```
d1://{cloudflare_account_id}:{cloudflare_api_token}@{cloudflare_d1_database_id}
```
#### CockroachDB
The recommended connector library for CockroachDB is
@@ -1769,6 +1784,48 @@ You can use the `Extra` field in the **Edit Databases** form to configure SSL:
}
}
```
##### Custom Error Messages
You can use the `CUSTOM_DATABASE_ERRORS` in the `superset/custom_database_errors.py` file or overwrite it in your config file to configure custom error messages for database exceptions.
This feature lets you transform raw database errors into user-friendly messages, optionally including documentation links and hiding default error codes.
Provide an empty string as the first value to keep the original error message. This way, you can add just a link to the documentation
**Example usage:**
```Python
CUSTOM_DATABASE_ERRORS = {
"database_name": {
re.compile('permission denied for view'): (
__(
'Permission denied'
),
SupersetErrorType.GENERIC_DB_ENGINE_ERROR,
{
"custom_doc_links": [
{
"url": "https://example.com/docs/1",
"label": "Check documentation"
},
],
"show_issue_info": False,
}
)
},
"examples": {
re.compile(r'message="(?P<message>[^"]*)"'): (
__(
'Unexpected error: "%(message)s"'
),
SupersetErrorType.GENERIC_DB_ENGINE_ERROR,
{}
)
}
}
```
**Options:**
- ``custom_doc_links``: List of documentation links to display with the error.
- ``show_issue_info``: Set to ``False`` to hide default error codes.
## Misc
@@ -84,6 +84,24 @@ To enable this entry, add the following line to the `.env` file:
SUPERSET_FEATURE_EMBEDDED_SUPERSET=true
```
### Hiding the Logout Button in Embedded Contexts
When Superset is embedded in an application that manages authentication via SSO (OAuth2, SAML, or JWT), the logout button should be hidden since session management is handled by the parent application.
To hide the logout button in embedded contexts, add to `superset_config.py`:
```python
FEATURE_FLAGS = {
"DISABLE_EMBEDDED_SUPERSET_LOGOUT": True,
}
```
This flag only hides the logout button when Superset detects it is running inside an iframe. Users accessing Superset directly (not embedded) will still see the logout button regardless of this setting.
:::note
When embedding with SSO, also set `SESSION_COOKIE_SAMESITE = 'None'` and `SESSION_COOKIE_SECURE = True`. See [Security documentation](../security/security.mdx) for details.
:::
## CSRF settings
Similarly, [flask-wtf](https://flask-wtf.readthedocs.io/en/0.15.x/config/) is used to manage
+227 -22
View File
@@ -110,18 +110,30 @@ To export a theme for use in configuration files or another instance:
## Custom Fonts
Superset supports custom fonts through runtime configuration, allowing you to use branded or custom typefaces without rebuilding the application.
Superset supports custom fonts through the theme configuration, allowing you to use branded or custom typefaces without rebuilding the application.
### Default Fonts
By default, Superset uses Inter and Fira Code fonts which are bundled with the application via `@fontsource` packages. These fonts work offline and require no external network calls.
### Configuring Custom Fonts
Add font URLs to your `superset_config.py`:
To use custom fonts, add font URLs to your theme configuration using the `fontUrls` token:
```python
# Load fonts from Google Fonts, Adobe Fonts, or self-hosted sources
CUSTOM_FONT_URLS = [
"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap",
"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap",
]
THEME_DEFAULT = {
"token": {
# Load fonts from external sources (e.g., Google Fonts, Adobe Fonts)
"fontUrls": [
"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700&display=swap",
"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap",
],
# Reference the loaded fonts
"fontFamily": "Roboto, -apple-system, BlinkMacSystemFont, sans-serif",
"fontFamilyCode": "JetBrains Mono, Monaco, monospace",
# ... other theme tokens
}
}
# Update CSP to allow font sources
TALISMAN_CONFIG = {
@@ -132,31 +144,24 @@ TALISMAN_CONFIG = {
}
```
### Using Custom Fonts in Themes
Once configured, reference the fonts in your theme configuration:
```python
THEME_DEFAULT = {
"token": {
"fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif",
"fontFamilyCode": "JetBrains Mono, Monaco, monospace",
# ... other theme tokens
}
}
```
Or in the CRUD interface theme JSON:
```json
{
"token": {
"fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif",
"fontUrls": [
"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700&display=swap"
],
"fontFamily": "Roboto, -apple-system, BlinkMacSystemFont, sans-serif",
"fontFamilyCode": "JetBrains Mono, Monaco, monospace"
}
}
```
:::note
Font URLs are validated against a configurable allowlist. By default, fonts from `fonts.googleapis.com`, `fonts.gstatic.com`, and `use.typekit.net` are allowed. Configure `THEME_FONT_URL_ALLOWED_DOMAINS` to customize the allowed domains.
:::
### Font Sources
- **Google Fonts**: Free, CDN-hosted fonts with wide variety
@@ -165,6 +170,206 @@ Or in the CRUD interface theme JSON:
This feature works with the stock Docker image - no custom build required!
## ECharts Configuration Overrides
:::note
Available since Superset 6.0
:::
Superset provides fine-grained control over ECharts visualizations through theme-level configuration overrides. This allows you to customize the appearance and behavior of all ECharts-based charts without modifying individual chart configurations.
### Global ECharts Overrides
Apply settings to all ECharts visualizations using `echartsOptionsOverrides`:
```python
THEME_DEFAULT = {
"token": {
"colorPrimary": "#2893B3",
# ... other Ant Design tokens
},
"echartsOptionsOverrides": {
"grid": {
"left": "10%",
"right": "10%",
"top": "15%",
"bottom": "15%"
},
"tooltip": {
"backgroundColor": "rgba(0, 0, 0, 0.8)",
"borderColor": "#ccc",
"textStyle": {
"color": "#fff"
}
},
"legend": {
"textStyle": {
"fontSize": 14,
"fontWeight": "bold"
}
}
}
}
```
### Chart-Specific Overrides
Target specific chart types using `echartsOptionsOverridesByChartType`:
```python
THEME_DEFAULT = {
"token": {
"colorPrimary": "#2893B3",
# ... other tokens
},
"echartsOptionsOverridesByChartType": {
"echarts_pie": {
"legend": {
"orient": "vertical",
"right": 10,
"top": "center"
}
},
"echarts_timeseries": {
"xAxis": {
"axisLabel": {
"rotate": 45,
"fontSize": 12
}
},
"dataZoom": [{
"type": "slider",
"show": True,
"start": 0,
"end": 100
}]
},
"echarts_bubble": {
"grid": {
"left": "15%",
"bottom": "20%"
}
}
}
}
```
### UI Configuration
You can also configure ECharts overrides through the theme CRUD interface:
```json
{
"token": {
"colorPrimary": "#2893B3"
},
"echartsOptionsOverrides": {
"grid": {
"left": "10%",
"right": "10%"
},
"tooltip": {
"backgroundColor": "rgba(0, 0, 0, 0.8)"
}
},
"echartsOptionsOverridesByChartType": {
"echarts_pie": {
"legend": {
"orient": "vertical",
"right": 10
}
}
}
}
```
### Override Precedence
The system applies overrides in the following order (last wins):
1. **Base ECharts theme** - Default Superset styling
2. **Plugin options** - Chart-specific configurations
3. **Global overrides** - `echartsOptionsOverrides`
4. **Chart-specific overrides** - `echartsOptionsOverridesByChartType[chartType]`
This ensures chart-specific overrides take precedence over global ones.
### Common Chart Types
Available chart types for `echartsOptionsOverridesByChartType`:
- `echarts_timeseries` - Time series/line charts
- `echarts_pie` - Pie and donut charts
- `echarts_bubble` - Bubble/scatter charts
- `echarts_funnel` - Funnel charts
- `echarts_gauge` - Gauge charts
- `echarts_radar` - Radar charts
- `echarts_boxplot` - Box plot charts
- `echarts_treemap` - Treemap charts
- `echarts_sunburst` - Sunburst charts
- `echarts_graph` - Network/graph charts
- `echarts_sankey` - Sankey diagrams
- `echarts_heatmap` - Heatmaps
- `echarts_mixed_timeseries` - Mixed time series
### Best Practices
1. **Start with global overrides** for consistent styling across all charts
2. **Use chart-specific overrides** for unique requirements per visualization type
3. **Test thoroughly** as overrides use deep merge - nested objects are combined, but arrays are completely replaced
4. **Document your overrides** to help team members understand custom styling
5. **Consider performance** - complex overrides may impact chart rendering speed
### Example: Corporate Branding
```python
# Complete corporate theme with ECharts customization
THEME_DEFAULT = {
"token": {
"colorPrimary": "#1B4D3E",
"fontFamily": "Corporate Sans, Arial, sans-serif"
},
"echartsOptionsOverrides": {
"grid": {
"left": "8%",
"right": "8%",
"top": "12%",
"bottom": "12%"
},
"textStyle": {
"fontFamily": "Corporate Sans, Arial, sans-serif"
},
"title": {
"textStyle": {
"color": "#1B4D3E",
"fontSize": 18,
"fontWeight": "bold"
}
}
},
"echartsOptionsOverridesByChartType": {
"echarts_timeseries": {
"xAxis": {
"axisLabel": {
"color": "#666",
"fontSize": 11
}
}
},
"echarts_pie": {
"legend": {
"textStyle": {
"fontSize": 12
},
"itemGap": 20
}
}
}
}
```
This feature provides powerful theming capabilities while maintaining the flexibility of ECharts' extensive configuration options.
## Advanced Features
- **System Themes**: Manage system-wide default and dark themes via UI or configuration
+21 -1
View File
@@ -631,7 +631,7 @@ can find all of the workflows and other assets under the `.github/` folder. This
- running the backend unit test suites (`tests/`)
- running the frontend test suites (`superset-frontend/src/**.*.test.*`)
- running our Cypress end-to-end tests (`superset-frontend/cypress-base/`)
- running our Playwright end-to-end tests (`superset-frontend/playwright/`) and legacy Cypress tests (`superset-frontend/cypress-base/`)
- linting the codebase, including all Python, Typescript and Javascript, yaml and beyond
- checking for all sorts of other rules conventions
@@ -747,6 +747,26 @@ To run a single test file:
npm run test -- path/to/file.js
```
#### Known Issues and Workarounds
**Jest Test Hanging (MessageChannel Issue)**
If Jest tests hang with "Jest did not exit one second after the test run has completed", this is likely due to the MessageChannel issue from rc-overflow (Ant Design v5 components).
**Root Cause**: `rc-overflow@1.4.1` creates MessageChannel handles for responsive overflow detection that remain open after test completion.
**Current Workaround**: MessageChannel is mocked as undefined in `spec/helpers/jsDomWithFetchAPI.ts`, forcing rc-overflow to use requestAnimationFrame fallback.
**To verify if still needed**: Remove the MessageChannel mocking lines and run `npm test -- --shard=4/8`. If tests hang, the workaround is still required.
**Future removal conditions**: This workaround can be removed when:
- rc-overflow updates to properly clean up MessagePorts in test environments
- Jest updates to handle MessageChannel/MessagePort cleanup better
- Ant Design switches away from rc-overflow
- We switch away from Ant Design v5
**See**: [PR #34871](https://github.com/apache/superset/pull/34871) for full technical details.
### Debugging Server App
#### Local
+44 -8
View File
@@ -225,21 +225,57 @@ npm run test -- path/to/file.js
### E2E Integration Testing
For E2E testing, we recommend that you use a `docker compose` backend
**Note: We are migrating from Cypress to Playwright. Use Playwright for new tests.**
#### Playwright (Recommended - NEW)
For E2E testing with Playwright, use the same `docker compose` backend:
```bash
CYPRESS_CONFIG=true docker compose up --build
```
`docker compose` will get to work and expose a Cypress-ready Superset app.
This app uses a different database schema (`superset_cypress`) to keep it isolated from
your other dev environmen(s)t, a specific set of examples, and a set of configurations that
aligns with the expectations within the end-to-end tests. Also note that it's served on a
different port than the default port for the backend (`8088`).
Now in another terminal, let's get ready to execute some Cypress commands. First, tell cypress
to connect to the Cypress-ready Superset backend.
The backend setup is identical - this exposes a test-ready Superset app on port 8081 with isolated database schema (`superset_cypress`), test data, and configurations.
Now in another terminal, run Playwright tests:
```bash
# Navigate to frontend directory (Playwright config is here)
cd superset-frontend
# Run all Playwright tests
npm run playwright:test
# or: npx playwright test
# Run with interactive UI for debugging
npm run playwright:ui
# or: npx playwright test --ui
# Run in headed mode (see browser)
npm run playwright:headed
# or: npx playwright test --headed
# Run specific test file
npx playwright test tests/auth/login.spec.ts
# Run with debug mode (step through tests)
npm run playwright:debug tests/auth/login.spec.ts
# or: npx playwright test --debug tests/auth/login.spec.ts
# Generate test report
npx playwright show-report
```
Configuration is in `superset-frontend/playwright.config.ts`. Base URL is automatically set to `http://localhost:8088` but will use `PLAYWRIGHT_BASE_URL` if provided.
#### Cypress (DEPRECATED - will be removed in Phase 5)
:::warning
Cypress is being phased out in favor of Playwright. Use Playwright for all new tests.
:::
```bash
# Set base URL for Cypress
CYPRESS_BASE_URL=http://localhost:8081
```
@@ -0,0 +1,101 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# pkg_resources Deprecation and Migration Guide
## Background
As of setuptools 81.0.0 (scheduled for removal around 2025-11-30), the `pkg_resources` API is deprecated and will be removed. This affects several packages in the Python ecosystem.
## Current Status
### Superset Codebase ✅
The Superset codebase has already migrated away from `pkg_resources` to the modern `importlib.metadata` API:
- `superset/db_engine_specs/__init__.py:36` - Uses `from importlib.metadata import entry_points`
- All entry point loading uses the modern API
### Production Dependencies ⚠️
Some third-party dependencies may still use `pkg_resources`:
- **`clients` package** (Preset-specific): Uses `pkg_resources` in `const.py`
- Error path: `/usr/local/lib/python3.10/site-packages/clients/const.py:1`
## Migration Path
### Short-term Solution (Current)
Pin setuptools to version 80.x to prevent breaking changes:
```python
# requirements/base.in
setuptools<81
```
This prevents the removal of `pkg_resources` while dependent packages are updated.
### Long-term Solution
Update all dependencies to use `importlib.metadata` instead of `pkg_resources`:
#### Migration Example
**Old (deprecated):**
```python
import pkg_resources
version = pkg_resources.get_distribution("package_name").version
entry_points = pkg_resources.iter_entry_points("group_name")
```
**New (recommended):**
```python
from importlib.metadata import version, entry_points
pkg_version = version("package_name")
eps = entry_points(group="group_name")
```
## Action Items
### For Preset Team
1. **Update `clients` package** to use `importlib.metadata` instead of `pkg_resources`
2. **Review other internal packages** for `pkg_resources` usage
3. **Test with setuptools >= 81.0.0** once all packages are migrated
4. **Monitor Datadog logs** for similar deprecation warnings
### For Superset Maintainers
1. ✅ Already using `importlib.metadata`
2. Monitor third-party dependencies for updates
3. Update setuptools pin once ecosystem is ready
## Timeline
- **2025-11-30**: Expected removal of `pkg_resources` from setuptools
- **Before then**: All dependencies must migrate to `importlib.metadata`
## References
- [setuptools pkg_resources deprecation notice](https://setuptools.pypa.io/en/latest/pkg_resources.html)
- [importlib.metadata documentation](https://docs.python.org/3/library/importlib.metadata.html)
- [Migration guide](https://setuptools.pypa.io/en/latest/deprecated/pkg_resources.html)
## Monitoring
Track this issue in production using Datadog:
- Warning pattern: `pkg_resources is deprecated as an API`
- Component: `@component:app`
- Environment: `environment:production`
+1 -1
View File
@@ -344,7 +344,7 @@ const config: Config = {
'data-project-name': 'Apache Superset',
'data-project-color': '#FFFFFF',
'data-project-logo':
'https://images.seeklogo.com/logo-png/50/2/superset-icon-logo-png_seeklogo-500354.png',
'https://superset.apache.org/img/superset-logo-icon-only.png',
'data-modal-override-open-id': 'ask-ai-input',
'data-modal-override-open-class': 'search-input',
'data-modal-disclaimer':
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

+1390 -387
View File
File diff suppressed because it is too large Load Diff
+59 -18
View File
@@ -40,13 +40,13 @@ dependencies = [
"click>=8.0.3",
"click-option-group",
"colorama",
"flask-cors>=4.0.2, <7.0",
"flask-cors>=6.0.0, <7.0",
"croniter>=0.3.28",
"cron-descriptor",
"cryptography>=42.0.4, <45.0.0",
"cryptography>=42.0.4, <47.0.0",
"deprecation>=2.1.0, <2.2.0",
"flask>=2.2.5, <3.0.0",
"flask-appbuilder>=4.8.0, <5.0.0",
"flask-appbuilder>=5.2.1, <6.0.0",
"flask-caching>=2.1.0, <3",
"flask-compress>=1.13, <2.0",
"flask-talisman>=1.0.0, <2.0",
@@ -58,8 +58,8 @@ dependencies = [
"greenlet>=3.0.3, <=3.1.1",
"gunicorn>=22.0.0; sys_platform != 'win32'",
"hashids>=1.3.1, <2",
# known issue with holidays 0.26.0 and above related to prophet lib #25017
"holidays>=0.25, <0.26",
# holidays>=0.45 required for security fix
"holidays>=0.45, <1",
"humanize",
"isodate",
"jsonpath-ng>=1.6.1, <2",
@@ -67,36 +67,38 @@ dependencies = [
"markdown>=3.0",
# marshmallow>=4 has issues: https://github.com/apache/superset/issues/33162
"marshmallow>=3.0, <4",
"marshmallow-union>=0.1",
"msgpack>=1.0.0, <1.1",
"nh3>=0.2.11, <0.3",
"numpy>1.23.5, <2.3",
"packaging",
# --------------------------
# pandas and related (wanting pandas[performance] without numba as it's 100+MB and not needed)
"pandas[excel]>=2.0.3, <2.1",
"pandas[excel]>=2.1.4, <2.2",
"bottleneck", # recommended performance dependency for pandas, see https://pandas.pydata.org/docs/getting_started/install.html#performance-dependencies-recommended
# --------------------------
"parsedatetime",
"paramiko>=3.4.0",
"paramiko>=3.4.0, <4.0", # 4.0 removed DSSKey, still referenced by sshtunnel
"pgsanity",
"Pillow>=11.0.0, <12",
"Pillow>=11.0.0, <13",
"polyline>=2.0.0, <3.0",
"pydantic>=2.8.0",
"pyparsing>=3.0.6, <4",
"python-dateutil",
"python-dotenv", # optional dependencies for Flask but required for Superset, see https://flask.palletsprojects.com/en/stable/installation/#optional-dependencies
"python-geohash",
"pyarrow>=16.1.0, <17", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
"pyarrow>=16.1.0, <19", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
"pyyaml>=6.0.0, <7.0.0",
"PyJWT>=2.4.0, <3.0",
"redis>=4.6.0, <5.0",
"redis>=5.0.0, <6.0",
"selenium>=4.14.0, <5.0",
"shillelagh[gsheetsapi]>=1.2.18, <2.0",
"shillelagh[gsheetsapi]>=1.4.4, <2.0",
"sshtunnel>=0.4.0, <0.5",
"simplejson>=3.15.0",
"slack_sdk>=3.19.0, <4",
"sqlalchemy>=1.4, <2",
"sqlalchemy-utils>=0.38.3, <0.39",
"sqlglot>=27.3.0, <28",
"sqlglot>=28.10.0, <29",
# newer pandas needs 0.9+
"tabulate>=0.9.0, <1.0",
"typing-extensions>=4, <5",
@@ -118,6 +120,11 @@ bigquery = [
clickhouse = ["clickhouse-connect>=0.5.14, <1.0"]
cockroachdb = ["cockroachdb>=0.3.5, <0.4"]
crate = ["sqlalchemy-cratedb>=0.40.1, <1"]
d1 = [
"superset-engine-d1>=0.1.0",
"sqlalchemy-d1>=0.1.0",
"dbapi-d1>=0.1.0",
]
databend = ["databend-sqlalchemy>=0.3.2, <1.0"]
databricks = [
"databricks-sql-connector>=2.0.2, <3",
@@ -128,16 +135,24 @@ denodo = ["denodo-sqlalchemy~=1.0.6"]
dremio = ["sqlalchemy-dremio>=1.2.1, <4"]
drill = ["sqlalchemy-drill>=1.1.4, <2"]
druid = ["pydruid>=0.6.5,<0.7"]
duckdb = ["duckdb-engine>=0.12.1, <0.13"]
duckdb = ["duckdb>=1.4.2,<2", "duckdb-engine>=0.17.0"]
dynamodb = ["pydynamodb>=0.4.2"]
solr = ["sqlalchemy-solr >= 0.2.0"]
elasticsearch = ["elasticsearch-dbapi>=0.2.9, <0.3.0"]
elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
exasol = ["sqlalchemy-exasol >= 2.4.0, <3.0"]
excel = ["xlrd>=1.2.0, <1.3"]
fastmcp = [
"fastmcp>=3.1.0,<4.0",
"joserfc>=1.0.0,<2.0",
# tiktoken backs the response-size-guard token estimator. Without
# it, the middleware falls back to a coarser character-based
# heuristic that under-counts JSON-heavy MCP responses.
"tiktoken>=0.7.0,<1.0",
]
firebird = ["sqlalchemy-firebird>=0.7.0, <0.8"]
firebolt = ["firebolt-sqlalchemy>=1.0.0, <2"]
gevent = ["gevent>=23.9.1"]
gsheets = ["shillelagh[gsheetsapi]>=1.2.18, <2"]
gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"]
hana = ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"]
hive = [
"pyhive[hive]>=0.6.5;python_version<'3.11'",
@@ -165,10 +180,10 @@ playwright = ["playwright>=1.37.0, <2"]
postgres = ["psycopg2-binary==2.9.6"]
presto = ["pyhive[presto]>=0.6.5"]
trino = ["trino>=0.328.0"]
prophet = ["prophet>=1.1.5, <2"]
prophet = ["prophet>=1.1.6, <2"]
redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
risingwave = ["sqlalchemy-risingwave"]
shillelagh = ["shillelagh[all]>=1.2.18, <2"]
shillelagh = ["shillelagh[all]>=1.4.4, <2"]
singlestore = ["sqlalchemy-singlestoredb>=1.1.1, <2"]
snowflake = ["snowflake-sqlalchemy>=1.2.4, <2"]
spark = [
@@ -190,6 +205,7 @@ doris = ["pydoris>=1.0.0, <2.0.0"]
oceanbase = ["oceanbase_py>=0.0.1"]
ydb = ["ydb-sqlalchemy>=0.1.2"]
development = [
"boto3",
"docker",
"flask-testing",
"freezegun",
@@ -204,6 +220,7 @@ development = [
"pyinstrument>=4.0.2,<5",
"pylint",
"pytest<8.0.0", # hairy issue with pytest >=8 where current_app proxies are not set in time
"pytest-asyncio",
"pytest-cov",
"pytest-mock",
"python-ldap>=3.4.4",
@@ -222,7 +239,7 @@ combine_as_imports = true
include_trailing_comma = true
line_length = 88
known_first_party = "superset"
known_third_party = "alembic, apispec, backoff, celery, click, colorama, cron_descriptor, croniter, cryptography, dateutil, deprecation, flask, flask_appbuilder, flask_babel, flask_caching, flask_compress, flask_jwt_extended, flask_login, flask_migrate, flask_sqlalchemy, flask_talisman, flask_testing, flask_wtf, freezegun, geohash, geopy, holidays, humanize, isodate, jinja2, jwt, markdown, markupsafe, marshmallow, msgpack, nh3, numpy, pandas, parameterized, parsedatetime, pgsanity, polyline, prison, progress, pyarrow, sqlalchemy_bigquery, pyhive, pyparsing, pytest, pytest_mock, pytz, redis, requests, selenium, setuptools, shillelagh, simplejson, slack, sqlalchemy, sqlalchemy_utils, typing_extensions, urllib3, werkzeug, wtforms, wtforms_json, yaml"
known_third_party = "alembic, apispec, backoff, celery, click, colorama, cron_descriptor, croniter, cryptography, dateutil, deprecation, flask, flask_appbuilder, flask_babel, flask_caching, flask_compress, flask_jwt_extended, flask_login, flask_migrate, flask_sqlalchemy, flask_talisman, flask_testing, flask_wtf, freezegun, geohash, geopy, holidays, humanize, isodate, jinja2, jwt, markdown, markupsafe, marshmallow, marshmallow-union, msgpack, nh3, numpy, pandas, parameterized, parsedatetime, pgsanity, polyline, prison, progress, pyarrow, sqlalchemy_bigquery, pyhive, pyparsing, pytest, pytest_mock, pytz, redis, requests, selenium, setuptools, shillelagh, simplejson, slack, sqlalchemy, sqlalchemy_utils, typing_extensions, urllib3, werkzeug, wtforms, wtforms_json, yaml"
multi_line_output = 3
order_by_type = false
@@ -252,6 +269,26 @@ module = "cryptography.*"
ignore_errors = true
follow_imports = "skip"
# superset-core is installed as editable locally but CI may not expose types
# This ensures consistent behavior between local dev and CI
[[tool.mypy.overrides]]
module = "superset_core.*"
follow_imports = "skip"
# Disable warn_unused_ignores for modules with dynamic type assignments
# These type: ignore comments are needed in CI where superset-core types aren't visible
[[tool.mypy.overrides]]
module = [
"superset.core.api.core_api_injection",
"superset.security.manager",
"superset.daos.base",
"superset.connectors.sqla.models",
"superset.tags.filters",
"superset.commands.security.update",
"superset.commands.security.create",
]
warn_unused_ignores = false
[tool.ruff]
# Exclude a variety of commonly ignored directories.
exclude = [
@@ -319,6 +356,7 @@ select = [
ignore = [
"S101",
"PT001", # pytest-fixture-incorrect-parentheses-style: different ruff versions disagree
"PT006",
"T201",
"N999",
@@ -333,6 +371,8 @@ unfixable = []
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
[tool.ruff.lint.per-file-ignores]
"superset/mcp_service/app.py" = ["S608", "E501"] # LLM instruction text: SQL examples (S608) and long lines in multiline string (E501)
"superset/mcp_service/*/tool/list_*.py" = ["E501"] # LLM docstring examples show full request shapes which exceed line length
"scripts/*" = ["TID251"]
"setup.py" = ["TID251"]
"superset/config.py" = ["TID251"]
@@ -397,6 +437,7 @@ authorized_licenses = [
"apache software",
"apache software, bsd",
"bsd",
"bsd-2-clause",
"bsd-3-clause",
"isc license (iscl)",
"isc license",
+1
View File
@@ -19,3 +19,4 @@ testpaths =
tests
python_files = *_test.py test_*.py *_tests.py *viz/utils.py
addopts = -p no:warnings
asyncio_mode = auto
+14 -2
View File
@@ -16,8 +16,14 @@
# specific language governing permissions and limitations
# under the License.
#
urllib3==2.5.0
werkzeug>=3.0.1
# Security: CVE-2026-21441 - decompression bomb bypass on redirects
urllib3>=2.6.3,<3.0.0
# Security: CVE-2026-27199 - Windows device name handling in safe_join
werkzeug>=3.1.6,<4.0.0
# Security: CVE-2025-68146 - TOCTOU symlink vulnerability
filelock>=3.20.3,<4.0.0
# Security: decompression bomb fix (required by aiohttp 3.13.3)
brotli>=1.2.0,<2.0.0
numexpr>=2.9.0
# 5.0.0 has a sensitive deprecation used in other libs
@@ -36,3 +42,9 @@ marshmallow-sqlalchemy>=1.3.0,<1.4.1
# needed for python 3.12 support
openapi-schema-validator>=0.6.3
# Pin setuptools <81 until all dependencies migrate from pkg_resources to importlib.metadata
# pkg_resources is deprecated and will be removed in setuptools 81+ (around 2025-11-30)
# Known affected packages: Preset's 'clients' package
# See docs/docs/contributing/pkg-resources-migration.md for details
setuptools<81
+55 -30
View File
@@ -4,6 +4,8 @@ alembic==1.15.2
# via flask-migrate
amqp==5.3.1
# via kombu
annotated-types==0.7.0
# via pydantic
apispec==6.6.1
# via
# -r requirements/base.in
@@ -32,13 +34,15 @@ blinker==1.9.0
# via flask
bottleneck==1.5.0
# via apache-superset (pyproject.toml)
brotli==1.1.0
# via flask-compress
brotli==1.2.0
# via
# -r requirements/base.in
# flask-compress
cachelib==0.13.0
# via
# flask-caching
# flask-session
cachetools==5.5.2
cachetools==6.2.1
# via google-auth
cattrs==25.1.1
# via requests-cache
@@ -48,7 +52,7 @@ certifi==2025.6.15
# via
# requests
# selenium
cffi==1.17.1
cffi==2.0.0
# via
# cryptography
# pynacl
@@ -80,7 +84,7 @@ cron-descriptor==1.4.5
# via apache-superset (pyproject.toml)
croniter==6.0.0
# via apache-superset (pyproject.toml)
cryptography==44.0.3
cryptography==46.0.6
# via
# apache-superset (pyproject.toml)
# paramiko
@@ -97,6 +101,8 @@ email-validator==2.2.0
# via flask-appbuilder
et-xmlfile==2.0.0
# via openpyxl
filelock==3.20.3
# via -r requirements/base.in
flask==2.3.3
# via
# apache-superset (pyproject.toml)
@@ -112,15 +118,16 @@ flask==2.3.3
# flask-session
# flask-sqlalchemy
# flask-wtf
flask-appbuilder==4.8.0
# via apache-superset (pyproject.toml)
flask-babel==2.0.0
flask-appbuilder==5.2.1
# via
# apache-superset (pyproject.toml)
flask-babel==3.1.0
# via flask-appbuilder
flask-caching==2.3.1
# via apache-superset (pyproject.toml)
flask-compress==1.17
# via apache-superset (pyproject.toml)
flask-cors==4.0.2
flask-cors==6.0.2
# via apache-superset (pyproject.toml)
flask-jwt-extended==4.7.1
# via flask-appbuilder
@@ -148,19 +155,20 @@ geographiclib==2.0
# via geopy
geopy==2.4.1
# via apache-superset (pyproject.toml)
google-auth==2.40.3
google-auth==2.43.0
# via shillelagh
greenlet==3.1.1
# via
# apache-superset (pyproject.toml)
# shillelagh
# sqlalchemy
gunicorn==23.0.0
# via apache-superset (pyproject.toml)
h11==0.16.0
# via wsproto
hashids==1.3.1
# via apache-superset (pyproject.toml)
holidays==0.25
holidays==0.82
# via apache-superset (pyproject.toml)
humanize==4.12.3
# via apache-superset (pyproject.toml)
@@ -171,7 +179,9 @@ idna==3.10
# trio
# url-normalize
isodate==0.7.2
# via apache-superset (pyproject.toml)
# via
# apache-superset (pyproject.toml)
# apache-superset-core
itsdangerous==2.2.0
# via
# flask
@@ -192,15 +202,13 @@ jsonschema-specifications==2025.4.1
# openapi-schema-validator
kombu==5.5.3
# via celery
korean-lunar-calendar==0.3.1
# via holidays
limits==5.1.0
# via flask-limiter
mako==1.3.10
# via
# apache-superset (pyproject.toml)
# alembic
markdown==3.8
markdown==3.8.1
# via apache-superset (pyproject.toml)
markdown-it-py==3.0.0
# via rich
@@ -210,15 +218,18 @@ markupsafe==3.0.2
# mako
# werkzeug
# wtforms
marshmallow==3.26.1
marshmallow==3.26.2
# via
# apache-superset (pyproject.toml)
# flask-appbuilder
# marshmallow-sqlalchemy
# marshmallow-union
marshmallow-sqlalchemy==1.4.0
# via
# -r requirements/base.in
# flask-appbuilder
marshmallow-union==0.1.15
# via apache-superset (pyproject.toml)
mdurl==0.1.2
# via markdown-it-py
msgpack==1.0.8
@@ -235,6 +246,7 @@ numpy==1.26.4
# bottleneck
# numexpr
# pandas
# pyarrow
odfpy==1.4.1
# via pandas
openapi-schema-validator==0.6.3
@@ -256,7 +268,7 @@ packaging==25.0
# limits
# marshmallow
# shillelagh
pandas==2.0.3
pandas==2.1.4
# via apache-superset (pyproject.toml)
paramiko==3.5.1
# via
@@ -266,8 +278,8 @@ parsedatetime==2.6
# via apache-superset (pyproject.toml)
pgsanity==0.2.9
# via apache-superset (pyproject.toml)
pillow==11.3.0
# via apache_superset (pyproject.toml)
pillow==12.2.0
# via apache-superset (pyproject.toml)
platformdirs==4.3.8
# via requests-cache
ply==3.11
@@ -280,7 +292,7 @@ prompt-toolkit==3.0.51
# via click-repl
pyarrow==16.1.0
# via apache-superset (pyproject.toml)
pyasn1==0.6.1
pyasn1==0.6.3
# via
# pyasn1-modules
# rsa
@@ -288,16 +300,21 @@ pyasn1-modules==0.4.2
# via google-auth
pycparser==2.22
# via cffi
pygments==2.19.1
pydantic==2.11.7
# via apache-superset (pyproject.toml)
pydantic-core==2.33.2
# via pydantic
pygments==2.20.0
# via rich
pyjwt==2.10.1
pyjwt==2.12.0
# via
# apache-superset (pyproject.toml)
# flask-appbuilder
# flask-jwt-extended
pynacl==1.5.0
# redis
pynacl==1.6.2
# via paramiko
pyopenssl==25.1.0
pyopenssl==25.3.0
# via shillelagh
pyparsing==3.2.3
# via apache-superset (pyproject.toml)
@@ -327,7 +344,7 @@ pyyaml==6.0.2
# via
# apache-superset (pyproject.toml)
# apispec
redis==4.6.0
redis==5.3.1
# via apache-superset (pyproject.toml)
referencing==0.36.2
# via
@@ -351,7 +368,9 @@ rsa==4.9.1
# via google-auth
selenium==4.32.0
# via apache-superset (pyproject.toml)
shillelagh==1.3.5
setuptools==80.9.0
# via -r requirements/base.in
shillelagh==1.4.4
# via apache-superset (pyproject.toml)
simplejson==3.20.1
# via apache-superset (pyproject.toml)
@@ -380,7 +399,7 @@ sqlalchemy-utils==0.38.3
# via
# apache-superset (pyproject.toml)
# flask-appbuilder
sqlglot==27.3.0
sqlglot==28.10.0
# via apache-superset (pyproject.toml)
sshtunnel==0.4.0
# via apache-superset (pyproject.toml)
@@ -392,23 +411,28 @@ trio==0.30.0
# trio-websocket
trio-websocket==0.12.2
# via selenium
typing-extensions==4.14.0
typing-extensions==4.15.0
# via
# apache-superset (pyproject.toml)
# alembic
# cattrs
# limits
# pydantic
# pydantic-core
# pyopenssl
# referencing
# selenium
# shillelagh
# typing-inspection
typing-inspection==0.4.1
# via pydantic
tzdata==2025.2
# via
# kombu
# pandas
url-normalize==2.2.1
# via requests-cache
urllib3==2.5.0
urllib3==2.6.3
# via
# -r requirements/base.in
# requests
@@ -423,11 +447,12 @@ wcwidth==0.2.13
# via prompt-toolkit
websocket-client==1.8.0
# via selenium
werkzeug==3.1.3
werkzeug==3.1.6
# via
# -r requirements/base.in
# flask
# flask-appbuilder
# flask-cors
# flask-jwt-extended
# flask-login
wrapt==1.17.2
+1 -1
View File
@@ -16,4 +16,4 @@
# specific language governing permissions and limitations
# under the License.
#
-e .[development,bigquery,druid,gevent,gsheets,mysql,postgres,presto,prophet,trino,thumbnails]
-e .[development,bigquery,druid,duckdb,fastmcp,gevent,gsheets,mysql,postgres,presto,prophet,trino,thumbnails]
+228 -35
View File
@@ -2,6 +2,8 @@
# uv pip compile requirements/development.in -c requirements/base.txt -o requirements/development.txt
-e .
# via -r requirements/development.in
aiofile==3.9.0
# via py-key-value-aio
alembic==1.15.2
# via
# -c requirements/base.txt
@@ -10,6 +12,18 @@ amqp==5.3.1
# via
# -c requirements/base.txt
# kombu
annotated-types==0.7.0
# via
# -c requirements/base.txt
# pydantic
anyio==4.11.0
# via
# httpx
# mcp
# py-key-value-aio
# sse-starlette
# starlette
# watchfiles
apispec==6.6.1
# via
# -c requirements/base.txt
@@ -24,11 +38,14 @@ attrs==25.3.0
# via
# -c requirements/base.txt
# cattrs
# cyclopts
# jsonschema
# outcome
# referencing
# requests-cache
# trio
authlib==1.6.7
# via fastmcp
babel==2.17.0
# via
# -c requirements/base.txt
@@ -37,10 +54,14 @@ backoff==2.2.1
# via
# -c requirements/base.txt
# apache-superset
backports-tarfile==1.2.0
# via jaraco-context
bcrypt==4.3.0
# via
# -c requirements/base.txt
# paramiko
beartype==0.22.5
# via py-key-value-aio
billiard==4.2.1
# via
# -c requirements/base.txt
@@ -49,11 +70,17 @@ blinker==1.9.0
# via
# -c requirements/base.txt
# flask
boto3==1.42.39
# via apache-superset
botocore==1.42.39
# via
# boto3
# s3transfer
bottleneck==1.5.0
# via
# -c requirements/base.txt
# apache-superset
brotli==1.1.0
brotli==1.2.0
# via
# -c requirements/base.txt
# flask-compress
@@ -62,10 +89,13 @@ cachelib==0.13.0
# -c requirements/base.txt
# flask-caching
# flask-session
cachetools==5.5.2
cachetools==6.2.1
# via
# -c requirements/base.txt
# google-auth
# py-key-value-aio
caio==0.9.25
# via aiofile
cattrs==25.1.1
# via
# -c requirements/base.txt
@@ -77,9 +107,11 @@ celery==5.5.2
certifi==2025.6.15
# via
# -c requirements/base.txt
# httpcore
# httpx
# requests
# selenium
cffi==1.17.1
cffi==2.0.0
# via
# -c requirements/base.txt
# cryptography
@@ -101,6 +133,7 @@ click==8.2.1
# click-repl
# flask
# flask-appbuilder
# uvicorn
click-didyoumean==0.3.1
# via
# -c requirements/base.txt
@@ -136,14 +169,20 @@ croniter==6.0.0
# via
# -c requirements/base.txt
# apache-superset
cryptography==44.0.3
cryptography==46.0.6
# via
# -c requirements/base.txt
# apache-superset
# authlib
# joserfc
# paramiko
# pyjwt
# pyopenssl
# secretstorage
cycler==0.12.1
# via matplotlib
cyclopts==4.2.4
# via fastmcp
db-dtypes==1.3.1
# via pandas-gbq
defusedxml==0.7.1
@@ -168,16 +207,33 @@ dnspython==2.7.0
# email-validator
docker==7.0.0
# via apache-superset
docstring-parser==0.17.0
# via cyclopts
docutils==0.22.3
# via rich-rst
duckdb==1.5.3
# via
# apache-superset
# duckdb-engine
duckdb-engine==0.17.0
# via apache-superset
email-validator==2.2.0
# via
# -c requirements/base.txt
# flask-appbuilder
# pydantic
et-xmlfile==2.0.0
# via
# -c requirements/base.txt
# openpyxl
filelock==3.12.2
# via virtualenv
exceptiongroup==1.3.0
# via fastmcp
fastmcp==3.1.0
# via apache-superset
filelock==3.20.3
# via
# -c requirements/base.txt
# virtualenv
flask==2.3.3
# via
# -c requirements/base.txt
@@ -195,11 +251,11 @@ flask==2.3.3
# flask-sqlalchemy
# flask-testing
# flask-wtf
flask-appbuilder==4.8.0
flask-appbuilder==5.2.1
# via
# -c requirements/base.txt
# apache-superset
flask-babel==2.0.0
flask-babel==3.1.0
# via
# -c requirements/base.txt
# flask-appbuilder
@@ -211,7 +267,7 @@ flask-compress==1.17
# via
# -c requirements/base.txt
# apache-superset
flask-cors==4.0.2
flask-cors==6.0.2
# via
# -c requirements/base.txt
# apache-superset
@@ -275,7 +331,7 @@ google-api-core==2.23.0
# google-cloud-core
# pandas-gbq
# sqlalchemy-bigquery
google-auth==2.40.3
google-auth==2.43.0
# via
# -c requirements/base.txt
# google-api-core
@@ -313,6 +369,7 @@ greenlet==3.1.1
# apache-superset
# gevent
# shillelagh
# sqlalchemy
grpcio==1.71.0
# via
# apache-superset
@@ -327,16 +384,26 @@ gunicorn==23.0.0
h11==0.16.0
# via
# -c requirements/base.txt
# httpcore
# uvicorn
# wsproto
hashids==1.3.1
# via
# -c requirements/base.txt
# apache-superset
holidays==0.25
holidays==0.82
# via
# -c requirements/base.txt
# apache-superset
# prophet
httpcore==1.0.9
# via httpx
httpx==0.28.1
# via
# fastmcp
# mcp
httpx-sse==0.4.3
# via mcp
humanize==4.12.3
# via
# -c requirements/base.txt
@@ -346,10 +413,16 @@ identify==2.5.36
idna==3.10
# via
# -c requirements/base.txt
# anyio
# email-validator
# httpx
# requests
# trio
# url-normalize
importlib-metadata==8.7.0
# via
# keyring
# opentelemetry-api
importlib-resources==6.5.2
# via prophet
iniconfig==2.0.0
@@ -358,6 +431,7 @@ isodate==0.7.2
# via
# -c requirements/base.txt
# apache-superset
# apache-superset-core
isort==6.0.1
# via pylint
itsdangerous==2.2.0
@@ -365,38 +439,57 @@ itsdangerous==2.2.0
# -c requirements/base.txt
# flask
# flask-wtf
jaraco-classes==3.4.0
# via keyring
jaraco-context==6.0.1
# via keyring
jaraco-functools==4.3.0
# via keyring
jeepney==0.9.0
# via
# keyring
# secretstorage
jinja2==3.1.6
# via
# -c requirements/base.txt
# flask
# flask-babel
jmespath==1.1.0
# via
# boto3
# botocore
joserfc==1.6.8
# via apache-superset
jsonpath-ng==1.7.0
# via
# -c requirements/base.txt
# apache-superset
jsonref==1.1.0
# via fastmcp
jsonschema==4.23.0
# via
# -c requirements/base.txt
# flask-appbuilder
# mcp
# openapi-schema-validator
# openapi-spec-validator
jsonschema-path==0.3.4
# via openapi-spec-validator
# via
# fastmcp
# openapi-spec-validator
jsonschema-specifications==2025.4.1
# via
# -c requirements/base.txt
# jsonschema
# openapi-schema-validator
keyring==25.7.0
# via py-key-value-aio
kiwisolver==1.4.7
# via matplotlib
kombu==5.5.3
# via
# -c requirements/base.txt
# celery
korean-lunar-calendar==0.3.1
# via
# -c requirements/base.txt
# holidays
lazy-object-proxy==1.10.0
# via openapi-spec-validator
limits==5.1.0
@@ -408,7 +501,7 @@ mako==1.3.10
# -c requirements/base.txt
# alembic
# apache-superset
markdown==3.8
markdown==3.8.1
# via
# -c requirements/base.txt
# apache-superset
@@ -423,24 +516,35 @@ markupsafe==3.0.2
# mako
# werkzeug
# wtforms
marshmallow==3.26.1
marshmallow==3.26.2
# via
# -c requirements/base.txt
# apache-superset
# flask-appbuilder
# marshmallow-sqlalchemy
# marshmallow-union
marshmallow-sqlalchemy==1.4.0
# via
# -c requirements/base.txt
# flask-appbuilder
marshmallow-union==0.1.15
# via
# -c requirements/base.txt
# apache-superset
matplotlib==3.9.0
# via prophet
mccabe==0.7.0
# via pylint
mcp==1.24.0
# via fastmcp
mdurl==0.1.2
# via
# -c requirements/base.txt
# markdown-it-py
more-itertools==10.8.0
# via
# jaraco-classes
# jaraco-functools
msgpack==1.0.8
# via
# -c requirements/base.txt
@@ -469,12 +573,15 @@ numpy==1.26.4
# pandas
# pandas-gbq
# prophet
# pyarrow
oauthlib==3.2.2
# via requests-oauthlib
odfpy==1.4.1
# via
# -c requirements/base.txt
# pandas
openapi-pydantic==0.5.1
# via fastmcp
openapi-schema-validator==0.6.3
# via
# -c requirements/base.txt
@@ -485,6 +592,8 @@ openpyxl==3.1.5
# via
# -c requirements/base.txt
# pandas
opentelemetry-api==1.39.1
# via fastmcp
ordered-set==4.1.0
# via
# -c requirements/base.txt
@@ -502,6 +611,8 @@ packaging==25.0
# db-dtypes
# deprecation
# docker
# duckdb-engine
# fastmcp
# google-cloud-bigquery
# gunicorn
# limits
@@ -510,7 +621,7 @@ packaging==25.0
# pytest
# shillelagh
# sqlalchemy-bigquery
pandas==2.0.3
pandas==2.1.4
# via
# -c requirements/base.txt
# apache-superset
@@ -537,8 +648,9 @@ pgsanity==0.2.9
# via
# -c requirements/base.txt
# apache-superset
pillow==11.3.0
pillow==12.2.0
# via
# -c requirements/base.txt
# apache-superset
# matplotlib
pip==25.1.1
@@ -546,6 +658,7 @@ pip==25.1.1
platformdirs==4.3.8
# via
# -c requirements/base.txt
# fastmcp
# pylint
# requests-cache
# virtualenv
@@ -571,13 +684,13 @@ prompt-toolkit==3.0.51
# via
# -c requirements/base.txt
# click-repl
prophet==1.1.5
prophet==1.2.0
# via apache-superset
proto-plus==1.25.0
# via
# google-api-core
# google-cloud-bigquery-storage
protobuf==4.25.5
protobuf==4.25.8
# via
# google-api-core
# google-cloud-bigquery-storage
@@ -588,13 +701,16 @@ psutil==6.1.0
# via apache-superset
psycopg2-binary==2.9.6
# via apache-superset
py-key-value-aio==0.4.4
# via fastmcp
pyarrow==16.1.0
# via
# -c requirements/base.txt
# apache-superset
# apache-superset-core
# db-dtypes
# pandas-gbq
pyasn1==0.6.1
pyasn1==0.6.3
# via
# -c requirements/base.txt
# pyasn1-modules
@@ -609,13 +725,27 @@ pycparser==2.22
# via
# -c requirements/base.txt
# cffi
pydantic==2.11.7
# via
# -c requirements/base.txt
# apache-superset
# fastmcp
# mcp
# openapi-pydantic
# pydantic-settings
pydantic-core==2.33.2
# via
# -c requirements/base.txt
# pydantic
pydantic-settings==2.12.0
# via mcp
pydata-google-auth==1.9.0
# via pandas-gbq
pydruid==0.6.9
# via apache-superset
pyfakefs==5.3.5
# via apache-superset
pygments==2.19.1
pygments==2.20.0
# via
# -c requirements/base.txt
# rich
@@ -623,19 +753,21 @@ pyhive==0.7.0
# via apache-superset
pyinstrument==4.4.0
# via apache-superset
pyjwt==2.10.1
pyjwt==2.12.0
# via
# -c requirements/base.txt
# apache-superset
# flask-appbuilder
# flask-jwt-extended
# mcp
# redis
pylint==3.3.7
# via apache-superset
pynacl==1.5.0
pynacl==1.6.2
# via
# -c requirements/base.txt
# paramiko
pyopenssl==25.1.0
pyopenssl==25.3.0
# via
# -c requirements/base.txt
# shillelagh
@@ -644,6 +776,8 @@ pyparsing==3.2.3
# -c requirements/base.txt
# apache-superset
# matplotlib
pyperclip==1.11.0
# via fastmcp
pysocks==1.7.1
# via
# -c requirements/base.txt
@@ -651,8 +785,11 @@ pysocks==1.7.1
pytest==7.4.4
# via
# apache-superset
# pytest-asyncio
# pytest-cov
# pytest-mock
pytest-asyncio==0.23.8
# via apache-superset
pytest-cov==6.0.0
# via apache-superset
pytest-mock==3.10.0
@@ -661,6 +798,7 @@ python-dateutil==2.9.0.post0
# via
# -c requirements/base.txt
# apache-superset
# botocore
# celery
# croniter
# flask-appbuilder
@@ -676,12 +814,16 @@ python-dotenv==1.1.0
# via
# -c requirements/base.txt
# apache-superset
# fastmcp
# pydantic-settings
python-geohash==0.8.5
# via
# -c requirements/base.txt
# apache-superset
python-ldap==3.4.4
# via apache-superset
python-multipart==0.0.20
# via mcp
pytz==2025.2
# via
# -c requirements/base.txt
@@ -698,9 +840,10 @@ pyyaml==6.0.2
# -c requirements/base.txt
# apache-superset
# apispec
# fastmcp
# jsonschema-path
# pre-commit
redis==4.6.0
redis==5.3.1
# via
# -c requirements/base.txt
# apache-superset
@@ -710,6 +853,8 @@ referencing==0.36.2
# jsonschema
# jsonschema-path
# jsonschema-specifications
regex==2026.4.4
# via tiktoken
requests==2.32.4
# via
# -c requirements/base.txt
@@ -722,6 +867,7 @@ requests==2.32.4
# requests-cache
# requests-oauthlib
# shillelagh
# tiktoken
# trino
requests-cache==1.2.1
# via
@@ -736,7 +882,12 @@ rfc3339-validator==0.1.4
rich==13.9.4
# via
# -c requirements/base.txt
# cyclopts
# fastmcp
# flask-limiter
# rich-rst
rich-rst==1.3.2
# via cyclopts
rpds-py==0.25.0
# via
# -c requirements/base.txt
@@ -748,18 +899,23 @@ rsa==4.9.1
# google-auth
ruff==0.8.0
# via apache-superset
s3transfer==0.16.0
# via boto3
secretstorage==3.5.0
# via keyring
selenium==4.32.0
# via
# -c requirements/base.txt
# apache-superset
setuptools==80.7.1
setuptools==80.9.0
# via
# -c requirements/base.txt
# nodeenv
# pandas-gbq
# pydata-google-auth
# zope-event
# zope-interface
shillelagh==1.3.5
shillelagh==1.4.4
# via
# -c requirements/base.txt
# apache-superset
@@ -781,16 +937,18 @@ slack-sdk==3.35.0
sniffio==1.3.1
# via
# -c requirements/base.txt
# anyio
# trio
sortedcontainers==2.4.0
# via
# -c requirements/base.txt
# -c requirements/base-constraint.txt
# trio
sqlalchemy==1.4.54
# via
# -c requirements/base.txt
# alembic
# apache-superset
# duckdb-engine
# flask-appbuilder
# flask-sqlalchemy
# marshmallow-sqlalchemy
@@ -804,22 +962,28 @@ sqlalchemy-utils==0.38.3
# -c requirements/base.txt
# apache-superset
# flask-appbuilder
sqlglot==27.3.0
sqlglot==28.10.0
# via
# -c requirements/base.txt
# apache-superset
sqloxide==0.1.51
# via apache-superset
sse-starlette==3.0.3
# via mcp
sshtunnel==0.4.0
# via
# -c requirements/base.txt
# apache-superset
starlette==0.50.0
# via mcp
statsd==4.0.1
# via apache-superset
tabulate==0.9.0
# via
# -c requirements/base.txt
# apache-superset
tiktoken==0.12.0
# via apache-superset
tomlkit==0.13.3
# via pylint
tqdm==4.67.1
@@ -837,17 +1001,32 @@ trio-websocket==0.12.2
# via
# -c requirements/base.txt
# selenium
typing-extensions==4.14.0
typing-extensions==4.15.0
# via
# -c requirements/base.txt
# alembic
# anyio
# apache-superset
# cattrs
# exceptiongroup
# limits
# mcp
# opentelemetry-api
# py-key-value-aio
# pydantic
# pydantic-core
# pyopenssl
# referencing
# selenium
# shillelagh
# starlette
# typing-inspection
typing-inspection==0.4.1
# via
# -c requirements/base.txt
# mcp
# pydantic
# pydantic-settings
tzdata==2025.2
# via
# -c requirements/base.txt
@@ -855,17 +1034,24 @@ tzdata==2025.2
# pandas
tzlocal==5.2
# via trino
uncalled-for==0.2.0
# via fastmcp
url-normalize==2.2.1
# via
# -c requirements/base.txt
# requests-cache
urllib3==2.5.0
urllib3==2.6.3
# via
# -c requirements/base.txt
# botocore
# docker
# requests
# requests-cache
# selenium
uvicorn==0.38.0
# via
# fastmcp
# mcp
vine==5.1.0
# via
# -c requirements/base.txt
@@ -874,6 +1060,8 @@ vine==5.1.0
# kombu
virtualenv==20.29.2
# via pre-commit
watchfiles==1.1.1
# via fastmcp
wcwidth==0.2.13
# via
# -c requirements/base.txt
@@ -882,11 +1070,14 @@ websocket-client==1.8.0
# via
# -c requirements/base.txt
# selenium
werkzeug==3.1.3
websockets==15.0.1
# via fastmcp
werkzeug==3.1.6
# via
# -c requirements/base.txt
# flask
# flask-appbuilder
# flask-cors
# flask-jwt-extended
# flask-login
wrapt==1.17.2
@@ -917,6 +1108,8 @@ xlsxwriter==3.0.9
# -c requirements/base.txt
# apache-superset
# pandas
zipp==3.23.0
# via importlib-metadata
zope-event==5.0
# via gevent
zope-interface==5.4.0
+1
View File
@@ -31,6 +31,7 @@ PATTERNS = {
r"^superset/",
r"^scripts/",
r"^setup\.py",
r"^pyproject\.toml$",
r"^requirements/.+\.txt",
r"^.pylintrc",
],
+6 -1
View File
@@ -139,14 +139,19 @@ def main() -> None:
test_files = []
file_count = 0
skipped_count = 0
for root, _, files in os.walk(cypress_tests_path):
for file in files:
if file.endswith("test.ts") or file.endswith("test.js"):
# Skip files prefixed with _skip. (excluded by excludeSpecPattern)
if file.startswith("_skip."):
skipped_count += 1
continue
file_count += 1
test_files.append(
os.path.join(root, file).replace(cypress_base_full_path, "")
)
print(f"Found {file_count} test files.")
print(f"Found {file_count} test files ({skipped_count} skipped).")
# Initialize groups for round-robin distribution
groups: dict[int, list[str]] = {i: [] for i in range(args.parallelism)}
+59 -2
View File
@@ -59,10 +59,14 @@ embedDashboard({
// ...
}
},
// optional additional iframe sandbox attributes
// optional additional iframe sandbox attributes
iframeSandboxExtras: ['allow-top-navigation', 'allow-popups-to-escape-sandbox'],
// optional Permissions Policy features
iframeAllowExtras: ['clipboard-write', 'fullscreen'],
// optional config to enforce a particular referrerPolicy
referrerPolicy: "same-origin"
referrerPolicy: "same-origin",
// optional callback to customize permalink URLs
resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`
});
```
@@ -159,6 +163,20 @@ To pass additional sandbox attributes you can use `iframeSandboxExtras`:
iframeSandboxExtras: ['allow-top-navigation', 'allow-popups-to-escape-sandbox']
```
### Permissions Policy
To enable specific browser features within the embedded iframe, use `iframeAllowExtras` to set the iframe's [Permissions Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Permissions_Policy) (the `allow` attribute):
```js
// optional Permissions Policy features
iframeAllowExtras: ['clipboard-write', 'fullscreen']
```
Common permissions you might need:
- `clipboard-write` - Required for "Copy permalink to clipboard" functionality
- `fullscreen` - Required for fullscreen chart viewing
- `camera`, `microphone` - If your dashboards include media capture features
### Enforcing a ReferrerPolicy on the request triggered by the iframe
By default, the Embedded SDK creates an `iframe` element without a `referrerPolicy` value enforced. This means that a policy defined for `iframe` elements at the host app level would reflect to it.
@@ -166,3 +184,42 @@ By default, the Embedded SDK creates an `iframe` element without a `referrerPoli
This can be an issue as during the embedded enablement for a dashboard it's possible to specify which domain(s) are allowed to embed the dashboard, and this validation happens throuth the `Referrer` header. That said, in case the hosting app has a more restrictive policy that would omit this header, this validation would fail.
Use the `referrerPolicy` parameter in the `embedDashboard` method to specify [a particular policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referrer-Policy) that works for your implementation.
### Customizing Permalink URLs
When users click share buttons inside an embedded dashboard, Superset generates permalinks using Superset's domain. If you want to use your own domain and URL format for these permalinks, you can provide a `resolvePermalinkUrl` callback:
```js
embedDashboard({
id: "abc123",
supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById("my-superset-container"),
fetchGuestToken: () => fetchGuestTokenFromBackend(),
// Customize permalink URLs
resolvePermalinkUrl: ({ key }) => {
// key: the permalink key (e.g., "xyz789")
return `https://my-app.com/analytics/share/${key}`;
}
});
```
To restore the dashboard state from a permalink in your app:
```js
// In your route handler for /analytics/share/:key
const permalinkKey = routeParams.key;
embedDashboard({
id: "abc123",
supersetDomain: "https://superset.example.com",
mountPoint: document.getElementById("my-superset-container"),
fetchGuestToken: () => fetchGuestTokenFromBackend(),
resolvePermalinkUrl: ({ key }) => `https://my-app.com/analytics/share/${key}`,
dashboardUiConfig: {
urlParams: {
permalink_key: permalinkKey, // Restores filters, tabs, chart states, and scrolls to anchor
}
}
});
```
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "@superset-ui/embedded-sdk",
"version": "0.2.0",
"version": "0.3.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@superset-ui/embedded-sdk",
"version": "0.2.0",
"version": "0.3.0",
"license": "Apache-2.0",
"dependencies": {
"@superset-ui/switchboard": "^0.20.3",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@superset-ui/embedded-sdk",
"version": "0.2.0",
"version": "0.3.0",
"description": "SDK for embedding resources from Superset into your own application",
"access": "public",
"keywords": [
+68 -3
View File
@@ -66,8 +66,13 @@ export type EmbedDashboardParams = {
iframeTitle?: string;
/** additional iframe sandbox attributes ex (allow-top-navigation, allow-popups-to-escape-sandbox) **/
iframeSandboxExtras?: string[];
/** Additional Permissions Policy features for the iframe's `allow` attribute (e.g., ['camera', 'microphone']). `fullscreen` and `clipboard-write` are granted by default. **/
iframeAllowExtras?: string[];
/** force a specific refererPolicy to be used in the iframe request **/
referrerPolicy?: ReferrerPolicy;
/** Callback to resolve permalink URLs. If provided, this will be called when generating permalinks
* to allow the host app to customize the URL. If not provided, Superset's default URL is used. */
resolvePermalinkUrl?: ResolvePermalinkUrlFn;
};
export type Size = {
@@ -81,6 +86,17 @@ export type ObserveDataMaskCallbackFn = (
nativeFiltersChanged: boolean;
},
) => void;
export type ThemeMode = 'default' | 'dark' | 'system';
/**
* Callback to resolve permalink URLs.
* Receives the permalink key and returns the full URL to use for the permalink.
*/
export type ResolvePermalinkUrlFn = (params: {
/** The permalink key (e.g., "xyz789") */
key: string;
}) => string | Promise<string>;
export type EmbeddedDashboard = {
getScrollSize: () => Promise<Size>;
unmount: () => void;
@@ -89,8 +105,11 @@ export type EmbeddedDashboard = {
observeDataMask: (
callbackFn: ObserveDataMaskCallbackFn,
) => void;
getDataMask: () => Record<string, any>;
getDataMask: () => Promise<Record<string, any>>;
getChartStates: () => Promise<Record<string, any>>;
getChartDataPayloads: (params?: { chartId?: number }) => Promise<Record<string, any>>;
setThemeConfig: (themeConfig: Record<string, any>) => void;
setThemeMode: (mode: ThemeMode) => void;
};
/**
@@ -105,7 +124,9 @@ export async function embedDashboard({
debug = false,
iframeTitle = 'Embedded Dashboard',
iframeSandboxExtras = [],
iframeAllowExtras = [],
referrerPolicy,
resolvePermalinkUrl,
}: EmbedDashboardParams): Promise<EmbeddedDashboard> {
function log(...info: unknown[]) {
if (debug) {
@@ -211,6 +232,15 @@ export async function embedDashboard({
});
iframe.src = `${supersetDomain}/embedded/${id}${urlParamsString}`;
iframe.title = iframeTitle;
iframe.style.background = 'transparent';
// Permissions Policy features the embedded dashboard relies on. Modern
// browsers gate these APIs on the iframe's `allow` attribute regardless
// of sandbox flags, so we include them by default. Host apps can extend
// the list via `iframeAllowExtras`.
const allowFeatures = Array.from(
new Set(['fullscreen', 'clipboard-write', ...iframeAllowExtras]),
);
iframe.setAttribute('allow', allowFeatures.join('; '));
//@ts-ignore
mountPoint.replaceChildren(iframe);
log('placed the iframe');
@@ -233,6 +263,24 @@ export async function embedDashboard({
setTimeout(refreshGuestToken, getGuestTokenRefreshTiming(guestToken));
// Register the resolvePermalinkUrl method for the iframe to call
// Returns null if no callback provided or on error, allowing iframe to use default URL
ourPort.start();
ourPort.defineMethod(
'resolvePermalinkUrl',
async ({ key }: { key: string }): Promise<string | null> => {
if (!resolvePermalinkUrl) {
return null;
}
try {
return await resolvePermalinkUrl({ key });
} catch (error) {
log('Error in resolvePermalinkUrl callback:', error);
return null;
}
},
);
function unmount() {
log('unmounting');
//@ts-ignore
@@ -244,10 +292,12 @@ export async function embedDashboard({
ourPort.get<string>('getDashboardPermalink', { anchor });
const getActiveTabs = () => ourPort.get<string[]>('getActiveTabs');
const getDataMask = () => ourPort.get<Record<string, any>>('getDataMask');
const getChartStates = () => ourPort.get<Record<string, any>>('getChartStates');
const getChartDataPayloads = (params?: { chartId?: number }) =>
ourPort.get<Record<string, any>>('getChartDataPayloads', params);
const observeDataMask = (
callbackFn: ObserveDataMaskCallbackFn,
) => {
ourPort.start();
ourPort.defineMethod('observeDataMask', callbackFn);
};
// TODO: Add proper types once theming branch is merged
@@ -263,6 +313,18 @@ export async function embedDashboard({
}
};
const setThemeMode = (mode: ThemeMode): void => {
try {
ourPort.emit('setThemeMode', { mode });
log(`Theme mode set to: ${mode}`);
} catch (error) {
log(
'Error sending theme mode. Ensure the iframe side implements the "setThemeMode" method.',
);
throw error;
}
};
return {
getScrollSize,
unmount,
@@ -270,6 +332,9 @@ export async function embedDashboard({
getActiveTabs,
observeDataMask,
getDataMask,
setThemeConfig
getChartStates,
getChartDataPayloads,
setThemeConfig,
setThemeMode,
};
}
+169 -1
View File
@@ -16,7 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
const packageConfig = require('./package');
// Register TypeScript require hook so ESLint can load .ts plugin files
require('tsx/cjs');
// eslint-disable-next-line import/extensions
const packageConfig = require('./package.json');
const importCoreModules = [];
Object.entries(packageConfig.dependencies).forEach(([pkg]) => {
@@ -83,6 +88,7 @@ module.exports = {
'plugin:react-hooks/recommended',
'plugin:react-prefer-function-component/recommended',
'plugin:storybook/recommended',
'plugin:react-you-might-not-need-an-effect/legacy-recommended',
],
parser: '@babel/eslint-parser',
parserOptions: {
@@ -129,6 +135,160 @@ module.exports = {
// TODO(hainenber): merge it to below `rules` section.
rules: {
'@typescript-eslint/prefer-optional-chain': 'error',
// === Essential Superset customizations ===
// Prettier integration
'prettier/prettier': 'error',
// Custom Superset rules
'theme-colors/no-literal-colors': 'error',
'icons/no-fa-icons-usage': 'error',
'i18n-strings/no-template-vars': 'error',
// Core ESLint overrides for Superset
'no-console': 'warn',
'no-unused-vars': 'off', // TypeScript handles this
camelcase: [
'error',
{
allow: ['^UNSAFE_', '__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'],
properties: 'never',
},
],
'prefer-destructuring': ['error', { object: true, array: false }],
'no-prototype-builtins': 0,
curly: 'off',
// Import plugin overrides
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
'import/no-cycle': 0,
'import/prefer-default-export': 0,
'import/no-named-as-default-member': 0,
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'test/**',
'tests/**',
'spec/**',
'**/__tests__/**',
'**/__mocks__/**',
'*.test.{js,jsx,ts,tsx}',
'*.spec.{js,jsx,ts,tsx}',
'**/*.test.{js,jsx,ts,tsx}',
'**/*.spec.{js,jsx,ts,tsx}',
'**/jest.config.js',
'**/jest.setup.js',
'**/webpack.config.js',
'**/webpack.config.*.js',
'**/.eslintrc*.js',
],
optionalDependencies: false,
},
],
// React plugin overrides
'react/prop-types': 0,
'react/require-default-props': 0,
'react/forbid-prop-types': 0,
'react/forbid-component-props': 1,
'react/jsx-filename-extension': [1, { extensions: ['.jsx', '.tsx'] }],
'react/jsx-fragments': 1,
'react/jsx-no-bind': 0,
'react/jsx-props-no-spreading': 0,
'react/no-array-index-key': 0,
'react/no-string-refs': 0,
'react/no-unescaped-entities': 0,
'react/no-unused-prop-types': 0,
'react/destructuring-assignment': 0,
'react/sort-comp': 0,
'react/static-property-placement': 0,
'react-prefer-function-component/react-prefer-function-component': 1,
'react/react-in-jsx-scope': 0,
'react/no-unknown-property': 0,
'react/no-void-elements': 0,
'react/function-component-definition': [
0,
{
namedComponents: 'arrow-function',
},
],
'react/no-unstable-nested-components': 0,
'react/jsx-no-useless-fragment': 0,
'react/no-unused-class-component-methods': 0,
// JSX-a11y overrides
'jsx-a11y/anchor-is-valid': 1,
'jsx-a11y/click-events-have-key-events': 0,
'jsx-a11y/mouse-events-have-key-events': 0,
'jsx-a11y/no-static-element-interactions': 0,
// React effect best practices
'react-you-might-not-need-an-effect/no-empty-effect': 'error',
'react-you-might-not-need-an-effect/no-pass-live-state-to-parent': 'error',
'react-you-might-not-need-an-effect/no-initialize-state': 'error',
// Lodash
'lodash/import-scope': [2, 'member'],
// React effect best practices
'react-you-might-not-need-an-effect/no-reset-all-state-on-prop-change':
'error',
'react-you-might-not-need-an-effect/no-chain-state-updates': 'error',
'react-you-might-not-need-an-effect/no-event-handler': 'error',
'react-you-might-not-need-an-effect/no-derived-state': 'error',
// Storybook
'storybook/prefer-pascal-case': 'error',
// File progress
'file-progress/activate': 1,
// React effect rules
'react-you-might-not-need-an-effect/no-adjust-state-on-prop-change':
'error',
'react-you-might-not-need-an-effect/no-pass-data-to-parent': 'error',
// Restricted imports
'no-restricted-imports': [
'error',
{
paths: Object.values(restrictedImportsRules).filter(Boolean),
patterns: ['antd/*'],
},
],
// Temporarily disabled for migration
'no-unsafe-optional-chaining': 0,
'no-import-assign': 0,
'import/no-relative-packages': 0,
'no-promise-executor-return': 0,
'import/no-import-module-exports': 0,
// Restrict certain syntax patterns
'no-restricted-syntax': [
'error',
{
selector:
"ImportDeclaration[source.value='react'] :matches(ImportDefaultSpecifier, ImportNamespaceSpecifier)",
message:
'Default React import is not required due to automatic JSX runtime in React 16.4',
},
{
selector: 'ImportNamespaceSpecifier[parent.source.value!=/^(\\.|src)/]',
message: 'Wildcard imports are not allowed',
},
],
},
overrides: [
{
@@ -323,6 +483,7 @@ module.exports = {
'*.stories.tsx',
'*.stories.jsx',
'fixtures.*',
'playwright/**/*',
],
excludedFiles: 'cypress-base/cypress/**/*',
plugins: ['jest', 'jest-dom', 'no-only-tests', 'testing-library'],
@@ -397,6 +558,13 @@ module.exports = {
'react/no-void-elements': 0,
},
},
{
files: ['playwright/**/*'],
rules: {
'import/no-unresolved': 0, // Playwright is not installed in main build
'import/no-extraneous-dependencies': 0, // Playwright is not installed in main build
},
},
],
// eslint-disable-next-line no-dupe-keys
rules: {
+3
View File
@@ -1,5 +1,8 @@
coverage/*
cypress/screenshots
cypress/videos
playwright/.auth
playwright-report/
test-results/
src/temp
.temp_cache/
@@ -1,49 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { LOGIN } from 'cypress/utils/urls';
function interceptLogin() {
cy.intercept('POST', '**/login/').as('login');
}
describe('Login view', () => {
beforeEach(() => {
cy.visit(LOGIN);
});
it('should redirect to login with incorrect username and password', () => {
interceptLogin();
cy.getBySel('login-form').should('be.visible');
cy.getBySel('username-input').type('admin');
cy.getBySel('password-input').type('wrongpassword');
cy.getBySel('login-button').click();
cy.wait('@login');
cy.url().should('include', LOGIN);
});
it('should login with correct username and password', () => {
interceptLogin();
cy.getBySel('login-form').should('be.visible');
cy.getBySel('username-input').type('admin');
cy.getBySel('password-input').type('general');
cy.getBySel('login-button').click();
cy.wait('@login');
cy.getCookies().should('have.length', 1);
});
});
@@ -175,7 +175,7 @@ describe('Charts list', () => {
interceptDelete();
cy.getBySel('sort-header').contains('Name').click();
// Modal closes immediatly without this
// Modal closes immediately without this
cy.wait(2000);
cy.getBySel('table-row').eq(0).contains('3 - Sample chart');
@@ -1,766 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// eslint-disable-next-line import/no-extraneous-dependencies
import { Interception } from 'cypress/types/net-stubbing';
import { waitForChartLoad } from 'cypress/utils';
import { SUPPORTED_CHARTS_DASHBOARD } from 'cypress/utils/urls';
import {
openTopLevelTab,
SUPPORTED_TIER1_CHARTS,
SUPPORTED_TIER2_CHARTS,
} from './utils';
import {
interceptExploreJson,
interceptV1ChartData,
interceptFormDataKey,
} from '../explore/utils';
const interceptDrillInfo = () => {
cy.intercept('GET', '**/api/v1/dataset/*/drill_info/*', {
statusCode: 200,
body: {
result: {
id: 1,
changed_on_humanized: '2 days ago',
created_on_humanized: 'a week ago',
table_name: 'birth_names',
changed_by: {
first_name: 'Admin',
last_name: 'User',
},
created_by: {
first_name: 'Admin',
last_name: 'User',
},
owners: [
{
first_name: 'Admin',
last_name: 'User',
},
],
columns: [
{
column_name: 'gender',
verbose_name: null,
},
{
column_name: 'state',
verbose_name: null,
},
{
column_name: 'name',
verbose_name: null,
},
{
column_name: 'ds',
verbose_name: null,
},
],
},
},
}).as('drillInfo');
};
const closeModal = () => {
cy.get('body').then($body => {
if ($body.find('[data-test="close-drill-by-modal"]').length) {
cy.getBySel('close-drill-by-modal').click({ force: true });
}
});
};
const openTableContextMenu = (
cellContent: string,
tableSelector = "[data-test-viz-type='table']",
) => {
cy.get(tableSelector).scrollIntoView();
cy.get(tableSelector).contains(cellContent).first().rightclick();
};
const drillBy = (targetDrillByColumn: string, isLegacy = false) => {
if (isLegacy) {
interceptExploreJson('legacyData');
} else {
interceptV1ChartData();
}
cy.get('.ant-dropdown:not(.ant-dropdown-hidden)', { timeout: 15000 })
.should('be.visible')
.find("[role='menu'] [role='menuitem']")
.contains(/^Drill by$/)
.trigger('mouseover', { force: true });
cy.get(
'.ant-dropdown-menu-submenu:not(.ant-dropdown-menu-submenu-hidden) [data-test="drill-by-submenu"]',
{ timeout: 15000 },
)
.should('be.visible')
.find('[role="menuitem"]')
.contains(new RegExp(`^${targetDrillByColumn}$`))
.click();
cy.get(
'.ant-dropdown-menu-submenu:not(.ant-dropdown-menu-submenu-hidden) [data-test="drill-by-submenu"]',
).trigger('mouseout', { clientX: 0, clientY: 0, force: true });
cy.get(
'.ant-dropdown-menu-submenu:not(.ant-dropdown-menu-submenu-hidden) [data-test="drill-by-submenu"]',
).should('not.exist');
if (isLegacy) {
return cy.wait('@legacyData');
}
return cy.wait('@v1Data');
};
const verifyExpectedFormData = (
interceptedRequest: Interception,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
expectedFormData: Record<string, any>,
) => {
const actualFormData = interceptedRequest.request.body?.form_data;
Object.entries(expectedFormData).forEach(([key, val]) => {
expect(actualFormData?.[key]).to.eql(val);
});
};
const testEchart = (
vizType: string,
chartName: string,
drillClickCoordinates: [[number, number], [number, number]],
furtherDrillDimension = 'name',
) => {
cy.get(`[data-test-viz-type='${vizType}'] canvas`).then($canvas => {
// click 'boy'
cy.wrap($canvas).scrollIntoView();
cy.wrap($canvas).trigger(
'mouseover',
drillClickCoordinates[0][0],
drillClickCoordinates[0][1],
);
cy.wrap($canvas).rightclick(
drillClickCoordinates[0][0],
drillClickCoordinates[0][1],
);
drillBy('state').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: ['state'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.getBySel(`"Drill by: ${chartName}-modal"`).as('drillByModal');
cy.get('@drillByModal')
.find('.draggable-trigger')
.should('contain', chartName);
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'state');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
// further drill
cy.get(`[data-test="drill-by-chart"] canvas`).then($canvas => {
// click 'other'
cy.wrap($canvas).scrollIntoView();
cy.wrap($canvas).trigger(
'mouseover',
drillClickCoordinates[1][0],
drillClickCoordinates[1][1],
);
cy.wrap($canvas).rightclick(
drillClickCoordinates[1][0],
drillClickCoordinates[1][1],
);
drillBy(furtherDrillDimension).then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: [furtherDrillDimension],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
{
clause: 'WHERE',
comparator: 'other',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'state',
},
],
});
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
// undo - back to drill by state
interceptV1ChartData('drillByUndo');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'state (other)')
.and('contain', furtherDrillDimension)
.contains('state (other)')
.click();
cy.wait('@drillByUndo').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: ['state'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('not.contain', 'state (other)')
.and('not.contain', furtherDrillDimension)
.and('contain', 'state');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
});
});
};
describe('Drill by modal', () => {
beforeEach(() => {
closeModal();
});
before(() => {
interceptDrillInfo();
cy.visit(SUPPORTED_CHARTS_DASHBOARD);
});
describe('Modal actions + Table', () => {
before(() => {
closeModal();
interceptDrillInfo();
openTopLevelTab('Tier 1');
SUPPORTED_TIER1_CHARTS.forEach(waitForChartLoad);
});
it.only('opens the modal from the context menu', () => {
openTableContextMenu('boy');
drillBy('state').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: ['state'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.getBySel('"Drill by: Table-modal"').as('drillByModal');
cy.get('@drillByModal')
.find('.draggable-trigger')
.should('contain', 'Drill by: Table');
cy.get('@drillByModal')
.find('[data-test="metadata-bar"]')
.should('be.visible');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'state');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('contain', 'state')
.and('contain', 'sum__num');
// further drilling
openTableContextMenu('CA', '[data-test="drill-by-chart"]');
drillBy('name').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: ['name'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
{
clause: 'WHERE',
comparator: 'CA',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'state',
},
],
});
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('not.contain', 'state')
.and('contain', 'name')
.and('contain', 'sum__num');
// undo - back to drill by state
interceptV1ChartData('drillByUndo');
interceptFormDataKey();
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'state (CA)')
.and('contain', 'name')
.contains('state (CA)')
.click();
cy.wait('@drillByUndo').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupby: ['state'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('not.contain', 'name')
.and('contain', 'state')
.and('contain', 'sum__num');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('not.contain', 'state (CA)')
.and('not.contain', 'name')
.and('contain', 'state');
cy.get('@drillByModal')
.find('[data-test="drill-by-display-toggle"]')
.contains('Table')
.click();
cy.getBySel('drill-by-chart').should('not.exist');
cy.get('@drillByModal')
.find('[data-test="drill-by-results-table"]')
.should('be.visible');
cy.wait('@formDataKey').then(intercept => {
cy.get('@drillByModal')
.contains('Edit chart')
.should('have.attr', 'href')
.and(
'contain',
`/explore/?form_data_key=${intercept.response?.body?.key}`,
);
});
});
});
describe('Tier 1 charts', () => {
before(() => {
closeModal();
interceptDrillInfo();
openTopLevelTab('Tier 1');
SUPPORTED_TIER1_CHARTS.forEach(waitForChartLoad);
});
it('Pivot Table', () => {
openTableContextMenu('boy', "[data-test-viz-type='pivot_table_v2']");
drillBy('name').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupbyRows: ['state'],
groupbyColumns: ['name'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.getBySel('"Drill by: Pivot Table-modal"').as('drillByModal');
cy.get('@drillByModal')
.find('.draggable-trigger')
.should('contain', 'Drill by: Pivot Table');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'name');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('contain', 'state')
.and('contain', 'name')
.and('contain', 'sum__num')
.and('not.contain', 'Gender');
openTableContextMenu('CA', '[data-test="drill-by-chart"]');
drillBy('ds').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupbyColumns: ['name'],
groupbyRows: ['ds'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
{
clause: 'WHERE',
comparator: 'CA',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'state',
},
],
});
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('contain', 'name')
.and('contain', 'ds')
.and('contain', 'sum__num')
.and('not.contain', 'state');
interceptV1ChartData('drillByUndo');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'name (CA)')
.and('contain', 'ds')
.contains('name (CA)')
.click();
cy.wait('@drillByUndo').then(intercepted => {
verifyExpectedFormData(intercepted, {
groupbyRows: ['state'],
groupbyColumns: ['name'],
adhoc_filters: [
{
clause: 'WHERE',
comparator: 'boy',
expressionType: 'SIMPLE',
operator: '==',
operatorId: 'EQUALS',
subject: 'gender',
},
],
});
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible')
.and('not.contain', 'ds')
.and('contain', 'state')
.and('contain', 'name')
.and('contain', 'sum__num');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('not.contain', 'name (CA)')
.and('not.contain', 'ds')
.and('contain', 'name');
});
it('Line chart', () => {
testEchart('echarts_timeseries_line', 'Line Chart', [
[85, 93],
[85, 93],
]);
});
it('Area Chart', () => {
testEchart('echarts_area', 'Area Chart', [
[85, 93],
[85, 93],
]);
});
it('Scatter Chart', () => {
testEchart('echarts_timeseries_scatter', 'Scatter Chart', [
[85, 93],
[85, 93],
]);
});
it.skip('Bar Chart', () => {
testEchart('echarts_timeseries_bar', 'Bar Chart', [
[85, 94],
[490, 68],
]);
});
it('Pie Chart', () => {
testEchart('pie', 'Pie Chart', [
[243, 167],
[534, 248],
]);
});
});
describe('Tier 2 charts', () => {
before(() => {
closeModal();
interceptDrillInfo();
openTopLevelTab('Tier 2');
SUPPORTED_TIER2_CHARTS.forEach(waitForChartLoad);
});
it('Box Plot Chart', () => {
testEchart(
'box_plot',
'Box Plot Chart',
[
[139, 277],
[787, 441],
],
'ds',
);
});
it('Generic Chart', () => {
testEchart('echarts_timeseries', 'Generic Chart', [
[85, 93],
[85, 93],
]);
});
it('Smooth Line Chart', () => {
testEchart('echarts_timeseries_smooth', 'Smooth Line Chart', [
[85, 93],
[85, 93],
]);
});
it('Step Line Chart', () => {
testEchart('echarts_timeseries_step', 'Step Line Chart', [
[85, 93],
[85, 93],
]);
});
it('Funnel Chart', () => {
testEchart('funnel', 'Funnel Chart', [
[154, 80],
[421, 39],
]);
});
it('Gauge Chart', () => {
testEchart('gauge_chart', 'Gauge Chart', [
[151, 95],
[300, 143],
]);
});
it.skip('Radar Chart', () => {
testEchart('radar', 'Radar Chart', [
[182, 49],
[423, 91],
]);
});
it('Treemap V2 Chart', () => {
testEchart('treemap_v2', 'Treemap V2 Chart', [
[145, 84],
[220, 105],
]);
});
it.skip('Mixed Chart', () => {
cy.get('[data-test-viz-type="mixed_timeseries"] canvas').then($canvas => {
// click 'boy'
cy.wrap($canvas).scrollIntoView();
cy.wrap($canvas).trigger('mouseover', 85, 93);
cy.wrap($canvas).rightclick(85, 93);
drillBy('name').then(intercepted => {
const { queries } = intercepted.request.body;
expect(queries[0].columns).to.eql(['name']);
expect(queries[0].filters).to.eql([
{ col: 'gender', op: '==', val: 'boy' },
]);
expect(queries[1].columns).to.eql(['state']);
expect(queries[1].filters).to.eql([]);
});
cy.getBySel('"Drill by: Mixed Chart-modal"').as('drillByModal');
cy.get('@drillByModal')
.find('.draggable-trigger')
.should('contain', 'Mixed Chart');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'name');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
// further drill
cy.get(`[data-test="drill-by-chart"] canvas`).then($canvas => {
// click second query
cy.wrap($canvas).scrollIntoView();
cy.wrap($canvas).trigger('mouseover', 261, 114);
cy.wrap($canvas).rightclick(261, 114);
drillBy('ds').then(intercepted => {
const { queries } = intercepted.request.body;
expect(queries[0].columns).to.eql(['name']);
expect(queries[0].filters).to.eql([
{ col: 'gender', op: '==', val: 'boy' },
]);
expect(queries[1].columns).to.eql(['ds']);
expect(queries[1].filters).to.eql([
{ col: 'state', op: '==', val: 'other' },
]);
});
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
// undo - back to drill by state
interceptV1ChartData('drillByUndo');
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('contain', 'name (other)')
.and('contain', 'ds')
.contains('name (other)')
.click();
cy.wait('@drillByUndo').then(intercepted => {
const { queries } = intercepted.request.body;
expect(queries[0].columns).to.eql(['name']);
expect(queries[0].filters).to.eql([
{ col: 'gender', op: '==', val: 'boy' },
]);
expect(queries[1].columns).to.eql(['state']);
expect(queries[1].filters).to.eql([]);
});
cy.get('@drillByModal')
.find('.ant-breadcrumb')
.should('be.visible')
.and('contain', 'gender (boy)')
.and('contain', '/')
.and('not.contain', 'name (other)')
.and('not.contain', 'ds')
.and('contain', 'name');
cy.get('@drillByModal')
.find('[data-test="drill-by-chart"]')
.should('be.visible');
});
});
});
});
});
@@ -179,13 +179,13 @@ describe.skip('Drill to detail modal', () => {
cy.on('uncaught:exception', () => false);
cy.wait('@samples');
cy.get('.virtual-table-cell').should($rows => {
expect($rows).to.contain('Kelly');
expect($rows).to.contain('Kimberly');
});
// verify scroll top on pagination
cy.getBySelLike('Number-modal').find('.virtual-grid').scrollTo(0, 200);
cy.get('.virtual-grid').contains('Juan').should('not.be.visible');
cy.get('.virtual-grid').contains('Kim').should('not.be.visible');
cy.get('.ant-pagination-item').eq(0).click();
@@ -49,8 +49,13 @@ function openProperties() {
function assertMetadata(text: string) {
const regex = new RegExp(text);
// Ensure the JSON metadata editor exists and is in view
cy.get('#json_metadata').should('exist');
cy.get('#json_metadata').scrollIntoView({ offset: { top: -100, left: 0 } });
cy.wait(200); // Small wait for scroll
cy.get('#json_metadata')
.should('be.visible')
.should('exist')
.then(() => {
const metadata = cy.$$('#json_metadata')[0];
@@ -61,11 +66,24 @@ function assertMetadata(text: string) {
}
function openAdvancedProperties() {
// Scroll to Advanced Settings section first since modal content is scrollable
cy.get('.ant-modal-body').contains('Advanced Settings').scrollIntoView();
cy.get('.ant-modal-body')
.contains('Advanced')
.contains('Advanced Settings')
.should('be.visible')
.click({ force: true });
cy.get('#json_metadata').should('be.visible');
// Wait for the section to expand and the JSON metadata editor to be in DOM
cy.get('#json_metadata').should('exist');
// Scroll the JSON metadata editor into view within the modal body
cy.get('#json_metadata').scrollIntoView({ offset: { top: -100, left: 0 } });
// Wait a bit for the scroll to complete and element to be positioned
cy.wait(500);
// Check that it exists rather than visible due to CSS overflow issues
cy.get('#json_metadata').should('exist');
}
function dragComponent(
@@ -74,7 +92,9 @@ function dragComponent(
withFiltering = true,
) {
if (withFiltering) {
cy.getBySel('dashboard-charts-filter-search-input').type(component);
cy.getBySel('dashboard-charts-filter-search-input').type(component, {
force: true,
});
cy.wait('@filtering');
}
cy.wait(500);
@@ -145,6 +165,28 @@ function selectColorScheme(
color: string,
target = 'dashboard-edit-properties-form',
) {
// First, expand the Styling section if it's collapsed
cy.get(`[data-test="${target}"]`).within(() => {
// Find the Collapse header that contains "Styling" text
cy.contains('Styling').scrollIntoView();
cy.contains('Styling')
.closest('.ant-collapse-header')
.then($header => {
// Click to expand regardless of current state
cy.wrap($header).click({ force: true });
});
// Wait for animation and verify section is expanded
cy.contains('Styling')
.closest('.ant-collapse-header')
.should('have.attr', 'aria-expanded', 'true');
cy.wait(500); // Extra wait for content to render
// Ensure the color scheme input is visible before proceeding
cy.get('input[aria-label="Select color scheme"]').should('be.visible');
});
// Now select the color scheme
cy.get(`[data-test="${target}"] input[aria-label="Select color scheme"]`)
.should('exist')
.then($input => {
@@ -167,7 +209,9 @@ function saveAndGo(dashboard = 'Tabbed Dashboard') {
}
function applyChanges() {
cy.getBySel('properties-modal-apply-button').click({ force: true });
cy.getBySel('modal-confirm-button').click({ force: true });
// Wait for modal to close completely
cy.get('.ant-modal-wrap').should('not.exist');
}
function saveChanges() {
@@ -177,13 +221,17 @@ function saveChanges() {
}
function clearMetadata() {
// Ensure the JSON metadata editor exists and scroll it into view
cy.get('#json_metadata').should('exist');
cy.get('#json_metadata').scrollIntoView({ offset: { top: -100, left: 0 } });
cy.wait(200); // Small wait for scroll
cy.get('#json_metadata').then($jsonmetadata => {
cy.wrap($jsonmetadata).find('.ace_content').click({ force: true });
cy.wrap($jsonmetadata)
.find('.ace_text-input')
.then($ace => {
cy.wrap($ace).focus();
cy.wrap($ace).should('have.focus');
cy.wrap($ace).type('{selectall}', { force: true });
cy.wrap($ace).type('{backspace}', { force: true });
});
@@ -191,13 +239,17 @@ function clearMetadata() {
}
function writeMetadata(metadata: string) {
// Ensure the JSON metadata editor exists and scroll it into view
cy.get('#json_metadata').should('exist');
cy.get('#json_metadata').scrollIntoView({ offset: { top: -100, left: 0 } });
cy.wait(200); // Small wait for scroll
cy.get('#json_metadata').then($jsonmetadata => {
cy.wrap($jsonmetadata).find('.ace_content').click({ force: true });
cy.wrap($jsonmetadata)
.find('.ace_text-input')
.then($ace => {
cy.wrap($ace).focus();
cy.wrap($ace).should('have.focus');
cy.wrap($ace).type(metadata, {
parseSpecialCharSequences: false,
force: true,
@@ -273,6 +325,9 @@ describe('Dashboard edit', () => {
openTab(0, 1, 'control-tabs');
// Expand Styling section first
cy.contains('Styling').scrollIntoView();
cy.contains('Styling').closest('.ant-collapse-header').click();
cy.get('[aria-label="Select color scheme"]').should('be.disabled');
});
@@ -303,6 +358,9 @@ describe('Dashboard edit', () => {
openTab(0, 1, 'control-tabs');
// Expand Styling section first
cy.contains('Styling').scrollIntoView();
cy.contains('Styling').closest('.ant-collapse-header').click();
cy.get('[aria-label="Select color scheme"]').should('be.disabled');
});
@@ -823,6 +881,9 @@ describe('Dashboard edit', () => {
.should('have.css', 'fill', 'rgb(90, 193, 137)');
openProperties();
// Expand Styling section first
cy.contains('Styling').scrollIntoView();
cy.contains('Styling').closest('.ant-collapse-header').click();
cy.get('[aria-label="Select color scheme"]').should('have.value', '');
openAdvancedProperties();
clearMetadata();
@@ -1046,116 +1107,42 @@ describe('Dashboard edit', () => {
});
});
describe('Edit properties', () => {
before(() => {
visitEdit();
});
// NOTE: Edit properties modal functionality is now covered by comprehensive Jest tests
// in src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx
// This removes flaky Cypress modal interaction tests in favor of reliable unit tests
beforeEach(() => {
cy.createSampleDashboards([0]);
openProperties();
selectColorScheme('supersetColors');
});
it('should accept a valid color scheme', () => {
openAdvancedProperties();
clearMetadata();
writeMetadata('{"color_scheme":"lyftColors"}');
applyChanges();
openProperties();
openAdvancedProperties();
assertMetadata('lyftColors');
applyChanges();
});
it('should overwrite the color scheme when advanced is closed', () => {
selectColorScheme('blueToGreen');
openAdvancedProperties();
assertMetadata('blueToGreen');
applyChanges();
});
it('should overwrite the color scheme when advanced is open', () => {
openAdvancedProperties();
selectColorScheme('modernSunset');
assertMetadata('modernSunset');
applyChanges();
});
it.skip('should not accept an invalid color scheme', () => {
openAdvancedProperties();
clearMetadata();
// allow console error
cy.allowConsoleErrors(['Error: A valid color scheme is required']);
writeMetadata('{"color_scheme":"wrongcolorscheme"}');
applyChanges();
cy.get('.ant-modal-body')
.contains('A valid color scheme is required')
.should('be.visible');
});
it('should edit the title', () => {
cy.getBySel('dashboard-title-input').clear();
cy.getBySel('dashboard-title-input').type('Edited title');
applyChanges();
cy.getBySel('editable-title-input').should('have.value', 'Edited title');
});
});
describe('Edit mode', () => {
before(() => {
visitEdit();
});
beforeEach(() => {
cy.createSampleDashboards([0]);
discardChanges();
});
it('should enable edit mode', () => {
cy.getBySel('dashboard-builder-sidepane').should('be.visible');
});
it('should edit the title inline', () => {
cy.getBySel('editable-title-input').clear();
cy.getBySel('editable-title-input').type('Edited title{enter}');
cy.getBySel('header-save-button').should('be.enabled');
});
it('should filter charts', () => {
interceptCharts();
cy.get('input[type="checkbox"]').click();
cy.getBySel('dashboard-charts-filter-search-input').type('Unicode');
cy.wait('@filtering');
cy.getBySel('chart-card')
.should('have.length', 1)
.contains('Unicode Cloud');
cy.getBySel('dashboard-charts-filter-search-input').clear();
});
// TODO fix this test! This was the #1 flaky test as of 4/21/23 according to cypress dashboard.
it.skip('should disable the Save button when undoing', () => {
cy.get('input[type="checkbox"]').click();
dragComponent('Unicode Cloud', 'card-title', false);
cy.getBySel('header-save-button').should('be.enabled');
discardChanges();
cy.getBySel('header-save-button').should('be.disabled');
});
});
// NOTE: Edit mode functionality is now covered by Jest integration tests
// These tests were consistently failing due to modal overlay issues in Cypress
// The core functionality is better tested with reliable unit/integration tests
// NOTE: Chart drag/drop functionality requires true E2E testing
// Keeping minimal Cypress tests for drag/drop workflows only
describe('Components', () => {
beforeEach(() => {
visitEdit();
});
it('should add charts', () => {
cy.get('input[type="checkbox"]').click();
// Force close any modal that might be open
cy.get('body').then($body => {
if ($body.find('.ant-modal-wrap').length > 0) {
cy.get('body').type('{esc}', { force: true });
cy.wait(1000);
// If ESC doesn't work, try clicking the close button
cy.get('.ant-modal-close').click({ force: true });
cy.wait(500);
}
});
cy.get('input[type="checkbox"]').scrollIntoView();
cy.get('input[type="checkbox"]').click({ force: true });
dragComponent();
cy.getBySel('dashboard-component-chart-holder').should('have.length', 1);
});
it.skip('should remove added charts', () => {
cy.get('input[type="checkbox"]').click();
cy.get('input[type="checkbox"]').scrollIntoView();
cy.get('input[type="checkbox"]').click({ force: true });
dragComponent('Unicode Cloud');
cy.getBySel('dashboard-component-chart-holder').should('have.length', 1);
cy.getBySel('dashboard-delete-component-button').click();
@@ -1192,18 +1179,6 @@ describe('Dashboard edit', () => {
});
});
describe('Save', () => {
beforeEach(() => {
visitEdit();
});
it('should save', () => {
cy.get('input[type="checkbox"]').click();
dragComponent();
cy.getBySel('header-save-button').should('be.enabled');
saveChanges();
cy.getBySel('dashboard-component-chart-holder').should('have.length', 1);
cy.getBySel('edit-dashboard-button').should('be.visible');
});
});
// NOTE: Save functionality is now covered by Jest integration tests
// This eliminates flaky modal overlay issues while ensuring save workflow is tested
});
@@ -91,6 +91,7 @@ describe('Horizontal FilterBar', () => {
cy.get(nativeFilters.filtersPanel.filterGear).click({
force: true,
});
cy.get('.ant-dropdown-menu').should('be.visible');
cy.getBySel('filter-bar__create-filter').should('exist');
cy.getBySel('filterbar-action-buttons').should('exist');
});
@@ -21,7 +21,8 @@ import { waitForChartLoad } from 'cypress/utils';
import { WORLD_HEALTH_CHARTS, interceptLog } from './utils';
describe('Dashboard load', () => {
it('should load dashboard', () => {
// TODO flaky in CI. Skipping to match upstream behavior.
it.skip('should load dashboard', () => {
cy.visit(WORLD_HEALTH_DASHBOARD);
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
});
@@ -30,6 +30,7 @@ import {
applyNativeFilterValueWithIndex,
cancelNativeFilterSettings,
deleteNativeFilter,
clickOnAddFilterInModal,
enterNativeFilterEditModal,
fillNativeFilterForm,
inputNativeFilterDefaultValue,
@@ -235,6 +236,7 @@ describe('Native filters', () => {
it('User can create a numerical range filter with "Range Inputs" display mode', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
fillNativeFilterForm(
testItems.filterType.numerical,
@@ -254,6 +256,7 @@ describe('Native filters', () => {
it('User can change the display mode to "Slider"', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
fillNativeFilterForm(
testItems.filterType.numerical,
@@ -291,6 +294,7 @@ describe('Native filters', () => {
it('User can change the display mode to "Slider and range input"', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
// Re-create filter
fillNativeFilterForm(
@@ -160,6 +160,57 @@ describe('Native filters', () => {
);
});
it('user cannot create bi-directional dependencies between filters', () => {
prepareDashboardFilters([
{ name: 'region', column: 'region', datasetId: 2 },
{ name: 'country_name', column: 'country_name', datasetId: 2 },
{ name: 'country_code', column: 'country_code', datasetId: 2 },
{ name: 'year', column: 'year', datasetId: 2 },
]);
enterNativeFilterEditModal();
// First, make country_name dependent on region
selectFilter(1);
cy.get(nativeFilters.filterConfigurationSections.displayedSection).within(
() => {
cy.contains('Values are dependent on other filters')
.should('be.visible')
.click();
},
);
addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion);
// Second, make country_code dependent on country_name
selectFilter(2);
cy.get(nativeFilters.filterConfigurationSections.displayedSection).within(
() => {
cy.contains('Values are dependent on other filters')
.should('be.visible')
.click();
},
);
addParentFilterWithValue(0, testItems.topTenChart.filterColumn);
// Now select region filter and try to add dependency
selectFilter(0);
cy.get(nativeFilters.filterConfigurationSections.displayedSection).within(
() => {
cy.contains('Values are dependent on other filters')
.should('be.visible')
.click();
// Verify that only 'year' is available as dependency for region
// 'country_name' and 'country_code' should not be available (would create circular dependency)
cy.get('input[aria-label^="Limit type"]').click({ force: true });
cy.get('[role="listbox"]').should('be.visible');
cy.get('[role="listbox"]').should('contain', 'year');
cy.get('[role="listbox"]').should('not.contain', 'country_name');
cy.get('[role="listbox"]').should('not.contain', 'country_code');
cy.get('[role="listbox"]').contains('year').click();
},
);
});
it('Dependent filter selects first item based on parent filter selection', () => {
prepareDashboardFilters([
{ name: 'region', column: 'region', datasetId: 2 },
@@ -327,6 +378,7 @@ describe('Native filters', () => {
cy.get(nativeFilters.filtersPanel.filterGear).click({
force: true,
});
cy.get('.ant-dropdown-menu').should('be.visible');
cy.get(nativeFilters.filterFromDashboardView.createFilterButton).should(
'be.visible',
);
@@ -342,18 +394,23 @@ describe('Native filters', () => {
it('User can delete a native filter', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
cy.get(nativeFilters.filtersList.removeIcon).first().click();
cy.contains('Restore filter').should('not.exist', { timeout: 10000 });
});
it('User can cancel creating a new filter', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
cancelNativeFilterSettings();
});
it('Verify setting options and tooltips for value filter', () => {
enterNativeFilterEditModal(false);
clickOnAddFilterInModal();
cy.contains('Filter value is required').scrollIntoView();
cy.get('body').trigger('mousemove', { clientX: 0, clientY: 0 });
cy.wait(300);
cy.contains('Filter value is required').should('be.visible').click({
force: true,
@@ -87,6 +87,7 @@ export function prepareDashboardFilters(
if (dashboardId) {
const jsonMetadata = {
native_filter_configuration: allFilters,
chart_customization_config: [],
timed_refresh_immune_slices: [],
expanded_slices: {},
refresh_frequency: 0,
@@ -237,6 +237,7 @@ export function enterNativeFilterEditModal(waitForDataset = true) {
cy.get(nativeFilters.filtersPanel.filterGear).click({
force: true,
});
cy.get('.ant-dropdown-menu').should('be.visible');
cy.get(nativeFilters.filterFromDashboardView.createFilterButton).click({
force: true,
});
@@ -252,7 +253,9 @@ export function enterNativeFilterEditModal(waitForDataset = true) {
* @summary helper for adding new filter
************************************************************************* */
export function clickOnAddFilterInModal() {
return cy.get(nativeFilters.modal.addNewFilterButton).click({ force: true });
cy.get('[data-test="new-item-dropdown-button"]').trigger('mouseover');
cy.get('.ant-dropdown-menu').should('be.visible');
cy.contains('.ant-dropdown-menu-item', 'Add filter').click();
}
/** ************************************************************************
@@ -459,10 +462,13 @@ export function checkNativeFilterTooltip(index: number, value: string) {
cy.get(nativeFilters.filterConfigurationSections.infoTooltip)
.eq(index)
.trigger('mouseover');
cy.contains(`${value}`);
cy.contains(`${value}`).should('be.visible');
cy.wait(100);
cy.get(nativeFilters.filterConfigurationSections.infoTooltip)
.eq(index)
.trigger('mouseout');
cy.get('body').trigger('mousemove', { clientX: 0, clientY: 0 });
cy.wait(500);
}
/** ************************************************************************
@@ -89,8 +89,10 @@ describe('Dashboards list', () => {
it('should bulk select in list mode', () => {
toggleBulkSelect();
cy.get('[aria-label="Select all"]').click();
cy.get('.ant-checkbox-input')
cy.get('th.ant-table-cell input[aria-label="Select all"]').click();
cy.get(
'.ant-checkbox-input:not(th.ant-table-measure-cell .ant-checkbox-input)',
)
.should('be.checked')
.should('have.length', 6);
cy.getBySel('bulk-select-copy').contains('5 Selected');
@@ -29,6 +29,13 @@ describe('Advanced analytics', () => {
cy.visitChartByName('Num Births Trend');
cy.verifySliceSuccess({ waitAlias: '@v1Data' });
// Relative time comparison offsets need a time grain to join the offset
// results back onto the base query. The saved chart has none, so pick one.
cy.get('[data-test=time_grain_sqla]').find('.ant-select').click();
cy.get('.ant-select-item-option[title="Day"]')
.first()
.click({ force: true });
cy.get('.ant-collapse-header')
.contains('Advanced analytics')
.click({ force: true });
@@ -1,186 +0,0 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// ***********************************************
// Tests for setting controls in the UI
// ***********************************************
import { interceptChart, setSelectSearchInput } from 'cypress/utils';
describe('Datasource control', () => {
const newMetricName = `abc${Date.now()}`;
it('should allow edit dataset', () => {
interceptChart({ legacy: false }).as('chartData');
cy.visitChartByName('Num Births Trend');
cy.verifySliceSuccess({ waitAlias: '@chartData' });
cy.get('[data-test="datasource-menu-trigger"]').click();
cy.get('[data-test="edit-dataset"]').click();
cy.get('[data-test="edit-dataset-tabs"]').within(() => {
cy.contains('Metrics').click();
});
// create new metric
cy.get('[data-test="crud-add-table-item"]', { timeout: 10000 }).click();
cy.wait(1000);
cy.get('.ant-table-body [data-test="textarea-editable-title-input"]')
.first()
.click();
cy.get('.ant-table-body [data-test="textarea-editable-title-input"]')
.first()
.focus();
cy.focused().clear({ force: true });
cy.focused().type(`${newMetricName}{enter}`, { force: true });
cy.get('[data-test="datasource-modal-save"]').click();
cy.get('.ant-modal-confirm-btns button').contains('OK').click();
// select new metric
cy.get('[data-test=metrics]')
.contains('Drop columns/metrics here or click')
.click();
cy.get('input[aria-label="Select saved metrics"]')
.should('exist')
.then($input => {
setSelectSearchInput($input, newMetricName);
});
// delete metric
cy.get('[data-test="datasource-menu-trigger"]').click();
cy.get('[data-test="edit-dataset"]').click();
cy.get('.ant-modal-content').within(() => {
cy.get('[data-test="collection-tab-Metrics"]')
.contains('Metrics')
.click();
});
cy.get(`[data-test="textarea-editable-title-input"]`)
.contains(newMetricName)
.closest('tr')
.find('[data-test="crud-delete-icon"]')
.click();
cy.get('[data-test="datasource-modal-save"]').click();
cy.get('.ant-modal-confirm-btns button').contains('OK').click();
cy.get('[data-test="metrics"]').contains(newMetricName).should('not.exist');
});
});
describe('Color scheme control', () => {
beforeEach(() => {
interceptChart({ legacy: false }).as('chartData');
cy.visitChartByName('Num Births Trend');
cy.verifySliceSuccess({ waitAlias: '@chartData' });
});
it('should show color options with and without tooltips', () => {
cy.get('#controlSections-tab-CUSTOMIZE').click();
cy.get('.ant-select-selection-item .color-scheme-label').contains(
'Superset Colors',
);
cy.get('.ant-select-selection-item .color-scheme-label').trigger(
'mouseover',
);
cy.get('.color-scheme-tooltip').should('be.visible');
cy.get('.color-scheme-tooltip').contains('Superset Colors');
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
cy.get('.color-scheme-label')
.contains('Superset Colors')
.trigger('mouseover');
cy.get('.color-scheme-label')
.contains('Superset Colors')
.trigger('mouseout');
cy.focused().type('lyftColors');
cy.getBySel('lyftColors').should('exist');
cy.getBySel('lyftColors').trigger('mouseover', { force: true });
cy.get('.color-scheme-tooltip').should('not.be.visible');
});
});
describe('VizType control', () => {
beforeEach(() => {
interceptChart({ legacy: false }).as('tableChartData');
interceptChart({ legacy: false }).as('bigNumberChartData');
});
it('Can change vizType', () => {
cy.visitChartByName('Daily Totals');
cy.verifySliceSuccess({ waitAlias: '@tableChartData' });
cy.contains('View all charts').click();
cy.get('.ant-modal-content').within(() => {
cy.get('button').contains('KPI').click(); // change categories
cy.get('[role="button"]').contains('Big Number').click();
cy.get('button').contains('Select').click();
});
cy.get('button[data-test="run-query-button"]').click();
cy.verifySliceSuccess({
waitAlias: '@bigNumberChartData',
});
});
});
describe('Test datatable', () => {
beforeEach(() => {
interceptChart({ legacy: false }).as('tableChartData');
interceptChart({ legacy: false }).as('lineChartData');
cy.visitChartByName('Daily Totals');
});
it('Data Pane opens and loads results', () => {
cy.contains('Results').click();
cy.get('[data-test="row-count-label"]').contains('26 rows');
cy.get('.ant-empty-description').should('not.exist');
});
it('Datapane loads view samples', () => {
cy.intercept(
'**/datasource/samples?force=false&datasource_type=table&datasource_id=*',
).as('Samples');
cy.contains('Samples').click();
cy.wait('@Samples');
cy.get('.ant-tabs-tab-active').contains('Samples');
cy.get('[data-test="row-count-label"]').contains('1k rows');
cy.get('.ant-empty-description').should('not.exist');
});
});
describe('Groupby control', () => {
it('Set groupby', () => {
interceptChart({ legacy: false }).as('chartData');
cy.visitChartByName('Num Births Trend');
cy.verifySliceSuccess({ waitAlias: '@chartData' });
cy.get('[data-test=groupby]')
.contains('Drop columns here or click')
.click();
cy.get('[id="adhoc-metric-edit-tabs-tab-simple"]').click();
cy.get('input[aria-label="Column"]').click();
cy.get('input[aria-label="Column"]').type('state{enter}');
cy.get('[data-test="ColumnEdit#save"]').contains('Save').click();
cy.get('button[data-test="run-query-button"]').click();
cy.verifySliceSuccess({ waitAlias: '@chartData' });
});
});
@@ -119,9 +119,12 @@ describe('Test explore links', () => {
cy.get('[data-test="new-chart-name"]').click();
cy.get('[data-test="new-chart-name"]').clear();
cy.get('[data-test="new-chart-name"]').type(newChartName);
// Add a new option using the "CreatableSelect" feature
// Add a new option using the "CreatableSelect" feature.
// Use a prefix match: when the chart is already on a dashboard, the modal
// pre-populates the select and the aria-label becomes
// "Select a dashboard: <title>" (see overwrite block below).
cy.get('[data-test="save-chart-modal-select-dashboard-form"]')
.find('input[aria-label="Select a dashboard"]')
.find('input[aria-label^="Select a dashboard"]')
.type(`${dashboardTitle}`, { force: true });
cy.get(`.ant-select-item[title="${dashboardTitle}"]`).click({
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
describe('Visualization > World Map', () => {
describe.skip('Visualization > World Map', () => {
beforeEach(() => {
cy.intercept('POST', '**/superset/explore_json/**').as('getJson');
});
@@ -255,18 +255,17 @@ Cypress.Commands.add(
Cypress.Commands.add('verifySliceContainer', chartSelector => {
// After a wait response check for valid slice container
cy.get('.slice_container')
.should('be.visible')
.within(() => {
if (chartSelector) {
cy.get(chartSelector)
.should('be.visible')
.then(chart => {
expect(chart[0].clientWidth).greaterThan(0);
expect(chart[0].clientHeight).greaterThan(0);
});
}
});
cy.get('.slice_container', { timeout: 30000 }).should('be.visible');
if (chartSelector) {
// Keep all assertions inside a retryable `should` to avoid stale detached refs.
cy.get('.slice_container', { timeout: 30000 })
.find(chartSelector, { timeout: 30000 })
.should(chart => {
expect(chart.length).greaterThan(0);
expect(chart[0].clientWidth).greaterThan(0);
expect(chart[0].clientHeight).greaterThan(0);
});
}
return cy;
});
+1 -1
View File
@@ -56,7 +56,7 @@ module.exports = {
],
coverageReporters: ['lcov', 'json-summary', 'html', 'text'],
transformIgnorePatterns: [
'node_modules/(?!d3-(interpolate|color|time|scale)|@mapbox/tiny-sdf|remark-gfm|(?!@ngrx|(?!deck.gl)|d3-scale)|markdown-table|micromark-*.|decode-named-character-reference|character-entities|mdast-util-*.|unist-util-*.|ccount|escape-string-regexp|nanoid|@rjsf/*.|sinon|echarts|zrender|fetch-mock|pretty-ms|parse-ms|ol|@babel/runtime|@emotion|cheerio|cheerio/lib|parse5|dom-serializer|entities|htmlparser2|rehype-sanitize|hast-util-sanitize|unified|unist-.*|hast-.*|rehype-.*|remark-.*|mdast-.*|micromark-.*|parse-entities|property-information|space-separated-tokens|comma-separated-tokens|bail|devlop|zwitch|longest-streak|geostyler|geostyler-.*|react-error-boundary|react-json-tree|react-base16-styling|lodash-es)',
'node_modules/(?!d3-(array|interpolate|color|time|scale|time-format)|internmap|@mapbox/tiny-sdf|remark-gfm|(?!@ngrx|(?!deck.gl)|d3-scale)|markdown-table|micromark-*.|decode-named-character-reference|character-entities|mdast-util-*.|unist-util-*.|ccount|escape-string-regexp|nanoid|uuid|@rjsf/*.|sinon|echarts|zrender|fetch-mock|pretty-ms|parse-ms|ol|@babel/runtime|@emotion|cheerio|cheerio/lib|parse5|dom-serializer|entities|htmlparser2|rehype-sanitize|hast-util-sanitize|unified|unist-.*|hast-.*|rehype-.*|remark-.*|mdast-.*|micromark-.*|parse-entities|property-information|space-separated-tokens|comma-separated-tokens|bail|devlop|zwitch|longest-streak|geostyler|geostyler-.*|react-error-boundary|react-json-tree|react-base16-styling|lodash-es)',
],
preset: 'ts-jest',
transform: {
+2273 -2290
View File
File diff suppressed because it is too large Load Diff
+41 -12
View File
@@ -1,6 +1,6 @@
{
"name": "superset",
"version": "0.0.0-dev",
"version": "6.0.0",
"description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.",
"keywords": [
"big",
@@ -63,6 +63,11 @@
"plugins:release-conventional": "npm run prune && npm run plugins:build && lerna publish --conventional-commits --create-release github --yes",
"plugins:release-from-tag": "npm run prune && npm run plugins:build && lerna publish from-package --yes",
"plugins:storybook": "cd packages/superset-ui-demo && npm run storybook",
"playwright:test": "playwright test",
"playwright:ui": "playwright test --ui",
"playwright:headed": "playwright test --headed",
"playwright:debug": "playwright test --debug",
"playwright:report": "playwright show-report",
"prettier": "npm run _prettier -- --write",
"prettier-check": "npm run _prettier -- --check",
"prod": "npm run build",
@@ -71,7 +76,7 @@
"tdd": "cross-env NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" jest --watch",
"test": "cross-env NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" jest --max-workers=80% --silent",
"test-loud": "cross-env NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=8192\" jest --max-workers=80%",
"type": "tsc --noEmit",
"type": "cross-env NODE_OPTIONS=\"--max-old-space-size=4096\" tsc --noEmit",
"update-maps": "cd plugins/legacy-plugin-chart-country-map/scripts && jupyter nbconvert --to notebook --execute --inplace --allow-errors --ExecutePreprocessor.timeout=1200 'Country Map GeoJSON Generator.ipynb'",
"validate-release": "../RELEASING/validate_this_release.sh"
},
@@ -82,6 +87,9 @@
"last 3 edge versions"
],
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@emotion/cache": "^11.4.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
@@ -121,16 +129,18 @@
"@visx/scale": "^3.5.0",
"@visx/tooltip": "^3.0.0",
"@visx/xychart": "^3.5.1",
"antd": "^5.24.6",
"ag-grid-community": "34.2.0",
"ag-grid-react": "34.2.0",
"antd": "^5.26.0",
"chrono-node": "^2.7.8",
"classnames": "^2.2.5",
"content-disposition": "^0.5.4",
"d3-color": "^3.1.0",
"d3-scale": "^2.1.2",
"dayjs": "^1.11.13",
"dom-to-image-more": "^3.6.0",
"dom-to-pdf": "^0.3.2",
"echarts": "^5.6.0",
"emotion-rgba": "0.0.12",
"eslint-plugin-i18n-strings": "file:eslint-rules/eslint-plugin-i18n-strings",
"fast-glob": "^3.3.2",
"fs-extra": "^11.2.0",
@@ -150,10 +160,10 @@
"js-yaml-loader": "^1.2.2",
"json-bigint": "^1.0.0",
"json-stringify-pretty-compact": "^2.0.0",
"lodash": "^4.17.21",
"lodash": "^4.18.1",
"luxon": "^3.5.0",
"mapbox-gl": "^3.13.0",
"markdown-to-jsx": "^7.7.4",
"markdown-to-jsx": "^9.7.15",
"match-sorter": "^6.3.4",
"memoize-one": "^5.2.1",
"mousetrap": "^1.6.5",
@@ -190,6 +200,7 @@
"redux-localstorage": "^0.4.1",
"redux-thunk": "^2.1.0",
"redux-undo": "^1.0.0-beta9-9-7",
"remark-gfm": "^3.0.1",
"rison": "^0.1.1",
"scroll-into-view-if-needed": "^3.1.0",
"simple-zstd": "^1.4.2",
@@ -199,6 +210,7 @@
"use-event-callback": "^0.1.0",
"use-immer": "^0.9.0",
"use-query-params": "^1.1.9",
"uuid": "^13.0.0",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
"yargs": "^17.7.2"
},
@@ -225,6 +237,7 @@
"@hot-loader/react-dom": "^17.0.2",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
"@mihkeleidast/storybook-addon-source": "^1.0.1",
"@playwright/test": "^1.49.1",
"@storybook/addon-actions": "8.1.11",
"@storybook/addon-controls": "8.1.11",
"@storybook/addon-essentials": "8.1.11",
@@ -240,6 +253,7 @@
"@testing-library/react": "^12.1.5",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/user-event": "^12.8.3",
"@types/content-disposition": "^0.5.9",
"@types/dom-to-image": "^2.6.7",
"@types/jest": "^29.5.14",
"@types/js-levenshtein": "^1.1.3",
@@ -255,7 +269,6 @@
"@types/react-resizable": "^3.0.8",
"@types/react-router-dom": "^5.3.3",
"@types/react-transition-group": "^4.4.12",
"@types/react-ultimate-pagination": "^1.2.4",
"@types/react-virtualized-auto-sizer": "^1.0.4",
"@types/react-window": "^1.8.8",
"@types/redux-localstorage": "^1.0.8",
@@ -273,10 +286,10 @@
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-typescript-to-proptypes": "^2.0.0",
"cheerio": "1.1.0",
"copy-webpack-plugin": "^13.0.0",
"copy-webpack-plugin": "^14.0.0",
"cross-env": "^7.0.3",
"css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^7.0.2",
"css-minimizer-webpack-plugin": "^8.0.0",
"eslint": "^8.56.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^7.2.0",
@@ -295,6 +308,7 @@
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-prefer-function-component": "^3.3.0",
"eslint-plugin-react-you-might-not-need-an-effect": "^0.5.1",
"eslint-plugin-storybook": "^0.8.0",
"eslint-plugin-testing-library": "^6.4.0",
"eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
@@ -333,7 +347,7 @@
"webpack": "^5.99.9",
"webpack-bundle-analyzer": "^4.10.1",
"webpack-cli": "^6.0.1",
"webpack-dev-server": "^5.2.1",
"webpack-dev-server": "^5.2.2",
"webpack-manifest-plugin": "^5.0.1",
"webpack-sources": "^3.3.3",
"webpack-visualizer-plugin2": "^1.2.0"
@@ -341,6 +355,7 @@
"peerDependencies": {
"ace-builds": "^1.41.0",
"core-js": "^3.38.1",
"handlebars": "^4.7.8",
"react-ace": "^10.1.0",
"regenerator-runtime": "^0.14.1"
},
@@ -352,9 +367,23 @@
"core-js": "^3.38.1",
"d3-color": "^3.1.0",
"puppeteer": "^22.4.1",
"remark-gfm": "^3.0.1",
"underscore": "^1.13.7",
"jspdf": "^3.0.1",
"nwsapi": "^2.2.13"
"jspdf": "^4.0.0",
"nwsapi": "^2.2.13",
"@deck.gl/aggregation-layers": "~9.2.2",
"@deck.gl/core": "~9.2.2",
"@deck.gl/extensions": "~9.2.2",
"@deck.gl/geo-layers": "~9.2.2",
"@deck.gl/layers": "~9.2.2",
"@deck.gl/mesh-layers": "~9.2.2",
"@deck.gl/react": "~9.2.2",
"@deck.gl/widgets": "~9.2.2",
"@luma.gl/constants": "~9.2.2",
"@luma.gl/core": "~9.2.2",
"@luma.gl/engine": "~9.2.2",
"@luma.gl/shadertools": "~9.2.2",
"@luma.gl/webgl": "~9.2.2"
},
"readme": "ERROR: No README data found!",
"scarfSettings": {
@@ -29,7 +29,7 @@
},
"dependencies": {
"chalk": "^5.4.1",
"lodash-es": "^4.17.21",
"lodash-es": "^4.18.1",
"yeoman-generator": "^7.5.1",
"yosay": "^3.0.0"
},
@@ -26,8 +26,7 @@
"dependencies": {
"@react-icons/all-files": "^4.1.0",
"@types/react": "*",
"lodash": "^4.17.21",
"prop-types": "^15.8.1"
"lodash": "^4.18.1"
},
"peerDependencies": {
"@ant-design/icons": "^5.2.6",
@@ -59,7 +59,7 @@ export function ColumnOption({
const type = hasExpression ? 'expression' : type_generic;
const [tooltipText, setTooltipText] = useState<ReactNode>(column.column_name);
const [columnTypeTooltipText, setcolumnTypeTooltipText] = useState<ReactNode>(
column.type,
getColumnTypeTooltipNode(column),
);
useLayoutEffect(() => {
@@ -27,8 +27,9 @@ import {
FieldStringOutlined,
NumberOutlined,
} from '@ant-design/icons';
import { Icons } from '@superset-ui/core/components';
export type ColumnLabelExtendedType = 'expression' | '';
export type ColumnLabelExtendedType = 'expression' | 'metric' | '';
export type ColumnTypeLabelProps = {
type?: ColumnLabelExtendedType | GenericDataType;
@@ -57,7 +58,9 @@ export function ColumnTypeLabel({ type }: ColumnTypeLabelProps) {
<QuestionOutlined aria-label={t('unknown type icon')} />
);
if (type === '' || type === 'expression') {
if (type === 'metric') {
typeIcon = <Icons.Sigma aria-label={t('metric type icon')} />;
} else if (type === '' || type === 'expression') {
typeIcon = <FunctionOutlined aria-label={t('function type icon')} />;
} else if (type === GenericDataType.String) {
typeIcon = <FieldStringOutlined aria-label={t('string type icon')} />;
@@ -21,7 +21,11 @@ import { styled, css } from '@superset-ui/core';
export const ControlSubSectionHeader = styled.div`
${({ theme }) => css`
font-weight: ${theme.fontWeightStrong};
margin-top: ${theme.sizeUnit * 3}px;
margin-bottom: ${theme.sizeUnit}px;
font-size: ${theme.fontSizeSM}px;
text-transform: uppercase;
letter-spacing: 0.05em;
color: ${theme.colorTextSecondary};
`}
`;
@@ -94,7 +94,7 @@ export function MetricOption({
return (
<FlexRowContainer className="metric-option">
{showType && <ColumnTypeLabel type="expression" />}
{showType && <ColumnTypeLabel type="metric" />}
{shouldShowTooltip ? (
<Tooltip id="metric-name-tooltip" title={tooltipText}>
{label}
@@ -16,9 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
import { useEffect, useState } from 'react';
import { Popover, type PopoverProps } from '@superset-ui/core/components';
import type ReactAce from 'react-ace';
import {
Popover,
type PopoverProps,
SQLEditor,
} from '@superset-ui/core/components';
import { CalculatorOutlined } from '@ant-design/icons';
import { css, styled, useTheme, t } from '@superset-ui/core';
@@ -35,24 +37,10 @@ const StyledCalculatorIcon = styled(CalculatorOutlined)`
export const SQLPopover = (props: PopoverProps & { sqlExpression: string }) => {
const theme = useTheme();
const [AceEditor, setAceEditor] = useState<typeof ReactAce | null>(null);
useEffect(() => {
Promise.all([
import('react-ace'),
import('ace-builds/src-min-noconflict/mode-sql'),
]).then(([reactAceModule]) => {
setAceEditor(() => reactAceModule.default);
});
}, []);
if (!AceEditor) {
return null;
}
return (
<Popover
content={
<AceEditor
mode="sql"
<SQLEditor
value={props.sqlExpression}
editorProps={{ $blockScrolling: true }}
setOptions={{
@@ -65,7 +53,6 @@ export const SQLPopover = (props: PopoverProps & { sqlExpression: string }) => {
wrapEnabled
style={{
border: `1px solid ${theme.colorBorder}`,
background: theme.colorPrimaryBg,
maxWidth: theme.sizeUnit * 100,
}}
/>
@@ -18,7 +18,7 @@
*/
import { ReactNode, RefObject } from 'react';
import { css, styled, t } from '@superset-ui/core';
import { css, styled, t, GenericDataType } from '@superset-ui/core';
import { ColumnMeta, Metric } from '@superset-ui/chart-controls';
const TooltipSectionWrapper = styled.div`
@@ -63,11 +63,29 @@ export const getColumnLabelText = (column: ColumnMeta): string =>
column.verbose_name || column.column_name;
export const getColumnTypeTooltipNode = (column: ColumnMeta): ReactNode => {
if (!column.type) {
const rawType = typeof column.type === 'string' ? column.type.trim() : '';
let typeLabel: ReactNode | null = null;
if (rawType && rawType.toLowerCase() !== 'column') {
typeLabel = rawType;
} else if (typeof column.type_generic === 'number') {
if (column.type_generic === GenericDataType.String) {
typeLabel = t('string');
} else if (column.type_generic === GenericDataType.Numeric) {
typeLabel = t('numeric');
} else if (column.type_generic === GenericDataType.Temporal) {
typeLabel = t('timestamp');
} else if (column.type_generic === GenericDataType.Boolean) {
typeLabel = t('boolean');
}
}
if (!typeLabel) {
return null;
}
return <TooltipSection label={t('Column type')} text={column.type} />;
return <TooltipSection label={t('Column type')} text={typeLabel} />;
};
export const getColumnTooltipNode = (
@@ -43,15 +43,17 @@ export const renameOperator: PostProcessingFactory<PostProcessingRename> = (
// remove or rename top level of column name(metric name) in the MultiIndex when
// 1) at least 1 metric
// 2) dimension exist or multiple time shift metrics exist
// 3) xAxis exist
// 4) truncate_metric in form_data and truncate_metric is true
// 2) xAxis exist
// 3a) isTimeComparisonValue
// 3b-1) dimension exist or multiple time shift metrics exist
// 3b-2) truncate_metric in form_data and truncate_metric is true
if (
metrics.length > 0 &&
(columns.length > 0 || timeOffsets.length > 1) &&
xAxisLabel &&
truncate_metric !== undefined &&
!!truncate_metric
(isTimeComparisonValue ||
((columns.length > 0 || timeOffsets.length > 1) &&
truncate_metric !== undefined &&
!!truncate_metric))
) {
const renamePairs: [string, string | null][] = [];
if (
@@ -65,7 +67,7 @@ export const renameOperator: PostProcessingFactory<PostProcessingRename> = (
[...metricOffsetMap.entries()].forEach(
([metricWithOffset, metricOnly]) => {
const offsetLabel = timeOffsets.find(offset =>
metricWithOffset.includes(offset),
metricWithOffset.endsWith(`${TIME_COMPARISON_SEPARATOR}${offset}`),
);
renamePairs.push([
formData.comparison_type === ComparisonType.Values
@@ -28,11 +28,16 @@ import { hasTimeOffset } from './timeOffset';
export const isDerivedSeries = (
series: JsonObject,
formData: QueryFormData,
seriesName?: string,
): boolean => {
const comparisonType = formData.comparison_type;
if (comparisonType !== ComparisonType.Values) {
return false;
}
const timeCompare: string[] = ensureIsArray(formData?.time_compare);
return hasTimeOffset(series, timeCompare);
// Check if series matches time offset patterns or exact match (single metric case)
return (
hasTimeOffset(series, timeCompare) ||
(seriesName !== undefined && timeCompare.includes(seriesName))
);
};
@@ -26,9 +26,11 @@ export const getTimeOffset = (
timeCompare.find(
timeOffset =>
// offset is represented as <offset>, group by list
series.name.includes(`${timeOffset},`) ||
series.name.startsWith(`${timeOffset},`) ||
// offset is represented as <metric>__<offset>
series.name.includes(`__${timeOffset}`),
series.name.includes(`__${timeOffset}`) ||
// offset is represented as <metric>, <offset>
series.name.includes(`, ${timeOffset}`),
);
export const hasTimeOffset = (
@@ -45,10 +47,16 @@ export const getOriginalSeries = (
): string => {
let result = seriesName;
timeCompare.forEach(compare => {
// offset is represented as <offset>, group by list
result = result.replace(`${compare},`, '');
// offset is represented as <metric>__<offset>
// offset in the middle: <metric>, <offset>, <dimension>
result = result.replace(`, ${compare},`, ',');
// offset at start: <offset>, <dimension>
if (result.startsWith(`${compare},`)) {
result = result.slice(`${compare},`.length);
}
// offset with double underscore: <metric>__<offset>
result = result.replace(`__${compare}`, '');
// offset at end: <metric>, <offset>
result = result.replace(`, ${compare}`, '');
});
return result.trim();
};
@@ -131,6 +131,26 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = {
},
},
],
[
{
name: 'time_compare_full_range',
config: {
type: 'CheckboxControl',
label: t('Show full range for time shift'),
default: false,
description: t(
'Plot each time-shifted series across its full time range instead ' +
'of truncating it to the main series. Useful for comparing a ' +
'partial current period (e.g. today so far) against complete ' +
'prior periods (e.g. all of yesterday).',
),
visibility: ({ controls }) =>
Boolean(controls?.time_compare?.value) &&
(!Array.isArray(controls?.time_compare?.value) ||
controls.time_compare.value.length > 0),
},
},
],
[
{
name: 'comparison_type',
@@ -23,7 +23,7 @@ import { ControlPanelSectionConfig } from '../types';
import { formatSelectOptions } from '../utils';
export const TITLE_MARGIN_OPTIONS: number[] = [
15, 30, 50, 75, 100, 125, 150, 200,
0, 15, 30, 40, 50, 75, 100, 125, 150, 200,
];
export const TITLE_POSITION_OPTIONS: [string, string][] = [
['Left', t('Left')],
@@ -56,7 +56,7 @@ export const titleControls: ControlPanelSectionConfig = {
clearable: true,
label: t('X Axis Title Margin'),
renderTrigger: true,
default: TITLE_MARGIN_OPTIONS[0],
default: TITLE_MARGIN_OPTIONS[3],
choices: formatSelectOptions(TITLE_MARGIN_OPTIONS),
},
},
@@ -82,7 +82,7 @@ export const titleControls: ControlPanelSectionConfig = {
clearable: true,
label: t('Y Axis Title Margin'),
renderTrigger: true,
default: TITLE_MARGIN_OPTIONS[1],
default: TITLE_MARGIN_OPTIONS[4],
choices: formatSelectOptions(TITLE_MARGIN_OPTIONS),
},
},
@@ -24,3 +24,4 @@ export * from './forecastInterval';
export * from './chartTitle';
export * from './echartsTimeSeriesQuery';
export * from './timeComparison';
export * from './matrixify';
@@ -0,0 +1,145 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { t } from '@superset-ui/core';
import { ControlPanelSectionConfig } from '../types';
export const matrixifyEnableSection: ControlPanelSectionConfig = {
label: t('Matrixify'),
expanded: true,
controlSetRows: [
[
{
name: 'matrixify_enable',
config: {
type: 'SwitchControl',
label: t('Enable matrixify'),
default: false,
renderTrigger: true,
},
},
],
['matrixify_mode_columns'],
['matrixify_mode_rows'],
],
tabOverride: 'matrixify',
};
export const matrixifySection: ControlPanelSectionConfig = {
label: t('Cell layout & styling'),
expanded: false,
visibility: ({ controls }) =>
controls?.matrixify_enable?.value === true &&
(controls?.matrixify_mode_rows?.value === 'metrics' ||
controls?.matrixify_mode_rows?.value === 'dimensions' ||
controls?.matrixify_mode_columns?.value === 'metrics' ||
controls?.matrixify_mode_columns?.value === 'dimensions'),
controlSetRows: [
[
{
name: 'matrixify_row_height',
config: {
type: 'TextControl',
label: t('Row height'),
default: 300,
isInt: true,
renderTrigger: true,
description: t('Height of each row in pixels'),
},
},
{
name: 'matrixify_fit_columns_dynamically',
config: {
type: 'CheckboxControl',
label: t('Fit columns dynamically'),
default: true,
renderTrigger: true,
description: t('Automatically adjust column width based on content'),
},
},
],
[
{
name: 'matrixify_charts_per_row',
config: {
type: 'TextControl',
label: t('Charts per row'),
default: 3,
isInt: true,
renderTrigger: true,
description: t(
'Number of charts per row when not fitting dynamically',
),
visibility: ({ controls }) =>
!controls?.matrixify_fit_columns_dynamically?.value,
},
},
],
[
{
name: 'matrixify_cell_title_template',
config: {
type: 'TextControl',
label: t('Cell title template'),
default: '',
description: t(
'Template for cell titles. Use Handlebars templating syntax (a popular templating library that uses double curly brackets for variable substitution): {{row}}, {{column}}, {{rowLabel}}, {{columnLabel}}',
),
placeholder: '{{rowLabel}} by {{colLabel}}',
},
},
],
],
tabOverride: 'customize',
};
export const matrixifyRowSection: ControlPanelSectionConfig = {
expanded: false,
visibility: ({ controls }) =>
controls?.matrixify_enable?.value === true &&
(controls?.matrixify_mode_rows?.value === 'metrics' ||
controls?.matrixify_mode_rows?.value === 'dimensions'),
controlSetRows: [
['matrixify_show_row_labels'],
['matrixify_rows'],
['matrixify_dimension_rows'],
['matrixify_dimension_selection_mode_rows'],
['matrixify_topn_value_rows'],
['matrixify_topn_metric_rows'],
['matrixify_topn_order_rows'],
],
tabOverride: 'matrixify',
};
export const matrixifyColumnSection: ControlPanelSectionConfig = {
expanded: false,
visibility: ({ controls }) =>
controls?.matrixify_enable?.value === true &&
(controls?.matrixify_mode_columns?.value === 'metrics' ||
controls?.matrixify_mode_columns?.value === 'dimensions'),
controlSetRows: [
['matrixify_show_column_headers'],
['matrixify_columns'],
['matrixify_dimension_columns'],
['matrixify_dimension_selection_mode_columns'],
['matrixify_topn_value_columns'],
['matrixify_topn_metric_columns'],
['matrixify_topn_order_columns'],
],
tabOverride: 'matrixify',
};
@@ -18,14 +18,20 @@
*/
import { ReactNode } from 'react';
import { JsonValue, t } from '@superset-ui/core';
import { Radio } from '@superset-ui/core/components';
import { Radio, Tooltip, TooltipPlacement } from '@superset-ui/core/components';
import { ControlHeader } from '../../components/ControlHeader';
// [value, label]
export type RadioButtonOption = [
JsonValue,
Exclude<ReactNode, null | undefined | boolean>,
];
export interface RadioButtonOptionObject {
value: JsonValue;
label: Exclude<ReactNode, null | undefined | boolean>;
disabled?: boolean;
tooltip?: string;
tooltipPlacement?: TooltipPlacement;
}
export type RadioButtonOption =
| [JsonValue, Exclude<ReactNode, null | undefined | boolean>]
| RadioButtonOptionObject;
export interface RadioButtonControlProps {
label?: ReactNode;
@@ -33,7 +39,17 @@ export interface RadioButtonControlProps {
options: RadioButtonOption[];
hovered?: boolean;
value?: JsonValue;
onChange: (opt: RadioButtonOption[0]) => void;
onChange: (opt: JsonValue) => void;
}
function normalizeOption(option: RadioButtonOption): RadioButtonOptionObject {
if (Array.isArray(option)) {
return {
value: option[0],
label: option[1],
};
}
return option;
}
export default function RadioButtonControl({
@@ -42,7 +58,9 @@ export default function RadioButtonControl({
onChange,
...props
}: RadioButtonControlProps) {
const currentValue = initialValue || options[0][0];
const normalizedOptions = options.map(normalizeOption);
const currentValue = initialValue || normalizedOptions[0].value;
return (
<div>
<div
@@ -54,29 +72,52 @@ export default function RadioButtonControl({
value={currentValue}
onChange={e => onChange(e.target.value)}
>
{options.map(([val, label]) => (
<Radio.Button
// role="tab"
key={JSON.stringify(val)}
value={val}
aria-label={typeof label === 'string' ? label : undefined}
id={`tab-${val}`}
type="button"
aria-selected={val === currentValue}
className={`btn btn-default ${
val === currentValue ? 'active' : ''
}`}
onClick={e => {
e.currentTarget?.focus();
onChange(val);
}}
>
{label}
</Radio.Button>
))}
{normalizedOptions.map(
({
value: val,
label,
disabled = false,
tooltip,
tooltipPlacement = 'top',
}) => {
const button = (
<Radio.Button
key={JSON.stringify(val)}
value={val}
disabled={disabled}
aria-label={typeof label === 'string' ? label : undefined}
id={`tab-${val}`}
type="button"
aria-selected={val === currentValue}
className={`btn btn-default ${
val === currentValue ? 'active' : ''
}`}
onClick={e => {
e.currentTarget?.focus();
onChange(val);
}}
>
{label}
</Radio.Button>
);
if (tooltip) {
return (
<Tooltip
key={JSON.stringify(val)}
title={tooltip}
placement={tooltipPlacement}
>
{button}
</Tooltip>
);
}
return button;
},
)}
</Radio.Group>
</div>
{/* accessibility begin */}
<div
aria-live="polite"
style={{
@@ -89,10 +130,10 @@ export default function RadioButtonControl({
>
{t(
'%s tab selected',
options.find(([val]) => val === currentValue)?.[1],
normalizedOptions.find(({ value: val }) => val === currentValue)
?.label,
)}
</div>
{/* accessibility end */}
</div>
);
}
@@ -218,8 +218,25 @@ export const xAxisForceCategoricalControl = {
label: () => t('Force categorical'),
default: false,
description: t('Treat values as categorical.'),
initialValue: (control: ControlState, state: ControlPanelState | null) =>
state?.form_data?.x_axis_sort !== undefined || control.value,
initialValue: (control: ControlState, state: ControlPanelState | null) => {
// Check if x-axis is numeric - only numeric columns should have
// their categorical behavior influenced by x_axis_sort setting
const isNumericXAxis = checkColumnType(
getColumnLabel(state?.controls?.x_axis?.value as QueryFormColumn),
state?.controls?.datasource?.datasource,
[GenericDataType.Numeric],
);
// Non-numeric columns (temporal, text) should not be forced categorical
// based on x_axis_sort - just use the control's existing value
if (!isNumericXAxis) {
return control.value;
}
// For numeric columns, force categorical if x_axis_sort is defined
// (user wants to sort) or use the control's existing value
return state?.form_data?.x_axis_sort !== undefined || control.value;
},
renderTrigger: true,
visibility: ({ controls }: { controls: ControlStateMapping }) =>
checkColumnType(
@@ -0,0 +1,140 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { isMatrixifyVisible } from './matrixifyControls';
import type { ControlStateMapping } from '../types';
/**
* Helper to build a controls object matching the shape used by
* control panel visibility callbacks.
*/
function makeControls(
overrides: Record<string, unknown> = {},
): ControlStateMapping {
const defaults: Record<string, unknown> = {
matrixify_enable: false,
matrixify_mode_rows: 'disabled',
matrixify_mode_columns: 'disabled',
matrixify_dimension_selection_mode_rows: 'members',
matrixify_dimension_selection_mode_columns: 'members',
};
const merged = { ...defaults, ...overrides };
return Object.fromEntries(
Object.entries(merged).map(([k, v]) => [k, { value: v }]),
) as ControlStateMapping;
}
// ── matrixify_enable guard ──────────────────────────────────────────
test('returns false when matrixify_enable is false, even with active axis modes', () => {
const controls = makeControls({
matrixify_enable: false,
matrixify_mode_rows: 'metrics',
matrixify_mode_columns: 'dimensions',
});
expect(isMatrixifyVisible(controls, 'rows')).toBe(false);
expect(isMatrixifyVisible(controls, 'columns')).toBe(false);
});
test('returns false when matrixify_enable is undefined (old form_data without the field)', () => {
const controls = makeControls({
matrixify_mode_rows: 'metrics',
});
delete (controls as any).matrixify_enable;
expect(isMatrixifyVisible(controls, 'rows')).toBe(false);
});
test('returns false when controls object is undefined', () => {
expect(isMatrixifyVisible(undefined, 'rows')).toBe(false);
});
// ── axis mode checks ────────────────────────────────────────────────
test('returns false when axis mode is disabled', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'disabled',
});
expect(isMatrixifyVisible(controls, 'rows')).toBe(false);
});
test('returns true when matrixify_enable is true and axis mode is metrics', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'metrics',
});
expect(isMatrixifyVisible(controls, 'rows')).toBe(true);
});
test('returns true when matrixify_enable is true and axis mode is dimensions', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_columns: 'dimensions',
});
expect(isMatrixifyVisible(controls, 'columns')).toBe(true);
});
// ── mode filter ─────────────────────────────────────────────────────
test('returns false when mode filter does not match axis value', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'metrics',
});
expect(isMatrixifyVisible(controls, 'rows', 'dimensions')).toBe(false);
});
test('returns true when mode filter matches axis value', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'dimensions',
});
expect(isMatrixifyVisible(controls, 'rows', 'dimensions')).toBe(true);
});
// ── selectionMode filter ────────────────────────────────────────────
test('returns true when selectionMode matches', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'dimensions',
matrixify_dimension_selection_mode_rows: 'topn',
});
expect(isMatrixifyVisible(controls, 'rows', 'dimensions', 'topn')).toBe(true);
});
test('returns false when selectionMode does not match', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_rows: 'dimensions',
matrixify_dimension_selection_mode_rows: 'members',
});
expect(isMatrixifyVisible(controls, 'rows', 'dimensions', 'topn')).toBe(
false,
);
});
test('ignores selectionMode filter when mode is metrics', () => {
const controls = makeControls({
matrixify_enable: true,
matrixify_mode_columns: 'metrics',
});
// selectionMode only applies to dimensions mode, should be ignored
expect(isMatrixifyVisible(controls, 'columns', 'metrics', 'topn')).toBe(true);
});
@@ -0,0 +1,378 @@
/* eslint-disable camelcase */
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { t, validateNonEmpty } from '@superset-ui/core';
import { ControlStateMapping, SharedControlConfig } from '../types';
import { dndAdhocMetricControl } from './dndControls';
import { defineSavedMetrics } from '../utils';
/**
* Matrixify control definitions
* Controls for transforming charts into matrix/grid layouts
*/
// Utility function to check if matrixify controls should be visible.
// Controls both visibility callbacks and validator injection via mapStateToProps.
// The matrixify_enable guard prevents hidden validators from firing on
// pre-revamp charts with stale matrixify_mode defaults (fix for #38519).
const isMatrixifyVisible = (
controls: ControlStateMapping | undefined,
axis: 'rows' | 'columns',
mode?: 'metrics' | 'dimensions',
selectionMode?: 'members' | 'topn' | 'all',
) => {
if (controls?.matrixify_enable?.value !== true) return false;
const modeControl = `matrixify_mode_${axis}`;
const selectionModeControl = `matrixify_dimension_selection_mode_${axis}`;
const modeValue = controls?.[modeControl]?.value;
const isLayoutEnabled = modeValue === 'metrics' || modeValue === 'dimensions';
if (!isLayoutEnabled) return false;
if (mode) {
if (modeValue !== mode) return false;
if (selectionMode && mode === 'dimensions') {
return controls?.[selectionModeControl]?.value === selectionMode;
}
}
return true;
};
// Initialize the controls object that will be populated dynamically
const matrixifyControls: Record<string, SharedControlConfig<any>> = {};
// Dynamically add axis-specific controls (rows and columns)
(['columns', 'rows'] as const).forEach(axisParam => {
const axis: 'rows' | 'columns' = axisParam;
const otherAxis: 'rows' | 'columns' = axis === 'rows' ? 'columns' : 'rows';
matrixifyControls[`matrixify_mode_${axis}`] = {
type: 'RadioButtonControl',
default: 'disabled',
renderTrigger: true,
tabOverride: 'matrixify',
mapStateToProps: ({ controls }) => {
const otherAxisControlName = `matrixify_mode_${otherAxis}`;
const otherAxisValue =
controls?.[otherAxisControlName]?.value ?? 'disabled';
const isMetricsDisabled = otherAxisValue === 'metrics';
return {
options: [
{ value: 'disabled', label: t('Disabled') },
{
value: 'metrics',
label: t('Metrics'),
disabled: isMetricsDisabled,
tooltip: isMetricsDisabled
? t(
"Metrics can't be used for both rows and columns at the same time",
)
: undefined,
},
{ value: 'dimensions', label: t('Dimensions') },
],
};
},
rerender: [`matrixify_mode_${otherAxis}`, `matrixify_dimension_${axis}`],
};
matrixifyControls[`matrixify_${axis}`] = {
...dndAdhocMetricControl,
label: t(`Metrics`),
multi: true,
validators: [], // No validation - rely on visibility
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) => isMatrixifyVisible(controls, axis, 'metrics'),
};
// Combined dimension and values control
matrixifyControls[`matrixify_dimension_${axis}`] = {
type: 'MatrixifyDimensionControl',
label: t(`Dimension selection`),
description: t(`Select dimension and values`),
default: { dimension: '', values: [] },
validators: [], // No validation - rely on visibility
tabOverride: 'matrixify',
shouldMapStateToProps: (prevState, state) => {
// Recalculate when any relevant form_data field changes
const fieldsToCheck = [
`matrixify_topn_value_${axis}`,
`matrixify_topn_metric_${axis}`,
`matrixify_topn_order_${axis}`,
`matrixify_dimension_selection_mode_${axis}`,
`matrixify_all_sort_by_${axis}`,
];
return fieldsToCheck.some(
field => prevState?.form_data?.[field] !== state?.form_data?.[field],
);
},
mapStateToProps: ({ datasource, controls, form_data }) => {
// Helper to get value from form_data or controls
const getValue = (key: string, defaultValue?: any) =>
form_data?.[key] ?? controls?.[key]?.value ?? defaultValue;
const selectionMode = getValue(
`matrixify_dimension_selection_mode_${axis}`,
'members',
);
const isVisible = isMatrixifyVisible(controls, axis, 'dimensions');
// Validate dimension is selected when visible
const dimensionValidator = (value: any) => {
if (!value?.dimension) {
return t('Dimension is required');
}
return false;
};
// Additional validation for topN mode
const validators = isVisible
? [dimensionValidator, validateNonEmpty]
: [];
return {
datasource,
selectionMode,
topNMetric: getValue(`matrixify_topn_metric_${axis}`),
topNValue: getValue(`matrixify_topn_value_${axis}`),
topNOrder: getValue(`matrixify_topn_order_${axis}`, true)
? 'DESC'
: 'ASC',
allSortBy: getValue(`matrixify_all_sort_by_${axis}`, 'a_to_z'),
formData: form_data,
validators,
};
},
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions'),
};
matrixifyControls[`matrixify_topn_dimension_${axis}`] = {
type: 'SelectControl',
label: t('Dimension'),
description: t(`Select dimension for Top N`),
default: null,
mapStateToProps: ({ datasource }) => ({
choices:
datasource?.columns?.map((col: any) => [
col.column_name,
col.column_name,
]) || [],
}),
renderTrigger: true,
// Hide this control - now handled by matrixify_dimension control
visibility: () => false,
};
// Add selection mode control (Dimension Members / Top N / All)
matrixifyControls[`matrixify_dimension_selection_mode_${axis}`] = {
type: 'VerticalRadioControl',
label: t(`Selection method`),
default: 'members',
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions'),
options: [
{ value: 'members', label: t('Dimension members') },
{ value: 'topn', label: t('Top n') },
{
value: 'all',
label: t('All dimensions'),
tooltip: t('Uses the first 25 values if the dimension has more.'),
},
],
};
// TopN controls
matrixifyControls[`matrixify_topn_value_${axis}`] = {
type: 'NumberControl',
label: t(`Number of top values`),
description: t(`How many top values to select`),
default: 10,
isInt: true,
validators: [],
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions', 'topn'),
mapStateToProps: ({ controls }) => {
const isVisible = isMatrixifyVisible(
controls,
axis,
'dimensions',
'topn',
);
return {
validators: isVisible ? [validateNonEmpty] : [],
};
},
};
matrixifyControls[`matrixify_topn_metric_${axis}`] = {
...dndAdhocMetricControl,
label: t(`Metric for ordering`),
multi: false,
validators: [],
description: t(`Metric to use for ordering Top N values`),
tabOverride: 'matrixify',
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions', 'topn') ||
(isMatrixifyVisible(controls, axis, 'dimensions', 'all') &&
controls?.[`matrixify_all_sort_by_${axis}`]?.value === 'metric'),
mapStateToProps: (state, controlState) => {
const { controls, datasource } = state;
const isVisible =
isMatrixifyVisible(controls, axis, 'dimensions', 'topn') ||
(isMatrixifyVisible(controls, axis, 'dimensions', 'all') &&
controls?.[`matrixify_all_sort_by_${axis}`]?.value === 'metric');
const originalProps =
dndAdhocMetricControl.mapStateToProps?.(state, controlState) || {};
return {
...originalProps,
columns: datasource?.columns || [],
savedMetrics: defineSavedMetrics(datasource),
datasource,
datasourceType: datasource?.type,
validators: isVisible ? [validateNonEmpty] : [],
};
},
};
matrixifyControls[`matrixify_topn_order_${axis}`] = {
type: 'CheckboxControl',
label: t('Sort descending'),
default: true,
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions', 'topn') ||
(isMatrixifyVisible(controls, axis, 'dimensions', 'all') &&
controls?.[`matrixify_all_sort_by_${axis}`]?.value === 'metric'),
};
matrixifyControls[`matrixify_all_sort_by_${axis}`] = {
type: 'SelectControl',
label: t('Sort by'),
default: 'a_to_z',
clearable: false,
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) =>
isMatrixifyVisible(controls, axis, 'dimensions', 'all'),
choices: [
['a_to_z', t('A-Z')],
['z_to_a', t('Z-A')],
['metric', t('Metric')],
],
};
});
// Grid layout controls (added once, not per axis)
matrixifyControls.matrixify_row_height = {
type: 'TextControl',
label: t('Row height'),
description: t('Height of each row in pixels'),
default: 300,
isInt: true,
validators: [],
renderTrigger: true,
};
matrixifyControls.matrixify_fit_columns_dynamically = {
type: 'CheckboxControl',
label: t('Fit columns dynamically'),
description: t('Automatically adjust column width based on available space'),
default: true,
renderTrigger: true,
};
matrixifyControls.matrixify_charts_per_row = {
type: 'SelectControl',
label: t('Charts per row'),
description: t('Number of charts to display per row'),
default: 4,
choices: [
[1, '1'],
[2, '2'],
[3, '3'],
[4, '4'],
[5, '5'],
[6, '6'],
[8, '8'],
[10, '10'],
[12, '12'],
],
freeForm: true,
clearable: false,
renderTrigger: true,
visibility: ({ controls }) =>
!controls?.matrixify_fit_columns_dynamically?.value,
};
// Cell title control for Matrixify
matrixifyControls.matrixify_cell_title_template = {
type: 'TextControl',
label: t('Title'),
description: t(
'Customize cell titles using Handlebars template syntax. Available variables: {{rowLabel}}, {{colLabel}}',
),
default: '',
renderTrigger: true,
visibility: ({ controls }) =>
isMatrixifyVisible(controls, 'rows') ||
isMatrixifyVisible(controls, 'columns'),
};
// Matrix display controls
matrixifyControls.matrixify_show_row_labels = {
type: 'CheckboxControl',
label: t('Show row labels'),
description: t('Display labels for each row on the left side of the matrix'),
default: true,
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) => isMatrixifyVisible(controls, 'rows'),
};
matrixifyControls.matrixify_show_column_headers = {
type: 'CheckboxControl',
label: t('Show column headers'),
description: t('Display headers for each column at the top of the matrix'),
default: true,
renderTrigger: true,
tabOverride: 'matrixify',
visibility: ({ controls }) => isMatrixifyVisible(controls, 'columns'),
};
export { matrixifyControls, isMatrixifyVisible };
@@ -17,7 +17,6 @@
* specific language governing permissions and limitations
* under the License.
*/
/**
* This file exports all controls available for use in chart plugins internal to Superset.
* It is not recommended to use the controls here for any third-party plugins.
@@ -86,6 +85,7 @@ import {
dndTooltipColumnsControl,
dndTooltipMetricsControl,
} from './dndControls';
import { matrixifyControls } from './matrixifyControls';
const categoricalSchemeRegistry = getCategoricalSchemeRegistry();
const sequentialSchemeRegistry = getSequentialSchemeRegistry();
@@ -325,6 +325,9 @@ const currency_format: SharedControlConfig<'CurrencyControl'> = {
type: 'CurrencyControl',
label: t('Currency format'),
renderTrigger: true,
description: t(
"Format metrics or columns with currency symbols as prefixes or suffixes. Choose a symbol manually or use 'Auto-detect' to apply the correct symbol based on the dataset's currency code column. When multiple currencies are present, formatting falls back to neutral numbers.",
),
};
const x_axis_time_format: SharedControlConfig<
@@ -342,6 +345,31 @@ const x_axis_time_format: SharedControlConfig<
option.label.includes(search) || option.value.includes(search),
};
const x_axis_number_format: SharedControlConfig<
'SelectControl',
SelectDefaultOption
> = {
type: 'SelectControl',
freeForm: true,
label: t('X Axis Number Format'),
renderTrigger: true,
default: DEFAULT_NUMBER_FORMAT,
choices: D3_FORMAT_OPTIONS,
description: D3_FORMAT_DOCS,
tokenSeparators: ['\n', '\t', ';'],
filterOption: ({ data: option }, search) =>
option.label.includes(search) || option.value.includes(search),
mapStateToProps: state => {
const isPercentage =
state.controls?.comparison_type?.value === ComparisonType.Percentage;
return {
choices: isPercentage
? D3_FORMAT_OPTIONS.filter(option => option[0].includes('%'))
: D3_FORMAT_OPTIONS,
};
},
};
const color_scheme: SharedControlConfig<'ColorSchemeControl'> = {
type: 'ColorSchemeControl',
label: t('Color Scheme'),
@@ -427,7 +455,7 @@ const order_by_cols: SharedControlConfig<'SelectControl'> = {
resetOnHide: false,
};
export default {
const sharedControls: Record<string, SharedControlConfig<any>> = {
metrics: dndAdhocMetricsControl,
metric: dndAdhocMetricControl,
datasource: datasourceControl,
@@ -456,6 +484,7 @@ export default {
size: dndSizeControl,
y_axis_format,
x_axis_time_format,
x_axis_number_format,
adhoc_filters: dndAdhocFilterControl,
color_scheme,
time_shift_color,
@@ -472,4 +501,9 @@ export default {
currency_format,
sort_by_metric,
order_by_cols,
// Add all Matrixify controls
...matrixifyControls,
};
export default sharedControls;
@@ -72,6 +72,7 @@ export interface Dataset {
currency_formats?: Record<string, Currency>;
verbose_map: Record<string, string>;
main_dttm_col: string;
currency_code_column?: string;
// eg. ['["ds", true]', 'ds [asc]']
order_by_choices?: [string, string][] | null;
time_grain_sqla?: [string, string][];
@@ -190,7 +191,7 @@ export type InternalControlType =
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type ControlType = InternalControlType | ComponentType<any>;
export type TabOverride = 'data' | 'customize' | boolean;
export type TabOverride = 'data' | 'customize' | 'matrixify' | boolean;
/**
* Control config specifying how chart controls appear in the control panel, all
@@ -458,6 +459,14 @@ export enum Comparator {
BetweenOrEqual = '≤ x ≤',
BetweenOrLeftEqual = '≤ x <',
BetweenOrRightEqual = '< x ≤',
BeginsWith = 'begins with',
EndsWith = 'ends with',
Containing = 'containing',
NotContaining = 'not containing',
IsTrue = 'is true',
IsFalse = 'is false',
IsNull = 'is null',
IsNotNull = 'is not null',
}
export const MultipleValueComparators = [
@@ -469,16 +478,23 @@ export const MultipleValueComparators = [
export type ConditionalFormattingConfig = {
operator?: Comparator;
targetValue?: number;
targetValue?: number | string;
targetValueLeft?: number;
targetValueRight?: number;
column?: string;
colorScheme?: string;
toAllRow?: boolean;
toTextColor?: boolean;
useGradient?: boolean;
};
export type ColorFormatters = {
column: string;
getColorFromValue: (value: number) => string | undefined;
toAllRow?: boolean;
toTextColor?: boolean;
getColorFromValue: (
value: number | string | boolean | null,
) => string | undefined;
}[];
export default {};
@@ -17,11 +17,7 @@
* under the License.
*/
import { ensureIsArray, GenericDataType, ValueOf } from '@superset-ui/core';
import {
ControlPanelState,
isDataset,
isQueryResponse,
} from '@superset-ui/chart-controls';
import { ControlPanelState, isDataset, isQueryResponse } from '../types';
export function checkColumnType(
columnName: string,
@@ -32,13 +32,18 @@ const MIN_OPACITY_BOUNDED = 0.05;
const MIN_OPACITY_UNBOUNDED = 0;
const MAX_OPACITY = 1;
export const getOpacity = (
value: number,
cutoffPoint: number,
extremeValue: number,
value: number | string | boolean | null,
cutoffPoint: number | string,
extremeValue: number | string,
minOpacity = MIN_OPACITY_BOUNDED,
maxOpacity = MAX_OPACITY,
) => {
if (extremeValue === cutoffPoint) {
if (
extremeValue === cutoffPoint ||
typeof cutoffPoint !== 'number' ||
typeof extremeValue !== 'number' ||
typeof value !== 'number'
) {
return maxOpacity;
}
return Math.min(
@@ -60,17 +65,18 @@ export const getColorFunction = (
targetValueLeft,
targetValueRight,
colorScheme,
useGradient,
}: ConditionalFormattingConfig,
columnValues: number[],
columnValues: number[] | string[] | (boolean | null)[],
alpha?: boolean,
) => {
let minOpacity = MIN_OPACITY_BOUNDED;
const maxOpacity = MAX_OPACITY;
let comparatorFunction: (
value: number,
allValues: number[],
) => false | { cutoffValue: number; extremeValue: number };
value: number | string | boolean | null,
allValues: number[] | string[] | (boolean | null)[],
) => false | { cutoffValue: number | string; extremeValue: number | string };
if (operator === undefined || colorScheme === undefined) {
return () => undefined;
}
@@ -90,7 +96,10 @@ export const getColorFunction = (
switch (operator) {
case Comparator.None:
minOpacity = MIN_OPACITY_UNBOUNDED;
comparatorFunction = (value: number, allValues: number[]) => {
comparatorFunction = (value: number | string, allValues: number[]) => {
if (typeof value !== 'number') {
return { cutoffValue: value!, extremeValue: value! };
}
const cutoffValue = Math.min(...allValues);
const extremeValue = Math.max(...allValues);
return value >= cutoffValue && value <= extremeValue
@@ -100,49 +109,65 @@ export const getColorFunction = (
break;
case Comparator.GreaterThan:
comparatorFunction = (value: number, allValues: number[]) =>
value > targetValue!
? { cutoffValue: targetValue!, extremeValue: Math.max(...allValues) }
typeof targetValue === 'number' && value > targetValue!
? {
cutoffValue: targetValue!,
extremeValue: Math.max(...allValues),
}
: false;
break;
case Comparator.LessThan:
comparatorFunction = (value: number, allValues: number[]) =>
value < targetValue!
? { cutoffValue: targetValue!, extremeValue: Math.min(...allValues) }
typeof targetValue === 'number' && value < targetValue!
? {
cutoffValue: targetValue!,
extremeValue: Math.min(...allValues),
}
: false;
break;
case Comparator.GreaterOrEqual:
comparatorFunction = (value: number, allValues: number[]) =>
value >= targetValue!
? { cutoffValue: targetValue!, extremeValue: Math.max(...allValues) }
typeof targetValue === 'number' && value >= targetValue!
? {
cutoffValue: targetValue!,
extremeValue: Math.max(...allValues),
}
: false;
break;
case Comparator.LessOrEqual:
comparatorFunction = (value: number, allValues: number[]) =>
value <= targetValue!
? { cutoffValue: targetValue!, extremeValue: Math.min(...allValues) }
typeof targetValue === 'number' && value <= targetValue!
? {
cutoffValue: targetValue!,
extremeValue: Math.min(...allValues),
}
: false;
break;
case Comparator.Equal:
comparatorFunction = (value: number) =>
comparatorFunction = (value: number | string) =>
value === targetValue!
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.NotEqual:
comparatorFunction = (value: number, allValues: number[]) => {
if (value === targetValue!) {
return false;
if (typeof targetValue === 'number') {
if (value === targetValue!) {
return false;
}
const max = Math.max(...allValues);
const min = Math.min(...allValues);
return {
cutoffValue: targetValue!,
extremeValue:
Math.abs(targetValue! - min) > Math.abs(max - targetValue!)
? min
: max,
};
}
const max = Math.max(...allValues);
const min = Math.min(...allValues);
return {
cutoffValue: targetValue!,
extremeValue:
Math.abs(targetValue! - min) > Math.abs(max - targetValue!)
? min
: max,
};
return false;
};
break;
case Comparator.Between:
comparatorFunction = (value: number) =>
@@ -168,15 +193,73 @@ export const getColorFunction = (
? { cutoffValue: targetValueLeft!, extremeValue: targetValueRight! }
: false;
break;
case Comparator.BeginsWith:
comparatorFunction = (value: string) =>
isString(value) && value?.startsWith(targetValue as string)
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.EndsWith:
comparatorFunction = (value: string) =>
isString(value) && value?.endsWith(targetValue as string)
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.Containing:
comparatorFunction = (value: string) =>
isString(value) &&
value?.toLowerCase().includes((targetValue as string).toLowerCase())
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.NotContaining:
comparatorFunction = (value: string) =>
isString(value) &&
!value?.toLowerCase().includes((targetValue as string).toLowerCase())
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.IsTrue:
comparatorFunction = (value: boolean | null) =>
isBoolean(value) && value
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.IsFalse:
comparatorFunction = (value: boolean | null) =>
isBoolean(value) && !value
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.IsNull:
comparatorFunction = (value: boolean | null) =>
value === null
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
case Comparator.IsNotNull:
comparatorFunction = (value: boolean | null) =>
isBoolean(value) && value !== null
? { cutoffValue: targetValue!, extremeValue: targetValue! }
: false;
break;
default:
comparatorFunction = () => false;
break;
}
return (value: number) => {
return (value: number | string | boolean | null) => {
const compareResult = comparatorFunction(value, columnValues);
if (compareResult === false) return undefined;
const { cutoffValue, extremeValue } = compareResult;
// If useGradient is explicitly false, return solid color
if (useGradient === false) {
return colorScheme;
}
// Otherwise apply gradient (default behavior for backward compatibility)
if (alpha === undefined || alpha) {
return addAlpha(
colorScheme,
@@ -191,10 +274,21 @@ export const getColorFormatters = memoizeOne(
(
columnConfig: ConditionalFormattingConfig[] | undefined,
data: DataRecord[],
theme?: Record<string, any>,
alpha?: boolean,
) =>
columnConfig?.reduce(
(acc: ColorFormatters, config: ConditionalFormattingConfig) => {
let resolvedColorScheme = config.colorScheme;
if (
theme &&
typeof config.colorScheme === 'string' &&
config.colorScheme.startsWith('color') &&
theme[config.colorScheme]
) {
resolvedColorScheme = theme[config.colorScheme] as string;
}
if (
config?.column !== undefined &&
(config?.operator === Comparator.None ||
@@ -206,8 +300,10 @@ export const getColorFormatters = memoizeOne(
) {
acc.push({
column: config?.column,
toAllRow: config?.toAllRow,
toTextColor: config?.toTextColor,
getColorFromValue: getColorFunction(
config,
{ ...config, colorScheme: resolvedColorScheme },
data.map(row => row[config.column!] as number),
alpha,
),
@@ -218,3 +314,11 @@ export const getColorFormatters = memoizeOne(
[],
) ?? [],
);
function isString(value: unknown) {
return typeof value === 'string';
}
function isBoolean(value: unknown) {
return typeof value === 'boolean';
}
@@ -53,6 +53,10 @@ describe('ColumnOption', () => {
renderColumnTypeLabel({ type: 'expression' });
expect(screen.getByLabelText('function type icon')).toBeVisible();
});
it('metric type shows sigma icon', () => {
renderColumnTypeLabel({ type: 'metric' });
expect(screen.getByLabelText('metric type icon')).toBeVisible();
});
it('unknown type shows question mark', () => {
renderColumnTypeLabel({ type: undefined });
expect(screen.getByLabelText('unknown type icon')).toBeVisible();
@@ -18,6 +18,7 @@
*/
import { render, screen } from '@superset-ui/core/spec';
import '@testing-library/jest-dom';
import { GenericDataType } from '@superset-ui/core';
import {
getColumnLabelText,
getColumnTooltipNode,
@@ -89,6 +90,24 @@ test('should get column datatype rendered as tooltip when column has a type', ()
expect(screen.getByText('text')).toBeVisible();
});
test('should fall back to generic data type label when type is "column"', () => {
render(
<>
{getColumnTypeTooltipNode({
id: 123,
column_name: 'column name',
verbose_name: '',
description: '',
type: 'column',
type_generic: GenericDataType.String,
})}
</>,
);
expect(screen.getByText('Column type')).toBeVisible();
expect(screen.getByText('string')).toBeVisible();
});
test('should get column name, verbose name and description when it has a verbose name', () => {
const ref = { current: { scrollWidth: 100, clientWidth: 100 } };
render(
@@ -160,6 +160,44 @@ test('should add renameOperator if exists derived metrics', () => {
});
});
test('should add renameOperator if isTimeComparisonValue without columns', () => {
[
ComparisonType.Difference,
ComparisonType.Ratio,
ComparisonType.Percentage,
].forEach(type => {
expect(
renameOperator(
{
...formData,
...{
comparison_type: type,
time_compare: ['1 year ago'],
},
},
{
...queryObject,
...{
columns: [],
metrics: ['sum(val)', 'avg(val2)'],
},
},
),
).toEqual({
operation: 'rename',
options: {
columns: {
[`${type}__avg(val2)__avg(val2)__1 year ago`]:
'avg(val2), 1 year ago',
[`${type}__sum(val)__sum(val)__1 year ago`]: 'sum(val), 1 year ago',
},
inplace: true,
level: 0,
},
});
});
});
test('should add renameOperator if x_axis does not exist', () => {
expect(
renameOperator(
@@ -274,6 +312,30 @@ test('should add renameOperator if multiple metrics exist', () => {
});
});
test('should correctly match offsets that share a numeric prefix', () => {
expect(
renameOperator(
{
...formData,
comparison_type: ComparisonType.Values,
time_compare: ['1 year ago', '11 year ago'],
},
queryObject,
),
).toEqual({
operation: 'rename',
options: {
columns: {
'count(*)__1 year ago': '1 year ago',
'count(*)__11 year ago': '11 year ago',
},
inplace: true,
level: 0,
},
});
});
test('should remove renameOperator', () => {
expect(
renameOperator(

Some files were not shown because too many files have changed in this diff Show More