This is an automated email from the ASF dual-hosted git repository.

asoare pushed a commit to branch alexandrusoare/feat/date-parse-improvements
in repository https://gitbox.apache.org/repos/asf/superset.git

commit b2440495c84a0d3e81b0c4754de084470c675c14
Merge: e46d328472 ad3812edd7
Author: alexandrusoare <[email protected]>
AuthorDate: Tue Jan 13 15:52:52 2026 +0200

    Merge branch 'master' of https://github.com/apache/superset into 
alexandrusoare/feat/date-parse-improvements

 .github/workflows/superset-frontend.yml            |   2 +-
 RESOURCES/INTHEWILD.yaml                           |  13 +
 docs/docs/contributing/development.mdx             |   6 +-
 docs/package.json                                  |  10 +-
 .../logos/hollyland\347\214\233\347\216\233.svg"   | Bin 0 -> 77086 bytes
 docs/yarn.lock                                     | 348 ++++----
 pyproject.toml                                     |  22 +-
 requirements/base.txt                              |   2 +-
 requirements/development.txt                       |   2 +-
 superset-embedded-sdk/README.md                    |  61 +-
 superset-embedded-sdk/src/index.ts                 |  38 +-
 .../src/superset_extensions_cli/cli.py             |   5 -
 superset-extensions-cli/tests/test_cli_dev.py      |  24 +-
 superset-frontend/oxlint.json                      |   2 +-
 superset-frontend/package-lock.json                | 609 ++++++-------
 superset-frontend/package.json                     |  14 +-
 .../packages/generator-superset/package.json       |   2 +-
 .../packages/superset-core/package.json            |   3 +-
 .../packages/superset-core/src/index.ts            |   1 +
 .../superset-core/src/spec/utils/logging.test.ts   |  69 ++
 .../packages/superset-core/src/ui/index.ts         |   1 +
 .../src/ui}/translation/README.md                  |   0
 .../src/ui}/translation/Translator.ts              |   2 +-
 .../src/ui}/translation/TranslatorSingleton.ts     |   0
 .../src/ui}/translation/index.ts                   |   1 +
 .../src/ui}/translation/types/index.ts             |   0
 .../src/ui}/translation/types/jed.ts               |   0
 .../superset-core/src/{ => utils}/index.ts         |   4 +-
 .../src/utils/logging.ts                           |   2 +-
 .../types/external.d.ts                            |   0
 .../src/components/CertifiedIconWithTooltip.tsx    |   2 +-
 .../components/ColumnTypeLabel/ColumnTypeLabel.tsx |   2 +-
 .../src/components/ControlHeader.tsx               |   2 +-
 .../src/components/SQLPopover.tsx                  |   2 +-
 .../src/components/labelUtils.tsx                  |   2 +-
 .../superset-ui-chart-controls/src/constants.ts    |   3 +-
 .../src/sections/advancedAnalytics.tsx             |   3 +-
 .../src/sections/annotationsAndLayers.tsx          |   2 +-
 .../src/sections/chartTitle.tsx                    |   2 +-
 .../src/sections/echartsTimeSeriesQuery.tsx        |   2 +-
 .../src/sections/forecastInterval.tsx              |   7 +-
 .../src/sections/matrixify.tsx                     |   2 +-
 .../src/sections/sections.tsx                      |   2 +-
 .../src/sections/timeComparison.tsx                |   3 +-
 .../components/RadioButtonControl.tsx              |   3 +-
 .../src/shared-controls/customControls.tsx         |   2 +-
 .../src/shared-controls/dndControls.tsx            |   3 +-
 .../src/shared-controls/matrixifyControls.tsx      |   3 +-
 .../src/shared-controls/mixins.tsx                 |   2 +-
 .../src/shared-controls/sharedControls.tsx         |   2 +-
 .../src/utils/D3Formatting.ts                      |   2 +-
 .../test/utils/getColorFormatters.test.ts          |   2 +-
 .../src/chart/components/FallbackComponent.tsx     |   2 +-
 .../src/chart/components/NoResultsComponent.tsx    |   3 +-
 .../src/chart/components/SuperChartCore.tsx        |   2 +-
 .../src/components/AsyncAceEditor/index.tsx        |   2 -
 .../src/components/CachedLabel/TooltipContent.tsx  |   2 +-
 .../src/components/CachedLabel/index.tsx           |   2 +-
 .../CertifiedBadge/CertifiedBadge.stories.tsx      |   2 +-
 .../src/components/CertifiedBadge/index.tsx        |   2 +-
 .../src/components/ConfirmModal/index.tsx          |   2 +-
 .../src/components/CronPicker/index.tsx            |   2 +-
 .../src/components/DeleteModal/index.tsx           |   2 +-
 .../DropdownContainer/DropdownContainer.tsx        |   3 +-
 .../src/components/DynamicEditableTitle/index.tsx  |   2 +-
 .../src/components/EditableTitle/index.tsx         |   2 +-
 .../src/components/EmptyState/index.tsx            |   2 +-
 .../src/components/FaveStar/index.tsx              |   2 +-
 .../src/components/Form/LabeledErrorBoundInput.tsx |   2 +-
 .../src/components/Icons/AntdEnhanced.tsx          |   2 +
 .../src/components/InfoTooltip/index.tsx           |   2 +-
 .../components/Label/reusable/DatasetTypeLabel.tsx |   2 +-
 .../components/Label/reusable/PublishedLabel.tsx   |   2 +-
 .../src/components/LastUpdated/index.tsx           |   2 +-
 .../src/components/ListViewCard/ImageLoader.tsx    |   2 +-
 .../src/components/ListViewCard/index.tsx          |   4 +-
 .../src/components/MetadataBar/ContentConfig.tsx   |   3 +-
 .../src/components/Modal/FormModal.tsx             |   2 +-
 .../src/components/Modal/Modal.tsx                 |   2 +-
 .../src/components/PageHeaderWithActions/index.tsx |   2 +-
 .../src/components/Select/AsyncSelect.tsx          |   2 +-
 .../src/components/Select/Select.tsx               |   3 +-
 .../src/components/Select/constants.ts             |   2 +-
 .../src/components/Select/utils.tsx                |   3 +-
 .../Table/cell-renderers/NumericCell/index.tsx     |   2 +-
 .../src/components/Table/index.tsx                 |   3 +-
 .../ThemedAgGridReact/ThemedAgGridReact.test.tsx   |  10 +-
 .../src/components/TimezoneSelector/index.tsx      |   2 +-
 .../src/components/TruncatedList/index.tsx         |   3 +-
 .../src/components/UnsavedChangesModal/index.tsx   |   2 +-
 .../superset-ui-core/src/components/constants.ts   |   2 +-
 .../src/currency-format/CurrencyFormatter.ts       |  11 +-
 .../packages/superset-ui-core/src/index.ts         |   1 -
 .../src/query/extractQueryFields.ts                |   2 +-
 .../src/query/getClientErrorObject.ts              |   2 +-
 .../src/query/types/QueryResponse.ts               |   6 +-
 .../superset-ui-core/src/utils/featureFlags.ts     |   2 +-
 .../packages/superset-ui-core/src/utils/index.ts   |   1 -
 .../packages/superset-ui-core/src/utils/tooltip.ts |   2 +-
 .../src/validator/legacyValidateInteger.ts         |   2 +-
 .../src/validator/legacyValidateNumber.ts          |   2 +-
 .../src/validator/validateInteger.ts               |   2 +-
 .../src/validator/validateMapboxStylesUrl.ts       |   2 +-
 .../src/validator/validateMaxValue.ts              |   2 +-
 .../src/validator/validateNonEmpty.ts              |   2 +-
 .../src/validator/validateNumber.ts                |   2 +-
 .../src/validator/validateServerPagination.ts      |   2 +-
 .../validator/validateTimeComparisonRangeValues.ts |   2 +-
 .../test/chart/clients/ChartClient.test.ts         |   2 +-
 .../test/currency-format/CurrencyFormatter.test.ts |   6 +-
 .../test/query/extractQueryFields.test.ts          |   3 +-
 .../test/translation/Translator.test.ts            | 201 -----
 .../test/translation/TranslatorSingleton.test.ts   |  86 --
 .../test/translation/languagePacks/en.ts           |  37 -
 .../test/translation/languagePacks/zh.ts           |  37 -
 .../test/utils/featureFlag.test.ts                 |  19 +-
 .../superset-ui-core/test/utils/logging.test.ts    |  78 --
 .../superset-ui-core/test/validator/setup.ts       |   2 +-
 .../packages/superset-ui-demo/package.json         |   2 +-
 .../storybook/shared/components/VerifyCORS.tsx     |   2 +-
 .../legacy-plugin-chart-calendar/src/Calendar.js   |   3 +-
 .../src/controlPanel.ts                            |   3 +-
 .../legacy-plugin-chart-calendar/src/index.js      |   3 +-
 .../src/vendor/cal-heatmap.js                      |   3 +-
 .../legacy-plugin-chart-chord/src/controlPanel.ts  |   3 +-
 .../plugins/legacy-plugin-chart-chord/src/index.js |   3 +-
 .../src/controlPanel.ts                            |   3 +-
 .../legacy-plugin-chart-country-map/src/index.js   |   3 +-
 .../src/controlPanel.ts                            |   2 +-
 .../legacy-plugin-chart-horizon/src/index.js       |   3 +-
 .../src/controlPanel.ts                            |   3 +-
 .../legacy-plugin-chart-map-box/src/index.js       |   3 +-
 .../src/controlPanel.ts                            |   3 +-
 .../legacy-plugin-chart-paired-t-test/src/index.js |   3 +-
 .../src/controlPanel.ts                            |   2 +-
 .../src/index.js                                   |   3 +-
 .../src/controlPanel.tsx                           |   3 +-
 .../legacy-plugin-chart-partition/src/index.js     |   3 +-
 .../legacy-plugin-chart-rose/src/controlPanel.tsx  |   2 +-
 .../plugins/legacy-plugin-chart-rose/src/index.js  |   3 +-
 .../src/controlPanel.ts                            |   2 +-
 .../legacy-plugin-chart-world-map/src/index.js     |   3 +-
 .../src/Multi/controlPanel.ts                      |   3 +-
 .../legacy-preset-chart-deckgl/src/Multi/index.ts  |   3 +-
 .../src/layers/Arc/controlPanel.ts                 |   3 +-
 .../src/layers/Arc/index.ts                        |   3 +-
 .../src/layers/Contour/Contour.tsx                 |   2 +-
 .../src/layers/Contour/controlPanel.ts             |   3 +-
 .../src/layers/Contour/index.ts                    |   3 +-
 .../src/layers/Geojson/controlPanel.ts             |   2 +-
 .../src/layers/Geojson/index.ts                    |   3 +-
 .../src/layers/Grid/controlPanel.ts                |   3 +-
 .../src/layers/Grid/index.ts                       |   3 +-
 .../src/layers/Heatmap/Heatmap.tsx                 |   2 +-
 .../src/layers/Heatmap/controlPanel.ts             |   2 +-
 .../src/layers/Heatmap/index.ts                    |   3 +-
 .../src/layers/Hex/controlPanel.ts                 |   2 +-
 .../src/layers/Hex/index.ts                        |   3 +-
 .../src/layers/Path/controlPanel.ts                |   2 +-
 .../src/layers/Path/index.ts                       |   3 +-
 .../src/layers/Polygon/Polygon.tsx                 |   2 +-
 .../src/layers/Polygon/controlPanel.ts             |   4 +-
 .../src/layers/Polygon/index.ts                    |   3 +-
 .../src/layers/Scatter/Scatter.tsx                 |   3 +-
 .../src/layers/Scatter/controlPanel.ts             |   3 +-
 .../src/layers/Scatter/index.ts                    |   3 +-
 .../src/layers/Screengrid/Screengrid.tsx           |   2 +-
 .../src/layers/Screengrid/controlPanel.ts          |   3 +-
 .../src/layers/Screengrid/index.ts                 |   3 +-
 .../src/utilities/HandlebarsRenderer.tsx           |   3 +-
 .../src/utilities/Shared_DeckGL.tsx                |   4 +-
 .../src/utilities/TooltipTemplateControl.tsx       |   2 +-
 .../src/utilities/sharedDndControls.tsx            |   2 +-
 .../src/utilities/tooltipUtils.tsx                 |   3 +-
 .../src/Bubble/controlPanel.ts                     |   2 +-
 .../legacy-preset-chart-nvd3/src/Bubble/index.js   |   3 +-
 .../src/Bullet/controlPanel.ts                     |   2 +-
 .../legacy-preset-chart-nvd3/src/Bullet/index.js   |   3 +-
 .../src/Compare/controlPanel.ts                    |   2 +-
 .../legacy-preset-chart-nvd3/src/Compare/index.js  |   3 +-
 .../legacy-preset-chart-nvd3/src/NVD3Controls.tsx  |   2 +-
 .../legacy-preset-chart-nvd3/src/NVD3Vis.js        |   2 +-
 .../src/TimePivot/controlPanel.ts                  |   2 +-
 .../src/TimePivot/index.js                         |   3 +-
 .../src/vendor/superset/AnnotationTypes.js         |   2 +-
 .../src/AgGridTable/components/CustomHeader.tsx    |  82 +-
 .../src/AgGridTable/components/Pagination.tsx      |   2 +-
 .../components/TimeComparisonVisibility.tsx        |   2 +-
 .../src/AgGridTable/index.tsx                      |  94 +-
 .../src/AgGridTableChart.tsx                       |  93 +-
 .../plugin-chart-ag-grid-table/src/buildQuery.ts   | 158 +++-
 .../plugin-chart-ag-grid-table/src/consts.ts       |  15 +
 .../src/controlPanel.tsx                           |   2 +-
 .../plugin-chart-ag-grid-table/src/index.ts        |   3 +-
 .../src/renderers/NumericCellRenderer.tsx          |  14 +-
 .../src/renderers/TextCellRenderer.tsx             |   3 +-
 .../src/stateConversion.ts                         | 185 +++-
 .../src/transformProps.ts                          |   2 +-
 .../plugin-chart-ag-grid-table/src/types.ts        |  23 +-
 .../src/utils/agGridFilterConverter.ts             | 726 ++++++++++++++++
 .../src/utils/filterStateManager.ts                | 164 ++++
 .../src/utils/getInitialFilterModel.ts}            |  44 +-
 .../src/utils/useColDefs.ts                        |  89 +-
 .../test/buildQuery.test.ts                        | 591 +++++++++++++
 .../test/utils/agGridFilterConverter.test.ts       | 863 ++++++++++++++++++
 .../test/utils/filterStateManager.test.ts          | 658 ++++++++++++++
 .../test/utils/getInitialFilterModel.test.ts       | 412 +++++++++
 .../src/plugin/controlPanel.ts                     |   3 +-
 .../plugin-chart-cartodiagram/src/plugin/index.ts  |   3 +-
 .../src/util/controlPanelUtil.tsx                  |   2 +-
 .../BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx |   2 +-
 .../BigNumberPeriodOverPeriod/controlPanel.ts      |   2 +-
 .../BigNumber/BigNumberPeriodOverPeriod/index.ts   |   3 +-
 .../src/BigNumber/BigNumberTotal/controlPanel.ts   |   3 +-
 .../src/BigNumber/BigNumberTotal/index.ts          |   3 +-
 .../src/BigNumber/BigNumberViz.tsx                 |   2 +-
 .../BigNumberWithTrendline/controlPanel.tsx        |   3 +-
 .../src/BigNumber/BigNumberWithTrendline/index.ts  |   3 +-
 .../BigNumberWithTrendline/transformProps.ts       |   2 +-
 .../src/BigNumber/sharedControls.ts                |   2 +-
 .../src/BoxPlot/controlPanel.ts                    |   2 +-
 .../plugin-chart-echarts/src/BoxPlot/index.ts      |   3 +-
 .../src/Bubble/controlPanel.tsx                    |   2 +-
 .../plugin-chart-echarts/src/Bubble/index.ts       |   3 +-
 .../src/Funnel/controlPanel.tsx                    |   2 +-
 .../plugin-chart-echarts/src/Funnel/index.ts       |   3 +-
 .../src/Gantt/EchartsGantt.tsx                     |   2 +-
 .../src/Gantt/controlPanel.tsx                     |   2 +-
 .../plugin-chart-echarts/src/Gantt/index.ts        |   3 +-
 .../src/Gantt/transformProps.ts                    |   2 +-
 .../src/Gauge/controlPanel.tsx                     |   2 +-
 .../plugin-chart-echarts/src/Gauge/index.ts        |   3 +-
 .../src/Graph/controlPanel.tsx                     |   2 +-
 .../plugin-chart-echarts/src/Graph/index.ts        |   3 +-
 .../src/Heatmap/controlPanel.tsx                   |   3 +-
 .../plugin-chart-echarts/src/Heatmap/index.ts      |   3 +-
 .../src/Heatmap/transformProps.ts                  |   2 +-
 .../src/Histogram/controlPanel.tsx                 |   3 +-
 .../plugin-chart-echarts/src/Histogram/index.ts    |   3 +-
 .../src/MixedTimeseries/controlPanel.tsx           |   3 +-
 .../src/MixedTimeseries/index.ts                   |   3 +-
 .../plugin-chart-echarts/src/Pie/controlPanel.tsx  |   3 +-
 .../plugins/plugin-chart-echarts/src/Pie/index.ts  |   3 +-
 .../plugin-chart-echarts/src/Pie/transformProps.ts |   2 +-
 .../src/Radar/controlPanel.tsx                     |   2 +-
 .../plugin-chart-echarts/src/Radar/index.ts        |   3 +-
 .../src/Sankey/controlPanel.tsx                    |   3 +-
 .../plugin-chart-echarts/src/Sankey/index.ts       |   3 +-
 .../src/Sunburst/controlPanel.tsx                  |   2 +-
 .../plugin-chart-echarts/src/Sunburst/index.ts     |   3 +-
 .../src/Sunburst/transformProps.ts                 |   2 +-
 .../src/Timeseries/Area/controlPanel.tsx           |   2 +-
 .../src/Timeseries/Area/index.ts                   |   3 +-
 .../src/Timeseries/Regular/Bar/controlPanel.tsx    |   3 +-
 .../src/Timeseries/Regular/Bar/index.ts            |   3 +-
 .../src/Timeseries/Regular/Line/controlPanel.tsx   |   2 +-
 .../src/Timeseries/Regular/Line/index.ts           |   3 +-
 .../Timeseries/Regular/Scatter/controlPanel.tsx    |   2 +-
 .../src/Timeseries/Regular/Scatter/index.ts        |   3 +-
 .../Timeseries/Regular/SmoothLine/controlPanel.tsx |   2 +-
 .../src/Timeseries/Regular/SmoothLine/index.ts     |   3 +-
 .../src/Timeseries/Step/controlPanel.tsx           |   2 +-
 .../src/Timeseries/Step/index.ts                   |   3 +-
 .../src/Timeseries/constants.ts                    |   2 +-
 .../plugin-chart-echarts/src/Timeseries/index.ts   |   3 +-
 .../src/Timeseries/transformProps.ts               |   2 +-
 .../plugin-chart-echarts/src/Tree/controlPanel.tsx |   2 +-
 .../plugins/plugin-chart-echarts/src/Tree/index.ts |   2 +-
 .../src/Treemap/controlPanel.tsx                   |   2 +-
 .../plugin-chart-echarts/src/Treemap/index.ts      |   3 +-
 .../src/Waterfall/constants.ts                     |   2 +-
 .../src/Waterfall/controlPanel.tsx                 |   2 +-
 .../plugin-chart-echarts/src/Waterfall/index.ts    |   3 +-
 .../plugins/plugin-chart-echarts/src/constants.ts  |   3 +-
 .../plugins/plugin-chart-echarts/src/controls.tsx  |   3 +-
 .../plugin-chart-echarts/src/utils/series.ts       |   3 -
 .../src/components/Handlebars/HandlebarsViewer.tsx |   2 +-
 .../src/plugin/controlPanel.tsx                    |   2 +-
 .../src/plugin/controls/columns.tsx                |   3 +-
 .../src/plugin/controls/handlebarTemplate.tsx      |   3 +-
 .../src/plugin/controls/includeTime.ts             |   2 +-
 .../src/plugin/controls/metrics.tsx                |   2 +-
 .../src/plugin/controls/orderBy.tsx                |   2 +-
 .../src/plugin/controls/queryMode.tsx              |   3 +-
 .../src/plugin/controls/shared.ts                  |   8 +-
 .../src/plugin/controls/style.tsx                  |   2 +-
 .../plugin-chart-handlebars/src/plugin/index.ts    |   3 +-
 .../src/PivotTableChart.tsx                        |   2 +-
 .../src/plugin/controlPanel.tsx                    |   2 +-
 .../plugin-chart-pivot-table/src/plugin/index.ts   |   2 +-
 .../src/react-pivottable/TableRenderers.jsx        |   3 +-
 .../src/react-pivottable/utilities.js              |   2 +-
 .../src/DataTable/components/SelectPageSize.tsx    |   2 +-
 .../plugins/plugin-chart-table/src/TableChart.tsx  |  11 +-
 .../plugins/plugin-chart-table/src/consts.ts       |   2 +-
 .../plugin-chart-table/src/controlPanel.tsx        |   2 +-
 .../plugins/plugin-chart-table/src/index.ts        |   3 +-
 .../plugin-chart-table/src/transformProps.ts       |   2 +-
 .../plugins/plugin-chart-table/test/testData.ts    |   1 +
 .../src/plugin/controlPanel.tsx                    |   3 +-
 .../plugin/controls/ColorSchemeControl/index.tsx   |   2 +-
 .../src/plugin/controls/RotationControl.tsx        |   2 +-
 .../plugin-chart-word-cloud/src/plugin/index.ts    |   3 +-
 superset-frontend/spec/helpers/shim.tsx            |   2 +-
 superset-frontend/src/SqlLab/actions/sqlLab.ts     |   2 +-
 .../SqlLab/components/AceEditorWrapper/index.tsx   |  26 +-
 .../components/AceEditorWrapper/useAnnotations.ts  |   3 +-
 .../components/AceEditorWrapper/useKeywords.ts     |   3 +-
 .../src/SqlLab/components/App/index.tsx            |   2 +-
 .../src/SqlLab/components/AppLayout/index.tsx      |  22 +-
 .../src/SqlLab/components/ColumnElement/index.tsx  |   2 +-
 .../EditorAutoSync/EditorAutoSync.test.tsx         |   6 +-
 .../src/SqlLab/components/EditorAutoSync/index.tsx |   2 +-
 .../EstimateQueryCostButton.test.tsx               |  28 +-
 .../components/EstimateQueryCostButton/index.tsx   |  11 +-
 .../components/ExploreCtasResultsButton/index.tsx  |   3 +-
 .../components/ExploreResultsButton/index.tsx      |   2 +-
 .../src/SqlLab/components/HighlightedSql/index.tsx |   2 +-
 .../components/KeyboardShortcutButton/index.tsx    |   2 +-
 .../src/SqlLab/components/QueryHistory/index.tsx   |   3 +-
 .../QueryLimitSelect/QueryLimitSelect.test.tsx     |   3 +-
 .../SqlLab/components/QueryLimitSelect/index.tsx   |  30 +-
 .../src/SqlLab/components/QueryTable/index.tsx     |   3 +-
 .../SqlLab/components/ResultSet/ResultSet.test.tsx | 141 +++
 .../src/SqlLab/components/ResultSet/index.tsx      |   6 +-
 .../RunQueryActionButton.test.tsx                  |   1 -
 .../components/RunQueryActionButton/index.tsx      |  40 +-
 .../SaveDatasetActionButton.test.tsx               |  39 +-
 .../components/SaveDatasetActionButton/index.tsx   |  49 +-
 .../SqlLab/components/SaveDatasetModal/index.tsx   |   2 +-
 .../SqlLab/components/SaveQuery/SaveQuery.test.tsx |  23 +-
 .../src/SqlLab/components/SaveQuery/index.tsx      |  24 +-
 .../components/ScheduleQueryButton/index.tsx       |   2 +-
 .../SqlLab/components/ShareSqlLabQuery/index.tsx   |  13 +-
 .../src/SqlLab/components/SouthPane/Results.tsx    |   3 +-
 .../src/SqlLab/components/SouthPane/index.tsx      |  25 +-
 .../SqlLab/components/SqlEditor/SqlEditor.test.tsx |   6 +-
 .../src/SqlLab/components/SqlEditor/index.tsx      | 251 +++---
 .../SqlLab/components/SqlEditorLeftBar/index.tsx   |  92 +-
 .../SqlLab/components/SqlEditorTabHeader/index.tsx |   3 +-
 .../SqlEditorTopBar/SqlEditorTopBar.test.tsx       | 130 +++
 .../SqlLab/components/SqlEditorTopBar/index.tsx    |  62 ++
 .../SqlEditorTopBar/useDatabaseSelector.test.ts    | 320 +++++++
 .../SqlEditorTopBar/useDatabaseSelector.ts         | 126 +++
 .../components/StatusBar/StatusBar.test.tsx}       |  38 +-
 .../src/SqlLab/components/StatusBar/index.tsx      |  57 ++
 .../SqlLab/components/TabbedSqlEditors/index.tsx   |  43 +-
 .../src/SqlLab/components/TableElement/index.tsx   |   2 +-
 .../src/SqlLab/components/TablePreview/index.tsx   |   3 +-
 .../components/TemplateParamsEditor/index.tsx      |   2 +-
 superset-frontend/src/SqlLab/constants.ts          |   5 +-
 superset-frontend/src/SqlLab/contributions.ts      |   4 +-
 .../src/SqlLab/reducers/getInitialState.ts         |   2 +-
 superset-frontend/src/SqlLab/reducers/sqlLab.ts    |   3 +-
 .../src/SqlLab/utils/newQueryTabName.ts            |   2 +-
 .../src/components/AlteredSliceTag/index.tsx       |   2 +-
 .../src/components/AuditInfo/index.tsx             |   2 +-
 superset-frontend/src/components/Chart/Chart.tsx   |   3 +-
 .../Chart/ChartContextMenu/ChartContextMenu.tsx    |   2 +-
 .../src/components/Chart/ChartRenderer.jsx         |  16 +-
 .../src/components/Chart/DrillBy/DrillByModal.tsx  |   2 +-
 .../components/Chart/DrillBy/DrillBySubmenu.tsx    |   2 +-
 .../Chart/DrillBy/useDisplayModeToggle.tsx         |   2 +-
 .../Chart/DrillBy/useResultsTableView.tsx          |   3 +-
 .../Chart/DrillDetail/DrillDetailModal.tsx         |   2 +-
 .../Chart/DrillDetail/DrillDetailPane.tsx          |   2 +-
 .../Chart/DrillDetail/DrillDetailTableControls.tsx |   2 +-
 .../src/components/Chart/chartAction.js            |   2 +-
 .../src/components/Chart/chartReducer.ts           |   2 +-
 .../Chart/useDrillDetailMenuItems/index.tsx        |   2 +-
 .../src/components/CopyToClipboard/index.tsx       |   2 +-
 .../src/components/DatabaseSelector/index.tsx      |   3 +-
 .../Datasource/ChangeDatasourceModal/index.tsx     |   3 +-
 .../Datasource/DatasourceModal/index.tsx           |   2 +-
 .../components/CollectionTable/index.tsx           |   2 +-
 .../DatasourceEditor/DatasourceEditor.jsx          |   2 +-
 .../components/DatasetUsageTab/index.tsx           |   2 +-
 .../src/components/Datasource/utils/index.js       |   3 +-
 .../src/components/Datasource/utils/utils.test.tsx |   2 +-
 .../src/components/DynamicPlugins/index.tsx        |   2 +-
 .../src/components/ErrorBoundary/index.tsx         |   2 +-
 .../ErrorMessage/DatabaseErrorMessage.tsx          |   3 +-
 .../ErrorMessage/DatasetNotFoundErrorMessage.tsx   |   2 +-
 .../src/components/ErrorMessage/ErrorAlert.tsx     |   2 +-
 .../ErrorMessage/ErrorMessageWithStackTrace.tsx    |   3 +-
 .../ErrorMessage/FrontendNetworkErrorMessage.tsx   |   2 +-
 .../ErrorMessage/InvalidSQLErrorMessage.tsx        |   2 +-
 .../ErrorMessage/MarshmallowErrorMessage.tsx       |   2 +-
 .../ErrorMessage/OAuth2RedirectMessage.tsx         |   3 +-
 .../ErrorMessage/ParameterErrorMessage.tsx         |   3 +-
 .../ErrorMessage/TimeoutErrorMessage.tsx           |   3 +-
 .../src/components/FilterableTable/utils.tsx       |   3 +-
 .../src/components/GridTable/Header.tsx            |   2 +-
 .../src/components/GridTable/HeaderMenu.tsx        |   2 +-
 .../src/components/ImportModal/ErrorAlert.tsx      |   2 +-
 .../components/ImportModal/ImportErrorAlert.tsx    |   2 +-
 .../src/components/ImportModal/index.tsx           |   2 +-
 .../src/components/LastQueriedLabel/index.tsx      |  57 ++
 .../src/components/ListView/CardSortSelect.tsx     |   2 +-
 .../src/components/ListView/CrossLinksTooltip.tsx  |   2 +-
 .../src/components/ListView/Filters/DateRange.tsx  |   2 +-
 .../components/ListView/Filters/NumericalRange.tsx |   2 +-
 .../src/components/ListView/Filters/Search.tsx     |   2 +-
 .../src/components/ListView/Filters/Select.tsx     |   2 +-
 .../src/components/ListView/ListView.tsx           |   2 +-
 .../MenuListExtension/MenuListExtension.test.tsx   | 374 ++++++++
 .../src/components/MenuListExtension/index.tsx     | 157 ++++
 .../src/components/Modal/StandardModal.tsx         |   2 +-
 .../src/components/Modal/useModalValidation.tsx    |   2 +-
 .../src/components/RowCountLabel/index.tsx         |   3 +-
 .../components/SQLEditorWithValidation/index.tsx   |   3 +-
 .../StreamingExportModal/StreamingExportModal.tsx  |   2 +-
 .../useStreamingExport.test.ts                     | 959 +++++++++++++++++++++
 .../StreamingExportModal/useStreamingExport.ts     |  57 +-
 .../src/components/TableSelector/index.tsx         |   7 +-
 superset-frontend/src/components/Tag/utils.tsx     |   2 +-
 .../ViewListExtension/ViewListExtension.test.tsx   | 198 +++++
 .../ViewListExtension/index.tsx}                   |  34 +-
 superset-frontend/src/core/commands/index.ts       |   2 +-
 .../dashboard/actions/chartCustomizationActions.ts |   3 +-
 .../src/dashboard/actions/dashboardInfo.ts         |   3 +-
 .../src/dashboard/actions/dashboardLayout.js       |   2 +-
 .../src/dashboard/actions/dashboardState.js        |  16 +-
 .../src/dashboard/actions/sliceEntities.ts         |   2 +-
 .../components/AddSliceCard/AddSliceCard.tsx       |   3 +-
 .../src/dashboard/components/AnchorLink/index.tsx  |   2 +-
 .../components/BuilderComponentPane/index.tsx      |   2 +-
 .../components/ColorSchemeControlWrapper.tsx       |   3 +-
 .../src/dashboard/components/ColorSchemeSelect.tsx |   2 +-
 .../src/dashboard/components/Dashboard.jsx         |   2 +-
 .../DashboardBuilder/DashboardBuilder.tsx          |   3 +-
 .../src/dashboard/components/DashboardGrid.jsx     |   4 +-
 .../dashboard/components/EmbeddedModal/index.tsx   |   2 +-
 .../components/FiltersBadge/DetailsPanel/index.tsx |   2 +-
 .../dashboard/components/FiltersBadge/index.tsx    |   2 +-
 .../dashboard/components/GroupByBadge/index.tsx    |   2 +-
 .../src/dashboard/components/Header/index.jsx      |   3 +-
 .../components/Header/useDashboardMetadataBar.tsx  |   2 +-
 .../Header/useHeaderActionsDropdownMenu.tsx        |   2 +-
 .../src/dashboard/components/MissingChart.tsx      |   2 +-
 .../OverwriteConfirm/OverwriteConfirmModal.tsx     |   2 +-
 .../PropertiesModal/PropertiesModal.test.tsx       |  16 +-
 .../dashboard/components/PropertiesModal/index.tsx |  17 +-
 .../PropertiesModal/sections/AccessSection.tsx     |   3 +-
 .../PropertiesModal/sections/AdvancedSection.tsx   |   2 +-
 .../PropertiesModal/sections/BasicInfoSection.tsx  |   2 +-
 .../sections/CertificationSection.tsx              |   2 +-
 .../PropertiesModal/sections/RefreshSection.tsx    |   2 +-
 .../sections/StylingSection.test.tsx               |  45 +
 .../PropertiesModal/sections/StylingSection.tsx    |  51 +-
 .../dashboard/components/PublishedStatus/index.tsx |   2 +-
 .../RefreshFrequency/RefreshFrequencySelect.tsx    |   2 +-
 .../dashboard/components/RefreshIntervalModal.tsx  |   2 +-
 .../src/dashboard/components/SaveModal.tsx         |   2 +-
 .../src/dashboard/components/SliceAdder.tsx        |   2 +-
 .../src/dashboard/components/SliceHeader/index.tsx |   6 +-
 .../ViewResultsModalTrigger.tsx                    |   2 +-
 .../components/SliceHeaderControls/index.tsx       |  25 +-
 .../components/SliceHeaderControls/types.ts        |   1 +
 .../components/URLShortLinkButton/index.tsx        |   9 +-
 .../components/filterscope/FilterScopeSelector.jsx |   3 +-
 .../dashboard/components/filterscope/treeIcons.tsx |   2 +-
 .../components/gridComponents/Chart/Chart.jsx      |  34 +-
 .../components/gridComponents/Column/Column.jsx    |   3 +-
 .../DynamicComponent/DynamicComponent.tsx          |   3 +-
 .../gridComponents/Markdown/Markdown.jsx           |   3 +-
 .../components/gridComponents/Row/Row.tsx          |   8 +-
 .../components/gridComponents/Tab/Tab.jsx          |  25 +-
 .../components/gridComponents/Tab/Tab.test.tsx     | 103 +++
 .../components/gridComponents/Tabs/Tabs.jsx        |   4 +-
 .../components/gridComponents/new/NewColumn.tsx    |   2 +-
 .../components/gridComponents/new/NewDivider.tsx   |   2 +-
 .../components/gridComponents/new/NewHeader.tsx    |   2 +-
 .../components/gridComponents/new/NewMarkdown.tsx  |   2 +-
 .../components/gridComponents/new/NewRow.tsx       |   2 +-
 .../components/gridComponents/new/NewTabs.tsx      |   2 +-
 .../components/menu/BackgroundStyleDropdown.tsx    |   2 +-
 .../components/menu/DownloadMenuItems/index.tsx    |   4 +-
 .../components/menu/MarkdownModeDropdown.tsx       |   2 +-
 .../components/menu/ShareMenuItems/index.tsx       |   9 +-
 .../ChartCustomization/ChartCustomizationForm.tsx  |   2 +-
 .../ChartCustomization/ChartCustomizationModal.tsx |   2 +-
 .../ChartCustomizationTitleContainer.tsx           |   2 +-
 .../ChartCustomizationTitlePane.tsx                |   2 +-
 .../ChartCustomization/GroupByFilterCard.tsx       |   3 +-
 .../nativeFilters/ChartCustomization/utils.ts      |   2 +-
 .../nativeFilters/ConfigModal/ModalFooter.tsx      |   2 +-
 .../FilterBar/ActionButtons/index.tsx              |   2 +-
 .../FilterBar/CrossFilters/CrossFilterTitle.tsx    |   3 +-
 .../ScopingModal/ChartsScopingListPanel.tsx        |   2 +-
 .../CrossFilters/ScopingModal/ScopingModal.tsx     |   3 +-
 .../CrossFilters/ScopingModal/ScopingTreePanel.tsx |   3 +-
 .../FilterBar/CrossFilters/VerticalCollapse.tsx    |   2 +-
 .../FilterBar/FilterBarSettings/index.tsx          |   2 +-
 .../FilterBar/FilterControls/FilterControls.tsx    |   2 +-
 .../FilterBar/FilterControls/FilterValue.tsx       |   2 +-
 .../FiltersOutOfScopeCollapsible/index.tsx         |   3 +-
 .../nativeFilters/FilterBar/Header/index.tsx       |   2 +-
 .../nativeFilters/FilterBar/Horizontal.tsx         |   3 +-
 .../nativeFilters/FilterBar/Vertical.tsx           |   2 +-
 .../nativeFilters/FilterBar/keyValue.tsx           |   3 +-
 .../nativeFilters/FilterCard/DependenciesRow.tsx   |   3 +-
 .../nativeFilters/FilterCard/ScopeRow.tsx          |   3 +-
 .../nativeFilters/FilterCard/TypeRow.tsx           |   3 +-
 .../nativeFilters/FilterCard/useFilterScope.ts     |   3 +-
 .../FiltersConfigModal/DividerConfigForm.tsx       |   3 +-
 .../FiltersConfigModal/FilterTitleContainer.tsx    |   2 +-
 .../FiltersConfigModal/FilterTitlePane.tsx         |   3 +-
 .../FiltersConfigForm/ColumnSelect.tsx             |   2 +-
 .../FiltersConfigForm/DatasetSelect.tsx            |   2 +-
 .../FiltersConfigForm/DefaultValue.tsx             |   2 +-
 .../FiltersConfigForm/DependencyList.tsx           |   2 +-
 .../FiltersConfigForm/FilterScope/state.ts         |   2 +-
 .../FiltersConfigForm/FilterScope/utils.ts         |   4 +-
 .../FiltersConfigForm/FiltersConfigForm.tsx        |   2 +-
 .../FiltersConfigForm/RemovedFilter.tsx            |   2 +-
 .../FiltersConfigForm/getControlItemsMap.tsx       |   3 +-
 .../FiltersConfigModal/FiltersConfigForm/state.ts  |   3 +-
 .../FiltersConfigModal/FiltersConfigModal.tsx      |   3 +-
 .../Footer/CancelConfirmationAlert.tsx             |   2 +-
 .../FiltersConfigModal/Footer/Footer.tsx           |   2 +-
 .../nativeFilters/FiltersConfigModal/utils.ts      |   2 +-
 .../dashboard/components/nativeFilters/utils.ts    |   2 +-
 .../src/dashboard/containers/DashboardPage.tsx     |  19 +-
 .../src/dashboard/hooks/useDownloadScreenshot.ts   |   9 +-
 .../src/dashboard/reducers/sliceEntities.ts        |   2 +-
 .../src/dashboard/util/backgroundStyleOptions.ts   |   2 +-
 .../src/dashboard/util/getFilterFieldNodesTree.ts  |   2 +-
 .../src/dashboard/util/getFilterScopeNodesTree.js  |   2 +-
 .../src/dashboard/util/getSliceHeaderTooltip.tsx   |   2 +-
 .../src/dashboard/util/headerStyleOptions.ts       |   2 +-
 .../src/dashboard/util/newComponentFactory.js      |   2 +-
 .../dashboard/util/updateComponentParentsList.ts   |   2 +-
 superset-frontend/src/embedded/api.tsx             |   4 +-
 superset-frontend/src/embedded/index.tsx           |   4 +-
 superset-frontend/src/embedded/utils.ts            |   3 +-
 .../src/explore/actions/exploreActions.ts          |   3 +-
 .../src/explore/actions/saveModalActions.ts        |   2 +-
 .../src/explore/components/ControlHeader.tsx       |   2 +-
 .../components/ControlPanelsContainer.test.tsx     |   2 +-
 .../explore/components/ControlPanelsContainer.tsx  |   2 +-
 .../explore/components/DataTableControl/index.tsx  |   8 +-
 .../components/DataTablesPane/DataTablesPane.tsx   |   3 +-
 .../components/ResultsPaneOnDashboard.tsx          |   2 +-
 .../DataTablesPane/components/SamplesPane.tsx      |   3 +-
 .../components/SingleQueryResultPane.tsx           |   2 +-
 .../DataTablesPane/components/useResultsPane.tsx   |   2 +-
 .../DatasourcePanel/DatasourcePanelItem.tsx        |   3 +-
 .../explore/components/DatasourcePanel/index.tsx   |   3 +-
 .../DatasourcePanel/transformDatasourceFolders.ts  |   3 +-
 .../src/explore/components/EmbedCodeContent.jsx    |  11 +-
 .../components/ExploreChartHeader/index.jsx        |   5 +-
 .../ExploreChartHeader/useExploreMetadataBar.tsx   |   3 +-
 .../explore/components/ExploreChartPanel/index.tsx |  17 +-
 .../components/ExploreViewContainer/index.jsx      |   5 +-
 .../components/ExportToCSVDropdown/index.tsx       |   2 +-
 .../explore/components/PropertiesModal/index.tsx   |   2 +-
 .../explore/components/RunQueryButton/index.tsx    |   2 +-
 .../src/explore/components/SaveModal.tsx           |   9 +-
 .../AnnotationLayerControl/AnnotationLayer.tsx     |   2 +-
 .../AnnotationLayerControl/AnnotationTypes.ts      |   2 +-
 .../controls/AnnotationLayerControl/index.tsx      |   2 +-
 .../explore/components/controls/BoundsControl.tsx  |   2 +-
 .../controls/CollectionControl/index.tsx           |   2 +-
 .../ColorBreakpointPopoverControl.tsx              |   3 +-
 .../controls/ColorBreakpointsControl/index.tsx     |   2 +-
 .../controls/ColorSchemeControl/index.tsx          |   2 +-
 .../ColumnConfigControl/ColumnConfigControl.tsx    |   2 +-
 .../controls/ColumnConfigControl/constants.tsx     |   3 +-
 .../components/controls/ComparisonRangeLabel.tsx   |   2 +-
 .../ConditionalFormattingControl.tsx               |   2 +-
 .../FormattingPopoverContent.tsx                   |   2 +-
 .../controls/ContourControl/ContourOption.tsx      |   2 +-
 .../ContourControl/ContourPopoverControl.tsx       |   3 +-
 .../components/controls/ContourControl/index.tsx   |   2 +-
 .../controls/CurrencyControl/CurrencyControl.tsx   |   8 +-
 .../controls/DatasourceControl/index.tsx           |   8 +-
 .../controls/DateFilterControl/DateFilterLabel.tsx |   2 +-
 .../DateFilterControl/components/AdvancedFrame.tsx |   3 +-
 .../DateFilterControl/components/CalendarFrame.tsx |   2 +-
 .../DateFilterControl/components/CommonFrame.tsx   |   2 +-
 .../components/CurrentCalendarFrame.tsx            |   2 +-
 .../DateFilterControl/components/CustomFrame.tsx   |   3 +-
 .../components/DateFunctionTooltip.tsx             |   2 +-
 .../DateFilterControl/components/DateLabel.tsx     |   2 +-
 .../controls/DateFilterControl/utils/constants.ts  |   2 +-
 .../DndColumnSelectControl/ColumnSelectPopover.tsx |   2 +-
 .../ColumnSelectPopoverTrigger.tsx                 |   2 +-
 .../DndAdhocFilterOption.tsx                       |   2 +-
 .../DndColumnMetricSelect.tsx                      |   4 +-
 .../DndColumnSelectControl/DndColumnSelect.tsx     |  10 +-
 .../DndColumnSelectPopoverTitle.tsx                |   2 +-
 .../DndColumnSelectControl/DndFilterSelect.tsx     |   3 +-
 .../DndColumnSelectControl/DndMetricSelect.tsx     |   4 +-
 .../DndColumnSelectControl/DndSelectLabel.tsx      |   2 +-
 .../controls/DndColumnSelectControl/Option.tsx     |   2 +-
 .../DndColumnSelectControl/utils/optionSelector.ts |   2 +-
 .../FilterControl/AdhocFilterControl/index.tsx     |   4 +-
 .../FilterControl/AdhocFilterEditPopover/index.tsx |   3 +-
 .../index.tsx                                      |   2 +-
 .../useAdvancedDataTypes.ts                        |   3 +-
 .../AdhocFilterEditPopoverSqlTabContent/index.tsx  |   2 +-
 .../utils/useDatePickerInAdhocFilter.tsx           |   3 +-
 .../controls/FixedOrMetricControl/index.tsx        |   2 +-
 .../controls/LayerConfigsControl/FlatLayerTree.tsx |   2 +-
 .../LayerConfigsControl/LayerConfigsControl.tsx    |   2 +-
 .../LayerConfigsPopoverContent.tsx                 |   3 +-
 .../controls/MapViewControl/ExtentTag.tsx          |   2 +-
 .../controls/MapViewControl/MapViewControl.tsx     |   2 +-
 .../MapViewControl/MapViewPopoverContent.tsx       |   2 +-
 .../controls/MatrixifyDimensionControl.tsx         |   3 +-
 .../MetricControl/AdhocMetricEditPopover/index.tsx |   3 +-
 .../MetricControl/AdhocMetricEditPopoverTitle.tsx  |   2 +-
 .../MetricControl/AdhocMetricPopoverTrigger.tsx    |   3 +-
 .../controls/MetricControl/MetricsControl.tsx      |   3 +-
 .../controls/NumberControl/NumberControl.test.tsx  |  50 +-
 .../components/controls/NumberControl/index.tsx    |  14 +-
 .../components/controls/OptionControls/index.tsx   |   2 +-
 .../controls/SelectAsyncControl/index.tsx          |   3 +-
 .../explore/components/controls/SelectControl.tsx  |   3 +-
 .../explore/components/controls/SpatialControl.tsx |   2 +-
 .../components/controls/TextAreaControl.tsx        |   2 +-
 .../controls/TimeSeriesColumnControl/index.tsx     |   2 +-
 .../src/explore/components/controls/ViewQuery.tsx  |   3 +-
 .../explore/components/controls/ViewQueryModal.tsx |   2 +-
 .../components/controls/ViewQueryModalFooter.tsx   |   3 +-
 .../components/controls/ViewportControl.tsx        |   2 +-
 .../components/controls/VizTypeControl/VizTile.tsx |   2 +-
 .../controls/VizTypeControl/VizTypeGallery.tsx     |   2 +-
 .../components/controls/VizTypeControl/index.tsx   |   3 +-
 .../ZoomConfigControl/ZoomConfigControl.tsx        |   2 +-
 .../ZoomConfigControl/ZoomConfigsChart.tsx         |   2 +-
 .../components/controls/withAsyncVerification.tsx  |   3 +-
 .../DashboardsSubMenu.tsx                          |   2 +-
 .../useExploreAdditionalActionsMenu/index.jsx      |  30 +-
 superset-frontend/src/explore/constants.ts         |   2 +-
 .../src/explore/controlPanels/Separator.ts         |   3 +-
 .../src/explore/controlPanels/sections.tsx         |   2 +-
 .../src/explore/controlUtils/controlUtils.test.tsx |   2 +-
 .../src/explore/controlUtils/getColumnKeywords.tsx |   2 +-
 superset-frontend/src/explore/controls.tsx         |   2 +-
 .../src/explore/exploreUtils/exportChart.test.ts   | 173 ++++
 superset-frontend/src/explore/fixtures.tsx         |   3 +-
 .../src/extensions/ExtensionPlaceholder.tsx        |   2 +-
 .../src/extensions/ExtensionsList.tsx              |   2 +-
 .../src/extensions/ExtensionsManager.ts            |   3 +-
 .../src/extensions/ExtensionsStartup.test.tsx      |   3 +-
 .../src/extensions/ExtensionsStartup.tsx           |   6 +-
 .../src/features/alerts/AlertReportModal.tsx       |   2 +-
 .../alerts/components/AlertReportCronScheduler.tsx |   2 +-
 .../features/alerts/components/AlertStatusIcon.tsx |   2 +-
 .../alerts/components/NotificationMethod.tsx       |   2 +-
 .../src/features/allEntities/AllEntitiesTable.tsx  |   2 +-
 .../annotationLayers/AnnotationLayerModal.tsx      |   2 +-
 .../src/features/annotations/AnnotationModal.tsx   |   2 +-
 .../src/features/charts/ChartCard.tsx              |   3 +-
 .../src/features/cssTemplates/CssTemplateModal.tsx |   2 +-
 .../src/features/dashboards/DashboardCard.tsx      |   2 +-
 .../DatabaseConnectionForm/CommonParameters.tsx    |   2 +-
 .../DatabaseConnectionForm/EncryptedField.tsx      |   2 +-
 .../DatabaseConnectionForm/TableCatalog.tsx        |   2 +-
 .../DatabaseConnectionForm/ValidatedInputField.tsx |   2 +-
 .../databases/DatabaseModal/ExtraOptions.test.tsx  |   2 +-
 .../databases/DatabaseModal/ExtraOptions.tsx       |   2 +-
 .../databases/DatabaseModal/ModalHeader.tsx        |   2 +-
 .../databases/DatabaseModal/SSHTunnelForm.tsx      |   2 +-
 .../databases/DatabaseModal/SSHTunnelSwitch.tsx    |   3 +-
 .../databases/DatabaseModal/SqlAlchemyForm.tsx     |   2 +-
 .../src/features/databases/DatabaseModal/index.tsx |   3 +-
 .../databases/UploadDataModel/ColumnsPreview.tsx   |   2 +-
 .../features/databases/UploadDataModel/index.tsx   |   3 +-
 .../AddDataset/DatasetPanel/DatasetPanel.tsx       |   2 +-
 .../AddDataset/DatasetPanel/MessageContent.tsx     |   2 +-
 .../datasets/AddDataset/DatasetPanel/index.tsx     |   4 +-
 .../datasets/AddDataset/EditDataset/index.tsx      |   2 +-
 .../features/datasets/AddDataset/Footer/index.tsx  |   2 +-
 .../features/datasets/AddDataset/Header/index.tsx  |   2 +-
 .../datasets/AddDataset/LeftPanel/index.tsx        |   2 +-
 .../features/datasets/DatasetSelectLabel/index.tsx |   2 +-
 .../features/datasets/DuplicateDatasetModal.tsx    |   2 +-
 .../src/features/datasets/constants.ts             |   2 +-
 .../src/features/datasets/hooks/useDatasetLists.ts |   4 +-
 .../datasets/hooks/useGetDatasetRelatedCounts.ts   |   4 +-
 .../datasets/metadataBar/useDatasetMetadataBar.tsx |   2 +-
 .../src/features/groups/GroupListModal.tsx         |   2 +-
 superset-frontend/src/features/groups/utils.ts     |   3 +-
 .../src/features/home/ActivityTable.tsx            |   2 +-
 superset-frontend/src/features/home/ChartTable.tsx |   2 +-
 .../src/features/home/DashboardTable.tsx           |   3 +-
 superset-frontend/src/features/home/EmptyState.tsx |   2 +-
 .../src/features/home/LanguagePicker.tsx           |   2 +-
 superset-frontend/src/features/home/RightMenu.tsx  |   3 +-
 .../src/features/home/SavedQueries.tsx             |   3 +-
 superset-frontend/src/features/home/SubMenu.tsx    |   2 +-
 .../src/features/home/commonMenuData.ts            |   2 +-
 .../src/features/queries/QueryPreviewModal.tsx     |   2 +-
 .../features/queries/SavedQueryPreviewModal.tsx    |   2 +-
 .../src/features/queries/SyntaxHighlighterCopy.tsx |   2 +-
 .../ReportModal/HeaderReportDropdown/index.tsx     |   2 +-
 .../src/features/reports/ReportModal/actions.js    |   3 +-
 .../src/features/reports/ReportModal/index.tsx     |   3 +-
 .../src/features/rls/RowLevelSecurityModal.tsx     |   3 +-
 superset-frontend/src/features/rls/constants.ts    |   2 +-
 .../src/features/roles/RoleFormItems.tsx           |   2 +-
 .../src/features/roles/RoleListAddModal.tsx        |   2 +-
 .../src/features/roles/RoleListDuplicateModal.tsx  |   2 +-
 .../src/features/roles/RoleListEditModal.tsx       |   2 +-
 .../src/features/tags/BulkTagModal.tsx             |   3 +-
 superset-frontend/src/features/tags/TagCard.tsx    |   3 +-
 superset-frontend/src/features/tags/TagModal.tsx   |   3 +-
 .../src/features/themes/ThemeModal.tsx             |   2 +-
 .../src/features/userInfo/UserInfoModal.tsx        |   3 +-
 .../src/features/users/UserListModal.tsx           |   2 +-
 superset-frontend/src/features/users/utils.ts      |   3 +-
 .../filters/components/Range/RangeFilterPlugin.tsx |   2 +-
 .../src/filters/components/Range/controlPanel.ts   |   2 +-
 .../src/filters/components/Range/index.ts          |   3 +-
 .../components/Select/SelectFilterPlugin.tsx       |   4 +-
 .../src/filters/components/Select/controlPanel.ts  |   3 +-
 .../src/filters/components/Select/index.ts         |   3 +-
 .../src/filters/components/Time/controlPanel.ts    |   2 +-
 .../src/filters/components/Time/index.ts           |   3 +-
 .../TimeColumn/TimeColumnFilterPlugin.tsx          |   3 +-
 .../filters/components/TimeColumn/controlPanel.ts  |   2 +-
 .../src/filters/components/TimeColumn/index.ts     |   3 +-
 .../components/TimeGrain/TimeGrainFilterPlugin.tsx |   4 +-
 .../filters/components/TimeGrain/controlPanel.ts   |   2 +-
 .../src/filters/components/TimeGrain/index.ts      |   3 +-
 .../src/hooks/apiResources/datasets.ts             |   2 +-
 superset-frontend/src/hooks/useThemeMenuItems.tsx  |   2 +-
 .../src/hooks/useUnsavedChangesPrompt/index.ts     |   3 +-
 superset-frontend/src/middleware/asyncEvent.ts     |   2 +-
 superset-frontend/src/pages/ActionLog/index.tsx    |   2 +-
 .../src/pages/AlertReportList/index.tsx            |   2 +-
 superset-frontend/src/pages/AllEntities/index.tsx  |   2 +-
 .../src/pages/AnnotationLayerList/index.tsx        |   3 +-
 .../src/pages/AnnotationList/index.tsx             |   3 +-
 superset-frontend/src/pages/Chart/index.tsx        |   2 +-
 .../src/pages/ChartCreation/index.tsx              |   3 +-
 superset-frontend/src/pages/ChartList/index.tsx    |   2 +-
 .../src/pages/CssTemplateList/index.tsx            |   3 +-
 .../src/pages/DashboardList/index.tsx              |   2 +-
 superset-frontend/src/pages/DatabaseList/index.tsx |   3 +-
 superset-frontend/src/pages/DatasetList/index.tsx  |   3 +-
 .../src/pages/ExecutionLogList/index.tsx           |   2 +-
 superset-frontend/src/pages/GroupsList/index.tsx   |   2 +-
 superset-frontend/src/pages/Home/index.tsx         |   2 +-
 superset-frontend/src/pages/Login/index.tsx        |   3 +-
 .../src/pages/QueryHistoryList/index.tsx           |   3 +-
 superset-frontend/src/pages/Register/index.tsx     |   3 +-
 superset-frontend/src/pages/RolesList/index.tsx    |   3 +-
 .../src/pages/RowLevelSecurityList/index.tsx       |   3 +-
 .../src/pages/SavedQueryList/index.tsx             |   2 +-
 superset-frontend/src/pages/Tags/index.tsx         |   3 +-
 superset-frontend/src/pages/ThemeList/index.tsx    |   3 +-
 superset-frontend/src/pages/UserInfo/index.tsx     |   3 +-
 .../src/pages/UserRegistrations/index.tsx          |   3 +-
 superset-frontend/src/pages/UsersList/index.tsx    |   2 +-
 superset-frontend/src/preamble.ts                  |  10 +-
 superset-frontend/src/setup/setupClient.ts         |   3 +-
 superset-frontend/src/types/bootstrapTypes.ts      |   4 +-
 superset-frontend/src/utils/downloadAsImage.tsx    |   2 +-
 superset-frontend/src/utils/downloadAsPdf.ts       |   3 +-
 superset-frontend/src/utils/export.test.ts         |  57 +-
 superset-frontend/src/utils/export.ts              |   8 +-
 superset-frontend/src/utils/fetchOptions.ts        |   3 +-
 .../utils/getChartRequiredFieldsMissingMessage.ts  |   2 +-
 superset-frontend/src/utils/urlUtils.ts            |  67 +-
 superset-frontend/src/views/CRUD/hooks.ts          |   2 +-
 superset-frontend/src/views/CRUD/utils.tsx         |   3 +-
 .../src/visualizations/TimeTable/TimeTable.tsx     |   2 +-
 .../TimeTable/config/controlPanel/controlPanel.ts  |   3 +-
 .../src/visualizations/TimeTable/index.ts          |   3 +-
 .../ExampleComponent/ExampleComponent.tsx          |   3 +-
 superset-websocket/package-lock.json               | 700 +++++----------
 superset-websocket/package.json                    |   8 +-
 superset/charts/schemas.py                         |   7 +
 superset/commands/report/create.py                 |  35 +
 superset/commands/report/exceptions.py             |  15 +
 superset/commands/streaming_export/base.py         |  55 +-
 superset/common/query_context_processor.py         |   1 +
 superset/common/utils/query_cache_manager.py       |  11 +
 superset/dashboards/schemas.py                     |   2 +
 superset/db_engine_specs/athena.py                 |  40 +
 superset/db_engine_specs/base.py                   |   6 +-
 superset/db_engine_specs/gsheets.py                |  33 +
 superset/db_engine_specs/starrocks.py              | 155 +++-
 superset/extensions/local_extensions_watcher.py    |  33 +-
 superset/mcp_service/__main__.py                   |   2 +-
 superset/mcp_service/app.py                        |  11 +-
 superset/mcp_service/chart/schemas.py              |  12 +-
 superset/mcp_service/chart/tool/generate_chart.py  |   6 +-
 superset/mcp_service/server.py                     |   4 +-
 superset/mcp_service/system/tool/get_schema.py     |  12 +-
 superset/mcp_service/system/tool/health_check.py   |   3 +-
 superset/models/helpers.py                         |  20 +-
 superset/reports/schemas.py                        |   2 +-
 superset/sql/parse.py                              |   2 +-
 superset/utils/core.py                             |   1 +
 superset/utils/date_parser.py                      |  38 +-
 superset/utils/excel.py                            |   2 +-
 .../commands/report/test_create_recipients.py      | 179 ++++
 tests/unit_tests/db_engine_specs/test_athena.py    |  70 ++
 tests/unit_tests/db_engine_specs/test_base.py      |  49 ++
 tests/unit_tests/db_engine_specs/test_gsheets.py   |   5 +
 tests/unit_tests/db_engine_specs/test_starrocks.py | 116 ++-
 .../mcp_service/chart/tool/test_generate_chart.py  |  21 +-
 .../mcp_service/test_mcp_tool_registration.py      |  42 +-
 tests/unit_tests/sql/parse_tests.py                |  14 +
 tests/unit_tests/sql_lab_test.py                   |   2 +-
 tests/unit_tests/utils/date_parser_tests.py        |  50 +-
 811 files changed, 10646 insertions(+), 3008 deletions(-)

