Compare commits

...

32 Commits

Author SHA1 Message Date
Ville Brofeldt
c4e6baef3b add rc3 changelog entries 2021-01-15 17:33:28 +02:00
Amit Miran
b652995b56 chore: rename docker image in build_docker_image.sh, docker-compose.yml and helm values.yaml (#12337) 2021-01-15 17:27:18 +02:00
Ahmed Adel
739ab14136 feat(db-engine): Add support for Apache Solr (#12403)
* [db engine] Add support for Apache Solr

* Fixing typo
2021-01-15 15:12:29 +02:00
Michael S. Molina
a1f53fb645 Fix list filters vertical alignment (#12497) 2021-01-15 13:47:07 +02:00
Kamil Gabryjelski
52b581f922 fix: Select options overflowing Save chart modal on Explore view (#12522)
* Fix select options overflowing modal

* fix unit test

Co-authored-by: Ville Brofeldt <ville.v.brofeldt@gmail.com>
2021-01-15 13:32:12 +02:00
Xiang Fu
5f2de1df71 Fixing Pinot queries for time granularities: WEEKS/MONTHS/QUARTERS/YEARS (#12536) 2021-01-15 11:32:30 +02:00
Jesse Yang
603ab75a62 fix(explore): Add Time section back to FilterBox (#12537) 2021-01-15 11:04:18 +02:00
Jesse Yang
027e2075f5 fix(explore): time table control panel (#12532) 2021-01-15 11:04:05 +02:00
Beto Dealmeida
5791f23e73 fix: lowercase all columns in examples (#12530) 2021-01-15 11:03:38 +02:00
Daniel Vaz Gaspar
cf69f29144 ci: remove refs/tags from docker tags on a release (#12518)
* ci: remove refs/tags from docker tags on a release

* wider head
2021-01-15 10:45:15 +02:00
Daniel Vaz Gaspar
72977fc71f fix: impose dataset ownership check on old API (#12491)
* fix: impose dataset ownership check on old API

* update UPDATING.md

* partially protect the old MVC also

* prevent metric and column add and update
2021-01-15 10:44:51 +02:00
Ville Brofeldt
46fd85a141 update changelog with rc2 entries 2021-01-14 09:50:32 +02:00
Beto Dealmeida
78e4b02305 fix: import ZIP files that have been modified (#12425)
* fix: import ZIP files that have been modified

* Add unit test
2021-01-13 20:39:50 +02:00
Beto Dealmeida
696c9773bd fix (SQL Lab): disappearing results on tab switch (#12472)
* fix (SQL Lab): disappearing results on tab switch

* Remove state

* Fix test
2021-01-13 19:10:31 +02:00
Yongjie Zhao
4f35234f3e fix(timepicker): make pyparsing thread safe (#12489)
* fix: make pyparsing thread safe

* remove parenthesis for decorator
2021-01-13 19:06:08 +02:00
Jesse Yang
b213c1cb1f fix(dashboard): use datasource id from slice metadata (#12483) 2021-01-13 19:05:50 +02:00
Grace Guo
b3e7ef2da6 fix: do not show vertical scrollbar for charts in dashboard (#12478)
* fix: do not show vertical scrollbar for charts in dashboard

* Proper fix for #11419

Co-authored-by: Jesse Yang <jesse.yang@airbnb.com>
2021-01-13 19:05:31 +02:00
Evan Rusackas
ea54e0a7cf chore: bump superset-ui deckgl plugin (#12466) 2021-01-13 19:05:12 +02:00
Phillip Kelley-Dotson
3a553c9ef2 bump superset-ui packages for rolling window change (#12426) 2021-01-13 19:04:51 +02:00
Kasia Kucharczyk
34da995dd9 fix(dashboard): artefacts shown while drag and dropping deck.gl charts (#12418)
* [12181] Fix artifacts while drag and dropping deck.gl charts.

* Run prettier
2021-01-13 19:04:36 +02:00
Kamil Gabryjelski
288f6bb88c feat: Resizable dataset and controls panels on Explore view (#12411)
* Implement resizable panels on explore view

* Optimize chart rendering while resizing

* Make dataset column narrower

Co-authored-by: Evan Rusackas <evan@preset.io>
2021-01-13 19:03:00 +02:00
Michael S. Molina
507302d639 Fixes control panel fields styling (#12236) (#12326) 2021-01-13 19:02:55 +02:00
Yongjie Zhao
35c15b8b3a refactor: from superset.utils.core break down date_parser (#12408) 2021-01-13 19:00:54 +02:00
Ville Brofeldt
90915db60d fix(native-filters): incorrect queriesData state (#12409) 2021-01-12 14:34:01 +02:00
Agata Stawarz
d940cae8d5 fix: Refresh Interval Modal dropdown (#12406) 2021-01-12 14:33:18 +02:00
Junlin Chen
a83653735f chore: change Datasource to Dataset in Explore ui (#12402)
* chore(explore):change dataset to datasource in ui

* modal

* Add space

* Changing it back🤦🏾‍♀️

* Chargeback
2021-01-12 14:32:58 +02:00
Yongjie Zhao
e3b65f2519 feat(explore): add tooltip to timepicker label (#12401) 2021-01-12 14:32:36 +02:00
Jesse Yang
f2afee9832 chore: upgrade eslint, babel, and prettier (#12393) 2021-01-12 14:32:14 +02:00
Junlin Chen
bd6525fdf5 chore: Fix typo “Rest” to “Reset” (#12392) 2021-01-12 14:31:57 +02:00
Geido
dc203c174c chore: Show datasets when search input is empty (#12391) 2021-01-12 14:31:26 +02:00
Yongjie Zhao
6d59351462 fix(explore): long metric name display (#12387)
* fix(explore): long metric name display

* add tooltip to control
2021-01-12 14:30:57 +02:00
Daniel Gaspar
c837c1c739 release: bump to 1.0.0 and CHANGELOG 2021-01-09 23:37:45 +02:00
177 changed files with 6774 additions and 3168 deletions

View File

@@ -18,17 +18,17 @@
set -eo pipefail
SHA=$(git rev-parse HEAD)
REPO_NAME="apache/incubator-superset"
REPO_NAME="apache/superset"
if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then
REFSPEC=$(echo "${GITHUB_HEAD_REF}" | sed 's/[^a-zA-Z0-9]/-/' | head -c 20)
REFSPEC=$(echo "${GITHUB_HEAD_REF}" | sed 's/[^a-zA-Z0-9]/-/' | head -c 40)
PR_NUM=$(echo "${GITHUB_REF}" | sed 's:refs/pull/::' | sed 's:/merge::')
LATEST_TAG="pr-${PR_NUM}"
elif [[ "${GITHUB_EVENT_NAME}" == "release" ]]; then
REFSPEC="${GITHUB_REF}"
REFSPEC=$(echo "${GITHUB_REF}" | sed 's:refs/tags/::' | head -c 40)
LATEST_TAG="${REFSPEC}"
else
REFSPEC=$(echo "${GITHUB_REF}" | sed 's:refs/heads/::' | sed 's/[^a-zA-Z0-9]/-/' | head -c 20)
REFSPEC=$(echo "${GITHUB_REF}" | sed 's:refs/heads/::' | sed 's/[^a-zA-Z0-9]/-/' | head -c 40)
LATEST_TAG="${REFSPEC}"
fi

View File

@@ -18,6 +18,674 @@ under the License.
-->
## Change Log
### 1.0.0 (Fri Jan 15 05:11:56 2021 -0800)
- [#12337](https://github.com/apache/superset/pull/12337) chore: rename docker image from incubator-superset to superset (#1337) (@amitmiran137)
- [#12403](https://github.com/apache/superset/pull/12403) feat(db-engine): Add support for Apache Solr (#12403) (@aadel)
- [#12497](https://github.com/apache/superset/pull/12497) Fix list filters vertical alignment (#12497) (@michael-s-molina)
- [#12522](https://github.com/apache/superset/pull/12522) fix: Select options overflowing Save chart modal on Explore view (#12522) (@kgabryje)
- [#12536](https://github.com/apache/superset/pull/12536) Fixing Pinot queries for time granularities: WEEKS/MONTHS/QUARTERS/YEARS (#12536) (@fx19880617)
- [#12537](https://github.com/apache/superset/pull/12537) fix(explore): Add Time section back to FilterBox (#12537) (@ktmud)
- [#12532](https://github.com/apache/superset/pull/12532) fix(explore): time table control panel (#12532) (@ktmud)
- [#12530](https://github.com/apache/superset/pull/12530) fix: lowercase all columns in examples (#12530) (@betodealmeida)
- [#12518](https://github.com/apache/superset/pull/12518) ci: remove refs/tags from docker tags on a release (#12518) (@dpgaspar)
- [#12491](https://github.com/apache/superset/pull/12491) fix: impose dataset ownership check on old API (#12491) (@dpgaspar)
- [#12425](https://github.com/apache/superset/pull/12425) fix: import ZIP files that have been modified (#12425) (@betodealmeida)
- [#12472](https://github.com/apache/superset/pull/12472) fix (SQL Lab): disappearing results on tab switch (#12472) (@betodealmeida)
- [#12489](https://github.com/apache/superset/pull/12489) fix(timepicker): make pyparsing thread safe (#12489) (@zhaoyongjie)
- [#12483](https://github.com/apache/superset/pull/12483) fix(dashboard): use datasource id from slice metadata (#12483) (@ktmud)
- [#12478](https://github.com/apache/superset/pull/12478) fix: do not show vertical scrollbar for charts in dashboard (#12478) (@graceguo-supercat)
- [#12466](https://github.com/apache/superset/pull/12466) chore: bump superset-ui deckgl plugin (#12466) (@rusackas)
- [#12426](https://github.com/apache/superset/pull/12426) bump superset-ui packages for rolling window change (#12426) (@pkdotson)
- [#12418](https://github.com/apache/superset/pull/12418) fix(dashboard): artefacts shown while drag and dropping deck.gl charts (#12418) (@kkucharc)
- [#12411](https://github.com/apache/superset/pull/12411) feat: Resizable dataset and controls panels on Explore view (#12411) (@kgabryje)
- [#12326](https://github.com/apache/superset/pull/12326) Fixes control panel fields styling (#12236) (#12326) (@michael-s-molina)
- [#12408](https://github.com/apache/superset/pull/12408) refactor: from superset.utils.core break down date_parser (#12408) (@zhaoyongjie)
- [#12409](https://github.com/apache/superset/pull/12409) fix(native-filters): incorrect queriesData state (#12409) (@villebro)
- [#12406](https://github.com/apache/superset/pull/12406) fix: Refresh Interval Modal dropdown (#12406) (@agatapst)
- [#12402](https://github.com/apache/superset/pull/12402) chore: change Datasource to Dataset in Explore ui (#12402) (@junlincc)
- [#12401](https://github.com/apache/superset/pull/12401) feat(explore): add tooltip to timepicker label (#12401) (@zhaoyongjie)
- [#12393](https://github.com/apache/superset/pull/12393) chore: upgrade eslint, babel, and prettier (#12393) (@ktmud)
- [#12392](https://github.com/apache/superset/pull/12392) chore: Fix typo “Rest” to “Reset” (#12392) (@junlincc)
- [#12391](https://github.com/apache/superset/pull/12391) chore: Show datasets when search input is empty (#12391) (@geido)
- [#12387](https://github.com/apache/superset/pull/12387) fix(explore): long metric name display (#12387) (@zhaoyongjie)
- [#12359](https://github.com/apache/superset/pull/12359) fix: explore replace wrong standalone slice url (#12359) (@duynguyenhoang)
- [#12390](https://github.com/apache/superset/pull/12390) Closes #12389 (#12390) (@geido)
- [#12383](https://github.com/apache/superset/pull/12383) fix: Data tables styling issues on Explore view (#12383) (@kgabryje)
- [#12385](https://github.com/apache/superset/pull/12385) Fix new metric popover showing previous popover's title (#12385) (@kgabryje)
- [#12381](https://github.com/apache/superset/pull/12381) fix(explore): adhoc metric label and control value not consistent (#12381) (@zhaoyongjie)
- [#12382](https://github.com/apache/superset/pull/12382) fix(explore): clear custom label if removed (#12382) (@villebro)
- [#12377](https://github.com/apache/superset/pull/12377) Fix filter popover under data table (#12377) (@kgabryje)
- [#12378](https://github.com/apache/superset/pull/12378) Update samples table when datasource changes (#12378) (@kgabryje)
- [#12368](https://github.com/apache/superset/pull/12368) fix: datasets populating after user creation (#12368) (@hughhhh)
- [#12365](https://github.com/apache/superset/pull/12365) chore: make datasource search input sticky (#12365) (@pkdotson)
- [#12362](https://github.com/apache/superset/pull/12362) fix: Fix chart resizing when using split view (#12362) (@kgabryje)
- [#12096](https://github.com/apache/superset/pull/12096) ci(docker): fix release published event checkout tag-sha (#12096) (@dpgaspar)
- [#12082](https://github.com/apache/superset/pull/12082) test: rename column names for birth_names dataset (#12082) (@ktmud)
- [#12351](https://github.com/apache/superset/pull/12351) fix(load examples): load examples creating unnecessary main database (#12351) (@dpgaspar)
- [#12361](https://github.com/apache/superset/pull/12361) Fix running query on every change in chart controls (#12361) (@kgabryje)
- [#12357](https://github.com/apache/superset/pull/12357) fix: Fix dataset condition to allow query for datasets in sqllab (#12357) (@hughhhh)
- [#12257](https://github.com/apache/superset/pull/12257) perf: Optimize performance of Results and Samples tables on Explore (#12257) (@kgabryje)
- [#12353](https://github.com/apache/superset/pull/12353) Fix CSS injection order (#12265) (#12353) (@michael-s-molina)
- [#12352](https://github.com/apache/superset/pull/12352) chore(dashboard): Add ErrorBoudary for AdhocFilter components (#12352) (@nikolagigic)
- [#12350](https://github.com/apache/superset/pull/12350) fix(explore): improve filter translation (#12350) (@villebro)
- [#12306](https://github.com/apache/superset/pull/12306) fix: Set width to pseudoelement to wrap filter box (#12306) (@maloun96)
- [#12318](https://github.com/apache/superset/pull/12318) fix: south pane scrolling issues (#12318) (@eschutho)
- [#12349](https://github.com/apache/superset/pull/12349) chore: bumping nvd3 plugin (and thus, nvd3-fork) (#12349) (@rusackas)
- [#12307](https://github.com/apache/superset/pull/12307) refactor: test connection raises only command exceptions (#12307) (@dpgaspar)
- [#12154](https://github.com/apache/superset/pull/12154) feat: move filters from superset-ui to incubator (#12154) (@simchaNielsen)
- [#12347](https://github.com/apache/superset/pull/12347) window.location > history.push (#12347) (@rusackas)
- [#12315](https://github.com/apache/superset/pull/12315) feat: provide support for an overridable template to be included in every view (#12315) (@nytai)
- [#12344](https://github.com/apache/superset/pull/12344) remove datataset from title (#12344) (@pkdotson)
- [#12338](https://github.com/apache/superset/pull/12338) feat: new COVID vaccination dashboard (#12338) (@betodealmeida)
- [#12335](https://github.com/apache/superset/pull/12335) chore: change order of tab on explore data panel (#12335) (@lilykuang)
- [#12320](https://github.com/apache/superset/pull/12320) fix: append orphan charts (#12320) (@betodealmeida)
- [#12067](https://github.com/apache/superset/pull/12067) feat: SQL Toolbar (#12067) (@hughhhh)
- [#12334](https://github.com/apache/superset/pull/12334) Reduce z-index (#12334) (@geido)
- [#12330](https://github.com/apache/superset/pull/12330) Fix menuPortal dropdown z-index (#12330) (@geido)
- [#12311](https://github.com/apache/superset/pull/12311) fix(alert/report): add/edit modal can't be saved (#12311) (@lilykuang)
- [#12327](https://github.com/apache/superset/pull/12327) Fix select overlap by aggregate button (#12312) (#12327) (@michael-s-molina)
- [#12090](https://github.com/apache/superset/pull/12090) build: try to speed up Github workflows (#12090) (@ktmud)
- [#12313](https://github.com/apache/superset/pull/12313) build: improve webpack configs for npm link (#12313) (@ktmud)
- [#12210](https://github.com/apache/superset/pull/12210) feat: Custom color schemes support (#12210) (@amitmiran137)
- [#12282](https://github.com/apache/superset/pull/12282) chore: improve styles for collapsed Native Filter sidebar (#12282) (@agatapst)
- [#12305](https://github.com/apache/superset/pull/12305) fix(explore): metrics caret not expanding in datasource panel (#12305) (@geido)
- [#12319](https://github.com/apache/superset/pull/12319) fix: update search in datasource panel to use matchSorter (#12319) (@pkdotson)
- [#12019](https://github.com/apache/superset/pull/12019) build(deps): bump ini in /superset-frontend/cypress-base (#12019) (@dependabot[bot])
- [#12284](https://github.com/apache/superset/pull/12284) docs: remove (some) references to incubating/incubation (#12284) (@nytai)
- [#12022](https://github.com/apache/superset/pull/12022) docs: Added release notes and associated media for 0.38 (#12022) (@garden-of-delete)
- [#12021](https://github.com/apache/superset/pull/12021) build(deps): bump ini from 1.3.5 to 1.3.8 in /superset-frontend (#12021) (@dependabot[bot])
- [#12308](https://github.com/apache/superset/pull/12308) fix(explore): refine previous calendar range (#12308) (@zhaoyongjie)
- [#12261](https://github.com/apache/superset/pull/12261) add related field filter to queries/user (#12261) (@riahk)
- [#12300](https://github.com/apache/superset/pull/12300) fix(explore): timepicker show human readable string in pill (#12300) (@zhaoyongjie)
- [#12278](https://github.com/apache/superset/pull/12278) fix(explore): bugs in Custom SQL editor in filter popover (#12278) (@kgabryje)
- [#12289](https://github.com/apache/superset/pull/12289) chore: remove harmless incubator refs (#12289) (@amitmiran137)
- [#12274](https://github.com/apache/superset/pull/12274) fix(database): OpenAPI spec for test_connection (#12274) (@dpgaspar)
- [#12277](https://github.com/apache/superset/pull/12277) fix(reports): don't log user errors and state change has errors (#12277) (@dpgaspar)
- [#12291](https://github.com/apache/superset/pull/12291) build: ignore github actions from dependabot (#12291) (@ktmud)
- [#12295](https://github.com/apache/superset/pull/12295) fix null check for condition threshold to allow 0 values (#12295) (@riahk)
- [#12280](https://github.com/apache/superset/pull/12280) Bump superset-ui deps (#12280) (@kgabryje)
- [#12221](https://github.com/apache/superset/pull/12221) fix: Fixed width for dataset panel (#12221) (@kgabryje)
- [#12239](https://github.com/apache/superset/pull/12239) chore(home): add ErrorBoundary to Charts section (#12239) (@maxamante)
- [#12292](https://github.com/apache/superset/pull/12292) fix: load example data into correct DB (#12292) (@betodealmeida)
- [#12297](https://github.com/apache/superset/pull/12297) Cypress: ignore unrelated ResizeObserver client errors (#12297) (@robdiciuccio)
- [#12253](https://github.com/apache/superset/pull/12253) test: fix flaky Python unit tests (#12253) (@kstrz)
- [#12213](https://github.com/apache/superset/pull/12213) Fix tests errors and warnings - iteration 1 (#12212) (#12213) (@michael-s-molina)
- [#12258](https://github.com/apache/superset/pull/12258) fix: Issue #12004 timegrain not visibile (#12258) (@geido)
- [#12250](https://github.com/apache/superset/pull/12250) fix: Show Data panel on resize (#12250) (@maloun96)
- [#12153](https://github.com/apache/superset/pull/12153) fix: Add visibility to box for viewing menu items (#12153) (@maloun96)
- [#12290](https://github.com/apache/superset/pull/12290) build: remove parallelization for E2E tests (#12290) (@ktmud)
- [#12288](https://github.com/apache/superset/pull/12288) fix: Add min-height for loading indicator to show up (#12288) (@geido)
- [#12192](https://github.com/apache/superset/pull/12192) build(deps-dev): bump storybook-addon-paddings in /superset-frontend (#12192) (@dependabot[bot])
- [#12205](https://github.com/apache/superset/pull/12205) fix: SaveDatasetModal save state on back button (#12205) (@hughhhh)
- [#12251](https://github.com/apache/superset/pull/12251) docs: fix build status badge to github actions (#12251) (@dpgaspar)
- [#12215](https://github.com/apache/superset/pull/12215) fix : Style caret for profile page (#12215) (@maloun96)
- [#12211](https://github.com/apache/superset/pull/12211) Set datasource panel open by default (#12211) (@kgabryje)
- [#12242](https://github.com/apache/superset/pull/12242) fix(explore): bump superset-ui to 0.16.3 and fix DeckGL bug (#12242) (@villebro)
- [#12208](https://github.com/apache/superset/pull/12208) feat(explore): Time picker enhancement follow up (#12208) (@zhaoyongjie)
- [#11960](https://github.com/apache/superset/pull/11960) fix: Altered button crashing and title not updating on Explore view (#11960) (@kgabryje)
- [#12217](https://github.com/apache/superset/pull/12217) Remove uppercase for tab names (#12217) (@maloun96)
- [#12248](https://github.com/apache/superset/pull/12248) build(deps): bump node-fetch in /.github/actions/file-changes-action (#12248) (@dependabot[bot])
- [#12246](https://github.com/apache/superset/pull/12246) build(deps): bump @actions/core in /.github/actions/file-changes-action (#12246) (@dependabot[bot])
- [#12050](https://github.com/apache/superset/pull/12050) docs(api): Script to generate API docs (openapi.json) (#12050) (@robdiciuccio)
- [#12165](https://github.com/apache/superset/pull/12165) fix: Change Datasource styling fixes (#12165) (@hughhhh)
- [#12188](https://github.com/apache/superset/pull/12188) fix: CTAS on multiple statements (#12188) (@betodealmeida)
- [#12183](https://github.com/apache/superset/pull/12183) feat(report): add/edit modal improvements (#12183) (@lilykuang)
- [#12241](https://github.com/apache/superset/pull/12241) build: inline external Github Actions to unblock CI (#12241) (@ktmud)
- [#11999](https://github.com/apache/superset/pull/11999) Refetch samples only when filters change (#11999) (@kgabryje)
- [#12184](https://github.com/apache/superset/pull/12184) feat: Implement drag & drop for metrics and filters labels (#12184) (@kgabryje)
- [#12196](https://github.com/apache/superset/pull/12196) fix(reports): make name unique between alerts and reports (#12196) (@dpgaspar)
- [#12193](https://github.com/apache/superset/pull/12193) fix: align submenu items (#12193) (@maloun96)
- [#12163](https://github.com/apache/superset/pull/12163) feat: add new dashboard with FCC data (#12163) (@betodealmeida)
- [#12189](https://github.com/apache/superset/pull/12189) fix(alerts/reports): ensure correct type is sent to api (#12189) (@nytai)
- [#12097](https://github.com/apache/superset/pull/12097) docs: update UPDATING.md with security simplification info (#12097) (@dpgaspar)
- [#12174](https://github.com/apache/superset/pull/12174) fix(reports): notification without standalone link back to superset (#12174) (@dpgaspar)
- [#12191](https://github.com/apache/superset/pull/12191) updated SQLAlchemy=1.3.21 is incompatible in setup.py file. (#12191) (@jagamts1)
- [#12179](https://github.com/apache/superset/pull/12179) fix(chart): rendering standalone chart and errors (#12179) (@agatapst)
- [#12158](https://github.com/apache/superset/pull/12158) chore: Add Loading icon to Filter Bar (#12158) (@agatapst)
- [#12091](https://github.com/apache/superset/pull/12091) refactor: remove queryFields in QueryObject and update chart control configs (#12091) (@ktmud)
- [#12187](https://github.com/apache/superset/pull/12187) fix: SQL Lab vertical space (#12187) (@betodealmeida)
- [#12166](https://github.com/apache/superset/pull/12166) fix: append ID to filename when exporting chart (#12166) (@betodealmeida)
- [#12185](https://github.com/apache/superset/pull/12185) fix: remove uniqueness for MySQL (#12185) (@betodealmeida)
- [#12186](https://github.com/apache/superset/pull/12186) fix: specify VARCHAR size when loading examples (#12186) (@betodealmeida)
- [#12178](https://github.com/apache/superset/pull/12178) fix(explore): save chart not working (#12178) (@villebro)
- [#12075](https://github.com/apache/superset/pull/12075) chore: Change chart_is_fav to chart_is_favorite (#12075) (@nikolagigic)
- [#12168](https://github.com/apache/superset/pull/12168) refactor: Refresh interval typescript (#12168) (@maloun96)
- [#12162](https://github.com/apache/superset/pull/12162) feat: add new dashboard with video game sales (#12162) (@betodealmeida)
- [#12156](https://github.com/apache/superset/pull/12156) Fix Filter Bar scrolling (#12156) (@agatapst)
- [#12010](https://github.com/apache/superset/pull/12010) refactor: Fix anchor-is-valid lint warnings (#12010) (@michael-s-molina)
- [#12151](https://github.com/apache/superset/pull/12151) test(dashboard): fix flaky Cypress test (#12151) (@ktmud)
- [#12159](https://github.com/apache/superset/pull/12159) chore: rename variable for clarity (#12159) (@betodealmeida)
- [#12136](https://github.com/apache/superset/pull/12136) fix: database alpha permissions (#12136) (@dpgaspar)
- [#12121](https://github.com/apache/superset/pull/12121) fix(report): fix last_eval_dttm sort and more tests (#12121) (@dpgaspar)
- [#12157](https://github.com/apache/superset/pull/12157) Fix Reset All filters button (#12157) (@agatapst)
- [#11997](https://github.com/apache/superset/pull/11997) refactor: Explore SaveModal to typescript (#11997) (@maloun96)
- [#12132](https://github.com/apache/superset/pull/12132) fix(report): fix start date format and paginated query (#12132) (@lilykuang)
- [#12146](https://github.com/apache/superset/pull/12146) fix(database): adjust column sizing for list view (#12146) (@nytai)
- [#10288](https://github.com/apache/superset/pull/10288) feat: Dynamically imported viz plugins (#10288) (@suddjian)
- [#12138](https://github.com/apache/superset/pull/12138) feat: Native filters fast-follow (#12138) (@rusackas)
- [#12144](https://github.com/apache/superset/pull/12144) fix(chart): replace viz_type with viz name from registry for list view (#12144) (@nytai)
- [#12145](https://github.com/apache/superset/pull/12145) fix height (#12145) (@pkdotson)
- [#11814](https://github.com/apache/superset/pull/11814) feat(dashboard): Dashboard-Native Filters (#11814) (@suddjian)
- [#12130](https://github.com/apache/superset/pull/12130) feat: estimate query cost in Postgres (#12130) (@betodealmeida)
- [#12113](https://github.com/apache/superset/pull/12113) feat: display suggestions when query has missing parameters (#12113) (@betodealmeida)
- [#12135](https://github.com/apache/superset/pull/12135) fix: make example table name safe (#12135) (@betodealmeida)
- [#12127](https://github.com/apache/superset/pull/12127) fix: remove SIP_34_ALERTS_UI from config (#12127) (@nytai)
- [#12129](https://github.com/apache/superset/pull/12129) fix(explore): overflow issue with metric options (#12129) (@rusackas)
- [#12125](https://github.com/apache/superset/pull/12125) Improves chart save and go button (#12125) (@michael-s-molina)
- [#12060](https://github.com/apache/superset/pull/12060) feat: View all fav charts and dashboards (#12060) (@geido)
- [#12123](https://github.com/apache/superset/pull/12123) feat: Add Saved Metrics tab to metrics popover (#12123) (@kgabryje)
- [#12116](https://github.com/apache/superset/pull/12116) fix: properly render booleans in FilterBox and explore page data preview (#12116) (@ktmud)
- [#12124](https://github.com/apache/superset/pull/12124) fix: fix the flaky FilterBox test re-introduced by #12114 (#12124) (@ktmud)
- [#11880](https://github.com/apache/superset/pull/11880) feat: Support multiple queries per request (#11880) (@simchaNielsen)
- [#12115](https://github.com/apache/superset/pull/12115) fix: remove keys in dashboard export (#12115) (@betodealmeida)
- [#12118](https://github.com/apache/superset/pull/12118) feat(chart-data-api): ignore unknown fields on QueryObject (#12118) (@villebro)
- [#12119](https://github.com/apache/superset/pull/12119) fix: security cleanup annotation and refresh permissions (#12119) (@dpgaspar)
- [#12117](https://github.com/apache/superset/pull/12117) docs(releasing): update release automation and docs for Apache graduation (#12117) (@dpgaspar)
- [#12008](https://github.com/apache/superset/pull/12008) feat(explore-datasource): add new datasource tab to explore view (#12008) (@pkdotson)
- [#12114](https://github.com/apache/superset/pull/12114) fix: FilterBox select lose focus when focused (#12114) (@ktmud)
- [#12045](https://github.com/apache/superset/pull/12045) fix: updates to alert/report modal + more tests (#12045) (@riahk)
- [#12085](https://github.com/apache/superset/pull/12085) feat(alerts/reports): remove SIP_34_UI feature flag (#12085) (@riahk)
- [#12110](https://github.com/apache/superset/pull/12110) fix(alerts/reports): modal submit button, copy changes, select apis (#12110) (@nytai)
- [#12080](https://github.com/apache/superset/pull/12080) feat: initial custom error messages for SQL Lab (#12080) (@betodealmeida)
- [#11418](https://github.com/apache/superset/pull/11418) feat(explore): time picker enhancement (#11418) (@zhaoyongjie)
- [#12081](https://github.com/apache/superset/pull/12081) feat: update alert/report icons and column order (#12081) (@lilykuang)
- [#12095](https://github.com/apache/superset/pull/12095) feat(explore): metrics and filters controls redesign (#12095) (@kgabryje)
- [#12071](https://github.com/apache/superset/pull/12071) feat(alerts/reports): add refresh action (#12071) (@nytai)
- [#11148](https://github.com/apache/superset/pull/11148) chore: add latest tag action (#11148) (@eschutho)
- [#12056](https://github.com/apache/superset/pull/12056) fix(reports): increase crontab size and alert fixes (#12056) (@dpgaspar)
- [#12099](https://github.com/apache/superset/pull/12099) Small typo fix in Athena connection docs (#12099) (@lamielle)
- [#12072](https://github.com/apache/superset/pull/12072) feat(queries): security perm simplification (#12072) (@dpgaspar)
- [#12036](https://github.com/apache/superset/pull/12036) feat(databases): security perm simplification (#12036) (@dpgaspar)
- [#12012](https://github.com/apache/superset/pull/12012) feat(dashboards): security permissions simplification (#12012) (@dpgaspar)
- [#12061](https://github.com/apache/superset/pull/12061) feat(logs): security permissions simplification (#12061) (@kkucharc)
- [#11972](https://github.com/apache/superset/pull/11972) chore: Remove unused CodeModal (#11972) (@maloun96)
- [#12074](https://github.com/apache/superset/pull/12074) Fix typescript error (#12074) (@ktmud)
- [#12088](https://github.com/apache/superset/pull/12088) fix: handle context-dependent feature flags in CLI (#12088) (@betodealmeida)
- [#12086](https://github.com/apache/superset/pull/12086) fix: Fix "View in SQLLab" bug (#12086) (@hughhhh)
- [#12077](https://github.com/apache/superset/pull/12077) feat(alert/report): add 'not null' condition option to modal (#12077) (@riahk)
- [#12078](https://github.com/apache/superset/pull/12078) bumping superset ui to 15.18 and deckgl to 0.3.2 (#12078) (@rusackas)
- [#12079](https://github.com/apache/superset/pull/12079) fix: Python dependencies in #11499 (#12079) (@john-bodley)
- [#12048](https://github.com/apache/superset/pull/12048) reset active tab on open (#12048) (@riahk)
- [#12070](https://github.com/apache/superset/pull/12070) fix: improve import flow UI/UX (#12070) (@betodealmeida)
- [#12053](https://github.com/apache/superset/pull/12053) feat(alerts/reports): delete and bulk delete actions (#12053) (@nytai)
- [#12025](https://github.com/apache/superset/pull/12025) feat: Global nav menus open on hover (#12025) (@rusackas)
- [#12076](https://github.com/apache/superset/pull/12076) Remove e2e pull_request event trigger (#12076) (@robdiciuccio)
- [#11750](https://github.com/apache/superset/pull/11750) build(cypress): Use pull_request_target event to run cypress (#11750) (@robdiciuccio)
- [#11979](https://github.com/apache/superset/pull/11979) fix(dataset): Page blanks on large data load (#11979) (@nikolagigic)
- [#12000](https://github.com/apache/superset/pull/12000) feat(datasets): security perm simplification (#12000) (@dpgaspar)
- [#12014](https://github.com/apache/superset/pull/12014) feat(annotations): security permissions simplification (#12014) (@kkucharc)
- [#12038](https://github.com/apache/superset/pull/12038) fix: Closes #11864 - Duplicate PropertiesModal (#12038) (@geido)
- [#12042](https://github.com/apache/superset/pull/12042) refactor: Migrate react-select to Antd Select in Metrics and Filters popovers (#12042) (@kgabryje)
- [#12049](https://github.com/apache/superset/pull/12049) feat: show missing parameters in query (#12049) (@betodealmeida)
- [#11970](https://github.com/apache/superset/pull/11970) feat: add hook for dataset health check (#11970) (@graceguo-supercat)
- [#11927](https://github.com/apache/superset/pull/11927) refactor: optimize backend log payload (#11927) (@ktmud)
- [#12044](https://github.com/apache/superset/pull/12044) feat: Add new default dashboard (#12044) (@betodealmeida)
- [#12026](https://github.com/apache/superset/pull/12026) feat: load examples from config instead of code (#12026) (@betodealmeida)
- [#12064](https://github.com/apache/superset/pull/12064) fix: small fixes to the new import/export (#12064) (@betodealmeida)
- [#12063](https://github.com/apache/superset/pull/12063) fix(annotation layers): remove redirect on layer edit (#12063) (@riahk)
- [#11803](https://github.com/apache/superset/pull/11803) feat: handle new export in CLI (#11803) (@betodealmeida)
- [#12057](https://github.com/apache/superset/pull/12057) fixed CONTRIBUTING typos (#12057) (@adam-stasiak)
- [#11971](https://github.com/apache/superset/pull/11971) refactor: Transform URLShortLinkModal to Typescript (#11971) (@maloun96)
- [#11981](https://github.com/apache/superset/pull/11981) feat(charts): security perm simplification (#11981) (@dpgaspar)
- [#12055](https://github.com/apache/superset/pull/12055) fix(viz): remove orderby from sample request (#12055) (@villebro)
- [#12054](https://github.com/apache/superset/pull/12054) upgrade react-split (#12054) (@rusackas)
- [#11853](https://github.com/apache/superset/pull/11853) feat(reports): security perm simplification (#11853) (@dpgaspar)
- [#12039](https://github.com/apache/superset/pull/12039) fix(reports): log duration and sort column (#12039) (@dpgaspar)
- [#12035](https://github.com/apache/superset/pull/12035) fix(reports): apply owners security validation (#12035) (@dpgaspar)
- [#11996](https://github.com/apache/superset/pull/11996) fix: Fix style for error modal (#11996) (@maloun96)
- [#11957](https://github.com/apache/superset/pull/11957) chore: bumping plugin packages to latest (#11957) (@rusackas)
- [#12032](https://github.com/apache/superset/pull/12032) feat: add cron picker to AlertReportModal (#12032) (@nytai)
- [#12043](https://github.com/apache/superset/pull/12043) fix: disable browser autocomplete for DeleteModal (#12043) (@nytai)
- [#12006](https://github.com/apache/superset/pull/12006) fix: Explore "Change Dataset" UX Enhancements (#12006) (@hughhhh)
- [#12018](https://github.com/apache/superset/pull/12018) fix schema datasource modal (#12018) (@lilykuang)
- [#11207](https://github.com/apache/superset/pull/11207) feat: Added setup for running Cypress tests in docker locally (#11207) (@adam-stasiak)
- [#12013](https://github.com/apache/superset/pull/12013) refactor: Existing Antd Collapse to enhanced (#12013) (@geido)
- [#12024](https://github.com/apache/superset/pull/12024) style: Restoring menu highlights (#12024) (@rusackas)
- [#11978](https://github.com/apache/superset/pull/11978) docs: restored page on roles in security, executed other touchups, and… (#11978) (@srinify)
- [#11993](https://github.com/apache/superset/pull/11993) refactor : Change menu name and reorder items (#11993) (@maloun96)
- [#11915](https://github.com/apache/superset/pull/11915) fix: Change url & add check for active item in menu (#11915) (@maloun96)
- [#11991](https://github.com/apache/superset/pull/11991) feat: update IDs when importing dashboards (#11991) (@betodealmeida)
- [#11983](https://github.com/apache/superset/pull/11983) feat: add confirmation dialog for imports (#11983) (@betodealmeida)
- [#11770](https://github.com/apache/superset/pull/11770) feat: alerts/reports add/edit modal (#11770) (@riahk)
- [#12007](https://github.com/apache/superset/pull/12007) fix: add default position to dash export (#12007) (@betodealmeida)
- [#12003](https://github.com/apache/superset/pull/12003) chore: remove generic type (#12003) (@betodealmeida)
- [#11973](https://github.com/apache/superset/pull/11973) fix(dataset): fetch metadata on dataset creation may raise broad exceptions (#11973) (@dpgaspar)
- [#11951](https://github.com/apache/superset/pull/11951) refactor : Transform SaveModal to typescript (#11951) (@maloun96)
- [#11499](https://github.com/apache/superset/pull/11499) feat(SIP-39): Async query support for charts (#11499) (@robdiciuccio)
- [#11994](https://github.com/apache/superset/pull/11994) feat: add invisible layer on loading chart (#11994) (@graceguo-supercat)
- [#11937](https://github.com/apache/superset/pull/11937) feat: alert/report execution log list view (#11937) (@lilykuang)
- [#11982](https://github.com/apache/superset/pull/11982) feat: confirm overwrite when importing (#11982) (@betodealmeida)
- [#12002](https://github.com/apache/superset/pull/12002) chore: move passwords needed message (#12002) (@betodealmeida)
- [#11977](https://github.com/apache/superset/pull/11977) refactor: Removes hard coded colors (#11977) (@michael-s-molina)
- [#11936](https://github.com/apache/superset/pull/11936) chore: consolidate common code in importers (#11936) (@betodealmeida)
- [#11980](https://github.com/apache/superset/pull/11980) fix : Fix style for header (sqllab) (#11980) (@maloun96)
- [#11946](https://github.com/apache/superset/pull/11946) fix(explore): changing metric aggregate doesn't update label (#11946) (@mayurnewase)
- [#11990](https://github.com/apache/superset/pull/11990) fixing rounded corners (#11990) (@rusackas)
- [#11964](https://github.com/apache/superset/pull/11964) refactor : Transform FilterScopeModal to Typescript (#11964) (@maloun96)
- [#11963](https://github.com/apache/superset/pull/11963) fix : adhoc filter dropdown (#11963) (@maloun96)
- [#11985](https://github.com/apache/superset/pull/11985) Debounce TextControl if change runs immediately after input (#11985) (@kgabryje)
- [#11975](https://github.com/apache/superset/pull/11975) Change paddings on ListView and SubMenu (#11975) (@kgabryje)
- [#11986](https://github.com/apache/superset/pull/11986) add user to sql lab state (#11986) (@eschutho)
- [#11987](https://github.com/apache/superset/pull/11987) fix: make "DELETE" confirmation work in other languages (#11987) (@betodealmeida)
- [#11308](https://github.com/apache/superset/pull/11308) tests: added fixture with energy usage instead of example (#11308) (@kkucharc)
- [#11967](https://github.com/apache/superset/pull/11967) refactor: Upgrade Redux (#11967) (@suddjian)
- [#11883](https://github.com/apache/superset/pull/11883) refactor: move enums to the beginning of utiuls/core.py (#11883) (@ktmud)
- [#11890](https://github.com/apache/superset/pull/11890) fix(reports): validator_config, report state machine, working_timeout (#11890) (@dpgaspar)
- [#11934](https://github.com/apache/superset/pull/11934) fix: always fetch database list on bootstrap payload (#11934) (@mistercrunch)
- [#11755](https://github.com/apache/superset/pull/11755) feat: Sqllab to Explore UX improvements (#11755) (@hughhhh)
- [#11940](https://github.com/apache/superset/pull/11940) build: cancel previous github action runs (#11940) (@ktmud)
- [#11950](https://github.com/apache/superset/pull/11950) fix(alerts, thumbnails): celery tasks using flask-sqlalchemy sessions (#11950) (@dpgaspar)
- [#11885](https://github.com/apache/superset/pull/11885) fix(event-flow-viz): handle null metadata selection (#11885) (@maloun96)
- [#11924](https://github.com/apache/superset/pull/11924) feat: add modal to import dashboards (#11924) (@betodealmeida)
- [#11956](https://github.com/apache/superset/pull/11956) feat: add modal to import charts (#11956) (@betodealmeida)
- [#11910](https://github.com/apache/superset/pull/11910) feat: add modal to import datasets (#11910) (@betodealmeida)
- [#11884](https://github.com/apache/superset/pull/11884) feat: add modal to import databases (#11884) (@betodealmeida)
- [#11947](https://github.com/apache/superset/pull/11947) chore: bump nvd3 plugin version (#11947) (@kristw)
- [#11931](https://github.com/apache/superset/pull/11931) fix(charts): screenshot API declaring an unnecessary rison arg (#11931) (@dpgaspar)
- [#11893](https://github.com/apache/superset/pull/11893) feat(releasing): support changelog csv export (#11893) (@dpgaspar)
- [#11854](https://github.com/apache/superset/pull/11854) feat: Results table on Explore view (#11854) (@kgabryje)
- [#11538](https://github.com/apache/superset/pull/11538) feat: add Postgres SQL validator (#11538) (@betodealmeida)
- [#11899](https://github.com/apache/superset/pull/11899) refactor: Move Badge to Antdesign (#11899) (@geido)
- [#11928](https://github.com/apache/superset/pull/11928) refactor: Extract copy functionality to utils (#11928) (@maloun96)
- [#11939](https://github.com/apache/superset/pull/11939) fix: make sure we log the logs (#11939) (@etr2460)
- [#11930](https://github.com/apache/superset/pull/11930) Quick fix for branch names in tags (#11930) (@craig-rueda)
- [#11877](https://github.com/apache/superset/pull/11877) Added check if SQL query is empty and disable shortcut for run query (#11877) (@kkucharc)
- [#11900](https://github.com/apache/superset/pull/11900) feat: filters for alerts and reports list view (#11900) (@lilykuang)
- [#11920](https://github.com/apache/superset/pull/11920) fix: Remove expensive logs table migration (#11920) (@etr2460)
- [#11665](https://github.com/apache/superset/pull/11665) feat: add event and interval annotation support to chart data ep (#11665) (@villebro)
- [#11919](https://github.com/apache/superset/pull/11919) fix: Forgot to remove bad comments from SaveDatasetModal (#11919) (@hughhhh)
- [#11786](https://github.com/apache/superset/pull/11786) chore: add unit tests for the current import functionality (#11786) (@betodealmeida)
- [#11875](https://github.com/apache/superset/pull/11875) refactor: Move ProgressBar to Antd (#11875) (@geido)
- [#11904](https://github.com/apache/superset/pull/11904) feat: run BQ queries as single statement (#11904) (@betodealmeida)
- [#11911](https://github.com/apache/superset/pull/11911) fix: adjust width for non multi select inputs (#11911) (@eschutho)
- [#11861](https://github.com/apache/superset/pull/11861) feat: Adding SaveDatasetModal component (#11861) (@hughhhh)
- [#11868](https://github.com/apache/superset/pull/11868) chore: Support SET & SHOW commands as read only SQL commands (#11868) (@bkyryliuk)
- [#11876](https://github.com/apache/superset/pull/11876) fix: Check if annotation type is supported by the given chart type (#11876) (@agatapst)
- [#11912](https://github.com/apache/superset/pull/11912) fix: Button storybook component size knob (#11912) (@rusackas)
- [#11913](https://github.com/apache/superset/pull/11913) style: eslint curly rule (#11913) (@rusackas)
- [#11897](https://github.com/apache/superset/pull/11897) fix(query): sorting by user for Query History list view (#11897) (@nytai)
- [#11856](https://github.com/apache/superset/pull/11856) feat(css templates): security perm simplification (#11856) (@dpgaspar)
- [#11902](https://github.com/apache/superset/pull/11902) add fix for extra comments for #11781 (#11902) (@graceguo-supercat)
- [#11891](https://github.com/apache/superset/pull/11891) chore: Enable jsx-a11y/anchor-is-valid (#11891) (@nikolagigic)
- [#11887](https://github.com/apache/superset/pull/11887) chore: Update sqllab types (#11887) (@hughhhh)
- [#10770](https://github.com/apache/superset/pull/10770) Capture error when celery back-end does not support forgetting tasks (#10770) (@willbarrett)
- [#11816](https://github.com/apache/superset/pull/11816) feat: allow user to view their profile again (#11816) (@etr2460)
- [#11847](https://github.com/apache/superset/pull/11847) fix: Show copy icon (#11847) (@maloun96)
- [#11848](https://github.com/apache/superset/pull/11848) Align icon (#11848) (@maloun96)
- [#11843](https://github.com/apache/superset/pull/11843) style: remove react bootstrap fade component (#11843) (@nikolagigic)
- [#11802](https://github.com/apache/superset/pull/11802) feat: report/alert list CRUD view (#11802) (@lilykuang)
- [#11881](https://github.com/apache/superset/pull/11881) fix: certification icon order (#11881) (@etr2460)
- [#11781](https://github.com/apache/superset/pull/11781) fix (dataset editor): allow Source tab readOnly mode (#11781) (@graceguo-supercat)
- [#11845](https://github.com/apache/superset/pull/11845) fix: dashboard iframe to markdown db migration (#11845) (@dpgaspar)
- [#11771](https://github.com/apache/superset/pull/11771) test: add React Testing Library (#11771) (@ktmud)
- [#11580](https://github.com/apache/superset/pull/11580) fix: filters push out apply button on dashboard (#11580) (@kkucharc)
- [#11863](https://github.com/apache/superset/pull/11863) chore: remove SIP_34_QUERY_SEARCH_UI feature flag (#11863) (@nytai)
- [#11851](https://github.com/apache/superset/pull/11851) chore: Add home link to navbar (#11851) (@agatapst)
- [#11812](https://github.com/apache/superset/pull/11812) chore: move fixtures and helpers to root (#11812) (@eschutho)
- [#11702](https://github.com/apache/superset/pull/11702) feat: list view filters for Query History (#11702) (@nytai)
- [#11855](https://github.com/apache/superset/pull/11855) feat: Create api abstraction layer for dataset network calls (#11855) (@hughhhh)
- [#11858](https://github.com/apache/superset/pull/11858) fix(datasets): renaming openAPI columns (#11858) (@hughhhh)
- [#11678](https://github.com/apache/superset/pull/11678) feat(welcome): add SQL snippets to saved queries card (#11678) (@pkdotson)
- [#11766](https://github.com/apache/superset/pull/11766) Fix chart select borders in BuilderComponentPane (#11766) (@kgabryje)
- [#11852](https://github.com/apache/superset/pull/11852) fix: security converge downgrade procedure (#11852) (@dpgaspar)
- [#11830](https://github.com/apache/superset/pull/11830) fix: update chart doesn't remove all connections to dashboards (#11830) (@kkucharc)
- [#11238](https://github.com/apache/superset/pull/11238) feat: Option to run npm dev-server (hot reload) while calling docker-compose up (#11238) (@adam-stasiak)
- [#11836](https://github.com/apache/superset/pull/11836) feat: Sqllab to Explore UX improvements api changes (#11836) (@hughhhh)
- [#11778](https://github.com/apache/superset/pull/11778) fix: Download as image not working on Dashboard view (#11778) (@kgabryje)
- [#11764](https://github.com/apache/superset/pull/11764) feat(saved queries): security perm simplification (#11764) (@dpgaspar)
- [#11838](https://github.com/apache/superset/pull/11838) chore: type a couple easy to type files (#11838) (@etr2460)
- [#11779](https://github.com/apache/superset/pull/11779) chore: Move styles of Dashboard and FilterScopeSelector modals to Emotion (#11779) (@kgabryje)
- [#11834](https://github.com/apache/superset/pull/11834) Change subtabs order for Data tab (#11834) (@agatapst)
- [#11837](https://github.com/apache/superset/pull/11837) fix: improve Avatar text size consistency (#11837) (@etr2460)
- [#11824](https://github.com/apache/superset/pull/11824) fix: wrong key used FEATURE_FLAGS[LISTVIEW_DEFAULT_CARD_VIEW] (#11824) (@amitmiran137)
- [#11811](https://github.com/apache/superset/pull/11811) fix: Adding and removing annotations (#11811) (@agatapst)
- [#11828](https://github.com/apache/superset/pull/11828) ci(docker): build image on release (#11828) (@dpgaspar)
- [#11827](https://github.com/apache/superset/pull/11827) docs(release): small fixes and deprecate apache docs (#11827) (@dpgaspar)
- [#11825](https://github.com/apache/superset/pull/11825) fix(setup): disallow python 3.6 for pip install (#11825) (@dpgaspar)
- [#11801](https://github.com/apache/superset/pull/11801) fix: delete chart, dashboards, dbs with assoc reports (#11801) (@dpgaspar)
- [#11815](https://github.com/apache/superset/pull/11815) chore: Fix TableModelView super call (#11815) (@john-bodley)
- [#11683](https://github.com/apache/superset/pull/11683) feat: filter by me on CRUD list view (#11683) (@lilykuang)
- [#11805](https://github.com/apache/superset/pull/11805) fix: remove root dir from ZIP bundle (#11805) (@betodealmeida)
- [#11797](https://github.com/apache/superset/pull/11797) fix: add feature flag for domain sharding (#11797) (@graceguo-supercat)
- [#11714](https://github.com/apache/superset/pull/11714) chore: improve analytics (#11714) (@mistercrunch)
- [#10815](https://github.com/apache/superset/pull/10815) chore: type src/logger (#10815) (@etr2460)
- [#11809](https://github.com/apache/superset/pull/11809) docs: 0.38.0 CHANGELOG and UPDATING (#11809) (@dpgaspar)
- [#11762](https://github.com/apache/superset/pull/11762) fix: attachment filename error in sqllab with i18n (#11762) (@auxten)
- [#11795](https://github.com/apache/superset/pull/11795) fix: mutating input df in viz.py (#11795) (@villebro)
- [#11711](https://github.com/apache/superset/pull/11711) feat: new reports scheduler (#11711) (@dpgaspar)
- [#11751](https://github.com/apache/superset/pull/11751) feat: API endpoint to import dashboards (#11751) (@betodealmeida)
- [#11806](https://github.com/apache/superset/pull/11806) chore: unbreak frontend ci (#11806) (@etr2460)
- [#11737](https://github.com/apache/superset/pull/11737) refactor: Replace react-bootstrap tooltips with Antd tooltips (#11737) (@kgabryje)
- [#11798](https://github.com/apache/superset/pull/11798) fix: docker healthcheck (#11798) (@PMExtra)
- [#11785](https://github.com/apache/superset/pull/11785) feat: add certification info to table selector (#11785) (@etr2460)
- [#11783](https://github.com/apache/superset/pull/11783) update docs around email reports (#11783) (@eschutho)
- [#11794](https://github.com/apache/superset/pull/11794) build: split python CI jobs (#11794) (@etr2460)
- [#11675](https://github.com/apache/superset/pull/11675) refactor: use rison for list view filters stateful urls (#11675) (@riahk)
- [#11780](https://github.com/apache/superset/pull/11780) refactor: Replace SqlLab components' styles using Emotion & theme variables (#11780) (@agatapst)
- [#11754](https://github.com/apache/superset/pull/11754) chore: controls.test supporting v1 charts and added force=true to url when r… (#11754) (@adam-stasiak)
- [#11791](https://github.com/apache/superset/pull/11791) add tool tip to cards (#11791) (@pkdotson)
- [#11712](https://github.com/apache/superset/pull/11712) chore: enabled v1 verification in filter and url_params test files (#11712) (@adam-stasiak)
- [#11787](https://github.com/apache/superset/pull/11787) fix: annotation layer crashes when clearing type select (#11787) (@mistercrunch)
- [#11749](https://github.com/apache/superset/pull/11749) feat: add a command to import dashboards (#11749) (@betodealmeida)
- [#11775](https://github.com/apache/superset/pull/11775) docs: add Xite to users list (#11775) (@shashankkoppar)
- [#11732](https://github.com/apache/superset/pull/11732) fix: style multiselect input (#11732) (@eschutho)
- [#11747](https://github.com/apache/superset/pull/11747) Fix docker healthcheck. (#11747) (@PMExtra)
- [#11772](https://github.com/apache/superset/pull/11772) chore: fix typo (#11772) (@etr2460)
- [#11634](https://github.com/apache/superset/pull/11634) feat: SQL preview modal for Query History (#11634) (@nytai)
- [#11744](https://github.com/apache/superset/pull/11744) feat: API endpoint to import charts (#11744) (@betodealmeida)
- [#11743](https://github.com/apache/superset/pull/11743) feat: add a command to import charts (#11743) (@betodealmeida)
- [#11769](https://github.com/apache/superset/pull/11769) fix: Fixing issue around requirements-local.txt (#11769) (@craig-rueda)
- [#11760](https://github.com/apache/superset/pull/11760) feat: Add user info to sqllab via bootstrap data (#11760) (@hughhhh)
- [#11752](https://github.com/apache/superset/pull/11752) fix: Null error when deleting the last owner label in DatasourceEditor/settings (#11752) (@kgabryje)
- [#11709](https://github.com/apache/superset/pull/11709) Make spacings in Settings menu more consistent (#11709) (@kgabryje)
- [#11611](https://github.com/apache/superset/pull/11611) style: dark filter popover background (#11611) (@rusackas)
- [#11736](https://github.com/apache/superset/pull/11736) chore: Text change Allow Data Upload (#11736) (@amitmiran137)
- [#11740](https://github.com/apache/superset/pull/11740) fix: Adding __init__.py in superset.commands.importers (#11740) (@craig-rueda)
- [#11731](https://github.com/apache/superset/pull/11731) fix: do not drop calculated column on metadata sync (#11731) (@villebro)
- [#11703](https://github.com/apache/superset/pull/11703) docs: fix docker config paths (#11703) (@suddjian)
- [#11726](https://github.com/apache/superset/pull/11726) Fix missing styles in FilterScopeSelector modal (#11726) (@kgabryje)
- [#11728](https://github.com/apache/superset/pull/11728) feat: API endpoints to upload dataset/db (#11728) (@betodealmeida)
- [#11727](https://github.com/apache/superset/pull/11727) chore: remove SIP_34_ANNOTATIONS_UI feature flag (#11727) (@lilykuang)
- [#11704](https://github.com/apache/superset/pull/11704) feat(templating): Safer Jinja template processing (#11704) (@robdiciuccio)
- [#11692](https://github.com/apache/superset/pull/11692) Fix "Select all" option in SelectControl (#11692) (@kgabryje)
- [#11719](https://github.com/apache/superset/pull/11719) Fix ModalTriggers styling in SqlLab (#11719) (@kgabryje)
- [#11670](https://github.com/apache/superset/pull/11670) feat: new import commands for dataset and databases (#11670) (@betodealmeida)
- [#11693](https://github.com/apache/superset/pull/11693) Remove "required" from SaveModal Add to dashboard field (#11693) (@kgabryje)
- [#11684](https://github.com/apache/superset/pull/11684) fix: default dashboard/chart cards are vector with perfect corners (#11684) (@rusackas)
- [#11707](https://github.com/apache/superset/pull/11707) Switching Docker compose over to the official image (#11707) (@craig-rueda)
- [#11701](https://github.com/apache/superset/pull/11701) chore: statds metrics for cache invalidation (#11701) (@bkyryliuk)
- [#11685](https://github.com/apache/superset/pull/11685) chore: V1 charts load cypress tests (#11685) (@adam-stasiak)
- [#11698](https://github.com/apache/superset/pull/11698) build(cypress): Fix issue with cypress code-coverage plugin when running locally (#11698) (@robdiciuccio)
- [#11676](https://github.com/apache/superset/pull/11676) chore: remove a few obsolete logic (#11676) (@graceguo-supercat)
- [#11691](https://github.com/apache/superset/pull/11691) Fix overflow hidden issues in Dashboard Builder tabs (#11691) (@kgabryje)
- [#11509](https://github.com/apache/superset/pull/11509) feat: rename TABLE_NAMES_CACHE_CONFIG to DATA_CACHE_CONFIG (#11509) (@ktmud)
- [#11700](https://github.com/apache/superset/pull/11700) feat: Helm improvements (#11700) (@craig-rueda)
- [#11679](https://github.com/apache/superset/pull/11679) fix(saved query): handle null sql field (#11679) (@nytai)
- [#11616](https://github.com/apache/superset/pull/11616) feat: Adding docker build/push (#11616) (@craig-rueda)
- [#11618](https://github.com/apache/superset/pull/11618) feat: keep modal open when saving database failed (#11618) (@ktmud)
- [#11671](https://github.com/apache/superset/pull/11671) fix: Dropdown menu not closing on Dashboard view (#11671) (@kgabryje)
- [#11613](https://github.com/apache/superset/pull/11613) docs: add support for Google Analytics on superset.apache.org (#11613) (@mistercrunch)
- [#11574](https://github.com/apache/superset/pull/11574) feat: Query History CRUD list view (#11574) (@nytai)
- [#11606](https://github.com/apache/superset/pull/11606) feat: new reports models api (#11606) (@dpgaspar)
- [#11672](https://github.com/apache/superset/pull/11672) fix(dashboard): ordering for add chart widget (#11672) (@nytai)
- [#11661](https://github.com/apache/superset/pull/11661) fix (dashboard): remove default filters parameters in dashboard url (#11661) (@graceguo-supercat)
- [#11673](https://github.com/apache/superset/pull/11673) fix: make higher chart box resizable (#11673) (@kkucharc)
- [#11289](https://github.com/apache/superset/pull/11289) keep placeholder on multiselect (#11289) (@eschutho)
- [#11663](https://github.com/apache/superset/pull/11663) chore: clean up a debug line from #11653 (#11663) (@ktmud)
- [#11199](https://github.com/apache/superset/pull/11199) feat: add ECharts BoxPlot chart (#11199) (@villebro)
- [#11653](https://github.com/apache/superset/pull/11653) fix: database connection validation when creation (#11653) (@ktmud)
- [#11533](https://github.com/apache/superset/pull/11533) chore: consolidate datasource import logic (#11533) (@betodealmeida)
- [#11643](https://github.com/apache/superset/pull/11643) Restructure chart header to wrap nicely (#11643) (@kgabryje)
- [#11529](https://github.com/apache/superset/pull/11529) chore: consolidate dashboard import logic (#11529) (@betodealmeida)
- [#11652](https://github.com/apache/superset/pull/11652) add import icon (#11652) (@eschutho)
- [#11644](https://github.com/apache/superset/pull/11644) build: set actions/setup-python to v2 (#11644) (@ktmud)
- [#11648](https://github.com/apache/superset/pull/11648) feat(dev): dont override asset manifest in dev-server (#11648) (@ktmud)
- [#11655](https://github.com/apache/superset/pull/11655) [fix] handle null value in date filter (#11655) (@graceguo-supercat)
- [#11656](https://github.com/apache/superset/pull/11656) fix(chart-data): ignore orderby on sample result type (#11656) (@villebro)
- [#11649](https://github.com/apache/superset/pull/11649) fix(saved-query): handle case where sql_tables in undefined (#11649) (@nytai)
- [#11650](https://github.com/apache/superset/pull/11650) style: various little tweaks to home screen stylin' (#11650) (@rusackas)
- [#11646](https://github.com/apache/superset/pull/11646) chore: pin node and npm versions (#11646) (@ktmud)
- [#11626](https://github.com/apache/superset/pull/11626) feat(sankey-viz): allow sort by metric and bump superset-ui packages (#11626) (@ktmud)
- [#11603](https://github.com/apache/superset/pull/11603) build(deps-dev): update cypress to 5.5.0, improvements for running locally (#11603) (@robdiciuccio)
- [#11458](https://github.com/apache/superset/pull/11458) chore: enabled cypress test in filter file (#11458) (@adam-stasiak)
- [#11535](https://github.com/apache/superset/pull/11535) refactor: Remove reactable arc (#11535) (@kgabryje)
- [#11584](https://github.com/apache/superset/pull/11584) Enabled artifacts for failing tests (#11584) (@adam-stasiak)
- [#11636](https://github.com/apache/superset/pull/11636) chore: rename IMPORT_EXPORT_VERSION (#11636) (@betodealmeida)
- [#11638](https://github.com/apache/superset/pull/11638) fix: card thumbnails now always show border. (#11638) (@rusackas)
- [#11521](https://github.com/apache/superset/pull/11521) Chore: simplify Apache Kylin datetime convert (#11521) (@zhaoyongjie)
- [#11635](https://github.com/apache/superset/pull/11635) fix: CommandInvalidError had invalid init (#11635) (@betodealmeida)
- [#11630](https://github.com/apache/superset/pull/11630) Disabled bubble test (#11630) (@adam-stasiak)
- [#11632](https://github.com/apache/superset/pull/11632) fix: js unit test when save dash (#11632) (@graceguo-supercat)
- [#11631](https://github.com/apache/superset/pull/11631) style: fixing tall filter indicators (#11631) (@rusackas)
- [#11592](https://github.com/apache/superset/pull/11592) feat(dashboard): leaner filter indicator panel with wrapped text (#11592) (@suddjian)
- [#11621](https://github.com/apache/superset/pull/11621) Fix datetime picker issues (#11621) (@kgabryje)
- [#11614](https://github.com/apache/superset/pull/11614) fix(dashboard): use server-side lastModifiedTime for co-edit check (#11614) (@graceguo-supercat)
- [#11540](https://github.com/apache/superset/pull/11540) feat: annotation delete modal, bulk delete and empty state (#11540) (@lilykuang)
- [#11570](https://github.com/apache/superset/pull/11570) fix: minor style touch on dashboards (#11570) (@ktmud)
- [#11569](https://github.com/apache/superset/pull/11569) chore: clean up mountedTab (#11569) (@ktmud)
- [#11583](https://github.com/apache/superset/pull/11583) Fixed unstable test (#11583) (@adam-stasiak)
- [#11525](https://github.com/apache/superset/pull/11525) fix: extended droppable area on the top of dashboards (#11525) (@kkucharc)
- [#11597](https://github.com/apache/superset/pull/11597) build(deps-dev): bump less from 3.9.0 to 3.12.2 in /superset-frontend (#11597) (@dependabot[bot])
- [#11564](https://github.com/apache/superset/pull/11564) chore: cleaning out old deckgl controls (#11564) (@rusackas)
- [#11557](https://github.com/apache/superset/pull/11557) chore(home-screen): fixes for loading states, flicker issue, and reduction of api calls (#11557) (@pkdotson)
- [#11607](https://github.com/apache/superset/pull/11607) fix: Filter and Metric popovers not closing after clicking Save (#11607) (@kgabryje)
- [#11602](https://github.com/apache/superset/pull/11602) style: Wrap chart titles again (#11602) (@rusackas)
- [#11594](https://github.com/apache/superset/pull/11594) fix(dashboard): order charts by changed_on (#11594) (@nytai)
- [#11550](https://github.com/apache/superset/pull/11550) feat: new report schedule models (#11550) (@dpgaspar)
- [#11578](https://github.com/apache/superset/pull/11578) fix: Issues with filters and metrics popovers (#11578) (@kgabryje)
- [#11554](https://github.com/apache/superset/pull/11554) refactor: Replace react-bootstrap MenuItems with Antd Menu (#11554) (@kgabryje)
- [#11579](https://github.com/apache/superset/pull/11579) Changed top overflow for charts. (#11579) (@kkucharc)
- [#11518](https://github.com/apache/superset/pull/11518) build(deps): bump @emotion/core in /superset-frontend (#11518) (@dependabot[bot])
- [#11573](https://github.com/apache/superset/pull/11573) build(deps-dev): bump @storybook/addon-essentials in /superset-frontend (#11573) (@dependabot[bot])
- [#11575](https://github.com/apache/superset/pull/11575) chore(rls): move to feature flag and disable related view (#11575) (@villebro)
- [#11522](https://github.com/apache/superset/pull/11522) build(deps): bump core-js from 3.2.1 to 3.6.5 in /superset-frontend (#11522) (@dependabot[bot])
- [#11314](https://github.com/apache/superset/pull/11314) chore: Cypress dashboard list selectors refactor (#11314) (@adam-stasiak)
- [#11555](https://github.com/apache/superset/pull/11555) refactor: Replace react-bootstrap MenuItems with Antd Menu (#11555) (@kgabryje)
- [#11558](https://github.com/apache/superset/pull/11558) fix(dashboard): properly unset mountedTab in reducer (#11558) (@suddjian)
- [#11559](https://github.com/apache/superset/pull/11559) Front end for VERSIONED_EXPORT (#11559) (@betodealmeida)
- [#11445](https://github.com/apache/superset/pull/11445) fix: Pasting text issues in MetricsControl and AdhocFilterControl inputs (#11445) (@kgabryje)
- [#11487](https://github.com/apache/superset/pull/11487) refactor: Replace react-bootstrap MenuItems with Antd Menu (#11487) (@kgabryje)
- [#11311](https://github.com/apache/superset/pull/11311) style: database modal updates (#11311) (@riahk)
- [#11370](https://github.com/apache/superset/pull/11370) fix: add sort option to filters, sort chart list filter options (#11370) (@riahk)
- [#11551](https://github.com/apache/superset/pull/11551) docs: add Avesta to users list (#11551) (@TheRum)
- [#11527](https://github.com/apache/superset/pull/11527) refactor: Replace react-bootstrap dialogs with Antd dialogs (#11527) (@kgabryje)
- [#11531](https://github.com/apache/superset/pull/11531) chore: remove directory importexport (#11531) (@betodealmeida)
- [#11528](https://github.com/apache/superset/pull/11528) refactor: Use Antd Menu in Menu component (#11528) (@kgabryje)
- [#11530](https://github.com/apache/superset/pull/11530) feat: annotation layers delete logic + linking w/ annotation view (#11530) (@riahk)
- [#11500](https://github.com/apache/superset/pull/11500) feat: annotation edit modal with antd datepicker (#11500) (@lilykuang)
- [#11526](https://github.com/apache/superset/pull/11526) fix(tests): flaky test with dttm on Query API (#11526) (@dpgaspar)
- [#11361](https://github.com/apache/superset/pull/11361) docs: add Xendit to users list (#11361) (@LieAlbertTriAdrian)
- [#11502](https://github.com/apache/superset/pull/11502) refactor: reduce number of api calls needed to fetch favorite status for charts and dashboards (#11502) (@nytai)
- [#11532](https://github.com/apache/superset/pull/11532) chore: remove sanitize (#11532) (@betodealmeida)
- [#11435](https://github.com/apache/superset/pull/11435) refactor: rewrite and enhance chart control withVerification (#11435) (@ktmud)
- [#11501](https://github.com/apache/superset/pull/11501) fix(dashboard): multiple lines and indentation when editing json (#11501) (@suddjian)
- [#11160](https://github.com/apache/superset/pull/11160) refactor: Replace react-bootstrap Tabs with Antd Tabs in DashboardBuilder (#11160) (@kgabryje)
- [#11476](https://github.com/apache/superset/pull/11476) fix: Update "View In SQL Lab" Flow to render source query from datasource object (#11476) (@hughhhh)
- [#11491](https://github.com/apache/superset/pull/11491) feat: globally disable underscore for links in menu items (#11491) (@ktmud)
- [#11389](https://github.com/apache/superset/pull/11389) refactor: Replace react-bootstrap Modals with Antd in Explore (#11389) (@kgabryje)
- [#11519](https://github.com/apache/superset/pull/11519) feat: make logo link point to welcome page (#11519) (@mistercrunch)
- [#11512](https://github.com/apache/superset/pull/11512) chore: run 'npm audit fix', bump react-syntax-highlighter (#11512) (@mistercrunch)
- [#11510](https://github.com/apache/superset/pull/11510) chore: add dependabot.yml config file (#11510) (@mistercrunch)
- [#11511](https://github.com/apache/superset/pull/11511) chore: bump pypi cryptography from 2.4.2 to 3.2.1 (#11511) (@mistercrunch)
- [#11482](https://github.com/apache/superset/pull/11482) feat: query REST API more fields and tests (#11482) (@dpgaspar)
- [#11118](https://github.com/apache/superset/pull/11118) refactor: Replace react-bootstrap tabs with Antd tabs (#11118) (@kgabryje)
- [#11494](https://github.com/apache/superset/pull/11494) feat: annotation layers modal + filters (#11494) (@riahk)
- [#11485](https://github.com/apache/superset/pull/11485) build(deps-dev): bump node-fetch in /superset-frontend (#11485) (@dependabot[bot])
- [#11484](https://github.com/apache/superset/pull/11484) build(deps): bump object-path from 0.11.4 to 0.11.5 in /docs (#11484) (@dependabot[bot])
- [#11483](https://github.com/apache/superset/pull/11483) build(deps): bump lodash in /superset-frontend/cypress-base (#11483) (@dependabot[bot])
- [#11506](https://github.com/apache/superset/pull/11506) fix: import for moment in ActivityTable (#11506) (@pkdotson)
- [#11481](https://github.com/apache/superset/pull/11481) fix: show recent visited dashboards and charts in recent_activity (#11481) (@ktmud)
- [#11463](https://github.com/apache/superset/pull/11463) feat: create base class for export commands (#11463) (@betodealmeida)
- [#11450](https://github.com/apache/superset/pull/11450) feat: add certifications to tables (#11450) (@etr2460)
- [#11460](https://github.com/apache/superset/pull/11460) chore: rename ImportMixin to ImportExportMixin (#11460) (@betodealmeida)
- [#11447](https://github.com/apache/superset/pull/11447) feat: add endpoint to export saved queries using new format (#11447) (@betodealmeida)
- [#11504](https://github.com/apache/superset/pull/11504) docs: fix db drivers PG and ES (#11504) (@dpgaspar)
- [#11503](https://github.com/apache/superset/pull/11503) fix(api): don't log db conn failures on db create/update (#11503) (@dpgaspar)
- [#11206](https://github.com/apache/superset/pull/11206) feat: home screen mvp (#11206) (@pkdotson)
- [#11496](https://github.com/apache/superset/pull/11496) chore: Cleaning up ENABLE_REACT_CRUD_VIEWS config (#11496) (@john-bodley)
- [#11493](https://github.com/apache/superset/pull/11493) feat: disable save button when saving datasource (#11493) (@ktmud)
- [#11307](https://github.com/apache/superset/pull/11307) other: Improvements to bug report template (#11307) (@suddjian)
- [#11497](https://github.com/apache/superset/pull/11497) Revert "fix: change chart title by clicking (#11335)" (#11497) (@graceguo-supercat)
- [#11449](https://github.com/apache/superset/pull/11449) fix: prevent race condition when canceling query (#11449) (@betodealmeida)
- [#11452](https://github.com/apache/superset/pull/11452) fix(datasets): add custom filter for virtual datasets based on sql attribute (#11452) (@nytai)
- [#11456](https://github.com/apache/superset/pull/11456) Added z index to resizible char (#11456) (@kkucharc)
- [#11281](https://github.com/apache/superset/pull/11281) feat(explore): change save button text when users cannot override (#11281) (@ktmud)
- [#11480](https://github.com/apache/superset/pull/11480) fix: dashboard tab only shows move cursor when editing (#11480) (@rusackas)
- [#11473](https://github.com/apache/superset/pull/11473) Add IBM Cloud deployment guide (#11473) (@aklin)
- [#11474](https://github.com/apache/superset/pull/11474) fix: Unwinds icon fallout that came along with filters PR (#11474) (@rusackas)
- [#10936](https://github.com/apache/superset/pull/10936) feat(dashboards): Filter status indicators (#10936) (@suddjian)
- [#11432](https://github.com/apache/superset/pull/11432) feat: annotation layers CRUD list view (#11432) (@riahk)
- [#11390](https://github.com/apache/superset/pull/11390) refactor: Replace react-bootstrap Modals with Antd in Datasource (#11390) (@kgabryje)
- [#11446](https://github.com/apache/superset/pull/11446) feat: annotations list CRUD view (#11446) (@lilykuang)
- [#11459](https://github.com/apache/superset/pull/11459) Disabled chaning caret (#11459) (@kkucharc)
- [#11457](https://github.com/apache/superset/pull/11457) docs: improve docs and update apache release scripts (#11457) (@dpgaspar)
- [#11455](https://github.com/apache/superset/pull/11455) enabled skipped tests in AdhocMetrics Cypress (#11455) (@adam-stasiak)
- [#11428](https://github.com/apache/superset/pull/11428) fix: Explore popovers issues (#11428) (@kgabryje)
- [#11437](https://github.com/apache/superset/pull/11437) fix: add init.py to the annotations module (#11437) (@bkyryliuk)
- [#11401](https://github.com/apache/superset/pull/11401) fix: a space adds the space. (#11401) (@rusackas)
- [#11453](https://github.com/apache/superset/pull/11453) fix: Fixing broken Cypress test (#11453) (@rusackas)
- [#11366](https://github.com/apache/superset/pull/11366) refactor: Use Antd Modals instead of react-bootstrap Modals (#11366) (@kgabryje)
- [#11309](https://github.com/apache/superset/pull/11309) chore: cypress selectors refactor in explore module (#11309) (@adam-stasiak)
- [#11312](https://github.com/apache/superset/pull/11312) chore: Cypress chart selectors refactor (#11312) (@adam-stasiak)
- [#11414](https://github.com/apache/superset/pull/11414) fix: [email report] add multiple schedules per hour (#11414) (@graceguo-supercat)
- [#11397](https://github.com/apache/superset/pull/11397) feat: add UUID column to saved_query for export/import (#11397) (@betodealmeida)
- [#11439](https://github.com/apache/superset/pull/11439) fix filter highlighting (#11439) (@suddjian)
- [#11444](https://github.com/apache/superset/pull/11444) fix: bump FAB to 3.1.1 (#11444) (@dpgaspar)
- [#11407](https://github.com/apache/superset/pull/11407) fix: added meaningful exception for loading births error (#11407) (@kkucharc)
- [#11315](https://github.com/apache/superset/pull/11315) chore: Update testconn logic (#11315) (@john-bodley)
- [#10645](https://github.com/apache/superset/pull/10645) feat: enable metadata sync for virtual tables (#10645) (@villebro)
- [#11429](https://github.com/apache/superset/pull/11429) fix: is_temporal should be overridden by is_dttm value (#11429) (@villebro)
- [#11427](https://github.com/apache/superset/pull/11427) Moved css of inline inputs of DateFilterControl to css of FilterBox where it appears. (#11427) (@kkucharc)
- [#11412](https://github.com/apache/superset/pull/11412) fix: multiple issues with FilterPopover (#11412) (@mistercrunch)
- [#11327](https://github.com/apache/superset/pull/11327) Configured babel plugin for removing data-test from production code (#11327) (@adam-stasiak)
- [#11424](https://github.com/apache/superset/pull/11424) feat(explore): update the order of datasource dropdown menu (#11424) (@hughhhh)
- [#11371](https://github.com/apache/superset/pull/11371) feat: hide datasource legacy based on featureflag (#11371) (@hughhhh)
- [#11382](https://github.com/apache/superset/pull/11382) fix: better error messages for dashboard properties modal (#11382) (@nytai)
- [#11430](https://github.com/apache/superset/pull/11430) fix: saved query list sort by database (#11430) (@nytai)
- [#11433](https://github.com/apache/superset/pull/11433) build: disable pr reviews for pr-lint action (#11433) (@nytai)
- [#11381](https://github.com/apache/superset/pull/11381) fix: better error message for chart properties modal (#11381) (@nytai)
- [#10724](https://github.com/apache/superset/pull/10724) Let the header wrap! (#10724) (@rusackas)
- [#11330](https://github.com/apache/superset/pull/11330) refactor: Use Modals from Antd instead of react-bootstrap (#11330) (@kgabryje)
- [#11391](https://github.com/apache/superset/pull/11391) feat: saved queries with execution info (#11391) (@dpgaspar)
- [#11392](https://github.com/apache/superset/pull/11392) fix: keeping Markdown content while resizing window on Dashboard (#11392) (@kkucharc)
- [#11423](https://github.com/apache/superset/pull/11423) Moved frame from below to currently focused window (#11423) (@kkucharc)
- [#11239](https://github.com/apache/superset/pull/11239) refactor: Replace usages of reactable in TimeTable (#11239) (@kgabryje)
- [#11417](https://github.com/apache/superset/pull/11417) fix(examples): specify 'time_range_endpoints' to prevent toast warning (#11417) (@mistercrunch)
- [#11422](https://github.com/apache/superset/pull/11422) docs: Update Dremio doc with Arrow Flight connection details (#11422) (@narendrans)
- [#11421](https://github.com/apache/superset/pull/11421) chore: upgrade TypeScript (3.8.3 -> 4.0.3) (#11421) (@ktmud)
- [#11415](https://github.com/apache/superset/pull/11415) style: fix labels vertical align (#11415) (@mistercrunch)
- [#11420](https://github.com/apache/superset/pull/11420) fix: error handling for webpack proxy (#11420) (@ktmud)
- [#11416](https://github.com/apache/superset/pull/11416) refactor: typing for explore Control and messageToasts (#11416) (@ktmud)
- [#11336](https://github.com/apache/superset/pull/11336) feat(dashboard): fetch charts by owners instead of created_by (#11336) (@nytai)
- [#11375](https://github.com/apache/superset/pull/11375) chore: Fixed skipped cypress test - refresh dashboard function (#11375) (@adam-stasiak)
- [#11342](https://github.com/apache/superset/pull/11342) chore: Button cruft cleanup (#11342) (@rusackas)
- [#11395](https://github.com/apache/superset/pull/11395) refactor: Use Antd Dropdown instead of react-bootstrap in DatasourceControl (#11395) (@kgabryje)
- [#11344](https://github.com/apache/superset/pull/11344) feat: annotations REST API (#11344) (@dpgaspar)
- [#11396](https://github.com/apache/superset/pull/11396) fix dataset editor for saving schema (#11396) (@lilykuang)
- [#11351](https://github.com/apache/superset/pull/11351) feat: export dashboards as ZIP files (#11351) (@betodealmeida)
- [#11400](https://github.com/apache/superset/pull/11400) fix: long labels now truncate with ellipsis (#11400) (@rusackas)
- [#11398](https://github.com/apache/superset/pull/11398) docs: Add semantic prefix info for PR titles (#11398) (@robdiciuccio)
- [#11335](https://github.com/apache/superset/pull/11335) fix: change chart title by clicking (#11335) (@lilykuang)
- [#11403](https://github.com/apache/superset/pull/11403) build: bump pr-lint-action (#11403) (@nytai)
- [#11129](https://github.com/apache/superset/pull/11129) docs: fix typo (#11129) (@curlup)
- [#10834](https://github.com/apache/superset/pull/10834) fix: dashboard edit/save errors (#10834) (@eschutho)
- [#11211](https://github.com/apache/superset/pull/11211) refactor: Replace react-bootstrap tabs with Antd tabs on Profile (#11211) (@kgabryje)
- [#11240](https://github.com/apache/superset/pull/11240) refactor: Replace usages of reactable in TableLoader (#11240) (@kgabryje)
- [#11376](https://github.com/apache/superset/pull/11376) build: let webpack proxy server handle more content encoding (#11376) (@ktmud)
- [#11369](https://github.com/apache/superset/pull/11369) fix: dashboard cache invalid join query (#11369) (@ktmud)
- [#11349](https://github.com/apache/superset/pull/11349) feat: export charts as ZIP files (#11349) (@betodealmeida)
- [#11332](https://github.com/apache/superset/pull/11332) feat: export datasets as ZIP files (#11332) (@betodealmeida)
- [#11383](https://github.com/apache/superset/pull/11383) style: improve the "Create New Chart" screen's usability (#11383) (@mistercrunch)
- [#11386](https://github.com/apache/superset/pull/11386) docs: add VLMedia to users list (#11386) (@iercan)
- [#11362](https://github.com/apache/superset/pull/11362) feat: add statsd metrics to FAB rest API post, put and delete (#11362) (@dpgaspar)
- [#11346](https://github.com/apache/superset/pull/11346) perf(api): improve API info performance (#11346) (@dpgaspar)
- [#11372](https://github.com/apache/superset/pull/11372) removing outlines on a few key elements (#11372) (@rusackas)
- [#11026](https://github.com/apache/superset/pull/11026) docs: Fix typo in installing from scratch (#11026) (@philipqnguyen)
- [#11334](https://github.com/apache/superset/pull/11334) chore(prophet): ignore logged warning for missing plotly package (#11334) (@villebro)
- [#11271](https://github.com/apache/superset/pull/11271) feat: CSS Templates List Actions (#11271) (@riahk)
- [#11367](https://github.com/apache/superset/pull/11367) Fix overflowing tabs (#11367) (@kgabryje)
- [#11374](https://github.com/apache/superset/pull/11374) Log warning for failure to get table/view names from DB (#11374) (@robdiciuccio)
- [#11354](https://github.com/apache/superset/pull/11354) style(sqllab): wrap text in monospace db-provided error messages (#11354) (@mistercrunch)
- [#11338](https://github.com/apache/superset/pull/11338) fix: 'Save Chart' modal's dashboard dropdown isn't sticky (#11338) (@mistercrunch)
- [#11355](https://github.com/apache/superset/pull/11355) style: make <Label/> not uppercase (#11355) (@mistercrunch)
- [#11340](https://github.com/apache/superset/pull/11340) feat: adding feature flags to escape/hide html in markdown (#11340) (@rusackas)
- [#11286](https://github.com/apache/superset/pull/11286) fix: saved_query search on schema and database not working (#11286) (@dpgaspar)
- [#11348](https://github.com/apache/superset/pull/11348) fix: Allow "EXPLAIN" queries when "Allow DML" setting is False (#11348) (@hughhhh)
- [#11337](https://github.com/apache/superset/pull/11337) fix(listview): hide actions column if no actions are allowed (#11337) (@nytai)
- [#11353](https://github.com/apache/superset/pull/11353) style: using correct + icon on New Query button (#11353) (@rusackas)
- [#11169](https://github.com/apache/superset/pull/11169) docs: add a roadmap page pointing to SIP-53 (#11169) (@mistercrunch)
- [#11274](https://github.com/apache/superset/pull/11274) fix: error around latest partition in BigQuery (#11274) (@mistercrunch)
- [#11227](https://github.com/apache/superset/pull/11227) style(menu): clean up right menu - leaving only "Settings" (#11227) (@mistercrunch)
- [#11343](https://github.com/apache/superset/pull/11343) Fix tabs switching in SouthPane (#11343) (@kgabryje)
- [#11296](https://github.com/apache/superset/pull/11296) feat: css template add/edit modal (#11296) (@lilykuang)
- [#11218](https://github.com/apache/superset/pull/11218) fix: update table_name and schema on dataset editor (#11218) (@lilykuang)
- [#11313](https://github.com/apache/superset/pull/11313) tests: Parameterize some tests in alerts_tests.py (#11313) (@hnle)
- [#11280](https://github.com/apache/superset/pull/11280) chore: Dashboard cypress refactor (#11280) (@adam-stasiak)
- [#11241](https://github.com/apache/superset/pull/11241) refactor: Replace usages of reactable in ChangeDatasourceModal (#11241) (@kgabryje)
- [#11163](https://github.com/apache/superset/pull/11163) refactor: Replace usages of Popover from react-bootstrap with Antd (#11163) (@kgabryje)
- [#11279](https://github.com/apache/superset/pull/11279) refactor: replace AvatarIcon instances with FacePile (#11279) (@nytai)
- [#11290](https://github.com/apache/superset/pull/11290) tests: added fixtures to created dashboards and updated test with proper value (#11290) (@kkucharc)
- [#11333](https://github.com/apache/superset/pull/11333) Fix: bring back type ignore for config import (#11333) (@kkucharc)
- [#11326](https://github.com/apache/superset/pull/11326) fix(chart-api): cached-indicator always shows value is cached (#11326) (@villebro)
- [#11216](https://github.com/apache/superset/pull/11216) refactor: Refactor QueryTable to use react-table (#11216) (@kgabryje)
- [#11259](https://github.com/apache/superset/pull/11259) chore: make config ENABLE_REACT_CRUD_VIEWS = True by default (#11259) (@mistercrunch)
- [#11303](https://github.com/apache/superset/pull/11303) Fix overflowing tab's styling in TabbedSqlEditors (#11303) (@kgabryje)
- [#11229](https://github.com/apache/superset/pull/11229) feat: export databases as a ZIP bundle (#11229) (@betodealmeida)
- [#11305](https://github.com/apache/superset/pull/11305) fix: should update last_modified_time in client-side after save dash (#11305) (@graceguo-supercat)
- [#11300](https://github.com/apache/superset/pull/11300) fix CTAS and CVAS buttons invisible (#11300) (@zhaoyongjie)
- [#11294](https://github.com/apache/superset/pull/11294) feat: update time_compare description and choices (#11294) (@etr2460)
- [#11187](https://github.com/apache/superset/pull/11187) fix: button translations missing (#11187) (@rubenSastre)
- [#11293](https://github.com/apache/superset/pull/11293) fix: use dashboard id for stable cache key (#11293) (@ktmud)
- [#11278](https://github.com/apache/superset/pull/11278) fix: add schema name to datasource field in chart list (#11278) (@nytai)
- [#11287](https://github.com/apache/superset/pull/11287) fix: Fix styling in SqlLab when tabs overflow (#11287) (@kgabryje)
- [#11254](https://github.com/apache/superset/pull/11254) chore: Added data-test attributes for testing (#11254) (@adam-stasiak)
- [#11273](https://github.com/apache/superset/pull/11273) fix: delete the correct dashboard cache key (#11273) (@ktmud)
- [#11260](https://github.com/apache/superset/pull/11260) fix(query search): use new api to fetch users (#11260) (@nytai)
- [#11270](https://github.com/apache/superset/pull/11270) Revert "fix: keep placeholder in multivalue select when a value exists (#11181)" (#11270) (@etr2460)
- [#11249](https://github.com/apache/superset/pull/11249) Refactored api_tests in charts. Split filter test into several unit tests cases. Added table id based on database id (#11249) (@kkucharc)
- [#11217](https://github.com/apache/superset/pull/11217) refactor: Implement TableView component (#11217) (@kgabryje)
- [#11222](https://github.com/apache/superset/pull/11222) refactor: use contextmanager for event_logger decorators (#11222) (@ktmud)
- [#11256](https://github.com/apache/superset/pull/11256) docs: add note about migration in #11098 to Changelog (#11256) (@betodealmeida)
- [#11233](https://github.com/apache/superset/pull/11233) chore(engine): adapt postgres backend connection URI (#11233) (@zhaoyongjie)
- [#11261](https://github.com/apache/superset/pull/11261) docs: Add utair to list of companies using Apache Superset (#11261) (@dmitrijkir)
- [#11193](https://github.com/apache/superset/pull/11193) fix: do not import superset_config on tests (#11193) (@betodealmeida)
- [#11258](https://github.com/apache/superset/pull/11258) update dashboard edit modal (#11258) (@lilykuang)
- [#11234](https://github.com/apache/superset/pull/11234) perf: cache dashboard bootstrap data (#11234) (@ktmud)
- [#11252](https://github.com/apache/superset/pull/11252) fix: improve time compare range error (#11252) (@etr2460)
- [#11242](https://github.com/apache/superset/pull/11242) docs: don't link to database engine pages (#11242) (@mistercrunch)
- [#11181](https://github.com/apache/superset/pull/11181) fix: keep placeholder in multivalue select when a value exists (#11181) (@eschutho)
- [#11209](https://github.com/apache/superset/pull/11209) perf: speed up uuid column generation (#11209) (@ktmud)
- [#11228](https://github.com/apache/superset/pull/11228) test: add admin to the owners of birth_names slices (#11228) (@ktmud)
- [#11246](https://github.com/apache/superset/pull/11246) fix: Ensure consistent naming for testconn (#11246) (@john-bodley)
- [#11210](https://github.com/apache/superset/pull/11210) fix: show TIME COLUMN options in dashboard (#11210) (@graceguo-supercat)
- [#11220](https://github.com/apache/superset/pull/11220) feat: prevent co-edit dashboard collision (#11220) (@graceguo-supercat)
- [#11244](https://github.com/apache/superset/pull/11244) chore: deprecate REDUCE_DASHBOARD_BOOTSTRAP_PAYLOAD (#11244) (@etr2460)
- [#11153](https://github.com/apache/superset/pull/11153) fix: questioning a few lines that force an ORDER clause (#11153) (@mistercrunch)
- [#11231](https://github.com/apache/superset/pull/11231) docs: Added Dremio to superset home page (#11231) (@narendrans)
- [#11223](https://github.com/apache/superset/pull/11223) chore: Leverage SQLALchemy ping rather than explicit SELECT 1 for testconn (#11223) (@john-bodley)
- [#11230](https://github.com/apache/superset/pull/11230) fix(cypress): table viz failed to run in postgres12 (#11230) (@zhaoyongjie)
- [#11225](https://github.com/apache/superset/pull/11225) fix: adding nofollow (#11225) (@rusackas)
- [#11212](https://github.com/apache/superset/pull/11212) refactor: Replace react-bootstrap tabs with Antd tabs in SqlLab (#11212) (@kgabryje)
- [#11179](https://github.com/apache/superset/pull/11179) chore: simplify alerting data model to leverage a single class (#11179) (@bkyryliuk)
- [#11189](https://github.com/apache/superset/pull/11189) feat: CSS Templates List (#11189) (@riahk)
- [#11101](https://github.com/apache/superset/pull/11101) style(listview): various changes to get closer to SIP-34 designs (#11101) (@nytai)
- [#11214](https://github.com/apache/superset/pull/11214) Changed cache uid to be depending on table in test_csv_response_format (#11214) (@kkucharc)
- [#11213](https://github.com/apache/superset/pull/11213) test: test_cache_logging is not depending on other dashboard (#11213) (@kkucharc)
- [#11208](https://github.com/apache/superset/pull/11208) chore: Add __pycache__ to gitignore (#11208) (@ktmud)
- [#11204](https://github.com/apache/superset/pull/11204) Fix typo "insode" -> "inside" (#11204) (@jharding-blw)
- [#11203](https://github.com/apache/superset/pull/11203) fix: revert eTag cache feature for dashboard (#11203) (@graceguo-supercat)
- [#11196](https://github.com/apache/superset/pull/11196) fix: skip unit test that is failing in master for test-postgres-hive (#11196) (@betodealmeida)
- [#11172](https://github.com/apache/superset/pull/11172) chore: turn SQL templating off by default (#11172) (@dpgaspar)
- [#11194](https://github.com/apache/superset/pull/11194) Revert "refactor: Replace react-bootstrap tabs with Antd tabs (#11090)" (#11194) (@john-bodley)
- [#11098](https://github.com/apache/superset/pull/11098) feat: add UUID column to ImportMixin (#11098) (@betodealmeida)
- [#11155](https://github.com/apache/superset/pull/11155) chore: cleanup FAB update perms (#11155) (@john-bodley)
- [#11131](https://github.com/apache/superset/pull/11131) test: removed unicode_test example from unit tests (#11131) (@kkucharc)
- [#11173](https://github.com/apache/superset/pull/11173) fix(viz): downgrade exception for missing viz/datasource (#11173) (@villebro)
- [#11180](https://github.com/apache/superset/pull/11180) fixed undefined names error (#11180) (@lilykuang)
- [#11164](https://github.com/apache/superset/pull/11164) fix: save query modal/button styling + convert to ant-d modal (#11164) (@riahk)
- [#11176](https://github.com/apache/superset/pull/11176) fix: cosmetic issue template (#11176) (@mistercrunch)
- [#11175](https://github.com/apache/superset/pull/11175) chore: remove SIP_34_SAVED_QUERIES_UI feature flag (#11175) (@lilykuang)
- [#11174](https://github.com/apache/superset/pull/11174) chore: add issue template for 'Cosmetic Issue' (#11174) (@mistercrunch)
- [#11168](https://github.com/apache/superset/pull/11168) fix: 📜 `/docs/api` won't render (#11168) (@mistercrunch)
- [#11170](https://github.com/apache/superset/pull/11170) style(dashboard): minor improvements to chart context menu (#11170) (@mistercrunch)
- [#11056](https://github.com/apache/superset/pull/11056) style: fix too light form labels in DatabaseModal + DRY css (#11056) (@mistercrunch)
- [#11075](https://github.com/apache/superset/pull/11075) style(sqllab): make database errors more clear and render as monospace (#11075) (@mistercrunch)
- [#11137](https://github.com/apache/superset/pull/11137) fix: enable consistent etag across workers and force no-cache for dashboards (#11137) (@ktmud)
- [#11055](https://github.com/apache/superset/pull/11055) chore: more 'datasource' -> 'dataset' renaming (#11055) (@mistercrunch)
- [#11108](https://github.com/apache/superset/pull/11108) Remove erroneous package-lock.json (#11108) (@robdiciuccio)
- [#11135](https://github.com/apache/superset/pull/11135) feat: saved query preview modal (#11135) (@lilykuang)
- [#11040](https://github.com/apache/superset/pull/11040) allow passing bash args into the pytest (#11040) (@amitmiran137)
- [#11152](https://github.com/apache/superset/pull/11152) docs: typo (#11152) (@jolange)
- [#11154](https://github.com/apache/superset/pull/11154) docs: add API page to docs using Swagger UI (#11154) (@mistercrunch)
- [#11143](https://github.com/apache/superset/pull/11143) chore: Remove obsolete creating missing metric permissions (#11143) (@john-bodley)
- [#11150](https://github.com/apache/superset/pull/11150) Revert "refactor: Remove usages of reactable from TimeTable (#11046)" (#11150) (@etr2460)
- [#11145](https://github.com/apache/superset/pull/11145) fix: fixing CI workflow (#11145) (@henryyeh)
- [#11058](https://github.com/apache/superset/pull/11058) fix: Enable ESLint rule default-props-match-prop-types (#11058) (@kgabryje)
- [#11120](https://github.com/apache/superset/pull/11120) fix: clean up prop type errors in jest tests (#11120) (@eschutho)
- [#11090](https://github.com/apache/superset/pull/11090) refactor: Replace react-bootstrap tabs with Antd tabs (#11090) (@kgabryje)
- [#10924](https://github.com/apache/superset/pull/10924) perf(explore): render datasource details only when needed (#10924) (@ktmud)
- [#11139](https://github.com/apache/superset/pull/11139) style: override ace edit error icon (#11139) (@nytai)
### 0.38.0 (Mon Nov 17 07:23:54 2020 +00:00)
- [#11724](https://github.com/apache/superset/pull/11724) fix: prior npm font source had a glitch (#11724) (@rusackas)
- [#11718](https://github.com/apache/superset/pull/11718) refactor: Load fonts from packages rather than local binaries (#11718) (@rusackas)

View File

@@ -22,7 +22,9 @@ under the License.
This file documents any backwards-incompatible changes in Superset and
assists people when migrating to a new version.
## Next
## 1.0.0
- [11509](https://github.com/apache/superset/pull/12491): Dataset metadata updates check user ownership, only owners or an Admin are allowed.
- Security simplification (SIP-19), the following permission domains were simplified:
- [12072](https://github.com/apache/superset/pull/12072): `Query` with `can_read`, `can_write`
- [12036](https://github.com/apache/superset/pull/12036): `Database` with `can_read`, `can_write`.
@@ -42,6 +44,7 @@ assists people when migrating to a new version.
significantly more analytics events (roughly double?), and when
using DBEventLogger (default) could result in stressing the metadata
database more.
- [11509](https://github.com/apache/superset/pull/11509): Config value `TABLE_NAMES_CACHE_CONFIG` has been renamed to `DATA_CACHE_CONFIG`, which will now also hold query results cache from connected datasources (previously held in `CACHE_CONFIG`), in addition to the table names. If you will set `DATA_CACHE_CONFIG` to a new cache backend different than your previous `CACHE_CONFIG`, plan for additional cache warmup to avoid degrading charting performance for the end users.
- [11575](https://github.com/apache/superset/pull/11575) The Row Level Security (RLS) config flag has been moved to a feature flag. To migrate, add `ROW_LEVEL_SECURITY: True` to the `FEATURE_FLAGS` dict in `superset_config.py`.

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
x-superset-image: &superset-image apache/incubator-superset:latest-dev
x-superset-image: &superset-image apache/superset:latest-dev
x-superset-depends-on: &superset-depends-on
- db
- redis

View File

@@ -533,6 +533,8 @@ Here's a list of some of the recommended packages.
| Apache Pinot | ``"apache-superset[pinot]"`` | ``pinot+http://CONTROLLER:5436/`` |
| | | ``query?server=http://CONTROLLER:5983/`` |
+------------------+-------------------------------------------------------------------+-------------------------------------------------+
| Apache Solr | ``pip install sqlalchemy-solr`` | ``solr://`` |
+------------------+---------------------------------------+-----------------------------------------------------------------------------+
| Apache Spark SQL | ``"apache-superset[hive]"`` | ``jdbc+hive://`` |
+------------------+-------------------------------------------------------------------+-------------------------------------------------+
| BigQuery | ``"apache-superset[bigquery]"`` | ``bigquery://`` |
@@ -685,6 +687,13 @@ You should then be able to connect to your BigQuery datasets.
To be able to upload data, e.g. sample data, the python library `pandas_gbq` is required.
Apache Solr
------------
The connection string for Apache Solr looks like this ::
solr://{username}:{password}@{host}:{port}/{server_path}/{collection}[/?use_ssl=true|false]
Elasticsearch
-------------

View File

@@ -30,6 +30,7 @@ A list of some of the recommended packages.
|[Apache Impala](/docs/databases/impala)|```pip install impala```|```impala://{hostname}:{port}/{database}```|
|[Apache Kylin](/docs/databases/kylin)|```pip install kylinpy```|```kylin://<username>:<password>@<hostname>:<port>/<project>?<param1>=<value1>&<param2>=<value2>```|
|[Apache Pinot](/docs/databases/pinot)|```pip install pinotdb```|```pinot+http://CONTROLLER:5436/ query?server=http://CONTROLLER:5983/```|
|[Apache Solr](/docs/databases/solr)|```pip install sqlalchemy-solr```|```solr://{username}:{password}@{hostname}:{port}/{server_path}/{collection}```
|[Apache Spark SQL](/docs/databases/spark)|```pip install pyhive```|```hive://hive@{hostname}:{port}/{database}```
|[Azure MS SQL](/docs/databases/sqlserver)||```mssql+pymssql://UserName@presetSQL:TestPassword@presetSQL.database.windows.net:1433/TestSchema```
|[Big Query](/docs/databases/bigquery)|```pip install pybigquery```|```bigquery://{project_id}```|

View File

@@ -0,0 +1,18 @@
---
name: Apache Solr
menu: Connecting to Databases
route: /docs/databases/solr
index: 10
version: 1
---
## Apache Solr
The [sqlalchemy-solr](https://pypi.org/project/sqlalchemy-solr/) library provides a
Python / SQLAlchemy interface to Apache Solr.
The connection string for Solr looks like this:
```
solr://{username}:{password}@{host}:{port}/{server_path}/{collection}[/?use_ssl=true|false]
```

View File

@@ -2,7 +2,7 @@
name: Apache Spark SQL
menu: Connecting to Databases
route: /docs/databases/spark-sql
index: 10
index: 11
version: 1
---

View File

@@ -44,7 +44,7 @@ extraEnv: {}
configMountPath: "/app/pythonpath"
image:
repository: apache/incubator-superset
repository: apache/superset
tag: latest
pullPolicy: IfNotPresent

View File

@@ -123,6 +123,7 @@ setup(
"dremio": ["sqlalchemy-dremio>=1.1.5, <1.2"],
"drill": ["sqlalchemy-drill==0.1.dev"],
"druid": ["pydruid>=0.6.1,<0.7"],
"solr": ["sqlalchemy-solr >= 0.2.0"],
"elasticsearch": ["elasticsearch-dbapi>=0.1.0, <0.2.0"],
"exasol": ["sqlalchemy-exasol>=2.1.0, <2.2"],
"excel": ["xlrd>=1.2.0, <1.3"],

View File

@@ -135,6 +135,7 @@ module.exports = {
'react/no-unused-prop-types': 0,
'react/prop-types': 0,
'react/require-default-props': 0,
'react/sort-comp': 0, // TODO: re-enable in separate PR
'react/static-property-placement': 0, // re-enable up for discussion
'prettier/prettier': 'error',
},
@@ -246,6 +247,7 @@ module.exports = {
'react/no-unused-prop-types': 0,
'react/prop-types': 0,
'react/require-default-props': 0,
'react/sort-comp': 0, // TODO: re-enable in separate PR
'react/static-property-placement': 0, // disabled temporarily
'prettier/prettier': 'error',
},

View File

@@ -42,8 +42,9 @@ module.exports = {
plugins: [
'lodash',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-optional-chaining',
['@babel/plugin-proposal-class-properties', { loose: true }],
['@babel/plugin-proposal-optional-chaining', { loose: true }],
['@babel/plugin-proposal-private-methods', { loose: true }],
['@babel/plugin-transform-runtime', { corejs: 3 }],
'react-hot-loader/babel',
],

View File

@@ -40,9 +40,7 @@ describe('Dashboard filter', () => {
let filterId: number;
let aliases: string[];
const getAlias = (id: number) => {
return `@${DASHBOARD_CHART_ALIAS_PREFIX}${id}`;
};
const getAlias = (id: number) => `@${DASHBOARD_CHART_ALIAS_PREFIX}${id}`;
beforeEach(() => {
cy.server();
@@ -87,8 +85,8 @@ describe('Dashboard filter', () => {
});
cy.get('.filter_box button').click({ force: true });
cy.wait(aliases.filter(x => x !== getAlias(filterId))).then(requests => {
return Promise.all(
cy.wait(aliases.filter(x => x !== getAlias(filterId))).then(requests =>
Promise.all(
requests.map(async xhr => {
expect(xhr.status).to.eq(200);
const responseBody = await readResponseBlob(xhr.response.body);
@@ -108,8 +106,8 @@ describe('Dashboard filter', () => {
val: 'South Asia',
});
}),
);
});
),
);
// TODO add test with South Asia{enter} type action to select filter
});

View File

@@ -44,8 +44,8 @@ describe('Dashboard load', () => {
it('should load dashboard', () => {
// wait and verify one-by-one
cy.wait(aliases).then(requests => {
return Promise.all(
cy.wait(aliases).then(requests =>
Promise.all(
requests.map(async xhr => {
expect(xhr.status).to.eq(200);
const responseBody = await readResponseBlob(xhr.response.body);
@@ -65,7 +65,7 @@ describe('Dashboard load', () => {
.find(`#chart-id-${sliceId}`)
.should('be.visible');
}),
);
});
),
);
});
});

View File

@@ -39,8 +39,8 @@ describe('Dashboard form data', () => {
it('should apply url params to slice requests', () => {
const aliases = getChartAliases(dashboard.slices);
// wait and verify one-by-one
cy.wait(aliases).then(requests => {
return Promise.all(
cy.wait(aliases).then(requests =>
Promise.all(
requests.map(async xhr => {
expect(xhr.status).to.eq(200);
const responseBody = await readResponseBlob(xhr.response.body);
@@ -55,7 +55,7 @@ describe('Dashboard form data', () => {
});
}
}),
);
});
),
);
});
});

View File

@@ -35,13 +35,9 @@ describe('Advanced analytics', () => {
.find('input[type=text]')
.type('28 days{enter}');
cy.get('[data-test=time_compare]').find('.Select__control').click();
cy.get('[data-test=time_compare]')
.find('input[type=text]')
.type('364 days{enter}');
cy.get('[data-test=time_compare]')
.find('.Select__multi-value__label')
.contains('364 days');
.type('1 year{enter}');
cy.get('button[data-test="run-query-button"]').click();
cy.wait('@postJson');
@@ -51,10 +47,13 @@ describe('Advanced analytics', () => {
chartSelector: 'svg',
});
cy.get('[data-test=time_compare]').within(() => {
cy.get('.Select__multi-value__label').contains('364 days');
cy.get('.Select__multi-value__label').contains('28 days');
});
cy.get('.panel-title').contains('Advanced Analytics').click();
cy.get('[data-test=time_compare]')
.find('.Select__multi-value__label')
.contains('28 days');
cy.get('[data-test=time_compare]')
.find('.Select__multi-value__label')
.contains('1 year');
});
});

View File

@@ -24,9 +24,8 @@ import rison from 'rison';
import shortid from 'shortid';
import { HEALTH_POP_FORM_DATA_DEFAULTS } from './visualizations/shared.helper';
const apiURL = (endpoint, queryObject) => {
return `${endpoint}?q=${rison.encode(queryObject)}`;
};
const apiURL = (endpoint, queryObject) =>
`${endpoint}?q=${rison.encode(queryObject)}`;
describe('Test explore links', () => {
beforeEach(() => {

View File

@@ -48,9 +48,9 @@ Cypress.Commands.add('visitChartByName', name => {
});
});
Cypress.Commands.add('visitChartById', chartId => {
return cy.visit(`${BASE_EXPLORE_URL}{"slice_id": ${chartId}}`);
});
Cypress.Commands.add('visitChartById', chartId =>
cy.visit(`${BASE_EXPLORE_URL}{"slice_id": ${chartId}}`),
);
Cypress.Commands.add('visitChartByParams', params => {
const queryString =

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "superset",
"version": "0.999.0dev",
"version": "1.0.0",
"description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.",
"license": "Apache-2.0",
"directories": {
@@ -62,7 +62,7 @@
"homepage": "https://superset.apache.org/",
"dependencies": {
"@ant-design/icons": "^4.2.2",
"@babel/runtime-corejs3": "^7.8.4",
"@babel/runtime-corejs3": "^7.12.5",
"@data-ui/sparkline": "^0.0.84",
"@emotion/core": "^10.0.35",
"@superset-ui/chart-controls": "^0.16.4",
@@ -78,21 +78,20 @@
"@superset-ui/legacy-plugin-chart-map-box": "^0.16.4",
"@superset-ui/legacy-plugin-chart-paired-t-test": "^0.16.4",
"@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.16.4",
"@superset-ui/legacy-plugin-chart-partition": "^0.16.4",
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.16.4",
"@superset-ui/legacy-plugin-chart-rose": "^0.16.4",
"@superset-ui/legacy-plugin-chart-partition": "^0.16.6",
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.16.6",
"@superset-ui/legacy-plugin-chart-rose": "^0.16.6",
"@superset-ui/legacy-plugin-chart-sankey": "^0.16.4",
"@superset-ui/legacy-plugin-chart-sankey-loop": "^0.16.4",
"@superset-ui/legacy-plugin-chart-sunburst": "^0.16.4",
"@superset-ui/legacy-plugin-chart-treemap": "^0.16.4",
"@superset-ui/legacy-plugin-chart-world-map": "^0.16.4",
"@superset-ui/legacy-preset-chart-big-number": "^0.16.4",
"@superset-ui/legacy-preset-chart-deckgl": "^0.4.0",
"@superset-ui/legacy-preset-chart-nvd3": "^0.16.5",
"@superset-ui/legacy-preset-chart-big-number": "^0.16.6",
"@superset-ui/legacy-preset-chart-deckgl": "^0.4.1",
"@superset-ui/legacy-preset-chart-nvd3": "^0.16.6",
"@superset-ui/plugin-chart-echarts": "^0.16.4",
"@superset-ui/plugin-chart-table": "^0.16.4",
"@superset-ui/plugin-chart-word-cloud": "^0.16.4",
"@superset-ui/plugin-filter-antd": "^0.16.4",
"@superset-ui/preset-chart-xy": "^0.16.4",
"@vx/responsive": "^0.0.195",
"abortcontroller-polyfill": "^1.1.9",
@@ -150,6 +149,7 @@
"react-loadable": "^5.5.0",
"react-markdown": "^4.3.1",
"react-redux": "^7.2.0",
"react-resize-detector": "^6.0.1-rc.1",
"react-router-dom": "^5.1.2",
"react-search-input": "^0.11.3",
"react-select": "^3.1.0",
@@ -176,18 +176,18 @@
"use-query-params": "^1.1.9"
},
"devDependencies": {
"@babel/cli": "^7.11.5",
"@babel/compat-data": "^7.9.6",
"@babel/core": "^7.8.7",
"@babel/node": "^7.8.7",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-optional-chaining": "^7.8.3",
"@babel/cli": "^7.12.10",
"@babel/compat-data": "^7.12.7",
"@babel/core": "^7.12.10",
"@babel/node": "^7.12.10",
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/plugin-proposal-optional-chaining": "^7.12.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.8.3",
"@babel/preset-env": "^7.8.7",
"@babel/preset-react": "^7.8.3",
"@babel/register": "^7.8.6",
"@emotion/babel-preset-css-prop": "^10.0.27",
"@babel/plugin-transform-runtime": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"@babel/preset-react": "^7.12.10",
"@babel/register": "^7.12.10",
"@emotion/babel-preset-css-prop": "^10.2.1",
"@hot-loader/react-dom": "^16.13.0",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
"@storybook/addon-actions": "^6.0.13",
@@ -231,10 +231,10 @@
"@typescript-eslint/eslint-plugin": "^4.1.0",
"@typescript-eslint/parser": "^4.1.0",
"babel-eslint": "^10.1.0",
"babel-jest": "^26.1.0",
"babel-loader": "^8.0.6",
"babel-plugin-dynamic-import-node": "^2.3.0",
"babel-plugin-emotion": "^10.0.29",
"babel-jest": "^26.6.3",
"babel-loader": "^8.2.2",
"babel-plugin-dynamic-import-node": "^2.3.3",
"babel-plugin-emotion": "^10.0.33",
"babel-plugin-jsx-remove-data-test-id": "^2.1.3",
"babel-plugin-lodash": "^3.3.4",
"cache-loader": "^1.2.2",
@@ -245,20 +245,20 @@
"emotion-ts-plugin": "^0.5.3",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"eslint": "^7.8.1",
"eslint-config-airbnb": "^18.2.0",
"eslint-config-prettier": "^6.11.0",
"eslint": "^7.17.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-prettier": "^7.1.0",
"eslint-import-resolver-typescript": "^2.3.0",
"eslint-import-resolver-webpack": "^0.12.2",
"eslint-plugin-cypress": "^2.11.1",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-jest": "^23.17.1",
"eslint-plugin-jest-dom": "^3.2.4",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-no-only-tests": "^2.0.1",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-react": "^7.20.6",
"eslint-plugin-react-hooks": "^4.1.2",
"eslint-import-resolver-webpack": "^0.13.0",
"eslint-plugin-cypress": "^2.11.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jest": "^24.1.3",
"eslint-plugin-jest-dom": "^3.6.5",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-no-only-tests": "^2.4.0",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-testing-library": "^3.10.1",
"exports-loader": "^0.7.0",
"fetch-mock": "^7.7.3",
@@ -276,7 +276,7 @@
"node-fetch": "^2.6.1",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"po2json": "^0.4.5",
"prettier": "^2.1.1",
"prettier": "^2.2.1",
"react-test-renderer": "^16.9.0",
"redux-mock-store": "^1.5.4",
"sinon": "^9.0.2",

View File

@@ -62,8 +62,8 @@ describe('AsyncSelect', () => {
});
describe('auto select', () => {
it('should not call onChange if autoSelect=false', () => {
return new Promise(done => {
it('should not call onChange if autoSelect=false', () =>
new Promise(done => {
expect.assertions(2);
const onChangeSpy = jest.fn();
@@ -74,11 +74,10 @@ describe('AsyncSelect', () => {
expect(onChangeSpy.mock.calls).toHaveLength(0);
done();
});
});
});
}));
it('should auto select the first option if autoSelect=true', () => {
return new Promise(done => {
it('should auto select the first option if autoSelect=true', () =>
new Promise(done => {
expect.assertions(3);
const onChangeSpy = jest.fn();
@@ -94,11 +93,10 @@ describe('AsyncSelect', () => {
);
done();
});
});
});
}));
it('should not auto select when value prop is set and autoSelect=true', () => {
return new Promise(done => {
it('should not auto select when value prop is set and autoSelect=true', () =>
new Promise(done => {
expect.assertions(3);
const onChangeSpy = jest.fn();
@@ -117,8 +115,7 @@ describe('AsyncSelect', () => {
expect(wrapper.find(Select)).toExist();
done();
});
});
});
}));
it('should call onAsyncError if there is an error fetching options', () => {
expect.assertions(3);

View File

@@ -489,7 +489,7 @@ describe('dashboardLayout actions', () => {
});
describe('undoLayoutAction', () => {
it('should dispatch a redux-undo .undo() action ', () => {
it('should dispatch a redux-undo .undo() action', () => {
const { getState, dispatch } = setup({
dashboardLayout: { past: ['non-empty'] },
});
@@ -513,7 +513,7 @@ describe('dashboardLayout actions', () => {
});
describe('redoLayoutAction', () => {
it('should dispatch a redux-undo .redo() action ', () => {
it('should dispatch a redux-undo .redo() action', () => {
const { getState, dispatch } = setup();
const thunk = redoLayoutAction();
thunk(dispatch, getState);

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import React from 'react';
import { mount, shallow } from 'enzyme';
import { mount } from 'enzyme';
import ModalTrigger from 'src/components/ModalTrigger';
import RefreshIntervalModal from 'src/dashboard/components/RefreshIntervalModal';
@@ -66,11 +66,15 @@ describe('RefreshIntervalModal', () => {
refreshWarning: 'Show warning',
};
const wrapper = shallow(<RefreshIntervalModal {...props} />);
const wrapper = getMountWrapper(props);
wrapper.find('span[role="button"]').simulate('click');
wrapper.instance().handleFrequencyChange({ value: 30 });
expect(wrapper.find(ModalTrigger).dive().find(Alert)).toExist();
wrapper.update();
expect(wrapper.find(ModalTrigger).find(Alert)).toExist();
wrapper.instance().handleFrequencyChange({ value: 3601 });
expect(wrapper.find(ModalTrigger).dive().find(Alert)).not.toExist();
wrapper.update();
expect(wrapper.find(ModalTrigger).find(Alert)).not.toExist();
});
});

View File

@@ -26,7 +26,7 @@ describe('FilterConfigurationButton', () => {
const mockedProps = {
createNewOnOpen: false,
};
it('it is valid', () => {
it('is valid', () => {
expect(
React.isValidElement(<FilterConfigurationLink {...mockedProps} />),
).toBe(true);

View File

@@ -81,19 +81,24 @@ describe('ChangeDatasourceModal', () => {
});
it('fetches datasources', async () => {
expect(fetchMock.calls(/api\/v1\/dataset/)).toHaveLength(6);
expect(fetchMock.calls(/api\/v1\/dataset/)).toHaveLength(3);
});
it('renders confirmation message', async () => {
await waitForComponentToPaint(wrapper, 1000);
act(() => {
wrapper.find('[data-test="datasource-link"]').at(0).props().onClick();
});
await waitForComponentToPaint(wrapper);
expect(wrapper.find('.proceed-btn')).toExist();
});
it('changes the datasource', async () => {
await waitForComponentToPaint(wrapper, 1000);
act(() => {
wrapper.find('[data-test="datasource-link"]').at(0).props().onClick();
});

View File

@@ -64,8 +64,8 @@ describe('DatasourceEditor', () => {
expect(wrapper.find(Tabs)).toExist();
});
it('makes an async request', () => {
return new Promise(done => {
it('makes an async request', () =>
new Promise(done => {
wrapper.setState({ activeTabKey: 2 });
const syncButton = wrapper.find('.sync-from-source');
expect(syncButton).toHaveLength(1);
@@ -76,8 +76,7 @@ describe('DatasourceEditor', () => {
fetchMock.reset();
done();
}, 0);
});
});
}));
it('to add, remove and modify columns accordingly', () => {
const columns = [

View File

@@ -29,10 +29,9 @@ import Button from 'src/components/Button';
import sinon from 'sinon';
import fetchMock from 'fetch-mock';
import Modal from 'src/common/components/Modal';
import * as exploreUtils from 'src/explore/exploreUtils';
import * as saveModalActions from 'src/explore/actions/saveModalActions';
import SaveModal from 'src/explore/components/SaveModal';
import SaveModal, { StyledModal } from 'src/explore/components/SaveModal';
describe('SaveModal', () => {
const middlewares = [thunk];
@@ -79,11 +78,11 @@ describe('SaveModal', () => {
it('renders a Modal with the right set of components', () => {
const wrapper = getWrapper();
expect(wrapper.find(Modal)).toExist();
expect(wrapper.find(StyledModal)).toExist();
expect(wrapper.find(FormControl)).toExist();
expect(wrapper.find(Radio)).toHaveLength(2);
const footerWrapper = shallow(wrapper.find('Modal').props().footer);
const footerWrapper = shallow(wrapper.find(StyledModal).props().footer);
expect(footerWrapper.find(Button)).toHaveLength(3);
});
@@ -201,8 +200,8 @@ describe('SaveModal', () => {
Object.defineProperty(window, 'location', windowLocation);
});
it('Save & go to dashboard', () => {
return new Promise(done => {
it('Save & go to dashboard', () =>
new Promise(done => {
wrapper.instance().saveOrOverwrite(true);
defaultProps.actions.saveSlice().then(() => {
expect(window.location.assign.callCount).toEqual(1);
@@ -211,11 +210,10 @@ describe('SaveModal', () => {
);
done();
});
});
});
}));
it('saveas new slice', () => {
return new Promise(done => {
it('saveas new slice', () =>
new Promise(done => {
wrapper.setState({
action: 'saveas',
newSliceName: 'new slice name',
@@ -228,11 +226,10 @@ describe('SaveModal', () => {
);
done();
});
});
});
}));
it('overwrite original slice', () => {
return new Promise(done => {
it('overwrite original slice', () =>
new Promise(done => {
wrapper.setState({ action: 'overwrite' });
wrapper.instance().saveOrOverwrite(false);
defaultProps.actions.saveSlice().then(() => {
@@ -242,8 +239,7 @@ describe('SaveModal', () => {
);
done();
});
});
});
}));
});
});

View File

@@ -112,7 +112,7 @@ describe('SelectControl', () => {
placeholder="add something"
/>,
);
expect(withMulti.html()).not.toContain('placeholder=');
expect(withMulti.html()).not.toContain('option(s');
});
});
describe('withSingleChoice', () => {
@@ -125,7 +125,7 @@ describe('SelectControl', () => {
placeholder="add something"
/>,
);
expect(singleChoice.html()).not.toContain('placeholder=');
expect(singleChoice.html()).not.toContain('option(s');
});
});
describe('default placeholder', () => {
@@ -133,7 +133,7 @@ describe('SelectControl', () => {
const defaultPlaceholder = mount(
<SelectControl {...defaultProps} choices={[]} multi />,
);
expect(defaultPlaceholder.html()).not.toContain('placeholder=');
expect(defaultPlaceholder.html()).not.toContain('option(s');
});
});
describe('all choices selected', () => {
@@ -145,12 +145,12 @@ describe('SelectControl', () => {
value={['today', '1 year ago']}
/>,
);
expect(allChoicesSelected.html()).toContain('placeholder=""');
expect(allChoicesSelected.html()).not.toContain('option(s');
});
});
});
describe('when select is multi', () => {
it('renders the placeholder when a selection has been made', () => {
it('does not render the placeholder when a selection has been made', () => {
wrapper = mount(
<SelectControl
{...defaultProps}
@@ -159,7 +159,7 @@ describe('SelectControl', () => {
placeholder="add something"
/>,
);
expect(wrapper.html()).toContain('add something');
expect(wrapper.html()).not.toContain('add something');
});
it('shows numbers of options as a placeholder by default', () => {
wrapper = mount(<SelectControl {...defaultProps} multi />);

View File

@@ -57,9 +57,9 @@ const defaultProps = {
function verify(sourceProp: string) {
const mock = jest.fn();
mock.mockImplementation(async (props: ControlPropsWithExtras) => {
return { [sourceProp]: props.validMetrics || [VALID_METRIC] };
});
mock.mockImplementation(async (props: ControlPropsWithExtras) => ({
[sourceProp]: props.validMetrics || [VALID_METRIC],
}));
return mock;
}

View File

@@ -43,8 +43,8 @@ describe('Toast', () => {
expect(alert.childAt(0).childAt(1).text()).toBe(props.toast.text);
});
it('should call onCloseToast upon alert dismissal', () => {
return new Promise(done => {
it('should call onCloseToast upon alert dismissal', () =>
new Promise(done => {
const onCloseToast = id => {
expect(id).toBe(props.toast.id);
done();
@@ -57,6 +57,5 @@ describe('Toast', () => {
const alertProps = wrapper.find(Alert).props();
expect(alertProps.onDismiss).toBe(handleClosePress);
handleClosePress(); // there is a timeout for onCloseToast to be called
});
});
}));
});

View File

@@ -50,7 +50,7 @@ describe('SaveDatasetModal', () => {
const wrapper = shallow(<SaveDatasetModal {...mockedProps} />);
expect(wrapper.find(AutoComplete)).toExist();
});
it('renders an input form ', () => {
it('renders an input form', () => {
// @ts-ignore
const wrapper = shallow(<SaveDatasetModal {...mockedProps} />);
expect(wrapper.find(Input)).toExist();

View File

@@ -20,7 +20,7 @@ import React from 'react';
import configureStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { styledShallow as shallow } from 'spec/helpers/theming';
import SouthPaneContainer, { SouthPane } from 'src/SqlLab/components/SouthPane';
import SouthPaneContainer from 'src/SqlLab/components/SouthPane';
import ResultSet from 'src/SqlLab/components/ResultSet';
import { STATUS_OPTIONS } from 'src/SqlLab/constants';
import { initialState } from './fixtures';
@@ -80,12 +80,6 @@ describe('SouthPane', () => {
let wrapper;
beforeAll(() => {
jest
.spyOn(SouthPane.prototype, 'getSouthPaneHeight')
.mockImplementation(() => 500);
});
it('should render offline when the state is offline', () => {
wrapper = getWrapper();
wrapper.setProps({ offline: true });

View File

@@ -86,7 +86,7 @@ describe('sqlLabReducer', () => {
newState = sqlLabReducer(newState, action);
expect(newState.queryEditors[1].schema).toBe(schema);
});
it('should not fail while setting autorun ', () => {
it('should not fail while setting autorun', () => {
const action = {
type: actions.QUERY_EDITOR_SET_AUTORUN,
queryEditor: qe,

View File

@@ -21,9 +21,7 @@ import parseCookie from 'src/utils/parseCookie';
describe('parseCookie', () => {
let cookieVal = '';
Object.defineProperty(document, 'cookie', {
get: jest.fn().mockImplementation(() => {
return cookieVal;
}),
get: jest.fn().mockImplementation(() => cookieVal),
});
it('parses cookie strings', () => {
cookieVal = 'val1=foo; val2=bar';

View File

@@ -70,13 +70,13 @@ describe('ActivityTable', () => {
await waitForComponentToPaint(wrapper);
});
it('the component renders ', () => {
it('the component renders', () => {
expect(wrapper.find(ActivityTable)).toExist();
});
it('renders tabs with three buttons', () => {
expect(wrapper.find('li')).toHaveLength(3);
});
it('it renders ActivityCards', async () => {
it('renders ActivityCards', async () => {
expect(wrapper.find('ListViewCard')).toExist();
});
});

View File

@@ -58,11 +58,11 @@ describe('ChartTable', () => {
},
};
const wrapper = mount(<ChartTable store={store} {...mockedProps} />);
it('it renders', () => {
it('renders', () => {
expect(wrapper.find(ChartTable)).toExist();
});
it('fetches chart favorites and renders chart cards ', async () => {
it('fetches chart favorites and renders chart cards', async () => {
act(() => {
const handler = wrapper.find('li.no-router a').at(0).prop('onClick');
if (handler) {

View File

@@ -103,7 +103,7 @@ describe('SavedQueries', () => {
expect(wrapper.find('ListViewCard')).toExist();
});
it('it renders a submenu with clickable tables and buttons', async () => {
it('renders a submenu with clickable tables and buttons', async () => {
expect(wrapper.find(SubMenu)).toExist();
expect(wrapper.find('li')).toHaveLength(1);
expect(wrapper.find('button')).toHaveLength(2);

View File

@@ -184,9 +184,8 @@ export default class ResultSet extends React.PureComponent<
}
}
getDefaultDatasetName = () => {
return `${this.props.query.tab} ${moment().format('MM/DD/YYYY HH:mm:ss')}`;
};
getDefaultDatasetName = () =>
`${this.props.query.tab} ${moment().format('MM/DD/YYYY HH:mm:ss')}`;
handleOnChangeAutoComplete = () => {
this.setState({ datasetToOverwrite: {} });
@@ -341,9 +340,7 @@ export default class ResultSet extends React.PureComponent<
handleFilterAutocompleteOption = (
inputValue: string,
option: { value: string; datasetId: number },
) => {
return option.value.toLowerCase().includes(inputValue.toLowerCase());
};
) => option.value.toLowerCase().includes(inputValue.toLowerCase());
clearQueryResults(query: Query) {
this.props.actions.clearQueryResults(query);

View File

@@ -91,84 +91,82 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({
filterAutocompleteOption,
userDatasetOptions,
onChangeAutoComplete,
}) => {
return (
<StyledModal
show={visible}
title="Save or Overwrite Dataset"
onHide={onHide}
footer={
<>
{!shouldOverwriteDataset && (
<Button
disabled={disableSaveAndExploreBtn}
buttonSize="medium"
buttonStyle="primary"
onClick={onOk}
>
{t('Save & Explore')}
</Button>
)}
{shouldOverwriteDataset && (
<>
<Button buttonSize="medium" onClick={handleOverwriteCancel}>
Back
</Button>
<Button
className="md"
buttonSize="medium"
buttonStyle="primary"
onClick={handleOverwriteDataset}
disabled={disableSaveAndExploreBtn}
>
{t('Overwrite & Explore')}
</Button>
</>
)}
</>
}
>
<Styles>
}) => (
<StyledModal
show={visible}
title="Save or Overwrite Dataset"
onHide={onHide}
footer={
<>
{!shouldOverwriteDataset && (
<div className="smd-body">
<div className="smd-prompt">
Save this query as virtual dataset to continue exploring.
</div>
<Radio.Group
onChange={handleSaveDatasetRadioBtnState}
value={saveDatasetRadioBtnState}
>
<Radio className="smd-radio" value={1}>
Save as new
<Input
className="smd-input"
defaultValue={defaultCreateDatasetValue}
onChange={handleDatasetNameChange}
disabled={saveDatasetRadioBtnState !== 1}
/>
</Radio>
<Radio className="smd-radio" value={2}>
Overwrite existing
<AutoComplete
className="smd-autocomplete"
options={userDatasetOptions}
onSelect={handleOverwriteDatasetOption}
onSearch={handleSaveDatasetModalSearch}
onChange={onChangeAutoComplete}
placeholder="Select or type dataset name"
filterOption={filterAutocompleteOption}
disabled={saveDatasetRadioBtnState !== 2}
/>
</Radio>
</Radio.Group>
</div>
<Button
disabled={disableSaveAndExploreBtn}
buttonSize="medium"
buttonStyle="primary"
onClick={onOk}
>
{t('Save & Explore')}
</Button>
)}
{shouldOverwriteDataset && (
<div className="smd-overwrite-msg">
Are you sure you want to overwrite this dataset?
</div>
<>
<Button buttonSize="medium" onClick={handleOverwriteCancel}>
Back
</Button>
<Button
className="md"
buttonSize="medium"
buttonStyle="primary"
onClick={handleOverwriteDataset}
disabled={disableSaveAndExploreBtn}
>
{t('Overwrite & Explore')}
</Button>
</>
)}
</Styles>
</StyledModal>
);
};
</>
}
>
<Styles>
{!shouldOverwriteDataset && (
<div className="smd-body">
<div className="smd-prompt">
Save this query as virtual dataset to continue exploring.
</div>
<Radio.Group
onChange={handleSaveDatasetRadioBtnState}
value={saveDatasetRadioBtnState}
>
<Radio className="smd-radio" value={1}>
Save as new
<Input
className="smd-input"
defaultValue={defaultCreateDatasetValue}
onChange={handleDatasetNameChange}
disabled={saveDatasetRadioBtnState !== 1}
/>
</Radio>
<Radio className="smd-radio" value={2}>
Overwrite existing
<AutoComplete
className="smd-autocomplete"
options={userDatasetOptions}
onSelect={handleOverwriteDatasetOption}
onSearch={handleSaveDatasetModalSearch}
onChange={onChangeAutoComplete}
placeholder="Select or type dataset name"
filterOption={filterAutocompleteOption}
disabled={saveDatasetRadioBtnState !== 2}
/>
</Radio>
</Radio.Group>
</div>
)}
{shouldOverwriteDataset && (
<div className="smd-overwrite-msg">
Are you sure you want to overwrite this dataset?
</div>
)}
</Styles>
</StyledModal>
);

View File

@@ -79,13 +79,11 @@ export default function SaveQuery({
const [showSave, setShowSave] = useState<boolean>(false);
const isSaved = !!query.remoteId;
const queryPayload = () => {
return {
...query,
title: label,
description,
};
};
const queryPayload = () => ({
...query,
title: label,
description,
});
const close = () => {
setShowSave(false);
@@ -113,47 +111,45 @@ export default function SaveQuery({
setShowSave(!showSave);
};
const renderModalBody = () => {
return (
<FormGroup bsSize="small">
<Row>
<Col md={12}>
<small>
<FormLabel htmlFor="embed-height">{t('Name')}</FormLabel>
</small>
<FormControl type="text" value={label} onChange={onLabelChange} />
</Col>
</Row>
<br />
<Row>
<Col md={12}>
<small>
<FormLabel htmlFor="embed-height">{t('Description')}</FormLabel>
</small>
<FormControl
rows={5}
componentClass="textarea"
value={description}
onChange={onDescriptionChange}
/>
</Col>
</Row>
{saveQueryWarning && (
<>
const renderModalBody = () => (
<FormGroup bsSize="small">
<Row>
<Col md={12}>
<small>
<FormLabel htmlFor="embed-height">{t('Name')}</FormLabel>
</small>
<FormControl type="text" value={label} onChange={onLabelChange} />
</Col>
</Row>
<br />
<Row>
<Col md={12}>
<small>
<FormLabel htmlFor="embed-height">{t('Description')}</FormLabel>
</small>
<FormControl
rows={5}
componentClass="textarea"
value={description}
onChange={onDescriptionChange}
/>
</Col>
</Row>
{saveQueryWarning && (
<>
<br />
<div>
<Row>
<Col md={12}>
<small>{saveQueryWarning}</small>
</Col>
</Row>
<br />
<div>
<Row>
<Col md={12}>
<small>{saveQueryWarning}</small>
</Col>
</Row>
<br />
</div>
</>
)}
</FormGroup>
);
};
</div>
</>
)}
</FormGroup>
);
return (
<Styles className="SaveQuery">

View File

@@ -86,26 +86,10 @@ const StyledPane = styled.div`
export class SouthPane extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
height: props.height,
};
this.southPaneRef = React.createRef();
this.getSouthPaneHeight = this.getSouthPaneHeight.bind(this);
this.switchTab = this.switchTab.bind(this);
}
UNSAFE_componentWillReceiveProps() {
// south pane expands the entire height of the tab content on mount
this.setState({ height: this.getSouthPaneHeight() });
}
// One layer of abstraction for easy spying in unit tests
getSouthPaneHeight() {
return this.southPaneRef.current
? this.southPaneRef.current.clientHeight
: 0;
}
switchTab(id) {
this.props.actions.setActiveSouthPaneTab(id);
}
@@ -121,7 +105,7 @@ export class SouthPane extends React.PureComponent {
</Label>
);
}
const innerTabContentHeight = this.state.height - TAB_HEIGHT;
const innerTabContentHeight = this.props.height - TAB_HEIGHT;
let latestQuery;
const { props } = this;
if (props.editorQueries.length > 0) {

View File

@@ -148,13 +148,13 @@ const legacyChartDataRequest = async (
'GET' && isFeatureEnabled(FeatureFlag.CLIENT_CACHE)
? SupersetClient.get
: SupersetClient.post;
return clientMethod(querySettings).then(({ json }) => {
return clientMethod(querySettings).then(({ json }) =>
// Make the legacy endpoint return a payload that corresponds to the
// V1 chart data endpoint response signature.
return {
({
result: [json],
};
});
}),
);
};
const v1ChartDataRequest = async (
@@ -195,9 +195,7 @@ const v1ChartDataRequest = async (
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
};
return SupersetClient.post(querySettings).then(({ json }) => {
return json;
});
return SupersetClient.post(querySettings).then(({ json }) => json);
};
export async function getChartDataRequest({

View File

@@ -41,11 +41,13 @@ interface ModalProps {
centered?: boolean;
footer?: React.ReactNode;
wrapProps?: object;
height?: string;
}
interface StyledModalProps extends SupersetThemeProps {
maxWidth?: string;
responsive?: boolean;
height?: string;
}
export const StyledModal = styled(BaseModal)<StyledModalProps>`
@@ -87,6 +89,7 @@ export const StyledModal = styled(BaseModal)<StyledModalProps>`
.ant-modal-body {
padding: ${({ theme }) => theme.gridUnit * 4}px;
overflow: auto;
${({ height }) => height && `height: ${height};`}
}
.ant-modal-footer {

View File

@@ -70,6 +70,4 @@ export type ErrorMessageComponentProps<
source?: ErrorSource;
};
export type ErrorMessageComponent = React.ComponentType<
ErrorMessageComponentProps
>;
export type ErrorMessageComponent = React.ComponentType<ErrorMessageComponentProps>;

View File

@@ -55,6 +55,6 @@ const users = [...new Array(10)].map((_, i) => ({
id: i,
}));
export const SupersetFacePile = () => {
return <FacePile users={users} maxCount={number('maxCount', 4)} />;
};
export const SupersetFacePile = () => (
<FacePile users={users} maxCount={number('maxCount', 4)} />
);

View File

@@ -61,26 +61,24 @@ const IconBlock = styled.div`
}
`;
export const SupersetIcon = () => {
return (
<IconSet>
{Object.keys(iconsRegistry)
.sort()
.map(iconName => (
<IconBlock key={iconName}>
<Icon
name={iconName}
key={iconName}
color={select(
colorKnob.label,
colorKnob.options,
colorKnob.defaultValue,
colorKnob.groupId,
)}
/>
<div>{iconName}</div>
</IconBlock>
))}
</IconSet>
);
};
export const SupersetIcon = () => (
<IconSet>
{Object.keys(iconsRegistry)
.sort()
.map(iconName => (
<IconBlock key={iconName}>
<Icon
name={iconName}
key={iconName}
color={select(
colorKnob.label,
colorKnob.options,
colorKnob.defaultValue,
colorKnob.groupId,
)}
/>
<div>{iconName}</div>
</IconBlock>
))}
</IconSet>
);

View File

@@ -93,7 +93,7 @@ const SupersetLabel = styled(BootstrapLabel)`
background-color: ${({ theme }) => theme.colors.grayscale.light3};
color: ${({ theme }) => theme.colors.grayscale.dark1};
border-color: ${({ theme, onClick }) =>
onClick ? theme.colors.grayscale.light1 : 'transparent'};
onClick ? theme.colors.grayscale.light2 : 'transparent'};
&:hover {
background-color: ${({ theme, onClick }) =>
onClick ? theme.colors.primary.light2 : theme.colors.grayscale.light3};

View File

@@ -68,9 +68,9 @@ export default function CardCollection({
<CardContainer>
{loading &&
rows.length === 0 &&
[...new Array(25)].map((e, i) => {
return <div key={i}>{renderCard({ loading })}</div>;
})}
[...new Array(25)].map((e, i) => (
<div key={i}>{renderCard({ loading })}</div>
))}
{rows.length > 0 &&
rows.map(row => {
if (!renderCard) return null;

View File

@@ -28,10 +28,10 @@ export const FilterContainer = styled.div`
display: inline-flex;
margin-right: 2em;
font-size: ${({ theme }) => theme.typography.sizes.s}px;
align-items: center;
`;
export const FilterTitle = styled.label`
font-weight: bold;
line-height: 27px;
margin: 0 0.4em 0 0;
`;

View File

@@ -174,34 +174,32 @@ const ViewModeToggle = ({
}: {
mode: 'table' | 'card';
setMode: (mode: 'table' | 'card') => void;
}) => {
return (
<ViewModeContainer>
<div
role="button"
tabIndex={0}
onClick={e => {
e.currentTarget.blur();
setMode('card');
}}
className={cx('toggle-button', { active: mode === 'card' })}
>
<Icon name="card-view" />
</div>
<div
role="button"
tabIndex={0}
onClick={e => {
e.currentTarget.blur();
setMode('table');
}}
className={cx('toggle-button', { active: mode === 'table' })}
>
<Icon name="list-view" />
</div>
</ViewModeContainer>
);
};
}) => (
<ViewModeContainer>
<div
role="button"
tabIndex={0}
onClick={e => {
e.currentTarget.blur();
setMode('card');
}}
className={cx('toggle-button', { active: mode === 'card' })}
>
<Icon name="card-view" />
</div>
<div
role="button"
tabIndex={0}
onClick={e => {
e.currentTarget.blur();
setMode('table');
}}
className={cx('toggle-button', { active: mode === 'table' })}
>
<Icon name="list-view" />
</div>
</ViewModeContainer>
);
export interface ListViewProps<T extends object = any> {
columns: any[];

View File

@@ -41,49 +41,43 @@ const imgFallbackKnob = {
defaultValue: DashboardImg,
};
export const SupersetListViewCard = () => {
return (
<ListViewCard
title="Superset Card Title"
loading={boolean('loading', false)}
url="/superset/dashboard/births/"
imgURL={text('imgURL', 'https://picsum.photos/800/600')}
imgFallbackURL={select(
imgFallbackKnob.label,
imgFallbackKnob.options,
imgFallbackKnob.defaultValue,
)}
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit..."
coverLeft="Left Section"
coverRight="Right Section"
actions={
<ListViewCard.Actions>
<FaveStar
itemId={0}
fetchFaveStar={action('fetchFaveStar')}
saveFaveStar={action('saveFaveStar')}
isStarred={boolean('isStarred', false)}
/>
<Dropdown
overlay={
<Menu>
<Menu.Item
role="button"
tabIndex={0}
onClick={action('Delete')}
>
<ListViewCard.MenuIcon name="trash" /> Delete
</Menu.Item>
<Menu.Item role="button" tabIndex={0} onClick={action('Edit')}>
<ListViewCard.MenuIcon name="edit-alt" /> Edit
</Menu.Item>
</Menu>
}
>
<Icon name="more-horiz" />
</Dropdown>
</ListViewCard.Actions>
}
/>
);
};
export const SupersetListViewCard = () => (
<ListViewCard
title="Superset Card Title"
loading={boolean('loading', false)}
url="/superset/dashboard/births/"
imgURL={text('imgURL', 'https://picsum.photos/800/600')}
imgFallbackURL={select(
imgFallbackKnob.label,
imgFallbackKnob.options,
imgFallbackKnob.defaultValue,
)}
description="Lorem ipsum dolor sit amet, consectetur adipiscing elit..."
coverLeft="Left Section"
coverRight="Right Section"
actions={
<ListViewCard.Actions>
<FaveStar
itemId={0}
fetchFaveStar={action('fetchFaveStar')}
saveFaveStar={action('saveFaveStar')}
isStarred={boolean('isStarred', false)}
/>
<Dropdown
overlay={
<Menu>
<Menu.Item role="button" tabIndex={0} onClick={action('Delete')}>
<ListViewCard.MenuIcon name="trash" /> Delete
</Menu.Item>
<Menu.Item role="button" tabIndex={0} onClick={action('Edit')}>
<ListViewCard.MenuIcon name="edit-alt" /> Edit
</Menu.Item>
</Menu>
}
>
<Icon name="more-horiz" />
</Dropdown>
</ListViewCard.Actions>
}
/>
);

View File

@@ -49,45 +49,43 @@ export default {
},
};
export const SelectGallery = ({ value }: { value: OptionTypeBase }) => {
return (
<>
<h4>With default value</h4>
<Select
value={OPTIONS[0]}
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one"
width={600}
/>
<hr />
<h4>With no value</h4>
<Select
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one"
width={600}
value={value}
/>
<hr />
<h4>Multi select</h4>
<Select
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one or more values"
width={600}
value={[OPTIONS[0]]}
multi
/>
</>
);
};
export const SelectGallery = ({ value }: { value: OptionTypeBase }) => (
<>
<h4>With default value</h4>
<Select
value={OPTIONS[0]}
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one"
width={600}
/>
<hr />
<h4>With no value</h4>
<Select
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one"
width={600}
value={value}
/>
<hr />
<h4>Multi select</h4>
<Select
ignoreAccents={false}
name="select-datasource"
onChange={() => {}}
options={OPTIONS}
placeholder="choose one or more values"
width={600}
value={[OPTIONS[0]]}
multi
/>
</>
);
SelectGallery.args = {
value: '',

View File

@@ -76,6 +76,7 @@ export type SupersetStyledSelectProps<
// additional props for easier usage or backward compatibility
labelKey?: string;
valueKey?: string;
assistiveText?: string;
multi?: boolean;
clearable?: boolean;
sortable?: boolean;
@@ -99,9 +100,9 @@ function styled<
OptionType extends OptionTypeBase,
SelectComponentType extends
| WindowedSelectComponentType<OptionType>
| ComponentType<SelectProps<OptionType>> = WindowedSelectComponentType<
OptionType
>
| ComponentType<
SelectProps<OptionType>
> = WindowedSelectComponentType<OptionType>
>(SelectComponent: SelectComponentType) {
type SelectProps = SupersetStyledSelectProps<OptionType>;
type Components = SelectComponents<OptionType>;
@@ -113,8 +114,8 @@ function styled<
// default components for the given OptionType
const supersetDefaultComponents: SelectComponentsConfig<OptionType> = DEFAULT_COMPONENTS;
const getSortableMultiValue = (MultiValue: Components['MultiValue']) => {
return SortableElement((props: MultiValueProps<OptionType>) => {
const getSortableMultiValue = (MultiValue: Components['MultiValue']) =>
SortableElement((props: MultiValueProps<OptionType>) => {
const onMouseDown = (e: SyntheticEvent) => {
e.preventDefault();
e.stopPropagation();
@@ -122,7 +123,6 @@ function styled<
const innerProps = { onMouseDown };
return <MultiValue {...props} innerProps={innerProps} />;
});
};
/**
* Superset styled `Select` component. Apply Superset themed stylesheets and

View File

@@ -125,9 +125,7 @@ export default function WindowedMenuList<OptionType extends OptionTypeBase>({
data,
index,
style,
}) => {
return <div style={style}>{data[index]}</div>;
};
}) => <div style={style}>{data[index]}</div>;
useEffect(() => {
const lastSelected = getLastSelected(children);

View File

@@ -91,21 +91,19 @@ export type PartialThemeConfig = RecursivePartial<ThemeConfig>;
export const defaultTheme: (
theme: SupersetTheme,
) => PartialThemeConfig = theme => {
return {
borderRadius: theme.borderRadius,
zIndex: 11,
colors: colors(theme),
spacing: {
baseUnit: 3,
menuGutter: 0,
controlHeight: 28,
lineHeight: 19,
fontSize: 14,
minWidth: '7.5em', // just enough to display 'No options'
},
};
};
) => PartialThemeConfig = theme => ({
borderRadius: theme.borderRadius,
zIndex: 11,
colors: colors(theme),
spacing: {
baseUnit: 3,
menuGutter: 0,
controlHeight: 34,
lineHeight: 19,
fontSize: 14,
minWidth: '7.5em', // just enough to display 'No options'
},
});
// let styles accept serialized CSS, too
type CSSStyles = CSSProperties | SerializedStyles;
@@ -162,9 +160,9 @@ export const DEFAULT_STYLES: PartialStylesConfig = {
{ isFocused, menuIsOpen, theme: { borderRadius, colors } },
) => {
const isPseudoFocused = isFocused && !menuIsOpen;
let borderColor = '#ccc';
let borderColor = colors.grayBorder;
if (isPseudoFocused) {
borderColor = '#000';
borderColor = colors.grayBorderDark;
} else if (menuIsOpen) {
borderColor = `${colors.grayBorderDark} ${colors.grayBorder} ${colors.grayBorderLight}`;
}
@@ -183,6 +181,7 @@ export const DEFAULT_STYLES: PartialStylesConfig = {
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);
}
flex-wrap: nowrap;
padding-left: 1px;
`,
];
},
@@ -314,9 +313,31 @@ const {
DropdownIndicator,
Option,
Input,
SelectContainer,
} = defaultComponents as Required<DeepNonNullable<SelectComponentsType>>;
export const DEFAULT_COMPONENTS: SelectComponentsType = {
SelectContainer: ({ children, ...props }) => {
const {
selectProps: { assistiveText },
} = props;
return (
<div>
<SelectContainer {...props}>{children}</SelectContainer>
{assistiveText && (
<span
css={(theme: SupersetTheme) => ({
marginLeft: 3,
fontSize: theme.typography.sizes.s,
color: theme.colors.grayscale.light1,
})}
>
{assistiveText}
</span>
)}
</div>
);
},
Option: ({ children, innerProps, data, ...props }) => (
<ClassNames>
{({ css }) => (
@@ -346,22 +367,13 @@ export const DEFAULT_COMPONENTS: SelectComponentsType = {
</DropdownIndicator>
),
Input: (props: InputProps) => {
const {
selectProps: { isMulti, value, placeholder },
getStyles,
} = props;
const isMultiWithValue = isMulti && Array.isArray(value) && !!value.length;
const { getStyles } = props;
return (
<Input
{...props}
placeholder={isMultiWithValue ? placeholder : undefined}
css={getStyles('input', props)}
autoComplete="chrome-off"
inputStyle={
isMultiWithValue
? { ...INPUT_TAG_BASE_STYLES, width: '100%' }
: INPUT_TAG_BASE_STYLES
}
inputStyle={INPUT_TAG_BASE_STYLES}
/>
);
},

View File

@@ -90,11 +90,10 @@ export default function SupersetResourceSelect<T, V>({
return cachedSupersetGet({
endpoint: `/api/v1/${resource}/?q=${query}`,
}).then(
response => {
return response.json.result
response =>
response.json.result
.map(transformItem)
.sort((a: Value<V>, b: Value<V>) => a.label.localeCompare(b.label));
},
.sort((a: Value<V>, b: Value<V>) => a.label.localeCompare(b.label)),
async badResponse => {
onError(await getClientErrorObject(badResponse));
return [];

View File

@@ -74,17 +74,15 @@ export function fetchAllSlices(userId) {
const slices = {};
json.result.forEach(slice => {
let form_data = JSON.parse(slice.params);
let { datasource } = form_data;
if (!datasource) {
datasource = getDatasourceParameter(
slice.datasource_id,
slice.datasource_type,
);
form_data = {
...form_data,
datasource,
};
}
form_data = {
...form_data,
// force using datasource stored in relational table prop
datasource:
getDatasourceParameter(
slice.datasource_id,
slice.datasource_type,
) || form_data.datasource,
};
slices[slice.id] = {
slice_id: slice.id,
slice_url: slice.url,
@@ -93,6 +91,8 @@ export function fetchAllSlices(userId) {
form_data,
datasource_name: slice.datasource_name_text,
datasource_url: slice.datasource_url,
datasource_id: slice.datasource_id,
datasource_type: slice.datasource_type,
changed_on: new Date(slice.changed_on_utc).getTime(),
description: slice.description,
description_markdown: slice.description_markeddown,

View File

@@ -43,56 +43,52 @@ const BuilderComponentPaneTabs = styled(Tabs)`
margin-top: ${({ theme }) => theme.gridUnit * 2}px;
`;
const BuilderComponentPane: React.FC<BCPProps> = ({ topOffset = 0 }) => {
return (
<div
className="dashboard-builder-sidepane"
style={{
height: `calc(100vh - ${topOffset + SUPERSET_HEADER_HEIGHT}px)`,
}}
>
<ParentSize>
{({ height }) => (
<StickyContainer>
<Sticky topOffset={-topOffset} bottomOffset={Infinity}>
{({ style, isSticky }: { style: any; isSticky: boolean }) => (
<div
className="viewport"
style={isSticky ? { ...style, top: topOffset } : null}
const BuilderComponentPane: React.FC<BCPProps> = ({ topOffset = 0 }) => (
<div
className="dashboard-builder-sidepane"
style={{
height: `calc(100vh - ${topOffset + SUPERSET_HEADER_HEIGHT}px)`,
}}
>
<ParentSize>
{({ height }) => (
<StickyContainer>
<Sticky topOffset={-topOffset} bottomOffset={Infinity}>
{({ style, isSticky }: { style: any; isSticky: boolean }) => (
<div
className="viewport"
style={isSticky ? { ...style, top: topOffset } : null}
>
<BuilderComponentPaneTabs
id="tabs"
className="tabs-components"
data-test="dashboard-builder-component-pane-tabs-navigation"
>
<BuilderComponentPaneTabs
id="tabs"
className="tabs-components"
data-test="dashboard-builder-component-pane-tabs-navigation"
<Tabs.TabPane key={1} tab={t('Components')}>
<NewTabs />
<NewRow />
<NewColumn />
<NewHeader />
<NewMarkdown />
<NewDivider />
</Tabs.TabPane>
<Tabs.TabPane
key={2}
tab={t('Charts')}
className="tab-charts"
>
<Tabs.TabPane key={1} tab={t('Components')}>
<NewTabs />
<NewRow />
<NewColumn />
<NewHeader />
<NewMarkdown />
<NewDivider />
</Tabs.TabPane>
<Tabs.TabPane
key={2}
tab={t('Charts')}
className="tab-charts"
>
<SliceAdder
height={
height + (isSticky ? SUPERSET_HEADER_HEIGHT : 0)
}
/>
</Tabs.TabPane>
</BuilderComponentPaneTabs>
</div>
)}
</Sticky>
</StickyContainer>
)}
</ParentSize>
</div>
);
};
<SliceAdder
height={height + (isSticky ? SUPERSET_HEADER_HEIGHT : 0)}
/>
</Tabs.TabPane>
</BuilderComponentPaneTabs>
</div>
)}
</Sticky>
</StickyContainer>
)}
</ParentSize>
</div>
);
export default BuilderComponentPane;

View File

@@ -96,9 +96,10 @@ const StyledDashboardContent = styled.div`
margin: ${({ theme }) => theme.gridUnit * 2}px
${({ theme }) => theme.gridUnit * 8}px
${({ theme }) => theme.gridUnit * 6}px
${({ theme, dashboardFiltersOpen }) =>
// eslint-disable-next-line prettier/prettier
(dashboardFiltersOpen ? theme.gridUnit * 4 : 0)}px;
${({ theme, dashboardFiltersOpen }) => {
if (dashboardFiltersOpen) return theme.gridUnit * 4;
return 0;
}}px;
}
.dashboard-component-chart-holder {

View File

@@ -45,20 +45,18 @@ export interface IndicatorProps {
const Indicator = ({
indicator: { column, name, value = [], path },
onClick,
}: IndicatorProps) => {
return (
<Item onClick={() => onClick([...path, `LABEL-${column}`])}>
<Title bold>
<ItemIcon>
<SearchOutlined />
</ItemIcon>
{name.toUpperCase()}
{value.length ? ': ' : ''}
</Title>
<FilterValue>{value.length ? value.join(', ') : ''}</FilterValue>
</Item>
);
};
}: IndicatorProps) => (
<Item onClick={() => onClick([...path, `LABEL-${column}`])}>
<Title bold>
<ItemIcon>
<SearchOutlined />
</ItemIcon>
{name.toUpperCase()}
{value.length ? ': ' : ''}
</Title>
<FilterValue>{value.length ? value.join(', ') : ''}</FilterValue>
</Item>
);
export interface DetailsPanelProps {
appliedIndicators: Indicator[];

View File

@@ -91,7 +91,8 @@ export const Title = styled.span<TitleProps>`
position: relative;
margin-right: ${({ theme }) => theme.gridUnit}px;
font-weight: ${({ bold, theme }) => {
return bold ? theme.typography.weights.bold : 'auto';
if (bold) return theme.typography.weights.bold;
return 'auto';
}};
color: ${({ color, theme }) => color || theme.colors.grayscale.light5};
`;

View File

@@ -90,12 +90,11 @@ const loadOwnerOptions = (input = '') => {
return SupersetClient.get({
endpoint: `/api/v1/dashboard/related/owners?q=${query}`,
}).then(
response => {
return response.json.result.map(item => ({
response =>
response.json.result.map(item => ({
value: item.value,
label: item.text,
}));
},
})),
badResponse => {
handleErrorResponse(badResponse);
return [];

View File

@@ -38,6 +38,12 @@ export const options = [
[86400, t('24 hours')],
].map(o => ({ value: o[0], label: o[1] }));
const StyledModalTrigger = styled(ModalTrigger)`
.ant-modal-body {
overflow: visible;
}
`;
const RefreshWarningContainer = styled.div`
margin-top: ${({ theme }) => theme.gridUnit * 6}px;
`;
@@ -103,7 +109,7 @@ class RefreshIntervalModal extends React.PureComponent<
!!refreshFrequency && !!refreshWarning && refreshFrequency < refreshLimit;
return (
<ModalTrigger
<StyledModalTrigger
ref={this.modalRef}
triggerNode={this.props.triggerNode}
modalTitle={t('Refresh Interval')}

View File

@@ -181,9 +181,13 @@ class SliceHeaderControls extends React.PureComponent {
);
const updatedWhen = updatedDttm ? moment.utc(updatedDttm).fromNow() : '';
const getCachedTitle = itemCached => {
return itemCached
? t('Cached %s', cachedWhen)
: updatedWhen && t('Fetched %s', updatedWhen);
if (itemCached) {
return t('Cached %s', cachedWhen);
}
if (updatedWhen) {
return t('Fetched %s', updatedWhen);
}
return '';
};
const refreshTooltipData = isCached.map(getCachedTitle) || '';
// If all queries have same cache time we can unit them to one

View File

@@ -32,8 +32,7 @@ const Wrapper = styled.div`
/* keeping these for posterity, in case we can improve that resizing performance */
/* &.animated {
transition: width 0;
transition-delay: ${({ theme }) =>
theme.transitionTiming * 2}s;
transition-delay: ${({ theme }) => theme.transitionTiming * 2}s;
} */
&.open {
width: 250px;
@@ -68,38 +67,36 @@ export const StickyVerticalBar: React.FC<SVBProps> = ({
topOffset,
children,
filtersOpen,
}) => {
return (
<Wrapper className={cx({ open: filtersOpen })}>
<StickyContainer>
<Sticky topOffset={-topOffset} bottomOffset={Infinity}>
{({
style,
isSticky,
distanceFromTop,
}: {
style: any;
isSticky: boolean;
distanceFromTop: number;
}) => (
<Contents
style={
isSticky
? {
...style,
top: topOffset,
height: `calc(100vh - ${topOffset}px)`,
}
: {
height: `calc(100vh - ${distanceFromTop}px)`,
}
}
>
{children}
</Contents>
)}
</Sticky>
</StickyContainer>
</Wrapper>
);
};
}) => (
<Wrapper className={cx({ open: filtersOpen })}>
<StickyContainer>
<Sticky topOffset={-topOffset} bottomOffset={Infinity}>
{({
style,
isSticky,
distanceFromTop,
}: {
style: any;
isSticky: boolean;
distanceFromTop: number;
}) => (
<Contents
style={
isSticky
? {
...style,
top: topOffset,
height: `calc(100vh - ${topOffset}px)`,
}
: {
height: `calc(100vh - ${distanceFromTop}px)`,
}
}
>
{children}
</Contents>
)}
</Sticky>
</StickyContainer>
</Wrapper>
);

View File

@@ -204,28 +204,26 @@ export default class Tab extends React.PureComponent {
onDrop={this.handleDrop}
editMode={editMode}
>
{({ dropIndicatorProps, dragSourceRef }) => {
return (
<div className="dragdroppable-tab" ref={dragSourceRef}>
<EditableTitle
title={component.meta.text}
canEdit={editMode && isFocused}
onSaveTitle={this.handleChangeText}
showTooltip={false}
{({ dropIndicatorProps, dragSourceRef }) => (
<div className="dragdroppable-tab" ref={dragSourceRef}>
<EditableTitle
title={component.meta.text}
canEdit={editMode && isFocused}
onSaveTitle={this.handleChangeText}
showTooltip={false}
/>
{!editMode && (
<AnchorLink
anchorLinkId={component.id}
filters={filters}
showShortLinkButton
placement={index >= 5 ? 'left' : 'right'}
/>
{!editMode && (
<AnchorLink
anchorLinkId={component.id}
filters={filters}
showShortLinkButton
placement={index >= 5 ? 'left' : 'right'}
/>
)}
)}
{dropIndicatorProps && <div {...dropIndicatorProps} />}
</div>
);
}}
{dropIndicatorProps && <div {...dropIndicatorProps} />}
</div>
)}
</DragDroppable>
);
}

View File

@@ -73,11 +73,10 @@ export function ColumnSelect({
return cachedSupersetGet({
endpoint: `/api/v1/dataset/${datasetId}`,
}).then(
({ json: { result } }) => {
return result.columns
({ json: { result } }) =>
result.columns
.map((col: any) => col.column_name)
.sort((a: string, b: string) => a.localeCompare(b));
},
.sort((a: string, b: string) => a.localeCompare(b)),
async badResponse => {
const { error, message } = await getClientErrorObject(badResponse);
let errorText = message || error || t('An error has occurred');

View File

@@ -67,18 +67,14 @@ const Bar = styled.div`
/* &.animated {
display: flex;
transform: translateX(-100%);
transition: transform ${({
theme,
}) => theme.transitionTiming}s;
transition: transform ${({ theme }) => theme.transitionTiming}s;
transition-delay: 0s;
} */
&.open {
display: flex;
/* &.animated {
transform: translateX(0);
transition-delay: ${({
theme,
}) => theme.transitionTiming * 2}s;
transition-delay: ${({ theme }) => theme.transitionTiming * 2}s;
} */
}
`;
@@ -95,9 +91,7 @@ const CollapsedBar = styled.div`
/* &.animated {
display: block;
transform: translateX(-100%);
transition: transform ${({
theme,
}) => theme.transitionTiming}s;
transition: transform ${({ theme }) => theme.transitionTiming}s;
transition-delay: 0s;
} */
&.open {
@@ -107,9 +101,7 @@ const CollapsedBar = styled.div`
padding: ${({ theme }) => theme.gridUnit * 2}px;
/* &.animated {
transform: translateX(0);
transition-delay: ${({
theme,
}) => theme.transitionTiming * 3}s;
transition-delay: ${({ theme }) => theme.transitionTiming * 3}s;
} */
}
svg {
@@ -284,7 +276,7 @@ const FilterValue: React.FC<FilterProps> = ({
height={20}
width={220}
formData={getFormData()}
queriesData={[state]}
queriesData={state}
chartType="filter_select"
hooks={{ setExtraFormData }}
/>
@@ -321,30 +313,28 @@ interface CascadeFilterControlProps {
export const CascadeFilterControl: React.FC<CascadeFilterControlProps> = ({
filter,
onExtraFormDataChange,
}) => {
return (
<>
<StyledFilterControlBox>
<StyledCaretIcon name="caret-down" />
<FilterControl
filter={filter}
onExtraFormDataChange={onExtraFormDataChange}
/>
</StyledFilterControlBox>
}) => (
<>
<StyledFilterControlBox>
<StyledCaretIcon name="caret-down" />
<FilterControl
filter={filter}
onExtraFormDataChange={onExtraFormDataChange}
/>
</StyledFilterControlBox>
<StyledCascadeChildrenList>
{filter.cascadeChildren?.map(childFilter => (
<li key={childFilter.id}>
<CascadeFilterControl
filter={childFilter}
onExtraFormDataChange={onExtraFormDataChange}
/>
</li>
))}
</StyledCascadeChildrenList>
</>
);
};
<StyledCascadeChildrenList>
{filter.cascadeChildren?.map(childFilter => (
<li key={childFilter.id}>
<CascadeFilterControl
filter={childFilter}
onExtraFormDataChange={onExtraFormDataChange}
/>
</li>
))}
</StyledCascadeChildrenList>
</>
);
const FilterBar: React.FC<FiltersBarProps> = ({
filtersOpen,

View File

@@ -60,9 +60,9 @@ export function useFilterConfigMap() {
}
export function useFilterState(id: string) {
return useSelector<any, FilterState>(state => {
return state.nativeFilters.filtersState[id] || getInitialFilterState(id);
});
return useSelector<any, FilterState>(
state => state.nativeFilters.filtersState[id] || getInitialFilterState(id),
);
}
export function useSetExtraFormData() {

View File

@@ -114,12 +114,6 @@
}
}
.chart-slice {
height: calc(100% - 32px);
overflow: auto;
height: 100%;
}
.dot {
@dot-diameter: 4px;

View File

@@ -20,6 +20,13 @@
position: relative;
}
// Fixes ISSUE-12181 - before in chart's contract-trigger breaks drag and drop mode
.dashboard--editing {
.contract-trigger:before {
display: none;
}
}
.dragdroppable--dragging {
opacity: 0.2;
}

View File

@@ -25,7 +25,7 @@ import React, {
} from 'react';
import { Alert, FormControl, FormControlProps } from 'react-bootstrap';
import { SupersetClient, t, styled } from '@superset-ui/core';
import TableView from 'src/components/TableView';
import TableView, { EmptyWrapperType } from 'src/components/TableView';
import StyledModal from 'src/common/components/Modal';
import Button from 'src/components/Button';
import { useListViewResource } from 'src/views/CRUD/hooks';
@@ -120,9 +120,9 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({
useDebouncedEffect(
() => {
if (filter) {
fetchData({
...emptyRequest,
fetchData({
...emptyRequest,
...(filter && {
filters: [
{
id: 'table_name',
@@ -130,8 +130,8 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({
value: filter,
},
],
});
}
}),
});
},
1000,
[filter],
@@ -142,9 +142,6 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({
if (searchRef && searchRef.current) {
searchRef.current.focus();
}
// Fetch initial datasets for tableview
await fetchData(emptyRequest);
};
if (show) {
@@ -224,6 +221,7 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({
onHide={onHide}
responsive
title={t('Change Dataset')}
height="350px"
footer={
<>
{confirmChange && (
@@ -268,6 +266,7 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({
data={renderTableView()}
pageSize={20}
className="table-condensed"
emptyWrapperType={EmptyWrapperType.Small}
/>
)}
</>

View File

@@ -343,7 +343,9 @@ class DatasourceEditor extends React.PureComponent {
onDatasourcePropChange(attr, value) {
const datasource = { ...this.state.datasource, [attr]: value };
this.setState(
prevState => ({ datasource: { ...prevState.datasource, [attr]: value } }),
prevState => ({
datasource: { ...prevState.datasource, [attr]: value },
}),
this.onDatasourceChange(datasource),
);
}

View File

@@ -42,9 +42,8 @@ const OPERATORS_TO_SQL = {
REGEX: 'REGEX',
'IS NOT NULL': 'IS NOT NULL',
'IS NULL': 'IS NULL',
'LATEST PARTITION': ({ datasource }) => {
return `= '{{ presto.latest_partition('${datasource.schema}.${datasource.datasource_name}') }}'`;
},
'LATEST PARTITION': ({ datasource }) =>
`= '{{ presto.latest_partition('${datasource.schema}.${datasource.datasource_name}') }}'`,
};
function translateToSql(adhocMetric, { useSimple } = {}) {

View File

@@ -58,6 +58,12 @@ const ResizeIcon = styled.i`
margin-left: ${({ theme }) => theme.gridUnit * 2}px;
`;
const ColumnOptionStyle = styled.span`
.option-label {
display: inline;
}
`;
const SAVED_TAB_KEY = 'SAVED';
const startingWidth = 320;
@@ -67,7 +73,7 @@ export default class AdhocMetricEditPopover extends React.Component {
constructor(props) {
super(props);
this.onSave = this.onSave.bind(this);
this.onRestStateAndClose = this.onRestStateAndClose.bind(this);
this.onResetStateAndClose = this.onResetStateAndClose.bind(this);
this.onColumnChange = this.onColumnChange.bind(this);
this.onAggregateChange = this.onAggregateChange.bind(this);
this.onSavedMetricChange = this.onSavedMetricChange.bind(this);
@@ -118,7 +124,7 @@ export default class AdhocMetricEditPopover extends React.Component {
this.props.onClose();
}
onRestStateAndClose() {
onResetStateAndClose() {
this.setState(
{
adhocMetric: this.props.adhocMetric,
@@ -220,7 +226,11 @@ export default class AdhocMetricEditPopover extends React.Component {
if (column.metric_name && !column.verbose_name) {
column.verbose_name = column.metric_name;
}
return <ColumnOption column={column} showType />;
return (
<ColumnOptionStyle>
<ColumnOption column={column} showType />
</ColumnOptionStyle>
);
}
render() {
@@ -401,7 +411,7 @@ export default class AdhocMetricEditPopover extends React.Component {
<div>
<Button
buttonSize="small"
onClick={this.onRestStateAndClose}
onClick={this.onResetStateAndClose}
data-test="AdhocMetricEdit#cancel"
cta
>

View File

@@ -18,6 +18,7 @@
*/
import React from 'react';
import PropTypes from 'prop-types';
import { Tooltip } from 'src/common/components/Tooltip';
import AdhocMetric from '../AdhocMetric';
import columnType from '../propTypes/columnType';
import savedMetricType from '../propTypes/savedMetricType';
@@ -70,17 +71,22 @@ class AdhocMetricOption extends React.PureComponent {
savedMetric={savedMetric}
datasourceType={datasourceType}
>
<DraggableOptionControlLabel
savedMetric={savedMetric}
label={adhocMetric.label}
onRemove={this.onRemoveMetric}
onMoveLabel={onMoveLabel}
onDropLabel={onDropLabel}
index={index}
type={OPTION_TYPES.metric}
isAdhoc
isFunction
/>
<Tooltip
placement="top"
title={savedMetric.expression || adhocMetric.label}
>
<DraggableOptionControlLabel
savedMetric={savedMetric}
label={adhocMetric.label}
onRemove={this.onRemoveMetric}
onMoveLabel={onMoveLabel}
onDropLabel={onDropLabel}
index={index}
type={OPTION_TYPES.metric}
isAdhoc
isFunction
/>
</Tooltip>
</AdhocMetricPopoverTrigger>
);
}

View File

@@ -96,7 +96,10 @@ export const DataTablesPane = ({
const getData = useCallback(
(resultType: string) => {
setIsLoading(prevIsLoading => ({ ...prevIsLoading, [resultType]: true }));
setIsLoading(prevIsLoading => ({
...prevIsLoading,
[resultType]: true,
}));
return getChartDataRequest({
formData: queryFormData,
resultFormat: 'json',

View File

@@ -90,9 +90,6 @@ const DatasourceContainer = styled.div`
padding-left: ${({ theme }) => theme.gridUnit * 2}px;
padding-bottom: 0px;
}
.form-control.input-sm {
margin-bottom: ${({ theme }) => theme.gridUnit * 3}px;
}
.ant-collapse-item {
background-color: ${({ theme }) => theme.colors.grayscale.light4};
.anticon.anticon-right.ant-collapse-arrow > svg {
@@ -130,8 +127,8 @@ const DatasourceContainer = styled.div`
font-size: ${({ theme }) => theme.typography.sizes.s}px;
color: ${({ theme }) => theme.colors.grayscale.light1};
}
.form-control.input-sm {
width: calc(100% - ${({ theme }) => theme.gridUnit * 2}px);
.form-control.input-md {
width: calc(100% - ${({ theme }) => theme.gridUnit * 4}px);
margin: ${({ theme }) => theme.gridUnit * 2}px auto;
}
.type-label {
@@ -144,6 +141,24 @@ const DatasourceContainer = styled.div`
}
`;
const LabelContainer = styled.div`
overflow: hidden;
text-overflow: ellipsis;
& > span {
white-space: nowrap;
}
.option-label {
display: inline;
}
.metric-option > .option-label {
overflow: hidden;
text-overflow: ellipsis;
}
`;
const DataSourcePanel = ({
datasource,
controls: { datasource: datasourceControl },
@@ -186,7 +201,7 @@ const DataSourcePanel = ({
<input
type="text"
onChange={search}
className="form-control input-sm"
className="form-control input-md"
placeholder={t('Search Metrics & Columns')}
/>
<div className="field-selections">
@@ -203,9 +218,9 @@ const DataSourcePanel = ({
{t(`Showing %s of %s`, metricSlice.length, metrics.length)}
</div>
{metricSlice.map(m => (
<div key={m.metric_name} className="column">
<LabelContainer key={m.metric_name} className="column">
<MetricOption metric={m} showType />
</div>
</LabelContainer>
))}
</Collapse.Panel>
<Collapse.Panel
@@ -216,9 +231,9 @@ const DataSourcePanel = ({
{t(`Showing %s of %s`, columnSlice.length, columns.length)}
</div>
{columnSlice.map(col => (
<div key={col.column_name} className="column">
<LabelContainer key={col.column_name} className="column">
<ColumnOption column={col} showType />
</div>
</LabelContainer>
))}
</Collapse.Panel>
</Collapse>

View File

@@ -16,12 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
import React, { useState, useEffect, useRef, useCallback } from 'react';
import React, { useState, useEffect, useCallback, useMemo } from 'react';
import PropTypes from 'prop-types';
import Split from 'react-split';
import { ParentSize } from '@vx/responsive';
import { styled, useTheme } from '@superset-ui/core';
import debounce from 'lodash/debounce';
import { useResizeDetector } from 'react-resize-detector';
import { chartPropShape } from 'src/dashboard/util/propShapes';
import ChartContainer from 'src/chart/ChartContainer';
import ConnectedExploreChartHeader from './ExploreChartHeader';
@@ -55,6 +54,7 @@ const propTypes = {
const GUTTER_SIZE_FACTOR = 1.25;
const CHART_PANEL_PADDING = 30;
const HEADER_PADDING = 15;
const INITIAL_SIZES = [90, 10];
const MIN_SIZES = [300, 50];
@@ -104,20 +104,32 @@ const ExploreChartPanel = props => {
const gutterMargin = theme.gridUnit * GUTTER_SIZE_FACTOR;
const gutterHeight = theme.gridUnit * GUTTER_SIZE_FACTOR;
const panelHeadingRef = useRef(null);
const { height: hHeight, ref: headerRef } = useResizeDetector({
refreshMode: 'debounce',
refreshRate: 300,
});
const { width: chartWidth, ref: chartRef } = useResizeDetector({
refreshMode: 'debounce',
refreshRate: 300,
});
const [splitSizes, setSplitSizes] = useState(INITIAL_SIZES);
const calcSectionHeight = useCallback(
percent => {
const headerHeight = props.standalone
? 0
: panelHeadingRef?.current?.offsetHeight ?? 50;
let headerHeight;
if (props.standalone) {
headerHeight = 0;
} else if (hHeight) {
headerHeight = hHeight + HEADER_PADDING;
} else {
headerHeight = 50;
}
const containerHeight = parseInt(props.height, 10) - headerHeight;
return (
(containerHeight * percent) / 100 - (gutterHeight / 2 + gutterMargin)
);
},
[gutterHeight, gutterMargin, props.height, props.standalone],
[gutterHeight, gutterMargin, props.height, props.standalone, hHeight],
);
const [tableSectionHeight, setTableSectionHeight] = useState(
@@ -132,15 +144,11 @@ const ExploreChartPanel = props => {
);
useEffect(() => {
const recalcSizes = debounce(() => recalcPanelSizes(splitSizes), 200);
window.addEventListener('resize', recalcSizes);
return () => window.removeEventListener('resize', recalcSizes);
}, [props.standalone, recalcPanelSizes, splitSizes]);
recalcPanelSizes(splitSizes);
}, [recalcPanelSizes, splitSizes]);
const onDragEnd = sizes => {
setSplitSizes(sizes);
recalcPanelSizes(sizes);
};
const onCollapseChange = openPanelName => {
@@ -154,42 +162,46 @@ const ExploreChartPanel = props => {
];
}
setSplitSizes(splitSizes);
recalcPanelSizes(splitSizes);
};
const renderChart = () => {
const renderChart = useCallback(() => {
const { chart } = props;
const newHeight = calcSectionHeight(splitSizes[0]) - CHART_PANEL_PADDING;
return (
<ParentSize>
{({ width }) =>
width > 0 && (
<ChartContainer
width={Math.floor(width)}
height={newHeight}
annotationData={chart.annotationData}
chartAlert={chart.chartAlert}
chartStackTrace={chart.chartStackTrace}
chartId={chart.id}
chartStatus={chart.chartStatus}
triggerRender={props.triggerRender}
datasource={props.datasource}
errorMessage={props.errorMessage}
formData={props.form_data}
onQuery={props.onQuery}
owners={props?.slice?.owners}
queriesResponse={chart.queriesResponse}
refreshOverlayVisible={props.refreshOverlayVisible}
setControlValue={props.actions.setControlValue}
timeout={props.timeout}
triggerQuery={chart.triggerQuery}
vizType={props.vizType}
/>
)
}
</ParentSize>
chartWidth > 0 && (
<ChartContainer
width={Math.floor(chartWidth)}
height={newHeight}
annotationData={chart.annotationData}
chartAlert={chart.chartAlert}
chartStackTrace={chart.chartStackTrace}
chartId={chart.id}
chartStatus={chart.chartStatus}
triggerRender={props.triggerRender}
datasource={props.datasource}
errorMessage={props.errorMessage}
formData={props.form_data}
onQuery={props.onQuery}
owners={props?.slice?.owners}
queriesResponse={chart.queriesResponse}
refreshOverlayVisible={props.refreshOverlayVisible}
setControlValue={props.actions.setControlValue}
timeout={props.timeout}
triggerQuery={chart.triggerQuery}
vizType={props.vizType}
/>
)
);
};
}, [calcSectionHeight, chartWidth, props, splitSizes]);
const panelBody = useMemo(
() => (
<div className="panel-body" ref={chartRef}>
{renderChart()}
</div>
),
[chartRef, renderChart],
);
if (props.standalone) {
// dom manipulation hack to get rid of the boostrap theme's body background
@@ -218,20 +230,16 @@ const ExploreChartPanel = props => {
/>
);
const elementStyle = (dimension, elementSize, gutterSize) => {
return {
[dimension]: `calc(${elementSize}% - ${gutterSize + gutterMargin}px)`,
};
};
const panelBody = <div className="panel-body">{renderChart()}</div>;
const elementStyle = (dimension, elementSize, gutterSize) => ({
[dimension]: `calc(${elementSize}% - ${gutterSize + gutterMargin}px)`,
});
return (
<Styles
className="panel panel-default chart-container"
style={{ height: props.height }}
>
<div className="panel-heading" ref={panelHeadingRef}>
<div className="panel-heading" ref={headerRef}>
{header}
</div>
{props.vizType === 'filter_box' ? (

View File

@@ -23,6 +23,7 @@ import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { styled, t, supersetTheme, css } from '@superset-ui/core';
import { debounce } from 'lodash';
import { Resizable } from 're-resizable';
import { useDynamicPluginContext } from 'src/components/DynamicPlugins';
import { Global } from '@emotion/core';
@@ -81,10 +82,8 @@ const Styles = styled.div`
border-top: 1px solid ${({ theme }) => theme.colors.grayscale.light2};
.explore-column {
display: flex;
flex: 0 0 ${({ theme }) => theme.gridUnit * 80}px;
flex-direction: column;
padding: ${({ theme }) => 2 * theme.gridUnit}px 0;
max-width: ${({ theme }) => theme.gridUnit * 80}px;
max-height: 100%;
}
.data-source-selection {
@@ -404,13 +403,17 @@ function ExploreViewContainer(props) {
dashboardId={props.dashboardId}
/>
)}
<div
<Resizable
defaultSize={{ width: 300 }}
minWidth={300}
maxWidth="33%"
enable={{ right: true }}
className={
isCollapsed ? 'no-show' : 'explore-column data-source-selection'
}
>
<div className="title-container">
<span className="horizont al-text">{t('Datasource')}</span>
<span className="horizont al-text">{t('Dataset')}</span>
<span
role="button"
tabIndex={0}
@@ -430,7 +433,7 @@ function ExploreViewContainer(props) {
controls={props.controls}
actions={props.actions}
/>
</div>
</Resizable>
{isCollapsed ? (
<div
className="sidebar"
@@ -452,7 +455,13 @@ function ExploreViewContainer(props) {
<Icon name="dataset-physical" width={16} />
</div>
) : null}
<div className="col-sm-3 explore-column controls-column">
<Resizable
defaultSize={{ width: 320 }}
minWidth={320}
maxWidth="33%"
enable={{ right: true }}
className="col-sm-3 explore-column controls-column"
>
<QueryAndSaveBtns
canAdd={!!(props.can_add || props.can_overwrite)}
onQuery={onQuery}
@@ -470,7 +479,7 @@ function ExploreViewContainer(props) {
datasource_type={props.datasource_type}
isDatasourceMetaLoading={props.isDatasourceMetaLoading}
/>
</div>
</Resizable>
<div
className={`main-explore-content ${
isCollapsed ? 'col-sm-9' : 'col-sm-7'

View File

@@ -60,6 +60,9 @@ const Label = styled.div`
svg {
margin-right: ${({ theme }) => theme.gridUnit}px;
}
.option-label {
display: inline;
}
`;
const CaretContainer = styled.div`
@@ -84,7 +87,7 @@ export const HeaderContainer = styled.div`
export const LabelsContainer = styled.div`
padding: ${({ theme }) => theme.gridUnit}px;
border: solid 1px ${({ theme }) => theme.colors.grayscale.light2};
border-radius: 3px;
border-radius: ${({ theme }) => theme.gridUnit}px;
`;
export const AddControlLabel = styled.div`
@@ -96,7 +99,7 @@ export const AddControlLabel = styled.div`
font-size: ${({ theme }) => theme.typography.sizes.s}px;
color: ${({ theme }) => theme.colors.grayscale.light1};
border: dashed 1px ${({ theme }) => theme.colors.grayscale.light2};
border-radius: 3px;
border-radius: ${({ theme }) => theme.gridUnit}px;
cursor: pointer;
:hover {

View File

@@ -19,7 +19,7 @@
/* eslint camelcase: 0 */
import React from 'react';
import { Alert, FormControl, FormGroup, Radio } from 'react-bootstrap';
import { JsonObject, t } from '@superset-ui/core';
import { JsonObject, t, styled } from '@superset-ui/core';
import ReactMarkdown from 'react-markdown';
import Modal from 'src/common/components/Modal';
import Button from 'src/components/Button';
@@ -55,6 +55,12 @@ type SaveModalState = {
action: ActionType;
};
export const StyledModal = styled(Modal)`
.ant-modal-body {
overflow: visible;
}
`;
class SaveModal extends React.Component<SaveModalProps, SaveModalState> {
constructor(props: SaveModalProps) {
super(props);
@@ -153,7 +159,7 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> {
render() {
return (
<Modal
<StyledModal
show
onHide={this.props.onHide}
title={t('Save Chart')}
@@ -261,7 +267,7 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> {
/>
</FormGroup>
</div>
</Modal>
</StyledModal>
);
}
}

View File

@@ -37,6 +37,7 @@ import Popover from 'src/common/components/Popover';
import { Divider } from 'src/common/components';
import Icon from 'src/components/Icon';
import { Select } from 'src/components/Select';
import { Tooltip } from 'src/common/components/Tooltip';
import { SelectOptionType, FrameType } from './types';
import {
COMMON_RANGE_VALUES_SET,
@@ -181,27 +182,41 @@ export default function DateFilterControl(props: DateFilterLabelProps) {
const [timeRangeValue, setTimeRangeValue] = useState(value);
const [validTimeRange, setValidTimeRange] = useState<boolean>(false);
const [evalResponse, setEvalResponse] = useState<string>(value);
const [tooltipTitle, setTooltipTitle] = useState<string>(value);
useEffect(() => {
const valueToLower = value.toLowerCase();
if (
valueToLower.startsWith('last') ||
valueToLower.startsWith('next') ||
valueToLower.startsWith('previous')
) {
setActualTimeRange(value);
setValidTimeRange(true);
} else {
fetchTimeRange(value, endpoints).then(({ value, error }) => {
if (error) {
setEvalResponse(error || '');
setValidTimeRange(false);
fetchTimeRange(value, endpoints).then(({ value: actualRange, error }) => {
if (error) {
setEvalResponse(error || '');
setValidTimeRange(false);
setTooltipTitle(value || '');
} else {
/*
HRT == human readable text
ADR == actual datetime range
+--------------+------+----------+--------+----------+-----------+
| | Last | Previous | Custom | Advanced | No Filter |
+--------------+------+----------+--------+----------+-----------+
| control pill | HRT | HRT | ADR | ADR | ADR |
+--------------+------+----------+--------+----------+-----------+
| tooltip | ADR | ADR | HRT | HRT | HRT |
+--------------+------+----------+--------+----------+-----------+
*/
const valueToLower = value.toLowerCase();
if (
valueToLower.startsWith('last') ||
valueToLower.startsWith('next') ||
valueToLower.startsWith('previous')
) {
setActualTimeRange(value);
setTooltipTitle(actualRange || '');
} else {
setActualTimeRange(value || '');
setValidTimeRange(true);
setActualTimeRange(actualRange || '');
setTooltipTitle(value || '');
}
});
}
setValidTimeRange(true);
}
});
}, [value]);
useEffect(() => {
@@ -327,13 +342,15 @@ export default function DateFilterControl(props: DateFilterLabelProps) {
onVisibleChange={togglePopover}
overlayStyle={overlayStyle}
>
<Label
className="pointer"
data-test="time-range-trigger"
onClick={() => setShow(true)}
>
{actualTimeRange}
</Label>
<Tooltip placement="top" title={tooltipTitle}>
<Label
className="pointer"
data-test="time-range-trigger"
onClick={() => setShow(true)}
>
{actualTimeRange}
</Label>
</Tooltip>
</StyledPopover>
</>
);

View File

@@ -198,12 +198,16 @@ export const customTimeRangeEncode = (customRange: CustomRangeType): string => {
// relative : specific
if (sinceMode === 'relative' && SPECIFIC_MODE.includes(untilMode)) {
const until = untilMode === 'specific' ? untilDatetime : untilMode;
const since = `DATEADD(DATETIME("${until}"), ${-Math.abs(sinceGrainValue)}, ${sinceGrain})`; // eslint-disable-line
const since = `DATEADD(DATETIME("${until}"), ${-Math.abs(
sinceGrainValue,
)}, ${sinceGrain})`; // eslint-disable-line
return `${since} : ${until}`;
}
// relative : relative
const since = `DATEADD(DATETIME("${anchorValue}"), ${-Math.abs(sinceGrainValue)}, ${sinceGrain})`; // eslint-disable-line
const since = `DATEADD(DATETIME("${anchorValue}"), ${-Math.abs(
sinceGrainValue,
)}, ${sinceGrain})`; // eslint-disable-line
const until = `DATEADD(DATETIME("${anchorValue}"), ${untilGrainValue}, ${untilGrain})`;
return `${since} : ${until}`;
};

View File

@@ -203,13 +203,6 @@ export default class SelectControl extends React.PureComponent {
return remainingOptions;
}
createPlaceholder() {
const optionsRemaining = this.optionsRemaining();
const placeholder =
this.props.placeholder || t('%s option(s)', optionsRemaining);
return optionsRemaining ? placeholder : '';
}
createMetaSelectAllOption() {
const option = { label: 'Select All', meta: true };
option[this.props.valueKey] = 'Select All';
@@ -235,9 +228,19 @@ export default class SelectControl extends React.PureComponent {
valueKey,
valueRenderer,
} = this.props;
const placeholder = this.createPlaceholder();
const optionsRemaining = this.optionsRemaining();
const optionRemaingText = optionsRemaining
? t('%s option(s)', optionsRemaining)
: '';
const placeholder = this.props.placeholder || optionRemaingText;
const isMulti = this.props.isMulti || this.props.multi;
let assistiveText;
if (isMulti && optionsRemaining && Array.isArray(value) && !!value.length) {
assistiveText = optionRemaingText;
}
const selectProps = {
autoFocus,
clearable,
@@ -257,6 +260,7 @@ export default class SelectControl extends React.PureComponent {
optionRenderer,
options: this.state.options,
placeholder,
assistiveText,
promptTextCreator,
selectRef: this.getSelectRef,
value,

View File

@@ -107,7 +107,7 @@ export default class TextControl extends React.Component<
return (
<div>
<ControlHeader {...this.props} />
<FormGroup controlId={this.state.controlId} bsSize="small">
<FormGroup controlId={this.state.controlId} bsSize="medium">
<FormControl
type="text"
data-test="inline-name"

View File

@@ -17,9 +17,11 @@
* under the License.
*/
import { t, validateNonEmpty } from '@superset-ui/core';
import { sections } from '@superset-ui/chart-controls';
export default {
controlPanelSections: [
sections.legacyTimeseriesTime,
{
label: t('Query'),
expanded: true,
@@ -61,12 +63,4 @@ export default {
multiple: false,
},
},
sectionOverrides: {
druidTimeSeries: {
controlSetRows: [['granularity', 'druid_time_origin'], ['time_range']],
},
sqlaTimeSeries: {
controlSetRows: [['granularity_sqla', 'time_grain_sqla'], ['time_range']],
},
},
};

View File

@@ -222,9 +222,8 @@ export const buildV1ChartDataPayload = ({
});
};
export const getLegacyEndpointType = ({ resultType, resultFormat }) => {
return resultFormat === 'csv' ? resultFormat : resultType;
};
export const getLegacyEndpointType = ({ resultType, resultFormat }) =>
resultFormat === 'csv' ? resultFormat : resultType;
export function postForm(url, payload, target = '_blank') {
if (!url) {

View File

@@ -39,36 +39,34 @@ import {
export default function buildQuery(formData: QueryFormData) {
const { groupby } = formData;
const [column] = groupby || [];
return buildQueryContext(formData, baseQueryObject => {
return [
{
...baseQueryObject,
groupby: [],
metrics: [
{
aggregate: 'MIN',
column: {
columnName: column,
id: 1,
type: ColumnType.FLOAT,
},
expressionType: 'SIMPLE',
hasCustomLabel: true,
label: 'min',
return buildQueryContext(formData, baseQueryObject => [
{
...baseQueryObject,
groupby: [],
metrics: [
{
aggregate: 'MIN',
column: {
columnName: column,
id: 1,
type: ColumnType.FLOAT,
},
{
aggregate: 'MAX',
column: {
columnName: column,
id: 2,
type: ColumnType.FLOAT,
},
expressionType: 'SIMPLE',
hasCustomLabel: true,
label: 'max',
expressionType: 'SIMPLE',
hasCustomLabel: true,
label: 'min',
},
{
aggregate: 'MAX',
column: {
columnName: column,
id: 2,
type: ColumnType.FLOAT,
},
],
},
];
});
expressionType: 'SIMPLE',
hasCustomLabel: true,
label: 'max',
},
],
},
]);
}

View File

@@ -33,11 +33,9 @@ import { buildQueryContext, QueryFormData } from '@superset-ui/core';
* if a viz needs multiple different result sets.
*/
export default function buildQuery(formData: QueryFormData) {
return buildQueryContext(formData, baseQueryObject => {
return [
{
...baseQueryObject,
},
];
});
return buildQueryContext(formData, baseQueryObject => [
{
...baseQueryObject,
},
]);
}

View File

@@ -21,14 +21,12 @@ export const cacheWrapper = <T extends Array<any>, U>(
fn: (...args: T) => U,
cache: Map<string, any>,
keyFn: (...args: T) => string = (...args: T) => JSON.stringify([...args]),
) => {
return (...args: T): U => {
const key = keyFn(...args);
if (cache.has(key)) {
return cache.get(key);
}
const result = fn(...args);
cache.set(key, result);
return result;
};
) => (...args: T): U => {
const key = keyFn(...args);
if (cache.has(key)) {
return cache.get(key);
}
const result = fn(...args);
cache.set(key, result);
return result;
};

View File

@@ -34,11 +34,8 @@ const GRAY_BACKGROUND_COLOR = '#F5F5F5';
* @param description title or description of content of file
* @param date date when file was generated
*/
const generateFileStem = (description: string, date = new Date()) => {
return `${kebabCase(description)}-${date
.toISOString()
.replace(/[: ]/g, '-')}`;
};
const generateFileStem = (description: string, date = new Date()) =>
`${kebabCase(description)}-${date.toISOString().replace(/[: ]/g, '-')}`;
/**
* Create an event handler for turning an element into an image

View File

@@ -205,11 +205,10 @@ function AlertList({
row: {
original: { last_eval_dttm: lastEvalDttm },
},
}: any) => {
return lastEvalDttm
}: any) =>
lastEvalDttm
? moment.utc(lastEvalDttm).local().format(DATETIME_WITH_TIME_ZONE)
: '';
},
: '',
accessor: 'last_eval_dttm',
Header: t('Last Run'),
size: 'lg',

View File

@@ -415,13 +415,11 @@ const NotificationMethod: FunctionComponent<NotificationMethodProps> = ({
setRecipientValue(recipients);
}
const methodOptions = (options || []).map((method: NotificationMethod) => {
return (
<Select.Option key={method} value={method}>
{t(method)}
</Select.Option>
);
});
const methodOptions = (options || []).map((method: NotificationMethod) => (
<Select.Option key={method} value={method}>
{t(method)}
</Select.Option>
));
return (
<StyledNotificationMethod>
@@ -477,9 +475,10 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
isReport = false,
}) => {
const [disableSave, setDisableSave] = useState<boolean>(true);
const [currentAlert, setCurrentAlert] = useState<Partial<
AlertObject
> | null>();
const [
currentAlert,
setCurrentAlert,
] = useState<Partial<AlertObject> | null>();
const [isHidden, setIsHidden] = useState<boolean>(true);
const [contentType, setContentType] = useState<string>('dashboard');
@@ -491,9 +490,10 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
const isEditMode = alert !== null;
const [notificationAddState, setNotificationAddState] = useState<
NotificationAddStatus
>('active');
const [
notificationAddState,
setNotificationAddState,
] = useState<NotificationAddStatus>('active');
const [notificationSettings, setNotificationSettings] = useState<
NotificationSetting[]
>([]);
@@ -636,15 +636,12 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
return SupersetClient.get({
endpoint: `/api/v1/report/related/owners?q=${query}`,
}).then(
response => {
return response.json.result.map((item: any) => ({
response =>
response.json.result.map((item: any) => ({
value: item.value,
label: item.text,
}));
},
badResponse => {
return [];
},
})),
badResponse => [],
);
};
@@ -672,9 +669,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
return list;
},
badResponse => {
return [];
},
badResponse => [],
);
};
@@ -721,9 +716,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
return list;
},
badResponse => {
return [];
},
badResponse => [],
);
};
@@ -766,9 +759,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
return list;
},
badResponse => {
return [];
},
badResponse => [],
);
};
@@ -1029,21 +1020,17 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({
}
// Dropdown options
const conditionOptions = CONDITIONS.map(condition => {
return (
<Select.Option key={condition.value} value={condition.value}>
{condition.label}
</Select.Option>
);
});
const conditionOptions = CONDITIONS.map(condition => (
<Select.Option key={condition.value} value={condition.value}>
{condition.label}
</Select.Option>
));
const retentionOptions = RETENTION_OPTIONS.map(option => {
return (
<Select.Option key={option.value} value={option.value}>
{option.label}
</Select.Option>
);
});
const retentionOptions = RETENTION_OPTIONS.map(option => (
<Select.Option key={option.value} value={option.value}>
{option.label}
</Select.Option>
));
return (
<Modal

View File

@@ -68,9 +68,10 @@ function AnnotationLayersList({
addDangerToast,
);
const [annotationLayerModalOpen, setAnnotationLayerModalOpen] = useState<
boolean
>(false);
const [
annotationLayerModalOpen,
setAnnotationLayerModalOpen,
] = useState<boolean>(false);
const [
currentAnnotationLayer,
setCurrentAnnotationLayer,

View File

@@ -536,13 +536,12 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({
);
};
const handleBulkDatasetExport = (datasetsToExport: Dataset[]) => {
return window.location.assign(
const handleBulkDatasetExport = (datasetsToExport: Dataset[]) =>
window.location.assign(
`/api/v1/dataset/export/?q=${rison.encode(
datasetsToExport.map(({ id }) => id),
)}`,
);
};
return (
<>

View File

@@ -102,9 +102,10 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) {
false,
);
const [queryCurrentlyPreviewing, setQueryCurrentlyPreviewing] = useState<
QueryObject
>();
const [
queryCurrentlyPreviewing,
setQueryCurrentlyPreviewing,
] = useState<QueryObject>();
const handleQueryPreview = useCallback(
(id: number) => {
@@ -298,20 +299,18 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) {
{
accessor: QueryObjectColumns.sql,
Header: t('SQL'),
Cell: ({ row: { original, id } }: any) => {
return (
<div
tabIndex={0}
role="button"
data-test={`open-sql-preview-${id}`}
onClick={() => setQueryCurrentlyPreviewing(original)}
>
<StyledSyntaxHighlighter language="sql" style={github}>
{shortenSQL(original.sql, SQL_PREVIEW_MAX_LINES)}
</StyledSyntaxHighlighter>
</div>
);
},
Cell: ({ row: { original, id } }: any) => (
<div
tabIndex={0}
role="button"
data-test={`open-sql-preview-${id}`}
onClick={() => setQueryCurrentlyPreviewing(original)}
>
<StyledSyntaxHighlighter language="sql" style={github}>
{shortenSQL(original.sql, SQL_PREVIEW_MAX_LINES)}
</StyledSyntaxHighlighter>
</div>
),
},
{
Header: t('Actions'),
@@ -321,15 +320,13 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) {
row: {
original: { id },
},
}: any) => {
return (
<Tooltip title={t('Open query in SQL Lab')} placement="bottom">
<a href={`/superset/sqllab?queryId=${id}`}>
<Icon name="full" />
</a>
</Tooltip>
);
},
}: any) => (
<Tooltip title={t('Open query in SQL Lab')} placement="bottom">
<a href={`/superset/sqllab?queryId=${id}`}>
<Icon name="full" />
</a>
</Tooltip>
),
},
],
[],

View File

@@ -146,28 +146,26 @@ export default function ActivityTable({
}
return e.sql ? `/superset/sqllab?savedQueryId=${e.id}` : e.url;
};
return activityData[activeChild].map((e: ActivityObjects) => {
return (
<CardStyles
onClick={() => {
window.location.href = getRecentRef(e);
}}
key={e.id}
>
<ListViewCard
loading={loading}
cover={<></>}
url={e.sql ? `/superset/sqllab?savedQueryId=${e.id}` : e.url}
title={getFilterTitle(e)}
description={`Last Edited: ${moment(e.changed_on_utc).format(
'MM/DD/YYYY HH:mm:ss',
)}`}
avatar={getIconName(e)}
actions={null}
/>
</CardStyles>
);
});
return activityData[activeChild].map((e: ActivityObjects) => (
<CardStyles
onClick={() => {
window.location.href = getRecentRef(e);
}}
key={e.id}
>
<ListViewCard
loading={loading}
cover={<></>}
url={e.sql ? `/superset/sqllab?savedQueryId=${e.id}` : e.url}
title={getFilterTitle(e)}
description={`Last Edited: ${moment(e.changed_on_utc).format(
'MM/DD/YYYY HH:mm:ss',
)}`}
avatar={getIconName(e)}
actions={null}
/>
</CardStyles>
));
};
if (loading) return <Loading position="inline" />;
return (

View File

@@ -100,8 +100,8 @@ function ChartTable({
return filters;
};
const getData = (filter: string) => {
return fetchData({
const getData = (filter: string) =>
fetchData({
pageIndex: 0,
pageSize: PAGE_SIZE,
sortBy: [
@@ -112,7 +112,6 @@ function ChartTable({
],
filters: getFilters(filter),
});
};
return (
<ErrorBoundary>

View File

@@ -66,8 +66,8 @@ function DashboardTable({
const [editModal, setEditModal] = useState<Dashboard>();
const [dashboardFilter, setDashboardFilter] = useState('Mine');
const handleDashboardEdit = (edits: Dashboard) => {
return SupersetClient.get({
const handleDashboardEdit = (edits: Dashboard) =>
SupersetClient.get({
endpoint: `/api/v1/dashboard/${edits.id}`,
}).then(
({ json = {} }) => {
@@ -86,7 +86,6 @@ function DashboardTable({
),
),
);
};
const getFilters = (filterName: string) => {
const filters = [];
@@ -114,8 +113,8 @@ function DashboardTable({
});
}
const getData = (filter: string) => {
return fetchData({
const getData = (filter: string) =>
fetchData({
pageIndex: 0,
pageSize: PAGE_SIZE,
sortBy: [
@@ -126,7 +125,6 @@ function DashboardTable({
],
filters: getFilters(filter),
});
};
return (
<>

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