mirror of
https://github.com/apache/superset.git
synced 2026-06-27 10:29:21 +00:00
Compare commits
32 Commits
chore/ci/s
...
1.0.0rc3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4e6baef3b | ||
|
|
b652995b56 | ||
|
|
739ab14136 | ||
|
|
a1f53fb645 | ||
|
|
52b581f922 | ||
|
|
5f2de1df71 | ||
|
|
603ab75a62 | ||
|
|
027e2075f5 | ||
|
|
5791f23e73 | ||
|
|
cf69f29144 | ||
|
|
72977fc71f | ||
|
|
46fd85a141 | ||
|
|
78e4b02305 | ||
|
|
696c9773bd | ||
|
|
4f35234f3e | ||
|
|
b213c1cb1f | ||
|
|
b3e7ef2da6 | ||
|
|
ea54e0a7cf | ||
|
|
3a553c9ef2 | ||
|
|
34da995dd9 | ||
|
|
288f6bb88c | ||
|
|
507302d639 | ||
|
|
35c15b8b3a | ||
|
|
90915db60d | ||
|
|
d940cae8d5 | ||
|
|
a83653735f | ||
|
|
e3b65f2519 | ||
|
|
f2afee9832 | ||
|
|
bd6525fdf5 | ||
|
|
dc203c174c | ||
|
|
6d59351462 | ||
|
|
c837c1c739 |
8
.github/workflows/docker_build_push.sh
vendored
8
.github/workflows/docker_build_push.sh
vendored
@@ -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
|
||||
|
||||
|
||||
668
CHANGELOG.md
668
CHANGELOG.md
@@ -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)
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
-------------
|
||||
|
||||
|
||||
@@ -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}```|
|
||||
|
||||
18
docs/src/pages/docs/Connecting to Databases/solr.mdx
Normal file
18
docs/src/pages/docs/Connecting to Databases/solr.mdx
Normal 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]
|
||||
```
|
||||
@@ -2,7 +2,7 @@
|
||||
name: Apache Spark SQL
|
||||
menu: Connecting to Databases
|
||||
route: /docs/databases/spark-sql
|
||||
index: 10
|
||||
index: 11
|
||||
version: 1
|
||||
---
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ extraEnv: {}
|
||||
configMountPath: "/app/pythonpath"
|
||||
|
||||
image:
|
||||
repository: apache/incubator-superset
|
||||
repository: apache/superset
|
||||
tag: latest
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
|
||||
1
setup.py
1
setup.py
@@ -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"],
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
],
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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');
|
||||
}),
|
||||
);
|
||||
});
|
||||
),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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', () => {
|
||||
});
|
||||
}
|
||||
}),
|
||||
);
|
||||
});
|
||||
),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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 =
|
||||
|
||||
5196
superset-frontend/package-lock.json
generated
5196
superset-frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -26,7 +26,7 @@ describe('FilterConfigurationButton', () => {
|
||||
const mockedProps = {
|
||||
createNewOnOpen: false,
|
||||
};
|
||||
it('it is valid', () => {
|
||||
it('is valid', () => {
|
||||
expect(
|
||||
React.isValidElement(<FilterConfigurationLink {...mockedProps} />),
|
||||
).toBe(true);
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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 />);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
});
|
||||
});
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -70,6 +70,4 @@ export type ErrorMessageComponentProps<
|
||||
source?: ErrorSource;
|
||||
};
|
||||
|
||||
export type ErrorMessageComponent = React.ComponentType<
|
||||
ErrorMessageComponentProps
|
||||
>;
|
||||
export type ErrorMessageComponent = React.ComponentType<ErrorMessageComponentProps>;
|
||||
|
||||
@@ -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)} />
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
`;
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -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: '',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -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 [];
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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};
|
||||
`;
|
||||
|
||||
@@ -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 [];
|
||||
|
||||
@@ -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')}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -114,12 +114,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.chart-slice {
|
||||
height: calc(100% - 32px);
|
||||
overflow: auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.dot {
|
||||
@dot-diameter: 4px;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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 } = {}) {
|
||||
|
||||
@@ -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
|
||||
>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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' ? (
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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}`;
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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']],
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -68,9 +68,10 @@ function AnnotationLayersList({
|
||||
addDangerToast,
|
||||
);
|
||||
|
||||
const [annotationLayerModalOpen, setAnnotationLayerModalOpen] = useState<
|
||||
boolean
|
||||
>(false);
|
||||
const [
|
||||
annotationLayerModalOpen,
|
||||
setAnnotationLayerModalOpen,
|
||||
] = useState<boolean>(false);
|
||||
const [
|
||||
currentAnnotationLayer,
|
||||
setCurrentAnnotationLayer,
|
||||
|
||||
@@ -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 (
|
||||
<>
|
||||
|
||||
@@ -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>
|
||||
),
|
||||
},
|
||||
],
|
||||
[],
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user