diff --cc superset/utils/date_parser.py
index 0f874d8e8a,ba7642990c..066fd6dafc
--- a/superset/utils/date_parser.py
+++ b/superset/utils/date_parser.py
@@@ -234,67 -228,6 +234,67 @@@ def handle_end_of(base_expression: str
      raise ValueError(f"Invalid unit for 'end of': {unit}")
  
  
 +def handle_nth_of(
 +    ordinal: str,
 +    subunit: str | None,
 +    scope: str | None,
 +    unit: str,
 +    relative_start: str | None,
 +) -> str:
 +    """
 +    Handles "first" time expressions like "first of the month" or
 +    "first week of this year".
 +
 +    This handler returns either a single date expression or a range expression
 +    depending on whether a subunit is provided.
 +
 +    Args:
 +        ordinal: The ordinal word or number ("first", "1st")
 +        subunit: The smaller time unit ("week", "day", "month") or None
-         scope: Time scope ("this", "last", "next", "prior", "previous") or 
None
++        scope: Time scope ("this", "last", "next", "prior") or None
 +            (defaults to "this")
 +        unit: The larger time unit ("month", "year", "quarter", "week")
 +        relative_start: Optional user-provided base time
 +
 +    Returns:
 +        - Single date expression if subunit is None (e.g., "first of the 
month")
 +        - Range expression "since : until" if subunit is provided
 +          (e.g., "first week of year")
 +
 +    Examples:
 +        >>> handle_nth_of("first", None, "this", "month", None)
 +        "DATETRUNC(DATETIME('today'), month)"
 +
 +        >>> handle_nth_of("first", "week", "this", "year", None)
 +        "DATETRUNC(..., year) : DATEADD(DATETRUNC(..., year), 1, week)"
 +    """
 +    # Convert ordinal to number
 +    n = ORDINAL_MAP.get(ordinal.lower(), int(ordinal) if ordinal.isdigit() 
else 1)
 +
 +    relative_base = get_relative_base(unit, relative_start)
 +    effective_scope = scope.lower() if scope else "this"
 +
 +    # Get the start of the larger unit with scope applied
 +    base_expr = handle_scope_and_unit(effective_scope, "", unit, 
relative_base)
 +    start_of_unit = f"DATETRUNC({base_expr}, {unit.lower()})"
 +
 +    if subunit is None:
 +        # "first of the month" -> single date (first day of the unit)
 +        return start_of_unit
 +    else:
 +        # "first week of the year" -> range
 +        # Start: beginning of unit + (n-1) subunits
 +        if n == 1:
 +            range_start = start_of_unit
 +        else:
 +            range_start = f"DATEADD({start_of_unit}, {n - 1}, 
{subunit.lower()})"
 +
 +        # End: start + 1 subunit
 +        range_end = f"DATEADD({range_start}, 1, {subunit.lower()})"
 +
 +        return f"{range_start} : {range_end}"
 +
 +
  def handle_modifier_and_unit(
      modifier: str, scope: str, delta: str, unit: str, relative_base: str
  ) -> str:
