mirror of
https://github.com/apache/superset.git
synced 2026-06-26 18:09:21 +00:00
Compare commits
72 Commits
chore/ci/s
...
3.0.0rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
571f33536e | ||
|
|
651c13b934 | ||
|
|
af8c813cb6 | ||
|
|
ad1a425269 | ||
|
|
84488b7c5e | ||
|
|
d86ae30958 | ||
|
|
d92f9a73d2 | ||
|
|
98ec90938d | ||
|
|
25d42538d1 | ||
|
|
a85da81815 | ||
|
|
d95241df9d | ||
|
|
d336431559 | ||
|
|
e3d8ecb478 | ||
|
|
a066ebbb5e | ||
|
|
6947983d5f | ||
|
|
00516c2088 | ||
|
|
2e978bba14 | ||
|
|
a8f808f7a8 | ||
|
|
dd002a8cf6 | ||
|
|
157cc621c5 | ||
|
|
299dbb7012 | ||
|
|
2e222865bf | ||
|
|
d87724a6e3 | ||
|
|
6281f50bab | ||
|
|
06258a06ed | ||
|
|
a7221c6dd4 | ||
|
|
66792beb8b | ||
|
|
aa5f0b1019 | ||
|
|
cc7983cd4a | ||
|
|
1625fe4104 | ||
|
|
91919569ba | ||
|
|
befe41df14 | ||
|
|
a3138f2bbe | ||
|
|
82311edaf6 | ||
|
|
757741942d | ||
|
|
65822cab13 | ||
|
|
4390968dd7 | ||
|
|
2e913492c9 | ||
|
|
c94bee47aa | ||
|
|
c6ecbc81ac | ||
|
|
60385ed059 | ||
|
|
b0c90cb261 | ||
|
|
49605e763c | ||
|
|
7243332082 | ||
|
|
1872a651da | ||
|
|
f60ab456f3 | ||
|
|
96cf6406f1 | ||
|
|
71eff954ba | ||
|
|
79a42c6509 | ||
|
|
d8bf955515 | ||
|
|
a2fdc84073 | ||
|
|
5a4996c226 | ||
|
|
359bbe26f7 | ||
|
|
27dcc3e025 | ||
|
|
d6296c1ad1 | ||
|
|
846d3c03aa | ||
|
|
2bd9ca3c94 | ||
|
|
a15e809c0f | ||
|
|
b81ee82d3c | ||
|
|
6b366a2cff | ||
|
|
9a96d8cf8b | ||
|
|
744cf2ec29 | ||
|
|
26909bf517 | ||
|
|
967ca0470b | ||
|
|
0976b5e51e | ||
|
|
67008f2c35 | ||
|
|
af2689d501 | ||
|
|
a5f3cfc726 | ||
|
|
9ab61c1103 | ||
|
|
6de6f47728 | ||
|
|
1b41653d3b | ||
|
|
eb42fa7a2e |
38
.github/SECURITY.md
vendored
Normal file
38
.github/SECURITY.md
vendored
Normal 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/)
|
||||
8
.github/workflows/ecs-task-definition.json
vendored
8
.github/workflows/ecs-task-definition.json
vendored
@@ -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": [],
|
||||
|
||||
758
CHANGELOG.md
758
CHANGELOG.md
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:|
|
||||
|
||||
17
UPDATING.md
17
UPDATING.md
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
2
docs/.gitignore
vendored
@@ -18,3 +18,5 @@
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
docs/.zshrc
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
4
docs/docs/security/_category_.json
Normal file
4
docs/docs/security/_category_.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"label": "Security",
|
||||
"position": 10
|
||||
}
|
||||
27
docs/docs/security/cves.mdx
Normal file
27
docs/docs/security/cves.mdx
Normal 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 |
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Security
|
||||
title: Role based Access
|
||||
hide_title: true
|
||||
sidebar_position: 10
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
### Roles
|
||||
@@ -68,7 +68,7 @@ const config = {
|
||||
from: '/usertutorial.html',
|
||||
},
|
||||
{
|
||||
to: '/docs/security',
|
||||
to: '/docs/security/',
|
||||
from: '/security.html',
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
|
||||
|
||||
# superset
|
||||
|
||||

|
||||

|
||||
|
||||
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 | `{}` | |
|
||||
|
||||
@@ -176,7 +176,7 @@ configMountPath: "/app/pythonpath"
|
||||
extraConfigMountPath: "/app/configs"
|
||||
|
||||
image:
|
||||
repository: apache/superset
|
||||
repository: apachesuperset.docker.scarf.sh/apache/superset
|
||||
tag: ""
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
16
setup.py
16
setup.py
@@ -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": [
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
|
||||
12
superset-frontend/package-lock.json
generated
12
superset-frontend/package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -44,6 +44,8 @@ const TypeIconWrapper = styled.div`
|
||||
&& svg {
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
`};
|
||||
`;
|
||||
|
||||
@@ -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;
|
||||
@@ -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';
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -19,3 +19,4 @@
|
||||
|
||||
export { default as CurrencyFormatter } from './CurrencyFormatter';
|
||||
export * from './CurrencyFormatter';
|
||||
export * from './utils';
|
||||
|
||||
@@ -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,
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
@@ -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 ] ] ] } }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -150,4 +150,5 @@ export type EchartsMixedTimeseriesChartTransformedProps =
|
||||
label: string;
|
||||
type: AxisType;
|
||||
};
|
||||
onFocusedSeries: (series: string | null) => void;
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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'],
|
||||
[
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
|
||||
@@ -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'),
|
||||
],
|
||||
},
|
||||
|
||||
@@ -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'],
|
||||
[
|
||||
{
|
||||
|
||||
@@ -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'],
|
||||
[
|
||||
{
|
||||
|
||||
@@ -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'],
|
||||
[
|
||||
|
||||
@@ -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'],
|
||||
[
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -107,4 +107,5 @@ export type TimeseriesChartTransformedProps =
|
||||
label: string;
|
||||
type: AxisType;
|
||||
};
|
||||
onFocusedSeries: (series: string | null) => void;
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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],
|
||||
];
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
@@ -518,7 +518,7 @@ export function getAxisType(dataType?: GenericDataType): AxisType {
|
||||
export function getOverMaxHiddenFormatter(
|
||||
config: {
|
||||
max?: number;
|
||||
formatter?: NumberFormatter;
|
||||
formatter?: ValueFormatter;
|
||||
} = {},
|
||||
) {
|
||||
const { max, formatter } = config;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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 },
|
||||
{},
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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,
|
||||
}),
|
||||
),
|
||||
);
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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,
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -71,8 +71,6 @@ const StyledPane = styled.div<StyledPaneProps>`
|
||||
}
|
||||
}
|
||||
.ant-tabs-tabpane {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
.scrollable {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
@@ -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: [] });
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user