Compare commits

...

72 Commits

Author SHA1 Message Date
Michael S. Molina
571f33536e chore: Updates CHANGELOG.md 2023-07-26 19:35:07 -03:00
Michael S. Molina
651c13b934 chore: Updates helm files 2023-07-26 18:39:24 -03:00
dependabot[bot]
af8c813cb6 build(deps): bump tox from 4.6.3 to 4.6.4 in /requirements (#24613)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-26 18:03:46 -03:00
Michael S. Molina
ad1a425269 fix: Filters alert width (#24801)
(cherry picked from commit 4b1f1d49d6)
2023-07-26 16:50:57 -03:00
JUST.in DO IT
84488b7c5e fix(sqllab): Replace autocomplete logic by a hook (#24677)
(cherry picked from commit 77505173ae)
2023-07-26 16:50:57 -03:00
Daniel Vaz Gaspar
d86ae30958 fix: docs invalid client redirect (#24816)
(cherry picked from commit d1eb9ea982)
2023-07-26 16:50:57 -03:00
Daniel Vaz Gaspar
d92f9a73d2 docs: update security policy and add CVE info (#24769)
(cherry picked from commit 165afee55a)
2023-07-26 16:50:57 -03:00
xavier-GitHub76
98ec90938d fix: Department names fixed for CountryMap of France (#23988)
(cherry picked from commit a9c4472d25)
2023-07-26 16:50:57 -03:00
Gyuil Han
25d42538d1 fix(dashboard): increase json_metadata field (#24510)
(cherry picked from commit ff7c1528db)
2023-07-26 16:50:57 -03:00
Stepan
a85da81815 fix(chore): switching between languages should be without timeout 60 seconds (#24798)
(cherry picked from commit 761fec2574)
2023-07-26 16:50:57 -03:00
JUST.in DO IT
d95241df9d fix(sqllab): Replace margin style by gap on query results (#24772)
(cherry picked from commit 4a81284056)
2023-07-25 15:24:40 -03:00
Michael S. Molina
d336431559 fix: Select onChange is being fired without explicit selection (#24698)
Co-authored-by: JUST.in DO IT <justin.park@airbnb.com>
(cherry picked from commit 6089b5fdae)
2023-07-25 15:24:40 -03:00
Zef Lin
e3d8ecb478 chore(view_api): return application/json as content-type for api/v1/form_data endpoint (#24758)
(cherry picked from commit 0631a8086c)
2023-07-24 09:47:23 -03:00
Elizabeth Thompson
a066ebbb5e fix: update svgr webpack config to use svg dimensions (#24747) 2023-07-24 09:47:04 -03:00
Beto Dealmeida
6947983d5f feat: migrate charts on import (#24703)
(cherry picked from commit abb8e28e49)
2023-07-24 09:43:52 -03:00
Evan Rusackas
00516c2088 chore(docs): Adding link to additional visualization content (#24759)
(cherry picked from commit e210da963d)
2023-07-24 09:43:52 -03:00
mattitoo
2e978bba14 docs: Fix STANDARD_ROLES.md for Gamma role permissions on tableschemaview (#24766)
(cherry picked from commit d642288092)
2023-07-24 09:43:52 -03:00
karsten-wagner
a8f808f7a8 fix(docs): respect no_proxy environment variable (#23816)
(cherry picked from commit a80ec15f4c)
2023-07-24 09:43:52 -03:00
Michael S. Molina
dd002a8cf6 fix: Tooltip no longer highlights hovered data series (#24756)
(cherry picked from commit ac19f58cf6)
2023-07-24 09:43:52 -03:00
Maxime Beauchemin
157cc621c5 fix: column/metric type icons look too small (#24740)
(cherry picked from commit 341b8d41c5)
2023-07-24 09:43:52 -03:00
Maxime Beauchemin
299dbb7012 chore: make control panel sub sections look better (#24736)
(cherry picked from commit 22a0fe555c)
2023-07-24 09:43:51 -03:00
Beto Dealmeida
2e222865bf fix: search_path in RDS (#24739)
(cherry picked from commit 7675e0db10)
2023-07-24 09:43:51 -03:00
JUST.in DO IT
d87724a6e3 fix(datasets): Replace left panel layout by TableSelector (#24599)
Co-authored-by: Justin Park <justinpark@apache.org>
(cherry picked from commit b2831b419e)
2023-07-24 09:43:51 -03:00
Stepan
6281f50bab fix(pvt2): migrations from legacy pivot table error when form_data have pieces of pvt2 (#24710)
(cherry picked from commit df106aa708)
2023-07-24 09:43:51 -03:00
JUST.in DO IT
06258a06ed chore(native filters): Expandable filter config modal (#24559)
Co-authored-by: Justin Park <justinpark@apache.org>
(cherry picked from commit 05e724f3d7)
2023-07-24 09:43:51 -03:00
Michael S. Molina
a7221c6dd4 fix: Dashboard time grain in Table (#24746)
(cherry picked from commit 317aa989c2)
2023-07-24 09:43:51 -03:00
JUST.in DO IT
66792beb8b fix(native filter): clean deleted parent filter ids (#24749)
Co-authored-by: John Bodley <john.bodley@gmail.com>
(cherry picked from commit 4086514fa5)
2023-07-24 09:43:51 -03:00
Maxime Beauchemin
aa5f0b1019 chore: make antd table font size same as data table (#24741)
(cherry picked from commit d1d5ff6f9f)
2023-07-24 09:43:51 -03:00
Daniel Vaz Gaspar
cc7983cd4a fix: import database engine validation (#24697)
(cherry picked from commit cb9b865a53)
2023-07-20 12:00:26 -03:00
Elizabeth Thompson
1625fe4104 chore: turn off talisman for ephemeral environments in ci (#24627)
(cherry picked from commit 1a9724582f)
2023-07-20 12:00:26 -03:00
Arjun Devarajan
91919569ba feat: use Scarf Gateway for Superset npm downloads (#24433)
Co-authored-by: Arjun Devarajan <arjun.devarajan@scarf.sh>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
2023-07-20 12:00:04 -03:00
Stepan
befe41df14 fix(range-slider): removed localization of metric key (#24716)
(cherry picked from commit 2d58dddbdc)
2023-07-20 11:55:54 -03:00
John Bodley
a3138f2bbe fix(cache): Add cache warmup for non-legacy charts (#24671)
(cherry picked from commit 5f49e0fdd0)
2023-07-20 11:55:54 -03:00
John Bodley
82311edaf6 fix(druid): Delete obsolete Druid NoSQL slice parameters (#24737)
(cherry picked from commit 4c5ada421c)
2023-07-20 11:55:53 -03:00
Arjun Devarajan
757741942d feat: use Scarf Gateway for Superset helm charts/Docker compose downloads (#24432) 2023-07-19 10:56:54 -03:00
John Bodley
65822cab13 chore: Bump pyyaml bounds (#24731) 2023-07-19 10:53:05 -03:00
John Bodley
4390968dd7 chore: Remove obsolete legacy visualizations (#24694)
(cherry picked from commit 1b5a6790f0)
2023-07-19 10:50:30 -03:00
Lily Kuang
2e913492c9 fix: color collision in dashboard with tabs (#24670)
(cherry picked from commit 0328dd2704)
2023-07-19 10:50:30 -03:00
Vitor Avila
c94bee47aa fix(dataset-import): support empty strings for extra fields (#24663)
(cherry picked from commit 65fb8e10ba)
2023-07-19 10:50:30 -03:00
Daniel Vaz Gaspar
c6ecbc81ac chore: move deprecated default version to 4.0.0 (#24689)
(cherry picked from commit ca68250adf)
2023-07-19 10:50:30 -03:00
Beto Dealmeida
60385ed059 fix: embedded dashboard check (#24690)
(cherry picked from commit 9844b15e07)
2023-07-19 10:50:30 -03:00
Michael S. Molina
b0c90cb261 fix: Dashboard time grain in Pivot Table (#24665)
(cherry picked from commit 6e59f11f4c)
2023-07-19 10:50:30 -03:00
John Bodley
49605e763c chore(command): Condense delete/bulk-delete operations (#24607)
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit a156816064)
2023-07-13 13:36:20 -03:00
Arkadii Yakovets
7243332082 chore: Bump holidays to 0.28 (#24647)
(cherry picked from commit 767afef398)
2023-07-13 13:36:20 -03:00
John Bodley
1872a651da chore: Bump/relax Flask libs (#24652)
(cherry picked from commit 462418ba82)
2023-07-12 11:20:05 -03:00
JUST.in DO IT
f60ab456f3 feat(sqllab): add shortcut for run current sql (#24329)
Co-authored-by: Justin Park <justinpark@apache.org>
(cherry picked from commit 1473d97055)
2023-07-12 11:20:05 -03:00
John Bodley
96cf6406f1 chore(dao): Add explicit ON DELETE CASCADE for ownership (#24628) 2023-07-12 11:19:43 -03:00
John Bodley
71eff954ba chore(dao): Condense delete/bulk-delete operations (#24466)
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit 7409289762)
2023-07-12 11:17:04 -03:00
JUST.in DO IT
79a42c6509 fix(sqllab): missing column meta on autocomplete (#24611)
Co-authored-by: Justin Park <justinpark@apache.org>
(cherry picked from commit ca8c8d2ad3)
2023-07-12 11:03:47 -03:00
Jack Fragassi
d8bf955515 fix: Chart can be added to dashboard by non-owner via save as option (#24630)
(cherry picked from commit 4caf33b41d)
2023-07-12 11:03:47 -03:00
Kamil Gabryjelski
a2fdc84073 fix: Ensure config is a dict in cross filters scope migration (#24661)
(cherry picked from commit 2e4d9f2e2a)
2023-07-12 11:03:47 -03:00
Kamil Gabryjelski
5a4996c226 fix: Incorrect initial global scoping of cross filters (#24642)
(cherry picked from commit bbffc4c1f8)
2023-07-12 11:03:46 -03:00
Michael S. Molina
359bbe26f7 fix: Validation of out of scope filters and interaction with Clear All (#24610)
(cherry picked from commit 0efb88479e)
2023-07-12 11:03:46 -03:00
John Bodley
27dcc3e025 chore: Drop rouge constraints and tables (#24629)
(cherry picked from commit 65291a00c6)
2023-07-12 11:03:46 -03:00
Daniel Vaz Gaspar
d6296c1ad1 fix: CSP, bump FAB to 4.3.4 (#24646)
(cherry picked from commit 4881328fbf)
2023-07-12 11:03:46 -03:00
Hugh A. Miles II
846d3c03aa fix: fix extra insert for count on dataset creation (#24625)
(cherry picked from commit e6e8276a20)
2023-07-12 11:03:46 -03:00
Kamil Gabryjelski
2bd9ca3c94 fix: Ensure metrics is an array in Mixed Chart (#24643)
(cherry picked from commit fe2c14ff3a)
2023-07-12 11:03:46 -03:00
Daniel Vaz Gaspar
a15e809c0f fix: remove spaces and EOL from nonce attr (#24644)
(cherry picked from commit b809815436)
2023-07-12 11:03:46 -03:00
Michael S. Molina
b81ee82d3c fix: Wrong positioning of filter tooltips on scroll (#24617)
(cherry picked from commit c53b249998)
2023-07-10 10:27:25 -03:00
Kamil Gabryjelski
6b366a2cff feat: Implement support for currencies in more charts (#24594)
(cherry picked from commit d74d7eca23)
2023-07-10 10:27:25 -03:00
Hugh A. Miles II
9a96d8cf8b fix: change naming convention for count metric on Dataset creation (#24609)
(cherry picked from commit c573cfcd12)
2023-07-10 10:27:25 -03:00
Gyuil Han
744cf2ec29 chore: remove underscore from builtin_time_grains label (#24567)
(cherry picked from commit a6e749da87)
2023-07-10 10:27:25 -03:00
Michael S. Molina
26909bf517 fix: Incorrect dependency between filters related feature flags (#24608)
(cherry picked from commit 781a20423a)
2023-07-07 09:48:45 -03:00
Beto Dealmeida
967ca0470b fix(report): edit without custom width (#24612)
(cherry picked from commit 93ba4ade09)
2023-07-07 09:48:45 -03:00
Hugh A. Miles II
0976b5e51e fix(ssh): Editting Database w/ SSH Tunneling (#24552)
(cherry picked from commit d041648ad4)
2023-07-07 09:48:45 -03:00
jwilliams-ocient
67008f2c35 fix: set max version for pyocient (#24556)
(cherry picked from commit 64d728f80f)
2023-07-07 09:48:45 -03:00
John Bodley
af2689d501 fix: Bump prophet, re-enable tests, and remedy column eligibility logic (#24129)
(cherry picked from commit 383dac6a5e)
2023-07-07 09:48:45 -03:00
JUST.in DO IT
a5f3cfc726 chore(sqllab): Log current local storage usage (#24554)
Co-authored-by: Justin Park <justinpark@apache.org>
(cherry picked from commit 0836000f9f)
2023-07-07 09:48:45 -03:00
Michael S. Molina
9ab61c1103 fix: Clicking on a tag in the dashboard and charts lists does not work (#24593)
(cherry picked from commit 04ae259f3d)
2023-07-05 13:02:50 -03:00
Ville Brofeldt
6de6f47728 chore(metastore-cache): add codec support (#24586)
(cherry picked from commit a4880cabd4)
2023-07-05 11:50:50 -03:00
Hugh A. Miles II
1b41653d3b fix: SSH Tunnel creation with dynamic form (#24196)
(cherry picked from commit 226c7f807d)
2023-07-05 11:50:50 -03:00
Michael S. Molina
eb42fa7a2e chore: Updates CHANGELOG.md and UPDATING.md 2023-06-30 09:27:24 -03:00
267 changed files with 5450 additions and 2903 deletions

38
.github/SECURITY.md vendored Normal file
View File

@@ -0,0 +1,38 @@
# Security Policy
This is a project of the [Apache Software Foundation](https://apache.org) and follows the
ASF [vulnerability handling process](https://apache.org/security/#vulnerability-handling).
## Reporting Vulnerabilities
**⚠️ Please do not file GitHub issues for security vulnerabilities as they are public! ⚠️**
Apache Software Foundation takes a rigorous standpoint in annihilating the security issues
in its software projects. Apache Superset is highly sensitive and forthcoming to issues
pertaining to its features and functionality.
If you have any concern or believe you have found a vulnerability in Apache Superset,
please get in touch with the Apache Security Team privately at
e-mail address [security@apache.org](mailto:security@apache.org).
More details can be found on the ASF website at
[ASF vulnerability reporting process](https://apache.org/security/#reporting-a-vulnerability)
We kindly ask you to include the following information in your report:
- Apache Superset version that you are using
- A sanitized copy of your `superset_config.py` file or any config overrides
- Detailed steps to reproduce the vulnerability
Note that Apache Superset is not responsible for any third-party dependencies that may
have security issues. Any vulnerabilities found in third-party dependencies should be
reported to the maintainers of those projects. Results from security scans of Apache
Superset dependencies found on its official Docker image can be remediated at release time
by extending the image itself.
**Your responsible disclosure and collaboration are invaluable.**
## Extra Information
- [Apache Superset documentation](https://superset.apache.org/docs/security)
- [Common Vulnerabilities and Exposures by release](https://superset.apache.org/docs/security/cves)
- [How Security Vulnerabilities are Reported & Handled in Apache Superset (Blog)](https://preset.io/blog/how-security-vulnerabilities-are-reported-and-handled-in-apache-superset/)

View File

@@ -25,8 +25,12 @@
"value": "8080"
},
{
"name": "SUPERSET_SECRET_KEY",
"value": "super-secret-for-ephemerals"
"name": "SUPERSET_SECRET_KEY",
"value": "super-secret-for-ephemerals"
},
{
"name": "TALISMAN_ENABLED",
"value": "False"
}
],
"mountPoints": [],

View File

@@ -19,6 +19,8 @@ under the License.
## Change Log
- [3.0.0](#300-wed-jul-12-103627-2023--0600)
- [2.1.1](#211-sun-apr-23-154421-2023-0100)
- [2.1.0](#210-thu-mar-16-211305-2023--0700)
- [2.0.1](#201-fri-nov-4-103402-2022--0400)
- [2.0.0](#200-tue-jun-28-085302-2022--0400)
@@ -29,6 +31,725 @@ under the License.
- [1.4.2](#142-sat-mar-19-000806-2022-0200)
- [1.4.1](#141)
### 3.0.0 (Wed Jul 12 10:36:27 2023 -0600)
**Database Migrations**
- [#24510](https://github.com/apache/superset/pull/24510) fix(dashboard): increase json_metadata field (@cnabro)
- [#24749](https://github.com/apache/superset/pull/24749) fix(native filter): clean deleted parent filter ids (@justinpark)
- [#24737](https://github.com/apache/superset/pull/24737) fix(druid): Delete obsolete Druid NoSQL slice parameters (@john-bodley)
- [#24628](https://github.com/apache/superset/pull/24628) chore(dao): Add explicit ON DELETE CASCADE for ownership (@john-bodley)
- [#24661](https://github.com/apache/superset/pull/24661) fix: Ensure config is a dict in cross filters scope migration (@kgabryje)
- [#24629](https://github.com/apache/superset/pull/24629) chore: Drop rouge constraints and tables (@john-bodley)
- [#24558](https://github.com/apache/superset/pull/24558) chore: better styling alerts/reports modal (@betodealmeida)
- [#24547](https://github.com/apache/superset/pull/24547) feat: customize screenshot width for alerts/reports (@betodealmeida)
- [#24553](https://github.com/apache/superset/pull/24553) feat: add description column to Tags (@hughhhh)
- [#24548](https://github.com/apache/superset/pull/24548) fix: heads (@betodealmeida)
- [#24488](https://github.com/apache/superset/pull/24488) chore(dao): Add explicit ON DELETE CASCADE when deleting datasets (@john-bodley)
- [#24517](https://github.com/apache/superset/pull/24517) feat: Implement currencies formatter for saved metrics (@kgabryje)
- [#24266](https://github.com/apache/superset/pull/24266) chore: Remove deprecated ENABLE_ACCESS_REQUEST workflow (@john-bodley)
- [#23910](https://github.com/apache/superset/pull/23910) feat: Migrates Dual Line Chart to Mixed Chart (@michael-s-molina)
- [#23741](https://github.com/apache/superset/pull/23741) feat: Migrates TreeMap chart (@michael-s-molina)
- [#23712](https://github.com/apache/superset/pull/23712) feat: Migrates Pivot Table v1 to v2 (@michael-s-molina)
- [#24306](https://github.com/apache/superset/pull/24306) chore: reorder k-v migration for 2.1.1 (@villebro)
- [#24280](https://github.com/apache/superset/pull/24280) fix: ensure json is not None (@eschutho)
- [#24197](https://github.com/apache/superset/pull/24197) chore(pre-commit): Add pyupgrade and pycln hooks (@john-bodley)
- [#24127](https://github.com/apache/superset/pull/24127) chore: Embrace the walrus operator (@john-bodley)
- [#24020](https://github.com/apache/superset/pull/24020) feat: Cross filters scoping (@kgabryje)
- [#23942](https://github.com/apache/superset/pull/23942) fix: update migration chart_ds_constraint to have seperate batch op (@hughhhh)
- [#23925](https://github.com/apache/superset/pull/23925) fix(migration): add log for values unseen in `Slice.datasource_type` (@hughhhh)
- [#23614](https://github.com/apache/superset/pull/23614) chore: add check constraint to restrict `Slice` models datasource_type != "table" (@hughhhh)
- [#23650](https://github.com/apache/superset/pull/23650) fix(migration): Only attempt to drop types if they exist (@jfrag1)
- [#23526](https://github.com/apache/superset/pull/23526) fix(tags): convert postgres enum type to varchar (@nytai)
- [#23410](https://github.com/apache/superset/pull/23410) feat(echarts): Implement stream graph for Echarts Timeseries (@kgabryje)
- [#23173](https://github.com/apache/superset/pull/23173) chore: Update pre-commit packages (@hughhhh)
- [#23276](https://github.com/apache/superset/pull/23276) fix(migration): Address issue in #23228 (@john-bodley)
- [#23273](https://github.com/apache/superset/pull/23273) fix(plugin-chart-echarts): render horizontal categories from top (@villebro)
- [#23228](https://github.com/apache/superset/pull/23228) chore: Deprecate show_native_filters (@john-bodley)
- [#19677](https://github.com/apache/superset/pull/19677) chore(backend): Spelling (@jsoref)
**Features**
- [#24703](https://github.com/apache/superset/pull/24703) feat: migrate charts on import (@betodealmeida)
- [#24433](https://github.com/apache/superset/pull/24433) feat: use Scarf Gateway for Superset npm downloads (@arjundevarajan)
- [#24432](https://github.com/apache/superset/pull/24432) feat: use Scarf Gateway for Superset helm charts/Docker compose downloads (@arjundevarajan)
- [#24329](https://github.com/apache/superset/pull/24329) feat(sqllab): add shortcut for run current sql (@justinpark)
- [#24594](https://github.com/apache/superset/pull/24594) feat: Implement support for currencies in more charts (@kgabryje)
- [#24549](https://github.com/apache/superset/pull/24549) feat: screenshot reports with custom width (@betodealmeida)
- [#24518](https://github.com/apache/superset/pull/24518) feat(tags): move tags from navbar to settings (@hughhhh)
- [#24277](https://github.com/apache/superset/pull/24277) feat(docker): Add support LDAP/AD authorization (@alekseyolg)
- [#24388](https://github.com/apache/superset/pull/24388) feat: Allows new values for single value filters (@michael-s-molina)
- [#24287](https://github.com/apache/superset/pull/24287) feat: add dashboard page full xlsx export (@vitoldi)
- [#24368](https://github.com/apache/superset/pull/24368) feat: make data tables support html (@mistercrunch)
- [#24369](https://github.com/apache/superset/pull/24369) feat(sshtunnel): add configuration for SSH_TIMEOUT (@hughhhh)
- [#24348](https://github.com/apache/superset/pull/24348) feat: add a tooltip to clarify metric_name in the DatasetEditor (@mistercrunch)
- [#24043](https://github.com/apache/superset/pull/24043) feat: Configurable default row limit for native filters (@cleslie)
- [#24345](https://github.com/apache/superset/pull/24345) feat: Convert ENABLE_BROAD_ACTIVITY_ACCESS and MENU_HIDE_USER_INFO into feature flags (@michael-s-molina)
- [#23943](https://github.com/apache/superset/pull/23943) feat: Removes the preset-chart-xy plugin (@michael-s-molina)
- [#23933](https://github.com/apache/superset/pull/23933) feat: Removes the Multiple Line Charts (@michael-s-molina)
- [#24237](https://github.com/apache/superset/pull/24237) feat: support complex types and use get_columns implementation of starrrocks python client (@miomiocat)
- [#24205](https://github.com/apache/superset/pull/24205) feat(sqllab): SQLEditor Extension (@Antonio-RiveroMartnez)
- [#24232](https://github.com/apache/superset/pull/24232) feat(flags): enabling and deprecating a few feature flags (@rusackas)
- [#24191](https://github.com/apache/superset/pull/24191) feat: extension hook for DB delete (@betodealmeida)
- [#23209](https://github.com/apache/superset/pull/23209) feat: Add StarRocks support (@miomiocat)
- [#24067](https://github.com/apache/superset/pull/24067) feat: split database information (@betodealmeida)
- [#23551](https://github.com/apache/superset/pull/23551) feat: Add deck.gl Heatmap Visualization (@Mattc1221)
- [#24005](https://github.com/apache/superset/pull/24005) feat: dashboard page xlsx export (@vitoldi)
- [#23174](https://github.com/apache/superset/pull/23174) feat: database extension registry (@betodealmeida)
- [#24048](https://github.com/apache/superset/pull/24048) feat: Make time shifted series colors match the original series (@michael-s-molina)
- [#23035](https://github.com/apache/superset/pull/23035) feat: Use AntD table in FilterableTable (@EugeneTorap)
- [#24035](https://github.com/apache/superset/pull/24035) feat: implement time grain in temporal filters (@villebro)
- [#23970](https://github.com/apache/superset/pull/23970) feat(chart-controls): Show detailed data type tooltip when hovering type icon (@ved-kashyap-samsung)
- [#23890](https://github.com/apache/superset/pull/23890) feat!: bump to Python3.9 (@sebastianliebscher)
- [#23975](https://github.com/apache/superset/pull/23975) feat: Allows dynamic type on viz migrations (@michael-s-molina)
- [#23917](https://github.com/apache/superset/pull/23917) feat: Adds a control to set the Secondary Y-axis bounds in Mixed charts (@michael-s-molina)
- [#23905](https://github.com/apache/superset/pull/23905) feat: Considers GENERIC_CHART_AXES in viz migrations (@michael-s-molina)
- [#20075](https://github.com/apache/superset/pull/20075) feat: custom d3 number locale (@ebaratte)
- [#23869](https://github.com/apache/superset/pull/23869) feat: Changes the Select component to preserve the search value when selecting (@michael-s-molina)
- [#23064](https://github.com/apache/superset/pull/23064) feat: conditional coloring for big number chart (@gbusch)
- [#23698](https://github.com/apache/superset/pull/23698) feat: format timestamps in drill by breadcrumbs (@lilykuang)
- [#23655](https://github.com/apache/superset/pull/23655) feat: add verbose map to get /dataset/ endpoint (@lilykuang)
- [#23716](https://github.com/apache/superset/pull/23716) feat: create dtype option for csv upload (@eschutho)
- [#23777](https://github.com/apache/superset/pull/23777) feat(revert): Re-introduces the RLS page (@michael-s-molina)
- [#22812](https://github.com/apache/superset/pull/22812) feat: Add Ocient support (@alexclavel-ocient)
- [#23768](https://github.com/apache/superset/pull/23768) feat: Display both queries result in Table mode for Mixed Chart in drill by modal (@kgabryje)
- [#23269](https://github.com/apache/superset/pull/23269) feat(native-filters): Add legacy (filter-box) to native filter migration script (@john-bodley)
- [#23748](https://github.com/apache/superset/pull/23748) feat(adhoc-column): add resize option (@villebro)
- [#23724](https://github.com/apache/superset/pull/23724) feat: Drill by error management (@kgabryje)
- [#23634](https://github.com/apache/superset/pull/23634) feat: Makes "Add to dashboard" in Save chart modal paginated (@michael-s-molina)
- [#23697](https://github.com/apache/superset/pull/23697) feat: Add loading state to sqllab save/overwrite dataset modal (@jfrag1)
- [#23720](https://github.com/apache/superset/pull/23720) feat(sqllab): add headers when copying results to clipboard (@villebro)
- [#23707](https://github.com/apache/superset/pull/23707) feat(helm): update redis version due to critical CVE (HIGH PRIORITY) (@justmike1)
- [#23664](https://github.com/apache/superset/pull/23664) feat: Implement breadcrumbs in Drill By modal (@kgabryje)
- [#23644](https://github.com/apache/superset/pull/23644) feat(plugin-chart-echarts): add x-axis sort to multi series (@villebro)
- [#23615](https://github.com/apache/superset/pull/23615) feat: Support further drill by in the modal (@kgabryje)
- [#23657](https://github.com/apache/superset/pull/23657) feat(dashboard): make color indices referable (@villebro)
- [#23603](https://github.com/apache/superset/pull/23603) feat: implement drill by table (@lilykuang)
- [#23402](https://github.com/apache/superset/pull/23402) feat(lang): update messages.po(t) and add missing German translations (@hbruch)
- [#23328](https://github.com/apache/superset/pull/23328) feat(wrap-text): Wrap text support for specific columns in Grid (@SamraHanifCareem)
- [#23601](https://github.com/apache/superset/pull/23601) feat(helm): ability to disable helm hooks (@justmike1)
- [#23602](https://github.com/apache/superset/pull/23602) feat(snowflake): `get_catalog_names` (@betodealmeida)
- [#23599](https://github.com/apache/superset/pull/23599) feat(presto): `get_catalog_names` (@betodealmeida)
- [#23547](https://github.com/apache/superset/pull/23547) feat: Shows user charts by default when editing a dashboard (@michael-s-molina)
- [#23590](https://github.com/apache/superset/pull/23590) feat: Enables ECharts legend selector (@michael-s-molina)
- [#23594](https://github.com/apache/superset/pull/23594) feat(helm): Upgrade default Superset version to 2.1.0 (@dnskr)
- [#23461](https://github.com/apache/superset/pull/23461) feat(bigquery): `get_catalog_names` (@betodealmeida)
- [#23575](https://github.com/apache/superset/pull/23575) feat: Drill by open in Explore (@kgabryje)
- [#23542](https://github.com/apache/superset/pull/23542) feat: Add metadata bar to drill by modal (@kgabryje)
- [#23524](https://github.com/apache/superset/pull/23524) feat: drill by display chart (@lilykuang)
- [#23509](https://github.com/apache/superset/pull/23509) feat(cross-filters): using verbose map in applied cross-filters (@Always-prog)
- [#23439](https://github.com/apache/superset/pull/23439) feat: add ability to disable cache (@villebro)
- [#23458](https://github.com/apache/superset/pull/23458) feat: drill by modal (@lilykuang)
- [#23454](https://github.com/apache/superset/pull/23454) feat: Implement context menu for drill by (@kgabryje)
- [#23416](https://github.com/apache/superset/pull/23416) feat(helm): add nodeselector and tolerations to init job (@dim-ops)
- [#23459](https://github.com/apache/superset/pull/23459) feat: Allows reload on default filter value error (@michael-s-molina)
- [#23447](https://github.com/apache/superset/pull/23447) feat(DB engine spec): `get_catalog_names` (@betodealmeida)
- [#23450](https://github.com/apache/superset/pull/23450) feat(echarts): Add x axis sort by to all series charts (@kgabryje)
- [#23415](https://github.com/apache/superset/pull/23415) feat: add new cache_query_by_user key (@eschutho)
- [#23377](https://github.com/apache/superset/pull/23377) feat(sqllab): log error_detail on fetch failed (@justinpark)
- [#23338](https://github.com/apache/superset/pull/23338) feat(chart): Added SriLanka country map (@rukshn)
- [#23401](https://github.com/apache/superset/pull/23401) feat(postgresql): dynamic schema (@betodealmeida)
- [#23392](https://github.com/apache/superset/pull/23392) feat(plugin-chart-echarts): add series sorting (@villebro)
- [#23319](https://github.com/apache/superset/pull/23319) feat(native-filters): allow cascading from time and numeric filters (@villebro)
- [#23350](https://github.com/apache/superset/pull/23350) feat(dashboard): Change default opacity of icon in FiltersBadge (@kgabryje)
- [#23286](https://github.com/apache/superset/pull/23286) feat(dashboard): Refactor FiltersBadge (@kgabryje)
- [#23287](https://github.com/apache/superset/pull/23287) feat(docs): adds BugHerd to documentation site. (@rusackas)
- [#23274](https://github.com/apache/superset/pull/23274) feat(generic-x-axis): add x sorting on series limit metric (@villebro)
- [#23138](https://github.com/apache/superset/pull/23138) feat: Cross Filters in FilterBar (@geido)
- [#23099](https://github.com/apache/superset/pull/23099) feat(ssh_tunnel): Import/Export Databases with SSHTunnel credentials (@Antonio-RiveroMartnez)
- [#23141](https://github.com/apache/superset/pull/23141) feat(dashboard): Add cross filter from context menu (@kgabryje)
- [#22886](https://github.com/apache/superset/pull/22886) feat: Enable cross fitlers in WorldMap and Graph charts (@kgabryje)
- [#23143](https://github.com/apache/superset/pull/23143) feat: return UUID on database creation (@betodealmeida)
- [#20876](https://github.com/apache/superset/pull/20876) feat: Frontend tagging (@cccs-RyanK)
**Fixes**
- [#24801](https://github.com/apache/superset/pull/24801) fix: Filters alert width (@michael-s-molina)
- [#24677](https://github.com/apache/superset/pull/24677) fix(sqllab): Replace autocomplete logic by a hook (@justinpark)
- [#24816](https://github.com/apache/superset/pull/24816) fix: docs invalid client redirect (@dpgaspar)
- [#23988](https://github.com/apache/superset/pull/23988) fix: Department names fixed for CountryMap of France (@xavier-GitHub76)
- [#24798](https://github.com/apache/superset/pull/24798) fix(chore): switching between languages should be without timeout 60 seconds (@Always-prog)
- [#24772](https://github.com/apache/superset/pull/24772) fix(sqllab): Replace margin style by gap on query results (@justinpark)
- [#24698](https://github.com/apache/superset/pull/24698) fix: Select onChange is being fired without explicit selection (@michael-s-molina)
- [#24747](https://github.com/apache/superset/pull/24747) fix: update svgr webpack config to use svg dimensions (@eschutho)
- [#23816](https://github.com/apache/superset/pull/23816) fix(docs): respect no_proxy environment variable (@karsten-wagner)
- [#24756](https://github.com/apache/superset/pull/24756) fix: Tooltip no longer highlights hovered data series (@michael-s-molina)
- [#24740](https://github.com/apache/superset/pull/24740) fix: column/metric type icons look too small (@mistercrunch)
- [#24739](https://github.com/apache/superset/pull/24739) fix: `search_path` in RDS (@betodealmeida)
- [#24599](https://github.com/apache/superset/pull/24599) fix(datasets): Replace left panel layout by TableSelector (@justinpark)
- [#24710](https://github.com/apache/superset/pull/24710) fix(pvt2): migrations from legacy pivot table error when form_data have pieces of pvt2 (@Always-prog)
- [#24746](https://github.com/apache/superset/pull/24746) fix: Dashboard time grain in Table (@michael-s-molina)
- [#24716](https://github.com/apache/superset/pull/24716) fix(range-slider): removed localization of metric key (@Always-prog)
- [#24671](https://github.com/apache/superset/pull/24671) fix(cache): Add cache warmup for non-legacy charts (@john-bodley)
- [#24670](https://github.com/apache/superset/pull/24670) fix: color collision in dashboard with tabs (@lilykuang)
- [#24663](https://github.com/apache/superset/pull/24663) fix(dataset-import): support empty strings for extra fields (@Vitor-Avila)
- [#24690](https://github.com/apache/superset/pull/24690) fix: embedded dashboard check (@betodealmeida)
- [#24665](https://github.com/apache/superset/pull/24665) fix: Dashboard time grain in Pivot Table (@michael-s-molina)
- [#24611](https://github.com/apache/superset/pull/24611) fix(sqllab): missing column meta on autocomplete (@justinpark)
- [#24630](https://github.com/apache/superset/pull/24630) fix: Chart can be added to dashboard by non-owner via save as option (@jfrag1)
- [#24642](https://github.com/apache/superset/pull/24642) fix: Incorrect initial global scoping of cross filters (@kgabryje)
- [#24610](https://github.com/apache/superset/pull/24610) fix: Validation of out of scope filters and interaction with Clear All (@michael-s-molina)
- [#24646](https://github.com/apache/superset/pull/24646) fix: CSP, bump FAB to 4.3.4 (@dpgaspar)
- [#24625](https://github.com/apache/superset/pull/24625) fix: fix extra insert for count on dataset creation (@hughhhh)
- [#24643](https://github.com/apache/superset/pull/24643) fix: Ensure metrics is an array in Mixed Chart (@kgabryje)
- [#24644](https://github.com/apache/superset/pull/24644) fix: remove spaces and EOL from nonce attr (@dpgaspar)
- [#24617](https://github.com/apache/superset/pull/24617) fix: Wrong positioning of filter tooltips on scroll (@michael-s-molina)
- [#24609](https://github.com/apache/superset/pull/24609) fix: change naming convention for count metric on Dataset creation (@hughhhh)
- [#24567](https://github.com/apache/superset/pull/24567) fix: remove underscore from builtin_time_grains label (@cnabro)
- [#24608](https://github.com/apache/superset/pull/24608) fix: Incorrect dependency between filters related feature flags (@michael-s-molina)
- [#24612](https://github.com/apache/superset/pull/24612) fix(report): edit without custom width (@betodealmeida)
- [#24552](https://github.com/apache/superset/pull/24552) fix(ssh): Editting Database w/ SSH Tunneling (@hughhhh)
- [#24556](https://github.com/apache/superset/pull/24556) fix: set max version for pyocient (@jwilliams-ocient)
- [#24129](https://github.com/apache/superset/pull/24129) fix: Bump prophet, re-enable tests, and remedy column eligibility logic (@john-bodley)
- [#24593](https://github.com/apache/superset/pull/24593) fix: Clicking on a tag in the dashboard and charts lists does not work (@michael-s-molina)
- [#24196](https://github.com/apache/superset/pull/24196) fix: SSH Tunnel creation with dynamic form (@hughhhh)
- [#24555](https://github.com/apache/superset/pull/24555) fix: Metric is truncated in tooltip (@michael-s-molina)
- [#24565](https://github.com/apache/superset/pull/24565) fix: docker compose refusing to start (@dpgaspar)
- [#24536](https://github.com/apache/superset/pull/24536) fix(sqllab): Add threshold for checking inactive queries (@justinpark)
- [#24546](https://github.com/apache/superset/pull/24546) fix: Error when searching for a dashboard in the chart list (@michael-s-molina)
- [#24550](https://github.com/apache/superset/pull/24550) fix: Deque mutated during iteration (@michael-s-molina)
- [#24541](https://github.com/apache/superset/pull/24541) fix(docs): Typo in filter migration. (@Hikari)
- [#24475](https://github.com/apache/superset/pull/24475) fix(translations): typo mistake (translation to Spanish) (@santi-pragma)
- [#24482](https://github.com/apache/superset/pull/24482) fix(permalink): Incorrect component schema reference (@Nisden)
- [#24519](https://github.com/apache/superset/pull/24519) fix: SQL Lab - correct setting name from DISPLAY_MAX_ROWS to DISPLAY_MAX_ROW (@jgillick)
- [#24537](https://github.com/apache/superset/pull/24537) fix: Use Celery task ETA for alert/report schedule (@john-bodley)
- [#24545](https://github.com/apache/superset/pull/24545) fix: Revert enable strong session protection by default (#24256) (@michael-s-molina)
- [#24544](https://github.com/apache/superset/pull/24544) fix: Release scripts Python version (@michael-s-molina)
- [#24542](https://github.com/apache/superset/pull/24542) fix(native-filters): Infinite load when filter with default first value is out of scope in horizontal bar (@kgabryje)
- [#24492](https://github.com/apache/superset/pull/24492) fix(charts): big-number display broken in echarts (@curious86)
- [#24513](https://github.com/apache/superset/pull/24513) fix(sqllab): normalize changedOn timestamp (@villebro)
- [#24506](https://github.com/apache/superset/pull/24506) fix: Native filter dynamic numeric search (@john-bodley)
- [#24477](https://github.com/apache/superset/pull/24477) fix: Total calculation in stacked Timeseries charts (@michael-s-molina)
- [#24471](https://github.com/apache/superset/pull/24471) fix(oracle): denormalize column names where applicable (@villebro)
- [#24476](https://github.com/apache/superset/pull/24476) fix: Revert enabling CSP (@kgabryje)
- [#24418](https://github.com/apache/superset/pull/24418) fix: Native filter dynamic numeric search (@john-bodley)
- [#24447](https://github.com/apache/superset/pull/24447) fix(charts): Fix chart load task error handling (@giftig)
- [#24405](https://github.com/apache/superset/pull/24405) fix: creating a new chart with dashboard time filters but filter can't apply again (@lilykuang)
- [#24434](https://github.com/apache/superset/pull/24434) fix: Revert to old endpoint temporarily to enable sharing saved queries (@jfrag1)
- [#24248](https://github.com/apache/superset/pull/24248) fix: save columns reference from sqllab save datasets flow (@hughhhh)
- [#24429](https://github.com/apache/superset/pull/24429) fix: Viz migration adjustments - 2 (@michael-s-molina)
- [#24440](https://github.com/apache/superset/pull/24440) fix(translations): regularise the capitalisation of 'CSV' in en localisation (@stuartyeates)
- [#24410](https://github.com/apache/superset/pull/24410) fix: force data load on import examples (@eschutho)
- [#24422](https://github.com/apache/superset/pull/24422) fix(sql-lab): remove redundant onChange schema property (@villebro)
- [#24420](https://github.com/apache/superset/pull/24420) fix: FE call to changed recent_activity endpoint (@dpgaspar)
- [#24428](https://github.com/apache/superset/pull/24428) fix: deck.gl Geojson path not visible (@kgabryje)
- [#24392](https://github.com/apache/superset/pull/24392) fix: Fixes #24391 (Problems with celery beat running with docker when the machine is rebooted suddenly) (@alvarolmedo)
- [#24221](https://github.com/apache/superset/pull/24221) fix(helm): Add fullname prefix to init job (@NickLarsenNZ)
- [#24121](https://github.com/apache/superset/pull/24121) fix: Address regression introduced in #22853 (@john-bodley)
- [#24143](https://github.com/apache/superset/pull/24143) fix: Ensure "Import Dashboard" menu item adheres to PVM (@john-bodley)
- [#24350](https://github.com/apache/superset/pull/24350) fix: Address dashboard permission regression in #23586 (@john-bodley)
- [#24363](https://github.com/apache/superset/pull/24363) fix: deck.gl Scatterplot min/max radius (@kgabryje)
- [#24344](https://github.com/apache/superset/pull/24344) fix(sqllab): Inefficient SqlaTable query (#24343) (@giftig)
- [#24341](https://github.com/apache/superset/pull/24341) fix: Viz migration adjustments - 1 (@michael-s-molina)
- [#24317](https://github.com/apache/superset/pull/24317) fix: update order of build for testing a release (@eschutho)
- [#24303](https://github.com/apache/superset/pull/24303) fix: Copy dashboard filters when copying dashboard (@jfrag1)
- [#24176](https://github.com/apache/superset/pull/24176) fix: Time shifts with different granularity for ECharts (@michael-s-molina)
- [#24315](https://github.com/apache/superset/pull/24315) fix: DB extension collapse (@betodealmeida)
- [#19808](https://github.com/apache/superset/pull/19808) fix(sql-lab): SQL Lab commit connection even if no CTA query is made (@snt1017)
- [#24265](https://github.com/apache/superset/pull/24265) fix(capitalization): Capitalizing the 'metric' label in Pivot Tables (@rusackas)
- [#24304](https://github.com/apache/superset/pull/24304) fix(dashboard): max call size stack error (@justinpark)
- [#24293](https://github.com/apache/superset/pull/24293) fix: Removes file extension from textUtils (@michael-s-molina)
- [#24291](https://github.com/apache/superset/pull/24291) fix: Text utils null value when reading module (@michael-s-molina)
- [#24279](https://github.com/apache/superset/pull/24279) fix(migrations): Fixing cross filter migration (@craig-rueda)
- [#24279](https://github.com/apache/superset/pull/24279) fix(migrations): Fixing cross filter migration (@craig-rueda)
- [#24256](https://github.com/apache/superset/pull/24256) fix: enable strong session protection by default (@dpgaspar)
- [#23562](https://github.com/apache/superset/pull/23562) fix(docs): Update databricks.mdx with correct pip package name (@amosdoublec)
- [#24217](https://github.com/apache/superset/pull/24217) fix: Typescript warnings when importing types (@michael-s-molina)
- [#24222](https://github.com/apache/superset/pull/24222) fix(helm): Use correct default hostnames for postgres and redis (@NickLarsenNZ)
- [#24242](https://github.com/apache/superset/pull/24242) fix(dataset-api): allow undefined schema in post (@villebro)
- [#24207](https://github.com/apache/superset/pull/24207) fix: removing problematic "formattable" tag (@rusackas)
- [#24223](https://github.com/apache/superset/pull/24223) fix: Tag link issue from CRUD page (@hughhhh)
- [#24181](https://github.com/apache/superset/pull/24181) fix(translation): complete portuguese(brazilian) translation (@lucas1221)
- [#24177](https://github.com/apache/superset/pull/24177) fix(explore): rendering regression on standalone (@justinpark)
- [#24186](https://github.com/apache/superset/pull/24186) fix(plugin-chart-echarts): force min y-tick for log axis with zero (@villebro)
- [#24060](https://github.com/apache/superset/pull/24060) fix: always allow tags to be returned via the API (@hughhhh)
- [#24142](https://github.com/apache/superset/pull/24142) fix(sqllab): Table options rendering regression (@justinpark)
- [#24113](https://github.com/apache/superset/pull/24113) fix: Errors when saving dataset (@jfrag1)
- [#24166](https://github.com/apache/superset/pull/24166) fix(permalink): migrate to marshmallow codec (@villebro)
- [#24158](https://github.com/apache/superset/pull/24158) fix(table): percentage metric should use verbose map (@Always-prog)
- [#24159](https://github.com/apache/superset/pull/24159) fix(reports): error when creation alert/report with localization (@Always-prog)
- [#23762](https://github.com/apache/superset/pull/23762) fix: repeated color in the same chart (@lilykuang)
- [#24124](https://github.com/apache/superset/pull/24124) fix: Revert tox basepython (@john-bodley)
- [#24134](https://github.com/apache/superset/pull/24134) fix(plugin-chart-echarts): normalize temporal string groupbys (@villebro)
- [#24120](https://github.com/apache/superset/pull/24120) fix(sqllab): Disable Select All on table selector (@justinpark)
- [#24114](https://github.com/apache/superset/pull/24114) fix(ci): remove username from owner (@villebro)
- [#23814](https://github.com/apache/superset/pull/23814) fix(ocient): convert pyocient GIS data types to geoJSON (@jwilliams-ocient)
- [#23867](https://github.com/apache/superset/pull/23867) fix(docs): Installation instruction changes (@artofcomputing)
- [#24070](https://github.com/apache/superset/pull/24070) fix(alert modal): set current user as default alert owner during new alert initialization (@curious86)
- [#24068](https://github.com/apache/superset/pull/24068) fix: Handle python_date_format in ExploreMixin (@john-bodley)
- [#24062](https://github.com/apache/superset/pull/24062) fix: handle `python_date_format` in ExploreMixin (@betodealmeida)
- [#23801](https://github.com/apache/superset/pull/23801) fix(plugin-chart-handlebars): Fix TypeError when using handlebars columns raw mode (@fmannhardt)
- [#24028](https://github.com/apache/superset/pull/24028) fix: typing and using enter to select the table on sql lab layout (@lilykuang)
- [#24009](https://github.com/apache/superset/pull/24009) fix(sqllab): rollback clean comments out (@justinpark)
- [#23971](https://github.com/apache/superset/pull/23971) fix: MySQL et al. super calls (@john-bodley)
- [#23715](https://github.com/apache/superset/pull/23715) fix(filters): Stop breaking if translateToSql returns an object (@Antonio-RiveroMartnez)
- [#23952](https://github.com/apache/superset/pull/23952) fix(sqllab): custom url params disappeared (@justinpark)
- [#23935](https://github.com/apache/superset/pull/23935) fix: methods incorrect type and update deprecated targets (@dpgaspar)
- [#23908](https://github.com/apache/superset/pull/23908) fix(sqllab): clean comments within quotes (@justinpark)
- [#23924](https://github.com/apache/superset/pull/23924) fix: timeout should be an integer (@betodealmeida)
- [#23892](https://github.com/apache/superset/pull/23892) fix(sql-editor): Fix run stop button color to improve usability (@curious86)
- [#23909](https://github.com/apache/superset/pull/23909) fix: remove feature flag for tags on Dashboard API for `Tags` (@hughhhh)
- [#23881](https://github.com/apache/superset/pull/23881) fix(native-filters): Address spelling mistakes (@john-bodley)
- [#23778](https://github.com/apache/superset/pull/23778) fix(chart): scrollbar keep flusing on and off (@justinpark)
- [#23868](https://github.com/apache/superset/pull/23868) fix: move dynamic schema out of base Postgres class (@hughhhh)
- [#23702](https://github.com/apache/superset/pull/23702) fix: npm run dev-server error resolved (@Abhishek-kumar-samsung)
- [#23872](https://github.com/apache/superset/pull/23872) fix(dremio): query with alias (@betodealmeida)
- [#23860](https://github.com/apache/superset/pull/23860) fix(alerts): flaky test error (@justinpark)
- [#23832](https://github.com/apache/superset/pull/23832) fix(native-filters): Address spelling mistakes (@john-bodley)
- [#23856](https://github.com/apache/superset/pull/23856) fix(tests): Ensure deterministic SELECT ordering for CSV upload tests (@john-bodley)
- [#23627](https://github.com/apache/superset/pull/23627) fix(chart): chart updates are not retained (@justinpark)
- [#23857](https://github.com/apache/superset/pull/23857) fix(ephemerals): Quick fix for ephemeral spin-up (@craig-rueda)
- [#23831](https://github.com/apache/superset/pull/23831) fix: Preserve filters from previous drillings in drill by (@kgabryje)
- [#23830](https://github.com/apache/superset/pull/23830) fix: Loading state when cols for drill by are loading (@kgabryje)
- [#23818](https://github.com/apache/superset/pull/23818) fix(revert): Reverts storybook-addon-mock inclusion (@michael-s-molina)
- [#23685](https://github.com/apache/superset/pull/23685) fix(utils): evaluate date parser multiple holiday results correctly (@arkid15r)
- [#23811](https://github.com/apache/superset/pull/23811) fix: Hide FiltersPanel in standalone mode 3 (@geido)
- [#23731](https://github.com/apache/superset/pull/23731) fix: pivot v2 charts created before `GENERIC_CHART_AXES` is enabled (@betodealmeida)
- [#23819](https://github.com/apache/superset/pull/23819) fix: Clean up docker-ephemeral-env secrets command (@michael-s-molina)
- [#23817](https://github.com/apache/superset/pull/23817) fix(rls api): Add missing init file (@jfrag1)
- [#23805](https://github.com/apache/superset/pull/23805) fix(sqllab): test failed due to legacy api url (@justinpark)
- [#23783](https://github.com/apache/superset/pull/23783) fix(datasource): saving new calculated columns (@Always-prog)
- [#23786](https://github.com/apache/superset/pull/23786) fix: Docker ephemeral env (@michael-s-molina)
- [#23797](https://github.com/apache/superset/pull/23797) fix: Context menu crashing when there is no dimension in Echarts Series charts (@kgabryje)
- [#23776](https://github.com/apache/superset/pull/23776) fix: [chart power query] error show when user input column with x-axis (@hughhhh)
- [#23779](https://github.com/apache/superset/pull/23779) fix(native-filters): Fix encoding of non-temporal default values (@john-bodley)
- [#23087](https://github.com/apache/superset/pull/23087) fix(sqllab): Persisting tab state for saved query (@piyush9923)
- [#23757](https://github.com/apache/superset/pull/23757) fix: Drill by modal resizing (@kgabryje)
- [#23754](https://github.com/apache/superset/pull/23754) fix: Further drilling by different groupby fields (@kgabryje)
- [#23758](https://github.com/apache/superset/pull/23758) fix: Make sure the DeprecatedSelect label is always a string (@michael-s-molina)
- [#23157](https://github.com/apache/superset/pull/23157) fix(cache): coerce schema_cache_timeout to None (@cemremengu)
- [#23747](https://github.com/apache/superset/pull/23747) fix(ace-editor): use monospace fonts by default (@villebro)
- [#23737](https://github.com/apache/superset/pull/23737) fix: get or create db with an existing invalid URL (@dpgaspar)
- [#23669](https://github.com/apache/superset/pull/23669) fix(sqllab): infinite running state on disconnect (@justinpark)
- [#22370](https://github.com/apache/superset/pull/22370) fix: is_select check for lowercase select with "WITH" clauses (@fcomuniz)
- [#23695](https://github.com/apache/superset/pull/23695) fix(sqllab): rendering performance regression (@justinpark)
- [#23686](https://github.com/apache/superset/pull/23686) fix: Database modal parameter inputs persisting after modal closed and reopened (@jfrag1)
- [#23675](https://github.com/apache/superset/pull/23675) fix(plugin-chart-echarts): reorder totals and support multimetric sort (@villebro)
- [#23117](https://github.com/apache/superset/pull/23117) fix(ci): Fix GitHub workflow behavior for forks (@jsoref)
- [#23692](https://github.com/apache/superset/pull/23692) fix: Further drill by in Pivot Table (@kgabryje)
- [#23649](https://github.com/apache/superset/pull/23649) fix: Zero values on Dual Line axis bounds (@michael-s-molina)
- [#23641](https://github.com/apache/superset/pull/23641) fix: url_params cache miss with global async query (@kekwan)
- [#23682](https://github.com/apache/superset/pull/23682) fix: allow for dependencies that could be undefined (@eschutho)
- [#23624](https://github.com/apache/superset/pull/23624) fix(docker): optimize docker build by better utilizing build cache (@sebastianliebscher)
- [#23671](https://github.com/apache/superset/pull/23671) fix(sqllab): Revert "rendering performance regression (#23653)" (@justinpark)
- [#23666](https://github.com/apache/superset/pull/23666) fix: presto CI failed test (@hughhhh)
- [#23604](https://github.com/apache/superset/pull/23604) fix: update log message for ALERT_REPORTS_NOTIFICATION_DRY_RUN (@nytai)
- [#23653](https://github.com/apache/superset/pull/23653) fix(sqllab): rendering performance regression (@justinpark)
- [#23637](https://github.com/apache/superset/pull/23637) fix: Removes Redux state mutations - iteration 3 (@michael-s-molina)
- [#23611](https://github.com/apache/superset/pull/23611) fix(saved_queries): wrong enum for object_type of saved_query (@akzarma)
- [#23396](https://github.com/apache/superset/pull/23396) fix(Gauge echart): displaying column label (@AkashBoora)
- [#22677](https://github.com/apache/superset/pull/22677) fix(localization): localize legacy pivot table (@artemonsh)
- [#23589](https://github.com/apache/superset/pull/23589) fix(charts): Time range filters are not being applied to charts that were overwritten (@Antonio-RiveroMartnez)
- [#23421](https://github.com/apache/superset/pull/23421) fix(#23176): adding URL decoding to SQLAlchemy URI (@RekhaZemoso)
- [#23617](https://github.com/apache/superset/pull/23617) fix: Error on Cypress test (@michael-s-molina)
- [#23588](https://github.com/apache/superset/pull/23588) fix: Disables email reports for unsaved charts (@michael-s-molina)
- [#23597](https://github.com/apache/superset/pull/23597) fix: Ensure verbose mapping exists for SQL Lab Query model (@john-bodley)
- [#23613](https://github.com/apache/superset/pull/23613) fix: Increases the options limit for Annotation Layers (@michael-s-molina)
- [#23587](https://github.com/apache/superset/pull/23587) fix(docker-compose): Make worker use correct healthcheck (#23455) (@sebastianliebscher)
- [#23129](https://github.com/apache/superset/pull/23129) fix(translation): correct translation errors for Chinese(zh) (@zRich)
- [#23585](https://github.com/apache/superset/pull/23585) fix: Ensure the reporting framework handles charts with no data (@john-bodley)
- [#23579](https://github.com/apache/superset/pull/23579) fix(revert): "fix: cache warmup solution non legacy charts. (#23012)" (@john-bodley)
- [#23535](https://github.com/apache/superset/pull/23535) fix: Removes Redux state mutations - iteration 2 (@michael-s-molina)
- [#23576](https://github.com/apache/superset/pull/23576) fix(dashboard): Cross filters badge for cols with verbose names (@kgabryje)
- [#23567](https://github.com/apache/superset/pull/23567) fix: QueryParamProvider error on backend rendered views (@michael-s-molina)
- [#23548](https://github.com/apache/superset/pull/23548) fix: tags features flag on base models (@hughhhh)
- [#23565](https://github.com/apache/superset/pull/23565) fix: Add default empty array to filter dependencies (@dayknightmare)
- [#23566](https://github.com/apache/superset/pull/23566) fix: Filter values are not updating when dependencies are set (@michael-s-molina)
- [#23533](https://github.com/apache/superset/pull/23533) fix(plugin-chart-table): Include time control (@kgabryje)
- [#23549](https://github.com/apache/superset/pull/23549) fix(sqllab): undefined issue_codes on query error (@justinpark)
- [#23543](https://github.com/apache/superset/pull/23543) fix: Hide FilterBar for Reports (@geido)
- [#23514](https://github.com/apache/superset/pull/23514) fix(sqllab): dedupe table_schemas in active_tab (@justinpark)
- [#23522](https://github.com/apache/superset/pull/23522) fix: Removes Redux state mutations - iteration 1 (@michael-s-molina)
- [#22880](https://github.com/apache/superset/pull/22880) fix: moved alerts and reports default values to config (@Always-prog)
- [#23469](https://github.com/apache/superset/pull/23469) fix(area chart legacy): tool tip shows actual value rather than y axi… (@AkashBoora)
- [#23137](https://github.com/apache/superset/pull/23137) fix(conditional formatting): controls looses on save (@Always-prog)
- [#23517](https://github.com/apache/superset/pull/23517) fix(word cloud): series label format fixed for custom sql queries (@ashgorithm)
- [#23513](https://github.com/apache/superset/pull/23513) fix(plugin-generator): Addresses linter errors in newly generated Superset plugin (@alex-bain)
- [#23512](https://github.com/apache/superset/pull/23512) fix: Dashboard not loading with default first value in filter (@geido)
- [#23521](https://github.com/apache/superset/pull/23521) fix(dashboards): apply tag filter correctly (@akzarma)
- [#23515](https://github.com/apache/superset/pull/23515) fix(plugin-chart-table): Invalid d3Formatter on String column (@justinpark)
- [#23475](https://github.com/apache/superset/pull/23475) fix: Preserves selected scopes when toggling between scope types (@michael-s-molina)
- [#23502](https://github.com/apache/superset/pull/23502) fix(dashboard): Add remark plugin on markdown (@justinpark)
- [#23480](https://github.com/apache/superset/pull/23480) fix: Chart crashing if timeseries_limit_metric is an empty array (@kgabryje)
- [#23378](https://github.com/apache/superset/pull/23378) fix(sqllab): throw errors of commented out query (@justinpark)
- [#23471](https://github.com/apache/superset/pull/23471) fix: broken helm chart ingress (@paulinjo)
- [#23452](https://github.com/apache/superset/pull/23452) fix(chart): add missing toleration for init-job (@ZeJ0hn)
- [#23265](https://github.com/apache/superset/pull/23265) fix(sqllab): dedupe active_tab in tabHistory (@justinpark)
- [#23446](https://github.com/apache/superset/pull/23446) fix: Allow setting ingress hosts directly through yaml (@paulinjo)
- [#23414](https://github.com/apache/superset/pull/23414) fix: prevent ForeignKeyViolation error on delete (@betodealmeida)
- [#23386](https://github.com/apache/superset/pull/23386) fix: schedule query option showing up (@betodealmeida)
- [#23432](https://github.com/apache/superset/pull/23432) fix: safe check when computing chart thumbnail (@zephyring)
- [#23433](https://github.com/apache/superset/pull/23433) fix: database dropdown keys (@betodealmeida)
- [#23389](https://github.com/apache/superset/pull/23389) fix(dashboard): `show_native_filters` leftover (@betodealmeida)
- [#23409](https://github.com/apache/superset/pull/23409) fix(docker): multi-architecture image build (@EugeneTorap)
- [#23400](https://github.com/apache/superset/pull/23400) fix: Select all issue with "Dynamically search all filter values" in FilterBar (@geido)
- [#23330](https://github.com/apache/superset/pull/23330) fix: revert back to use security manager authz for dashboard when get by uuid (@zephyring)
- [#23318](https://github.com/apache/superset/pull/23318) fix: Table sorting reset (@geido)
- [#23376](https://github.com/apache/superset/pull/23376) fix: dataset_macro (@betodealmeida)
- [#23356](https://github.com/apache/superset/pull/23356) fix: table schema permissions (@betodealmeida)
- [#23314](https://github.com/apache/superset/pull/23314) fix(native-filters): Caching scope (@john-bodley)
- [#23365](https://github.com/apache/superset/pull/23365) fix(chart-controls): Error if x_axis_sort and timeseries_limit_metric are included in main metrics (@kgabryje)
- [#23361](https://github.com/apache/superset/pull/23361) fix(safari): remove autocomplete in table select (@villebro)
- [#23302](https://github.com/apache/superset/pull/23302) fix(sqllab): empty large query results from localStorage (@justinpark)
- [#23322](https://github.com/apache/superset/pull/23322) fix(examples): Cleanup granularity_sqla column (@john-bodley)
- [#23324](https://github.com/apache/superset/pull/23324) fix(trino): Disallow alias to source column (@john-bodley)
- [#23329](https://github.com/apache/superset/pull/23329) fix(dashboard): deepmerge htmlSchemaOverrides (@justinpark)
- [#23348](https://github.com/apache/superset/pull/23348) fix: dashboard DAO small code improvement (@dpgaspar)
- [#23347](https://github.com/apache/superset/pull/23347) fix(dashboard): Cross filters with time shifted series (@kgabryje)
- [#23339](https://github.com/apache/superset/pull/23339) fix(trino): normalize non-iso timestamps (@villebro)
- [#23296](https://github.com/apache/superset/pull/23296) fix(clickhouse): Update to working clickhouse-connect version (@genzgd)
- [#23260](https://github.com/apache/superset/pull/23260) fix(examples): Cleanup dashboard filter scopes (@john-bodley)
- [#23283](https://github.com/apache/superset/pull/23283) fix(dashboard): Allow selecting text in cells in Table and PivotTable without triggering cross filters (@kgabryje)
- [#23262](https://github.com/apache/superset/pull/23262) fix: ignore ts warnings from older typescript versions (@eschutho)
- [#23256](https://github.com/apache/superset/pull/23256) fix(dashboard): Missing filter card styles (@kgabryje)
- [#23250](https://github.com/apache/superset/pull/23250) fix(dashboard): Cross-filter search icon in filter bar (@kgabryje)
- [#23242](https://github.com/apache/superset/pull/23242) fix: Video Game Sales dashboard default filters (@john-bodley)
- [#23239](https://github.com/apache/superset/pull/23239) fix(explore): Dashboard filters on adhoc cols not working in Explore (@kgabryje)
- [#23194](https://github.com/apache/superset/pull/23194) fix(dashboard): Cross-filters not working properly for new dashboards (@kgabryje)
- [#23215](https://github.com/apache/superset/pull/23215) fix(dashboard): Page crashing when cross filter applied on adhoc column (@kgabryje)
- [#23202](https://github.com/apache/superset/pull/23202) fix(docs): Change postgres to postgresql in brew install command (@lyndsiWilliams)
- [#23130](https://github.com/apache/superset/pull/23130) fix: Pagination of VirtualTable (@EugeneTorap)
- [#23022](https://github.com/apache/superset/pull/23022) fix(dashboard): Chart's empty state not centered (@kgabryje)
- [#23135](https://github.com/apache/superset/pull/23135) fix: gamma sql_json test (@dpgaspar)
- [#23126](https://github.com/apache/superset/pull/23126) fix(ci): explicity set yaml Loader (@villebro)
**Others**
- [#24613](https://github.com/apache/superset/pull/24613) build(deps): bump tox from 4.6.3 to 4.6.4 in /requirements (@dependabot[bot])
- [#24769](https://github.com/apache/superset/pull/24769) docs: update security policy and add CVE info (@dpgaspar)
- [#24758](https://github.com/apache/superset/pull/24758) chore(view_api): return application/json as content-type for api/v1/form_data endpoint (@zephyring)
- [#24759](https://github.com/apache/superset/pull/24759) chore(docs): Adding link to additional visualization content (@rusackas)
- [#24766](https://github.com/apache/superset/pull/24766) docs: Fix STANDARD_ROLES.md for Gamma role permissions on tableschemaview (@mattitoo)
- [#24736](https://github.com/apache/superset/pull/24736) chore: make control panel sub sections look better (@mistercrunch)
- [#24559](https://github.com/apache/superset/pull/24559) chore(native filters): Expandable filter config modal (@justinpark)
- [#24741](https://github.com/apache/superset/pull/24741) chore: make antd table font size same as data table (@mistercrunch)
- [#24627](https://github.com/apache/superset/pull/24627) chore: turn off talisman for ephemeral environments in ci (@eschutho)
- [#24731](https://github.com/apache/superset/pull/24731) chore: Bump PyYAML bounds (@john-bodley)
- [#24694](https://github.com/apache/superset/pull/24694) chore: Remove obsolete legacy visualizations (@john-bodley)
- [#24689](https://github.com/apache/superset/pull/24689) chore: move deprecated default version to 4.0.0 (@dpgaspar)
- [#24607](https://github.com/apache/superset/pull/24607) chore(command): Condense delete/bulk-delete operations (@john-bodley)
- [#24647](https://github.com/apache/superset/pull/24647) chore: Bump holidays to 0.28 (@arkid15r)
- [#24652](https://github.com/apache/superset/pull/24652) chore: Bump/relax Flask libs (@john-bodley)
- [#24466](https://github.com/apache/superset/pull/24466) chore(dao): Condense delete/bulk-delete operations (@john-bodley)
- [#24554](https://github.com/apache/superset/pull/24554) chore(sqllab): Log current local storage usage (@justinpark)
- [#24586](https://github.com/apache/superset/pull/24586) chore(metastore-cache): add codec support (@villebro)
- [#24452](https://github.com/apache/superset/pull/24452) build(deps): bump tox from 4.6.1 to 4.6.3 in /requirements (@dependabot[bot])
- [#24524](https://github.com/apache/superset/pull/24524) build(deps-dev): bump @types/node from 20.3.1 to 20.3.2 in /superset-websocket (@dependabot[bot])
- [#24522](https://github.com/apache/superset/pull/24522) build(deps-dev): bump @typescript-eslint/parser from 5.60.0 to 5.60.1 in /superset-websocket (@dependabot[bot])
- [#24501](https://github.com/apache/superset/pull/24501) build(deps): bump semver from 7.3.8 to 7.5.3 in /superset-websocket/utils/client-ws-app (@dependabot[bot])
- [#24404](https://github.com/apache/superset/pull/24404) chore: deprecate FLASK_ENV and improve conf.ENVIRONMENT_TAG_CONFIG (@mistercrunch)
- [#24534](https://github.com/apache/superset/pull/24534) build(docker): add dockerize image (@alekseyolg)
- [#24462](https://github.com/apache/superset/pull/24462) docs: updating images and markdown (@rusackas)
- [#24543](https://github.com/apache/superset/pull/24543) chore: Un-revert enabling CSP by default (@kgabryje)
- [#24514](https://github.com/apache/superset/pull/24514) refactor: pkg_resources -> importlib.metadata (@cwegener)
- [#24538](https://github.com/apache/superset/pull/24538) chore: Constrain selenium version (@john-bodley)
- [#24505](https://github.com/apache/superset/pull/24505) chore: update d3-colors (@hughhhh)
- [#24499](https://github.com/apache/superset/pull/24499) chore: remove marshmallow-enum dependency and bump FAB (@dpgaspar)
- [#24504](https://github.com/apache/superset/pull/24504) build(docker): simplification of assembly to facilitate further support (@alekseyolg)
- [#24503](https://github.com/apache/superset/pull/24503) chore: update ansi-regex (@hughhhh)
- [#24489](https://github.com/apache/superset/pull/24489) chore(sqllab): add extra_json on tabstate (@justinpark)
- [#24497](https://github.com/apache/superset/pull/24497) build(docker): pin the underlying debain base image (@boenshao)
- [#24371](https://github.com/apache/superset/pull/24371) chore(sqllab): Remove table metadata from state (@justinpark)
- [#24443](https://github.com/apache/superset/pull/24443) build(deps-dev): bump eslint from 8.42.0 to 8.43.0 in /superset-websocket (@dependabot[bot])
- [#24454](https://github.com/apache/superset/pull/24454) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.11 to 5.60.0 in /superset-websocket (@dependabot[bot])
- [#24474](https://github.com/apache/superset/pull/24474) docs: Add CTA to community calendar subscription (@thiagorossener)
- [#24465](https://github.com/apache/superset/pull/24465) chore(dao): Add generic type for better type checking (@john-bodley)
- [#24397](https://github.com/apache/superset/pull/24397) build(deps): bump pre-commit from 3.3.2 to 3.3.3 in /requirements (@dependabot[bot])
- [#24453](https://github.com/apache/superset/pull/24453) build(deps-dev): bump @typescript-eslint/parser from 5.59.11 to 5.60.0 in /superset-websocket (@dependabot[bot])
- [#24262](https://github.com/apache/superset/pull/24262) chore: Enable CSP by default (@kgabryje)
- [#23853](https://github.com/apache/superset/pull/23853) chore: Migrate warm up cache endpoint to api v1 (@jfrag1)
- [#24331](https://github.com/apache/superset/pull/24331) chore(dao): Organize DAOs according to SIP-92 (@john-bodley)
- [#23835](https://github.com/apache/superset/pull/23835) docs: Show clickable link instead of code-formatting (@rusackas)
- [#24437](https://github.com/apache/superset/pull/24437) chore: toning down grayscale on X icon (@mistercrunch)
- [#24415](https://github.com/apache/superset/pull/24415) chore: Remove obsolete Druid NoSQL REGEX operator (@john-bodley)
- [#24419](https://github.com/apache/superset/pull/24419) build(deps): bump tox from 4.6.0 to 4.6.1 in /requirements (@dependabot[bot])
- [#24378](https://github.com/apache/superset/pull/24378) build(deps-dev): bump @types/node from 20.2.5 to 20.3.1 in /superset-websocket (@dependabot[bot])
- [#24403](https://github.com/apache/superset/pull/24403) chore: cleanup sqlalchemy warnings (@mistercrunch)
- [#24430](https://github.com/apache/superset/pull/24430) chore(ci): make eslint and jest run in --quiet mode (@mistercrunch)
- [#24423](https://github.com/apache/superset/pull/24423) chore: remove deprecated apis /slice_json/ and /annotation_json/ (@dpgaspar)
- [#24400](https://github.com/apache/superset/pull/24400) chore: remove deprecated apis and ENABLE_BROAD_ACTIVITY_ACCESS (@dpgaspar)
- [#24393](https://github.com/apache/superset/pull/24393) docs: Restyle documentation landing page and community page (@thiagorossener)
- [#24401](https://github.com/apache/superset/pull/24401) chore: Remove previously deprecated dataset metrics column from RESTful API (@john-bodley)
- [#24375](https://github.com/apache/superset/pull/24375) chore: remove deprecated apis on superset, get_or_create_table, sqllab_viz (@dpgaspar)
- [#24379](https://github.com/apache/superset/pull/24379) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.9 to 5.59.11 in /superset-websocket (@dependabot[bot])
- [#24310](https://github.com/apache/superset/pull/24310) chore: Update GitHub issue templates (@john-bodley)
- [#24365](https://github.com/apache/superset/pull/24365) build(deps-dev): bump @typescript-eslint/parser from 5.59.8 to 5.59.11 in /superset-websocket (@dependabot[bot])
- [#24360](https://github.com/apache/superset/pull/24360) chore: remove deprecated apis stop_query, queries, search_queries (@dpgaspar)
- [#24353](https://github.com/apache/superset/pull/24353) chore: remove deprecated apis copy_dash, save_dash and add_slices (@dpgaspar)
- [#24198](https://github.com/apache/superset/pull/24198) chore: remove user registrations menu for non-admins (@villebro)
- [#24354](https://github.com/apache/superset/pull/24354) chore: remove deprecated apis on superset, testconn, validate_sql_json, schemas_access_for_file_upload (@dpgaspar)
- [#24381](https://github.com/apache/superset/pull/24381) chore: remove deprecated api /superset/available_domains (@dpgaspar)
- [#24359](https://github.com/apache/superset/pull/24359) chore: remove deprecated apis estimate_query_cost, results, sql_json, csv (@dpgaspar)
- [#24286](https://github.com/apache/superset/pull/24286) build(deps-dev): bump eslint from 8.41.0 to 8.42.0 in /superset-websocket (@dependabot[bot])
- [#24338](https://github.com/apache/superset/pull/24338) build(deps-dev): bump @types/uuid from 9.0.1 to 9.0.2 in /superset-websocket (@dependabot[bot])
- [#24337](https://github.com/apache/superset/pull/24337) build(deps-dev): bump @types/ws from 8.5.4 to 8.5.5 in /superset-websocket (@dependabot[bot])
- [#24362](https://github.com/apache/superset/pull/24362) chore: Disable redux errors (@kgabryje)
- [#24342](https://github.com/apache/superset/pull/24342) chore: remove deprecated api /superset/tables/<int:db_id>/... (@dpgaspar)
- [#24335](https://github.com/apache/superset/pull/24335) chore: remove deprecated api /superset/filter/... (@dpgaspar)
- [#24333](https://github.com/apache/superset/pull/24333) chore: remove deprecated api /superset/datasources (@dpgaspar)
- [#23997](https://github.com/apache/superset/pull/23997) chore(druid): Remove legacy Druid NoSQL logic (@john-bodley)
- [#24330](https://github.com/apache/superset/pull/24330) chore: Removes getUiOverrideRegistry (@michael-s-molina)
- [#24339](https://github.com/apache/superset/pull/24339) docs: Add BurdaForward to "In the Wild" and merge "News" and "Entertainment" to "Media & Entertainment" (@mattitoo)
- [#24082](https://github.com/apache/superset/pull/24082) chore(sqllab): Remove validation result from state (@justinpark)
- [#24322](https://github.com/apache/superset/pull/24322) chore: Deprecates some NVD3 charts in 3.0 (@michael-s-molina)
- [#24313](https://github.com/apache/superset/pull/24313) docs: add link to intro with supported database types (@sfirke)
- [#24312](https://github.com/apache/superset/pull/24312) chore: Remove unused sliceCanEdit logic (@john-bodley)
- [#24299](https://github.com/apache/superset/pull/24299) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.8 to 5.59.9 in /superset-websocket (@dependabot[bot])
- [#24297](https://github.com/apache/superset/pull/24297) build(deps): bump tox from 4.5.2 to 4.6.0 in /requirements (@dependabot[bot])
- [#24295](https://github.com/apache/superset/pull/24295) chore: Adds #24029 breaking change to UPDATING.md (@michael-s-molina)
- [#24288](https://github.com/apache/superset/pull/24288) docs: Adds new permissions from 2.1.0 and fixes some sql_lab permissions (@mattitoo)
- [#24250](https://github.com/apache/superset/pull/24250) chore(build): creating default superset_text.yaml placeholder file (@rusackas)
- [#24118](https://github.com/apache/superset/pull/24118) chore(docs): upgrading docusaurus (fixes header links) (@rusackas)
- [#24110](https://github.com/apache/superset/pull/24110) build(deps): bump pre-commit from 3.3.1 to 3.3.2 in /requirements (@dependabot[bot])
- [#24246](https://github.com/apache/superset/pull/24246) build(deps-dev): bump @typescript-eslint/parser from 5.59.7 to 5.59.8 in /superset-websocket (@dependabot[bot])
- [#24253](https://github.com/apache/superset/pull/24253) docs: fix broken link in the security page (@eltimen)
- [#24251](https://github.com/apache/superset/pull/24251) chore: tests for #24249 (@betodealmeida)
- [#24206](https://github.com/apache/superset/pull/24206) chore(native-filters): Ensure consistent error handling (@john-bodley)
- [#24231](https://github.com/apache/superset/pull/24231) docs: removed extra ` from documentation (@SaishNarvekar)
- [#24235](https://github.com/apache/superset/pull/24235) docs: point the reader to "setup.py" for latest package version (@boenshao)
- [#24245](https://github.com/apache/superset/pull/24245) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.7 to 5.59.8 in /superset-websocket (@dependabot[bot])
- [#24240](https://github.com/apache/superset/pull/24240) build(deps-dev): bump @types/node from 20.2.3 to 20.2.5 in /superset-websocket (@dependabot[bot])
- [#24239](https://github.com/apache/superset/pull/24239) build(deps): bump winston from 3.8.2 to 3.9.0 in /superset-websocket (@dependabot[bot])
- [#24238](https://github.com/apache/superset/pull/24238) build(deps): bump tox from 4.5.1 to 4.5.2 in /requirements (@dependabot[bot])
- [#24214](https://github.com/apache/superset/pull/24214) refactor: Extracts type definitions from ExtensionsRegistry (@michael-s-molina)
- [#24184](https://github.com/apache/superset/pull/24184) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.6 to 5.59.7 in /superset-websocket (@dependabot[bot])
- [#24167](https://github.com/apache/superset/pull/24167) build(deps-dev): bump eslint from 8.40.0 to 8.41.0 in /superset-websocket (@dependabot[bot])
- [#24183](https://github.com/apache/superset/pull/24183) build(deps-dev): bump @typescript-eslint/parser from 5.59.6 to 5.59.7 in /superset-websocket (@dependabot[bot])
- [#24202](https://github.com/apache/superset/pull/24202) chore(ssh): Allow users to set TUNNEL_TIMEOUT from config (@hughhhh)
- [#24026](https://github.com/apache/superset/pull/24026) chore(sqllab): Remove functionNames from sqlLab state (@justinpark)
- [#24045](https://github.com/apache/superset/pull/24045) chore: Bump sqlparse to 0.4.4 (@EugeneTorap)
- [#24168](https://github.com/apache/superset/pull/24168) build(deps-dev): bump @types/node from 20.2.0 to 20.2.3 in /superset-websocket (@dependabot[bot])
- [#24135](https://github.com/apache/superset/pull/24135) chore(sqllab): remove deprecated PyArrow API (@sebastianliebscher)
- [#24128](https://github.com/apache/superset/pull/24128) chore: deprecate rls base related filters (@villebro)
- [#24117](https://github.com/apache/superset/pull/24117) chore: Refactor command exceptions (@john-bodley)
- [#24029](https://github.com/apache/superset/pull/24029) chore: Update QUERY_LOGGER and SQL_QUERY_MUTATOR signatures (@john-bodley)
- [#24107](https://github.com/apache/superset/pull/24107) chore(report): Use for/else clause (@john-bodley)
- [#24111](https://github.com/apache/superset/pull/24111) build(deps-dev): bump @types/node from 20.1.7 to 20.2.0 in /superset-websocket (@dependabot[bot])
- [#23941](https://github.com/apache/superset/pull/23941) build: helm template to set init job annotations (@ybudweiser)
- [#24106](https://github.com/apache/superset/pull/24106) chore: update packages for vanta FE security concerns (@hughhhh)
- [#24087](https://github.com/apache/superset/pull/24087) build(deps-dev): bump @types/node from 20.1.4 to 20.1.7 in /superset-websocket (@dependabot[bot])
- [#22801](https://github.com/apache/superset/pull/22801) chore(thumbnails): change default executor to logged in user (@villebro)
- [#24081](https://github.com/apache/superset/pull/24081) chore(docs): Updating DB connection instructions in 1st Dash instruct… (@rusackas)
- [#22799](https://github.com/apache/superset/pull/22799) chore(reports): change default executor to owner (@villebro)
- [#24073](https://github.com/apache/superset/pull/24073) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.5 to 5.59.6 in /superset-websocket (@dependabot[bot])
- [#24050](https://github.com/apache/superset/pull/24050) chore: add extension for related DB assets on delete (@betodealmeida)
- [#24074](https://github.com/apache/superset/pull/24074) build(deps-dev): bump @typescript-eslint/parser from 5.59.2 to 5.59.6 in /superset-websocket (@dependabot[bot])
- [#24080](https://github.com/apache/superset/pull/24080) chore(docs): tidy up supported DB engines for metadata store (@sfirke)
- [#24079](https://github.com/apache/superset/pull/24079) chore(docs): Updated awkward phrase in FAQ, "force" (@kikobarr)
- [#24069](https://github.com/apache/superset/pull/24069) chore(trino): Bump Trino version to address an IANA time zone issue (@john-bodley)
- [#23581](https://github.com/apache/superset/pull/23581) chore: bump dependencies (@betodealmeida)
- [#24065](https://github.com/apache/superset/pull/24065) build(deps): bump vm2 from 3.9.15 to 3.9.18 in /superset-frontend/cypress-base (@dependabot[bot])
- [#24066](https://github.com/apache/superset/pull/24066) build(deps): bump vm2 from 3.9.17 to 3.9.18 in /superset-frontend (@dependabot[bot])
- [#24058](https://github.com/apache/superset/pull/24058) chore: add log for ssh tunnel information (@hughhhh)
- [#24025](https://github.com/apache/superset/pull/24025) chore(docs): add version for postgres when doing brew install (@rusackas)
- [#24052](https://github.com/apache/superset/pull/24052) build(deps-dev): bump @types/node from 20.1.2 to 20.1.4 in /superset-websocket (@dependabot[bot])
- [#23965](https://github.com/apache/superset/pull/23965) chore: bump werkzeug and Flask (@dpgaspar)
- [#24033](https://github.com/apache/superset/pull/24033) chore: Update mypy and fix stubs issue (@EugeneTorap)
- [#24023](https://github.com/apache/superset/pull/24023) chore: remove duplicates of `validate_adhoc_subquery` (@betodealmeida)
- [#24001](https://github.com/apache/superset/pull/24001) chore: remove deprecated distutils (@sebastianliebscher)
- [#24017](https://github.com/apache/superset/pull/24017) build(deps-dev): bump @types/node from 20.1.1 to 20.1.2 in /superset-websocket (@dependabot[bot])
- [#23756](https://github.com/apache/superset/pull/23756) test: cover empty AdvancedDataTypes internet_address and internet_port (@sebastianliebscher)
- [#23770](https://github.com/apache/superset/pull/23770) chore: fix deprecation warnings for SQLALchemy URL (@sebastianliebscher)
- [#23976](https://github.com/apache/superset/pull/23976) chore: mark explore_json as deprecated in 3.0 (@betodealmeida)
- [#23981](https://github.com/apache/superset/pull/23981) chore: Deprecate DND feature flags (@kgabryje)
- [#23984](https://github.com/apache/superset/pull/23984) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.2 to 5.59.5 in /superset-websocket (@dependabot[bot])
- [#23983](https://github.com/apache/superset/pull/23983) build(deps-dev): bump @types/node from 20.1.0 to 20.1.1 in /superset-websocket (@dependabot[bot])
- [#23951](https://github.com/apache/superset/pull/23951) chore(deps): Add dependency-review action (@rusackas)
- [#23974](https://github.com/apache/superset/pull/23974) chore(actions): adding JavaScript to CodeQL config (@rusackas)
- [#24002](https://github.com/apache/superset/pull/24002) chore: Comment 3.8 PY required CI checks (@EugeneTorap)
- [#23986](https://github.com/apache/superset/pull/23986) chore: Bump python libs (@EugeneTorap)
- [#23994](https://github.com/apache/superset/pull/23994) docs(feature flags): remove the conflicting entry for DRILL_BY (@sfirke)
- [#23760](https://github.com/apache/superset/pull/23760) chore(sqllab): Refactor react-query by redux-toolkit query (@justinpark)
- [#23961](https://github.com/apache/superset/pull/23961) build(deps-dev): bump eslint from 8.39.0 to 8.40.0 in /superset-websocket (@dependabot[bot])
- [#23962](https://github.com/apache/superset/pull/23962) build(deps-dev): bump @types/node from 20.0.0 to 20.1.0 in /superset-websocket (@dependabot[bot])
- [#23744](https://github.com/apache/superset/pull/23744) chore(slack): use recommended method for file upload (@betodealmeida)
- [#23923](https://github.com/apache/superset/pull/23923) chore(helm): Split service templates into separate files (@dnskr)
- [#23936](https://github.com/apache/superset/pull/23936) chore: deprecate /superset/add_slices (@dpgaspar)
- [#23911](https://github.com/apache/superset/pull/23911) docs: fixing a broken markdown link about SSH tunneling (@rusackas)
- [#23949](https://github.com/apache/superset/pull/23949) chore: add codeQL to CI (@dpgaspar)
- [#23947](https://github.com/apache/superset/pull/23947) build(deps-dev): bump @types/node from 18.16.3 to 20.0.0 in /superset-websocket (@dependabot[bot])
- [#23926](https://github.com/apache/superset/pull/23926) chore(helm): Declare missing properties (@dnskr)
- [#23934](https://github.com/apache/superset/pull/23934) chore: Deprecates viz.py (@michael-s-molina)
- [#23795](https://github.com/apache/superset/pull/23795) docs: Add description of standard Superset roles (@mattitoo)
- [#23871](https://github.com/apache/superset/pull/23871) refactor: useEffectEvent for efficient deps (@justinpark)
- [#23913](https://github.com/apache/superset/pull/23913) build(deps): bump pre-commit from 3.2.2 to 3.3.1 in /requirements (@dependabot[bot])
- [#23895](https://github.com/apache/superset/pull/23895) chore(ci): bump actions (@sebastianliebscher)
- [#23841](https://github.com/apache/superset/pull/23841) build(deps-dev): bump @types/jsonwebtoken from 9.0.1 to 9.0.2 in /superset-websocket (@dependabot[bot])
- [#23894](https://github.com/apache/superset/pull/23894) build(deps-dev): bump @typescript-eslint/parser from 5.59.0 to 5.59.2 in /superset-websocket (@dependabot[bot])
- [#23891](https://github.com/apache/superset/pull/23891) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.59.0 to 5.59.2 in /superset-websocket (@dependabot[bot])
- [#23726](https://github.com/apache/superset/pull/23726) chore(helm): Use template comments for the chart license header (@dnskr)
- [#23887](https://github.com/apache/superset/pull/23887) build(deps-dev): bump @types/node from 18.16.0 to 18.16.3 in /superset-websocket (@dependabot[bot])
- [#23849](https://github.com/apache/superset/pull/23849) chore: Add Cypress tests for drill by (@kgabryje)
- [#23680](https://github.com/apache/superset/pull/23680) chore: bump wtforms and add missing flask-limiter (@dpgaspar)
- [#23862](https://github.com/apache/superset/pull/23862) chore: Use nh3 lib instead of bleach (@EugeneTorap)
- [#23844](https://github.com/apache/superset/pull/23844) chore: Bump polyline to 2.0.0 (@EugeneTorap)
- [#23845](https://github.com/apache/superset/pull/23845) chore: Bump redis to 4.5.4 (@EugeneTorap)
- [#23854](https://github.com/apache/superset/pull/23854) chore: Add logging events for drill by (@kgabryje)
- [#23729](https://github.com/apache/superset/pull/23729) chore: migrate `sqllab_viz` endpoint to api v1 (@hughhhh)
- [#23813](https://github.com/apache/superset/pull/23813) chore: Upgrade Cypress to 10.11.0 (@kgabryje)
- [#23794](https://github.com/apache/superset/pull/23794) docs: discourage the use of SQLite (@dpgaspar)
- [#23785](https://github.com/apache/superset/pull/23785) chore: Deprecates 3.0 consented feature flags (@michael-s-molina)
- [#23820](https://github.com/apache/superset/pull/23820) docs: Add Superset Overview Video to README (@satokonak)
- [#23796](https://github.com/apache/superset/pull/23796) docs: cleanup references to `apache-superset/superset-ui` (@charpeni)
- [#22916](https://github.com/apache/superset/pull/22916) chore: Add tests to SQL lab button components (@diegomedina248)
- [#23791](https://github.com/apache/superset/pull/23791) build(deps-dev): bump @types/node from 18.15.13 to 18.16.0 in /superset-websocket (@dependabot[bot])
- [#23790](https://github.com/apache/superset/pull/23790) build(deps-dev): bump eslint from 8.38.0 to 8.39.0 in /superset-websocket (@dependabot[bot])
- [#23789](https://github.com/apache/superset/pull/23789) build(deps-dev): bump prettier from 2.8.7 to 2.8.8 in /superset-websocket (@dependabot[bot])
- [#23798](https://github.com/apache/superset/pull/23798) chore: Add DRILL_BY to FEATURE_FLAGS.md (@kgabryje)
- [#23784](https://github.com/apache/superset/pull/23784) chore: Deprecates FilterBox (@michael-s-molina)
- [#23765](https://github.com/apache/superset/pull/23765) build(deps-dev): bump @types/node from 18.15.12 to 18.15.13 in /superset-websocket (@dependabot[bot])
- [#23772](https://github.com/apache/superset/pull/23772) chore(e2e): skip the worst offender of flaky tests. (@rusackas)
- [#23670](https://github.com/apache/superset/pull/23670) chore(feature flags): updating the status of a few flags (@rusackas)
- [#23704](https://github.com/apache/superset/pull/23704) chore: remove RemovedInMarshmallow4 warnings (@sebastianliebscher)
- [#23759](https://github.com/apache/superset/pull/23759) chore(actions): Fix for Chromatic action using actions/checkout@v3 (@rusackas)
- [#23725](https://github.com/apache/superset/pull/23725) chore(docs): copy change submitted through BugHerd (@rusackas)
- [#23488](https://github.com/apache/superset/pull/23488) refactor(sqllab): Remove tableOptions from redux state (@justinpark)
- [#23746](https://github.com/apache/superset/pull/23746) build(deps-dev): bump @types/node from 18.15.11 to 18.15.12 in /superset-websocket (@dependabot[bot])
- [#23753](https://github.com/apache/superset/pull/23753) build(deps): bump vm2 from 3.9.15 to 3.9.17 in /superset-frontend (@dependabot[bot])
- [#23718](https://github.com/apache/superset/pull/23718) build(deps-dev): bump @typescript-eslint/parser from 5.58.0 to 5.59.0 in /superset-websocket (@dependabot[bot])
- [#23734](https://github.com/apache/superset/pull/23734) chore(chart-data): add post processing error message to response (@villebro)
- [#23678](https://github.com/apache/superset/pull/23678) chore(api v1): Deprecate datasource/save and datasource/get endpoints (@jfrag1)
- [#23714](https://github.com/apache/superset/pull/23714) chore(api v1): Deprecate superset/override_role_permissions endpoint (@jfrag1)
- [#23681](https://github.com/apache/superset/pull/23681) chore(helm): Reformat helm chart templates (@dnskr)
- [#23719](https://github.com/apache/superset/pull/23719) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.58.0 to 5.59.0 in /superset-websocket (@dependabot[bot])
- [#23663](https://github.com/apache/superset/pull/23663) chore: Removes deprecated feature flags for 3.0 (@michael-s-molina)
- [#23683](https://github.com/apache/superset/pull/23683) docs(translations): point broken tutorial link to Internet Archive copy (@sfirke)
- [#23674](https://github.com/apache/superset/pull/23674) chore(presto): Expose schema and indexes to \_partition_query method (@john-bodley)
- [#23609](https://github.com/apache/superset/pull/23609) docs: nvm error while local setup (@Abhishek-kumar-samsung)
- [#23654](https://github.com/apache/superset/pull/23654) chore: Update cross-filter tooltip text (@yousoph)
- [#23651](https://github.com/apache/superset/pull/23651) chore: Removes the UX_BETA feature flag (@michael-s-molina)
- [#23652](https://github.com/apache/superset/pull/23652) chore: Enables GENERIC_CHART_AXES by default (@michael-s-molina)
- [#23656](https://github.com/apache/superset/pull/23656) chore(db_engine_specs): Refactor get_index (@john-bodley)
- [#23460](https://github.com/apache/superset/pull/23460) refactor: introduce redux toolkit (@justinpark)
- [#23642](https://github.com/apache/superset/pull/23642) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.57.1 to 5.58.0 in /superset-websocket (@dependabot[bot])
- [#23643](https://github.com/apache/superset/pull/23643) build(deps-dev): bump @typescript-eslint/parser from 5.57.1 to 5.58.0 in /superset-websocket (@dependabot[bot])
- [#23646](https://github.com/apache/superset/pull/23646) docs: update CHANGELOG with 2.1.0 (@dpgaspar)
- [#23640](https://github.com/apache/superset/pull/23640) chore(feature flag): removing unused ENFORCE_DB_ENCRYPTION_UI flag (@rusackas)
- [#22853](https://github.com/apache/superset/pull/22853) chore: Refactor ExploreMixin to power both Datasets (SqlaTable) and Query models (@hughhhh)
- [#22853](https://github.com/apache/superset/pull/22853) chore: Refactor ExploreMixin to power both Datasets (SqlaTable) and Query models (@hughhhh)
- [#23633](https://github.com/apache/superset/pull/23633) build(deps-dev): bump eslint from 8.36.0 to 8.38.0 in /superset-websocket (@dependabot[bot])
- [#23625](https://github.com/apache/superset/pull/23625) build(deps): bump vm2 from 3.9.14 to 3.9.15 in /superset-frontend/cypress-base (@dependabot[bot])
- [#19733](https://github.com/apache/superset/pull/19733) docs(contributing): add local vscode config for backend debugging (@cemremengu)
- [#23626](https://github.com/apache/superset/pull/23626) build(deps): bump vm2 from 3.9.13 to 3.9.15 in /superset-frontend (@dependabot[bot])
- [#23572](https://github.com/apache/superset/pull/23572) build(deps-dev): bump @typescript-eslint/parser from 5.55.0 to 5.57.1 in /superset-websocket (@dependabot[bot])
- [#23112](https://github.com/apache/superset/pull/23112) chore: Migrate copy_dash endpoint to api v1 (@jfrag1)
- [#23596](https://github.com/apache/superset/pull/23596) chore(deps): bump kind-of dependency (@rusackas)
- [#23595](https://github.com/apache/superset/pull/23595) chore(deps): bumps ansi-regex to 5.0.1 (@rusackas)
- [#23482](https://github.com/apache/superset/pull/23482) refactor: Moves CRUD features to src/features (@michael-s-molina)
- [#23537](https://github.com/apache/superset/pull/23537) docs(security): more context around Talisman, note side effect of force_https on Alerts & Reports (@sfirke)
- [#23573](https://github.com/apache/superset/pull/23573) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.55.0 to 5.57.1 in /superset-websocket (@dependabot[bot])
- [#23518](https://github.com/apache/superset/pull/23518) build(deps-dev): bump @types/node from 18.15.5 to 18.15.11 in /superset-websocket (@dependabot[bot])
- [#23571](https://github.com/apache/superset/pull/23571) build(deps): bump pre-commit from 3.2.0 to 3.2.2 in /requirements (@dependabot[bot])
- [#23496](https://github.com/apache/superset/pull/23496) build(deps-dev): bump prettier from 2.8.6 to 2.8.7 in /superset-websocket (@dependabot[bot])
- [#23544](https://github.com/apache/superset/pull/23544) chore: Remove wrong information from the Alerts & Reports docs (@geido)
- [#22964](https://github.com/apache/superset/pull/22964) chore: Migrate /superset/user_slices and /superset/fave_slices to API v1 (@diegomedina248)
- [#23491](https://github.com/apache/superset/pull/23491) perf(sqla): avoid unnecessary type check on adhoc column (@villebro)
- [#22803](https://github.com/apache/superset/pull/22803) chore(welcome): harmonize submenu with other routes (@villebro)
- [#23527](https://github.com/apache/superset/pull/23527) ci: disable flaky async test (@villebro)
- [#23536](https://github.com/apache/superset/pull/23536) chore: allow logs to show error levels for ssh tunnel (@hughhhh)
- [#23481](https://github.com/apache/superset/pull/23481) chore: Adds a tooltip to pre-filter in native filters modal (@michael-s-molina)
- [#23165](https://github.com/apache/superset/pull/23165) chore: Migrate /superset/favstar to API v1 (@diegomedina248)
- [#23501](https://github.com/apache/superset/pull/23501) docs: Adds notes to Superset plugin generator about TypeScript errors (@alex-bain)
- [#23477](https://github.com/apache/superset/pull/23477) chore: Changes the inputs of native filters modal to have the same width (@michael-s-molina)
- [#23429](https://github.com/apache/superset/pull/23429) chore: Dataset specific MetadataBar (@kgabryje)
- [#23465](https://github.com/apache/superset/pull/23465) perf(postprocessing): improve pivot postprocessing operation (@Usiel)
- [#23420](https://github.com/apache/superset/pull/23420) docs(contributing): How create or change SECRET_KEY (@pankajsoni22)
- [#23437](https://github.com/apache/superset/pull/23437) build(deps-dev): bump eslint-config-prettier from 8.7.0 to 8.8.0 in /superset-websocket (@dependabot[bot])
- [#23257](https://github.com/apache/superset/pull/23257) chore(sqllab): Remove schemaOptions from redux store (@justinpark)
- [#23417](https://github.com/apache/superset/pull/23417) docs(contributing): added note for creating SECRET_KEY (@Govindarajan-D)
- [#23438](https://github.com/apache/superset/pull/23438) build(deps-dev): bump @types/node from 18.15.3 to 18.15.5 in /superset-websocket (@dependabot[bot])
- [#23451](https://github.com/apache/superset/pull/23451) build(deps-dev): bump prettier from 2.8.4 to 2.8.6 in /superset-websocket (@dependabot[bot])
- [#23430](https://github.com/apache/superset/pull/23430) chore: Add DRILL_BY feature flag (@kgabryje)
- [#23398](https://github.com/apache/superset/pull/23398) chore: Update typing for `Table` component (@hughhhh)
- [#23422](https://github.com/apache/superset/pull/23422) build(deps): bump pre-commit from 3.1.0 to 3.2.0 in /requirements (@dependabot[bot])
- [#23342](https://github.com/apache/superset/pull/23342) build(deps-dev): bump eslint from 8.35.0 to 8.36.0 in /superset-websocket (@dependabot[bot])
- [#23431](https://github.com/apache/superset/pull/23431) docs(security): note the need to set TALISMAN_ENABLED = True (@sfirke)
- [#23303](https://github.com/apache/superset/pull/23303) chore(native-filters): Fetch only the required dataset fields (@john-bodley)
- [#23331](https://github.com/apache/superset/pull/23331) chore: update releasing process for testing (@eschutho)
- [#23226](https://github.com/apache/superset/pull/23226) chore: Hugh/migrate estimate query cost to v1 (@hughhhh)
- [#23359](https://github.com/apache/superset/pull/23359) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.53.0 to 5.55.0 in /superset-websocket (@dependabot[bot])
- [#23366](https://github.com/apache/superset/pull/23366) build(deps-dev): bump webpack from 5.52.1 to 5.76.0 in /superset-frontend (@dependabot[bot])
- [#23343](https://github.com/apache/superset/pull/23343) build(deps): bump ws from 8.12.1 to 8.13.0 in /superset-websocket (@dependabot[bot])
- [#23403](https://github.com/apache/superset/pull/23403) chore(docs): three typos (@rusackas)
- [#23385](https://github.com/apache/superset/pull/23385) chore: improve schema security (@betodealmeida)
- [#23368](https://github.com/apache/superset/pull/23368) build(deps-dev): bump webpack from 5.64.0 to 5.76.0 in /docs (@dependabot[bot])
- [#23367](https://github.com/apache/superset/pull/23367) build(deps-dev): bump webpack from 5.67.0 to 5.76.0 in /superset-embedded-sdk (@dependabot[bot])
- [#23379](https://github.com/apache/superset/pull/23379) build(deps-dev): bump @typescript-eslint/parser from 5.54.1 to 5.55.0 in /superset-websocket (@dependabot[bot])
- [#23369](https://github.com/apache/superset/pull/23369) build(deps): bump @sideway/formula from 3.0.0 to 3.0.1 in /docs (@dependabot[bot])
- [#23261](https://github.com/apache/superset/pull/23261) chore(dashboard): Disable 'Set filter mapping' when appropriate (@john-bodley)
- [#23371](https://github.com/apache/superset/pull/23371) chore: Add code-owners to Select, MetadataBar and DropdownContainer (@geido)
- [#23227](https://github.com/apache/superset/pull/23227) chore: Migrate /superset/schemas_access_for_file_upload to v1 (@hughhhh)
- [#23360](https://github.com/apache/superset/pull/23360) build(deps-dev): bump @types/node from 18.14.6 to 18.15.3 in /superset-websocket (@dependabot[bot])
- [#23216](https://github.com/apache/superset/pull/23216) chore: Remove Cross Filter scoping modal (@geido)
- [#23294](https://github.com/apache/superset/pull/23294) build(deps-dev): bump @typescript-eslint/parser from 5.53.0 to 5.54.1 in /superset-websocket (@dependabot[bot])
- [#23323](https://github.com/apache/superset/pull/23323) docs(alerts and reports): Update ExecutorType class (@mrmooon)
- [#23290](https://github.com/apache/superset/pull/23290) chore: log different selenium timeout errors differently (@eschutho)
- [#23316](https://github.com/apache/superset/pull/23316) docs: add lost \_filters param docs (@villebro)
- [#23317](https://github.com/apache/superset/pull/23317) chore: bump docusaurus to latest stable (@villebro)
- [#23281](https://github.com/apache/superset/pull/23281) build(deps-dev): bump @types/node from 18.14.1 to 18.14.6 in /superset-websocket (@dependabot[bot])
- [#23292](https://github.com/apache/superset/pull/23292) build(deps-dev): bump eslint-config-prettier from 8.6.0 to 8.7.0 in /superset-websocket (@dependabot[bot])
- [#23166](https://github.com/apache/superset/pull/23166) docs: typo 'admnistrators' in security.mdx (@camac)
- [#22890](https://github.com/apache/superset/pull/22890) chore: upgrade @ant-design/icons for react upgrade (@lilykuang)
- [#23266](https://github.com/apache/superset/pull/23266) chore(cache): Tuning logging in cache manager (@craig-rueda)
- [#23255](https://github.com/apache/superset/pull/23255) chore(webdriver): Tuning the Webdriver logging a bit (@craig-rueda)
- [#23142](https://github.com/apache/superset/pull/23142) chore: Remove the ability to add filter-box charts when DASHBOARD_NATIVE_FILTERS feature is enabled (@john-bodley)
- [#23241](https://github.com/apache/superset/pull/23241) refactor: Organizes the pages in their own folder (@michael-s-molina)
- [#23122](https://github.com/apache/superset/pull/23122) build(deps): bump pip-compile-multi from 2.6.1 to 2.6.2 in /requirements (@dependabot[bot])
- [#23225](https://github.com/apache/superset/pull/23225) chore: Add statsd logger for ssh tunneling creation (@hughhhh)
- [#23168](https://github.com/apache/superset/pull/23168) build(deps): bump pre-commit from 3.0.4 to 3.1.0 in /requirements (@dependabot[bot])
- [#22859](https://github.com/apache/superset/pull/22859) build(deps): bump ua-parser-js from 0.7.28 to 0.7.33 in /superset-frontend (@dependabot[bot])
- [#23201](https://github.com/apache/superset/pull/23201) chore: adding code owners for github actions/workflows (@rusackas)
- [#23211](https://github.com/apache/superset/pull/23211) build(deps-dev): bump eslint from 8.34.0 to 8.35.0 in /superset-websocket (@dependabot[bot])
- [#23152](https://github.com/apache/superset/pull/23152) build(deps-dev): bump @types/uuid from 9.0.0 to 9.0.1 in /superset-websocket (@dependabot[bot])
- [#23207](https://github.com/apache/superset/pull/23207) docs: fix typo (@vivekDebugs)
- [#22342](https://github.com/apache/superset/pull/22342) build(deps): bump express and @applitools/eyes-cypress in /superset-frontend/cypress-base (@dependabot[bot])
- [#23132](https://github.com/apache/superset/pull/23132) build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.52.0 to 5.53.0 in /superset-websocket (@dependabot[bot])
- [#23203](https://github.com/apache/superset/pull/23203) test: Remove test playgrounds (@lyndsiWilliams)
- [#23180](https://github.com/apache/superset/pull/23180) build(deps-dev): bump @types/node from 18.13.0 to 18.14.1 in /superset-websocket (@dependabot[bot])
- [#23133](https://github.com/apache/superset/pull/23133) build(deps-dev): bump @typescript-eslint/parser from 5.51.0 to 5.53.0 in /superset-websocket (@dependabot[bot])
- [#23145](https://github.com/apache/superset/pull/23145) chore: refactor SparklineCell for react 17 and react 18 upgrade (@lilykuang)
- [#23160](https://github.com/apache/superset/pull/23160) build: Add helm chart option to deploy sidecars with node and worker (@mkramer5454)
- [#23144](https://github.com/apache/superset/pull/23144) chore: revert "feat(native_filter_migration): add transition mode (#16992)" (@john-bodley)
- [#23158](https://github.com/apache/superset/pull/23158) chore: Bump cryptography to 39.0.1 (@EugeneTorap)
- [#23108](https://github.com/apache/superset/pull/23108) chore: Remove yarn.lock from the root folder (@EugeneTorap)
### 2.1.1 (Sun Apr 23 15:44:21 2023 +0100)
**Database Migrations**
- [#23980](https://github.com/apache/superset/pull/23980) fix(migration): handle permalink edge cases correctly (@villebro)
- [#23888](https://github.com/apache/superset/pull/23888) chore(key-value): use json serialization for main resources (@villebro)
**Fixes**
- [#24697](https://github.com/apache/superset/pull/24697) fix: import database engine validation (@dpgaspar)
- [#24390](https://github.com/apache/superset/pull/24390) fix: FAB CSS on Superset (@dpgaspar)
- [#24249](https://github.com/apache/superset/pull/24249) fix: dashboard ownership check (@betodealmeida)
- [#23865](https://github.com/apache/superset/pull/23865) fix: Native time range filter in legacy charts (@kgabryje)
- [#24054](https://github.com/apache/superset/pull/24054) fix: handle temporal columns in presto partitions (@giftig)
- [#23882](https://github.com/apache/superset/pull/23882) fix: handle comments in `has_table_query` (@betodealmeida)
- [#24137](https://github.com/apache/superset/pull/24137) fix: disable SHOW_STACKTRACE by default (@dpgaspar)
- [#24185](https://github.com/apache/superset/pull/24185) fix: db validate parameters permission (@dpgaspar)
- [#23769](https://github.com/apache/superset/pull/23769) fix: allow db driver distinction on enforced URI params (@dpgaspar)
- [#23600](https://github.com/apache/superset/pull/23600) fix: load examples as anon user (@betodealmeida)
- [#23200](https://github.com/apache/superset/pull/23200) fix: permission checks on import (@betodealmeida)
- [#23901](https://github.com/apache/superset/pull/23901) fix: check sqlalchemy_uri (@dpgaspar)
- [#23751](https://github.com/apache/superset/pull/23751) fix(mssql): apply top after distinct (@villebro)
- [#23586](https://github.com/apache/superset/pull/23586) fix(dashboard-rbac): use normal rbac when no roles chosen (@villebro)
- [#23582](https://github.com/apache/superset/pull/23582) fix(dash import): Ensure old datasource ids are not referenced in imported charts (@jfrag1)
- [#23506](https://github.com/apache/superset/pull/23506) fix(generic-x-axis): skip initial time filter for legacy charts (@villebro)
- [#23507](https://github.com/apache/superset/pull/23507) fix(legacy-plugin-chart-heatmap): fix adhoc column tooltip (@villebro)
- [#23441](https://github.com/apache/superset/pull/23441) fix(chart): non existent time grain no longer breaks the application (@rdubois)
- [#23393](https://github.com/apache/superset/pull/23393) fix(Pivot Table v2): resolved full width issue (@AkashBoora)
- [#22851](https://github.com/apache/superset/pull/22851) fix: Validate jinja rendered query (@geido)
**Others**
- [#23113](https://github.com/apache/superset/pull/23113) chore(sqla): Address performance tradeoff with eager loading (@john-bodley)
- [#23723](https://github.com/apache/superset/pull/23723) chore: add enforce URI query params with a specific for MySQL (@dpgaspar)
- [#24294](https://github.com/apache/superset/pull/24294) chore: update UPDATING for 2.1.0 (@eschutho)
- [#24056](https://github.com/apache/superset/pull/24056) chore: Remove unnecessary information from response (@geido)
### 2.1.0 (Thu Mar 16 21:13:05 2023 -0700)
**Database Migrations**
@@ -36,7 +757,7 @@ under the License.
- [#23139](https://github.com/apache/superset/pull/23139) fix: memoized decorator memory leak (@dpgaspar)
- [#19676](https://github.com/apache/superset/pull/19676) chore(frontend): Spelling (@jsoref)
- [#22852](https://github.com/apache/superset/pull/22852) chore: removing unnecessary double spaces, a.k.a. "shotgun holes" (@rusackas)
- [#21912](https://github.com/apache/superset/pull/21912) feat(ssh-tunnelling): Setup SSH Tunneling Commands for Database Connections (@hughhhh)
- [#21912](https://github.com/apache/superset/pull/21912) feat(ssh-tunnelling): Setup SSH Tunneling Commands for Database Connections (@hughhhh)
- [#22248](https://github.com/apache/superset/pull/22248) chore: Add a migration that removes filter_bar_orientation from dashboard's json_metadata (@kgabryje)
- [#21417](https://github.com/apache/superset/pull/21417) fix(db-migration): new_dataset_models_take_2 error on postgres (@micsbot)
- [#21778](https://github.com/apache/superset/pull/21778) fix(migration): Ensure the paginated update is deterministic (@john-bodley)
@@ -181,7 +902,7 @@ under the License.
- [#21322](https://github.com/apache/superset/pull/21322) feat: add snowflake keypair authentication (@xiayanzheng)
- [#21343](https://github.com/apache/superset/pull/21343) feat: Adds MetadataBar to Drill to Detail modal (@michael-s-molina)
- [#21245](https://github.com/apache/superset/pull/21245) feat: Update nav bar with new data information architecture for SQL Lab + SQL (@hughhhh)
- [#21075](https://github.com/apache/superset/pull/21075) feat: add tableselector to dataset creation page (@pkdotson)
- [#21075](https://github.com/apache/superset/pull/21075) feat: add tableselector to dataset creation page (@pkdotson)
- [#21163](https://github.com/apache/superset/pull/21163) feat: apply Time Grain to X-Axis column (@zhaoyongjie)
- [#20837](https://github.com/apache/superset/pull/20837) feat: only show active user for chart/dashboard/datasource owner drop… (@zephyring)
- [#21321](https://github.com/apache/superset/pull/21321) feat(explore): standardized controls for time pivot chart (@stephenLYZ)
@@ -241,7 +962,7 @@ under the License.
- [#19383](https://github.com/apache/superset/pull/19383) feat: truncate long values in table viz, a per-column setting (@stevetracvc)
- [#20600](https://github.com/apache/superset/pull/20600) feat: add hooks on set_perm for new data permissions (@dpgaspar)
- [#20509](https://github.com/apache/superset/pull/20509) feat(HelmChart): Configurable securityContext in Pods (@miloszbednarzak)
- [#20017](https://github.com/apache/superset/pull/20017) feat: hack db connection modal ctabtns (@pkdotson)
- [#20017](https://github.com/apache/superset/pull/20017) feat: hack db connection modal ctabtns (@pkdotson)
- [#20586](https://github.com/apache/superset/pull/20586) feat: drop missing columns control (@zhaoyongjie)
- [#19520](https://github.com/apache/superset/pull/19520) feat(deck.gl): add color range for deck.gl 3D chart (@stephenLYZ)
- [#20512](https://github.com/apache/superset/pull/20512) feat(sql lab): Save Dataset Modal Autocomplete should display list when overwritting (@Antonio-RiveroMartnez)
@@ -277,7 +998,7 @@ under the License.
- [#23195](https://github.com/apache/superset/pull/23195) fix(ssh_tunnel): Display SSHTunnel Switch when editing a DB that was created with the Dynamic Form (@Antonio-RiveroMartnez)
- [#23196](https://github.com/apache/superset/pull/23196) fix(sshtunnel): argument params to properly setting `server_port` (@hughhhh)
- [#23096](https://github.com/apache/superset/pull/23096) fix: reorganize role permissions (@dpgaspar)
- [#23107](https://github.com/apache/superset/pull/23107) fix: missing __init__ on module sqllab commands (@dpgaspar)
- [#23107](https://github.com/apache/superset/pull/23107) fix: missing **init** on module sqllab commands (@dpgaspar)
- [#23101](https://github.com/apache/superset/pull/23101) fix: removing pyproject.toml (@zephyring)
- [#23093](https://github.com/apache/superset/pull/23093) fix: dict bug on QueryContextFactory (@okayhooni)
- [#23083](https://github.com/apache/superset/pull/23083) fix: css template permissions for gamma role (@dpgaspar)
@@ -318,7 +1039,7 @@ under the License.
- [#22907](https://github.com/apache/superset/pull/22907) fix: bump isort to fix pre-commit CI (@EugeneTorap)
- [#22818](https://github.com/apache/superset/pull/22818) fix: revert RESTful apis and react view for RLS (@mayurnewase)
- [#22861](https://github.com/apache/superset/pull/22861) fix(sqllab): reverts #22695 (@justinpark)
- [#22872](https://github.com/apache/superset/pull/22872) fix: Convert TIMESTAMP_* to TIMESTAMP in Snowflake (@geido)
- [#22872](https://github.com/apache/superset/pull/22872) fix: Convert TIMESTAMP\_\* to TIMESTAMP in Snowflake (@geido)
- [#22453](https://github.com/apache/superset/pull/22453) fix(Annotation Layers): Error when render options with renamed columns (@Always-prog)
- [#22791](https://github.com/apache/superset/pull/22791) fix(cpq): Add `schema` to Query.data() payload (@hughhhh)
- [#22813](https://github.com/apache/superset/pull/22813) fix(sqllab): type error on renderBigIntStr (@justinpark)
@@ -328,7 +1049,7 @@ under the License.
- [#22792](https://github.com/apache/superset/pull/22792) fix: better logic to extract errors on databricks (@eschutho)
- [#22695](https://github.com/apache/superset/pull/22695) fix(sqllab): Invalid schema fetch for deprecated value (@justinpark)
- [#22764](https://github.com/apache/superset/pull/22764) fix(ssh-tunnel): update fields for open tunnel with private + private key passwords (@hughhhh)
- [#16926](https://github.com/apache/superset/pull/16926) fix: Read MAPBOX_API_KEY from environment (@Lawful2002)
- [#16926](https://github.com/apache/superset/pull/16926) fix: Read MAPBOX_API_KEY from environment (@Lawful2002)
- [#22763](https://github.com/apache/superset/pull/22763) fix(ssh-tunnel): wrap pkey into StringIO buffer before creating the tunnel (@hughhhh)
- [#22727](https://github.com/apache/superset/pull/22727) fix: pass in slack error messages properly (@eschutho)
- [#22614](https://github.com/apache/superset/pull/22614) fix: Report screenshot cut off on left and right sides (@lyndsiWilliams)
@@ -361,10 +1082,10 @@ under the License.
- [#22565](https://github.com/apache/superset/pull/22565) fix(explore): support saving undefined time grain (@villebro)
- [#22567](https://github.com/apache/superset/pull/22567) fix(cypress): make test chart time range deterministic (@villebro)
- [#22563](https://github.com/apache/superset/pull/22563) fix(websocket): bump ts-node to fix startup error (@villebro)
- [#22507](https://github.com/apache/superset/pull/22507) fix(localization): pybabel doesn't extract plural forms from frontend (@artemonsh)
- [#22507](https://github.com/apache/superset/pull/22507) fix(localization): pybabel doesn't extract plural forms from frontend (@artemonsh)
- [#22523](https://github.com/apache/superset/pull/22523) fix: adding missing examples for bubble chart, bullet chart, calendar heatmap chart and country map chart in the gallery (@yash-samsung)
- [#22543](https://github.com/apache/superset/pull/22543) fix(explore): datasource_type typo (@Musa10)
- [#22314](https://github.com/apache/superset/pull/22314) fix(init): Initialize _jwt_cookie_name in AsyncQueryManager __init__ (@xneg)
- [#22314](https://github.com/apache/superset/pull/22314) fix(init): Initialize \_jwt_cookie_name in AsyncQueryManager **init** (@xneg)
- [#22512](https://github.com/apache/superset/pull/22512) fix(cypress): disable flaky tests (@villebro)
- [#22208](https://github.com/apache/superset/pull/22208) fix(assets api): import replaces dashboard (@Stanhoucke)
- [#22475](https://github.com/apache/superset/pull/22475) fix(chart-list): Hide 'Dashboards added to' column. (@codyml)
@@ -399,7 +1120,7 @@ under the License.
- [#22337](https://github.com/apache/superset/pull/22337) fix: Styling fixes for horizontal filter bar (@kgabryje)
- [#22329](https://github.com/apache/superset/pull/22329) fix(sqllab): Fix autocomplete for SQL Lab (@Antonio-RiveroMartnez)
- [#22320](https://github.com/apache/superset/pull/22320) fix: add columns back into SQL Lab to Explore Flow (@AAfghahi)
- [#22200](https://github.com/apache/superset/pull/22200) fix: Display Error Messages in DB Connection Modal (@AAfghahi)
- [#22200](https://github.com/apache/superset/pull/22200) fix: Display Error Messages in DB Connection Modal (@AAfghahi)
- [#22319](https://github.com/apache/superset/pull/22319) fix(dashboard): Fix dashboard's left side being cut off (@kgabryje)
- [#22323](https://github.com/apache/superset/pull/22323) fix(dashboard): dashboard actions fail when bad component id exists in children array (@eric-briscoe)
- [#22318](https://github.com/apache/superset/pull/22318) fix: DropdownContainer resize algorithm (@michael-s-molina)
@@ -428,7 +1149,7 @@ under the License.
- [#22218](https://github.com/apache/superset/pull/22218) fix(plugin-chart-echarts): tooltip overflow bug (@villebro)
- [#22082](https://github.com/apache/superset/pull/22082) fix: Drill to detail blocked by tooltip (@michael-s-molina)
- [#22207](https://github.com/apache/superset/pull/22207) fix(explore): Value undefined and Unhashable type errors (@kgabryje)
- [#22186](https://github.com/apache/superset/pull/22186) fix: Empty Error Alert Modal (@AAfghahi)
- [#22186](https://github.com/apache/superset/pull/22186) fix: Empty Error Alert Modal (@AAfghahi)
- [#22171](https://github.com/apache/superset/pull/22171) fix: don't stringify extraJson in form (@eschutho)
- [#22179](https://github.com/apache/superset/pull/22179) fix: chart id mapping in dashboard api (@villebro)
- [#22172](https://github.com/apache/superset/pull/22172) fix: SQL Lab QuerySource via referrer (@john-bodley)
@@ -438,7 +1159,7 @@ under the License.
- [#22167](https://github.com/apache/superset/pull/22167) fix(alerts): execute query as report executor (@villebro)
- [#22115](https://github.com/apache/superset/pull/22115) fix: Add scrollTopOnPagination property to Table (@geido)
- [#22118](https://github.com/apache/superset/pull/22118) fix: slug is empty if filename is non-ASCII (@EugeneTorap)
- [#22137](https://github.com/apache/superset/pull/22137) fix: Missing applied filters indicator (@john-bodley)
- [#22137](https://github.com/apache/superset/pull/22137) fix: Missing applied filters indicator (@john-bodley)
- [#22129](https://github.com/apache/superset/pull/22129) fix: add back database lookup from sip 68 revert (@eschutho)
- [#22013](https://github.com/apache/superset/pull/22013) fix(sqllab): Add templateParams on kv store (@justinpark)
- [#22081](https://github.com/apache/superset/pull/22081) fix: Right click on country map with code filter (@michael-s-molina)
@@ -522,7 +1243,7 @@ under the License.
- [#21539](https://github.com/apache/superset/pull/21539) fix(dashboard): fix Pivot Table V2 dragPreview in the dashboard (@stephenLYZ)
- [#21501](https://github.com/apache/superset/pull/21501) fix(table-chart): don't color empty cells in table chart with color formatters (@mayurnewase)
- [#21358](https://github.com/apache/superset/pull/21358) fix: Dataset duplication fatal error (@reesercollins)
- [#21591](https://github.com/apache/superset/pull/21591) fix(tags): Adding __init__ to tags (@craig-rueda)
- [#21591](https://github.com/apache/superset/pull/21591) fix(tags): Adding **init** to tags (@craig-rueda)
- [#21576](https://github.com/apache/superset/pull/21576) fix(dashboard): dashboard doesn't load properly if it has tabs (@stephenLYZ)
- [#21544](https://github.com/apache/superset/pull/21544) fix(explore): Fix datasource switch for table chart (@codyml)
- [#21065](https://github.com/apache/superset/pull/21065) fix(databases): GSheets and Clickhouse DBs are not allowed to upload files (@Antonio-RiveroMartnez)
@@ -609,7 +1330,7 @@ under the License.
- [#21029](https://github.com/apache/superset/pull/21029) fix: take form_data reference for metrics for pivot_v2 table reports (@hughhhh)
- [#21003](https://github.com/apache/superset/pull/21003) fix: Validate required fields in sql_json API (@EugeneTorap)
- [#21045](https://github.com/apache/superset/pull/21045) fix: add plain postgres alias (@betodealmeida)
- [#21034](https://github.com/apache/superset/pull/21034) fix: [sc-54864] Adds safety check to provide near term fix to save query (@eric-briscoe)
- [#21034](https://github.com/apache/superset/pull/21034) fix: [sc-54864] Adds safety check to provide near term fix to save query (@eric-briscoe)
- [#21025](https://github.com/apache/superset/pull/21025) fix: unable to show view as table modal (@zhaoyongjie)
- [#21030](https://github.com/apache/superset/pull/21030) fix: making crossFilter.chartsInScope optional (@rusackas)
- [#20970](https://github.com/apache/superset/pull/20970) fix: forwardRef warnings in selects (@michael-s-molina)
@@ -622,7 +1343,7 @@ under the License.
- [#20977](https://github.com/apache/superset/pull/20977) fix: series limit solution for source is query (@AAfghahi)
- [#20975](https://github.com/apache/superset/pull/20975) fix: Columns not passing properly from SQL Lab to Explore (@lyndsiWilliams)
- [#20959](https://github.com/apache/superset/pull/20959) fix: remove extra line for link (@pkdotson)
- [#20938](https://github.com/apache/superset/pull/20938) fix: add timegrains to data payload (@hughhhh)
- [#20938](https://github.com/apache/superset/pull/20938) fix: add timegrains to data payload (@hughhhh)
- [#20964](https://github.com/apache/superset/pull/20964) fix: No back button in save dataset modal (@AAfghahi)
- [#20966](https://github.com/apache/superset/pull/20966) fix: BigQuery get_parameters_from_uri (@betodealmeida)
- [#20941](https://github.com/apache/superset/pull/20941) fix: Use SPA Dataset link in Chart and Dashboard (@EugeneTorap)
@@ -679,7 +1400,7 @@ under the License.
- [#20725](https://github.com/apache/superset/pull/20725) fix: datasourcedao datasource not found error (@pkdotson)
- [#20673](https://github.com/apache/superset/pull/20673) fix(explore): Fix chart standalone URL for report/thumbnail generation (@codyml)
- [#20760](https://github.com/apache/superset/pull/20760) fix(csv): Do not coerce persisted data integer columns to float (@john-bodley)
- [#20757](https://github.com/apache/superset/pull/20757) fix: PrestoEngineSpec._show_columns return type (@john-bodley)
- [#20757](https://github.com/apache/superset/pull/20757) fix: PrestoEngineSpec.\_show_columns return type (@john-bodley)
- [#20706](https://github.com/apache/superset/pull/20706) fix(sql lab): MultiSelector component render twice (@diegomedina248)
- [#20727](https://github.com/apache/superset/pull/20727) fix(docker): Fixing broken node build (@craig-rueda)
- [#20751](https://github.com/apache/superset/pull/20751) fix: change dataset functionality in Explore (@hughhhh)
@@ -716,6 +1437,7 @@ under the License.
- [#20496](https://github.com/apache/superset/pull/20496) fix: change permissions on action (@eschutho)
**Others**
- [#23325](https://github.com/apache/superset/pull/23325) chore: use util test env for init check (@eschutho)
- [#23298](https://github.com/apache/superset/pull/23298) docs: improve API v1 migration documentation (@dpgaspar)
- [#23199](https://github.com/apache/superset/pull/23199) docs: update installation docs to include frontend asset build (@eschutho)
@@ -769,7 +1491,7 @@ under the License.
- [#22798](https://github.com/apache/superset/pull/22798) chore(welcome): change default last tab to "all" (@villebro)
- [#22927](https://github.com/apache/superset/pull/22927) chore: Bump Flask-AppBuilder constraints (@john-bodley)
- [#22915](https://github.com/apache/superset/pull/22915) test: Clean up AdhocFilterOption test warnings (@lyndsiWilliams)
- [#22501](https://github.com/apache/superset/pull/22501) chore: Migrate /superset/tables/* to API v1 (@diegomedina248)
- [#22501](https://github.com/apache/superset/pull/22501) chore: Migrate /superset/tables/\* to API v1 (@diegomedina248)
- [#22902](https://github.com/apache/superset/pull/22902) build(deps-dev): bump eslint from 8.32.0 to 8.33.0 in /superset-websocket (@dependabot[bot])
- [#22878](https://github.com/apache/superset/pull/22878) chore: upgrade react-router-dom to 5.3.4 (@lilykuang)
- [#22914](https://github.com/apache/superset/pull/22914) chore: upgrade packages for react v17 upgrade (@lilykuang)
@@ -798,7 +1520,7 @@ under the License.
- [#22844](https://github.com/apache/superset/pull/22844) chore(tests): Streamline Cypress login to fix fails/flakes (@codyml)
- [#20872](https://github.com/apache/superset/pull/20872) docs(alerts & reports): add, prune, reorganize (@sfirke)
- [#22617](https://github.com/apache/superset/pull/22617) chore(issue templates): discouraging Issues for feature requests (@rusackas)
- [#22585](https://github.com/apache/superset/pull/22585) chore: upgrade react-datetime, react-intersection-observer and react-checkbox-tree (@lilykuang)
- [#22585](https://github.com/apache/superset/pull/22585) chore: upgrade react-datetime, react-intersection-observer and react-checkbox-tree (@lilykuang)
- [#22516](https://github.com/apache/superset/pull/22516) chore: Convert direct uses of antd icons to 'Icons' component (@codyml)
- [#22413](https://github.com/apache/superset/pull/22413) chore(sqla): Add explicit bidirectional performant relationships for SQLA model (@john-bodley)
- [#22796](https://github.com/apache/superset/pull/22796) docs: link docker readme in docker config section (@nytai)
@@ -970,7 +1692,7 @@ under the License.
- [#21816](https://github.com/apache/superset/pull/21816) chore: Added translate functions (@AndVK)
- [#21818](https://github.com/apache/superset/pull/21818) chore: Add `USER_CLIENT_ERRORS` to stop logging exceptions that are user driven (@hughhhh)
- [#21523](https://github.com/apache/superset/pull/21523) refactor: serialize extra json in state (@eschutho)
- [#21714](https://github.com/apache/superset/pull/21714) chore: add more logging for alerts and reports (@pkdotson)
- [#21714](https://github.com/apache/superset/pull/21714) chore: add more logging for alerts and reports (@pkdotson)
- [#21787](https://github.com/apache/superset/pull/21787) chore: stop logging "SyntaxError" as exceptions (@hughhhh)
- [#21766](https://github.com/apache/superset/pull/21766) refactor: preparation for time section migration (@zhaoyongjie)
- [#21738](https://github.com/apache/superset/pull/21738) chore: cleanup on catalog check for Gsheets (@hughhhh)

View File

@@ -577,6 +577,18 @@ cd superset-frontend
npm ci
```
Note that Superset uses [Scarf](https://docs.scarf.sh) to capture telemetry/analytics about versions being installed, including the `scarf-js` npm package. As noted elsewhere in this documentation, Scarf gathers aggregated stats for the sake of security/release strategy, and does not capture/retain PII. [You can read here](https://docs.scarf.sh/package-analytics/) about the package, and various means to opt out of it, but one easy way to opt out is to add this setting in `superset-frontent/package.json`:
```json
// your-package/package.json
{
// ...
"scarfSettings": {
"enabled": false
}
// ...
}
```
#### Build assets
There are three types of assets you can build:

View File

@@ -81,9 +81,9 @@
|can available domains on Superset|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can request access on Superset|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can dashboard on Superset|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can post on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can expanded on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can delete on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|O|
|can post on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|O|O|
|can expanded on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|O|O|
|can delete on TableSchemaView|:heavy_check_mark:|:heavy_check_mark:|O|O|
|can get on TabStateView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|can post on TabStateView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|can delete query on TabStateView|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|

View File

@@ -24,9 +24,17 @@ assists people when migrating to a new version.
## Next
### Breaking Changes
### Potential Downtime
### Other
## 3.0.0
- [24628]https://github.com/apache/superset/pull/24628): Augments the foreign key constraints for the `dashboard_owner`, `report_schedule_owner`, and `slice_owner` tables to include an explicit CASCADE ON DELETE to ensure the relevant ownership records are deleted when a dataset is deleted. Scheduled downtime may be advised.
- [24488](https://github.com/apache/superset/pull/24488): Augments the foreign key constraints for the `sql_metrics`, `sqlatable_user`, and `table_columns` tables which reference the `tables` table to include an explicit CASCADE ON DELETE to ensure the relevant records are deleted when a dataset is deleted. Scheduled downtime may be advised.
- [24335](https://github.com/apache/superset/pull/24335): Removed deprecated API `/superset/filter/<datasource_type>/<int:datasource_id>/<column>/`
- [24185](https://github.com/apache/superset/pull/24185): `/api/v1/database/test_connection` and `api/v1/database/validate_parameters` permissions changed from `can_read` to `can_write`. Only Admin user's have access.
- [24232](https://github.com/apache/superset/pull/24232): Enables ENABLE_TEMPLATE_REMOVE_FILTERS, DRILL_TO_DETAIL, DASHBOARD_CROSS_FILTERS by default, marks VERSIONED_EXPORT and ENABLE_TEMPLATE_REMOVE_FILTERS as deprecated.
- [23652](https://github.com/apache/superset/pull/23652): Enables GENERIC_CHART_AXES feature flag by default.
- [23226](https://github.com/apache/superset/pull/23226): Migrated endpoint `/estimate_query_cost/<int:database_id>` to `/api/v1/sqllab/estimate/`. Corresponding permissions are can estimate query cost on SQLLab. Make sure you add/replace the necessary permissions on any custom roles you may have.
@@ -70,10 +78,15 @@ assists people when migrating to a new version.
- [23663](https://github.com/apache/superset/pull/23663): Removes deprecated feature flags `ALLOW_DASHBOARD_DOMAIN_SHARDING`, `DISPLAY_MARKDOWN_HTML`, and `FORCE_DATABASE_CONNECTIONS_SSL`.
- [22325](https://github.com/apache/superset/pull/22325): "RLS_FORM_QUERY_REL_FIELDS" is replaced by "RLS_BASE_RELATED_FIELD_FILTERS" feature flag. Its value format stays same.
### Potential Downtime
## 2.1.1
- [24185](https://github.com/apache/superset/pull/24185): `/api/v1/database/test_connection` and `api/v1/database/validate_parameters` permissions changed from `can_read` to `can_write`. Only Admin user's have access.
- [24256](https://github.com/apache/superset/pull/24256): `Flask-Login` session validation is now set to `strong` by default. Previous setting was `basic`.
### Other
- [23888](https://github.com/apache/superset/pull/23888): Database Migration for json serialization instead of pickle should upgrade/downgrade correctly when bumping to/from this patch version
## 2.1.0
- [22809](https://github.com/apache/superset/pull/22809): Migrated endpoint `/superset/sql_json` and `/superset/results/` to `/api/v1/sqllab/execute/` and `/api/v1/sqllab/results/` respectively. Corresponding permissions are `can sql_json on Superset` to `can execute on SQLLab`, `can results on Superset` to `can results on SQLLab`. Make sure you add/replace the necessary permissions on any custom roles you may have.

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
x-superset-image: &superset-image apache/superset:${TAG:-latest-dev}
x-superset-image: &superset-image apachesuperset.docker.scarf.sh/apache/superset:${TAG:-latest-dev}
x-superset-depends-on: &superset-depends-on
- db
- redis

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
x-superset-image: &superset-image apache/superset:${TAG:-latest-dev}
x-superset-image: &superset-image apachesuperset.docker.scarf.sh/apache/superset:${TAG:-latest-dev}
x-superset-user: &superset-user root
x-superset-depends-on: &superset-depends-on
- db

2
docs/.gitignore vendored
View File

@@ -18,3 +18,5 @@
npm-debug.log*
yarn-debug.log*
yarn-error.log*
docs/.zshrc

View File

@@ -15,6 +15,8 @@ The Superset project is always happy to review proposals for new high quality vi
plugins. However, for highly custom viz types it is recommended to maintain a fork
of Superset, and add the custom built viz plugins by hand.
**Note:** Additional community-generated resources about creating and deploying custom visualization plugins can be found on the [Superset Wiki](https://github.com/apache/superset/wiki/Community-Resource-Library#creating-custom-data-visualizations)
### Prerequisites
In order to create a new viz plugin, you need the following:

View File

@@ -10,13 +10,13 @@ version: 1
To use ClickHouse with Superset, you will need to add the following Python library:
```
clickhouse-connect>=0.4.1
clickhouse-connect>=0.6.8
```
If running Superset using Docker Compose, add the following to your `./docker/requirements-local.txt` file:
```
clickhouse-connect>=0.4.1
clickhouse-connect>=0.6.8
```
The recommended connector library for ClickHouse is

View File

@@ -282,3 +282,9 @@ guarantees and are not recommended but may fit your use case temporarily:
In the Edit Dataset view, you can specify a time offset. This field lets you configure the
number of hours to be added or subtracted from the time column.
This can be used, for example, to convert UTC time to local time.
### Does Superset collect any telemetry data?
Superset uses [Scarf](https://about.scarf.sh/) by default to collect basic telemetry data upon installing and/or running Superset. This data helps the maintainers of Superset better understand which versions of Superset are being used, in order to prioritize patch/minor releases and security fixes.
We use the [Scarf Gateway](https://docs.scarf.sh/gateway/) to sit in front of container registries, and the [scarf-js](https://about.scarf.sh/package-sdks) package to track `npm` installations.
Scarf purges PII and provides aggregated statistics. Superset users can easily opt out of analytics in various ways documented [here](https://docs.scarf.sh/gateway/#do-not-track) and [here](https://docs.scarf.sh/package-analytics/#as-a-user-of-a-package-using-scarf-js-how-can-i-opt-out-of-analytics). Additional opt-out instructions for Docker users are available on the [Docker Installation](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose) page.

View File

@@ -96,7 +96,14 @@ You can configure the Docker Compose environment varirables for dev and non-dev
One important variable is `SUPERSET_LOAD_EXAMPLES` which determines whether the `superset_init` container will load example data and visualizations into the database and Superset. These examples are quite helpful for most people, but probably unnecessary for experienced users. The loading process can sometimes take a few minutes and a good amount of CPU, so you may want to disable it on a resource-constrained device.
**Note:** Users often want to connect to other databases from Superset. Currently, the easiest way to do this is to modify the `docker-compose-non-dev.yml` file and add your database as a service that the other services depend on (via `x-superset-depends-on`). Others have attempted to set `network_mode: host` on the Superset services, but these generally break the installation, because the configuration requires use of the Docker Compose DNS resolver for the service names. If you have a good solution for this, let us know!
:::note
Users often want to connect to other databases from Superset. Currently, the easiest way to do this is to modify the `docker-compose-non-dev.yml` file and add your database as a service that the other services depend on (via `x-superset-depends-on`). Others have attempted to set `network_mode: host` on the Superset services, but these generally break the installation, because the configuration requires use of the Docker Compose DNS resolver for the service names. If you have a good solution for this, let us know!
:::
:::note
Superset uses [Scarf Gateway](https://about.scarf.sh/scarf-gateway) to collect telmetry data to better understand and support the need for patch versions of Sueprset. Scarf purges PII and provides aggregated statistics. Superset users can easily opt out of analytics in various ways documented [here](https://docs.scarf.sh/gateway/#do-not-track). However, if you wish to opt-out of this in your Docker-based installation, you can simply edit your `docker-compose.yml` or `docker-compose-non-dev.yml` file and remove `apachesuperset.docker.scarf.sh/` from the `x-superset-image` setting, so that it's simply pulling `apache/superset:${TAG:-latest-dev}`
:::
### 4. Log in to Superset

View File

@@ -121,6 +121,10 @@ init:
. {{ .Values.configMountPath }}/superset_init.sh
```
:::note
Superset uses [Scarf Gateway](https://about.scarf.sh/scarf-gateway) to collect telmetry data to better understand and support the need for patch versions of Sueprset. Scarf purges PII and provides aggregated statistics. Superset users can easily opt out of analytics in various ways documented [here](https://docs.scarf.sh/gateway/#do-not-track). However, if you wish to opt-out of this in your Helm-based installation, you can simply edit your `helm/superset/values.yaml` file and remove `apachesuperset.docker.scarf.sh/` from the `repository` field, so that it's simply pulling `apache/superset`
:::
#### Dependencies
Install additional packages and do any other bootstrap configuration in the bootstrap script.

View File

@@ -0,0 +1,4 @@
{
"label": "Security",
"position": 10
}

View File

@@ -0,0 +1,27 @@
---
title: CVEs by release
hide_title: true
sidebar_position: 2
---
#### Version 2.1.0
| CVE | Title | Affected |
| :------------- | :---------------------------------------------------------------------- | -----------------:|
| CVE-2023-25504 | Possible SSRF on import datasets | <= 2.1.0 |
| CVE-2023-27524 | Session validation vulnerability when using provided default SECRET_KEY | <= 2.1.0 |
| CVE-2023-27525 | Incorrect default permissions for Gamma role | <= 2.1.0 |
| CVE-2023-30776 | Database connection password leak | <= 2.1.0 |
#### Version 2.0.1
| CVE | Title | Affected |
| :------------- | :---------------------------------------------------------- | -----------------:|
| CVE-2022-41703 | SQL injection vulnerability in adhoc clauses | < 2.0.1 or <1.5.2 |
| CVE-2022-43717 | Cross-Site Scripting on dashboards | < 2.0.1 or <1.5.2 |
| CVE-2022-43718 | Cross-Site Scripting vulnerability on upload forms | < 2.0.1 or <1.5.2 |
| CVE-2022-43719 | Cross Site Request Forgery (CSRF) on accept, request access | < 2.0.1 or <1.5.2 |
| CVE-2022-43720 | Improper rendering of user input | < 2.0.1 or <1.5.2 |
| CVE-2022-43721 | Open Redirect Vulnerability | < 2.0.1 or <1.5.2 |
| CVE-2022-45438 | Dashboard metadata information leak | < 2.0.1 or <1.5.2 |

View File

@@ -1,7 +1,7 @@
---
title: Security
title: Role based Access
hide_title: true
sidebar_position: 10
sidebar_position: 1
---
### Roles

View File

@@ -68,7 +68,7 @@ const config = {
from: '/usertutorial.html',
},
{
to: '/docs/security',
to: '/docs/security/',
from: '/security.html',
},
{

View File

@@ -29,7 +29,7 @@ maintainers:
- name: craig-rueda
email: craig@craigrueda.com
url: https://github.com/craig-rueda
version: 0.10.3
version: 0.10.5
dependencies:
- name: postgresql
version: 12.1.6

View File

@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
# superset
![Version: 0.10.3](https://img.shields.io/badge/Version-0.10.3-informational?style=flat-square)
![Version: 0.10.5](https://img.shields.io/badge/Version-0.10.5-informational?style=flat-square)
Apache Superset is a modern, enterprise-ready business intelligence web application
@@ -70,7 +70,7 @@ helm install my-superset superset/superset
| fullnameOverride | string | `nil` | Provide a name to override the full names of resources |
| hostAliases | list | `[]` | Custom hostAliases for all superset pods # https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/ |
| image.pullPolicy | string | `"IfNotPresent"` | |
| image.repository | string | `"apache/superset"` | |
| image.repository | string | `"apachesuperset.docker.scarf.sh/apache/superset"` | |
| image.tag | string | `""` | |
| imagePullSecrets | list | `[]` | |
| ingress.annotations | object | `{}` | |

View File

@@ -176,7 +176,7 @@ configMountPath: "/app/pythonpath"
extraConfigMountPath: "/app/configs"
image:
repository: apache/superset
repository: apachesuperset.docker.scarf.sh/apache/superset
tag: ""
pullPolicy: IfNotPresent

View File

@@ -57,8 +57,6 @@ colorama==0.4.6
# via
# apache-superset
# flask-appbuilder
convertdate==2.4.0
# via holidays
cron-descriptor==1.2.24
# via apache-superset
croniter==1.0.15
@@ -88,7 +86,7 @@ flask==2.2.5
# flask-migrate
# flask-sqlalchemy
# flask-wtf
flask-appbuilder==4.3.3
flask-appbuilder==4.3.4
# via apache-superset
flask-babel==1.0.0
# via flask-appbuilder
@@ -112,7 +110,7 @@ flask-sqlalchemy==2.5.1
# flask-migrate
flask-talisman==1.0.0
# via apache-superset
flask-wtf==1.0.1
flask-wtf==1.1.1
# via
# apache-superset
# flask-appbuilder
@@ -126,18 +124,14 @@ gunicorn==20.1.0
# via apache-superset
hashids==1.3.1
# via apache-superset
hijri-converter==2.2.4
# via holidays
holidays==0.23
holidays==0.28
# via apache-superset
humanize==3.11.0
# via apache-superset
idna==3.2
# via email-validator
importlib-metadata==6.6.0
# via
# apache-superset
# flask
# via apache-superset
importlib-resources==5.12.0
# via limits
isodate==0.6.0
@@ -154,8 +148,6 @@ jsonschema==4.17.3
# via flask-appbuilder
kombu==5.2.4
# via celery
korean-lunar-calendar==0.2.1
# via holidays
limits==3.4.0
# via flask-limiter
mako==1.2.4
@@ -223,8 +215,6 @@ pyjwt==2.4.0
# apache-superset
# flask-appbuilder
# flask-jwt-extended
pymeeus==0.5.11
# via convertdate
pynacl==1.5.0
# via paramiko
pyparsing==3.0.6
@@ -251,7 +241,7 @@ pytz==2021.3
# celery
# flask-babel
# pandas
pyyaml==5.4.1
pyyaml==6.0.1
# via
# apache-superset
# apispec
@@ -326,9 +316,7 @@ wtforms-json==0.3.5
xlsxwriter==3.0.7
# via apache-superset
zipp==3.15.0
# via
# importlib-metadata
# importlib-resources
# via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:
# setuptools

View File

@@ -10,6 +10,8 @@
# via
# -r requirements/base.in
# -r requirements/development.in
appnope==0.1.3
# via ipython
astroid==2.6.6
# via pylint
asttokens==2.2.1

View File

@@ -38,11 +38,11 @@ pip-compile-multi==2.6.3
# via -r integration.in
pip-tools==6.13.0
# via pip-compile-multi
platformdirs==3.5.3
platformdirs==3.8.1
# via
# tox
# virtualenv
pluggy==1.0.0
pluggy==1.2.0
# via tox
pre-commit==3.3.3
# via -r integration.in
@@ -50,12 +50,12 @@ pyproject-api==1.5.2
# via tox
pyproject-hooks==1.0.0
# via build
pyyaml==5.4.1
pyyaml==6.0.1
# via pre-commit
toposort==1.10
# via pip-compile-multi
tox==4.6.3
# via -r integration.in
tox==4.6.4
# via -r requirements/integration.in
virtualenv==20.23.1
# via
# pre-commit

View File

@@ -16,7 +16,7 @@
#
-r development.in
-r integration.in
-e file:.[bigquery,hive,presto,trino]
-e file:.[bigquery,hive,presto,prophet,trino]
docker
flask-testing
freezegun

View File

@@ -1,4 +1,4 @@
# SHA1:623feb0dd2b6bd376238ecf75069bc82136c2d70
# SHA1:78fe89f88adf34ac75513d363d7d9d0b5cc8cd1c
#
# This file is autogenerated by pip-compile-multi
# To update, run:
@@ -12,16 +12,28 @@
# -r requirements/base.in
# -r requirements/development.in
# -r requirements/testing.in
cmdstanpy==1.1.0
# via prophet
contourpy==1.0.7
# via matplotlib
convertdate==2.4.0
# via prophet
coverage[toml]==7.2.5
# via pytest-cov
cycler==0.11.0
# via matplotlib
db-dtypes==1.1.1
# via pandas-gbq
docker==6.1.1
# via -r requirements/testing.in
ephem==4.1.4
# via lunarcalendar
exceptiongroup==1.1.1
# via pytest
flask-testing==0.8.1
# via -r requirements/testing.in
fonttools==4.39.4
# via matplotlib
freezegun==1.2.2
# via -r requirements/testing.in
google-api-core[grpc]==2.11.0
@@ -73,6 +85,12 @@ iniconfig==2.0.0
# via pytest
jsonschema-spec==0.1.4
# via openapi-spec-validator
kiwisolver==1.4.4
# via matplotlib
lunarcalendar==0.0.9
# via prophet
matplotlib==3.7.1
# via prophet
oauthlib==3.2.2
# via requests-oauthlib
openapi-schema-validator==0.4.4
@@ -85,6 +103,8 @@ parameterized==0.9.0
# via -r requirements/testing.in
pathable==0.4.3
# via jsonschema-spec
prophet==1.1.3
# via apache-superset
proto-plus==1.22.2
# via
# google-cloud-bigquery
@@ -97,18 +117,14 @@ protobuf==4.23.0
# googleapis-common-protos
# grpcio-status
# proto-plus
pyasn1==0.5.0
# via
# pyasn1-modules
# rsa
pyasn1-modules==0.3.0
# via google-auth
pydata-google-auth==1.7.0
# via pandas-gbq
pyfakefs==5.2.2
# via -r requirements/testing.in
pyhive[presto]==0.6.5
# via apache-superset
pymeeus==0.5.12
# via convertdate
pytest==7.3.1
# via
# -r requirements/testing.in
@@ -130,6 +146,10 @@ sqlalchemy-bigquery==1.6.1
# via apache-superset
statsd==4.0.1
# via -r requirements/testing.in
tqdm==4.65.0
# via
# cmdstanpy
# prophet
trino==0.324.0
# via apache-superset
tzdata==2023.3

View File

@@ -81,18 +81,18 @@ setup(
"cryptography>=39.0.1, <40",
"deprecation>=2.1.0, <2.2.0",
"flask>=2.2.5, <3.0.0",
"flask-appbuilder>=4.3.3, <5.0.0",
"flask-caching>=1.10.1, <1.11",
"flask-appbuilder>=4.3.4, <5.0.0",
"flask-caching>=1.10.1, <2.0",
"flask-compress>=1.13, <2.0",
"flask-talisman>=1.0.0, <2.0",
"flask-login==0.6.0",
"flask-login>=0.6.0, < 1.0",
"flask-migrate>=3.1.0, <4.0",
"flask-wtf>=1.0.1, <1.1",
"flask-wtf>=1.1.0, <2.0",
"func_timeout",
"geopy",
"gunicorn>=20.1.0; sys_platform != 'win32'",
"hashids>=1.3.1, <2",
"holidays>=0.23, <0.24",
"holidays>=0.28, <1.0",
"humanize",
"importlib_metadata",
"isodate",
@@ -111,7 +111,7 @@ setup(
"python-dotenv",
"python-geohash",
"pyarrow>=12.0.0, <13",
"pyyaml>=5.4",
"pyyaml>=6.0.0, <7.0.0",
"PyJWT>=2.4.0, <3.0",
"redis>=4.5.4, <5.0",
"selenium>=3.141.0, <4.10.0",
@@ -167,7 +167,7 @@ setup(
"mysql": ["mysqlclient>=2.1.0, <3"],
"ocient": [
"sqlalchemy-ocient>=1.0.0",
"pyocient>=1.0.15",
"pyocient>=1.0.15, <2",
"shapely",
"geojson",
],
@@ -176,7 +176,7 @@ setup(
"postgres": ["psycopg2-binary==2.9.6"],
"presto": ["pyhive[presto]>=0.6.5"],
"trino": ["trino>=0.324.0"],
"prophet": ["prophet>=1.0.1, <1.1", "pystan<3.0"],
"prophet": ["prophet>=1.1.0, <2.0.0"],
"redshift": ["sqlalchemy-redshift>=0.8.1, < 0.9"],
"rockset": ["rockset>=0.8.10, <0.9"],
"shillelagh": [

View File

@@ -422,17 +422,17 @@ describe('Dashboard edit', () => {
'[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol',
)
.first()
.should('have.css', 'fill', 'rgb(252, 199, 0)');
.should('have.css', 'fill', 'rgb(69, 78, 124)');
cy.get(
'[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol',
)
.eq(1)
.should('have.css', 'fill', 'rgb(143, 211, 228)');
.should('have.css', 'fill', 'rgb(224, 67, 85)');
cy.get(
'[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol',
)
.eq(2)
.should('have.css', 'fill', 'rgb(172, 225, 196)');
.should('have.css', 'fill', 'rgb(163, 143, 121)');
});
it('should show the same colors in Explore', () => {
@@ -463,7 +463,7 @@ describe('Dashboard edit', () => {
'[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol',
)
.eq(1)
.should('have.css', 'fill', 'rgb(51, 61, 71)');
.should('have.css', 'fill', 'rgb(172, 32, 119)');
openExplore('Top 10 California Names Timeseries');
@@ -474,7 +474,7 @@ describe('Dashboard edit', () => {
// label Christopher
cy.get('[data-test="chart-container"] .line .nv-legend-symbol')
.eq(1)
.should('have.css', 'fill', 'rgb(108, 131, 142)');
.should('have.css', 'fill', 'rgb(172, 32, 119)');
});
it('should change color scheme multiple times', () => {

View File

@@ -62,8 +62,8 @@ describe('Add database', () => {
it('show error alerts on dynamic form for bad host', () => {
// click postgres dynamic form
cy.get('.preferred > :nth-child(1)').click();
cy.get('input[name="host"]').focus().type('badhost');
cy.get('input[name="port"]').focus().type('5432');
cy.get('input[name="host"]').focus().type('badhost', { force: true });
cy.get('input[name="port"]').focus().type('5432', { force: true });
cy.get('.ant-form-item-explain-error').contains(
"The hostname provided can't be resolved",
);
@@ -72,8 +72,8 @@ describe('Add database', () => {
it('show error alerts on dynamic form for bad port', () => {
// click postgres dynamic form
cy.get('.preferred > :nth-child(1)').click();
cy.get('input[name="host"]').focus().type('localhost');
cy.get('input[name="port"]').focus().type('123');
cy.get('input[name="host"]').focus().type('localhost', { force: true });
cy.get('input[name="port"]').focus().type('123', { force: true });
cy.get('input[name="database"]').focus();
cy.get('.ant-form-item-explain-error').contains('The port is closed');
});

View File

@@ -21,6 +21,7 @@
"@emotion/styled": "^11.3.0",
"@fontsource/inter": "^4.0.0",
"@reduxjs/toolkit": "^1.9.3",
"@scarf/scarf": "^1.1.1",
"@superset-ui/chart-controls": "file:./packages/superset-ui-chart-controls",
"@superset-ui/core": "file:./packages/superset-ui-core",
"@superset-ui/legacy-plugin-chart-calendar": "file:./plugins/legacy-plugin-chart-calendar",
@@ -13827,6 +13828,12 @@
}
}
},
"node_modules/@scarf/scarf": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz",
"integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==",
"hasInstallScript": true
},
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
@@ -72301,6 +72308,11 @@
"any-observable": "^0.3.0"
}
},
"@scarf/scarf": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz",
"integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ=="
},
"@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",

View File

@@ -1,6 +1,6 @@
{
"name": "superset",
"version": "0.0.0-dev",
"version": "3.0.0",
"description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.",
"keywords": [
"big",
@@ -86,6 +86,7 @@
"@emotion/styled": "^11.3.0",
"@fontsource/inter": "^4.0.0",
"@reduxjs/toolkit": "^1.9.3",
"@scarf/scarf": "^1.1.1",
"@superset-ui/chart-controls": "file:./packages/superset-ui-chart-controls",
"@superset-ui/core": "file:./packages/superset-ui-core",
"@superset-ui/legacy-plugin-chart-calendar": "file:./plugins/legacy-plugin-chart-calendar",
@@ -357,5 +358,8 @@
}
},
"readme": "ERROR: No README data found!",
"scarfSettings": {
"allowTopLevel": true
},
"_id": "superset@0.0.0-dev"
}

View File

@@ -44,6 +44,8 @@ const TypeIconWrapper = styled.div`
&& svg {
margin-right: 0;
margin-left: 0;
width: 100%;
height: 100%;
}
`};
`;

View File

@@ -0,0 +1,26 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { styled } from '@superset-ui/core';
export const ControlSubSectionHeader = styled.div`
font-weight: ${({ theme }) => theme.typography.weights.bold};
font-size: ${({ theme }) => theme.typography.sizes.s};
margin-bottom: ${({ theme }) => theme.gridUnit}px;
`;
export default ControlSubSectionHeader;

View File

@@ -29,6 +29,7 @@ export * from './components/InfoTooltipWithTrigger';
export * from './components/ColumnOption';
export * from './components/ColumnTypeLabel/ColumnTypeLabel';
export * from './components/MetricOption';
export * from './components/ControlSubSectionHeader';
export * from './shared-controls';
export * from './types';

View File

@@ -18,6 +18,8 @@
*/
import React from 'react';
import { t, RollingType, ComparisonType } from '@superset-ui/core';
import { ControlSubSectionHeader } from '../components/ControlSubSectionHeader';
import { ControlPanelSectionConfig } from '../types';
import { formatSelectOptions } from '../utils';
@@ -30,7 +32,7 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = {
'of query results',
),
controlSetRows: [
[<div className="section-header">{t('Rolling window')}</div>],
[<ControlSubSectionHeader>{t('Rolling window')}</ControlSubSectionHeader>],
[
{
name: 'rolling_type',
@@ -99,7 +101,7 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = {
},
},
],
[<div className="section-header">{t('Time comparison')}</div>],
[<ControlSubSectionHeader>{t('Time comparison')}</ControlSubSectionHeader>],
[
{
name: 'time_compare',
@@ -150,7 +152,7 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = {
},
},
],
[<div className="section-header">{t('Resample')}</div>],
[<ControlSubSectionHeader>{t('Resample')}</ControlSubSectionHeader>],
[
{
name: 'resample_rule',

View File

@@ -18,6 +18,8 @@
*/
import React from 'react';
import { t } from '@superset-ui/core';
import { ControlSubSectionHeader } from '../components/ControlSubSectionHeader';
import { ControlPanelSectionConfig } from '../types';
import { formatSelectOptions } from '../utils';
@@ -33,7 +35,7 @@ export const titleControls: ControlPanelSectionConfig = {
tabOverride: 'customize',
expanded: true,
controlSetRows: [
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
name: 'x_axis_title',
@@ -61,7 +63,7 @@ export const titleControls: ControlPanelSectionConfig = {
},
},
],
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
[
{
name: 'y_axis_title',
@@ -81,7 +83,7 @@ export const titleControls: ControlPanelSectionConfig = {
type: 'SelectControl',
freeForm: true,
clearable: true,
label: t('Y AXIS TITLE MARGIN'),
label: t('Y Axis Title Margin'),
renderTrigger: true,
default: TITLE_MARGIN_OPTIONS[0],
choices: formatSelectOptions(TITLE_MARGIN_OPTIONS),
@@ -96,7 +98,7 @@ export const titleControls: ControlPanelSectionConfig = {
type: 'SelectControl',
freeForm: true,
clearable: false,
label: t('Y AXIS TITLE POSITION'),
label: t('Y Axis Title Position'),
renderTrigger: true,
default: TITLE_POSITION_OPTIONS[0][0],
choices: TITLE_POSITION_OPTIONS,

View File

@@ -78,15 +78,20 @@ class CategoricalColorScale extends ExtensibleFunction {
cleanedValue: string,
) {
// make sure we don't overwrite the origin colors
const updatedRange = [...this.originColors];
const updatedRange = new Set(this.originColors);
// remove the color option from shared color
sharedColorMap.forEach((value: string, key: string) => {
if (key !== cleanedValue) {
const index = updatedRange.indexOf(value);
updatedRange.splice(index, 1);
updatedRange.delete(value);
}
});
this.range(updatedRange.length > 0 ? updatedRange : this.originColors);
// remove the color option from forced colors
Object.entries(this.parentForcedColors).forEach(([key, value]) => {
if (key !== cleanedValue) {
updatedRange.delete(value);
}
});
this.range(updatedRange.size > 0 ? [...updatedRange] : this.originColors);
}
getColor(value?: string, sliceId?: number) {

View File

@@ -19,3 +19,4 @@
export { default as CurrencyFormatter } from './CurrencyFormatter';
export * from './CurrencyFormatter';
export * from './utils';

View File

@@ -1,3 +1,21 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {
Currency,
CurrencyFormatter,
@@ -16,10 +34,8 @@ export const buildCustomFormatters = (
) => {
const metricsArray = ensureIsArray(metrics);
return metricsArray.reduce((acc, metric) => {
const actualD3Format = isSavedMetric(metric)
? columnFormats[metric] ?? d3Format
: d3Format;
if (isSavedMetric(metric)) {
const actualD3Format = d3Format ?? columnFormats[metric];
return currencyFormats[metric]
? {
...acc,

View File

@@ -273,5 +273,21 @@ describe('CategoricalColorScale', () => {
expect(scale.range()).toEqual(['blue', 'green', 'red']);
sharedLabelColor.clear();
});
it('should remove parentForcedColors from range', () => {
const parentForcedColors = { house: 'blue', cow: 'red' };
const scale = new CategoricalColorScale(
['blue', 'red', 'green'],
parentForcedColors,
);
const sharedLabelColor = getSharedLabelColor();
sharedLabelColor.clear();
const colorMap = sharedLabelColor.getColorMap();
scale.removeSharedLabelColorFromRange(colorMap, 'pig');
expect(scale.range()).toEqual(['green']);
scale.removeSharedLabelColorFromRange(colorMap, 'cow');
expect(scale.range()).toEqual(['red', 'green']);
sharedLabelColor.clear();
});
});
});

View File

@@ -0,0 +1,151 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {
buildCustomFormatters,
CurrencyFormatter,
getCustomFormatter,
getNumberFormatter,
getValueFormatter,
NumberFormatter,
ValueFormatter,
} from '@superset-ui/core';
it('buildCustomFormatters without saved metrics returns empty object', () => {
expect(
buildCustomFormatters(
[
{
expressionType: 'SIMPLE',
aggregate: 'COUNT',
column: { column_name: 'test' },
},
],
{
sum__num: { symbol: 'USD', symbolPosition: 'prefix' },
},
{},
',.1f',
),
).toEqual({});
expect(
buildCustomFormatters(
undefined,
{
sum__num: { symbol: 'USD', symbolPosition: 'prefix' },
},
{},
',.1f',
),
).toEqual({});
});
it('buildCustomFormatters with saved metrics returns custom formatters object', () => {
const customFormatters: Record<string, ValueFormatter> =
buildCustomFormatters(
[
{
expressionType: 'SIMPLE',
aggregate: 'COUNT',
column: { column_name: 'test' },
},
'sum__num',
'count',
],
{
sum__num: { symbol: 'USD', symbolPosition: 'prefix' },
},
{ sum__num: ',.2' },
',.1f',
);
expect(customFormatters).toEqual({
sum__num: expect.any(Function),
count: expect.any(Function),
});
expect(customFormatters.sum__num).toBeInstanceOf(CurrencyFormatter);
expect(customFormatters.count).toBeInstanceOf(NumberFormatter);
expect((customFormatters.sum__num as CurrencyFormatter).d3Format).toEqual(
',.1f',
);
});
it('buildCustomFormatters uses dataset d3 format if not provided in control panel', () => {
const customFormatters: Record<string, ValueFormatter> =
buildCustomFormatters(
[
{
expressionType: 'SIMPLE',
aggregate: 'COUNT',
column: { column_name: 'test' },
},
'sum__num',
'count',
],
{
sum__num: { symbol: 'USD', symbolPosition: 'prefix' },
},
{ sum__num: ',.2' },
undefined,
);
expect((customFormatters.sum__num as CurrencyFormatter).d3Format).toEqual(
',.2',
);
});
it('getCustomFormatter', () => {
const customFormatters = {
sum__num: new CurrencyFormatter({
currency: { symbol: 'USD', symbolPosition: 'prefix' },
}),
count: getNumberFormatter(),
};
expect(getCustomFormatter(customFormatters, 'count')).toEqual(
customFormatters.count,
);
expect(
getCustomFormatter(customFormatters, ['count', 'sum__num'], 'count'),
).toEqual(customFormatters.count);
expect(getCustomFormatter(customFormatters, ['count', 'sum__num'])).toEqual(
undefined,
);
});
it('getValueFormatter', () => {
expect(
getValueFormatter(['count', 'sum__num'], {}, {}, ',.1f'),
).toBeInstanceOf(NumberFormatter);
expect(
getValueFormatter(['count', 'sum__num'], {}, {}, ',.1f', 'count'),
).toBeInstanceOf(NumberFormatter);
expect(
getValueFormatter(
['count', 'sum__num'],
{ count: { symbol: 'USD', symbolPosition: 'prefix' } },
{},
',.1f',
'count',
),
).toBeInstanceOf(CurrencyFormatter);
});

View File

@@ -19,7 +19,7 @@
{ "type": "Feature", "properties": { "ISO": "FR-09", "NAME_1": "Ariège" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.921111287000116, 42.784366354000085 ], [ 0.856102336000077, 42.812762553000098 ], [ 0.837560609134812, 42.907329288315964 ], [ 0.869157290076885, 42.925006291407215 ], [ 0.886603580191036, 42.958987005845643 ], [ 0.956432684220999, 42.967127874951473 ], [ 0.992248115458153, 42.990309028438901 ], [ 0.996598700969287, 43.094690135841063 ], [ 1.038434640046603, 43.109499706346355 ], [ 1.065065501171944, 43.144106641208509 ], [ 1.130631909534998, 43.155213819761968 ], [ 1.24269246098828, 43.088779490980698 ], [ 1.290109455087247, 43.123452343450879 ], [ 1.220456131645165, 43.169572951330622 ], [ 1.236584062404518, 43.184800002418172 ], [ 1.349391683379451, 43.204300735290701 ], [ 1.382306723676322, 43.231316117744598 ], [ 1.315509846702071, 43.259836626259244 ], [ 1.301337482738631, 43.27281148086513 ], [ 1.30566609601351, 43.299046832745091 ], [ 1.325771077073512, 43.30844014359775 ], [ 1.373781333241936, 43.296465045525395 ], [ 1.419836022614334, 43.261396684709212 ], [ 1.417067467789423, 43.2263722692648 ], [ 1.440929773190476, 43.212968948857906 ], [ 1.490016688719209, 43.226635941495488 ], [ 1.504562587893133, 43.249476519026132 ], [ 1.488544521012841, 43.279831744339504 ], [ 1.515219326610634, 43.296728717756082 ], [ 1.630509857943593, 43.244873246503118 ], [ 1.675268161096767, 43.274481402294839 ], [ 1.702558201000159, 43.266736040635749 ], [ 1.696515720024422, 43.243851518632653 ], [ 1.719059666070734, 43.183415725455347 ], [ 1.77491416075992, 43.152203565841887 ], [ 1.94544395247641, 43.103808788344907 ], [ 1.960319441489048, 43.069102976621025 ], [ 1.942653424515925, 43.0458449194075 ], [ 1.973503035936346, 43.022773628899813 ], [ 1.992311629877804, 42.967347601810332 ], [ 1.941554792020042, 42.935058781937187 ], [ 1.974601668432229, 42.913404728545345 ], [ 1.985631942360214, 42.87306293030997 ], [ 1.894071880312993, 42.848189882257259 ], [ 1.865485453291001, 42.815890076265987 ], [ 1.910199810173083, 42.790621520766535 ], [ 1.9179561579503, 42.752147397684212 ], [ 1.973503035936346, 42.73083392114853 ], [ 2.075148546867922, 42.743907651716711 ], [ 2.168752066454715, 42.670057551115065 ], [ 2.154008413557449, 42.656445489967382 ], [ 1.994157332794657, 42.652874933231544 ], [ 1.962802351847074, 42.621761650479755 ], [ 1.956298444917309, 42.587033866519675 ], [ 1.92850303368806, 42.569181082840657 ], [ 1.872824320486018, 42.578980887258126 ], [ 1.761107147000132, 42.567646197 ], [ 1.713310995000086, 42.589546204000058 ], [ 1.721992635000049, 42.609855042000063 ], [ 1.608304484000143, 42.618123271000016 ], [ 1.543088827000133, 42.649361674000019 ], [ 1.466814412000105, 42.641455180000051 ], [ 1.451414835826029, 42.602051901673917 ], [ 1.42929732200011, 42.59538564100005 ], [ 1.361084432000069, 42.686723735000058 ], [ 1.338243449000061, 42.694449361000053 ], [ 1.342584269000042, 42.708660381000115 ], [ 1.151484823000118, 42.706722514 ], [ 1.089059692000149, 42.771318054000048 ], [ 0.950256795000143, 42.796122742000065 ], [ 0.921111287000116, 42.784366354000085 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-66", "NAME_1": "Pyrénées-Orientales" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 1.717091134804584, 42.539890071086553 ], [ 1.761107147000132, 42.567646197 ], [ 1.938302839004791, 42.571795828414736 ], [ 1.96761436331218, 42.629023613948618 ], [ 2.005649032676729, 42.656126886246795 ], [ 2.166074435786584, 42.663835145475559 ], [ 2.189450309584117, 42.652160822064275 ], [ 2.264684687148588, 42.708938167762199 ], [ 2.32256066624177, 42.708037288989658 ], [ 2.35116906549996, 42.730163754453656 ], [ 2.330910276088332, 42.82240496931388 ], [ 2.341193479595404, 42.837445252796158 ], [ 2.374987425529241, 42.847256044231017 ], [ 2.703962047910181, 42.834039491429337 ], [ 2.783920547095533, 42.889839053729304 ], [ 2.855309709575408, 42.913800235992085 ], [ 3.0462758278677, 42.837076341874791 ], [ 3.037608269000089, 42.683213609000063 ], [ 3.051849806000064, 42.554877020000049 ], [ 3.137380405000044, 42.52492910400008 ], [ 3.181569858000046, 42.43508535400008 ], [ 3.086147094000097, 42.427178854000047 ], [ 3.029613077000135, 42.465651957 ], [ 2.933701619000061, 42.470225322000019 ], [ 2.850812622000149, 42.44836619100009 ], [ 2.788594198000055, 42.412011821000092 ], [ 2.690408976000072, 42.406172384000016 ], [ 2.640282837000143, 42.372841085000076 ], [ 2.662193644000098, 42.339018861000071 ], [ 2.548092081000107, 42.352248027000073 ], [ 2.514812459000069, 42.325660503000037 ], [ 2.445566040000131, 42.351963806000086 ], [ 2.422518351000065, 42.383693136000019 ], [ 2.277410930000144, 42.428625794000126 ], [ 2.136954386000099, 42.416223450000061 ], [ 2.063263794000079, 42.35790659700011 ], [ 2.009210245000077, 42.347080383000062 ], [ 1.963734985000116, 42.367234192000055 ], [ 1.927458129000058, 42.436894023000079 ], [ 1.712174112944922, 42.493712260112716 ], [ 1.717091134804584, 42.539890071086553 ] ], [ [ 1.983372030000055, 42.44126068100006 ], [ 1.99949507600013, 42.443896180000067 ], [ 1.967972453000073, 42.485702413000027 ], [ 1.956603638000075, 42.481775005000074 ], [ 1.947508585000122, 42.451234233000079 ], [ 1.983372030000055, 42.44126068100006 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-67", "NAME_1": "Bas-Rhin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 7.644932350047895, 49.036295448176361 ], [ 7.773664591000113, 49.048118388 ], [ 7.931897827000114, 49.034837546000077 ], [ 8.090441121000083, 48.979182028000068 ], [ 8.200305216000032, 48.958563131000048 ], [ 8.090337769000143, 48.807512920000093 ], [ 8.038764689000061, 48.790769756000074 ], [ 8.017267293000117, 48.761830954000104 ], [ 7.970138387000105, 48.757283427000075 ], [ 7.959182983000119, 48.72136830700002 ], [ 7.852419475000119, 48.658684794000081 ], [ 7.810251506000071, 48.615018209000098 ], [ 7.801673217000115, 48.547580465000081 ], [ 7.813455444000027, 48.519468486000036 ], [ 7.776455119000076, 48.498177796000064 ], [ 7.738317912000099, 48.406607158000085 ], [ 7.75072025500009, 48.341365662000058 ], [ 7.702454467000081, 48.311186625000047 ], [ 7.687158243000113, 48.252921448000038 ], [ 7.613364298000079, 48.179205018000104 ], [ 7.581976474333016, 48.121353059320732 ], [ 7.543285963176629, 48.122901997828933 ], [ 7.51443586392395, 48.151477437833478 ], [ 7.470073069116836, 48.160156637518753 ], [ 7.466096018816188, 48.207277001032764 ], [ 7.303454410992288, 48.259956446432852 ], [ 7.291567202764156, 48.293508693271576 ], [ 7.208730285774038, 48.303407375449979 ], [ 7.188537413970494, 48.331005032955886 ], [ 7.109875301903628, 48.342266019860915 ], [ 7.127717099464576, 48.484099520676295 ], [ 7.14885479541249, 48.499886875478921 ], [ 7.088649715212171, 48.523441563277515 ], [ 7.193019836496262, 48.533527013061189 ], [ 7.262892885897941, 48.57579141883889 ], [ 7.300422183936632, 48.655640055044501 ], [ 7.264914370301938, 48.684885661743863 ], [ 7.317670719428122, 48.755890302895125 ], [ 7.216332825199686, 48.829839280358499 ], [ 7.204401672499159, 48.854173997831708 ], [ 7.183879210856901, 48.82462077442915 ], [ 7.103217586622293, 48.792529708279403 ], [ 7.074938777202817, 48.824543869803733 ], [ 7.096384089853871, 48.858030199034431 ], [ 6.9995505903874, 48.889363208645136 ], [ 6.977072561949171, 48.917532155084871 ], [ 7.042858697171141, 48.97734172693913 ], [ 7.086430476185512, 49.064551203475219 ], [ 7.119191708130813, 49.056388361233871 ], [ 7.145427060910094, 49.00990520516109 ], [ 7.284448062428112, 48.977473563054446 ], [ 7.301806461798776, 48.954742849402976 ], [ 7.341708806316319, 48.943371999518149 ], [ 7.490683421502695, 48.958851736718259 ], [ 7.564072096150312, 48.939647634430742 ], [ 7.644932350047895, 49.036295448176361 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-68", "NAME_1": "Haute-Rhin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 7.581976474333016, 48.121353059320732 ], [ 7.575743856000145, 48.053708802000088 ], [ 7.618945353000072, 48.00265248700002 ], [ 7.621115763000063, 47.971439922000044 ], [ 7.584942261000037, 47.940408224000109 ], [ 7.55900069100008, 47.882711488000027 ], [ 7.561997925000099, 47.839225769000038 ], [ 7.542877645000118, 47.829433086000066 ], [ 7.525927775000099, 47.783156840000075 ], [ 7.537813355000139, 47.731816304000048 ], [ 7.511871785000096, 47.707321676000092 ], [ 7.517866251000015, 47.675023906000021 ], [ 7.590316609000098, 47.607947896000084 ], [ 7.586028488000125, 47.584618544000065 ], [ 7.482726278000058, 47.542267151000047 ], [ 7.505463908000138, 47.523017681000013 ], [ 7.476938517000093, 47.514878643000102 ], [ 7.485826864000103, 47.495784200000102 ], [ 7.467430053000101, 47.481909078000044 ], [ 7.414306681000085, 47.490177307000081 ], [ 7.429292847000056, 47.465114238000083 ], [ 7.406348511000118, 47.438242493000061 ], [ 7.2380900470001, 47.416796773000058 ], [ 7.168326863000061, 47.44356516500001 ], [ 7.180832560000056, 47.48826528000005 ], [ 7.142169389000088, 47.48765096800004 ], [ 7.142900205180297, 47.540253049138869 ], [ 7.079750788667923, 47.590921997152407 ], [ 7.023434868924028, 47.60598425287094 ], [ 7.057887995434612, 47.666442019183819 ], [ 7.050307428245219, 47.71558386710177 ], [ 6.870153612699028, 47.802255012159037 ], [ 6.86892314408783, 47.818998177224103 ], [ 6.923854786868901, 47.843179086345742 ], [ 6.91495586032471, 47.875687632178483 ], [ 6.951760061077948, 47.956964490718633 ], [ 7.081157038766321, 48.104609760432083 ], [ 7.083156550934063, 48.164507223929206 ], [ 7.208730285774038, 48.303407375449979 ], [ 7.291567202764156, 48.293508693271576 ], [ 7.303454410992288, 48.259956446432852 ], [ 7.466096018816188, 48.207277001032764 ], [ 7.470073069116836, 48.160156637518753 ], [ 7.51443586392395, 48.151477437833478 ], [ 7.525927563806022, 48.127395405573509 ], [ 7.581976474333016, 48.121353059320732 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-68", "NAME_1": "Haut-Rhin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 7.581976474333016, 48.121353059320732 ], [ 7.575743856000145, 48.053708802000088 ], [ 7.618945353000072, 48.00265248700002 ], [ 7.621115763000063, 47.971439922000044 ], [ 7.584942261000037, 47.940408224000109 ], [ 7.55900069100008, 47.882711488000027 ], [ 7.561997925000099, 47.839225769000038 ], [ 7.542877645000118, 47.829433086000066 ], [ 7.525927775000099, 47.783156840000075 ], [ 7.537813355000139, 47.731816304000048 ], [ 7.511871785000096, 47.707321676000092 ], [ 7.517866251000015, 47.675023906000021 ], [ 7.590316609000098, 47.607947896000084 ], [ 7.586028488000125, 47.584618544000065 ], [ 7.482726278000058, 47.542267151000047 ], [ 7.505463908000138, 47.523017681000013 ], [ 7.476938517000093, 47.514878643000102 ], [ 7.485826864000103, 47.495784200000102 ], [ 7.467430053000101, 47.481909078000044 ], [ 7.414306681000085, 47.490177307000081 ], [ 7.429292847000056, 47.465114238000083 ], [ 7.406348511000118, 47.438242493000061 ], [ 7.2380900470001, 47.416796773000058 ], [ 7.168326863000061, 47.44356516500001 ], [ 7.180832560000056, 47.48826528000005 ], [ 7.142169389000088, 47.48765096800004 ], [ 7.142900205180297, 47.540253049138869 ], [ 7.079750788667923, 47.590921997152407 ], [ 7.023434868924028, 47.60598425287094 ], [ 7.057887995434612, 47.666442019183819 ], [ 7.050307428245219, 47.71558386710177 ], [ 6.870153612699028, 47.802255012159037 ], [ 6.86892314408783, 47.818998177224103 ], [ 6.923854786868901, 47.843179086345742 ], [ 6.91495586032471, 47.875687632178483 ], [ 6.951760061077948, 47.956964490718633 ], [ 7.081157038766321, 48.104609760432083 ], [ 7.083156550934063, 48.164507223929206 ], [ 7.208730285774038, 48.303407375449979 ], [ 7.291567202764156, 48.293508693271576 ], [ 7.303454410992288, 48.259956446432852 ], [ 7.466096018816188, 48.207277001032764 ], [ 7.470073069116836, 48.160156637518753 ], [ 7.51443586392395, 48.151477437833478 ], [ 7.525927563806022, 48.127395405573509 ], [ 7.581976474333016, 48.121353059320732 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-90", "NAME_1": "Territoire de Belfort" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 7.053915242000073, 47.490384013000053 ], [ 6.973300008000137, 47.48909210300009 ], [ 6.990973348000068, 47.452220968000077 ], [ 6.939169949951677, 47.426844260931965 ], [ 6.914428516762598, 47.487002314804954 ], [ 6.919152638383537, 47.53415563757261 ], [ 6.89375224676877, 47.551755735139068 ], [ 6.824845993747601, 47.547613889469403 ], [ 6.807070114694, 47.56286291369247 ], [ 6.759081831661206, 47.722790898181358 ], [ 6.784767867742914, 47.779974738343469 ], [ 6.836011674099495, 47.824165475756104 ], [ 6.86892314408783, 47.818998177224103 ], [ 6.882721972840784, 47.791037971525157 ], [ 7.050307428245219, 47.71558386710177 ], [ 7.057887995434612, 47.666442019183819 ], [ 7.023434868924028, 47.60598425287094 ], [ 7.079750788667923, 47.590921997152407 ], [ 7.151491514122085, 47.519060421701056 ], [ 7.142169389000088, 47.48765096800004 ], [ 7.053915242000073, 47.490384013000053 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-25", "NAME_1": "Doubs" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 6.939169949951677, 47.426844260931965 ], [ 6.866639852000077, 47.354164937000021 ], [ 7.003995809000088, 47.368143413000027 ], [ 7.044303426000056, 47.34049652100002 ], [ 7.036551961000043, 47.329515279000034 ], [ 6.958623901000067, 47.290551250000036 ], [ 6.956246785000104, 47.245231018000126 ], [ 6.689699747000105, 47.078290304000078 ], [ 6.676263875000132, 47.062399801000041 ], [ 6.688252807000111, 47.043847961000026 ], [ 6.665411824000103, 47.021291199000089 ], [ 6.598697550000082, 46.986538798000041 ], [ 6.442634725000062, 46.944164124000039 ], [ 6.427751913000122, 46.909075827 ], [ 6.4467688390001, 46.857709453000027 ], [ 6.417106568000122, 46.802157288000032 ], [ 6.432609497000044, 46.785982565000054 ], [ 6.429198853000116, 46.76081614200011 ], [ 6.131852661000039, 46.595606588000024 ], [ 6.118416789000065, 46.583462626000127 ], [ 6.137978215924945, 46.557587778130546 ], [ 6.085246356134405, 46.579861167159095 ], [ 6.053781511307704, 46.616346764191803 ], [ 6.095617450385021, 46.648723474808492 ], [ 6.08335670784578, 46.691009852822447 ], [ 6.206645286950447, 46.766398039637807 ], [ 6.082016376254728, 46.846664155526355 ], [ 6.024755631467201, 46.858188814662014 ], [ 5.993510513499359, 46.895575290467264 ], [ 5.984216079508428, 46.949287450755207 ], [ 5.949740979862327, 46.984806250508029 ], [ 5.83735083946965, 47.008965187393471 ], [ 5.80397437321875, 47.031421242696183 ], [ 5.766928473370342, 47.014029884971194 ], [ 5.747878179434394, 47.024939308901935 ], [ 5.81524634624185, 47.143591657129264 ], [ 5.781584235524065, 47.189844100225002 ], [ 5.725180425036569, 47.217804306823268 ], [ 5.69883520927749, 47.265001574063376 ], [ 5.731574468087217, 47.264364367521523 ], [ 5.927087170836273, 47.343015493470205 ], [ 5.997399673056464, 47.336467641168667 ], [ 6.074523699808879, 47.355473989732843 ], [ 6.123083271775556, 47.393926139679593 ], [ 6.17357643830195, 47.397276969556458 ], [ 6.206403587855277, 47.431202752504987 ], [ 6.260917750054091, 47.428511102305492 ], [ 6.321100858018156, 47.501196651903911 ], [ 6.424548127394132, 47.517687130856359 ], [ 6.475810336577752, 47.495340938533445 ], [ 6.500463657771604, 47.510161495156865 ], [ 6.553835241203387, 47.490419063189165 ], [ 6.595934852511448, 47.538363400850244 ], [ 6.63388163113234, 47.532903195825781 ], [ 6.703425090695362, 47.557710325371204 ], [ 6.779758101655034, 47.542768918750596 ], [ 6.807070114694, 47.56286291369247 ], [ 6.824845993747601, 47.547613889469403 ], [ 6.89375224676877, 47.551755735139068 ], [ 6.919152638383537, 47.53415563757261 ], [ 6.914428516762598, 47.487002314804954 ], [ 6.939169949951677, 47.426844260931965 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-01", "NAME_1": "Ain" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 6.118607036585445, 46.331771084867626 ], [ 6.089684692000077, 46.246377259000027 ], [ 5.958529907000127, 46.211960754000089 ], [ 5.982921183000144, 46.170826314000109 ], [ 5.958839966000113, 46.13046702100003 ], [ 5.913727794901774, 46.128246159232845 ], [ 5.871584239121319, 46.093331607667551 ], [ 5.845942148411382, 46.111030582994999 ], [ 5.825199959910208, 46.095287174463522 ], [ 5.840580819349327, 45.932931211106506 ], [ 5.772426560537326, 45.741530021693109 ], [ 5.640871339440764, 45.645770555566685 ], [ 5.600485595833561, 45.655581347001544 ], [ 5.547026120758858, 45.719554737660985 ], [ 5.450192621292445, 45.792987357680374 ], [ 5.430175530975987, 45.844260552982121 ], [ 5.36904759886761, 45.87995513422203 ], [ 5.333495839861087, 45.867991023167178 ], [ 5.272851305942993, 45.799820854448853 ], [ 5.239167222988954, 45.785659476603541 ], [ 5.118405499614084, 45.826605523026444 ], [ 4.91689426126112, 45.81134551268525 ], [ 4.909093968112131, 45.87416533935891 ], [ 4.845944551599757, 45.909673152993605 ], [ 4.820060760895387, 45.906564022211853 ], [ 4.784421111145377, 45.944774473063433 ], [ 4.748539762300197, 45.956903379487358 ], [ 4.749023160490481, 46.059438783972666 ], [ 4.79457247943634, 46.1514382988384 ], [ 4.815182831822199, 46.250556954939498 ], [ 4.872751193312922, 46.337590649988499 ], [ 4.946601293015249, 46.507186603678804 ], [ 5.041435281213239, 46.490904864567824 ], [ 5.155319563347177, 46.511218586368614 ], [ 5.240375718464634, 46.4687124814958 ], [ 5.310973866051086, 46.455353105561358 ], [ 5.320268300042017, 46.408386551298292 ], [ 5.36388402442816, 46.391401687138114 ], [ 5.391789298637207, 46.346918043233075 ], [ 5.46911107911302, 46.320298169125181 ], [ 5.469880121770188, 46.276869212344252 ], [ 5.509870357930652, 46.260686350094943 ], [ 5.595409912137711, 46.300017406578036 ], [ 5.647858644560813, 46.344039624529046 ], [ 5.697824466625832, 46.312113353748259 ], [ 5.721686772026885, 46.273606272311611 ], [ 5.871913828960032, 46.2719033916282 ], [ 6.059013168023284, 46.417385842182853 ], [ 6.135056600000098, 46.370400696000033 ], [ 6.118607036585445, 46.331771084867626 ] ] ] } },
@@ -96,7 +96,7 @@
{ "type": "Feature", "properties": { "ISO": "FR-86", "NAME_1": "Vienne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.796361877498612, 46.13289337622831 ], [ 0.707768123999699, 46.136694645941134 ], [ 0.646794000242892, 46.091035464914739 ], [ 0.599926322841497, 46.082773745811721 ], [ 0.553278372299019, 46.090661929704254 ], [ 0.487887744523789, 46.133662419784798 ], [ 0.44365678583199, 46.096385806959404 ], [ 0.470793017383812, 46.081092837364508 ], [ 0.457345750705827, 46.058515932064608 ], [ 0.286706096009539, 46.062207338797634 ], [ 0.197365272089598, 46.095539859676762 ], [ 0.198903358303312, 46.151174627507032 ], [ 0.108727574118234, 46.188835761661039 ], [ 0.111584018787426, 46.217048653472546 ], [ 0.176271521513513, 46.308949291476608 ], [ 0.150387731708463, 46.344512037500522 ], [ 0.112177280856827, 46.337799390729288 ], [ 0.08275589267032, 46.310838939765233 ], [ 0.045094758516257, 46.317870190257054 ], [ 0.019639435411591, 46.352224439905967 ], [ 0.020287628970891, 46.37864656029052 ], [ -0.014604950358205, 46.411737381175158 ], [ -0.014637909611849, 46.466932696186973 ], [ -0.033655244294096, 46.484521807635304 ], [ -0.033962860997235, 46.510867024293702 ], [ 0.019639435411591, 46.596527427598687 ], [ -0.026656953055976, 46.633441491331723 ], [ -0.024800263121676, 46.666719080720952 ], [ 0.013926544274568, 46.736108731932404 ], [ -0.015670624499705, 46.771572600195327 ], [ -0.019131318255745, 46.811727630825487 ], [ -0.016241913433589, 46.828415864400597 ], [ 0.013882599802116, 46.827646820844109 ], [ 0.027846223024767, 46.850443453002924 ], [ -0.013198700259807, 46.889137302044844 ], [ -0.045531465504723, 46.98701450341656 ], [ -0.081709444934972, 47.004768410233908 ], [ -0.109043431109455, 47.069609721311565 ], [ -0.100320286052352, 47.079870951683063 ], [ -0.053068086423082, 47.096251567655713 ], [ -0.004047088502318, 47.156555524717646 ], [ 0.066759798925546, 47.153688093031064 ], [ 0.100114292040928, 47.118575787742373 ], [ 0.135534214932079, 47.127046246686916 ], [ 0.147157750929466, 47.09883335487541 ], [ 0.191850135575294, 47.102294048631393 ], [ 0.20006790930654, 47.055503274956152 ], [ 0.257943888399723, 47.063435404220513 ], [ 0.306986858556684, 47.042583352739484 ], [ 0.303581097189863, 46.965920751941098 ], [ 0.326674359034428, 46.938531835176036 ], [ 0.433922899022548, 46.93274204031286 ], [ 0.572746145917904, 46.954989354874783 ], [ 0.583666556866092, 46.965041846304132 ], [ 0.572438529214764, 47.003900489815749 ], [ 0.671776911275401, 46.965975683430997 ], [ 0.713371151257604, 46.900079685229286 ], [ 0.831452210551049, 46.779416838716088 ], [ 0.902357974840641, 46.729813565743427 ], [ 0.916925847150139, 46.699480312666253 ], [ 0.906994205718036, 46.644186120792824 ], [ 0.92411090599353, 46.605733970846074 ], [ 1.014088936455266, 46.564392416976432 ], [ 1.026789131812961, 46.538299886430593 ], [ 1.136806226626049, 46.518403645212004 ], [ 1.149418531240201, 46.50047395690757 ], [ 1.14238728074838, 46.464504717318846 ], [ 1.194682204819912, 46.427920243424467 ], [ 1.177016188746109, 46.387018142373336 ], [ 1.057990305308351, 46.35970612933437 ], [ 0.987106513254957, 46.283526927625587 ], [ 0.901720768298787, 46.277484446649851 ], [ 0.794801819048701, 46.22627716895613 ], [ 0.827585023230199, 46.139869695230232 ], [ 0.796361877498612, 46.13289337622831 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-89", "NAME_1": "Yonne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 3.254860506407226, 47.490869503025124 ], [ 3.211552398724223, 47.515962277037431 ], [ 3.1451290569604, 47.525355587890033 ], [ 3.109467434074816, 47.577255003615505 ], [ 2.969259909317373, 47.567587035313409 ], [ 2.92500697838932, 47.619003052848598 ], [ 2.934323384616505, 47.6486441669947 ], [ 2.914635884138704, 47.677450319976288 ], [ 2.832721818157381, 47.722098759250287 ], [ 2.850871233320731, 47.759441290583084 ], [ 2.992353172061257, 47.792378303116152 ], [ 3.012106591046347, 47.847233041271807 ], [ 2.994572410188596, 47.907262340884301 ], [ 3.085011866604361, 47.948757704004834 ], [ 3.117926906901232, 48.00084388733552 ], [ 3.107995266368448, 48.03236366365212 ], [ 3.045109522086761, 48.076396868620577 ], [ 3.02265346588473, 48.131844868845576 ], [ 2.925644184931173, 48.155926901105602 ], [ 2.940563619315583, 48.199542625491745 ], [ 3.002328757965813, 48.229304589635092 ], [ 3.027904931067724, 48.262043848444819 ], [ 3.013183251305975, 48.31415200491108 ], [ 3.042340967261794, 48.361755766615317 ], [ 3.346354649947102, 48.371467681188506 ], [ 3.395375648767185, 48.411743560916591 ], [ 3.421281410808433, 48.369808744977547 ], [ 3.50974332819203, 48.347440580418436 ], [ 3.599875167904656, 48.267240382137913 ], [ 3.613234542939779, 48.217208641565549 ], [ 3.581571944389736, 48.18096474362801 ], [ 3.665793139241998, 48.14388588542522 ], [ 3.733183278285651, 48.157212301206698 ], [ 3.858713068653174, 48.015257950394073 ], [ 3.83168670008115, 47.9938126368437 ], [ 3.898439632582949, 47.986352919651495 ], [ 3.916281430143897, 47.933772352012397 ], [ 4.037614442452536, 47.922654187340868 ], [ 4.067892764039811, 47.938210828267074 ], [ 4.127482609934475, 47.933146130689352 ], [ 4.161737981822398, 47.954097059032051 ], [ 4.203024605101405, 47.939144666293316 ], [ 4.218229683952757, 47.972422255682545 ], [ 4.255495309760704, 47.934541394669623 ], [ 4.288410350057575, 47.924258191162551 ], [ 4.262702341739669, 47.843904184530459 ], [ 4.307966015319323, 47.845112680006139 ], [ 4.337629102600999, 47.791971808652022 ], [ 4.33029023450672, 47.76032019622005 ], [ 4.258637399796157, 47.733865117481173 ], [ 4.244530954340064, 47.655796266584389 ], [ 4.126208195951449, 47.517214718784203 ], [ 4.117155461055688, 47.455647332958051 ], [ 4.068178408506753, 47.424534051105525 ], [ 4.106125187127645, 47.339247182111762 ], [ 4.048029482074924, 47.339466908970621 ], [ 4.018212586441678, 47.313044788586126 ], [ 3.977035827041789, 47.32685460345715 ], [ 3.950690611282653, 47.393080192396951 ], [ 3.868908381416645, 47.374018912342933 ], [ 3.877214045891492, 47.417052360777802 ], [ 3.865920099732818, 47.431367546974684 ], [ 3.838586114457598, 47.424226433503065 ], [ 3.804484550921302, 47.385928092807205 ], [ 3.715890797422333, 47.411537224263441 ], [ 3.644699388665856, 47.456723993217679 ], [ 3.587328780898531, 47.465249384551441 ], [ 3.492011394510257, 47.55995153663406 ], [ 3.488210124797433, 47.493780880083534 ], [ 3.415436684455415, 47.508821163565813 ], [ 3.345871251756876, 47.48053136712889 ], [ 3.290873691367779, 47.501306514883709 ], [ 3.254860506407226, 47.490869503025124 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-91", "NAME_1": "Essonne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.001715926848533, 48.558454992603799 ], [ 2.036256944102661, 48.597478431484376 ], [ 2.028061142607612, 48.65257486963452 ], [ 2.045793077188762, 48.686797282268742 ], [ 2.090221789603902, 48.69771769321693 ], [ 2.123642201226573, 48.755989179756796 ], [ 2.208698357243406, 48.775555831136671 ], [ 2.267519159581525, 48.755198163964053 ], [ 2.290041133391583, 48.73118205021143 ], [ 2.320758907797369, 48.748705244051735 ], [ 2.388742308910423, 48.721558026381786 ], [ 2.508361454417582, 48.730445965908586 ], [ 2.541166631734654, 48.693883464250462 ], [ 2.571730597788871, 48.691960856708135 ], [ 2.575993292556404, 48.673306071118247 ], [ 2.52404993145916, 48.629712319867622 ], [ 2.496452273953253, 48.516509190546685 ], [ 2.502780399395931, 48.441121003731325 ], [ 2.526203251978473, 48.420708405068808 ], [ 2.390660743598403, 48.313601981346324 ], [ 2.315968868568405, 48.328005765153932 ], [ 2.255917596719712, 48.30560464134112 ], [ 2.197712028687135, 48.338706449243205 ], [ 2.133507924151388, 48.299067776056972 ], [ 1.972272566425772, 48.284236232416163 ], [ 1.998683700692197, 48.325522854795906 ], [ 1.923053814781724, 48.413061920271389 ], [ 1.920351177564783, 48.461357820906699 ], [ 1.94891563235052, 48.548863928027856 ], [ 2.001715926848533, 48.558454992603799 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-77", "NAME_1": "Seien-et-Marne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.390660743598403, 48.313601981346324 ], [ 2.526203251978473, 48.420708405068808 ], [ 2.502780399395931, 48.441121003731325 ], [ 2.496452273953253, 48.516509190546685 ], [ 2.52404993145916, 48.629712319867622 ], [ 2.575993292556404, 48.673306071118247 ], [ 2.571181281091242, 48.70521036966278 ], [ 2.598976692320491, 48.748287763469477 ], [ 2.571071417212124, 48.858041186051878 ], [ 2.592297004802901, 48.933583180319488 ], [ 2.570280402318701, 48.970552176441743 ], [ 2.574323371126638, 49.000665702660001 ], [ 2.553119756671435, 49.009784355163845 ], [ 2.583332160650684, 49.084546321555479 ], [ 2.626486459082798, 49.097828792864448 ], [ 2.755729627520282, 49.06780315649047 ], [ 2.794709121928406, 49.086666682821146 ], [ 2.98661830868798, 49.0788663896721 ], [ 3.07973842918517, 49.106200374947321 ], [ 3.140866361293547, 49.093148616615338 ], [ 3.174089019192877, 49.055663263948475 ], [ 3.175956694345984, 49.004346123274956 ], [ 3.319943516579997, 48.919905201563779 ], [ 3.363229651127483, 48.920476490497606 ], [ 3.383092933092371, 48.870763354545147 ], [ 3.435212075676759, 48.848384202968589 ], [ 3.477904948154844, 48.85009806977007 ], [ 3.463952311050321, 48.817172043355072 ], [ 3.409328285871709, 48.813140060665262 ], [ 3.425610024083312, 48.790486251639152 ], [ 3.395529457118755, 48.753868818491128 ], [ 3.451252115692569, 48.724359539561078 ], [ 3.459294107936728, 48.642401529107246 ], [ 3.508205242877636, 48.641709390176175 ], [ 3.537802411651967, 48.613419594638572 ], [ 3.493571452960168, 48.587733558556863 ], [ 3.461315592340725, 48.539800207013911 ], [ 3.405922523605568, 48.524715977260541 ], [ 3.42064420426658, 48.49849161149865 ], [ 3.391047034592987, 48.474453524610453 ], [ 3.395375648767185, 48.411743560916591 ], [ 3.346354649947102, 48.371467681188506 ], [ 3.042340967261794, 48.361755766615317 ], [ 3.013183251305975, 48.31415200491108 ], [ 3.027904931067724, 48.262043848444819 ], [ 3.002328757965813, 48.229304589635092 ], [ 2.940563619315583, 48.199542625491745 ], [ 2.925644184931173, 48.155926901105602 ], [ 2.825119278731734, 48.131482319753218 ], [ 2.795456191450057, 48.133240132825847 ], [ 2.803234512362849, 48.151433492461706 ], [ 2.788337051114013, 48.159958883795412 ], [ 2.68482386323069, 48.122594380226417 ], [ 2.46681115980715, 48.124319234045402 ], [ 2.450837038298687, 48.146621480996544 ], [ 2.507482547881295, 48.157212301206698 ], [ 2.500187626058107, 48.181195456604996 ], [ 2.513678837208545, 48.206617821355337 ], [ 2.436884401194163, 48.24981606515928 ], [ 2.414494263499478, 48.300979396581852 ], [ 2.390660743598403, 48.313601981346324 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-77", "NAME_1": "Seine-et-Marne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.390660743598403, 48.313601981346324 ], [ 2.526203251978473, 48.420708405068808 ], [ 2.502780399395931, 48.441121003731325 ], [ 2.496452273953253, 48.516509190546685 ], [ 2.52404993145916, 48.629712319867622 ], [ 2.575993292556404, 48.673306071118247 ], [ 2.571181281091242, 48.70521036966278 ], [ 2.598976692320491, 48.748287763469477 ], [ 2.571071417212124, 48.858041186051878 ], [ 2.592297004802901, 48.933583180319488 ], [ 2.570280402318701, 48.970552176441743 ], [ 2.574323371126638, 49.000665702660001 ], [ 2.553119756671435, 49.009784355163845 ], [ 2.583332160650684, 49.084546321555479 ], [ 2.626486459082798, 49.097828792864448 ], [ 2.755729627520282, 49.06780315649047 ], [ 2.794709121928406, 49.086666682821146 ], [ 2.98661830868798, 49.0788663896721 ], [ 3.07973842918517, 49.106200374947321 ], [ 3.140866361293547, 49.093148616615338 ], [ 3.174089019192877, 49.055663263948475 ], [ 3.175956694345984, 49.004346123274956 ], [ 3.319943516579997, 48.919905201563779 ], [ 3.363229651127483, 48.920476490497606 ], [ 3.383092933092371, 48.870763354545147 ], [ 3.435212075676759, 48.848384202968589 ], [ 3.477904948154844, 48.85009806977007 ], [ 3.463952311050321, 48.817172043355072 ], [ 3.409328285871709, 48.813140060665262 ], [ 3.425610024083312, 48.790486251639152 ], [ 3.395529457118755, 48.753868818491128 ], [ 3.451252115692569, 48.724359539561078 ], [ 3.459294107936728, 48.642401529107246 ], [ 3.508205242877636, 48.641709390176175 ], [ 3.537802411651967, 48.613419594638572 ], [ 3.493571452960168, 48.587733558556863 ], [ 3.461315592340725, 48.539800207013911 ], [ 3.405922523605568, 48.524715977260541 ], [ 3.42064420426658, 48.49849161149865 ], [ 3.391047034592987, 48.474453524610453 ], [ 3.395375648767185, 48.411743560916591 ], [ 3.346354649947102, 48.371467681188506 ], [ 3.042340967261794, 48.361755766615317 ], [ 3.013183251305975, 48.31415200491108 ], [ 3.027904931067724, 48.262043848444819 ], [ 3.002328757965813, 48.229304589635092 ], [ 2.940563619315583, 48.199542625491745 ], [ 2.925644184931173, 48.155926901105602 ], [ 2.825119278731734, 48.131482319753218 ], [ 2.795456191450057, 48.133240132825847 ], [ 2.803234512362849, 48.151433492461706 ], [ 2.788337051114013, 48.159958883795412 ], [ 2.68482386323069, 48.122594380226417 ], [ 2.46681115980715, 48.124319234045402 ], [ 2.450837038298687, 48.146621480996544 ], [ 2.507482547881295, 48.157212301206698 ], [ 2.500187626058107, 48.181195456604996 ], [ 2.513678837208545, 48.206617821355337 ], [ 2.436884401194163, 48.24981606515928 ], [ 2.414494263499478, 48.300979396581852 ], [ 2.390660743598403, 48.313601981346324 ] ] ] } },
{ "type": "Feature", "properties": { "ISO": "FR-94", "NAME_1": "Val-de-Marne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.473420416019394, 48.859200672972634 ], [ 2.592384894647182, 48.807471115799331 ], [ 2.598976692320491, 48.748287763469477 ], [ 2.571730597788871, 48.691960856708135 ], [ 2.541166631734654, 48.693883464250462 ], [ 2.494628543272654, 48.733763837431127 ], [ 2.388742308910423, 48.721558026381786 ], [ 2.320758907797369, 48.748705244051735 ], [ 2.331964963212499, 48.817117111865173 ], [ 2.443366334988355, 48.815831711764076 ], [ 2.473420416019394, 48.859200672972634 ] ] ] } }
]
}

View File

@@ -51,7 +51,7 @@ const propTypes = {
leftMargin: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
metric: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
normalized: PropTypes.bool,
numberFormat: PropTypes.string,
valueFormatter: PropTypes.object,
showLegend: PropTypes.bool,
showPercentage: PropTypes.bool,
showValues: PropTypes.bool,
@@ -90,7 +90,7 @@ function Heatmap(element, props) {
leftMargin,
metric,
normalized,
numberFormat,
valueFormatter,
showLegend,
showPercentage,
showValues,
@@ -115,8 +115,6 @@ function Heatmap(element, props) {
const pixelsPerCharX = 4.5; // approx, depends on font size
let pixelsPerCharY = 6; // approx, depends on font size
const valueFormatter = getNumberFormatter(numberFormat);
// Dynamically adjusts based on max x / y category lengths
function adjustMargins() {
let longestX = 1;

View File

@@ -1,3 +1,5 @@
import { getValueFormatter } from '@superset-ui/core';
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -17,7 +19,7 @@
* under the License.
*/
export default function transformProps(chartProps) {
const { width, height, formData, queriesData } = chartProps;
const { width, height, formData, queriesData, datasource } = chartProps;
const {
bottomMargin,
canvasImageRendering,
@@ -37,7 +39,13 @@ export default function transformProps(chartProps) {
yAxisBounds,
yAxisFormat,
} = formData;
const { columnFormats = {}, currencyFormats = {} } = datasource;
const valueFormatter = getValueFormatter(
metric,
currencyFormats,
columnFormats,
yAxisFormat,
);
return {
width,
height,
@@ -50,7 +58,6 @@ export default function transformProps(chartProps) {
leftMargin,
metric,
normalized,
numberFormat: yAxisFormat,
showLegend,
showPercentage: showPerc,
showValues,
@@ -59,5 +66,6 @@ export default function transformProps(chartProps) {
xScaleInterval: parseInt(xscaleInterval, 10),
yScaleInterval: parseInt(yscaleInterval, 10),
yAxisBounds,
valueFormatter,
};
}

View File

@@ -21,6 +21,7 @@ import { t, validateNonEmpty } from '@superset-ui/core';
import {
ColumnMeta,
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_FORMAT_OPTIONS,
D3_TIME_FORMAT_OPTIONS,
@@ -241,7 +242,11 @@ const config: ControlPanelConfig = {
),
controlSetRows: [
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Rolling Window')}</div>],
[
<ControlSubSectionHeader>
{t('Rolling Window')}
</ControlSubSectionHeader>,
],
[
{
name: 'rolling_type',
@@ -293,7 +298,11 @@ const config: ControlPanelConfig = {
},
],
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Time Comparison')}</div>],
[
<ControlSubSectionHeader>
{t('Time Comparison')}
</ControlSubSectionHeader>,
],
[
{
name: 'time_compare',
@@ -342,7 +351,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Resample')}</div>],
[<ControlSubSectionHeader>{t('Resample')}</ControlSubSectionHeader>],
[
{
name: 'resample_rule',

View File

@@ -20,6 +20,7 @@ import React from 'react';
import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_FORMAT_OPTIONS,
D3_TIME_FORMAT_OPTIONS,
@@ -123,7 +124,11 @@ const config: ControlPanelConfig = {
),
controlSetRows: [
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Rolling Window')}</div>],
[
<ControlSubSectionHeader>
{t('Rolling Window')}
</ControlSubSectionHeader>,
],
[
{
name: 'rolling_type',
@@ -175,7 +180,11 @@ const config: ControlPanelConfig = {
},
],
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Time Comparison')}</div>],
[
<ControlSubSectionHeader>
{t('Time Comparison')}
</ControlSubSectionHeader>,
],
[
{
name: 'time_compare',
@@ -224,7 +233,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Resample')}</div>],
[<ControlSubSectionHeader>{t('Resample')}</ControlSubSectionHeader>],
[
{
name: 'resample_rule',

View File

@@ -21,7 +21,6 @@ import d3 from 'd3';
import PropTypes from 'prop-types';
import { extent as d3Extent } from 'd3-array';
import {
getNumberFormatter,
getSequentialSchemeRegistry,
CategoricalColorNamespace,
} from '@superset-ui/core';
@@ -47,10 +46,9 @@ const propTypes = {
setDataMask: PropTypes.func,
onContextMenu: PropTypes.func,
emitCrossFilters: PropTypes.bool,
formatter: PropTypes.object,
};
const formatter = getNumberFormatter();
function WorldMap(element, props) {
const {
countryFieldtype,
@@ -71,6 +69,7 @@ function WorldMap(element, props) {
inContextMenu,
filterState,
emitCrossFilters,
formatter,
} = props;
const div = d3.select(element);
div.classed('superset-legacy-chart-world-map', true);

View File

@@ -17,6 +17,7 @@
* under the License.
*/
import { rgb } from 'd3-color';
import { getValueFormatter } from '@superset-ui/core';
export default function transformProps(chartProps) {
const {
@@ -28,6 +29,7 @@ export default function transformProps(chartProps) {
inContextMenu,
filterState,
emitCrossFilters,
datasource,
} = chartProps;
const { onContextMenu, setDataMask } = hooks;
const {
@@ -40,8 +42,17 @@ export default function transformProps(chartProps) {
colorBy,
colorScheme,
sliceId,
metric,
} = formData;
const { r, g, b } = colorPicker;
const { currencyFormats = {}, columnFormats = {} } = datasource;
const formatter = getValueFormatter(
metric,
currencyFormats,
columnFormats,
undefined,
);
return {
countryFieldtype,
@@ -61,5 +72,6 @@ export default function transformProps(chartProps) {
inContextMenu,
filterState,
emitCrossFilters,
formatter,
};
}

View File

@@ -22,6 +22,7 @@ import React from 'react';
import { t } from '@superset-ui/core';
import {
ControlPanelSectionConfig,
ControlSubSectionHeader,
CustomControlItem,
D3_TIME_FORMAT_OPTIONS,
D3_FORMAT_DOCS,
@@ -390,7 +391,11 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [
'of query results',
),
controlSetRows: [
[<div className="section-header">{t('Rolling Window')}</div>],
[
<ControlSubSectionHeader>
{t('Rolling Window')}
</ControlSubSectionHeader>,
],
[
{
name: 'rolling_type',
@@ -443,7 +448,11 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [
},
},
],
[<div className="section-header">{t('Time Comparison')}</div>],
[
<ControlSubSectionHeader>
{t('Time Comparison')}
</ControlSubSectionHeader>,
],
[
{
name: 'time_compare',
@@ -494,7 +503,7 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [
},
},
],
[<div className="section-header">{t('Resample')}</div>],
[<ControlSubSectionHeader>{t('Resample')}</ControlSubSectionHeader>],
[
{
name: 'resample_rule',

View File

@@ -26,11 +26,11 @@ import {
getMetricLabel,
extractTimegrain,
QueryFormData,
getValueFormatter,
} from '@superset-ui/core';
import { BigNumberTotalChartProps, BigNumberVizProps } from '../types';
import { getDateFormatter, parseMetricValue } from '../utils';
import { Refs } from '../../types';
import { getValueFormatter } from '../../utils/valueFormatter';
export default function transformProps(
chartProps: BigNumberTotalChartProps,

View File

@@ -19,6 +19,7 @@
import { hasGenericChartAxes, smartDateFormatter, t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_TIME_FORMAT_OPTIONS,
getStandardizedControls,
@@ -170,7 +171,11 @@ const config: ControlPanelConfig = {
expanded: false,
controlSetRows: [
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Rolling Window')}</div>],
[
<ControlSubSectionHeader>
{t('Rolling Window')}
</ControlSubSectionHeader>,
],
[
{
name: 'rolling_type',
@@ -223,7 +228,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Resample')}</div>],
[<ControlSubSectionHeader>{t('Resample')}</ControlSubSectionHeader>],
[
{
name: 'resample_rule',

View File

@@ -28,6 +28,7 @@ import {
getXAxisLabel,
Metric,
ValueFormatter,
getValueFormatter,
} from '@superset-ui/core';
import { EChartsCoreOption, graphic } from 'echarts';
import {
@@ -39,7 +40,6 @@ import {
import { getDateFormatter, parseMetricValue } from '../utils';
import { getDefaultTooltip } from '../../utils/tooltip';
import { Refs } from '../../types';
import { getValueFormatter } from '../../utils/valueFormatter';
const defaultNumberFormatter = getNumberFormatter();
export function renderTooltipFactory(

View File

@@ -20,6 +20,7 @@ import React from 'react';
import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_OPTIONS,
D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT,
sections,
@@ -77,7 +78,7 @@ const config: ControlPanelConfig = {
['color_scheme'],
...funnelLegendSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Labels')}</div>],
[<ControlSubSectionHeader>{t('Labels')}</ControlSubSectionHeader>],
[
{
name: 'label_type',

View File

@@ -24,6 +24,7 @@ import {
NumberFormats,
ValueFormatter,
getColumnLabel,
getValueFormatter,
} from '@superset-ui/core';
import { CallbackDataParams } from 'echarts/types/src/util/types';
import { EChartsCoreOption, FunnelSeriesOption } from 'echarts';
@@ -45,7 +46,6 @@ import { defaultGrid } from '../defaults';
import { OpacityEnum, DEFAULT_LEGEND_FORM_DATA } from '../constants';
import { getDefaultTooltip } from '../utils/tooltip';
import { Refs } from '../types';
import { getValueFormatter } from '../utils/valueFormatter';
const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT);

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
sharedControls,
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_OPTIONS,
sections,
getStandardizedControls,
@@ -73,7 +74,7 @@ const config: ControlPanelConfig = {
label: t('Chart Options'),
expanded: true,
controlSetRows: [
[<div className="section-header">{t('General')}</div>],
[<ControlSubSectionHeader>{t('General')}</ControlSubSectionHeader>],
[
{
name: 'min_val',
@@ -193,7 +194,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Axis')}</div>],
[<ControlSubSectionHeader>{t('Axis')}</ControlSubSectionHeader>],
[
{
name: 'show_axis_tick',
@@ -232,7 +233,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Progress')}</div>],
[<ControlSubSectionHeader>{t('Progress')}</ControlSubSectionHeader>],
[
{
name: 'show_progress',
@@ -273,7 +274,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Intervals')}</div>],
[<ControlSubSectionHeader>{t('Intervals')}</ControlSubSectionHeader>],
[
{
name: 'intervals',

View File

@@ -23,6 +23,7 @@ import {
DataRecord,
getMetricLabel,
getColumnLabel,
getValueFormatter,
} from '@superset-ui/core';
import { EChartsCoreOption, GaugeSeriesOption } from 'echarts';
import { GaugeDataItemOption } from 'echarts/types/src/chart/gauge/GaugeSeries';
@@ -46,7 +47,6 @@ import { OpacityEnum } from '../constants';
import { getDefaultTooltip } from '../utils/tooltip';
import { Refs } from '../types';
import { getColtypesMapping } from '../utils/series';
import { getValueFormatter } from '../utils/valueFormatter';
const setIntervalBoundsAndColors = (
intervals: string,

View File

@@ -20,6 +20,7 @@ import React from 'react';
import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
getStandardizedControls,
sections,
sharedControls,
@@ -99,7 +100,7 @@ const controlPanel: ControlPanelConfig = {
controlSetRows: [
['color_scheme'],
...legendSection,
[<div className="section-header">{t('Layout')}</div>],
[<ControlSubSectionHeader>{t('Layout')}</ControlSubSectionHeader>],
[
{
name: 'layout',

View File

@@ -45,6 +45,7 @@ export default function EchartsMixedTimeseries({
emitCrossFilters,
seriesBreakdown,
onContextMenu,
onFocusedSeries,
xValueFormatter,
xAxis,
refs,
@@ -123,6 +124,12 @@ export default function EchartsMixedTimeseries({
const { seriesName, seriesIndex } = props;
handleChange(seriesName, seriesIndex);
},
mouseout: () => {
onFocusedSeries(null);
},
mouseover: params => {
onFocusedSeries(params.seriesName);
},
contextmenu: async eventParams => {
if (onContextMenu) {
eventParams.event.stop();

View File

@@ -23,6 +23,7 @@ import {
ControlPanelConfig,
ControlPanelSectionConfig,
ControlSetRow,
ControlSubSectionHeader,
CustomControlItem,
getStandardizedControls,
sections,
@@ -128,7 +129,7 @@ function createCustomizeSection(
controlSuffix: string,
): ControlSetRow[] {
return [
[<div className="section-header">{label}</div>],
[<ControlSubSectionHeader>{label}</ControlSubSectionHeader>],
[
{
name: `seriesType${controlSuffix}`,
@@ -311,7 +312,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
['x_axis_time_format'],
[
{
@@ -335,7 +336,7 @@ const config: ControlPanelConfig = {
],
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
[
{
name: 'minorSplitLine',

View File

@@ -34,6 +34,11 @@ import {
isPhysicalColumn,
isDefined,
ensureIsArray,
buildCustomFormatters,
ValueFormatter,
NumberFormatter,
QueryFormMetric,
getCustomFormatter,
} from '@superset-ui/core';
import { getOriginalSeries } from '@superset-ui/chart-controls';
import { EChartsCoreOption, SeriesOption } from 'echarts';
@@ -83,6 +88,23 @@ import {
} from '../Timeseries/transformers';
import { TIMESERIES_CONSTANTS, TIMEGRAIN_TO_TIMESTAMP } from '../constants';
import { getDefaultTooltip } from '../utils/tooltip';
import { getYAxisFormatter } from '../utils/getYAxisFormatter';
const getFormatter = (
customFormatters: Record<string, ValueFormatter>,
defaultFormatter: NumberFormatter,
metrics: QueryFormMetric[],
formatterKey: string,
forcePercentFormat: boolean,
) => {
if (forcePercentFormat) {
return getNumberFormatter(',.0%');
}
return (
getCustomFormatter(customFormatters, metrics, formatterKey) ??
defaultFormatter
);
};
export default function transformProps(
chartProps: EchartsMixedTimeseriesProps,
@@ -99,7 +121,14 @@ export default function transformProps(
inContextMenu,
emitCrossFilters,
} = chartProps;
const { verboseMap = {} } = datasource;
let focusedSeries: string | null = null;
const {
verboseMap = {},
currencyFormats = {},
columnFormats = {},
} = datasource;
const { label_map: labelMap } =
queriesData[0] as TimeseriesChartDataResponseResult;
const { label_map: labelMapB } =
@@ -160,6 +189,8 @@ export default function transformProps(
sliceId,
timeGrainSqla,
percentageThreshold,
metrics = [],
metricsB = [],
}: EchartsMixedTimeseriesFormData = { ...DEFAULT_FORM_DATA, ...formData };
const refs: Refs = {};
@@ -194,6 +225,18 @@ export default function transformProps(
const formatterSecondary = getNumberFormatter(
contributionMode ? ',.0%' : yAxisFormatSecondary,
);
const customFormatters = buildCustomFormatters(
[...ensureIsArray(metrics), ...ensureIsArray(metricsB)],
currencyFormats,
columnFormats,
yAxisFormat,
);
const customFormattersSecondary = buildCustomFormatters(
[...ensureIsArray(metrics), ...ensureIsArray(metricsB)],
currencyFormats,
columnFormats,
yAxisFormatSecondary,
);
const primarySeries = new Set<string>();
const secondarySeries = new Set<string>();
@@ -292,12 +335,6 @@ export default function transformProps(
parseYAxisBound,
);
const maxLabelFormatter = getOverMaxHiddenFormatter({ max, formatter });
const maxLabelFormatterSecondary = getOverMaxHiddenFormatter({
max: maxSecondary,
formatter: formatterSecondary,
});
const array = ensureIsArray(chartProps.rawFormData?.time_compare);
const inverted = invert(verboseMap);
@@ -306,6 +343,14 @@ export default function transformProps(
const seriesName = inverted[entryName] || entryName;
const colorScaleKey = getOriginalSeries(seriesName, array);
const seriesFormatter = getFormatter(
customFormatters,
formatter,
metrics,
labelMap[seriesName]?.[0],
!!contributionMode,
);
const transformedSeries = transformSeries(
entry,
colorScale,
@@ -325,8 +370,11 @@ export default function transformProps(
queryIndex: 0,
formatter:
seriesType === EchartsTimeseriesSeriesType.Bar
? maxLabelFormatter
: formatter,
? getOverMaxHiddenFormatter({
max,
formatter: seriesFormatter,
})
: seriesFormatter,
showValueIndexes: showValueIndexesA,
totalStackedValues,
thresholdValues,
@@ -340,6 +388,14 @@ export default function transformProps(
const seriesName = `${inverted[entryName] || entryName} (1)`;
const colorScaleKey = getOriginalSeries(seriesName, array);
const seriesFormatter = getFormatter(
customFormattersSecondary,
formatterSecondary,
metricsB,
labelMapB[seriesName]?.[0],
!!contributionMode,
);
const transformedSeries = transformSeries(
entry,
colorScale,
@@ -361,8 +417,11 @@ export default function transformProps(
queryIndex: 1,
formatter:
seriesTypeB === EchartsTimeseriesSeriesType.Bar
? maxLabelFormatterSecondary
: formatterSecondary,
? getOverMaxHiddenFormatter({
max: maxSecondary,
formatter: seriesFormatter,
})
: seriesFormatter,
showValueIndexes: showValueIndexesB,
totalStackedValues: totalStackedValuesB,
thresholdValues: thresholdValuesB,
@@ -434,7 +493,14 @@ export default function transformProps(
max,
minorTick: { show: true },
minorSplitLine: { show: minorSplitLine },
axisLabel: { formatter },
axisLabel: {
formatter: getYAxisFormatter(
metrics,
!!contributionMode,
customFormatters,
yAxisFormat,
),
},
scale: truncateYAxis,
name: yAxisTitle,
nameGap: convertInteger(yAxisTitleMargin),
@@ -449,7 +515,14 @@ export default function transformProps(
minorTick: { show: true },
splitLine: { show: false },
minorSplitLine: { show: minorSplitLine },
axisLabel: { formatter: formatterSecondary },
axisLabel: {
formatter: getYAxisFormatter(
metricsB,
!!contributionMode,
customFormattersSecondary,
yAxisFormatSecondary,
),
},
scale: truncateYAxis,
name: yAxisTitleSecondary,
alignTicks,
@@ -475,12 +548,40 @@ export default function transformProps(
Object.keys(forecastValues).forEach(key => {
const value = forecastValues[key];
// if there are no dimensions, key is a verbose name of a metric,
// otherwise it is a comma separated string where the first part is metric name
let formatterKey;
if (primarySeries.has(key)) {
formatterKey =
groupby.length === 0 ? inverted[key] : labelMap[key]?.[0];
} else {
formatterKey =
groupbyB.length === 0 ? inverted[key] : labelMapB[key]?.[0];
}
const tooltipFormatter = getFormatter(
customFormatters,
formatter,
metrics,
formatterKey,
!!contributionMode,
);
const tooltipFormatterSecondary = getFormatter(
customFormattersSecondary,
formatterSecondary,
metricsB,
formatterKey,
!!contributionMode,
);
const content = formatForecastTooltipSeries({
...value,
seriesName: key,
formatter: primarySeries.has(key) ? formatter : formatterSecondary,
formatter: primarySeries.has(key)
? tooltipFormatter
: tooltipFormatterSecondary,
});
rows.push(`<span style="opacity: 0.7">${content}</span>`);
const contentStyle =
key === focusedSeries ? 'font-weight: 700' : 'opacity: 0.7';
rows.push(`<span style="${contentStyle}">${content}</span>`);
});
return rows.join('<br />');
},
@@ -531,6 +632,10 @@ export default function transformProps(
: [],
};
const onFocusedSeries = (seriesName: string | null) => {
focusedSeries = seriesName;
};
return {
formData,
width,
@@ -545,6 +650,7 @@ export default function transformProps(
seriesBreakdown: rawSeriesA.length,
selectedValues: filterState.selectedValues || [],
onContextMenu,
onFocusedSeries,
xValueFormatter: tooltipFormatter,
xAxis: {
label: xAxisLabel,

View File

@@ -150,4 +150,5 @@ export type EchartsMixedTimeseriesChartTransformedProps =
label: string;
type: AxisType;
};
onFocusedSeries: (series: string | null) => void;
};

View File

@@ -21,6 +21,7 @@ import { ensureIsInt, t, validateNonEmpty } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT,
D3_FORMAT_OPTIONS,
@@ -90,7 +91,7 @@ const config: ControlPanelConfig = {
],
...legendSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Labels')}</div>],
[<ControlSubSectionHeader>{t('Labels')}</ControlSubSectionHeader>],
[
{
name: 'label_type',
@@ -195,7 +196,7 @@ const config: ControlPanelConfig = {
},
],
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Pie shape')}</div>],
[<ControlSubSectionHeader>{t('Pie shape')}</ControlSubSectionHeader>],
[
{
name: 'outerRadius',

View File

@@ -25,6 +25,7 @@ import {
NumberFormats,
t,
ValueFormatter,
getValueFormatter,
} from '@superset-ui/core';
import { CallbackDataParams } from 'echarts/types/src/util/types';
import { EChartsCoreOption, PieSeriesOption } from 'echarts';
@@ -47,7 +48,6 @@ import { defaultGrid } from '../defaults';
import { convertInteger } from '../utils/convertInteger';
import { getDefaultTooltip } from '../utils/tooltip';
import { Refs } from '../types';
import { getValueFormatter } from '../utils/valueFormatter';
const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT);

View File

@@ -26,6 +26,7 @@ import {
} from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT,
D3_FORMAT_OPTIONS,
@@ -85,7 +86,7 @@ const config: ControlPanelConfig = {
controlSetRows: [
['color_scheme'],
...legendSection,
[<div className="section-header">{t('Labels')}</div>],
[<ControlSubSectionHeader>{t('Labels')}</ControlSubSectionHeader>],
[
{
name: 'show_labels',
@@ -156,7 +157,7 @@ const config: ControlPanelConfig = {
},
},
],
[<div className="section-header">{t('Radar')}</div>],
[<ControlSubSectionHeader>{t('Radar')}</ControlSubSectionHeader>],
[
{
name: 'column_config',

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT,
D3_FORMAT_OPTIONS,
@@ -64,7 +65,7 @@ const config: ControlPanelConfig = {
controlSetRows: [
['color_scheme'],
['linear_color_scheme'],
[<div className="section-header">{t('Labels')}</div>],
[<ControlSubSectionHeader>{t('Labels')}</ControlSubSectionHeader>],
[
{
name: 'show_labels',

View File

@@ -24,10 +24,11 @@ import {
getNumberFormatter,
getSequentialSchemeRegistry,
getTimeFormatter,
getValueFormatter,
NumberFormats,
NumberFormatter,
SupersetTheme,
t,
ValueFormatter,
} from '@superset-ui/core';
import { EChartsCoreOption } from 'echarts';
import { CallbackDataParams } from 'echarts/types/src/util/types';
@@ -74,7 +75,7 @@ export function formatLabel({
}: {
params: CallbackDataParams;
labelType: EchartsSunburstLabelType;
numberFormatter: NumberFormatter;
numberFormatter: ValueFormatter;
}): string {
const { name = '', value } = params;
const formattedValue = numberFormatter(value as number);
@@ -93,7 +94,8 @@ export function formatLabel({
export function formatTooltip({
params,
numberFormatter,
primaryValueFormatter,
secondaryValueFormatter,
colorByCategory,
totalValue,
metricLabel,
@@ -107,7 +109,8 @@ export function formatTooltip({
value: number;
}[];
};
numberFormatter: NumberFormatter;
primaryValueFormatter: ValueFormatter;
secondaryValueFormatter: ValueFormatter | undefined;
colorByCategory: boolean;
totalValue: number;
metricLabel: string;
@@ -116,8 +119,10 @@ export function formatTooltip({
}): string {
const { data, treePathInfo = [] } = params;
const node = data as TreeNode;
const formattedValue = numberFormatter(node.value);
const formattedSecondaryValue = numberFormatter(node.secondaryValue);
const formattedValue = primaryValueFormatter(node.value);
const formattedSecondaryValue = secondaryValueFormatter?.(
node.secondaryValue,
);
const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT);
const compareValuePercentage = percentFormatter(
@@ -177,6 +182,7 @@ export default function transformProps(
theme,
inContextMenu,
emitCrossFilters,
datasource,
} = chartProps;
const { data = [] } = queriesData[0];
const coltypeMapping = getColtypesMapping(queriesData[0]);
@@ -195,12 +201,28 @@ export default function transformProps(
showTotal,
sliceId,
} = formData;
const { currencyFormats = {}, columnFormats = {} } = datasource;
const refs: Refs = {};
const primaryValueFormatter = getValueFormatter(
metric,
currencyFormats,
columnFormats,
numberFormat,
);
const secondaryValueFormatter = secondaryMetric
? getValueFormatter(
secondaryMetric,
currencyFormats,
columnFormats,
numberFormat,
)
: undefined;
const numberFormatter = getNumberFormatter(numberFormat);
const formatter = (params: CallbackDataParams) =>
formatLabel({
params,
numberFormatter,
numberFormatter: primaryValueFormatter,
labelType,
});
const minShowLabelAngle = (showLabelsThreshold || 0) * 3.6;
@@ -319,7 +341,8 @@ export default function transformProps(
formatter: (params: any) =>
formatTooltip({
params,
numberFormatter,
primaryValueFormatter,
secondaryValueFormatter,
colorByCategory,
totalValue,
metricLabel,
@@ -356,7 +379,7 @@ export default function transformProps(
top: 'center',
left: 'center',
style: {
text: t('Total: %s', numberFormatter(totalValue)),
text: t('Total: %s', primaryValueFormatter(totalValue)),
fontSize: 16,
fontWeight: 'bold',
},

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
getStandardizedControls,
sections,
@@ -179,7 +180,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
name: 'x_axis_time_format',
@@ -212,7 +213,7 @@ const config: ControlPanelConfig = {
],
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
['y_axis_format'],
[
{

View File

@@ -50,6 +50,7 @@ export default function EchartsTimeseries({
legendData = [],
onContextMenu,
onLegendStateChanged,
onFocusedSeries,
xValueFormatter,
xAxis,
refs,
@@ -146,6 +147,12 @@ export default function EchartsTimeseries({
handleChange(name);
}, TIMER_DURATION);
},
mouseout: () => {
onFocusedSeries(null);
},
mouseover: params => {
onFocusedSeries(params.seriesName);
},
legendselectchanged: payload => {
onLegendStateChanged?.(payload.selected);
},

View File

@@ -23,6 +23,7 @@ import {
ControlPanelsContainerProps,
ControlSetRow,
ControlStateMapping,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
formatSelectOptions,
getStandardizedControls,
@@ -292,9 +293,9 @@ const config: ControlPanelConfig = {
tabOverride: 'customize',
expanded: true,
controlSetRows: [
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
...createAxisTitleControl('x'),
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
...createAxisTitleControl('y'),
],
},
@@ -318,10 +319,10 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
...createAxisControl('x'),
...richTooltipSection,
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
...createAxisControl('y'),
],
},

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
getStandardizedControls,
sections,
@@ -167,7 +168,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
name: 'x_axis_time_format',
@@ -200,7 +201,7 @@ const config: ControlPanelConfig = {
],
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
['y_axis_format'],
[
{

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
getStandardizedControls,
sections,
@@ -109,7 +110,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
@@ -144,7 +145,7 @@ const config: ControlPanelConfig = {
// eslint-disable-next-line react/jsx-key
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
['y_axis_format'],
[
{

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
getStandardizedControls,
sections,
@@ -109,7 +110,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
name: 'x_axis_time_format',
@@ -143,7 +144,7 @@ const config: ControlPanelConfig = {
// eslint-disable-next-line react/jsx-key
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
['y_axis_format'],
[

View File

@@ -21,6 +21,7 @@ import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlPanelsContainerProps,
ControlSubSectionHeader,
D3_TIME_FORMAT_DOCS,
getStandardizedControls,
sections,
@@ -161,7 +162,7 @@ const config: ControlPanelConfig = {
},
],
...legendSection,
[<div className="section-header">{t('X Axis')}</div>],
[<ControlSubSectionHeader>{t('X Axis')}</ControlSubSectionHeader>],
[
{
name: 'x_axis_time_format',
@@ -194,7 +195,7 @@ const config: ControlPanelConfig = {
],
...richTooltipSection,
// eslint-disable-next-line react/jsx-key
[<div className="section-header">{t('Y Axis')}</div>],
[<ControlSubSectionHeader>{t('Y Axis')}</ControlSubSectionHeader>],
['y_axis_format'],
[
{

View File

@@ -22,7 +22,6 @@ import {
AnnotationLayer,
AxisType,
CategoricalColorNamespace,
CurrencyFormatter,
ensureIsArray,
GenericDataType,
getMetricLabel,
@@ -33,13 +32,11 @@ import {
isFormulaAnnotationLayer,
isIntervalAnnotationLayer,
isPhysicalColumn,
isSavedMetric,
isTimeseriesAnnotationLayer,
NumberFormats,
QueryFormMetric,
t,
TimeseriesChartDataResponseResult,
ValueFormatter,
buildCustomFormatters,
getCustomFormatter,
} from '@superset-ui/core';
import {
extractExtraMetrics,
@@ -97,36 +94,7 @@ import {
TIMEGRAIN_TO_TIMESTAMP,
} from '../constants';
import { getDefaultTooltip } from '../utils/tooltip';
import {
buildCustomFormatters,
getCustomFormatter,
} from '../utils/valueFormatter';
const getYAxisFormatter = (
metrics: QueryFormMetric[],
forcePercentFormatter: boolean,
customFormatters: Record<string, ValueFormatter>,
yAxisFormat: string = NumberFormats.SMART_NUMBER,
) => {
if (forcePercentFormatter) {
return getNumberFormatter(',.0%');
}
const metricsArray = ensureIsArray(metrics);
if (
metricsArray.every(isSavedMetric) &&
metricsArray
.map(metric => customFormatters[metric])
.every(
(formatter, _, formatters) =>
formatter instanceof CurrencyFormatter &&
(formatter as CurrencyFormatter)?.currency?.symbol ===
(formatters[0] as CurrencyFormatter)?.currency?.symbol,
)
) {
return customFormatters[metricsArray[0]];
}
return getNumberFormatter(yAxisFormat);
};
import { getYAxisFormatter } from '../utils/getYAxisFormatter';
export default function transformProps(
chartProps: EchartsTimeseriesChartProps,
@@ -144,6 +112,9 @@ export default function transformProps(
inContextMenu,
emitCrossFilters,
} = chartProps;
let focusedSeries: string | null = null;
const {
verboseMap = {},
columnFormats = {},
@@ -556,11 +527,9 @@ export default function transformProps(
: getCustomFormatter(customFormatters, metrics, formatterKey) ??
defaultFormatter,
});
if (!legendState || legendState[key]) {
rows.push(`<span style="font-weight: 700">${content}</span>`);
} else {
rows.push(`<span style="opacity: 0.7">${content}</span>`);
}
const contentStyle =
key === focusedSeries ? 'font-weight: 700' : 'opacity: 0.7';
rows.push(`<span style="${contentStyle}">${content}</span>`);
});
if (stack) {
rows.reverse();
@@ -607,6 +576,10 @@ export default function transformProps(
: [],
};
const onFocusedSeries = (seriesName: string | null) => {
focusedSeries = seriesName;
};
return {
echartOptions,
emitCrossFilters,
@@ -621,6 +594,7 @@ export default function transformProps(
legendData,
onContextMenu,
onLegendStateChanged,
onFocusedSeries,
xValueFormatter: tooltipFormatter,
xAxis: {
label: xAxisLabel,

View File

@@ -107,4 +107,5 @@ export type TimeseriesChartTransformedProps =
label: string;
type: AxisType;
};
onFocusedSeries: (series: string | null) => void;
};

View File

@@ -20,6 +20,7 @@ import React from 'react';
import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
getStandardizedControls,
sections,
sharedControls,
@@ -108,7 +109,7 @@ const controlPanel: ControlPanelConfig = {
label: t('Chart options'),
expanded: true,
controlSetRows: [
[<div className="section-header">{t('Layout')}</div>],
[<ControlSubSectionHeader>{t('Layout')}</ControlSubSectionHeader>],
[
{
name: 'layout',

View File

@@ -20,6 +20,7 @@ import React from 'react';
import { t } from '@superset-ui/core';
import {
ControlPanelConfig,
ControlSubSectionHeader,
D3_FORMAT_DOCS,
D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT,
D3_FORMAT_OPTIONS,
@@ -62,7 +63,7 @@ const config: ControlPanelConfig = {
expanded: true,
controlSetRows: [
['color_scheme'],
[<div className="section-header">{t('Labels')}</div>],
[<ControlSubSectionHeader>{t('Labels')}</ControlSubSectionHeader>],
[
{
name: 'show_labels',

View File

@@ -24,6 +24,7 @@ import {
getTimeFormatter,
NumberFormats,
ValueFormatter,
getValueFormatter,
} from '@superset-ui/core';
import { TreemapSeriesNodeItemOption } from 'echarts/types/src/chart/treemap/TreemapSeries';
import { EChartsCoreOption, TreemapSeriesOption } from 'echarts';
@@ -48,7 +49,6 @@ import { OpacityEnum } from '../constants';
import { getDefaultTooltip } from '../utils/tooltip';
import { Refs } from '../types';
import { treeBuilder, TreeNode } from '../utils/treeBuilder';
import { getValueFormatter } from '../utils/valueFormatter';
export function formatLabel({
params,

View File

@@ -22,6 +22,7 @@ import {
ControlPanelsContainerProps,
ControlSetItem,
ControlSetRow,
ControlSubSectionHeader,
DEFAULT_SORT_SERIES_DATA,
SORT_SERIES_CHOICES,
sharedControls,
@@ -96,7 +97,7 @@ const legendOrientationControl: ControlSetItem = {
};
export const legendSection: ControlSetRow[] = [
[<div className="section-header">{t('Legend')}</div>],
[<ControlSubSectionHeader>{t('Legend')}</ControlSubSectionHeader>],
[showLegendControl],
[legendTypeControl],
[legendOrientationControl],
@@ -210,7 +211,7 @@ const tooltipSortByMetricControl: ControlSetItem = {
};
export const richTooltipSection: ControlSetRow[] = [
[<div className="section-header">{t('Tooltip')}</div>],
[<ControlSubSectionHeader>{t('Tooltip')}</ControlSubSectionHeader>],
[richTooltipControl],
[tooltipSortByMetricControl],
[tooltipTimeFormatControl],
@@ -243,7 +244,7 @@ const sortSeriesAscending: ControlSetItem = {
};
export const seriesOrderSection: ControlSetRow[] = [
[<div className="section-header">{t('Series Order')}</div>],
[<ControlSubSectionHeader>{t('Series Order')}</ControlSubSectionHeader>],
[sortSeriesType],
[sortSeriesAscending],
];

View File

@@ -0,0 +1,54 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {
CurrencyFormatter,
ensureIsArray,
getNumberFormatter,
isSavedMetric,
NumberFormats,
QueryFormMetric,
ValueFormatter,
} from '@superset-ui/core';
export const getYAxisFormatter = (
metrics: QueryFormMetric[],
forcePercentFormatter: boolean,
customFormatters: Record<string, ValueFormatter>,
yAxisFormat: string = NumberFormats.SMART_NUMBER,
) => {
if (forcePercentFormatter) {
return getNumberFormatter(',.0%');
}
const metricsArray = ensureIsArray(metrics);
if (
metricsArray.every(isSavedMetric) &&
metricsArray
.map(metric => customFormatters[metric])
.every(
(formatter, _, formatters) =>
formatter instanceof CurrencyFormatter &&
(formatter as CurrencyFormatter)?.currency?.symbol ===
(formatters[0] as CurrencyFormatter)?.currency?.symbol,
)
) {
return customFormatters[metricsArray[0]];
}
return getNumberFormatter(yAxisFormat);
};

View File

@@ -518,7 +518,7 @@ export function getAxisType(dataType?: GenericDataType): AxisType {
export function getOverMaxHiddenFormatter(
config: {
max?: number;
formatter?: NumberFormatter;
formatter?: ValueFormatter;
} = {},
) {
const { max, formatter } = config;

View File

@@ -30,7 +30,10 @@ import {
import { PivotTableQueryFormData } from '../types';
export default function buildQuery(formData: PivotTableQueryFormData) {
const { groupbyColumns = [], groupbyRows = [] } = formData;
const { groupbyColumns = [], groupbyRows = [], extra_form_data } = formData;
const time_grain_sqla =
extra_form_data?.time_grain_sqla || formData.time_grain_sqla;
// TODO: add deduping of AdhocColumns
const columns = Array.from(
new Set([
@@ -40,7 +43,7 @@ export default function buildQuery(formData: PivotTableQueryFormData) {
).map(col => {
if (
isPhysicalColumn(col) &&
formData.time_grain_sqla &&
time_grain_sqla &&
hasGenericChartAxes &&
/* Charts created before `GENERIC_CHART_AXES` is enabled have a different
* form data, with `granularity_sqla` set instead.
@@ -49,7 +52,7 @@ export default function buildQuery(formData: PivotTableQueryFormData) {
formData.granularity_sqla === col)
) {
return {
timeGrain: formData.time_grain_sqla,
timeGrain: time_grain_sqla,
columnType: 'BASE_AXIS',
sqlExpression: col,
label: col,

View File

@@ -22,65 +22,99 @@ import * as supersetCoreModule from '@superset-ui/core';
import buildQuery from '../../src/plugin/buildQuery';
import { PivotTableQueryFormData } from '../../src/types';
describe('PivotTableChart buildQuery', () => {
const formData: PivotTableQueryFormData = {
groupbyRows: ['row1', 'row2'],
groupbyColumns: ['col1', 'col2'],
metrics: ['metric1', 'metric2'],
tableRenderer: 'Table With Subtotal',
colOrder: 'key_a_to_z',
rowOrder: 'key_a_to_z',
aggregateFunction: 'Sum',
transposePivot: true,
rowSubtotalPosition: true,
colSubtotalPosition: true,
colTotals: true,
rowTotals: true,
valueFormat: 'SMART_NUMBER',
datasource: '5__table',
viz_type: 'my_chart',
width: 800,
height: 600,
combineMetric: false,
verboseMap: {},
columnFormats: {},
currencyFormats: {},
metricColorFormatters: [],
dateFormatters: {},
setDataMask: () => {},
legacy_order_by: 'count',
order_desc: true,
margin: 0,
};
const formData: PivotTableQueryFormData = {
groupbyRows: ['row1', 'row2'],
groupbyColumns: ['col1', 'col2'],
metrics: ['metric1', 'metric2'],
tableRenderer: 'Table With Subtotal',
colOrder: 'key_a_to_z',
rowOrder: 'key_a_to_z',
aggregateFunction: 'Sum',
transposePivot: true,
rowSubtotalPosition: true,
colSubtotalPosition: true,
colTotals: true,
rowTotals: true,
valueFormat: 'SMART_NUMBER',
datasource: '5__table',
viz_type: 'my_chart',
width: 800,
height: 600,
combineMetric: false,
verboseMap: {},
columnFormats: {},
currencyFormats: {},
metricColorFormatters: [],
dateFormatters: {},
setDataMask: () => {},
legacy_order_by: 'count',
order_desc: true,
margin: 0,
time_grain_sqla: TimeGranularity.MONTH,
temporal_columns_lookup: { col1: true },
};
it('should build groupby with series in form data', () => {
const queryContext = buildQuery(formData);
const [query] = queryContext.queries;
expect(query.columns).toEqual(['col1', 'col2', 'row1', 'row2']);
test('should build groupby with series in form data', () => {
const queryContext = buildQuery(formData);
const [query] = queryContext.queries;
expect(query.columns).toEqual(['col1', 'col2', 'row1', 'row2']);
});
test('should work with old charts after GENERIC_CHART_AXES is enabled', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const modifiedFormData = {
...formData,
time_grain_sqla: TimeGranularity.MONTH,
granularity_sqla: 'col1',
};
const queryContext = buildQuery(modifiedFormData);
const [query] = queryContext.queries;
expect(query.columns).toEqual([
{
timeGrain: 'P1M',
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
},
'col2',
'row1',
'row2',
]);
});
it('should work with old charts after GENERIC_CHART_AXES is enabled', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const modifiedFormData = {
...formData,
time_grain_sqla: TimeGranularity.MONTH,
granularity_sqla: 'col1',
};
const queryContext = buildQuery(modifiedFormData);
const [query] = queryContext.queries;
expect(query.columns).toEqual([
{
timeGrain: 'P1M',
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
},
'col2',
'row1',
'row2',
]);
test('should prefer extra_form_data.time_grain_sqla over formData.time_grain_sqla', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const modifiedFormData = {
...formData,
extra_form_data: { time_grain_sqla: TimeGranularity.QUARTER },
};
const queryContext = buildQuery(modifiedFormData);
const [query] = queryContext.queries;
expect(query.columns?.[0]).toEqual({
timeGrain: TimeGranularity.QUARTER,
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
});
});
test('should fallback to formData.time_grain_sqla if extra_form_data.time_grain_sqla is not set', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const queryContext = buildQuery(formData);
const [query] = queryContext.queries;
expect(query.columns?.[0]).toEqual({
timeGrain: formData.time_grain_sqla,
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
});
});

View File

@@ -52,10 +52,15 @@ const buildQuery: BuildQuery<TableChartFormData> = (
formData: TableChartFormData,
options,
) => {
const { percent_metrics: percentMetrics, order_desc: orderDesc = false } =
formData;
const {
percent_metrics: percentMetrics,
order_desc: orderDesc = false,
extra_form_data,
} = formData;
const queryMode = getQueryMode(formData);
const sortByMetric = ensureIsArray(formData.timeseries_limit_metric)[0];
const time_grain_sqla =
extra_form_data?.time_grain_sqla || formData.time_grain_sqla;
let formDataCopy = formData;
// never include time in raw records mode
if (queryMode === QueryMode.raw) {
@@ -102,12 +107,12 @@ const buildQuery: BuildQuery<TableChartFormData> = (
columns = columns.map(col => {
if (
isPhysicalColumn(col) &&
formData.time_grain_sqla &&
time_grain_sqla &&
hasGenericChartAxes &&
formData?.temporal_columns_lookup?.[col]
) {
return {
timeGrain: formData.time_grain_sqla,
timeGrain: time_grain_sqla,
columnType: 'BASE_AXIS',
sqlExpression: col,
label: col,

View File

@@ -16,7 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
import { QueryMode } from '@superset-ui/core';
import { QueryMode, TimeGranularity } from '@superset-ui/core';
import * as supersetCoreModule from '@superset-ui/core';
import buildQuery from '../src/buildQuery';
import { TableChartFormData } from '../src/types';
@@ -81,5 +82,44 @@ describe('plugin-chart-table', () => {
expect(query.columns).toEqual(['rawcol']);
expect(query.post_processing).toEqual([]);
});
it('should prefer extra_form_data.time_grain_sqla over formData.time_grain_sqla', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const query = buildQuery({
...basicFormData,
groupby: ['col1'],
query_mode: QueryMode.aggregate,
time_grain_sqla: TimeGranularity.MONTH,
extra_form_data: { time_grain_sqla: TimeGranularity.QUARTER },
temporal_columns_lookup: { col1: true },
}).queries[0];
expect(query.columns?.[0]).toEqual({
timeGrain: TimeGranularity.QUARTER,
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
});
});
it('should fallback to formData.time_grain_sqla if extra_form_data.time_grain_sqla is not set', () => {
Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', {
value: true,
});
const query = buildQuery({
...basicFormData,
time_grain_sqla: TimeGranularity.MONTH,
groupby: ['col1'],
query_mode: QueryMode.aggregate,
temporal_columns_lookup: { col1: true },
}).queries[0];
expect(query.columns?.[0]).toEqual({
timeGrain: TimeGranularity.MONTH,
columnType: 'BASE_AXIS',
sqlExpression: 'col1',
label: 'col1',
expressionType: 'SQL',
});
});
});
});

View File

@@ -39,7 +39,7 @@ type Options = Omit<RenderOptions, 'queries'> & {
store?: Store;
};
const createStore = (initialState: object = {}, reducers: object = {}) =>
export const createStore = (initialState: object = {}, reducers: object = {}) =>
configureStore({
preloadedState: initialState,
reducer: {

View File

@@ -26,7 +26,7 @@ import { initFeatureFlags, isFeatureEnabled } from 'src/featureFlags';
import { setupStore } from 'src/views/store';
import setupExtensions from 'src/setup/setupExtensions';
import getBootstrapData from 'src/utils/getBootstrapData';
import { api } from 'src/hooks/apiResources/queryApi';
import { tableApiUtil } from 'src/hooks/apiResources/tables';
import getInitialState from './reducers/getInitialState';
import { reducers } from './reducers/index';
import App from './components/App';
@@ -127,14 +127,14 @@ initialState.sqlLab.tables.forEach(
({ name: table, schema, dbId, persistData }) => {
if (dbId && schema && table && persistData?.columns) {
store.dispatch(
api.util.upsertQueryData(
tableApiUtil.upsertQueryData(
'tableMetadata',
{ dbId, schema, table },
persistData,
),
);
store.dispatch(
api.util.upsertQueryData(
tableApiUtil.upsertQueryData(
'tableExtendedMetadata',
{ dbId, schema, table },
{},

View File

@@ -16,32 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
import React, { useState, useEffect, useRef, useMemo } from 'react';
import React, { useState, useEffect, useRef } from 'react';
import { useDispatch } from 'react-redux';
import { css, styled, usePrevious, t } from '@superset-ui/core';
import { css, styled, usePrevious } from '@superset-ui/core';
import { areArraysShallowEqual } from 'src/reduxUtils';
import sqlKeywords from 'src/SqlLab/utils/sqlKeywords';
import {
queryEditorSetSelectedText,
addTable,
addDangerToast,
} from 'src/SqlLab/actions/sqlLab';
import {
SCHEMA_AUTOCOMPLETE_SCORE,
TABLE_AUTOCOMPLETE_SCORE,
COLUMN_AUTOCOMPLETE_SCORE,
SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
} from 'src/SqlLab/constants';
import {
Editor,
AceCompleterKeyword,
FullSQLEditor as AceEditor,
} from 'src/components/AsyncAceEditor';
import { queryEditorSetSelectedText } from 'src/SqlLab/actions/sqlLab';
import { FullSQLEditor as AceEditor } from 'src/components/AsyncAceEditor';
import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor';
import { useSchemas, useTables } from 'src/hooks/apiResources';
import { useDatabaseFunctionsQuery } from 'src/hooks/apiResources/databaseFunctions';
import { useAnnotations } from './useAnnotations';
import { useKeywords } from './useKeywords';
type HotKey = {
key: string;
@@ -55,7 +38,6 @@ type AceEditorWrapperProps = {
onBlur: (sql: string) => void;
onChange: (sql: string) => void;
queryEditorId: string;
extendedTables?: Array<{ name: string; columns: any[] }>;
height: string;
hotkeys: HotKey[];
};
@@ -85,12 +67,10 @@ const AceEditorWrapper = ({
onBlur = () => {},
onChange = () => {},
queryEditorId,
extendedTables = [],
height,
hotkeys,
}: AceEditorWrapperProps) => {
const dispatch = useDispatch();
const queryEditor = useQueryEditor(queryEditorId, [
'id',
'dbId',
@@ -98,48 +78,10 @@ const AceEditorWrapper = ({
'schema',
'templateParams',
]);
const { data: schemaOptions } = useSchemas({
...(autocomplete && { dbId: queryEditor.dbId }),
});
const { data: tableData } = useTables({
...(autocomplete && {
dbId: queryEditor.dbId,
schema: queryEditor.schema,
}),
});
const { data: functionNames, isError } = useDatabaseFunctionsQuery(
{ dbId: queryEditor.dbId },
{ skip: !autocomplete || !queryEditor.dbId },
);
useEffect(() => {
if (isError) {
dispatch(
addDangerToast(t('An error occurred while fetching function names.')),
);
}
}, [dispatch, isError]);
const currentSql = queryEditor.sql ?? '';
// Loading schema, table and column names as auto-completable words
const { schemas, schemaWords } = useMemo(
() => ({
schemas: schemaOptions ?? [],
schemaWords: (schemaOptions ?? []).map(s => ({
name: s.label,
value: s.value,
score: SCHEMA_AUTOCOMPLETE_SCORE,
meta: 'schema',
})),
}),
[schemaOptions],
);
const tables = tableData?.options ?? [];
const [sql, setSql] = useState(currentSql);
const [words, setWords] = useState<AceCompleterKeyword[]>([]);
// The editor changeSelection is called multiple times in a row,
// faster than React reconciliation process, so the selected text
@@ -150,24 +92,10 @@ const AceEditorWrapper = ({
useEffect(() => {
// Making sure no text is selected from previous mount
dispatch(queryEditorSetSelectedText(queryEditor, null));
setAutoCompleter();
}, []);
const prevTables = usePrevious(tables) ?? [];
const prevSchemas = usePrevious(schemas) ?? [];
const prevExtendedTables = usePrevious(extendedTables) ?? [];
const prevSql = usePrevious(currentSql);
useEffect(() => {
if (
!areArraysShallowEqual(tables, prevTables) ||
!areArraysShallowEqual(schemas, prevSchemas) ||
!areArraysShallowEqual(extendedTables, prevExtendedTables)
) {
setAutoCompleter();
}
}, [tables, schemas, extendedTables]);
useEffect(() => {
if (currentSql !== prevSql) {
setSql(currentSql);
@@ -220,69 +148,6 @@ const AceEditorWrapper = ({
onChange(text);
};
function setAutoCompleter() {
const columns = {};
const tableWords = tables.map(t => {
const tableName = t.value;
const extendedTable = extendedTables.find(et => et.name === tableName);
const cols = extendedTable?.columns || [];
cols.forEach(col => {
columns[col.name] = null; // using an object as a unique set
});
return {
name: t.label,
value: tableName,
score: TABLE_AUTOCOMPLETE_SCORE,
meta: 'table',
};
});
const columnWords = Object.keys(columns).map(col => ({
name: col,
value: col,
score: COLUMN_AUTOCOMPLETE_SCORE,
meta: 'column',
}));
const functionWords = (functionNames ?? []).map(func => ({
name: func,
value: func,
score: SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
meta: 'function',
}));
const completer = {
insertMatch: (editor: Editor, data: any) => {
if (data.meta === 'table') {
dispatch(addTable(queryEditor, data.value, queryEditor.schema));
}
let { caption } = data;
if (data.meta === 'table' && caption.includes(' ')) {
caption = `"${caption}"`;
}
// executing https://github.com/thlorenz/brace/blob/3a00c5d59777f9d826841178e1eb36694177f5e6/ext/language_tools.js#L1448
editor.completer.insertMatch(
`${caption}${['function', 'schema'].includes(data.meta) ? '' : ' '}`,
);
},
};
const words = schemaWords
.concat(tableWords)
.concat(columnWords)
.concat(functionWords)
.concat(sqlKeywords)
.map(word => ({
...word,
completer,
}));
setWords(words);
}
const { data: annotations } = useAnnotations({
dbId: queryEditor.dbId,
schema: queryEditor.schema,
@@ -290,9 +155,18 @@ const AceEditorWrapper = ({
templateParams: queryEditor.templateParams,
});
const keywords = useKeywords(
{
queryEditorId,
dbId: queryEditor.dbId,
schema: queryEditor.schema,
},
!autocomplete,
);
return (
<StyledAceEditor
keywords={words}
keywords={keywords}
onLoad={onEditorLoad}
onBlur={onBlurSql}
height={height}

View File

@@ -0,0 +1,269 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import fetchMock from 'fetch-mock';
import { act, renderHook } from '@testing-library/react-hooks';
import {
createWrapper,
defaultStore as store,
createStore,
} from 'spec/helpers/testing-library';
import { api } from 'src/hooks/apiResources/queryApi';
import { schemaApiUtil } from 'src/hooks/apiResources/schemas';
import { tableApiUtil } from 'src/hooks/apiResources/tables';
import { addTable } from 'src/SqlLab/actions/sqlLab';
import { initialState } from 'src/SqlLab/fixtures';
import { reducers } from 'src/SqlLab/reducers';
import {
SCHEMA_AUTOCOMPLETE_SCORE,
TABLE_AUTOCOMPLETE_SCORE,
COLUMN_AUTOCOMPLETE_SCORE,
SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
} from 'src/SqlLab/constants';
import { useKeywords } from './useKeywords';
const fakeSchemaApiResult = ['schema1', 'schema2'];
const fakeTableApiResult = {
count: 2,
result: [
{
id: 1,
value: 'fake api result1',
label: 'fake api label1',
type: 'table',
},
{
id: 2,
value: 'fake api result2',
label: 'fake api label2',
type: 'table',
},
],
};
const fakeFunctionNamesApiResult = {
function_names: ['abs', 'avg', 'sum'],
};
const expectDbId = 1;
const expectSchema = 'schema1';
beforeEach(() => {
act(() => {
store.dispatch(
schemaApiUtil.upsertQueryData(
'schemas',
{
dbId: expectDbId,
forceRefresh: false,
},
fakeSchemaApiResult.map(value => ({
value,
label: value,
title: value,
})),
),
);
store.dispatch(
tableApiUtil.upsertQueryData(
'tables',
{ dbId: expectDbId, schema: expectSchema },
{
options: fakeTableApiResult.result,
hasMore: false,
},
),
);
});
});
afterEach(() => {
fetchMock.reset();
act(() => {
store.dispatch(api.util.resetApiState());
});
});
test('returns keywords including fetched function_names data', async () => {
const dbFunctionNamesApiRoute = `glob:*/api/v1/database/${expectDbId}/function_names/`;
fetchMock.get(dbFunctionNamesApiRoute, fakeFunctionNamesApiResult);
const { result, waitFor } = renderHook(
() =>
useKeywords({
queryEditorId: 'testqueryid',
dbId: expectDbId,
schema: expectSchema,
}),
{
wrapper: createWrapper({
useRedux: true,
store,
}),
},
);
await waitFor(() =>
expect(fetchMock.calls(dbFunctionNamesApiRoute).length).toBe(1),
);
fakeSchemaApiResult.forEach(schema => {
expect(result.current).toContainEqual(
expect.objectContaining({
name: schema,
score: SCHEMA_AUTOCOMPLETE_SCORE,
meta: 'schema',
}),
);
});
fakeTableApiResult.result.forEach(({ value }) => {
expect(result.current).toContainEqual(
expect.objectContaining({
value,
score: TABLE_AUTOCOMPLETE_SCORE,
meta: 'table',
}),
);
});
fakeFunctionNamesApiResult.function_names.forEach(func => {
expect(result.current).toContainEqual(
expect.objectContaining({
name: func,
value: func,
meta: 'function',
score: SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
}),
);
});
});
test('skip fetching if autocomplete skipped', () => {
const { result } = renderHook(
() =>
useKeywords(
{
queryEditorId: 'testqueryid',
dbId: expectDbId,
schema: expectSchema,
},
true,
),
{
wrapper: createWrapper({
useRedux: true,
store,
}),
},
);
expect(result.current).toEqual([]);
expect(fetchMock.calls()).toEqual([]);
});
test('returns column keywords among selected tables', async () => {
const expectTable = 'table1';
const expectColumn = 'column1';
const expectQueryEditorId = 'testqueryid';
const unexpectedColumn = 'column2';
const unexpectedTable = 'table2';
const dbFunctionNamesApiRoute = `glob:*/api/v1/database/${expectDbId}/function_names/`;
const storeWithSqlLab = createStore(initialState, reducers);
fetchMock.get(dbFunctionNamesApiRoute, fakeFunctionNamesApiResult);
act(() => {
storeWithSqlLab.dispatch(
tableApiUtil.upsertQueryData(
'tableMetadata',
{ dbId: expectDbId, schema: expectSchema, table: expectTable },
{
name: expectTable,
columns: [
{
name: expectColumn,
type: 'VARCHAR',
},
],
},
),
);
storeWithSqlLab.dispatch(
tableApiUtil.upsertQueryData(
'tableMetadata',
{ dbId: expectDbId, schema: expectSchema, table: unexpectedTable },
{
name: unexpectedTable,
columns: [
{
name: unexpectedColumn,
type: 'VARCHAR',
},
],
},
),
);
storeWithSqlLab.dispatch(
addTable({ id: expectQueryEditorId }, expectTable, expectSchema),
);
});
const { result, waitFor } = renderHook(
() =>
useKeywords({
queryEditorId: expectQueryEditorId,
dbId: expectDbId,
schema: expectSchema,
}),
{
wrapper: createWrapper({
useRedux: true,
store: storeWithSqlLab,
}),
},
);
await waitFor(() =>
expect(result.current).toContainEqual(
expect.objectContaining({
name: expectColumn,
value: expectColumn,
score: COLUMN_AUTOCOMPLETE_SCORE,
meta: 'column',
}),
),
);
expect(result.current).not.toContainEqual(
expect.objectContaining({
name: unexpectedColumn,
}),
);
act(() => {
storeWithSqlLab.dispatch(
addTable({ id: expectQueryEditorId }, unexpectedTable, expectSchema),
);
});
await waitFor(() =>
expect(result.current).toContainEqual(
expect.objectContaining({
name: unexpectedColumn,
}),
),
);
});

View File

@@ -0,0 +1,208 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { useEffect, useMemo, useRef } from 'react';
import { useSelector, useDispatch, shallowEqual, useStore } from 'react-redux';
import { t } from '@superset-ui/core';
import { Editor } from 'src/components/AsyncAceEditor';
import sqlKeywords from 'src/SqlLab/utils/sqlKeywords';
import { addTable, addDangerToast } from 'src/SqlLab/actions/sqlLab';
import {
SCHEMA_AUTOCOMPLETE_SCORE,
TABLE_AUTOCOMPLETE_SCORE,
COLUMN_AUTOCOMPLETE_SCORE,
SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
} from 'src/SqlLab/constants';
import {
schemaEndpoints,
tableEndpoints,
skipToken,
} from 'src/hooks/apiResources';
import { api } from 'src/hooks/apiResources/queryApi';
import { useDatabaseFunctionsQuery } from 'src/hooks/apiResources/databaseFunctions';
import useEffectEvent from 'src/hooks/useEffectEvent';
import { SqlLabRootState } from 'src/SqlLab/types';
type Params = {
queryEditorId: string | number;
dbId?: string | number;
schema?: string;
};
const EMPTY_LIST = [] as typeof sqlKeywords;
const { useQueryState: useSchemasQueryState } = schemaEndpoints.schemas;
const { useQueryState: useTablesQueryState } = tableEndpoints.tables;
export function useKeywords(
{ queryEditorId, dbId, schema }: Params,
skip = false,
) {
const dispatch = useDispatch();
const hasFetchedKeywords = useRef(false);
// skipFetch is used to prevent re-evaluating memoized keywords
// due to updated api results by skip flag
const skipFetch = hasFetchedKeywords && skip;
const { data: schemaOptions } = useSchemasQueryState(
{
dbId,
forceRefresh: false,
},
{ skip: skipFetch || !dbId },
);
const { data: tableData } = useTablesQueryState(
{
dbId,
schema,
forceRefresh: false,
},
{ skip: skipFetch || !dbId || !schema },
);
const { data: functionNames, isError } = useDatabaseFunctionsQuery(
{ dbId },
{ skip: skipFetch || !dbId },
);
useEffect(() => {
if (isError) {
dispatch(
addDangerToast(t('An error occurred while fetching function names.')),
);
}
}, [dispatch, isError]);
const tablesForColumnMetadata = useSelector<SqlLabRootState, string[]>(
({ sqlLab }) =>
skip
? []
: (sqlLab?.tables ?? [])
.filter(table => table.queryEditorId === queryEditorId)
.map(table => table.name),
shallowEqual,
);
const store = useStore();
const apiState = store.getState()[api.reducerPath];
const allColumns = useMemo(() => {
const columns = new Set<string>();
tablesForColumnMetadata.forEach(table => {
tableEndpoints.tableMetadata
.select(
dbId && schema
? {
dbId,
schema,
table,
}
: skipToken,
)({
[api.reducerPath]: apiState,
})
.data?.columns?.forEach(({ name }) => {
columns.add(name);
});
});
return [...columns];
}, [dbId, schema, apiState, tablesForColumnMetadata]);
const insertMatch = useEffectEvent((editor: Editor, data: any) => {
if (data.meta === 'table') {
dispatch(addTable({ id: queryEditorId, dbId }, data.value, schema));
}
let { caption } = data;
if (data.meta === 'table' && caption.includes(' ')) {
caption = `"${caption}"`;
}
// executing https://github.com/thlorenz/brace/blob/3a00c5d59777f9d826841178e1eb36694177f5e6/ext/language_tools.js#L1448
editor.completer.insertMatch(
`${caption}${['function', 'schema'].includes(data.meta) ? '' : ' '}`,
);
});
const schemaKeywords = useMemo(
() =>
(schemaOptions ?? []).map(s => ({
name: s.label,
value: s.value,
score: SCHEMA_AUTOCOMPLETE_SCORE,
meta: 'schema',
completer: {
insertMatch,
},
})),
[schemaOptions, insertMatch],
);
const tableKeywords = useMemo(
() =>
(tableData?.options ?? []).map(({ value, label }) => ({
name: label,
value,
score: TABLE_AUTOCOMPLETE_SCORE,
meta: 'table',
completer: {
insertMatch,
},
})),
[tableData?.options, insertMatch],
);
const columnKeywords = useMemo(
() =>
allColumns.map(col => ({
name: col,
value: col,
score: COLUMN_AUTOCOMPLETE_SCORE,
meta: 'column',
})),
[allColumns],
);
const functionKeywords = useMemo(
() =>
(functionNames ?? []).map(func => ({
name: func,
value: func,
score: SQL_FUNCTIONS_AUTOCOMPLETE_SCORE,
meta: 'function',
completer: {
insertMatch,
},
})),
[functionNames, insertMatch],
);
const keywords = useMemo(
() =>
columnKeywords
.concat(schemaKeywords)
.concat(tableKeywords)
.concat(functionKeywords)
.concat(sqlKeywords),
[schemaKeywords, tableKeywords, columnKeywords, functionKeywords],
);
hasFetchedKeywords.current = !skip;
return skip ? EMPTY_LIST : keywords;
}

View File

@@ -25,6 +25,10 @@ import App from 'src/SqlLab/components/App';
import sqlLabReducer from 'src/SqlLab/reducers/index';
import { LOCALSTORAGE_MAX_USAGE_KB } from 'src/SqlLab/constants';
import { LOG_EVENT } from 'src/logger/actions';
import {
LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE,
LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE,
} from 'src/logger/LogUtils';
jest.mock('src/SqlLab/components/TabbedSqlEditors', () => () => (
<div data-test="mock-tabbed-sql-editors" />
@@ -54,7 +58,7 @@ describe('SqlLab App', () => {
expect(getByTestId('mock-tabbed-sql-editors')).toBeInTheDocument();
});
it('logs current usage warning', async () => {
it('logs current usage warning', () => {
const localStorageUsageInKilobytes = LOCALSTORAGE_MAX_USAGE_KB + 10;
const storeExceedLocalStorage = mockStore(
sqlLabReducer(
@@ -73,6 +77,38 @@ describe('SqlLab App', () => {
expect(storeExceedLocalStorage.getActions()).toContainEqual(
expect.objectContaining({
type: LOG_EVENT,
payload: expect.objectContaining({
eventName: LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE,
}),
}),
);
});
it('logs current local storage usage', () => {
const localStorageUsageInKilobytes = LOCALSTORAGE_MAX_USAGE_KB - 10;
const storeExceedLocalStorage = mockStore(
sqlLabReducer(
{
localStorageUsageInKilobytes,
},
{},
),
);
const { rerender } = render(<App />, {
useRedux: true,
store: storeExceedLocalStorage,
});
rerender(<App updated />);
expect(storeExceedLocalStorage.getActions()).toContainEqual(
expect.objectContaining({
type: LOG_EVENT,
payload: expect.objectContaining({
eventName: LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE,
eventData: expect.objectContaining({
current_usage: localStorageUsageInKilobytes,
}),
}),
}),
);
});

View File

@@ -30,7 +30,10 @@ import {
} from 'src/SqlLab/constants';
import * as Actions from 'src/SqlLab/actions/sqlLab';
import { logEvent } from 'src/logger/actions';
import { LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE } from 'src/logger/LogUtils';
import {
LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE,
LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE,
} from 'src/logger/LogUtils';
import TabbedSqlEditors from '../TabbedSqlEditors';
import QueryAutoRefresh from '../QueryAutoRefresh';
@@ -121,15 +124,28 @@ class App extends React.PureComponent {
}
componentDidUpdate() {
const { localStorageUsageInKilobytes, actions, queries } = this.props;
const queryCount = queries?.lenghth || 0;
if (
this.props.localStorageUsageInKilobytes >=
localStorageUsageInKilobytes >=
LOCALSTORAGE_WARNING_THRESHOLD * LOCALSTORAGE_MAX_USAGE_KB
) {
this.showLocalStorageUsageWarning(
this.props.localStorageUsageInKilobytes,
this.props.queries?.lenghth || 0,
localStorageUsageInKilobytes,
queryCount,
);
}
if (localStorageUsageInKilobytes > 0 && !this.hasLoggedLocalStorageUsage) {
const eventData = {
current_usage: localStorageUsageInKilobytes,
query_count: queryCount,
};
actions.logEvent(
LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE,
eventData,
);
this.hasLoggedLocalStorageUsage = true;
}
}
componentWillUnmount() {

View File

@@ -81,6 +81,12 @@ export interface ResultSetProps {
defaultQueryLimit: number;
}
const ResultContainer = styled.div`
display: flex;
flex-direction: column;
row-gap: ${({ theme }) => theme.gridUnit * 2}px;
`;
const ResultlessStyles = styled.div`
position: relative;
min-height: ${({ theme }) => theme.gridUnit * 25}px;
@@ -110,7 +116,6 @@ const ReturnedRows = styled.div`
const ResultSetControls = styled.div`
display: flex;
justify-content: space-between;
padding: ${({ theme }) => 2 * theme.gridUnit}px 0;
`;
const ResultSetButtons = styled.div`
@@ -494,7 +499,7 @@ const ResultSet = ({
? results.expanded_columns.map(col => col.column_name)
: [];
return (
<>
<ResultContainer>
{renderControls()}
{renderRowsReturned()}
{sql}
@@ -505,7 +510,7 @@ const ResultSet = ({
filterText={searchText}
expandedColumns={expandedColumns}
/>
</>
</ResultContainer>
);
}
if (data && data.length === 0) {

View File

@@ -71,8 +71,6 @@ const StyledPane = styled.div<StyledPaneProps>`
}
}
.ant-tabs-tabpane {
display: flex;
flex-direction: column;
.scrollable {
overflow-y: auto;
}

View File

@@ -47,6 +47,9 @@ jest.mock('src/components/AsyncAceEditor', () => ({
}));
jest.mock('src/SqlLab/components/SqlEditorLeftBar', () => jest.fn());
fetchMock.get('glob:*/api/v1/database/*/function_names/', {
function_names: [],
});
fetchMock.get('glob:*/api/v1/database/*', { result: [] });
fetchMock.get('glob:*/api/v1/database/*/tables/*', { options: [] });
fetchMock.post('glob:*/sqllab/execute/*', { result: [] });

View File

@@ -332,6 +332,66 @@ const SqlEditor = ({
}
},
},
{
name: 'runQuery3',
key: 'ctrl+shift+enter',
descr: t('Run current query'),
func: editor => {
if (!editor.getValue().trim()) {
return;
}
const session = editor.getSession();
const cursorPosition = editor.getCursorPosition();
const totalLine = session.getLength();
let end = editor.find(';', {
backwards: false,
skipCurrent: true,
start: cursorPosition,
})?.end;
if (!end || end.row < cursorPosition.row) {
end = {
row: totalLine + 1,
column: 0,
};
}
let start = editor.find(';', {
backwards: true,
skipCurrent: true,
start: cursorPosition,
})?.end;
let currentLine = editor.find(';', {
backwards: true,
skipCurrent: true,
start: cursorPosition,
})?.end?.row;
if (
!currentLine ||
currentLine > cursorPosition.row ||
(currentLine === cursorPosition.row &&
start?.column > cursorPosition.column)
) {
currentLine = 0;
}
let content =
currentLine === start?.row
? session.getLine(currentLine).slice(start.column).trim()
: session.getLine(currentLine).trim();
while (!content && currentLine < totalLine) {
currentLine += 1;
content = session.getLine(currentLine).trim();
}
if (currentLine !== start?.row) {
start = { row: currentLine, column: 0 };
}
editor.selection.setRange({
start: start ?? { row: 0, column: 0 },
end,
});
startQuery();
editor.selection.clearSelection();
editor.moveCursorToPosition(cursorPosition);
},
},
{
name: 'newTab',
key: userOS === 'Windows' ? 'ctrl+q' : 'ctrl+t',
@@ -666,7 +726,6 @@ const SqlEditor = ({
onBlur={setQueryEditorAndSaveSql}
onChange={onSqlChanged}
queryEditorId={queryEditor.id}
extendedTables={tables}
height={`${aceEditorHeight}px`}
hotkeys={hotkeys}
/>

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import React, { forwardRef } from 'react';
import React, { forwardRef, useEffect } from 'react';
import {
Editor as OrigEditor,
IEditSession,
@@ -28,6 +28,7 @@ import { acequire } from 'ace-builds/src-noconflict/ace';
import AsyncEsmComponent, {
PlaceholderProps,
} from 'src/components/AsyncEsmComponent';
import useEffectEvent from 'src/hooks/useEffectEvent';
export interface AceCompleterKeywordData {
name: string;
@@ -127,27 +128,37 @@ export default function AsyncAceEditor(
},
ref,
) {
if (keywords) {
const langTools = acequire('ace/ext/language_tools');
const completer = {
getCompletions: (
editor: AceEditor,
session: IEditSession,
pos: Position,
prefix: string,
callback: (error: null, wordList: object[]) => void,
) => {
// If the prefix starts with a number, don't try to autocomplete
if (!Number.isNaN(parseInt(prefix, 10))) {
return;
}
if ((session.getMode() as TextMode).$id === `ace/mode/${mode}`) {
callback(null, keywords);
}
},
};
langTools.setCompleters([completer]);
}
const langTools = acequire('ace/ext/language_tools');
const setCompleters = useEffectEvent(
(keywords: AceCompleterKeyword[]) => {
const completer = {
getCompletions: (
editor: AceEditor,
session: IEditSession,
pos: Position,
prefix: string,
callback: (error: null, wordList: object[]) => void,
) => {
// If the prefix starts with a number, don't try to autocomplete
if (!Number.isNaN(parseInt(prefix, 10))) {
return;
}
if (
(session.getMode() as TextMode).$id === `ace/mode/${mode}`
) {
callback(null, keywords);
}
},
};
langTools.setCompleters([completer]);
},
);
useEffect(() => {
if (keywords) {
setCompleters(keywords);
}
}, [keywords, setCompleters]);
return (
<ReactAceEditor
ref={ref}

View File

@@ -77,7 +77,6 @@ const StyledFilterableTable = styled.div`
${({ theme }) => `
height: 100%;
overflow: hidden;
margin-top: ${theme.gridUnit * 2}px;
.ant-table-cell {
font-weight: ${theme.typography.weights.bold};

View File

@@ -470,7 +470,7 @@ describe('ListView', () => {
});
await act(async () => {
wrapper2.find('[aria-label="Sort"]').first().props().onChange({
wrapper2.find('[aria-label="Sort"]').first().props().onSelect({
desc: false,
id: 'something',
label: 'Alphabetical',

View File

@@ -522,7 +522,7 @@ test('changes the selected item in single mode', async () => {
label: firstOption.label,
value: firstOption.value,
}),
firstOption,
expect.objectContaining(firstOption),
);
expect(await findSelectValue()).toHaveTextContent(firstOption.label);
userEvent.click(await findSelectOption(secondOption.label));
@@ -531,7 +531,7 @@ test('changes the selected item in single mode', async () => {
label: secondOption.label,
value: secondOption.value,
}),
secondOption,
expect.objectContaining(secondOption),
);
expect(await findSelectValue()).toHaveTextContent(secondOption.label);
});
@@ -804,6 +804,25 @@ test('Renders only an overflow tag if dropdown is open in oneLine mode', async (
expect(withinSelector.getByText('+ 2 ...')).toBeVisible();
});
test('does not fire onChange when searching but no selection', async () => {
const onChange = jest.fn();
render(
<div role="main">
<AsyncSelect
{...defaultProps}
onChange={onChange}
mode="multiple"
allowNewOptions
/>
</div>,
);
await open();
await type('Joh');
userEvent.click(await findSelectOption('John'));
userEvent.click(screen.getByRole('main'));
expect(onChange).toHaveBeenCalledTimes(1);
});
/*
TODO: Add tests that require scroll interaction. Needs further investigation.
- Fetches more data when scrolling and more data is available

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