@@@ -482,31 -415,13 +482,31 @@@ def get_since_until(  # pylint: disable
      ):
          time_range = "DATETRUNC(DATEADD(DATETIME('today'), 0, YEAR), YEAR) : 
DATETRUNC(DATEADD(DATETIME('today'), 1, YEAR), YEAR)"  # noqa: E501
  
 +    # Handle "first [subunit] of [scope] [unit]" patterns that produce a range
 +    # e.g., "first week of this year" -> returns start of year to end of 
first week
 +    # e.g., "first month of this quarter" -> returns start of first month to 
end
 +    # Note: "day" is NOT included as a subunit here because "first day of X" 
should
 +    # return a single date, not a range. Those are handled in 
time_range_lookup below.
 +    if time_range and separator not in time_range:
 +        nth_subunit_pattern = (
-             r"^(first|1st)\s+"
-             r"(week|month|quarter)\s+of\s+"
-             r"(?:(this|last|next|prior|previous)\s+)?"
-             r"(?:the\s+)?"
++            r"^(first|1st)\s{1,5}"
++            r"(week|month|quarter)\s{1,5}of\s{1,5}"
++            r"(?:(this|last|next|prior)\s{1,5})?"
++            r"(?:the\s{1,5})?"
 +            r"(week|month|quarter|year)$"
 +        )
 +        match = re.search(nth_subunit_pattern, time_range, re.IGNORECASE)
 +        if match:
 +            ordinal, subunit, scope, unit = match.groups()
 +            time_range = handle_nth_of(ordinal, subunit, scope, unit, 
relative_start)
 +
      if time_range and separator in time_range:
          time_range_lookup = [
              (
-                 r"^(start of|beginning of|end of)\s+"
-                 r"(this|last|next|prior|previous)\s+"
-                 r"([0-9]+)?\s*"
-                 r"(day|week|month|quarter|year)s?$",  # Matches "start of 
next month", "end of last year"  # noqa: E501
+                 r"^(start of|beginning of|end of)\s{1,5}"
+                 r"(this|last|next|prior)\s{1,5}"
+                 r"([0-9]+)?\s{0,5}"
 -                r"(day|week|month|quarter|year)s?$",  # Matches phrases like 
"start of next month" # noqa: E501
++                r"(day|week|month|quarter|year)s?$",  # Matches "start of 
next month"  # noqa: E501
                  lambda modifier, scope, delta, unit: handle_modifier_and_unit(
                      modifier,
                      scope,
@@@ -515,32 -430,10 +515,32 @@@
                      get_relative_base(unit, relative_start),
                  ),
              ),
 +            (
 +                # Pattern for "first of [scope] [unit]" - single date
 +                # e.g., "first of this month", "first of last year"
-                 r"^(first|1st)\s+"
-                 r"(?:day\s+)?of\s+"
-                 r"(this|last|next|prior|previous)\s+"
++                r"^(first|1st)\s{1,5}"
++                r"(?:day\s{1,5})?of\s{1,5}"
++                r"(this|last|next|prior)\s{1,5}"
 +                r"(day|week|month|quarter|year)s?$",
 +                lambda ordinal, scope, unit: handle_nth_of(
 +                    ordinal, None, scope, unit, relative_start
 +                ),
 +            ),
 +            (
 +                # Pattern for "first of the [unit]" - single date with 
default scope
 +                # e.g., "first of the month", "first day of the year"
-                 r"^(first|1st)\s+"
-                 r"(?:day\s+)?of\s+"
-                 r"(?:the\s+)?"
++                r"^(first|1st)\s{1,5}"
++                r"(?:day\s{1,5})?of\s{1,5}"
++                r"(?:the\s{1,5})?"
 +                r"(week|month|quarter|year)$",
 +                lambda ordinal, unit: handle_nth_of(
 +                    ordinal, None, None, unit, relative_start
 +                ),
 +            ),
              (
-                 r"^(this|last|next|prior|previous)\s+"
-                 r"([0-9]+)?\s*"
-                 r"(second|minute|day|week|month|quarter|year)s?$",  # Matches 
"next 5 days" or "last 2 weeks" # noqa: E501
+                 r"^(this|last|next|prior)\s{1,5}"
+                 r"([0-9]+)?\s{0,5}"
 -                r"(second|minute|day|week|month|quarter|year)s?$",  # Matches 
"next 5 days" or "last 2 weeks" # noqa: E501
++                r"(second|minute|day|week|month|quarter|year)s?$",  # Matches 
"next 5 days"  # noqa: E501
                  lambda scope, delta, unit: handle_scope_and_unit(
                      scope, delta, unit, get_relative_base(unit, 
relative_start)
                  ),
diff --cc tests/unit_tests/utils/date_parser_tests.py
index de23123988,525c531707..d5cb387f89
--- a/tests/unit_tests/utils/date_parser_tests.py
+++ b/tests/unit_tests/utils/date_parser_tests.py
@@@ -613,68 -613,48 +613,112 @@@ def test_date_range_migration() -> None
      assert not re.search(DateRangeMigration.x_dateunit, field)
  
  
 +@patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
 +def test_first_of_with_explicit_scope() -> None:
 +    """Test 'first of [scope] [unit]' expressions that return a single 
date."""
 +    result = get_since_until("first of this month : ")
 +    assert result == (datetime(2016, 11, 1), None)
 +
 +    result = get_since_until("first of last month : ")
 +    assert result == (datetime(2016, 10, 1), None)
 +
 +    result = get_since_until("first of next month : ")
 +    assert result == (datetime(2016, 12, 1), None)
 +
 +    result = get_since_until("first of prior month : ")
 +    assert result == (datetime(2016, 10, 1), None)
 +
-     result = get_since_until("first of previous month : ")
-     assert result == (datetime(2016, 10, 1), None)
- 
 +    result = get_since_until("first day of this year : ")
 +    assert result == (datetime(2016, 1, 1), None)
 +
 +    result = get_since_until("first day of last year : ")
 +    assert result == (datetime(2015, 1, 1), None)
 +
 +    result = get_since_until("first day of this week : ")
 +    assert result == (datetime(2016, 11, 7), None)
 +
 +
 +@patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
 +def test_first_of_with_default_scope() -> None:
 +    """Test 'first of the [unit]' expressions that default to 'this'."""
 +    result = get_since_until("first of the month : ")
 +    assert result == (datetime(2016, 11, 1), None)
 +
 +    result = get_since_until("first of the year : ")
 +    assert result == (datetime(2016, 1, 1), None)
 +
 +    result = get_since_until("first day of the month : ")
 +    assert result == (datetime(2016, 11, 1), None)
 +
 +    result = get_since_until("first day of the week : ")
 +    assert result == (datetime(2016, 11, 7), None)
 +
 +
 +@patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
 +def test_first_subunit_of_with_explicit_scope() -> None:
 +    """Test 'first [subunit] of [scope] [unit]' expressions that return a 
range."""
 +    result = get_since_until("first week of this year")
 +    assert result == (datetime(2016, 1, 1), datetime(2016, 1, 8))
 +
 +    result = get_since_until("first month of this quarter")
 +    assert result == (datetime(2016, 10, 1), datetime(2016, 11, 1))
 +
 +    result = get_since_until("first week of last month")
 +    assert result == (datetime(2016, 10, 1), datetime(2016, 10, 8))
 +
 +
 +@patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
 +def test_first_subunit_of_with_default_scope() -> None:
 +    """Test 'first [subunit] of the [unit]' expressions that default to 
'this'."""
 +    result = get_since_until("first week of the year")
 +    assert result == (datetime(2016, 1, 1), datetime(2016, 1, 8))
 +
 +    result = get_since_until("first month of the quarter")
 +    assert result == (datetime(2016, 10, 1), datetime(2016, 11, 1))
++
++
+ # Tests for bounded whitespace regex patterns in time_range_lookup
+ @pytest.mark.parametrize(
+     "time_range",
+     [
+         "last 7 days : ",
+         "this week : ",
+         "start of next month : ",
+         "prior quarter : ",
+         "last  7 days : ",
+         "last   7 days : ",
+         "last    7 days : ",
+         "last     7 days : ",
+         "start of     next     month : ",  # 5 spaces - valid
+         "last week : ",
+         "last  week : ",
+         "last     week : ",
+         "next 12 months : ",
+         "next  12  months : ",
+         "next     12     months : ",
+         "last 7days : ",  # \s{0,5} allows 0 spaces after number - valid
+     ],
+ )
+ @patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
+ def test_time_range_bounded_whitespace_regex_valid(time_range: str) -> None:
+     """Match expressions with 1-5 spaces between tokens."""
+     result = get_since_until(time_range)
+     assert result[0] is not None, f"Expected '{time_range}' to parse 
successfully"
+ 
+ 
+ @pytest.mark.parametrize(
+     "time_range",
+     [
+         "last      7 days : ",
+         "last7days : ",
+         "lastweek : ",
+         "last : ",
+         "start of : ",
+         "last 7 days extra : ",
+     ],
+ )
+ @patch("superset.utils.date_parser.parse_human_datetime", 
mock_parse_human_datetime)
+ def test_time_range_bounded_whitespace_regex_invalid(time_range: str) -> None:
+     """Reject expressions with 0 or 6+ spaces (fall back to DATETIME 
wrapping)."""
+     result = get_since_until(time_range)
+     assert result[0] is None, f"Expected '{time_range}' to NOT match bounded 
regex"

Reply via email to