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"
